YAGNI (You Aren't Gonna Need It) Prensibi
Tecrübe oldukça geniş bağlamda karşılık bulan bir ifade. Hatalardan ders çıkardığımızda da varsayımları (benzer işler, söylemler üzerinden) tanımlamak istediğimizde de tecrübe ifadesinden faydalanırız.
Peki, gerçekten öyle mi? Takvim aşamasında “ileride lazım olur, şimdiden ekleyebiliriz” söylemlerini için ayrı bir cetvel oluştursak, boşa harcanan zamanın projenin kendi takvimi içerisinde azımsanmayacak bir dilimi kapladığını kolayca görebiliriz.
Tecrübe, bu “gereklilik” için de bir değerlendirmeye sahipse, makul. Ancak, çoğu zaman işler öngörüldüğü gibi olmuyor. Hele ki basitlik, yalınlık ve çeviklik mevzubahis ise, attığımız her adımın o anın bir ihtiyacına cevap vermesi ve kapsamlı bir değerlendirmenin sonucunda kararlaştırılmış olması gerekir. Bu gibi durumlarda, işe yaraması muhtemel en basit şeyi yapmak1 (DTSTTCPW) daha doğru bir yol olacaktır. XP’nin ardındaki prensiplerden biri de budur. Prensip yazılarına, KISS (Keep It Simple, Stupid)‘in ardından YAGNI (You Aren’t Gonna Need It) ile devam edelim.
YAGNI (You Aren’t Gonna Need It)
YAGNI, Extreme Programming (XP) prensiplerinden biridir2. “Gelecekte lazım olacak” düşüncesi ile ihtiyaç duyulanın ötesinde iş / geliştirme yapılmaması gerektiğini savunur ve bu yaklaşımı “işe yaraması muhtemel en basit şeyi yapmak” (DTSTTCPW) şeklinde ifade eder.
Yarının Değil, Bugünün Problemini Çöz
Yazılımcıların o an için gerekli olmayan ve iş listesinde bulunmayan özellikleri geliştirmesinin ve projeye dahil etmesinin en yaygın sebeplerinden biri o özelliği gelecekte ihtiyaç duyulacağı öngörüsüyle (foresee) o an geliştirmenin daha etkili ve ucuz olacağını düşünmeleridir. Fakat iş akışı içerisinde yer almayan (veya “nice to have” olarak nitelendirilmiş olan) bu özellik yazıldığı andan itibaren “varsayımsal özellik” kategorisine dahil olur ve bu özellik esasında projenin ilerleyen süreci içerisinde hiç bir zaman talep de edilmeyebilir. Bu durum neticesinde de analiz, geliştirme süresi ve test süreleri boşa harcanmış, gerekmeyen bir kaynak (zaman, motivasyon vb.) tüketimi söz konusu olacaktır.
Odaklanma ve basitlik mantralarımdan biridir. Basit karmaşıktan daha zor olabilir: Düşüncenizi basitleştirmek ve detaylardan temizlemek için daha çok çalışmanız gerekir. Ama sonuç buna değer! Çünkü oraya bir kez vardığınızda dağları bile hareket ettirebilirsiniz.
~ Steve Jobs3
Bir diğer alternatif durumda ilgili geliştirmeye ilerleyen süreçte ihtiyaç duyulmasıdır. Ancak, bu durumda, geliştirme ihtiyaç olarak ifade edilene kadar geliştirmenin kapladığı alan, taşıma (cost of carry) ve gecikme (cost of delay) maliyetleri sebebiyle gerekmeyen bir tüketim olacaktır. Ayrıca, yeni durum neticesinde geliştirmenin güncelliği (ihtiyacın kapsamı, kullanılan framework / library vb. değişmiş olabilir) yeniden ele alınmalıdır. Dolayısıyla, tekrar eden bir iş ve kullanılmadan tüketilen bir kaynak tüketimi söz konusu olabilir. Bu ihtimaller çerçevesinde, gereksinim duyulmayan bir geliştirmenin yapılmaması en makul seçenek olacaktır. YAGNI, sadece varsayımsal bir özellikler (presumptive feature) bağlamında değerlendirilmelidir ve kodun yeniden ele alınmasının (refactoring) kolay ve/veya gerekli olduğu durumlar için geçerli değildir. Çünkü yeniden düzenleme, kodu daha “makul” hale getirir.
Varsayım dahilinde ele alınan özellik(ler)in kapsamlarına bağlı olarak, geliştirmenin büyüklüğü arttıkça YAGNI prensibinin de önemi artacaktır. Bir kaç saatlik geliştirme göz ardı edilebilir. Ancak, geliştirmenin bağlamı eğer yeni riskler doğuruyorsa ya da gereksinim ihtimali düşükse basitlik anlamında geliştirmenin yapılmaması daha uygun olacaktır.
İleri Okumalar
- “do the simplest thing that could possibly work” (DTSTTCPW) ↩
- Martin Fowlser. (2015). Yagni ↩
- Steve Jobs, BusinessWeek, May 25, 1998, “That’s been one of my mantras — focus and simplicity. Simple can be harder than complex: You have to work hard to get your thinking clean to make it simple. But it’s worth it in the end because once you get there, you can move mountains.“, bbc.com/news/world-us-canada-15195448 ↩