Kod Kalitesi Denince Akla Gelenler

yazar:

kategori:

Son zamanlarda temiz kod (clean code) teriminin kod kalitesi terimi ile eş anlamlı kullanıldığına şahit olmaktayız. Kod kalitesini sadece tek bir boyuta indirgemenin doğru olmadığını düşünüyorum. Temiz kod ya da testler çok boyutlu olan kod kalitesinin sadece iki boyutunu oluşturmaktadırlar. Kod kalitesinin görebildiğim boyutlarını aşağıdaki resimde bir araya getirmeye çalıştım.

kalite2

Kod kalitesini iç ve dış kod kalitesi olarak ikiye ayırabiliriz. İç kod kalitesi daha ziyada yazılımcı ve testçilerin doğrudan şahit oldukları ve daha da iyi olması için çaba sarf etmeleri gereken objektif olgudur. Buna karşın dış kod kalitesi kullanıcı ve müsterinin uygulamayı kullanırken sahip oldukları subjektif hislerden oluşan algıdır. Burada subjektif kelimesini kullandım, çünkü kullanıcıdan kullanıcıya kalite algısı sahip olunan kalite tanımına göre değişmektedir.

Resimde yer alan ve kod kalitesini oluşturan boyutları şu şekilde tanımlayabiliriz.

Testler

Kod kalitesini ölçülebilir hale getiren faktörlerin başında yazılım testleri gelmektedir. Yazılım testleri olmadan uygulamayı müşteri gereksinimleri doğrultusunda yeniden şekillendirmek ya da geliştirmek mümkün değildir.

Bir yazılım sisteminin kalitesi söz konusu olduğunda, sistemin müşteri gereksinimlerini ne oranda tatmin ettiğine bakmak gerekmektedir. Uygulama ne kadar çok müşteri gereksinimine cevap verebiliyorsa, o oranda dışarıya doğru kaliteli olma imajına bürünür. Bu imajın sürdürülebilir olmasını sağlamak için uygulamanın yeni müşteri gereksinimlerine cevap verebilecek yapıda kalmasını sağlamak gerekmektedir. Bunun tek yolu refactoring yöntemi ile uygulamanın yeni gereksinimler doğrultusunda yoğrulabilir olmasından geçmektedir. Refactoring işlemi için testleri varlığı mecburidir. Testlerin olmadığı yerde rafactoring işleminin güvenli bir şekilde yapılması mümkün değildir. Bu yüzden kalitenin en önemli boyutlarından birisini ya da kalitenin temelini uygulama testleri oluşturmaktadır. Testlerin olmadığı bir uygulamada uzun vadede kaliteden ödün vermemek çok zor hale gelmektedir.

Kodun test edilebilir yapıda kalması önem taşımaktadır. Kodun test edilebilir yapıda olması yanı sıra testlerin çeşitliği de gereklidir. Birim, entegrasyon ve onay/kabul test türleri ile uygulamayı çok değişik perspektiflerden test etmek mümkündür. Uygulamanın hangi tür testler ve ne oranda test edilmesi gerektiğine ekip karar vermelidir.

Temiz Kod

Okunabilir ve kısa kod birimlerinden oluşan bir uygulamayı anlamak ve geliştirmek kolaydır. Lakin testlerin yeterli olmadığı bir ortamda kodun ne kadar temiz yazıldığı önem taşımamaktadır, çünkü testler olmadan uygulamayı yeniden yapılandırmak mümkün değildir. Uygulamayı yeniden yapılandırma gerekliliği her zaman müşterinin yeni isteklerinden doğduğundan, kodun temiz yazılmış olması yanı sıra test edilebilir ve test edilmiş durumda olmasına dikkat edilmelidir. Sadece test edilmiş temiz kod uygulamanın geliştirilebilir olmasını mümkün kılabilir.

Tasarım

Tasarımı uygulamanın temeli, şekli ve işleyiş tarzı olarak tanımlayabiliriz. Yeni müşteri gereksinimleri tasarımın adapte edilmesini zorunlu kılabilir. Yeni müşteri gereksinimleri ile adapte edilmeyen uygulama tasarımı zaman içinde sıkı bir korzet haline geldiğinden, yeni müşteri isteklerinin gelecekte implemente edilmesi zorlaşır. Bu sebepten dolayı esnek bir tasarımın oluşturulması ve korunması zaruridir. Esnek bir tasarım oluşturmak için SOLID tasarım prensipleri uygulanabilir. Tasarım prensiplerinin hepsini önemli bulmakla birlikte, tek sorumluluk prensibinin nesneye yönelik programlama teknikleri kullanıldığında, kendi içinde bir bütün ve kırılgan olmayan kod birimlerinin oluşmasını sağladığı söylenebilir.

İyi bir tasarımı iyi kılan uygulanmış olan tasarım prebsipleri değil, uygulamanın sahip olduğu testlerdir. Testler olmadan mevcut yapının adapte edilmesi mümkün değildir. Bu yüzden kalitenin bu boyutu diğer bir boyutu olan testlere dogrudan bağımlıdır. Testler olmadan sürdürülebilir bir tasarımın var olma şansı düşüktür.

Modüler Yapı

Bir modülü tek bir işten sorumlu, test edilmiş ve etrafı ile iletişimi kendi bünyesinde tanımlı olan arayüzler aracılığı ile gerçekleştiren kod birimi olarak tanımalayabiliriz.

Modüllerden oluşan bir uygulamada genel tasarım esnek kalma eğilimi gösterir. Bu uygulamanın geliştirilebilir olma özelliğini koruması anlamına gelmektedir. Uygulamanın hızla yeni müşteri gerensinimlerine adapte edilebilmesi dışarıya kalite artışı olarak yansır.

Performans

Kullanıcı perspektifinden bakıldığında, bir uygulamanın kalitesini tanımlayan en belirgin faktörlerin başında uygulamanın cevap verme hızı gelir. Tasarımın iyi, testlerin yeni gereksinimleri implemente etmek için yeterli, kodun temiz olması, performansın neden beklenenin altında olduğunu kullanıcıya anlatmak için yeterli argüman değildirler. Bu sebepten dolayı kullanıcı gözünde kaliteli bir uygulama kullandığı hissini uyandırabilmek için uygulama performansının hak ettiği düzeyde olmasına dikkat edilmelidir. Bu amaçla uygulama geliştiricileri performans ve yük (load) testleri yapabilirler.

Güvenlik

Giriş yaptıktan sonra kendi kullanıcı ismi yerine başka bir şahsın ismini gören kullanıcıya uygulamanın kaliteli olduğu hissini vermenin tek yolu, bu hatayı gidermektir. Uygulamanın ihtiyaç duyduğu güvenlik çemberini oluşturma görevi yazılım ekibine düşmektedir. Güvenliği sağlamak için tasarımın bu aspekt göz önünde bulundurularak oluşturulması gerekmektedir. Yeni müşteri gereksinimleri ile adapte edilen tasarım güvenlik tedbirlerini kapsama özelliğini de yitirmemelidir. Bu dışarıya kalite kaybı olarak yansır.

Doğruluk

Yapılan işlemin doğruluğu, kullanıcıların sahip oldukları kalite algısı ile doğru orantılıdır. Beklenenin dışında bir işlem sonucunun alınması, uygulamaya kullanıcılar tarafından kalitesiz yaftasının yapıştırılması için çok geçerli bir nedendir. Uygulama iç kod kalitesi bakımından çok büyük eforlar sarf edilerek hazırlanmış olsa bile, gün sonunda kalite seviyesini yapılan işlemlerin doğruluğu belirler. Uygulamanın doğru çalıştığını garanti etmek için yazılım testlerine ihtiyaç duyulmaktadır. Testler sayesinde işletme mantığı üzerinde istenmeden yapılan değişiklikler ve buradan doğacak yanlış işlem sonuçları kısa sürece tespit edilebilirler.

Yazımda kod kalitesini koruyabilmek için kullanabilecek bazı araçlardan bahsettim. Bunların başında şüphesiz yazılım testleri geliyor. Sürekli entegrasyon (continuous integration) aktiviteleri bünyesinde otomatik koşturulabilen yazılım testleri sayesinde hızlı geri bildirim döngüsü oluşturulabilir. Bu döngünün varlığı kod kalitesinin ne seviyede olduğu bilgisinin her daim gözler önünde olmasını sağlayacaktır.

Kalitenin ne seviyede olduğunu tespit edici geri bildirim döngülerinin olmaması, gözden ırak, gönülden ırak misali kalite olgusunun ekip tarafından göz ardı edilmesine sebep verecektir. Bunu bir nebze önleyebilmek için kod inceleme (code review) seanslarının yapılması, Sonar gibi statik kod analizi yapan araçların kullanılması ve başlama ve bitirme kriterlerinin kod kalitesini göz önünde bulunduracak şekilde yapılandırılması gerekmektedir.


EOF (End Of Fun)
Özcan Acar


Yorumlar

“Kod Kalitesi Denince Akla Gelenler” için 2 yanıt

  1. Mustafa TABUR avatarı
    Mustafa TABUR

    Elinize sağlık yine her zamanki gibi anlaşılır, sade ve oldukça faydalı bir yazı olmuş.
    Teşekkürler…

  2. Elinize sağlık hocam tüm yazılarınızı zevkle okuyorum.