Yazılım kalitesi, temelde geliştirme etkinliğinin verimli hale getirilmesi yaklaşımıyla ortaya çıkarılabilecektir. Bu değerlendirmeyi önceki yazımızda kalite tanımı denilince akla gelenleri esprili bir üslupla ifade etmiş ve birtakım detaylara dair ipuçları sunmuştum. 🙂 Kaliteyi geliştirme odağında düşünüp kurgulamak gerektiği için, kod geliştirme etkinliğinde ne tür kalite ölçümleri olabileceği ve bunları nasıl bir mantıkla yorumlamak gerektiği detaylı olarak izah edilmelidir.
Öncelikle tekrar ifade etmeliyim ki, yazılım kalitesi tek başına kod geliştirmeyle sağlanmamaktadır. Bir proje ya da iş sürecinde geliştirme kadar analiz, test, paydaş yönetimi, risk yönetimi gibi diğer aşamalar da denk bir etki yapmaktadır. Ancak nihayetinde tüm aktiviteler bir kod yazılma işine dönüştüğünden, odaklandığımız nokta da geliştirme safhasıdır.
Kalite modellerinde birçok parametre ve etken vardır. Her bir parametre, ilgili modele göre, diğer bir ya da birkaç parametreyle ilişkili ve tamamlayıcı unsurları beraberinde taşımaktadır. Kod kalitesi de bu modellerin ortaya koyduğu standartlardan beri değildir. Örneğin kalite parametrelerinde esneklik, tutarlılık kavramıyla dirsek temasında gitmektedir. Bütün olarak değerlendirildiğinde, standardı karşılama seviyesine göre kalite ölçümü yapılabilir. Birinin olmadığı ya da eksik olduğu durumda diğerinin sağladığı imkan da pratik olarak istenilen faydayı sağlayamayacaktır. Kalite modellerinin daha çok süreçsel yaklaşımla izah ettiği bu standartların geliştirme tabanında karşılıkları, geliştirme felsefesine yatırım yapacak bir ölçüt üzerine bina edilmiş ve yine kalite modellerine benzer birtakım standartlar ortaya koymuştur. Örneğin nesne yönelimli programlamada SOLID olarak ifade edilen prensipler, bir bakıma yazılım kalitesinin de ölçütü sayılabilir. 5 ayrı konsepti ifade eden ve her birinin baş harflerinin kısaltması olan SOLID, bir geliştirmede nelere dikkat edilmesi gerektiğinin ve ve bunun hangi amaçla yapıldığının izahı olmaktadır.
Kalite, bir amaç ve arkaplanda geçerli bir yaklaşım ya da felsefe üzerine bina edilmiş prensipler bütünüdür. Kod kalitesinde de temel amaç, verimli, eforu tekrarlamadan modüler olarak farklı noktalarda tekrar kullanılabilen, bakımı kolay ve anlaşılır, değişikliğe açık ve yönetilebilir altyapılar sunmak olarak özetlenebilir. Neredeyse tüm projelerde, yazılan kodların tekrar gözden geçirilmesi, yeni özellikler eklenmesi, performans iyileştirmesi, hata düzeltmeleri ya da teknolojik dönüşüm kaynaklı mecburi değişiklikler ve benzeri nedenlerle kod repository üzerinden tekrar geçilir ve kısmi ya da blok olarak tekrar incelenir. Bu nedenle özellikle bakım ve anlaşılabilir olma, kod kalitesinde en kritik aşamalardandır. Değişikliğe açık olma durumu bir gerçeklik olarak yazılım dünyasının standardı haline geldiği için, aslında diğer tüm kalite unsurları da bu ihtiyacı karşılayabilecek nitelikleri kapsamaktadır. Bunun yanında performans, güvenlik ve veri bütünlüğü gibi nitelikler de asli kalite unsurlarıdır ancak yukarıda tanımı verilen amaca ulaşmak için atılan adımlar, söz konusu performans ve diğer unsurlara da altyapı sağlamaktadır. Örneğin, SRP (single responsibility) prensibine uygun olarak geliştirilmiş bir yazılımda, güvenlik kapsamında bir doğrulama ihtiyacı olduğunda, ilgili modül/nesne/fonksiyon incelenecektir ve buna göre güvenlik kriterleri de yine SRP yaklaşımına göre kendi yapısı içerisinde geliştirilecektir. Performans iyileştirme için önce bir ölçüm yapmak gerektiğinde de benzer şekilde, kendi işini ve sadece kendi işini yapan bloklar yazılmış olduğu için, çalışmanın hangi aşamalara odaklanması daha kolay bulunacak ve bu noktalar üzerinde gerekli düzenlemeler yapılacaktır.
Kod kalitesi sadece SOLID prensipleriyle değil, diğer birçok farklı yaklaşımla beraber düşünülmelidir. Bu yaklaşımlar, en basit seviyesinde kod yazım üslubunda Camel case ya da Pascal case kullanmak, private değişkenlerin sınıfların alt kısmında yer almasına kadar detayda olan madde ve ölçütleri taşıyabileceği gibi, YAGNI de olduğu şekliyle, ihtiyaç olanı sadece ihtiyaç ortaya çıktığında gerçekleştirme şeklinde felsefi bir yön de alabilir. Daha teknik aşamalarda, abstraction, loose coupling, dependency injection, cohesion gibi kavramlar ölçeğinde değerlendirmeler olabilir. Daha üst sınıfta, çözüm ve algoritmanın bina edilmesinde tasarım prensipleri devreye girebilir. Kalite ölçümünde sayısal değerlere göre birtakım yorumlar yapılması gerekiyorsa da big O notation kapsamında algoritma ölçümü, trace takibi gibi kavramlar da düşünülebilir. Hepsi bir bütün olarak ele alındığında, değişken tanımlama aşamasından başlayıp, oluşturulan algoritmanın doğru yapısal özelliklerle doğru fonksiyon içerisinde ve doğru nesnede olması gibi alt seviyeden daha prensipsel seviyeye doğru bir akışın olduğu ve kod kalitesinde her birinin oldukça önemli olduğu anlaşılacaktır.
Her işin istisnası olduğu gibi, kod kalitesinde de istisnai bazı durumlar olacaktır. Nasıl ki veritabanı tablo tasarımında normalizasyon işlemleri, tablo insert/select oranlarına göre geri yönlü denormalizasyona çevrilip daha efektif tablo ve ilişkiler kuruluyorsa, kod tabanında da benzer durumlar olmaktadır. Bazen performans ölçütleri için standart yaklaşım ve prensiplerin dışında eksta geliştirimeler, karmaşık algoritmalar, algoritmik seviyede okunabilecek bir fonksiyon içerisinde assembly çağrıları gibi durumlar da olabilir. Ancak tüm bunlar, günümüz teknolojik ortamında gerçek manada istisna durumundadır. Gömülü sistemlerde dahi yeni nesil diller ve teknolojiler, elverdiği imkanda, kullanılmaktadır.
Kod kalitesini sağlamak, ilk seferde tutturulan bir hedef gibi düşünülmemelidir. Yukarıda sayılan prensipler ve örneklerini sağlamak için sürekli iyileştirme ve değerlendirme adımları uygulanmalıdır. Hatta bu yaklaşımla, Faruk Selman’ ın yazısında ifade ettiği gibi, Kaizen gibi kalite yaklaşımlarını kod geliştirme aşamalarına entegre etmek, sürekliliği sağlamak gerekmektedir. Bununla beraber, kod üzerinde sürekli iyileştirme denildiğinde akla gelecek kavram refactoring olacaktır. İşi doğru yapma prensibine göre, yazılan bir kod parçasını düzenlemek, daha uygun olduğu düşünülen bir modüle taşımak, algoritmik iyileştirme yapmak ya da tasarım prensiplerine uygun şekildeki yapılara dönüştürmek gibi sürekliliği olan bir işlemdir refactoring. Her bir geliştirmede parça parça daha iyi ve daha doğru nasıl yapılabilir odağında olmak ve buna göre düzenlemeleri yapmak olarak da düşünülebilir.
Agile yaklaşımlarda da kod kalitesi ve ölçümü önemlidir. Özellikle pair programming, test driven development gibi yaklaşımlar, öncelikle algoritmanın verimini artırmaya yardımcı olacaktır. Agile ya da geleneksel, tüm kod geliştirme süreçlerinde olması gereken ancak doğası gereği Agile ortamlarda daha yaygın olan code review süreçleri de performansa ciddi katkı sağlamaktadır. Code review için bazı araçlar kullanılabileceği gibi, bir kişi ya da ekip ile beraber yazılanları değerlendirmek ve istişare etmek de önemli bir katkıdır.
Görüldüğü üzere, yazılım kalitesinde ne kadar detaylı inceleyeceğinize bağlı olarak birçok yaklaşım, ölçüm ve sabit ortaya çıkarılabilir. Mümkün olan her yaklaşımı benimsemek ve bir standart olarak kod geliştirme etkinliğine dahil etmektir. Yani, bir değişken tanımlarken bu değişkenin private mı olacağı yoksa başka bir nesne içerisinde property mi olacağından başlayarak, okunurluğu yüksek, açık algoritmik tanımları olan, loose coupled sınıflar ve modüller üretmek, bütün bu işlemleri gerçekleştirirken de aynı zamanda refactoring yaparak daha iyiye ulaşmak için mümkün olan her noktaya dokunmak gerekmektedir.
Vurgulanması gereken önemli bir nokta, yukarıda ifade edilen prensiplerin temel olarak nesne yönelimli programlama paradigması altında dillendirilmiş olduğu, fakat genel olarak kod geliştirme etkinliğinin, metot ve yaklaşımı ne olursa olsun, tümü için geçerli olduğudur. Örneğin Wep API üzerinden http protokolünü kullanan servislerin yazılmasında nesne yönelimli programlamanın detaylarına ihtiyaç olmayabilir ancak SRP, loose coupling, kod okunurluğu, efektif veri yapısı gibi yaklaşımlar geçerli olacaktır. Dolayısıyla, kod kalitesi denilince sadece OOP prensipleri odağı düşünülmemeli, yeni trendlerde de aynı unsurların geçerli olduğu ve dolayısıyla Web 2.0 geliştirmesi de yapılıyor olsa, IOS uygulaması da geliştiriliyor olsa kalite ölçümleri için bu yaklaşımlardan faydalanmak gerekir. Son olarak, genel kabul görmüş yaklaşım ve ölçümlerle beraber, kurumsal ya da sektörel özel standartlar, ölçüm ve yöntemlerin de üretilip süreçlere dahil edilebileceği unutulmamalıdır.