Çürüyen Yazılım Tasarımı (Rotting Design)

Jack Reeves 1992 yılında yaynladığı bir makalede; yazılım sistemi tasarımının kriterlerini karşılayan tek yazılım dökümantasyonun, kaynak kodları olduğu kavramını ortaya koydu [1]. Bu kavrama göre yazılım tasarımı, kaynak kodları temsil eden soyut bir kavram iken; UML (Unified Modelling Language) diyagramları ise tasarımın parçalarını temsil etmektedir. Yazılım büyüdükçe; tasarım, karmaşık hale gelme eğilimindedir. Böyle bir durumun sonucunda; karmaşık, bakımı zor, modüllerin birbirine sıkı sıkıya bağlı, basit değişikliklerin bile gerçekleştirilmesinin çok zor olacağı bir kod yapısı ortaya çıkar. Bu, yazılım tasarım sisteminin ve haliyle yazılım projesinin çürümesi anlamına gelmektedir.

 

Yazılım Tasarımı Neden Çürür?

Değişikliklere kolayca uyum sağlanamayan geliştirme ortamlarında; gereksinimler ilk tasarımın ön görmediği şekillerde değiştiğinde, yazılım sisteminin tasarımında bozulmalara neden olmaktadır. Çoğu zaman bu tarz değişikliklerinin veya eklemelerin hızlı bir şekilde yapılması istenildiğinde sistemin orijinal tasarımının bozulması önemsenmez. Ancak asıl yapıyı ihlal eden bu tarz değişiklikler devam ettikçe kod yapısını işin içinden çıkılamaz hale getirir.

 

Tasarım Kokuları (Design Smells)

Robert ve ark. [2006] göre, zayıf bir şekilde tasarlanmış yazılımların yedi çürüme belirtisi bulunmaktadır. Bu belirtilerden herhangi biri ortaya çıktığında yazılımın çürüdüğü veya çürümeye başladığı anlaşılabilmektedir.

  • Katılık (Rigidity)
  • Kırılganlık (Fragility)
  • Hareketsizlik (Immobility)
  • Akışmazlık (Viscosity)
  • Gereksiz karmaşıklık (Needless complexity)
  • Gereksiz tekrar (Needless repetition)
  • Bulanıklık (Opacity)

 

Katılık (Rigidity)

Yazılımın, basit yollarla bile değiştirilmesinin zor olma eğilimi göstermesidir. Yapılacak bir değişiklik, bağımlı modüllerde de değişiklikler yapılmasına neden oluyorsa, bu yazılım tasarımının katı olduğunu belirtir.

 

Kırılganlık (Fragility)

Yazılımın, bir yerinde değişiklik yapıldığında buna tepki olarak birçok yerinde kırılma eğilimi göstermesidir. Genelde bu özelliğe sahip yazılımlarda sorunlar çözüldükçe daha fazla sorunlar çıkar. Sonuç olarak bir değişikliğin bile kolay bir şekilde tasarımı bozan durumlar, tasarımın kırılganlığına işaret etmektedir.

 

Hareketsizlik (Immobility)

Yazılımda, diğer sistemlerde faydalı olabilecek modüller içerdiğinde hareketsizlik eğilimi gösterir. Bu bileşenleri orjinal yerinden ayırmak risklidir ve çok çaba gerektirir. Modüllerin arasındaki ilişki derecesine de `coupling` adı verilmektedir.

 

Akışmazlık (Viscosity)

Akışmazlık belirtisi iki formda ortaya çıkmaktadır: ortamın ve yazılımın akışmazlığı. Ortamın akışmazlığı, geliştirme yapılan ortamın yavaş ve verimsiz olduğu durumlarda ortaya çıkar. Bu gibi durumların ortaya çıkması, çoğunlukla alınan görevin bir an önce yapılabilmesi için yazılım orijinal tasarımı gözardı edilmesiyle olur. Yazılımın akışmazlığında ise geliştiriciler tasarımı koruyan zor yöntemler yerine kendilerine daha kolay yöntemleri tercih edebilmektedirler. Bu şekilde de yazılım tasarımının orijinal felsefesi gözardı edilmiş olur. Her iki durumda da akışmazlık olan bir proje, yazılım tasarımın korunmasının zor olduğu bir projedir. Sonuç olarak tasarımı korurken geliştirmeyi kolaylaştıracak; sistemler ve proje ortamları oluşturmak gerekmektedir.

 

Gereksiz Karmaşıklık (Needless Complexity)

Bir tasarım; hali hazırda kullanışlı olmayan öğeler içerdiğinde, gereksiz bir karmaşıklık ortaya çıkabilmektedir. Birçok beklenmedik duruma hazırlanmak, tasarımı hiç kullanılmayan yapılarla dolu hale getirir. Kullanılmayan bu yapılar, yazılım tasarımsal olarak ağırlığını da arttırır. Sonuç olarak ortaya; karmaşık ve anlaşılması zor hale gelen bir yazılım ortaya çıkar.

 

Gereksiz Tekrar (Needless Repetition)

Yeterince soyutlama yapılmayan yazılımlarda gereksiz kod tekrarları kaçınılmazdır. Kod tekrarının çok olması sistemdeki gereksiz kod fazlalığını arttırır. Gereksiz kod fazlalıkları da sistemin anlaşılmasını ve bakımını zorlaştırır.

 

Bulanıklık (Opacity)

Bulanıklık, kodun okuması ve anlaşılmasının zor olma eğiliminde olduğunu belirtir. Zamanla gelişen kod daha bulanık hale gelme eğilimdedir. Bulanıklığı minimumda tutarak; açık ve anlaşılabilir kod yazmak ise sürekli çaba gerektiren bir eylemdir.

 

Çürümelerden Kaçınmak

Robert C. Martin’in 2000 yılında yazılım tasarımı sorunlarının çoğuyla başa çıkmamızı sağlayan SOLID prensipleri'ni tanıttı. Bu prensipler göz önüne alınarak oluşturulan tasarımlar çürümeyi minimuna indirirerek; tasarımı daha anlaşılır, esnek ve bakımı kolay hale getirir.

   

Kaynaklar
  • [1] Jack W. Reeves, “What is Software Design?”, 1992 C++ Journal.
  • [2] Robert C. Martin and Micah Martin, “Agile Principles, Patterns, and Practices in C#”, 2006.
  • [3] Alex Atomei, 2020, “Rotting Design”, https://www.cognizantsoftvision.com/blog/rotting-design/

You might also enjou