Tanıyanlar bilir, ben de yazılım üretiminin öyle sınıflarda öğretilebileceğine inanmayanlardanım. Her ne kadar yazılım üretmek için belirli teorik bilginin gerekliliği yadsınamaz olsa da asıl yazılım üretimi aktiviteleri ve düşünsel süreçleri, programcının çıraklık döneminde edindiği becerilere daha yakın bence.
Glenford J. Myers 1979′da ünlü kitabı The Art of Software Testing‘de yazılım testini "bir yazılımı ya da sistemi hataları bulmak amacıyla işletmek" olarak tanımlamıştı. Geçen 30 senede bu tanımın yanına yüzlerce yenisinin konmasının haricinde, yapısal olarak belki de fazladan ilave edebildiğimiz tek katma değer, statik testlerin yazılım testi terminolojisine eklenmesi oldu -ki bunu da icat etmedik, uygulamaya başladık.
Örneğin, test mühendisinin öngörülerinin, hislerinin ve farkındalığının formal test yöntemlerinin ve sistemlerinin daha önünde bir öneme sahip olmasını nasıl açıklayabiliriz? Yanılıyor isem eğer, bilgi ve beceri seviyesi sertifika programları ile ölçülen sözde testçilerin acziyetini görmezden gelmemiz gerekecektir.
Gerçi, yazılım testi, deterministik olmayan birçok öğe içerdiği için, tartışmayı yazılım üretiminin genelinden sürdürmenin bizi daha net kılacağı şüphesizdir. Öyle de olsun.
Yazılım üretimi bilimseldir diyor isek eğer, yazılım geliştirme yöntemlerimiz ile ilgili aşağıdaki sürecin uygulanabilir olması gerekmiyor mu?
- Gözlemle
- Gözlemine dayanarak geçici bir açıklama getir (hipotez olarak adlandırırız)
- Açıklamamızdan faydalanarak tahminlerde bulun
- Tahminlerimizi ve deneylerimizi kullanarak getirdiğimiz açıklamamızdaki yanlış ve eksikleri gider
- 3. ve 4. adımları tekrar ederek gözlemlerimiz, deneylerimiz ve teorimiz arasındaki farkları gider
Bilimsel yaklaşım bunları gerektirirken yazılım üretim yöntemleri ile ilgili bunu ne kadar uygulayabiliyoruz? Neden gözlem, deney ve teoriler arasında hep büyük uçurumlar mevcut? Neden bir hastayı iyi eden bir ilaç, diğer hastayı öldürüyor? Kafamızda bir çok soru var;
- Çevik mi olmalıyız yoksa baştan iyi plan mı yapmak daha doğru
- Nesneye yönelik mi yoksa prosedürel mi
- Testleri baştan mı yazmak lazım yoksa geliştirmeye paralel mi hazırlanmalı
- C# mı yoksa Java mı yada illa her programcı C dilini bilmeli mi
Yoksa, yazılım testi, yazılım üretiminin tümü ile birlikte, bilim olmaktan uzak mı? Yazılım testini bir sanat olarak tanımlayanlar daha doğru bir yöne mi ilerliyorlar?
20. yüzyılın en etkili bilim filozofu olarak addedilen Karl Popper, bilimsel gelişmenin, yanlışlıkların (yada diğer bir tercüme ile sahteliklerin) giderilmesi ile geldiğini söylemiş. Bu noktada yazılım üretimine baktığımda iç açan noktalar görmekten uzak buluyorum kendimi.
Kullandığımız yöntemler ve bakış açısı, 20 yıl önce kullanılanlardan çok da farklı değil. Üstüne üstlük, bu süre zarfında yazılımlar daha da karmaşıklaştı ve bugün yazılım üretirken kendimizi savaş alanında silahını düşürmüş bir asker gibi hissediyoruz.
Pascal ile yazılım geliştirdiğimiz dönemlerde, yazdığımız kodun neredeyse %60′ı kullanıcı arabirimi ile ilgiliydi. Menüler, formlarda kullanıcının klavye hareketlerini takip etmek ve garip ASCII kodları ile çizilen kutular vaktimizin en büyük kısmını alırdı.
Şimdi, benim çizdiğim dikdörtgen içinde belki 20-30 satır kod ile kontrol ettiğim "metin kutusu" bugün input tag’ine dönüştü belki ama Web tabanlı yazılımlara baktığımızda hala kaynak kodun %60′ını kullanıcı arabiriminde görüyoruz.
Biz o zamanlar Pascal bilir, Pascal yazarken bugün Web tabanlı yazılım üretmek için hem XHTML, hem JavaScript, CSS bilmemiz ve belki biraz da jQuery gibi bir kütüphaneyi koklamış olmamız gerekiyor. Bunun yanında ayrıca hem bir sunucu tarafı diline, hem de SQL’e hakim olmanız da şart. Tüm bunların üzerine birkaç protokol bilgisi ve günümüzde yücelen entegrasyon becerilerini de eklersek sanırım yanıltmayız. Bu donanımı "iyi bir programcılık bilgisine sahip" bir bireye vereceksiniz ve bir Web geliştiricisi elde edeceksiniz. Bu insan evladı da gereksinimlerinizi alacak ve sizlere çalışan ve amacına yönelik bir yazılım sunacak.
Ölme eşşeğim ölme.
Ne oldu da bu noktalara geldik peki? Pascal’dan C#,Java,Ruby gibi dillere geçerken ne yazdığımız kod azaldı, ne de yazılım geliştirme biçimlerimiz bu değişimden etkilenebildi. Ne nesneye yönelik programlama, ne CORBA, ne de SOA bizleri daha iyi yada daha güvenilir yazılımlar yazma yolunda ilerletti. Yazılım testi açısından baktığımızda ise bu değişimin, öngörülerimizi dağıtmanın ve kılıçlarımızı köreltmenin ötesinde bir etkisi olduğunu söyleyemem.
Böylesine artan gereksinimler yüzünden Web geliştiricileri belki 10 yıl sonra sadece Web tabanlı uygulamalar geliştireBİLİYOR olacaklar. Gereken minimum bilgi ve beceri o kadar artacak ki diğer bir platformda geliştirme yapmak için fizibil olmayacak kadar uzun hazırlıklar yapmak gerekecek. O zaman bir geliştiricinin öğrenmek hususunda tercih yapması gerektiğinde, olmazsa olmaz teknolojilerin yanında temel bilgisayar bilimlerinin arka plana atılacağını görmek için alim olmaya gerek yok.
Eğer bugün elimizde bir çözümümüz yok ise, 10 sene sonra daha karmaşık, daha fazla hata içeren uygulamalar göreceğiz ve bu yazılımlardaki hataları ayıklamak için hiçbir dişe dokunur aracımız olmayacak.
Teknik ilerleme, teknik sorunlara teknik yanıtlar verirken, biz yazılım geliştiren insanlar aynı çözümler için hala aynı miktarda kod yazmaya devam ediyoruz. Evet artık taşınabilir kod yazmak çok daha kolay ve yeni geliştiricilerin malloc() içerisinde sizeof(char) neden kullanılır pek fikri yok, olmasına gerek de yok ama hala yazdıkları kodun %60′ı kullanıcı arabirimi ile ilgili. Diğer bir deyişle yazılan kodun büyük bir kısmı iş değil insan için yazılıyor.
Eğer bilimsel bir yaklaşım ile yazılım üretecek isek, karşı karşıya kaldığımız sahte gerçekler nedir, o Popper’a göre kurtulmamız gereken? Yanlış inançlarımız neler?
Belki bu geçen sürede tekniğin ilerlediği yön olamaz mı bizi sahteliği ile uyutan? Artık ihtiyacımız olan araçları üretmek öylesine zor ki, bu konuda Microsoft, IBM, Sun, Oracle gibi birkaç devin dümen suyuna girmiş durumdayız. Geldiğimiz nokta da budur.
Bu düşüncelerin ışığında yazılım üretiminin bilimsel olmaktan uzak olduğu sonucuna varıyorum. Eğer yanılıyor isem ve gerçekten yazılım üretimi bilimsel ise, o zaman da bu alandaki efektif gelişmelerin düşük seviyesi varolan birçok yanlış inanış ve sahteliği işaret edecektir. İki koşulda da falımızda yememiz gereken çok fırın ekmek görünüyor.
Benim Memleketim bu sorunu ancak yazılım üretiminin kalbini entegratör firmalar, finans ve telekomünikasyon sektöründen alıp üniversitelere taşıyarak, birlikte çalışmayı öğrenerek ve öğreterek ve yerli yazılım ekosistemini geliştirerek aşabilir. Bugün OSS ile dev firmaların ürünlerinin arasındaki fark, pazarlama departmanlarının başarısı kadarken, şansımız düne nazaran daha yüksek. "Dünyanın derdini ben mi çözeceğim?" diyorsanız eğer, unutmayın ki bu dert "çözülecek" ise yine dünyadan biri çözecek.
Peki "Ahvâl ve şerait" belli iken, yaptığınız işi iyileştirmek için siz ne yapıyorsunuz?
Baharın gevşetmesi ile dikkati elden bıraktığım bir anda peydah olan sırt (yada daha doğrusu omur) ağrısı sebebiyle bu hafta yataktaki ikinci günümdeyim. Her ne kadar insanın elinin altında dünyaya bağlı bir klavye de olsa, ne yalan söyleyeyim sıkılıyorsunuz. Bu yazının temelini oluşturan tartışma belki bu can sıkıntımın eseri olabilir. Belki de kendi kendime kaldığım bu süre zarfında düşüncelerimi sonunda toparlayabildim. Karar sizin.
İyi Testler
Post a Comment