Spec odaklı geliştirme, çalıştırılabilir bir spesifikasyonu (şartnameyi) ekibin sahip olduğu birincil eser olarak ele alıp kodu bu niyetin türetilmiş bir projeksiyonu olarak üreten disiplindir. Şartname uygulamayı yeniden üretecek kadar kesinlik taşıdığında, spec doğruluğun kaynağı olur — insanların sürümlediği, inceleyip tartıştığı şey — kod ise bunun altında türetilmiş, yerine konulabilir bir katmana yerleşir.
- Şartname kalıcı eser haline gelir; kod onun yeniden üretilebilir bir projeksiyonu olur.
- İnceleme yukarı kayar; uygulama farklarından niyet farklarına döner.
- Yeniden üretimin deterministikliği, tek bir çıktının zerafetinden daha önemli hale gelir.
- Niyet, çalışan sistemden saptığında şartnameler kendi türde borç biriktirir.
- Şartnamenin sürümlenmesi, bir sistem içindeki “bir değişiklik” kavramını bile değiştirir.
- Sistemler büyüdükçe, şartnameler arasındaki dikişler koddan önce zorlanır.
Neden şartname, kod değil, doğruluğun kaynağı olur
Çalıştırılabilir bir şartname, bir jeneratörün insan müdahalesine gerek duymadan bir çalışır uygulama üretebileceği kadar kesin davranış tanımına işaret eder. Bu getirdiği değişim sessiz ama yapısaldır. On yıllar boyunca kod hayatta kalan eser oldu; yorumlar, tasarım dokümanları ve ticket'lar etrafında eskidi ve çalışan program bir sistemin ne yaptığının tek doğru kaydı olarak kaldı. Spec-öncelikli yaklaşım bu ilişkiyi tersine çevirir.
Niyet, makinenin çalıştırabileceği bir şey olarak yakalandığında şartname artık sadece dokümantasyon olmaktan çıkar ve bir varlık haline gelir. Kod ondan üretilir ve herhangi bir anda var olan uygulama birçok geçerli projeksiyondan biridir. Yeniden üretimler arasında kalan şey şartnamedir. Değişimin özü budur: depozitodaki en kalıcı şey artık en ayrıntılı şey değildir.
Bu sahipliği yeniden düzenleme eğilimi oluşturur. Bir kişi incelemede savunduğu şey olarak davranışı tanımlayan eseri savunur, onu gerçekleştiren satırları değil. Bu disiplini içselleştiren bir ekip, üretilmiş kodu değerli bir nesne olarak görmeyi bırakır ve onu hava durumu gibi görmeye başlar — mevcut, sonuç veren ve değişmesi beklenen. Bir fonksiyonu elle parlatma içgüdüsü zayıflar çünkü parlama bir sonraki yeniden üretimde silinme olasılığı taşır.
İnceleme niyete taşındığında ne değişir
Şartname doğruluğun kaynağı olduğunda, incelemenin çekim merkezi onunla birlikte hareket eder. İnceleyenler uygulama diff'lerini satır satır okumayı bırakır ve şartnamedeki değişiklikleri — davranışa eklemeler, sıkılaştırılmış kısıtlar, kaldırılmış varsayımlar — okumaya başlar. Uygulama diff'i kontrol amaçlı bir çıktı haline gelir; artık incelemenin nesnesi değildir.
Bu göründüğünden daha zordur. Bir şartname diff'i genellikle küçük görünürken altındaki yeniden üretilmiş kod önemli ölçüde değişir. Bir davranış hükmüne eklenen tek bir cümle yüzlerce üretilmiş satırı dalgalandırabilir. İnceleyenler her projeksiyon satırını okumadan bir niyet değişikliğinin patlama alanını (blast radius) değerlendirmeyi öğrenir; bu, kod okuma becerisinden farklı bir yetenektir ve zamanla gelişir.
Ortaya çıkan bir takas izlenebilirliktir. Üretilmiş kodda bir hata belirdiğinde artık soru "bu satırı kim yazdı?" değil "hangi şartname hükmü bunu üretti?" olur. Spec-öncelikli uygulayan ekipler hataları niyete geri izleme alışkanlığı geliştirir, sonra şartnamenin mi yanlış olduğunu yoksa jeneratörün doğru bir şartnameyi mi yanlış okuduğunu karar verir. Bu ikinci durum kendi başına bir hata kategorisidir — bir sadakat (fidelity) hatası — ve elle yazılmış kodda bunun bir karşılığı yoktur.
Yeniden üretim deterministikliğinin şartnameye güveni nasıl şekillendirdiği
Bir şartnamenin doğruluğun kaynağı olabilmesi için yeniden üretimin güvenilir olması gerekir. Aynı şartname her seferinde maddi olarak farklı uygulamalar üretiyorsa, şartname gerçekten doğruluğun kaynağı değildir — jeneratörün ruh hali öyledir. Bu yüzden disiplin deterministikliğe ağır bir önem verir: sabit çıktılar, sabitlenmiş üretim davranışı ve projeksiyonu niyete bağlayan testler.
Burada bir spektrum vardır. Hevesli (eager) yeniden üretim, anlamlı her şartname değişikliğinde uygulamayı yeniden kurar ve kodu tamamen geçici sayar. Tembel (lazy) yeniden üretim, üretilmiş bir taban çizgiyi korur ve yalnızca bir değişikliğin dokunduğu parçaları yeniden projekte eder. Her iki yaklaşımın da maliyeti vardır ve seçim genellikle ekibin tercihlerinden çok sistemin büyüklüğüne bağlıdır.
| Özellik | Hevesli yeniden üretim | Tembel yeniden üretim |
|---|---|---|
| Kod kalıcılığı | Tamamen geçici; tümüyle yeniden inşa edilir | Değişiklikler arasında kısmen korunur |
| Sapma riski | Düşük; çıktı her zaman şartnameyi takip eder | Daha yüksek; eski bölgeler kalabilir |
| Değişiklik başına maliyet | Yüksek hesaplama, düşük muhakeme | Düşük hesaplama, daha yüksek muhakeme |
| Arıza modu | Tüm sistem sürprizleri | Yerel tutarsızlıklar |
Her uç doğru değildir. Küçük sistemler hevesli yeniden üretimi ucuza tolere eder ve çıktının her zaman şartnameyi takip edeceği garantisinden fayda sağlar. Büyük sistemler her şeyi yeniden projekte etmeye gücü yetmeyebilir ve tembel stratejilere yönelir; bu da spec-öncelikli yaklaşımın kaldırmayı amaçladığı bazı ayrışmaları yeniden getirir.
Şartnamelerin kendi türde borç biriktirdiği yerler
Şartname borcu, yazılı niyet ile çalışan sistemin gerçekte ihtiyaç duyduğu davranış arasındaki fark açıldığında oluşur. Bu, spec-öncelikli yaklaşımın miras koda karşılık gelen eşdeğeridir ve tanıdık yollarla birikir. Hükümler birbirine ters düşer. Kenar durumlar modele entegre edilmek yerine istisna olarak eklenir. Şartname, tek bir kişinin bütün şeklini elinde tutamayacağı şekilde büyür.
Başarısızlık, dolanık koda göre daha incidir çünkü bir şartname temiz okunabilirken tutarsız bir niyeti kodlayabilir. Sessiz çelişkilerle dolu iyi formatlanmış bir şartname yine de bir şey üretir — sadece yanlış şeyi kendinden emin bir şekilde üretir. İnceleyenler kasıtlı görünen prozaya kandırılabilir ve jeneratör bir çelişkiye derse giren bir derleyici gibi itiraz etmez.
- Şartname sürüklenmesi
- Yazılı niyet ile sistemin pratikte gerçekten ihtiyaç duyduğu davranış arasındaki yavaş ayrışma.
- Projeksiyon sadakati
- Üretilmiş kodun şartnamede belirtileni eklemeden veya çıkarmadan gerçeğe ne kadar sadık bir şekilde gerçekleştirdiği.
- Niyet yüzeyi
- Bir değişikliğin sistem davranışını kasıtlı olarak değiştirmek için dokunması gereken hüküm ve kısıtlar kümesi.
Bu borcu yönetmek, takımların bir zamanlar kodu refactor ettikleri şekilde şartnameleri yeniden düzenlemelerini gerektirir: hükümlerin birleştirilmesi, ölü kısıtların kaldırılması ve modelin adlandırılarak büyüdükçe şeklini okunur tutma. Bu iş göz alıcı değildir ve ertelenmesi kolaydır; ertelenmesi ise temiz bir şartnamenin opak hale gelmesinin tam yoludur.
Kasıtlı bir spec-öncelikli değişiklik nasıl ilerleme eğilimindedir
Olgun bir spec-öncelikli iş akışında işlemlerin sırası genellikle alan ne olursa olsun tutarlı bir şekli izler. Bu sıra şartnameyi otoriter kılar ve üretilmiş kodun sessizce şartname ile rekabet eden ikinci bir doğruluk kaynağı haline gelmesini engeller. Önemli olan adımların kesinliği değil, her adımın işaret ettiği yön: değişiklikler niyetten girer ve uygulamaya doğru akıp gider, asla tersine değil.
- Davranış değişikliğini kod düzenlemesi yerine şartnameye bir ek olarak ifade edin.
- Yeni niyeti, bir jeneratörün ve test paketinin okuyabileceği kısıtlar ve örnekler olarak kodlayın.
- İlgili projeksiyonu yeniden üretin ve bağlayıcı testlerin sadakati onaylamasına izin verin.
- Satır farkına değil, ifadeye karşılık gelen davranış farkına göre karşılaştırma yapın.
- Her sürprizi şartnameye geri katın ki bir sonraki yeniden üretim dersini taşısın.
Disiplin beşinci adımdadır. Bir yeniden üretim sizi şaşırttığında, eğilim çıktıyı elle yamalamaktır. Şartnameye geri dönmeyen her elle yama, spec-öncelikli yaklaşımın kapamaya çalıştığı boşluğu yeniden açar ve şartname sessizce gerçeği olmaktan çıkar. Yama bugün işe yarar ama yarın yalan söyler; taze bir yeniden üretim tetiklendiğinde. Disiplini koruyan ekipler şaşırtıcı bir projeksiyonu niyetin eksik tanımlandığına dair bir sinyal olarak görür ve çıktıyı aşağıdan ezmek yerine ne demek istediklerini daha kesin ifade etmek için çaba harcarlar.
Modelin sistemler büyüdükçe zorlandığı yerler
Küçük ölçeklerde tek bir şartname tüm sistemi rahatça tutar ve yeniden üretim ucuzdur. Zorluk dikişlerde ortaya çıkar. Büyük sistemler tek bir şartname değil, birbirine bileşen pek çok şartnamedir ve şartnameler arasındaki sözleşmeler kırılgan yüzeyi oluşturur — sıradan mimarilerin başarısız olduğu yerin tam olarak bir kademe üstü, artık niyet dilinde hata veren yer.
Her bir şartnamenin net bir arayüze sahip olduğu ve bağımsız olarak yeniden projekte edildiği sınırlı bileşim (bounded composition) ölçeklenmeye eğilimlidir. Birbirlerinin varsayımlarına giren sınırsız bileşim (unbounded composition) ise her biri geçerli olan fakat topluca tutarsız regenerasyonlar üretir. Bağlılık koda değil niyete kayar ve niyet bağımlılığı tek bir şartnamede yanlış bir şey olmadığı için görmek daha zordur.
Diğer zorluk insansaldır. Tek bir okuyucunun tutamayacağı kadar büyüyen bir şartname kendi başına opak miras olur ve şartnamenin okunur, sahiplenilmiş eser olacağı taahhüdü aşınır. Şartnameleri akıl yürütülebilecek kadar küçük tutmak birinci dereceden bir endişe haline gelir; stil tercihi değil. Bunu görmezden gelen ekipler arkalarında bıraktıkları sisle aynı yeniden inşa sürecine dönerler. Eskiden kodu yöneten ayrıştırma disiplini şimdi niyet için geçerli olur ve aynı uyarıyla gelir: yanlış çizilmiş bir sınır, hiç sınır çizmemekten daha pahalıdır.
Şartname ürünleşirken alan nereye gidiyor
Eğilim, şartnamenin gönderilen ürün olarak ele alınmasına ve kodun derlenmiş ikili gibi bir çıktı haline indirilmesine doğru işaret ediyor. Bu yerleşince, zor problemler yukarı kayar. Niyetin sürümlenmesi, davranış farklarının çıkarılması ve kısıtların incelenmesi günlük zanaat haline gelirken, üretilmiş uygulamaları okumak sadakat bozulduğunda yapılan arıza teşhis eylemine dönüşür. Araçlar çekim merkezini izleyecek ve bir ekibin gurur duyacağı eserler, altındaki zekice koda değil temiz, okunur şartnameler olacaktır.
Zorlaşan konu anlamın yönetişimidir. Şartname ürün olduğunda hangi hükmü kimin değiştirmeye yetkili olduğu ve bir niyet değişikliğinin yeniden projeksiyon yapılmadan önce nasıl doğrulandığı merkezi disiplin halini alır. Bir şartname üzerinde yetki, eskiden bir sürüm dalı üzerinde olan yetkinin ağırlığını taşır; çünkü tek bir düzenleme şartnamenin projekte ettiği her yerde davranışı yeniden şekillendirebilir.
Dayanabilecek sistemler, şartnamelerine eskiden üretim koduna ayrılan titizlikle davrananlar olacaktır — dikkatle sürümlenen, ciddiyetle incelenen ve dürüst kalacak kadar küçük tutulan. Diğer yöne olan çekim gerçektir; çalışan yazılım üreten bir şartname onun sağlam olması gerektiği varsayımını davet eder. Bu varsayım gelecek on yılda kazanılacak derslerin düştüğü yer olacak ve bunu en erken reddeden ekipler bu dersleri öğrenmek için en az harcayanlar olacak.
S.S.S.
