Karmaşıklığı yönetmek

Yazılım projelerinin başarısız olma sebeplerinin başında planlama, yönetim ve ister sorunları geliyor. Sanılanın aksine teknik sebepler alt sıralarda. Teknik sorunların başını ise kontrolden çıkmış karmaşıklık çekiyor. Zaman içerisinde yazılımlar büyüyor ve kimse yazılımın nasıl çalıştığını, değişiklik yapınca nerelerin etkileneceğini bilemez hale geliyor.

Steve McConnell, Code Complete kitabında karmaşıklık yönetimini, yazılım geliştirmenin temel mecburiyeti olarak niteliyor. Bir yazılımın çalışması için gerekli altyapıyı bir düşünsenize; elektrik sinyallerinden programlama dillerimize uzanan onlarca katman. Tek bir insanın bütün bu detaya hakim olması mümkün değil. Donanım, network, işletim sistemi, derleyiciler gibi farklı bileşenler sayesinde bütün bu karmaşadan kendimizi soyutlayabiliyor ve çözmeye çalıştığımız probleme odaklanabiliyoruz.

Peki her gün sayesinde akli dengemizi koruyabildiğimiz bu yaklaşımı kendi sistemlerimizde neden kuramıyoruz. Neden Big ball of mud hala dünyanın en çok üretilen yazılım mimarisi? Neden spagetti bizim için bir yemek değil, korkulu bir rüya? Aslında hepinizin aşina olduğuna emin olduğum pek çok kavram – OOP, SOLID, tasarım kalıpları, mikro servisler, clean code, clean architecture vb.- karmaşıklığı yönetmek için araçlar. Maalesef bu kavramları derinlemesine anlayıp kullanmak yerine taklit etmekle yetiniyoruz ve asıl amacı kaçırıyoruz.

Yazılım geliştirirken temel hedefimiz; insan zihninin limitlerini göz önünde bulundurarak; bir tarafını anlamaya çalışırken diğer taraflarını düşünmemize gerek bırakmayan, anlaması. çalışması kolay yapılar kurgulamak olmalı. Diğer bütün ihtiyaçlar ikincil. Ancak bu sayede değişiklik ile barışabilir ve daha karmaşık problemler çözmeyi başarabiliriz.

Dave Farley, Modern Software Engineering kitabında karmaşıklığı yönetmek için şu başlıkları önermiş:

  • Modülerlik (Modularity)
  • Kohezyon (Cohesion)
  • – (Separation of concerns)
  • Bilgiyi gizlemek ve soyutlama (Information hiding and abstraction)
  • Bağımlılık yönetimi (Managing coupling)

Gelecek günlerde bu konulara ayrı ayrı değinmeye çalışacağım.

Comments

Leave a comment