Kod karmaşıklığı giderme teknikleri

Zafer Ayan
3 min readJul 27, 2022
Pic: http://www.complexityandotherbeasts.com/

Dün #TeknasyonTechMorning yayınında bahsetmek üzere Daniel Sieger’in Your Code Doesn’t Have to Be a Mess isminde blog yazısına denk gelmiştim. Yazıdan aldığım notları da Medium üzerinde de paylaşmaya karar verdim.

Amerikalı bilgisayar bilimcisi Alan Perlis’ten karmaşıklık üzerine: Karmaşıklığı aptallar görmezden gelir, pragmatistler acısını çeker, bazıları ondan sakınır, dahiler ise karmaşıklığı giderir

İlgili blog yazısında Daniel, temel hatlarıyla basit bir uygulama oluşturmanın öneminden ve yapılacak olan maddelerden bahsetmiş. Dilerseniz bu maddelerin üstünden geçelim.

Uygulamanın amaçlarını belirle

Kodladığın yazılımın hangi problemlere ışık tuttuğunu belirle ve bu yönde net bir şekilde hedeflerini oluştur. Bunları bir kağıda yaz ve görünür bir yere koy. Yeni bir feature eklenmesi veya bir değişiklik durumunda karar alırken bu yazdıkların aklına gelsin.Bu bağlamda tek bir tane iş yap ve bunu düzgün bir şekilde yap. Aynı anda sayısız sorunu çözmeye çalışma. Bunun için temel Unix felsefesini uygula.

Unix basitlik kuralı: basitlik için tasarla; yalnızca zorunlu olduğun durumlarda karmaşıklık ekle.

Kısıtlamaları belirle

Source: https://dilbert.com/strip/2001-04-14

Yazdığın kodun, amacının dışında olan şeyleri de belirle: yaptığın uygulama hangi problemleri çözmemesi lazım? (Örneğin Spotify uygulamasında mesajlaşma özelliği yok.) Uygulamanın scope’unu kısıtla. Kullandığın programlama dilleri, kütüphaneleri veya işlem modelleri üzerinde teknik kısıtlamalar oluştur. Bu kısıtlamaları kucakla ve onlara bağlı kal. Bu kısıtlamalar, mevcut problemle ilgili daha fazla düşünmeye zorlayacaktır. Sınırlarının çerçevesinde yaratıcı olmaya çalış. Kısıtlamalarla çalışmak, yaratıcılığı ve yeniliği ortaya çıkarabilir. Ancak bu yaratıcılığı uygularken, kodunu çok fazla eğip bükmemeye çalış.

Hayır demeyi öğren

The Office dizisindeki o meşhur sahne: https://knowyourmeme.com/memes/no-god-please-no

Belki de en önemli ancak en zor konulardan birisi hayır diyebilmek. Ortada bir uygulama varsa, o uygulama için yeni bir özellik veya işlev eklemek için neredeyse sonsuz miktarda talep oluşuyor. Hayır demeyi öğrenmek, uygulamanızın çılgınca bi şekilde pek çok yöne dallanıp budaklanmasını önler. Hayır demek, özellikle de ticari uygulamalarda çok zor veya imkansız derecede olabilir. Ancak öyle olsa bile: ne gerekiyorsa onu yap, daha fazlasını değil. Özellikler eklenirken tetikte ol aynı zamanda da hayır demenin gereksiz olduğu durumları da hesaba kat.

Çöpleri ortadan kaldır

Pic: https://www.monkeyuser.com/2018/refactoring/

Düzenli aralıklarla refactor yap, kodunu kısalt ve bunu yaparken acımasız ol. Kullanılmayan özellikler, erişim yapılmayan ölü kodlar, debug yaparken eklediğin console.log() gibi yardımcı metotlar ve geliştirim esnasında yaptığın prototip kodlarını ortadan kaldır. Unutma ki arkanda git gibi bir versiyon kontrol sistemi var. Bu sayede eski feature kodlarına geri dönüp bakabilirsin. Çöpleri atmak, yalın uygulama geliştiriminin de en temel parçası olduğunu bil. Daha da ötesi: Bir süreliğine sadece net kod miktarını azaltan PR’ları kabul et. Tabii bunu yaparken kod üzerinde değişkenlerin ve metot isimlerinin kısaltılması gibi obfuscation yapılmamasından da haberdar ol.

Bağımlılıkları minimize et

Source: https://toggl.com/blog/world-created-programmer

Herhangi bir bağımlılığı eklerken seçici davran. Kodun tekrar kullanımını kutsal bir kase gibi görme. Dikkatlice artı ve eksilerini tart. Eklediğimiz bağımlılıklar zaman içerisinde bozuluyor, yok oluyor, çöpe dönüşüyor veya güvenlik riski oluşturuyor. Eğer library kodu kısa ise, dependency olarak ekleme yerine kodu proje içerisine kopyala/yapıştır (Vendor by default). Eğer söz konusu işlev çok önemliyse, core business özelliği ise, kendiniz yapmayı düşünün (Örneğin Excel’in içinde kendi C compiler’ı var).

Sonuç olarak

Kompleks problemler çözen uygulama yapıyor olsanız dahi basitçe çözmeye çalışın. Unutmayın ki basitlik tek başına bir değer değildir, bir sonuçtur. Daha iyi bir yazılım, daha kolay bakım yapılabilen bir sistem ve zaman içerisinde kolayca evrimleşebilen bir yazılım oluşturur.

--

--