Yazılım geliştirmenin Analiz, Tasarım, Geliştirme, Test, Integrasyon, Bakım şeklinde giden bir döngüsü bulunmaktadır ve bu aşamaların her birinin belli bir maliyeti bulunmaktadır. Yazılımcılar doğamız gereği Tasarım ve Geliştirmeye odaklanmış durumdadır. Ancak maliyetlere baktığımızda şaşırtıcı bir şekilde aslında yazılım geliştirmede Tasarım + Geliştirme maliyetinin %12 seviyelerinde olduğunu görüyoruz. Test ve implementasyon ise bunların daha üzerinde bir maliyete sahip. Bakım ise bunların tamamının üzerinde %67lik bir maliyet kısmına sahiptir.
Peki bakımı bu kadar yüksek maliyete sahip yapan etkenler nelerdir. Zaman içerisinde değişim ihtiyacı duyulmayacak bir yazılım sistemi düşünülemez. Kullanıcı ya da müşterilerin ihtiyaçlarındaki değişimlerin sisteme yansıtılması gerekir. Ayrıca, yeni bir donanım ya da yazılım altyapısı nedeniyle sistemin çalışma koşulları değişebilir. Tabii ki testler sırasında farkedilmeyen hatalar tespit edilebilir ve giderilmesi gerekir.
Bakımı zorlaştıran bazı sebeplere göz atalım;
lKodlama yapılırken tasarım aşamasının eksikliğinden kaynaklı belli yazılım prensiplerinin gözardı edilmesiyle oluşan kodun bakım ve geliştirmesinin zorlaşması.
lKodun tek veya bir kaç kişinin elinde olacak şekilde geliştirilmesi ve belli sebeplerden dolayı bu kişilerle herhangi bir sebepten iletişim olmaması.
lKod değişiminin getireceği riskler.
lLegacy code
Legacy Code Nedir?
lArtik desteklenmeyen yazilimlara / dillere dayanan, ama hala kullanimda oldugu icin zorunlu olarak devam ettirilmesi ve bakim yapilmasi gereken kod.
lBir yazılımcıdan başka bir yazılımcının kontrolüne geçen kod.
lTesti bulunmayan kod veya Test otomasyonu bulunmayan kod.
kavramları legacy kodu işaret eder. Legacy kodlar değiştirildiği takdirde hata çıkarmaya daha meyillidir.
Test Driven Development Nedir?
Kod yazılmadan önce test senaryolarının yazılması, bu senaryolara bağlı olarak kodun yazılması temeline dayanan bir yaklaşımdır. Test driven development sürecini anlayabilmek için öncelikle Red cycle(Hatalı sonuç döndüren test), Green cycle(Başarılı sonuç döndüren test) ve Refactor(Kod temizleme) kavramlarını anlamamız gerekmektedir.
Red Cycle(Hatalı Sonuç Döndüren Test) Nedir?
Bu durum, geliştireceğiniz uygulamaların hangi durumlarda hata vereceğini anlayıp bu durumlarda nasıl sonuçlarla karşılaşacağınızı öğrenmenizi sağlayacaktır.Örnek uygulamamız da hesaplama işlemleri var ise ve bu hesaplama işlemlerinin birindeki bölme işleminde bölenin 0 olma durumu söz konusu ise bu durumu ortaya çıkartan bir senaryoya uygun test metodu hazırlayacaksınız. Hazırladığınız testi çalıştırdığınızda olmasını beklediğiniz durumla, yani hatayla karşılaşmanız gerekmektedir. Hata oluşmadığı durumda kodda bir yanlışlık var demektir.
Green Cycle(Başarılı Sonuç Döndüren Test) Nedir?
Başarılı sonuçlar ortaya çıkartan test durumları yazma işlemidir. Bu test sonucunda ortaya çıkan değer ile olması gereken değerin aynı olması beklenmektedir.
Refactor(Kod Temizleme) Nedir?
Testlerden olması gereken sonuçları elde ettikten sonra yazdığınız kodları daha basit, anlaşılır ve geliştirmeye açık, daha kolay düzenlenebilir bir hale getirme işlemidir. Refactoring uygulanmış bir kod daha temiz olduğu için okuması daha kolaydır.
Test Driven Development Uygulama Aşamaları;
lKodu ya da testi yazmadan önce, ne amaca yönelik bir geliştirme yapacağımızı biliyor olmamız lazım. Sonra bunu tasarlamamız gerekiyor. Aslında kodu yazmadan önce testlerini yazmanın kafada karışıklık yaratmasının sebebi geliştirmenin tasarlanmamış olmasından dolayıdır. Siz daha ortada bir kod yokken onun testini yazabiliyorsanız yapacağınız şeyi kafanızda gerçek anlamda oluşturmuşsunuz demektir.
lÖnce Hata alacak testler yazılır. Test edilen sınıf metotları ilk etapta null değerini geri verecek veya hiçbir şey yapmayacak şekilde programlanır. Tabii ki daha kodumuz olmadığı için testlerimiz ilk seferde doğal olarak hata alacaktır, alması da gerekiyor. Bu hataları çözmek için artık kodu yazmaya başlayabilirsiniz. Kodu yazarken, tamamen ihtiyaca yönelmek daha doğrudur.
lKod testleri geçecek duruma getirilmelidir. Kodumuzu yazdıktan sonra, yazmış olduğumuz testleri tekrar çalıştırıp, eğer testler başarılı olarak sonuçlanırsa, yeni testler ve yeni kodlara devam edebiliriz.
lKod refaktör(kod temizleme) işlemi yapılır. Eğer tüm testleri green(başarılı) durumuna getirebiliyorsak, yeni testler ve yeni kodlara devam edebiliriz. Test başarısız sonuçlanırsa kodumuza geri dönüp, refactoring yaparak kodumuzu iyileştiriyoruz.
Test Driven Development’in Sağladığı Avantajlar;
lTestleri hazırlayan programcı, sistemin nasıl çalışması gerektiğini düşünmek zorundadır. Test Driven Development ile sadece gerekli sınıflar ve metotlar oluşturulur. Test Driven Development, programcının -belki ilerde kullanılır, bu metodu eklemekte fayda var- tarzı düşünmesini engeller. Böylece Test Driven Development proje maliyetini düşürür, çünkü sadece gerekli sınıf ve metotlar için zaman harcanır.
lTest Driven Development ile test kapsama alanı genişletilir. Hemen hemen her satır kod test metotları tarafından çalıştırılır.
lTestler koda olan güveni artırır. Kod üzerinde yapılan değişiklikler yan etkilere sebep verebilir. Testler olmadan oluşabilecek yan etkilerin tespiti çok zordur.
lTestler sistemin nasıl çalıştığını gösteren dokümantasyon olarak düşünülebilir. Programcılar testleri inceleyerek, sistemin nasıl çalıştığını çok kısa bir zaman içinde öğrenme imkanı bulurlar.
lTest Driven Development tarzı programlama programcının debugger ile hata arama zamanını kısaltır yada tamamen ortadan kaldırır.
lTasarım odaklı düşünme mantığını sağlar.
lSıkıcı bir geliştirme ortamı yerine, eğlenceli ve güvenli bir ortamda motivasyonu yüksek ekiplerin oluşturulabilmesine sebep olur.
Yorumlar
Yorum Gönder