Edsger Dijkstra'nın yapısal programlama fikirleri, disiplinli ve basit kodun ekipler, özellikler ve sistemler büyüdükçe neden doğru ve sürdürülebilir kaldığını açıklar.

if/else) ve yineleme (döngüler)—kurma pratiğidir; karışık atlamalara güvenmek yerine. Amaç basit: programın içindeki yolu anlaşılır kılmak, böylece onu güvenle açıklayabilir, sürdürebilir ve değiştirebilirsiniz.\n\n## Doğruluk: Kullanıcılarınızın Güvendiği Gizli Özellik\n\nİnsanlar yazılım kalitesini genellikle “hızlı”, “güzel” veya “özellik dolu” olarak tanımlar. Kullanıcılar doğruluğu farklı deneyimler: uygulamanın onları şaşırtmayacağına dair sessiz bir güven olarak. Doğruluk olduğunda kimse fark etmez. Eksik olduğunda, diğer her şey önemsizleşir.\n\n### “Şimdi çalışıyor” vs “çalışmaya devam ediyor”\n\n“Şimdi çalışıyor” genellikle birkaç yol denediniz ve beklenen sonucu aldınız demektir. “Çalışmaya devam ediyor” ise refaktörler, yeni entegrasyonlar, artan trafik ve yeni ekip üyeleri kodla oynadıktan sonra bile amaçlandığı gibi davranması demektir.\n\nBir özellik “şimdi çalışabilir” ama hâlâ kırılgan olabilir:\n\n- Girdinin her zaman temiz olduğu varsayımına dayanabilir.\n- Bir ağ çağrısının her zaman hızlı döneceğini varsayabilir.\n- Sadece mutlu yolu kapsayan testleri geçiyor olabilir.\n\nDoğruluk, bu gizli varsayımları kaldırmak veya onları açıkça ifade etmektir.\n\n### Küçük hataların büyük sistemlerde nasıl çoğaldığı\n\nKüçük bir hata yazılım büyüdükçe nadiren küçük kalır. Bir yanlış durum, bir off-by-one sınırı veya belirsiz hata işleme kuralı yeni modüllere kopyalanır, başka servislerin etrafında sarılır, önbelleğe alınır veya “dolaşılan” bir sorun haline gelir. Zamanla ekipler “neyin doğru olduğunu” sormayı bırakır ve “genelde ne olur” sorusuna dayanır. O zaman olay müdahalesi arkeolojiye döner.\n\nÇarpan bağımlılıktır: küçük bir yanlış davranış birçok aşağı akış yanlış davranışına dönüşür ve her biri kendi kısmi düzeltmesini getirir.\n\n### Açıklık bir doğruluk aracıdır (sadece stil seçimi değil)\n\nAçık kod doğruluğu geliştirir çünkü iletişimi geliştirir:\n\n- Kod incelemeleri niyet açık olduğunda gerçek sorunları yakalar.\n- Onboarding kurallar okunabilir olduğunda daha hızlı olur; kabile bilgisinden ziyade belgelendirme vardır.\n- Olaylar kontrol akışı ve hata modları kolay takip edilebildiğinde daha çabuk çözülür.\n\n### Ürün ekipleri için pratik bir doğruluk tanımı\n\nDoğruluk demek: desteklediğimizi iddia ettiğimiz girdiler ve durumlar için sistem, vaat ettiğimiz sonuçları tutarlı şekilde üretir—ve yapamadığında öngörülebilir, açıklanabilir şekillerde başarısız olur.\n\n## Sadelik Bir Strateji, Stil Tercihi Değil\n\nSadelik kodu “sevimli”, minimal veya zekice yapmakla ilgili değildir. Sadelik, davranışı korkmadan tahmin etmeyi, açıklamayı ve değiştirmeyi kolaylaştırmaktır. Dijkstra sadeliği, özellikle kod tabanı ve ekip büyüdüğünde programlar hakkında akıl yürütme yetimizi geliştirdiği için değer verdi.\n\n### Sadelik nedir (ve ne değildir)\n\nBasit kod aynı anda az sayıda fikri işler: net veri akışı, net kontrol akışı ve net sorumluluklar. Okuyucunun kafasında birçok alternatif yolu simüle etmesini zorunlu kılmaz.\n\nSadelik değildir:\n\n- Her ne pahasına olursa olsun daha az satır\n- “Akıllı” numaralar, yoğun tek satırlar veya ağır soyutlamalar\n- Esnek görünmek için yapıyı atlamak\n\n### Kazara karmaşıklık: istemeden ekledikleriniz\n\nBirçok sistem zor değişir hale gelmez çünkü domain doğası gereği karmaşıktır; bunun yerine kazara karmaşıklık ekleriz: beklenmedik şekilde etkileşen bayraklar, asla kaldırılmayan özel yamalar ve önceki kararların etrafında dönen katmanlar.\n\nHer ekstra istisna anlama vergi koyar. Maliyet, birisi bir hatayı düzeltmeye çalıştığında bir değişikliğin birkaç diğer alanı ince şekilde bozduğunu keşfettiğinde ortaya çıkar.\n\n### Basit tasarımlar kahramanlıklara ihtiyaç duymaz\n\nBir tasarım basitse ilerleme sürekli çalışmadan gelir: gözden geçirilebilir değişiklikler, daha küçük diff'ler ve daha az acil düzeltme. Ekiplerin her zaman her tarihi kenar durumu hatırlayan “kahraman” geliştiricilere ihtiyacı yoktur. Bunun yerine sistem normal insan dikkat sürelerini destekler.\n\n### Kural: daha az özel durum, daha az sürpriz\n\nPratik bir test: sürekli “istisna ekliyorsanız” (“ama…”, “istisna olduğunda…”, “sadece şu müşteri için…”) muhtemelen kazara karmaşıklık biriktiriyorsunuz. Davranışta dallanmayı azaltan çözümleri tercih edin—bir tutarlı kural, ilk düşündüğünüzden biraz daha genel olsa bile beş özel durumdan iyidir.\n\n## Yapısal Programlama: Güvenebileceğiniz Net Kontrol Akışı\n\nYapısal programlama, yürütme yolunun takip edilmesini kolaylaştıracak şekilde kod yazmaktır. Düz Türkçeyle, çoğu program üç yapı taşı kullanılarak inşa edilebilir—sıra, seçim ve tekrar—karışık atlamalara güvenmeden.\n\n### Üç yapı taşı (insan dilinde)\n\n- Sıra: adım A'yı yap, sonra B'yi yap, sonra C'yi yap.\n- Seçim: bir koşula göre yol seç (ör. if/else, switch).\n- Tekrar: bir koşul doğru olduğu sürece bir adım kümesini tekrarla (ör. for, while).\n\nBu yapılar kullanıldığında genellikle dosya boyunca yukarıdan aşağıyı okuyarak programın ne yaptığını açıklayabilirsiniz; dosyada “teleport” etmeye gerek kalmaz.\n\n### Öncesi: makarna gibi yürütme yolları\n\nYapısal programlama norm hâline gelmeden önce birçok kod tabanı keyfi atlamalara (klasik goto tarzı) dayanıyordu. Sorun atlamaların her zaman kötü olması değil; kısıtlanmamış atlamaların yürütme yollarını tahmin edilemez hâle getirmesidir. Sonunda “Buraya nasıl geldik?” ve “Bu değişken hangi durumda?” gibi soruları sorarsınız—kod açıkça cevap vermez.\n\n### Neden açıklık gerçek ekipler için önemli\n\nNet kontrol akışı insanların doğru zihinsel modeli kurmasını sağlar. Hata ayıklarken, bir pull requesti incelerken veya zaman baskısı altındayken davranışı değiştirirken bu modele güvenirsiniz.\n\nYapı tutarlı olduğunda, değişiklik daha güvenli olur: bir dalı değiştirirken diğerini istemeden etkilemezsiniz veya bir döngüyü refaktör ederken gizli çıkış yollarını kaçırmazsınız. Okunabilirlik sadece estetik değil—çalışan davranışı güvenle değiştirebilmenin temelidir.\n\n## Akıl Yürütme Araçları: İnvariantlar, Önkoşullar ve Sonkoşullar\n\nDijkstra basit bir fikir ileri sürdü: Kodunuzun neden doğru olduğunu açıklayabiliyorsanız, onu daha az korkuyla değiştirebilirsiniz. Üç küçük akıl yürütme aracı bunu pratik hale getirir—ekibinizi matematikçi yapmadan.\n\n### İnvariantlar: “doğru kalan gerçekler”\n\nBir invariant, özellikle bir döngü içinde, bir kod parçası çalışırken doğru kalan bir gerçektir.\n\nÖrnek: bir sepetindeki fiyatları topluyorsunuz. Faydalı bir invariant: “total şimdiye kadar işlenen tüm öğelerin toplamına eşittir.” Bu her adımda doğru kalırsa, döngü bittiğinde sonuç güvenilirdir.\n\nInvariantlar güçlüdür çünkü dikkatini ne asla bozulmamalı üzerine yoğunlaştırır, sadece bir sonraki adımda ne olması gerektiğine değil.\n\n### Önkoşullar ve sonkoşullar: günlük sözleşmeler\n\nBir önkoşul bir fonksiyon çalışmadan önce doğru olması gereken şeydir. Bir sonkoşul fonksiyon bittikten sonra garanti ettiği şeydir.\n\nGünlük örnekler:\n\n- Önkoşul: “Hesabınızda yeterli bakiye varsa para çekebilirsiniz.”\n- Sonkoşul: “Çekimden sonra bakiye tam olarak o miktar azalır ve asla negatif olmaz.”\n\nKodda bir önkoşul “girdi listesi sıralıdır” olabilir ve sonkoşul “çıktı listesi sıralıdır ve aynı elemanları içerir, artı eklenen öğe” olabilir.\n\n### Bunları yazmanın kodlama ve incelemeleri nasıl değiştirdiği\n\nBunları (gündelik şekilde bile) yazdığınızda, tasarım keskinleşir: bir fonksiyonun ne beklediğine ve ne vaat ettiğine karar verirsiniz ve doğal olarak onu daha küçük ve odaklı yaparsınız.\n\nİncelemelerde tartışmayı stil üzerinden (“Ben bunu farklı yazardım”) doğruluk üzerinden (“Bu invariant korunuyor mu?” “Önkoşulu uyguluyor muyuz yoksa belgeliyor muyuz?”) kaydırır.\n\n### Hafif uygulama: hataların sık olduğu yerlerde yorum yazın\n\nFormal ispatlara gerek yok. En hatalı döngüyü veya en karmaşık durum güncellemesini seçin ve üzerine bir satırlık invariant yorumu ekleyin. Birisi daha sonra kodu düzenlediğinde, bu yorum bir korkuluk gibi davranır: eğer bir değişiklik bu gerçeği bozuluyorsa, kod artık güvenli değildir.\n\n## Test Etme vs Akıl Yürütme: Her Birinin Neyi Garanti Ettiği\n\nTestler ve akıl yürütme aynı hedefe—ise yarar şekilde davranan yazılıma—uygunsa da farklı çalışırlar. Testler örnekler deneyerek sorunları keşfeder. Akıl yürütme mantığı açık hale getirerek bütün kategori hatalarını önler.\n\n### Testlerin çok iyi olduğu noktalar\n\nTestler pratik bir emniyet ağıdır. Regresyonları yakalar, gerçek dünya senaryolarını doğrular ve beklenen davranışı tüm ekipçe çalıştırılabilir şekilde belgelendirir.\n\nAma testler yalnızca hataların varlığını gösterebilir, yokluğunu değil. Hiçbir test paketi her girdiyi, her zamanlama varyasyonunu veya özellikler arası tüm etkileşimleri kapsayamaz. Birçok “makinemde çalışıyor” hatası test edilmemiş kombinasyonlardan gelir: nadir bir girdi, belirli bir işlem sırası veya birkaç adım sonra ortaya çıkan ince bir durum.\n\n### Akıl yürütmenin neleri garanti edebileceği (ve neleri edemeyeceği)\n\nAkıl yürütme kodun özelliklerini ispatlamakla ilgilidir: “bu döngü her zaman sonlanır”, “bu değişken asla negatif olmaz”, “bu fonksiyon asla geçersiz bir nesne döndürmez.” İyi yapıldığında, sınırlarla ve kenar durumlarla ilgili bütün sınıfları dışlar.\n\nSınırlama çaba ve kapsamdır. Tüm ürün için tam formal ispatlar nadiren ekonomiktir. Akıl yürütme, çekirdek algoritmalar, güvenlik kritik akışlar, para/billing mantığı ve eşzamanlılık gibi seçici olarak uygulandığında en iyi sonuç verir.\n\n### Ölçeklenen dengeli yaklaşım\n\nGeniş ölçekte testleri kullanın ve başarının maliyetli olduğu yerlerde daha derin akıl yürütme uygulayın.\n\nİki yaklaşımı birbirine bağlayan pratik bir yol, niyeti çalıştırılabilir hâle getirmektir:Bu teknikler testlerin yerini almaz—onları sıkılaştırır. Belirsiz beklentileri kontrol edilebilir kurallara çevirir, böylece hatalar yazmayı zorlaştırır ve teşhis etmeyi kolaylaştırır.\n\n## Disiplin: Takımlar “Zekice” Borçtan Nasıl Kaçar\n\n“Zekice” kod anlık olarak kazanım gibi gelir: daha az satır, hoş bir numara, sizi akıllı hissettiren bir tek satır. Sorun şu ki, zekice çözümler zaman veya kişiler arasında ölçeklenmez. Altı ay sonra yazar numarayı unutur. Yeni bir ekip üyesi onu literal okur, gizli varsayımı kaçırır ve davranışı bozan bir değişiklik yapar. Bu “zekice borç”: kısa vadeli hız karşılığında uzun vadeli kafa karışıklığı.\n\n### Disiplin bir ekip hızlandırıcısıdır\n\nDijkstra’nın noktası “sıkıcı kod yazın” demek değildi—disiplinli kısıtların programları akıl yürütmesi daha kolay hale getirdiğiydi. Bir ekipte kısıtlar karar yorgunluğunu da azaltır. Eğer herkes varsayılanları zaten biliyorsa (isimlendirme, fonksiyon yapısı, “tamamlanmış” olma kriteri), her pull requestte temel konuları yeniden tartışmayı bırakırsınız. O zaman o zaman ürüne döner.\n\nDisiplin şu rutin pratiklerde görünür:\n\n- açıklığı yeniliğe tercih eder (“Biri bunu güvenle değiştirebilir mi?”).\n- (format, isimlendirme, hata yönetimi) kod tabanının tek bir ses gibi okunmasını sağlar.\n- bakım olarak görülür, kurtarma görevleri olarak değil—küçük temizlikler sürekli yapılır.\n\n### Koda disiplinin yansıması nasıl görünür\n\nBirkaç somut alışkanlık zekice borcun birikmesini önler:\n\n- tek bir işi yapar, belli girdiler ve çıktılar vardır.\n- niyeti açıklar ( yerine).\n- global değişkenleri ve şaşırtıcı yan etkileri azaltın; bağımlılıkları açıkça iletin.\n- ince sıralama, sihirli değerler veya “triki bilince çalışır” mantığından kaçının.\n\nDisiplin mükemmellik değil—sonraki değişikliği öngörülebilir kılmaktır.\n\n## Modülerlik ve Sınırlar: Değişikliği Yerel Tutmak\n\nModülerlik sadece “kodu dosyalara bölmek” değildir. Kararları net sınırların arkasına izole etmektir, böylece geri kalan sistem iç detayları bilmek zorunda kalmaz. Bir modül karmaşık parçaları—veri yapıları, kenar durumlar, performans numaraları—örtülerken küçük, stabil bir yüzeye sahip olur.\n\n### Modüller patlama yarıçapını nasıl küçültür\n\nBir değişiklik isteği geldiğinde ideal sonuç şudur: bir modül değişir ve diğer her şey dokunulmadan kalır. Bu, “değişikliği yerel tutmak”ın pratik anlamıdır. Sınırlar yanlış bağımlılığı (güncellemenin gizlice üç diğer şeyi bozması) önler.\n\nİyi bir sınır aynı zamanda akıl yürütmeyi kolaylaştırır. Bir modülün neyi garanti ettiğini ifade edebiliyorsanız, her seferinde tüm uygulamayı yeniden okumadan daha büyük program hakkında akıl yürütebilirsiniz.\n\n### Arayüzler birer vaat gibidir (ve paralel çalışmayı nasıl sağlarlar)\n\nArayüz bir vaattir: “Bu girdiler verildiğinde, bu çıktıları üreteceğim ve bu kuralları koruyacağım.” Bu vaat açık olduğunda ekipler paralel çalışabilir:
Çünkü kod tabanı büyüdükçe asıl darboğaz anlama olur—yazma değil. Dijkstra’nın tahmin edilebilir kontrol akışı, açık sözleşmeler ve doğruluk vurgusu, “küçük bir değişiklik”in başka yerlerde sürpriz davranışlara yol açma riskini azaltır; bu da zaman içinde ekipleri yavaşlatan şeydir.
Bu yazıda “ölçek” performanstan ziyade karmaşıklığın çarpılması anlamına geliyor:
Bu etkenler, akıl yürütme ve tahmin edilebilirliği zekâdan daha değerli hale getirir.
Pratik olarak yapısal programlama küçük ve net kontrol yapılarından yanadır:
if/else, switch)for, while)Ama amaç sertlik değil—yürütme yollarını takip etmeyi kolaylaştırmak, böylece davranışı açıklayabilir, değişiklikleri gözden geçirebilir ve hata ayıklayabilirsiniz.
Sorun kontrol akışının kısıtlanmamış olmasıdır: bu, tahmin edilmesi zor yollar ve belirsiz durumlar yaratır. Kontrol akışı dolaşıklaştığında, geliştiriciler “Buraya nasıl geldik?” veya “Bu değişken hangi durumda?” gibi temel soruların cevabını aramakla zaman kaybeder.
Modern eşdeğerleri arasında derinçe iç içe dallanma, dağınık erken çıkışlar ve örtük durum değişiklikleri bulunur; bunlar davranışın izlenmesini zorlaştırır.
Kullanıcıların güvendiği sessiz özellik olarak: sistem iddia ettiğimiz girdiler ve durumlar için tutarlı çıktılar üretir ve yapamadığında öngörülebilir, açıklanabilir şekilde başarısız olur. “Birkaç örnekte çalışıyor” ile “refaktörler, entegrasyonlar ve kenar durumlar sonrası da çalışmaya devam ediyor” arasındaki fark budur.
Çünkü bağımlılıklar hataları büyütür. Küçük bir yanlış durum veya sınır hatası yeni modüllere kopyalanır, önbelleğe alınır, yeniden denenir veya başka yollarla çevrelenir. Zamanla ekipler “ne doğru?” yerine “genelde ne oluyor?” sorusuna dayanır; bu da olayları zorlaştırır ve değişiklikleri riskli hale getirir.
Sadelik burada aynı anda az sayıda fikir tutmak demektir: net sorumluluklar, açık veri akışı ve minimal özel durumlar. Satır sayısını azaltmak veya zekice tek satırlar yapmak değildir.
İyi bir sınama: gereksinimler değiştiğinde davranış hâlâ öngörülebilir mi? Eğer her yeni vaka “istisna…” kuralları ekliyorsa, kazara karmaşıklık birikiyorsunuz demektir.
Invariant, bir döngü veya durum geçişi boyunca doğru kalması gereken bir gerçektir. Hafif bir uygulama şekli:
total işlenen öğelerin toplamına eşittir”)assertion ekleyinBu, sonraki değişiklikleri daha güvenli hâle getirir çünkü bir sonraki kişi neyin bozulmaması gerektiğini bilir.
Testler örnekler deneyerek hataları bulur; akıl yürütme ise mantığı açık ve kontrol edilebilir hale getirerek belirli hata sınıflarını önler. Testler her girdiyi, zamanlamayı veya özellikler arası etkileşimi kapsayamayacağı için yokluğu kanıtlamaz. Akıl yürütme, para, güvenlik veya eşzamanlılık gibi yüksek maliyetli alanlarda özellikle değerlidir.
Pratik karışım: geniş kapsama sahip testler + kritik noktalarda doğrulayıcı assert'lar + açık önkoşul/sonkoşullar.
Akıl yürütme odaklı düşünceyi hızlandırmak için AI'ı kullanın, onu akıl yürütmenin yerine koymayın:
Üretilen kod, açıklanabilir olması gereken koddur.
Bu, gözden geçirmeler, refaktörler veya merge öncesi kullanabileceğiniz hafif bir kontrol listesi:
Hızlı kendi kontrolünüz (yeni kod ve refaktörler için)
calculate_total()do_it()preconditions) olduğu, anlamlı kontrollerin ve basit kontrol akışının bulunduğu kod baskı altında daha kolay izlenir.\n\nAynı zamanda disiplinli değişiklikleri geri almak daha kolaydır. Küçük, yerel düzenlemeler ve net sınırlar rollback'in yeni hatalar tetiklemesi ihtimalini azaltır. Sonuç mükemmellik değil—daha az sürpriz, daha hızlı toparlanma ve yıllar ile katkıda bulunanlar biriktikçe sürdürülebilir kalan bir sistemdir.\n\n## Dijkstra’yı Köktenci Olmadan Uygulamak\n\nDijkstra’nın noktası “eski usul kod yaz” demek değildi; “açıklayabileceğiniz kod yaz” demekti. Bu zihniyeti benimseyebilir, her özelliği formal ispatlara dönüştürmek zorunda kalmazsınız.\n\n### İlkeli davranışı günlük alışkanlıklara dönüştürün\n\nAkıl yürütmeyi ucuz hâle getiren seçimlerle başlayın:\n\n- Basit kontrol akışını tercih edin: tek bir büyük çok-dallı rutinin yerine birkaç küçük fonksiyon.\n- Yan etkileri azaltın: mutasyonu gerektiği yere yakın tutun, fonksiyonların gizlice global durumu değiştirmesine izin vermeyin.\n- Net sözleşmeler kullanın: türlerde, isimlerde ve yorumlarda girdileri, çıktıları ve hata davranışını açıkça ifade edin.\n\nİyi bir kestirme: bir fonksiyonun ne garanti ettiğini bir cümlede özetleyemiyorsanız, muhtemelen çok şey yapıyordur.\n\n### Küçük “yapı yükseltmeleri” (yeniden yazım yok)\n\nBüyük bir refaktör sprintsine gerek yok. Dikişlerde yapıyı ekleyin:\n\n- Karmaşık bir döngüyü adlandırılmış bir fonksiyona çıkarın ve her yinelemede neyin doğru kaldığını tanımlayın.\n- “Sihirli” koşulları iyi isimlendirilmiş predikatlarla değiştirin (ör. isEligibleForRefund).\n- Karmaşık bir durum geçişini tek bir fonksiyonun arkasına kapsülleyin, böylece geri kalan kod tabanı onu yanlış kullanamaz.\n\nBu yükseltmeler artımlıdır: sonraki değişiklik için bilişsel yükü düşürür.\n\n### Kod inceleme tetikleyicileri sizi dürüst tutar\n\nBir değişikliği incelerken veya yazarken sorun:
\n- “Burada ne doğru olmalı?” (invariantlar, varsayımlar, gereken durum)\n- “Güvenle ne değişebilir?” (hangi parçalar çağıranları bozmadan değişebilir)
\nİnceleyenler hızlıca cevap veremiyorsa, kod gizli bağımlılık sinyali veriyordur.\n\n### Adımları değil, akıl yürütmeyi belgeleyin\n\nKodun ne yaptığını tekrar eden yorumlar eskir. Bunun yerine neden kodun doğru olduğunu yazın: ana varsayımlar, korunan kenar durumlar ve hangi değişikliklerin bu varsayımları bozabileceği. “Invariant: total her zaman işlenen öğelerin toplamıdır” gibi kısa bir not, bir paragraf anlatımdan daha değerli olabilir.\n\nBu alışkanlıkları yakalamak için hafif bir yer istiyorsanız, bunları paylaşılan bir kontrol listesine koyun (bkz: /blog/practical-checklist-for-disciplined-code).\n\n## AI Destekli Geliştirme Nerede Uyar (Disiplini Kaybetmeden)\n\nModern ekipler teslimatı hızlandırmak için giderek AI kullanıyor. Risk tanıdık: bugün elde edilen hız, üretilen kod açıklanamazsa yarın kafa karışıklığına dönüşebilir.\n\nDijkstra dostu bir AI kullanımı, onu yapısal düşüncenin hızlandırıcısı olarak görmektir, yerine koymak değil. Örneğin Koder.ai’de çalışırken—sohbetle web, backend ve mobil uygulamalar oluşturduğunuz bir platform—“önce akıl yürütme” alışkanlıklarını korumak için istemlerinizi ve inceleme adımlarınızı açık tutun:\n\n- Açık sözleşmeler isteyin: “Bu endpoint için önkoşullar, sonkoşullar ve hata davranışını tanımla.”\n- Durumsal akışlarda invariantlar isteyin: “Bu checkout durum makinesinin her adımından sonra ne doğru olmalı?”\n- Uygulama detayları üretmeden önce modüllere, arayüzlere ve sorumluluklara zorlayan planlama modunu kullanın.\n- Değişiklikleri küçük ve geri alınabilir tutmak için anlık kayıtlar (snapshots) ve geri alma kullanın—yerel düzenlemeler ve güvenli geri alma disiplinini taklit eder.\n\nSonunda kaynağı dışa aktarsanız bile, aynı ilke geçerlidir: üretilen kod açıklanabilir olmalıdır.\n\n## Doğru, Basit, Disiplinli Kod İçin Pratik Bir Kontrol Listesi\n\nİncelemeler, refaktörler veya merge öncesi kullanabileceğiniz hafif bir “Dijkstra-dostu” kontrol listesi:
\n### Hızlı kendi kontrolünüz (yeni kod ve refaktörler)
\n- Kodu bir takım arkadaşına 60 saniyede açıklayabilir miyim? Açıklama “sadece bana güven” gerektiriyorsa, basitleştirin.\n- Kontrol akışı bariz mi? Doğrusal koda öncelik verin; döngüler ve koşulları küçük tutun; gizli çıkışlar ve derin dallanma kaçının.\n- Önkoşullar ve sonkoşullar nedir? Bunları yorum, docstring veya fonksiyon adıyla yazın. Söylenemiyorsa fonksiyon muhtemelen çok şey yapıyor.\n- Her fonksiyonun bir işi ve net sınırı var mı? Girdi girer, çıktı çıkar—global duruma asgari bağımlılık.\n- Bu döngüyü doğrulayan invariant nedir? “total işlenen öğelerin toplamına eşittir” gibi bir satırlık not ince hataları önler.\n- Gereğinden fazla “zekice” numara var mı? Kod rehber turu gerektiriyorsa, cleverness debt birikiyor.\n\n### Nitel ölçümler
\n- Açıklama kolaylığı: Modüle aşina olmayan biri ne yaptığını ve neden doğru olduğunu söyleyebiliyor mu?\n- Test kolaylığı: Kenar durumları doğal olarak test edilebilir mi yoksa karmaşık hazırlık mı gerekiyor?\n- Değişiklik riski: Gereksinimler değiştiğinde ne kırılır öngörebiliyor musunuz? Her değişiklik korkutucuysa, sınırlar sızdırıyor demektir.\n\n### Pratik bir sonraki adım
\nBir dağınık modül seçin ve önce kontrol akışını yeniden düzenleyin:\n\n1. Küçük fonksiyonlar çıkarın ve net isimler verin.\n2. Dolaşık dallanmaları daha basit, açık vakalara çevirin.\n3. Özel durumları kenara taşıyın (girdi doğrulama, erken dönüşler).\n\nSonra yeni sınırlar etrafında birkaç odaklanmış test ekleyin. Daha fazla desen isterseniz ilgili gönderilere göz atın: /blog.Nitel olarak ölçülecekler
Pratik bir sonraki adım: bir dağınık modülü seçin ve önce kontrol akışını yeniden düzenleyin:
Sonra yeni sınırlar etrafında odaklanmış birkaç test ekleyin. Eğer daha fazla desen isterseniz, ilgili gönderilere göz atın: /blog.