Kötü Yazılım Tasarımın Belirtileri
Biz yazılım geliştiricileri olarak amacımız bir ya da birden fazla yazılım dilini, kütüphaneleri, teknolojileri kullanarak ve belirli bir miktar kod yazarak ortaya çalışan bir yazılım ürünü çıkarmaktır. Ancak bu her zaman bizim yaptığımız işi kaliteli olduğu anlamına gelmez. Ortaya çıkan yazılımın kaliteli olduğunu anlayabilmemiz için esneklik, güvenlik, güvenilirlik, ölçeklenebilirlik, modülarite, adaptasyon gibi bazı durumlara bakmamız gerekir. Bu durumlar bize yazılımın kalitesi hakkında bilgi verir. Tüm bu durumlara uyacak bir kod yazabilmekte belirli tasarım kalıplarına, prensiblere uyarak geliştirmekten geçer. Kısacası bu kalıplara ve prensiblere uyarak yazılımda olumsuz sayılacak etkileri azaltabiliriz ve kaliteli bir yazılım ortaya çıkarabilirz.
Rigidity — Esnemezlik
Esnemezlik, bir yazılım sisteminin değişime ya da gelişime karşı gösterdiği dirençtir. Bir yazılım zaman içerisinde gerekli değişimleri ve istekleri karşılayabilecek şekilde gelişebilmeli ya da değişebilmelidir. Eğer bir sistem zaman içerisinde gelen talepleri karşılaması için gelişim ya da değişim yapılması isteniyorsa ve sistem buna aşırı direnç gösteriyorsa ya da hiç izin vermiyorsa biz bu sistemlere esnemez (rigidity) sistem diyoruz. Esnemez sistemlerde en ufak bir değişim ya da gelişim kod yapısında dalgalanma etkisi yaratabilir ve buda istenmeyen hatalara, kötü sonuçlara yol açabilir ya da kapsamlı yeniden bir çalışma yapmak zorunda bırakabilir. İyi bir tasarımda değişim ya da gelişime karşı direncin düşük olması beklenir. Bu şekilde olası değişimler ve gelişimler büyük sorunlar yaşanmadan rahatlıkla yapılabilir.
Fragility — Kırılganlık
Kırılganlık aslında esnemezlik ile yakından ilişkilidir. Biri olmazsa diğeride olmaz. Kırılganlık, bir yazılım sisteminin değişim ya da gelişim sonrası oluşan hata eğilimini ifade eder. Kırılgan sistemler, değişime ya da gelişime karşı oldukça hassastır ve kolayca bozulabilir. Belki bu hatalar bir domino etkisi yaratabilir ve birden çok yapının değişmesine neden olabilir. Bu değişim kontrol edilemez bir noktaya gelebilir ve çözülemeyen, devamlı oluşan kronik hatalara yol açabilir. Kırılganlığı yüksek ve esnekliği düşük sistemlerde bakım zor olduğundan dolayı bakım maliyetleri yüksektir. Bu tip sistemlerin tasarımı kötüdür.
Immobility — Hareketsizlik
Hareketsizlik, yazılım sistemindeki bir kod parçasının değişime, yeniden düzenlemeye ya da bir yerden başka bir yere taşımaya karşı oluşan zorluk ile ilgilidir. Modüler olmayan sistemlerde, kodların birbirlerine karşı olan yüksek bağımlılıkları sebebiyle bu problem ortaya çıkar. Hareketsizlik sistemin gelişimini ve değişimini engeller. Bakım ve geliştirme maliyetlerini artırır.
Yazılım sistemlerimizin iyi bir tasarıma sahip, değişimlere ve gelişimlere uyarlanabilir olmasını istiyorsak, modüler yapılar kurmaya, zayıf bağımlılıklar yaratmaya, tekrar kullanılabilen kodlar üretmeye, kohezyonu yüksek bileşenler ortaya çıkarmamız gerekiyor. Sistemlerimizde soyutlamayı mümkün oldukça yapmamız gerekiyor. KISS (Keep It Simple, Stupid), DRY (Don’t Repeat Yourself), YAGNI (You aren’t gonna need it), SOLID gibi prensipleri uygulamalıyız. Tasarım kalıpları üzerine çalışmalıyız ve onları aktif bir şekilde kullanmalıyız. İyi bir tasarıma sahip sistemlerin zamanla kötü bir tasarıma dönüşebileceğini unutmamalıyız. Mevcut kodumuzu incelemeli, gerektiğinde mevcut kodumuzu düzenlemeli ve kodumuzun kalitesini devamlı yüksek tutmalıyız. Yazılım sistemimizi tasarlarken testi göz önünde bulundurmalıyız. Test edilmesi kolay yapılar oluşturmayı ve yazılım güvenilirliğini sağlamak için birim testi, entegrasyon testi ve test odaklı geliştirme (TDD) gibi teknikleri kullanmalıyız.