Test Driven Development’a doğru

18 Haz

Programlamaya başlayan herkes, önce hiçbir kurala dikkat etmeden “Run” tuşuna basarak istediği sonucu görmek ister. Bu doğaldır çünkü öğrenmeye yeni başlayan bir programcı adayının tüm işleyiş hakkında detaylı bir bilgisi yoktur. Zaman ilerledikçe fonksiyon, metod, struct, class gibi yapıları öğrenmeye başlar. Öğrendiği yapıları severek uygulamr ve “Oh be ne rahatlık varmış” der. Artık uzun satırlar halinde yazıdığı karmaşık kodları sınıflara, metodlara bölerek yazmaya başlamıştır.

İşi biraz daha ilerleten programcımız daha önce hiç duymadığı bir kavram olan nesneye dayalı programlamayı (Object Oriented Programming) karşısında görür. Neyneya dayalı programlamanın temeli olan Encapsulation(Kapsam), Inheritence(Miraslama) ve Polimorphism(Çok biçimlilik) kavramlarını öğrenir ve “Meğer ben daha önceleri kod yazmıyormuşum.” der. Nesneye yönelik programlama, geliştirilen kodun dış dünya ile izolasyonunu sağlar ve kodda bazı kısıtlamalar yapmaya olanak sunar. Bu sayede yazılımcının geliştirdiği kodu kullanan diğer geliştiriciler, kendilerini ilgilendirmeyen mahrem kodları görmezler ve kafa karışıklığı yaşamazlar. Ayrıca görülmemesini istediğimiz algoritmalar varsa private erişim belirleyiciler ile dış dünyadan gizleyebilirler. Kısaca nesneye dayalı programlama, geliştirilen API üzerinde bazı kısıtlamalar yapmaya ve API içerisinde gerekli durumlarda miraslama ile hiyerarşik yapının kurulmasına olanak sağlanmış olur. Artık programcı, ikinci adım olan nesneye dayalı programlamayı da öğrenmiştir ve uygulamaya başlamıştır.

Bir süre sonra programcı, Test Driven Development(TDD) kavramıyla karşılaşır. Programcının kodlama geçmişine aykırı, kodlama mantığını ve kodlama biçimini kökten değiştirecek yeni bir akımdır bu. Alışılagelmiş şelale(Waterflow) tarzı kod geliştirmeyi reddeden, önce testin yazılmasını gerektiren ve testten başarıyla geçen konun düzenlenerek üretime katılmasını sağlayan bir yöntemdir. Programcı, TDD mantığını öğrendiğinde, ya onu çok sever ya da ondan nefret eder. Ortası yoktur bu işin. Çünkü kodun bir kısmı test edilebilir, bir kısmı teste uymayan şekilde yazıldığında çelişkiler yumağı oluşmaya başlar.

Genelde TDD iyi öğrenilmediği taktirde, saçma sapan bir iş olduğu düşünülerek terk edilir. Ama işin aslı öyle değildir. Sanılanın aksine TDD, çok gerekli ve yazılımın başarıya ulaşması için önemli bir yöntemdir.   Koda olan güveni arttırır. Başarılı sonuç almaya daha yatkın bir yöntemdir. Geleneksel yazılım yöntemleriyle başlatılan projelerin %50’den azının başarıya ulaştığı bir ortamda, denemeye değer bir yöntem olduğu açıktır.

Geleneksel yöntemlerle başarıya ulaşan projelerin sayısının az olmasının sebebi nedir? Sebeplerin en başında, ürünün sürekli gelişen bir yapıda olduğunun göz ardı edilmesi gelmektedir. Gelişim varsa değişimde vardır. Sürekli değişimin kaçınılmaz olduğu bir projede her şeyi önceden kestirilmeye çalışımak, sonu belli olmayan bir maceraya atılmak gibidir. Hal böyle olunca, yöntemde bir sorun olduğu ortaya çıkmaktadır.

Test edilmeyen kodların birbirini nasıl etkilediği, davranışlarının nasıl olduğu bilinmediğinden, zamanla kod kırlmaları yaşanmaya başlayar. Aslında geleneksel yöntemlerde de test işlemi yapılmaktadır. Ancak bu test işlemi, özel bir test geliştirme aracıyla değil yazılımcının geliştirdiği arayüzlerle v.s yapılmaktadır. TDD yönteminde ise kodların davranışları önce bir test aracından geçirilir, üretilen kodlar kullanıma hazır bir şeklide uygulama ortamına sunulmaktadır.

Bu arada test driven development ile geliştirme yapanlar, önce test yazıp sonra kod üretimi yapak zorunda da değildir. Kodu yazdıntan sonra da test sınıflarını yazanlar var. Ancak bu yöntem TDD geleneğine uygun bir yöntem değildir

Özetle test driven development, geleneksel yöntemlerin dışında bir tekniktir. Bu tekniğe alışmak biraz zordur. Çünkü bu yöntem sağ elimizle yapmaya alıştığımız işleri, sol elimizle yapmaya zorlar gibidir. Önce kodu yazıp sonra ara yüzümüzde test etmek yerine, önce testi yazıp sonra testten geçen kodları çalışan kod olarak kullanırız.

Bu yöntem çevik(agile) süreçlerin de önem kazandığı günümüzde çoğu yazılımcının gözdesi haline gelmiştir. Büyük yazılım şirketlerinin de vazgeliçmez yöntemidir.

Kendi Kendine Öğrenmeyi Öğrenmek

8 Haz

“İyi de bu bize öğretilmedi ki.” veya “Biz bu konuyu öğrenmedik ki.” cümlelerini çok fazla duymaya başladım. Hadi ilköğretim öğrencisi lise talebesi bunu söyler de üniversite öğrencisinden veya üniversite bitirmiş birinden bu lafları duymak çok sinir bozucu. Yani programlama  bilmiyorum diyene niye öğrenmiyorsun demek için kurmuyorum cümlelerimi. Öğrendiğin konularda neden kendini geliştirmek istemiyorsun. Ya da okulda verilen yazılım dersleriyle neye ulaşmaya uğraşıyorsun, ey genç yazılımcı. Peşin peşin söyleyeyim okul bilgilerinle çok fazla bir şey elde edemeyeceksin. Eğer bu söylediğimin tersi olsaydı mezun olan her yazılımcı her türlü yazılım projesinin altından kalkabilirdi. Web projesi, mobil projeler, işletim sistemleri, masaüstü yazılımlar, veritabanı yazılımları gibi her türlü projede söz söylemek mümkün olurdu bir yazılımcı için. Ama  durum çok farklı.

Kişi yürümek istediği yolu kendi seçmeli ve o yolda gerekli her türlü bilgiyi kendi öğrenmeli. Başarıya bu şeklide ulaşılır. Bana göre başarı hedeflediğine ulaşmaktır. Gözde meslekleri edinmek, ünlü üniversitelerde okumak değil. Bu yüzden, başarı için önce hedefin belirlenmesi gereklidir. Daha sonra hedefe giden yolda yılmadan yürümek gerek.

Eğer okulda öğretilenlerle büyük işler yapılabilseydi, Bill Gates’in okuduğu sınıftaki öğrenci sayısı kadar İşletim sistemi, Mark Zuckerberg’in sınıf arkadaşı kadar Facebook benzeri sosyal paylaşım sitesi, Larry Page’in sınıf arkadaşları kadar ünlü Google arama motoru olurdu. Ama durum farklı. Örneğin mühendislik okuduysanız, mezun olduğunuzda piyasaya sadece sınıf arkadaşlarınız kadar mühendis dahil oluyor. Mühendisliğinizi konuşturmak, fikirlerinizi hayata geçirmekte sizin elinizde, “biz bunları ögrmedik ki nasıl yapalım” diye söylenmekte. Karar sizin.

Kendimi nasıl geliştirmeliyim diye merak edenler için kendi alanımdan yol gösterebilirim. Diyelim ki yazılım alanındasınız ve uzman bir yazılımcı olmak istiyorsunuz. Seçtiğiniz alanla ilgili sektörün öncülerini takip ederek işe başlayabilirsiniz. Blog yazılarını, kitaplarını okuyarak veya videolarını izleyerek başlayabilirsiniz. Sektörün en iyi kaynak kitapları maalesef yurt dışında bulunmaktadır. Bu kitaplara internet aracılığıyla ulaşabilirsiniz. .NET veya Java alanında internette sayısız kitap bulunmakta. Bu kitaplarda gerçek hayat tecrübeleri de aktarılmaktadır. Okuduğum kitapları bir seri halinde blogda paylaşmak istiyorum. Vakit buldukça bunları da paylaşacağım.

İkinci adım ise öğrendiklerimizi uygulamak ve hayallerimizi gerçekleştirebileceğimiz bilgileri öğrenmek. Yani ben herşeyi öğreneyim, birgün lazım olur diyerek vakit kaybetmeyin. İş modelimizi geliştirmeli ve o modele uygun konuları öğrenmeliyiz. En önemlisi de bilgilerimizi hayallerimiz doğrultusunda kullanabilmek.

Son söz: Hayallerinizden korkmayın.