Monday, July 14, 2014

Kullanıcı ile Empati Kurabilmek Neden Önemlidir?

Bunu örnek bir senaryo üzerinden inceleyelim. Bazı konuları bilerek abartıyorum, çünkü bizler en kötü duruma hazırlıklı olmak için test senaryoları geliştirmeliyiz.

"Ayşe hanım, 4 aylık hamiledir. İstanbul'da toplam çalışanı 750 olan bir devlet dairesinde veznede çalışmaktadır. Aylardan Temmuz ve aynı zamanda Ramazan ayıdır. Dışarıda sıcaklık 37 derece. Klima / havalandırma sistemi arıza yaptığı için çalışma ortamındaki sıcaklık bunaltıcıdır. Saat 16:00'dır ve Ayşe hanımın veznesi önünde bekleyen 25 kişi vardır. Bekleyenler, işlemlerin uzun sürdüğü gerekçesi ile söylenmektedir. İşlem sırası kendisinde olan yaşlı amcamız, evraklarında nelerin eksik olduğunu pek anlayamamıştır ve Ayşe hanımla tartışmaktadır. Bu arada Ayşe hanım, yaşlı amcaya detaylı bilgi vermek istemektedir, fakat 'Detayları Göster' düğmesine tıklamasının üzerinden 3 dakika geçmesine rağmen halen sistem bir cevap verememiştir. Sırada bekleyenlerin sesleri daha da yükselmekte, ortamdaki gerilim de artmaktadır. Ayşe hanım, yan veznedeki Hüseyin beye sistemin onda da çalışıp çalışmadığını sorar. Hüseyin bey 'bu sisteme geçtik geçeli iki yakamız bir araya gelmedi, sürekli donuyor, bekletiyor, garip garip hatalar veriyor' der..."

Biraz hikaye havasında oldu :) Fakat gerçekte de olması gereken de bu.
Şimdi kendinizi o veznede çalışan insanın yerine koyun. Orada bir hizmet vermeye çalışıyorsunuz fakat işlerinizi kolaylaştırması gereken "sistem", sizi engelliyor. Ne yaparsınız? Ne söylersiniz? :)

Bu yüzdendir ki, test mühendisleri olarak, kullanıcılar ile yakın temasta olup, onların hangi zorluklar altında çalıştığı, onlar için nelerin kritik olduğunu öğrenip, geliştirdiğimiz sistemi, bu tür şartlar altında sorunsuz olarak çalışacak hale getirmemiz gerekiyor. Bazı konuları / sıkıntıları kullanıcı size söylemez / söylemek istemeyebilir veya henüz farkında değildir. Fakat siz, deneyiminiz ile, ilerde ne tür ortam olacağını hayal edip, ona göre tedbirlerinizi almalısınız.

Sunday, July 13, 2014

Test Mühendisliğinde Teknik mi Önemlidir Sosyal Yetkinlikler mi?

Yani, iyi bir test mühendisi olmak için teknolojilere ve tekniklere mi ihtiyacımız var yoksa sosyal yetkinliklere mi?

Hayatta her konuda olduğu gibi bu konuda da en optimal yaklaşım "denge" sağlamak olmalıdır;
 hem teknik hem de sosyal yetkinlikler önemlidir.

Çok özel durumlarda, örneğin, son kullanıcı / müşteri ile hiç görüşmeyecekseniz ve şirket içinde de tüm iletişimi elektronik yoldan yapıyorsanız, sosyal yeteneklere çok ihtiyacınız olmayabilir.
Fakat böyle çalışan kaç kişi var?

Aslında sadece test mühendisliği değil, genel olarak yazılım mühendisliği yoğun olarak sosyal yetkinliklere (özellikle de empatiye) ihtiyaç duyulan bir alandır.
Kendini müşterinin yerine koyamıyorsan, her gün defalarca ve de saatlerce kullanacağı bir yazılımı geliştiren ekip olarak, müşteri / kullanıcının dertlerini ve önceliklerini anlayamamışsan, "kaliteli" bir ürün verme ihtimalin düşük olacaktır.

Bu durumda, test mühendisi olarak, en kötü durumlar için senaryolar geliştirip, bunları test etmek için gerekli teknik yetkinliklere ihtiyacımız olduğu gibi müşteri / kullanıcının önceliklerini anlamak ve etkili iletişim kurabilmek için sosyal yetkinliklere ihtiyacımız vardır.

Yazılım Test Mühendislerinin Eksiklikleri

Yazılım geliştirme mühendisleri, gelişen teknoloji ve müşteri / şirket beklentileri doğrultusunda sürekli olarak yeni teknolojileri öğrenme ve uygulama mecburiyetindedilrer; en azından "mühendislik" yapan büyük bir kısmı.

Fakat yazılım test mühendislerinde durumun böyle olmadığını gözlemliyorum.
Test mühendisliği teknikleri daha yavaş ilerleme ihtiyacı duyuyor olabileceği gibi test yazılımları / teknolojileri de daha yavaş gelişim gösterme gereği duyuyor olabilir.
Bu bir tarafa...

Asıl sorun, test mühendislerinin bir aşamaya kadar kendilerini eğitip sonrasında "duraklama dönemi"ne girmeleri. Pek çok meslekte var bu sorun fakat onlar hakkında yorum yapacak deneyimim yok...

Gördüğüm sorunlar şu şekilde:
- Birkaç manuel test tekniği, planlama, test tasarımı ve geliştirme konusunda deneyim sahibi olunur,
- Bir parça SDLC bilgisine sahip olunur,
- Çok nadiren, mecbur kalındıkça test araçları öğrenilir,
- Ve "zaten ben bu işte her şeyi biliyorum" diye uzunca yıllar bu bilgilere yenisi pek eklenmeden devam edilir.

Ben de aslında çok farklı değildim; bunun sebepleri biraz deneyimsizlik biraz da yol gösteren / referans alabileceğin kişilerin azlığı.

Fakat günümüzde durum farklı.
Bu meslek dalı yaygınlaştı; kitaplar, videolar, bloglar, standartlar, metodolojiler fazla fazla var.
Geriye kalan tek ihtiyaç kişinin öğrenme isteği oluyor.

Sunday, July 6, 2014

Gereksinim ile Tanımlama Arasında Ne Fark Vardır?

IEEE Yazılım Mühendisliği Terminolojisinin Standart Sözlüğü'ne göre:

Gereksinim (Requirement) 
(1) Bir problemi çözme veya bir amacı gerçekleştirmek için kullanıcı tarafından ihtiyaç duyulan bir durum veya kabiliyet,
(2) Bir sistem veya sistem bileşeninin bir sözleşme, standart, tanımlama veya resmi olarak dayatılan diğer dokümanların isteklerine cevap verebilmesi için karşılaması veya sahip olması gereken bir durum veya kabiliyet.
(3) (1) ve (2)deki gibi, bir durum veya kabiliyetin dokümante edilmiş gösterimi.

Tanımlama (Specification) 
Bir sistem veya bileşenin gereksinimleri, tasarımı, davranışı veya diğer karakteristiklerini tam, kesin, doğrulanabilir bir şekilde tanımlayan bir dokümandır.

İstisnai Durum (Exception) Nedir ve Java'da Yaygın Karşılaşılan İstisnai Durumlar Nelerdir?

"Exception" kelimesini İstisna veya İstisnai Durumu olarak tercüme edebiliriz.
Oracle'a göre istisnanın açıklaması şöyle:
"Bir programın çalışması sırasında ortaya çıkan ve programın normal komut akışını bozan bir durumdur."

İstisnaların "throw" ile atılması, "try/catch/finally" ile yakalanması gerekmektedir. Kontrol altına alınmamış istisna durumları RuntimeException olarak adlandırılır.

Java'da yaygın olarak karşılaşılan istisnai durumlar ve açıklamaları aşağıdadır. Yaptığınız testlerde bu istisna durumlarına özellikle dikkat etmeniz faydalı olur.
(Tam liste için http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html adresine bakabilirsiniz.)

ArithmeticException 
İstisnai bir aritmetik durum ortaya çıktığında atılır.

ArrayIndexOutOfBoundsException 
Bir diziye (array) geçerli olmayan bir indeks numarası ile erişilmeye çalışıldığında atılır.

ArrayStoreException 
Bir nesne dizisi içine yanlış tipte bir nesne kaydedilmeye çalışıldığında atılır.

ClassNotFoundException 
Bir uygulama bir sınıfı karakter dizisi ismi ile (Class sınıfındaki forName metodunu kullanarak) yüklemeye çalıştığında atılır.

IllegalArgumentException 
Bir metotun geçerli veya uygun olmayan bir argümanı geçirmeye çalıştığını belirtmek için atılır.

IllegalStateException 
Bir metot geçerli veya uygun olmayan bir zamanda çağrıldığında atılır.

IllegalThreadStateException 
Bir iş parçacığının, talep edilen işlem için uygun bir durumda olmadığını belirtmek için atılır.

IndexOutOfBoundsException 
Herhangi bir tipteki (dizi, karakter dizisi, veya vektör gibi) indeksin sınırları dışında olduğunu belirtmek için atılır.

InterruptedException 
Bir iş parçacığı ("thread") beklerken, uyurken veya diğer türlü bir şekilde meşgulken, bu iş parçacığına iş yaparken veya işini bitirmeden müdahale edilirse atılır.

NegativeArraySizeException
Uygulama negatif genişlikte bir dizi oluşturmaya çalıştığında atılır.

NoSuchMethodException 
Belirli bir metot bulunamadığında atılır.

NullPointerException 
Bir uygulama, bir nesnenin gerektiği bir durumda "null" kullanmaya çalıştığında atılır.

NumberFormatException 
Uygulamanın bir karakter dizisini nümerik tiplerden birine dönüştürmeye çalıştığı ama karakter dizisinin uygun formata sahip olmadığını belirtmek için atılır.

RuntimeException 
RuntimeException, Java Sanal Makinası'nın normal çalışması sırasında atılabilecek diğer istisnaların bir süpersınıfıdır.

SecurityException 
Güvenlik yöneticisii tarafından bir güvenlik ihlali olduğunu belirtmek için atılır.

StringIndexOutOfBoundsException 
Bu istisna "String" methodları tarafından, bir indeksin ya negatif veya karakter dizisinin uzunluğundan büyük olduğunu belirtmek için atılır.

UnsupportedOperationException 
Talep edilen işlemin desteklenmediğini belirtmek için atılır.

Ayrıca, aşağıda belirtilen durumlarda en sık karşılaşılan istisnalar listelenmiştir:

Casting: ClassCastException
Arrays: ArrayIndexOutOfBoundsException, NullPointerException
Collections: NullPointerException, ClassCastException
IO: java.io.IOException, java.io.FileNotFoundException, java.io.EOFException
Serialization: java.io.ObjectStreamException
Threads: InterruptedException, SecurityException, IllegalThreadStateException

Şu video da oldukça faydalı: How to handle 10 common Java Exceptions