<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Gökhan Gürgeç on Medium]]></title>
        <description><![CDATA[Stories by Gökhan Gürgeç on Medium]]></description>
        <link>https://medium.com/@gokhan-gurgec?source=rss-b5f116717c9b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*D8LoeNhQsFRj6lB56xNBnw.jpeg</url>
            <title>Stories by Gökhan Gürgeç on Medium</title>
            <link>https://medium.com/@gokhan-gurgec?source=rss-b5f116717c9b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 23:17:56 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@gokhan-gurgec/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Laws of Software Engineering #16 Linus’s Law: Yeterince Göz Varsa Tüm Hatalar Önemsizdir]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-16-linuss-law-yeterince-g%C3%B6z-varsa-t%C3%BCm-hatalar-%C3%B6nemsizdir-1e6c7235aac2?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/1e6c7235aac2</guid>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[quality]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 16:01:02 GMT</pubDate>
            <atom:updated>2026-11-12T16:01:02.253Z</atom:updated>
            <content:encoded><![CDATA[<p>Kırık Camlar Teorisi ile küçük ihmallerin ve teknik borcun bir kod tabanını nasıl sinsi bir şekilde harabeye çevirebileceğini, Kalite (Quality) kategorisinin ilk yazısında inceledik. Serinin bu bölümünde yine aynı kategoride kalarak, bu sinsi çürümeye ve yazılım hatalarına karşı elimizdeki en güçlü doğal savunma mekanizmasını ele alıyoruz: <strong>Çoklu gözlerin denetimi.</strong></p><p>Artık genelde işlerimizi AI ajanlarıyla yapıyor olsak da AI ajanlarını da bir göz olarak görebiliriz ve bu kanun gene de anlamlı olabilir.</p><p>Kritik bir hata içeren karmaşık bir algoritma yazdığınızı düşünün. Kod kendi yerelinizde ve sınırlı test senaryolarınızda sorunsuz çalışıyor. Siz gözden kaçırıyorsunuz, hatta yanınızdaki iş arkadaşınız da hızlıca onay verip geçiyor. Ancak bu kod üretim ortamına (production) çıkıp binlerce farklı senaryoyla karşılaştığında veya geniş bir ekip tarafından incelendiğinde, daha önce aklınıza bile gelmeyen bir uç durum (edge case) bir başkasının dikkatini çekiyor ve büyük bir kriz büyümeden çözülüyor.</p><p>Açık kaynak dünyasının ve Linux işletim sisteminin kurucusu Linus Torvalds’ın çalışma felsefesinden ilham alan ve Eric S. Raymond tarafından 1999 tarihli <em>The Cathedral and the Bazaar</em> (Katedral ve Pazar) kitabında formüle edilen <strong>Linus’s Law (Linus Kanunu)</strong>, yazılım kalitesini artırmanın ve karmaşık hataları çözmenin en etkili yolunun kitlesel gözlem olduğunu savunur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VA6gjO5BSRqfWbk6Y-jDTw.jpeg" /></figure><p>İlkenin orijinal ifadesi şöyledir:</p><blockquote><em>Given enough eyeballs, all bugs are shallow.</em></blockquote><p>Türkçesiyle:</p><blockquote><em>Yeterince göz (farklı bakış açısı) olduğu sürece, tüm hatalar yüzeyseldir (kolayca bulunabilir ve çözülebilir).</em></blockquote><p>İlkenin felsefesi son derece berraktır: Bir hatanın ne kadar karmaşık veya görünmez olduğu, ona kaç kişinin baktığıyla doğrudan ilişkilidir. Bir kişinin günlerce uğraşıp bulamadığı karanlık bir yazılım açığı, konuya tamamen farklı bir perspektifle, farklı bir tecrübeyle yaklaşan bir başkası için saniyeler içinde görünür hale gelebilir.</p><h3>1. Katedral vs. Pazar (The Cathedral and the Bazaar)</h3><p>Raymond, yazılım geliştirme modellerini ikiye ayırır:</p><ul><li><strong>Katedral Modeli:</strong> Kodun, kapalı kapılar ardında, yalnızca elit ve sınırlı bir uzman grubu tarafından (adeta bir katedral inşa eder gibi) geliştirildiği hiyerarşik yapı. Bu modelde test süreçleri ve hata ayıklama sınırlı bir ekibin omuzlarındadır. Hataların tespiti yavaş ve maliyetlidir.</li><li><strong>Pazar Modeli:</strong> Herkesin katkı sunabildiği, kodun herkese açık olduğu ve kolektif bir zekayla (coşkulu bir pazar yeri gibi) geliştirildiği açık kaynak dünyası. Linus’un Linux’u geliştirirken kullandığı bu yöntem, binlerce bağımsız gözün sürekli kodu denetlemesini sağlar. Birinin göremediğini diğeri görür ve hatalar hızla ayıklanır.</li></ul><h3>2. Modern Yazılım Ekiplerinde Linus Kanunu</h3><p>Bugün her şirketin açık kaynaklı devasa bir topluluğu olmayabilir; ancak Linus Kanunu’nu kendi kapalı ekiplerimizde hayata geçirmenin çok güçlü yolları vardır:</p><ul><li><strong>PR (Pull Request) ve Kod İncelemesi (Code Review) Ritüelleri:</strong> Kodun ana dala (main branch) birleşmeden önce ekipteki diğer mühendisler tarafından incelenmesi, Linus Kanunu’nun en doğrudan mikro uygulamasıdır. Kod incelemelerini sadece “onaylama prosedürü” olarak görmeyip, farklı deneyim seviyelerindeki insanların bakmasını sağlamak hataları canlıya çıkmadan yakalar.</li><li><strong>Pair Programming:</strong> İki geliştiricinin aynı bilgisayar/kod üzerinde birlikte çalışması. Biri kodu yazarken (driver), diğerinin anlık olarak tasarımı ve olası hataları gözlemlemesi (navigator) hataların daha klavyeden dökülürken elenmesini sağlar.</li><li><strong>Ekip İçi “Bug Bash” (Toplu Hata Avı) Etkinlikleri:</strong> Büyük bir sürüm öncesinde tüm ekibin (geliştiriciler, test uzmanları, ürün yöneticileri, tasarımcılar) aynı anda sistemi kırıp hata bulmaya çalışması. Farklı disiplinlerden gelen insanların sisteme bakışı, geliştiricilerin asla aklına gelmeyecek kullanım hatalarını ortaya çıkarır.</li><li><strong>Güvenlik İçin “Bug Bounty” (Ödül Avcılığı) Programları:</strong> Sistemlerinizin güvenliğini sadece kendi iç siber güvenlik ekibinize bırakmak yerine, dışarıdaki bağımsız araştırmacıların gözlerine açmak.</li></ul><h3>Bu Gücü Doğru Kullanmanın Sınırları</h3><p>Linus Kanunu muazzam bir savunma aracıdır; fakat “yeterince göz” kavramını yanlış anlamak yeni sorunlar doğurabilir:</p><ul><li><strong>Sorumluluk Dağılması (Bystander Effect):</strong> Bir PR’a veya koda çok fazla kişiyi inceleyici (reviewer) olarak eklediğinizde, herkes “nasılsa başkası inceler” diyerek kodu detaylı okumadan onaylayabilir. Gözlerin sayısını artırırken, her gözün sorumluluğunu ve odağını netleştirmek gerekir.</li><li><strong>Nitelikli Gözlerin Önemi:</strong> Sayıdan ziyade, bakış açılarının çeşitliliği önemlidir. Koda sadece aynı yaklaşıma sahip 10 kişinin bakması yerine; bir güvenlik uzmanının, bir performans mühendisinin ve bir iş mantığı (domain) uzmanının bakması çok daha derinlikli hataları ortaya çıkarır.</li><li><strong>Kodun Okunabilirliği Ön Koşuldur:</strong> Başkalarının koda bakıp hata bulabilmesi için, kodun okunabilir, sade ve anlaşılır olması gerekir. Anlaşılmaz, karmaşık kodlar gözleri yorar ve hataların gizlenmesine (Leaky Abstractions) yol açar.</li></ul><h3>Sonuç</h3><p>Yazılım geliştirmede kusursuz olmak imkansızdır; her geliştirici hata yapar ve kendi yazdığı koda karşı körleşir (confirmation bias).</p><p>Linus Kanunu bize, en karmaşık ve korkutucu görünen hataların bile aslında aşılmaz olmadığını, sadece daha fazla ve farklı gözlerin dikkatine ihtiyaç duyduğunu hatırlatır. Kodumuzu kapalı kapılar ardında saklamak yerine, onu ekibimizin ve topluluğumuzun gözleri önüne ne kadar cesurca serersek, o kadar dayanıklı, güvenli ve kaliteli sistemler inşa edebiliriz.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316">Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-12-dunbars-number-ekipler-neden-150-ki%C5%9Fiden-sonra-yabanc%C4%B1la%C5%9F%C4%B1r-0c8d1c37059b">Dunbar’s Number: Ekipler Neden 150 Kişiden Sonra Yabancılaşır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-13-ninety-ninety-rule-projeler-neden-90-bitti-a%C5%9Famas%C4%B1nda-tak%C4%B1l%C4%B1p-5c830dc5066e">Ninety-Ninety Rule: Projeler Neden “%90 Bitti” Aşamasında Takılıp Kalır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-14-hofstadters-law-bir-i%CC%87%C5%9F-neden-her-zaman-bekledi%C4%9Finizden-uzun-22d8ecf7546b">Hofstadter’s Law: Bir İş Neden Her Zaman Beklediğinizden Uzun Sürer?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-15-broken-windows-theory-k%C3%BC%C3%A7%C3%BCk-i%CC%87hmaller-kod-taban%C4%B1n%C4%B1-nas%C4%B1l-harabeye-00c612971576">Broken Windows Theory: Küçük İhmaller Kod Tabanını Nasıl Harabeye Çevirir?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Linus’s Law — Laws of Software Engineering (<a href="https://lawsofsoftwareengineering.com/laws/linuss-law/">https://lawsofsoftwareengineering.com/laws/linuss-law/</a>)</li><li>Eric S. Raymond, The Cathedral and the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary (O’Reilly, 1999)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1e6c7235aac2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #15 Broken Windows Theory: Küçük İhmaller Kod Tabanını Nasıl Harabeye…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-15-broken-windows-theory-k%C3%BC%C3%A7%C3%BCk-i%CC%87hmaller-kod-taban%C4%B1n%C4%B1-nas%C4%B1l-harabeye-00c612971576?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/00c612971576</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[quality]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Sat, 07 Nov 2026 10:27:04 GMT</pubDate>
            <atom:updated>2026-11-07T10:27:04.974Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #15 Broken Windows Theory: Küçük İhmaller Kod Tabanını Nasıl Harabeye Çevirir?</h3><p>Gecikmelerin ve öngörülemeyen pürüzlerin takvimleri nasıl sarkıttığını Planlama (Planning) kategorisindeki Doksan-Doksan ve Hofstadter kanunlarında detaylıca inceledik. Serinin bu bölümünde yönümüzü <strong>Quality (Kalite) </strong>kategorisine çeviriyoruz. Bu teoriyi ilk olarak işletmeci bir arkadaşımdan duymuştum ve beni çok etkilemişti. Şimdi bu teorinin yazılım ekosistemindeki yansımasını göreceğiz.</p><p>Geliştiriciler olarak her gün verdiğimiz küçük, önemsiz görünen kararların zamanla tüm bir kod tabanının kaderini nasıl belirlediğini masaya yatırıyoruz.</p><p>Yeni bir projeye başladığınızda her şey pırıl pırıldır: Dosya düzeni nizami, isimlendirmeler tutarlı, test kapsama oranı %90’ın üzerindedir. Ancak aylar geçtikçe bir şeyler değişmeye başlar. Önce “acil bir işi yetiştirmek için” testleri pas geçen (failing tests) tek bir PR onaylanır. Ardından, bir dosyanın içine aceleyle “sonra düzeltilmek üzere” (// TODO: fix this hack) geçici bir yama bırakılır.</p><p>Çok değil, birkaç ay sonra o pırıl pırıl kod tabanı; kimsenin dokunmaya cesaret edemediği, yeni bir özellik eklemenin günler sürdüğü ve her yerinden hatalar fışkıran bir harabeye dönüşür.</p><p>Sosyologlar James Q. Wilson ve George L. Kelling tarafından 1982’de ortaya atılan ve yazılım dünyasına <em>The Pragmatic Programmer</em> (Dave Thomas &amp; Andy Hunt) kitabı ile kazandırılan <strong>Broken Windows Theory (Kırık Camlar Teorisi)</strong>, bu sinsi çürüme sürecini çok net bir toplumsal psikoloji üzerinden açıklar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hlw38RJCakMEpm7e-LRfsA.jpeg" /></figure><p>İlkenin temel önermesi şöyledir:</p><blockquote><em>Bir binada tek bir kırık cam onarılmadan öylece bırakılırsa, oradan geçenler binayla kimsenin ilgilenmediğini varsayar. Çok geçmeden diğer camlar da kırılır, binaya zarar verilir ve o çevre hızla bir suç ve ihmal yuvasına dönüşür.</em></blockquote><p>Yazılım mühendisliğinde de kurallar tamamen aynı şekilde işler:</p><blockquote><em>Bir kod tabanında küçük hataların, kötü tasarımların veya baştan savma çözümlerin (kırık camların) öylece kalmasına izin verirseniz, tüm ekip projenin kalitesine kimsenin önem vermediğini varsayar. Sonuçta, kötü kod katlanarak yayılır ve tüm sistem çöker.</em></blockquote><h3>1. Kırık Camların Kod Tabanındaki İzdüşümleri</h3><p>Yazılımdaki “kırık camlar” her zaman büyük mimari felaketler olmak zorunda değildir; aksine, çoğunlukla göz ardı edilen küçük detaylardır:</p><ul><li><strong>Sürekli “Yoksayılan” Testler (Failing/Flaky Tests):</strong> <em>“O test zaten hep hata veriyor, boş ver çalıştır gitsin”</em>denilen tek bir test, ekibe testlerin aslında o kadar da önemli olmadığı mesajını verir. Bir süre sonra kimse test yazmamaya başlar.</li><li><strong>Geçici Yamalar ve </strong><strong>TODO Satırları:</strong> <em>&quot;Şimdilik böyle kalsın, haftaya düzeltirim&quot;</em> diyerek commit edilen ama aylar boyunca orada çürüyen baştasavma kodlar.</li><li><strong>Kullanılmayan/Ölü Kodlar (Dead Code):</strong> Artık çağrılmayan ama “belki lazım olur” diye silinmeyen yüzlerce satırlık eski fonksiyonlar.</li><li><strong>Tarihi Geçmiş veya Eksik Dokümantasyon:</strong> Kodun ne yaptığını anlatmayan, güncelliğini yitirmiş README dosyaları ve yorum satırları.</li><li><strong>Kötü İsimlendirmeler ve Karmaşık Stil:</strong> Kodun okunabilirliğini azaltan, her yiğidin kendi yoğurt yiyişine göre yazdığı tutarsız kodlama stilleri.</li></ul><p>Bu ihmallerin her biri, kod tabanında <em>“Burada standartlar gevşek, ben de aceleyle bir şeyler yazıp geçebilirim”</em> algısını yaratır.</p><h3>2. Çürüme Nasıl Yayılır? (The Decay Effect)</h3><p>İyi niyetli ve disiplinli bir yazılımcı bile, her tarafı “kırık camlarla” dolu, karmaşık bir legacy (miras) projeye girdiğinde psikolojik olarak çevreye uyum sağlar:<em>”Bu koca dosyada zaten her yer spagetti, benim ekleyeceğim 50 satırlık geçici yama (hack) de durumu çok değiştirmez”</em> diye düşünür.</p><p>Buna karşın, her satırı özenle yazılmış, testleri eksiksiz çalışan ve CI/CD süreçleri tıkır tıkır işleyen bir projede, hiç kimse oraya kalitesiz veya özensiz bir kod parçası bırakmaya cesaret edemez. Çünkü o “temiz” düzendeki en ufak bir uyumsuzluk (kırık cam) anında sırıtır ve göze batar.</p><h3>3. “Boy Scout Rule” (İzcilik Kuralı) ile Kırık Camları Onarmak</h3><p>Kırık Camlar Teorisi’yle savaşmanın en etkili yolu, yazılım dünyasında her geliştiricinin benimsemesi gereken <strong>Boy Scout Rule (İzcilik Kuralı)</strong>’dur:</p><blockquote><em>Kamp yaptığın yeri, bulduğundan daha temiz bırak.</em></blockquote><p>Bunu yazılıma uyarladığımızda: Bir dosyada veya modülde bir değişiklik yapıyorsanız, oradan çıkmadan önce gözünüze çarpan en az bir küçük kusuru düzeltin.</p><ul><li>Yanıltıcı isimlendirilmiş bir değişkeni yeniden adlandırın.</li><li>Artık kullanılmayan eski bir kütüphane bağımlılığını silin.</li><li>Eksik kalmış bir testi yazın ya da karmaşık bir satırı refactor edin.</li></ul><p>Bu küçük, günlük disiplinler bir araya geldiğinde, teknik borç birikimini engeller ve kod tabanının kalitesini organik olarak yukarıda tutar.</p><h3>Bu Tuzaktan Nasıl Kaçınabiliriz?</h3><p>Projelerimizi kırık camlardan korumak ve kalite kültürünü ayakta tutmak için şu yaklaşımları uygulayabiliriz:</p><ul><li><strong>Sıfır Tolerans Politikası (Zero Tolerance):</strong> Bozulan testleri, derleme (build) hatalarını veya linter uyarılarını asla “yarın düzeltirim” diyerek bırakmayın. Öncelikli olarak o kırık camı onarın.</li><li><strong>Süreçleri Otomatize Edin:</strong> Kalite standartlarını kişilerin inisiyatifine bırakmayın. Pre-commit kancaları (hooks),linter’lar, statik kod analiz araçları (SonarQube) ve CI/CD süreçleriyle “kırık camların” ana dala (main branch) sızmasını otomatik olarak engelleyin.</li><li><strong>Kod İncelemelerini (Code Review) Önemseyin:</strong> PR (Pull Request) süreçlerini sadece “kod çalışıyor mu” testi olarak görmeyin. Kalite, stil ve düzen standartlarından ödün vermeyen, yapıcı ama disiplinli bir review kültürü oluşturun.</li><li><strong>“Düzeltme” (Refactoring) Zamanı Ayırın:</strong> Ekiplere sadece yeni özellik geliştirmesi değil; mevcut teknik borçları temizlemek, eskiyen modülleri yenilemek ve kırık camları onarmak için her sprint’te makul bir zaman bütçesi tanıyın.</li></ul><h3>Sonuç</h3><p>Yazılımda çürüme, büyük ve radikal kararlarla değil; her gün göz ardı edilen küçük, önemsiz ihmallerin birikmesiyle başlar.</p><p>Yürürken yanından geçtiğiniz, fark edip de düzeltmediğiniz her kötü kod parçası, o projenin yeni kalite standardı haline gelir. Bir mimar veya geliştirici olarak asli görevimiz, sadece yeni binalar inşa etmek değil; o binaların ilk kırılan camını anında onaracak disiplini ve özeni her gün gösterebilmektir.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316">Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-12-dunbars-number-ekipler-neden-150-ki%C5%9Fiden-sonra-yabanc%C4%B1la%C5%9F%C4%B1r-0c8d1c37059b">Dunbar’s Number: Ekipler Neden 150 Kişiden Sonra Yabancılaşır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-13-ninety-ninety-rule-projeler-neden-90-bitti-a%C5%9Famas%C4%B1nda-tak%C4%B1l%C4%B1p-5c830dc5066e">Ninety-Ninety Rule: Projeler Neden “%90 Bitti” Aşamasında Takılıp Kalır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-14-hofstadters-law-bir-i%CC%87%C5%9F-neden-her-zaman-bekledi%C4%9Finizden-uzun-22d8ecf7546b">Hofstadter’s Law: Bir İş Neden Her Zaman Beklediğinizden Uzun Sürer?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Broken Windows Theory — Laws of Software Engineering (<a href="https://lawsofsoftwareengineering.com/laws/broken-windows-theory/">https://lawsofsoftwareengineering.com/laws/broken-windows-theory/</a>)</li><li>Dave Thomas &amp; Andy Hunt, The Pragmatic Programmer: From Journeyman to Master (Addison-Wesley, 1999)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=00c612971576" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #14 Hofstadter’s Law: Bir İş Neden Her Zaman Beklediğinizden Uzun…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-14-hofstadters-law-bir-i%CC%87%C5%9F-neden-her-zaman-bekledi%C4%9Finizden-uzun-22d8ecf7546b?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/22d8ecf7546b</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[planning]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 16:44:47 GMT</pubDate>
            <atom:updated>2026-11-04T16:44:47.742Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #14 Hofstadter’s Law: Bir İş Neden Her Zaman Beklediğinizden Uzun Sürer?</h3><p>Sprint planlama toplantısında yeni bir özellik için masaya oturduğunuzu düşünün. Ekip olarak tecrübelisiniz, geçmiş hatalardan ders çıkardınız ve temkinli bir plan yapıyorsunuz:</p><p><em>“Bu geliştirme normal şartlarda 1 ay sürer. Ancak olası riskleri ve gecikmeleri hesaba katalım; kendimize pay bırakıp teslim süresine 6 hafta diyelim.”</em></p><p>Peki sürecin sonunda ne olur? Proje 6 haftada değil, tam 3 ayda zor tamamlanır.</p><p>Neden? Entegrasyon yapılacak harici API beklenenden çok daha karmaşık çıkmıştır, kilit bir mühendis hastalanmıştır veya ilk kurulan mimari yaklaşım yetersiz kalıp çöpe atılmış ve her şey baştan kodlanmıştır. Kısacası,”öngörülemeyen” durumlar projenin olağan akışı hâline gelmiştir.</p><p>Bilişsel bilimci Douglas Hofstadter, 1979 tarihli Pulitzer ödüllü başyapıtı <em>Gödel, Escher, Bach: An Eternal Golden Braid</em> kitabında bu kronik tahminleme paradoksunu özyinelemeli (recursive) ve sarsıcı bir kanunla formüle etmiştir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wvKwH1E9obAF7gjjHh0Y7A.jpeg" /></figure><p>İlkenin klasik ifadesi şöyledir:</p><blockquote><em>It always takes longer than you expect, even when you take into account Hofstadter’s Law.</em></blockquote><p>Türkçesiyle:</p><blockquote><em>Hofstadter Yasası’nı hesaba katsanız bile, bir iş her zaman beklediğinizden daha uzun sürer.</em></blockquote><h3>1. Özyinelemeli Tuzak (The Recursive Trap)</h3><p>Hofstadter Yasası’nın dehşeti, kendi içine dönen yapısından kaynaklanır.</p><p>Bir işe başlarken <em>“Geçmişte benzer işler sarmıştı, bu yüzden tahmini süreyi iki katına çıkarıyorum”</em> deseniz dahi iş yine gecikir; bu kez üç katı sürer. Çünkü insan beyni neyi bilmediğini (unknown unknowns) öngöremez.</p><p>Yazılım geliştirme, fabrika bandında standart bir üretim yapmak değildir; yaratıcı ve belirsizliklerle dolu karmaşık bir problem çözme sürecidir. Ne kadar deneyimli olursanız olun, daha önce hiç çözmediğiniz teknik pürüzlerin ne zaman ortaya çıkacağını önceden kesin bir takvime bağlayamazsınız.</p><h3>2. İki Ateş Arasında: Parkinson Yasası vs. Hofstadter Yasası</h3><p>Yazılım planlamalarında iki zıt kuvvet sürekli çatışır:</p><ul><li><strong>Parkinson Yasası:</strong> <em>“Bir iş, tamamlanması için kendisine ayrılan süreyi dolduracak şekilde genişler.”</em></li><li><strong>Hofstadter Yasası:</strong> <em>“Bir iş, ne kadar pay bırakırsanız bırakın beklediğinizden uzun sürer.”</em></li></ul><p>Buradaki tuzak şudur: Eğer takvimi çok gevşetip gereğinden fazla güvenlik payı (buffer) eklerseniz, Parkinson Yasası devreye girer ve ekip rehavete kapılarak zamanı tüketir. Ancak hiç pay bırakmayıp takvimi sıkıştırırsanız, bu kez Hofstadter Yasası devreye girer ve ortaya çıkan ilk teknik engelde tüm teslim planı çöker.</p><h3>3. Pratik Bir Yaklaşım: Ne Kadar Süre Ayırmalıyız?</h3><p>Hofstadter Yasası’nın yarattığı baskıyı yönetmek için sahada sıkça başvurulan pratik bir kural (rule of thumb) vardır:</p><ul><li><strong>İş 2 dakika sürüyorsa:</strong> Hemen o an yapın ve aradan çıkarın.</li><li><strong>İş birkaç dakika sürüyorsa:</strong> Takvime 1 saat olarak yazın.</li><li><strong>İş birkaç saat sürüyorsa:</strong> Takvime 1 gün olarak yazın.</li></ul><p>Buradaki amaç süreci gereksiz yere uzatmak değildir. Amaç, beklenmedik teknik pürüzler ve hata ayıklama süreçleri devreye girdiğinde, kodu aceleye getirmeden kaliteli bir şekilde teslim edebilecek alanı kazanmaktır.</p><h3>Bu Tuzaktan Nasıl Kaçınabiliriz?</h3><p>Tahmin yapmaktan tamamen vazgeçemeyiz; ancak Hofstadter Yasası ile savaşmak yerine onunla yaşamayı öğrenebiliriz:</p><ul><li><strong>Tek Bir Tarih Yerine Aralık Belirleyin:</strong> Projeleri “15 Kasım’da bitecek” gibi tek ve kesin bir tarih yerine,güven aralıklarıyla (“En erken 10 Kasım, en geç 30 Kasım”) ifade edin.</li><li><strong>Güvenlik Paylarının (Buffer) Tüketileceğini Bilin:</strong> Takvime eklediğiniz paylar projenin erken bitmesini sağlamaz; yalnızca kaçınılmaz gecikmeler yaşandığında projenin krize girmesini engeller.</li><li><strong>Küçük Parçalara Bölün:</strong> Tahmin edilecek işin boyutu büyüdükçe Hofstadter Yasası’nın hata payı katlanarak artar. Görevleri birkaç günü aşmayacak küçük modüllere bölmek, bilinmeyen riskleri erkenden gün yüzüne çıkarır.</li></ul><h3>Sonuç</h3><p>Yazılım dünyasında bir projenin planlanan takvimi aşması çoğu zaman ekibin yetersizliğinden veya tembelliğinden kaynaklanmaz. Mesele, karmaşık yaratıcı süreçlerde geleceği kesin çizgilerle öngörebileceğimizi sanma yanılgımızdır.</p><p>Hofstadter Yasası’nı bilmek projelerin gecikmesini sihirli bir şekilde engellemez; ancak gecikmeyi bir kaza değil,karmaşık sistemlerin doğal bir gerçeği olarak kabul edip daha olgun planlar yapmamızı sağlar.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316">Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-12-dunbars-number-ekipler-neden-150-ki%C5%9Fiden-sonra-yabanc%C4%B1la%C5%9F%C4%B1r-0c8d1c37059b">Dunbar’s Number: Ekipler Neden 150 Kişiden Sonra Yabancılaşır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-13-ninety-ninety-rule-projeler-neden-90-bitti-a%C5%9Famas%C4%B1nda-tak%C4%B1l%C4%B1p-5c830dc5066e">Ninety-Ninety Rule: Projeler Neden “%90 Bitti” Aşamasında Takılıp Kalır?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Hofstadter’s Law — Laws of Software Engineering</li><li>Douglas Hofstadter, Gödel, Escher, Bach: An Eternal Golden Braid (1979)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=22d8ecf7546b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #13 Ninety-Ninety Rule: Projeler Neden “%90 Bitti” Aşamasında Takılıp…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-13-ninety-ninety-rule-projeler-neden-90-bitti-a%C5%9Famas%C4%B1nda-tak%C4%B1l%C4%B1p-5c830dc5066e?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/5c830dc5066e</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[planning]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Sun, 01 Nov 2026 19:01:01 GMT</pubDate>
            <atom:updated>2026-11-01T19:01:01.811Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #13 Ninety-Ninety Rule: Projeler Neden “%90 Bitti” Aşamasında Takılıp Kalır?</h3><p>Mimari ve ekipler üzerine konuştuktan sonra serinin bu bölümünde doğrudan proje yönetimi ve tahminlemenin kalbine, <strong>Planning (Planlama)</strong> kategorisine geçiyoruz.</p><p>Her yazılım ekibinin aşina olduğu bir sahne vardır:</p><p>Haftalık durum toplantısında geliştiriciye projenin ne durumda olduğu sorulur. Yanıt kendinden emindir: <em>“Neredeyse bitti, %90&#39;ını tamamladım. Sadece birkaç küçük pürüz kaldı.”</em></p><p>Aradan iki hafta geçer; proje hâlâ %90&#39;dadır. Bir ay geçer; durum değişmez. Proje adeta bir asimptot gibi %90 seviyesine kilitlenmiş, bir türlü %100&#39;e ulaşamamaktadır.</p><p>Bell Labs’ten Tom Cargill tarafından ortaya atılan ve Jon Bentley’in 1985 tarihli <em>Communications of the ACM </em>makalesinde popülerleşen <strong>Ninety-Ninety Rule (Doksan-Doksan Kuralı)</strong>, bu planlama paradoksunu matematiksel bir absürtlükle ama son derece isabetli bir mizahla tanımlar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6QqtDcLpHYrT6WBTxKFuAw.jpeg" /></figure><p>İlkenin orjinal ifadesi şöyledir:</p><blockquote><em>The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.</em></blockquote><p>Türkçesiyle:</p><blockquote><em>Kodun ilk %90&#39;ı, planlanan geliştirme süresinin ilk %90&#39;ını tüketir. Kodun geriye kalan %10&#39;u ise geliştirme süresinin diğer %90&#39;ını tüketir.</em></blockquote><p>Toplamın %180 etmesi bir hesap hatası değildir; yazılım projelerindeki takvim sapmalarının ve eksik tahminlemelerin gerçeğe yansımasıdır.</p><h3>1. “Mutlu Yol” (Happy Path) İllüzyonu</h3><p>Bir geliştirici bir özelliği kodlarken süreyi zihninde doğrusal varsayar. İlk aşamada temel iş mantığı (core logic) hızla ayağa kaldırılır. Veriler akmaya başlar, butonlar çalışır ve ekranda beklenen çıktı görünür.</p><p>İşte geliştiricinin <em>“İşin %90&#39;ı bitti”</em> dediği an tam olarak burasıdır: <strong>Happy Path (Mutlu Yol)</strong> tamamlanmıştır.</p><p>Ancak bir yazılımı yalnızca “her şey yolunda gittiğinde çalışan” bir prototipten, “üretim ortamında (production) dayanıklı” bir sisteme dönüştürmek, o görünüşte küçük kalan %10&#39;luk alanda gizlidir.</p><h3>2. Geriye Kalan Görünmez %10&#39;un Anatomisi</h3><p>Yazılımın kalan %10&#39;luk kısmı aslında şu zorlu ve zaman alıcı süreçlerin tamamıdır:</p><ul><li><strong>Sınır Durumlar (Edge Cases):</strong> Beklenmedik kullanıcı girdileri, boş (null) değerler, concurrency çatışmaları ve yarış durumları (race conditions).</li><li><strong>Hata Yönetimi ve Dayanıklılık:</strong> Ağ kopmaları, API zaman aşımları (timeout), fallback mekanizmaları ve veri tabanı kilitlenmeleri.</li><li><strong>Test ve Entegrasyon:</strong> Birim testleri, uçtan uca (E2E) testler ve diğer sistemlerle uyumluluk doğrulamaları.</li><li><strong>Operasyonel Hazırlık:</strong> Güvenlik açıklarının taranması, loglama, metriklerin ve izleme altyapısının (observability) kurulması, CI/CD hatlarının yapılandırılması.</li><li><strong>Ortam Farklılıkları:</strong> “Benim yerel makinemde (localhost) çalışıyordu” sendromunun canlı ortamda çözülmesi.</li></ul><p>Yazılımcılar kod yazarken genellikle ilk %90&#39;lık yaratıcı kısmı tahmin eder; ancak kalan %10&#39;luk “mühendislik temizliği” ve “üretim dayanıklılığı” süresini sistematik olarak hafife alır.</p><h3>Bu Tuzaktan Nasıl Kaçınabiliriz?</h3><p>Doksan-Doksan Kuralı’nın yarattığı sonsuz döngüyü kırmak için izlenebilecek temel yaklaşımlar:</p><ul><li><strong>“Bitti” Tanımını (Definition of Done) Katılaştırın:</strong> Bir iş, geliştirici kodlamayı bitirdiğinde değil; testleri yazıldığında, kodu incelendiğinde (code review), dokümante edildiğinde ve dağıtıma hazır olduğunda “bitti” kabul edilmelidir.</li><li><strong>Dikey Dilimleme (Vertical Slicing):</strong> Projeyi tek parça dev bir blok olarak geliştirmek yerine, her biri üretim kalitesinde test edilmiş küçük fonksiyonel dilimlere bölün. Böylece görünmeyen işler projenin sonuna yığılmaz.</li><li><strong>Sınır Durumları Baştan Tasarlayın:</strong> Hata yönetimi ve sınır durumları kodlamanın en sonuna bırakılacak bir detay değil, mimarinin ana girdisi olmalıdır.</li><li><strong>Tahminlemelerde Güven Payı (Buffer) Bırakın:</strong> İlk prototipin ortaya çıkma süresini projenin bitişi sanma yanılgısını kabul edin ve test/dağıtım süreçleri için gerçekçi zaman dilimleri ayırın.</li></ul><h3>Sonuç</h3><p>Yazılım geliştirme, bir duvarı tuğla tuğla örmeye benzemez. Kodun son satırlarını yazmak işin bittiği anlamına gelmez; çoğu zaman asıl mühendislik mücadelesinin yeni başladığını gösterir.</p><p>Bir projede <em>“İşin %90&#39;ı bitti”</em> cümlesini duyduğunuzda yapılması gereken, rahatlamak değil; projenin en belirsiz, en zorlu ve en çok zaman alacak ikinci yarısına zihnen hazırlanmaktır.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316">Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-12-dunbars-number-ekipler-neden-150-ki%C5%9Fiden-sonra-yabanc%C4%B1la%C5%9F%C4%B1r-0c8d1c37059b">Dunbar’s Number: Ekipler Neden 150 Kişiden Sonra Yabancılaşır?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Ninety-Ninety Rule — Laws of Software Engineering</li><li>Tom Cargill / Jon Bentley, Programming Pearls: Bumper-Sticker Computer Science (Communications of the ACM,1985)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5c830dc5066e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #12 Dunbar’s Number: Ekipler Neden 150 Kişiden Sonra Yabancılaşır?]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-12-dunbars-number-ekipler-neden-150-ki%C5%9Fiden-sonra-yabanc%C4%B1la%C5%9F%C4%B1r-0c8d1c37059b?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/0c8d1c37059b</guid>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[ekip-yönetimi]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[team]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 14:11:14 GMT</pubDate>
            <atom:updated>2026-10-29T14:11:14.237Z</atom:updated>
            <content:encoded><![CDATA[<p>Bir girişimin veya mühendislik ekibinin ilk günlerini düşünün: Herkes aynı odada çalışır, kimin ne yaptığını bilir, mimari kararlar kahve makinesinin başında ayaküstü alınır ve formal süreçlere ihtiyaç duyulmaz.</p><p>Şirket büyüyüp çalışan sayısı yüzleri aştığında ise kaçınılmaz bir kırılma yaşanır: Koridorda tanımadığınız yüzler belirir,şirketin genel toplantıları (all-hands) samimiyetini yitirir, departmanlar arası silolar oluşur ve gayriresmi mutabakatların yerini prosedürler ile bürokrasi alır.</p><p>Yöneticiler bu kırılmayı genellikle “şirket kültürü bozuldu” ya da “iletişim eksikliği var” diyerek açıklamaya çalışır. Oysa mesele motivasyon eksikliği değil, insan beyninin biyolojik sınırlarıdır.</p><p>1992 yılında İngiliz antropolog Robin Dunbar, primatların beyin büyüklüğü (neokorteks hacmi) ile sürdürebildikleri sosyal grup boyutları arasındaki ilişkiyi incelerken bu sınırın insanlardaki karşılığını hesapladı: <strong>Dunbar’s Number (Dunbar Sayısı)</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IDXPhc5lMI7FMfeTlwuYtg.jpeg" /></figure><p>İlkenin temel tanımı şöyledir:</p><blockquote><em>Bir bireyin herkesi kişisel olarak tanıyabileceği, rollerini ve birbirleriyle ilişkilerini takip edebileceği kararlı sosyal ilişkiler ağının bilişsel üst sınırı yaklaşık 150 kişidir.</em></blockquote><p>Dunbar’a göre 150 sayısı tek bir katı sınırdan ibaret değildir; insan ilişkileri iç içe geçmiş halkalar hâlinde katlanarak genişler:</p><ul><li><strong>5 Kişi (En Yüksek Güven):</strong> Çekirdek destek çemberi. Kriz anında koşulsuz güvenebileceğiniz en yakın iş arkadaşları.</li><li><strong>15 Kişi (Güvenilir Çalışma Grubu):</strong> Gerçek anlamda yakın iş birliği yapılabilen sınır.</li><li><strong>50 Kişi (Yakın Çalışma Çevresi):</strong> Birlikte bir “topluluk” hissini koruyabilen bir bölüm veya mühendislik kolu.</li><li><strong>150 Kişi (Sosyal Ağın Üst Sınırı):</strong> Bir organizasyonda herkesin yüzünü ve rolünü hatırlayabileceğiniz azami sınır.</li></ul><p>150 sınırının üzerine çıktığınızda elinizde artık organik bir topluluk kalmaz; birbirine yabancılaşmış bireylerden oluşan bir <strong>şirket</strong> vardır.</p><h3>Yazılım Dünyasında Dunbar Sayısı Nasıl Karşımıza Çıkar?</h3><p>Büyümeyi yönetebilen mühendislik organizasyonları, insan biyolojisiyle savaşmak yerine sistemlerini bu katmanlara göre tasarlayanlardır:</p><h4>1. Valve Corporation: Yöneticisiz Şirket Modeli</h4><p>Valve’da yönetici, hiyerarşi veya resmi bir organizasyon şeması yoktur. Mühendisler çalışacakları projeleri kendileri seçer.</p><p>Ancak bu özgürlük kuralsızlık demek değildir; Valve, Dunbar Sayısı’nı şirket politikasına dönüştürmüştür:</p><ul><li>Proje ekipleri <strong>12 kişiyle</strong> sınırlandırılır.</li><li>Bir proje ekibi <strong>15 kişiyi</strong> geçerse ekip bölünür.</li><li>Bir grubun boyutu <strong>50 kişiye</strong> ulaştığında ikiye ayrılır.</li><li>Organizasyon büyüklüğü <strong>150 kişiyi</strong> aştığında ise mevcut binayı büyütmek yerine yepyeni bir ofis açılır.</li></ul><h4>2. Amazon: “İki Pizzalık Ekipler” (Two-Pizza Teams)</h4><p>Jeff Bezos’un popülerleştirdiği “Bir ekip iki pizzayla doymuyorsa çok büyüktür” kuralı (5–10 kişi), Dunbar’ın en içteki 5–15 kişilik yüksek güven halkasını hedefler. Ekipler bu boyutta kaldığında koordinasyon toplantılarına gerek kalmadan hızlı karar alabilir.</p><h4>3. Linux Çekirdeği: Alt Sistemler ve Hiyerarşi</h4><p>Linux çekirdeği (kernel) projesine binlerce mühendis katkı sağlar. Ancak bu binlerce kişi merkezi tek bir kanalda iletişim kurmaz. Proje; ağ, dosya sistemi, bellek yönetimi gibi alt sistem (subsystem) e-posta gruplarına bölünmüştür. Her çekirdek bakımcı (maintainer) binlerce kişilik kitlenin tamamıyla değil, yalnızca kendi küçük grubuyla doğrudan haberleşir.</p><h3>Mühendislik Liderleri İçin Çıkarımlar</h3><p>Dunbar Sayısı, organizasyon büyütürken rahatsız edici ama kritik gerçekleri hatırlatır:</p><ul><li><strong>15 kişiyi aşan ekiplerde</strong> doğrudan iş birliği ve güven bağı gevşemeye başlar; toplantı yükü katlanır.</li><li><strong>50 kişiyi aşan bölümlerde</strong> şirket geneli toplantılar insanları kaynaştırmaz, tek taraflı duyuru panosuna döner.</li><li><strong>150 kişiyi aşan organizasyonlarda</strong> artık işlerin gayriresmi iletişimle yürümesini bekleyemezsiniz. Yazılı dokümantasyon, net API sözleşmeleri ve otonom alt gruplar kurmak zorunlu hâle gelir.</li></ul><h3>Sonuç</h3><p>Bir yazılım sistemini tasarlarken nasıl sunucu belleğinin (RAM) sınırlarını bilerek mimariyi kuruyorsak, organizasyonu büyütürken de insan beyninin bilişsel sınırlarını hesaba katmak zorundayız.</p><p>150 kişiyi aşmış bir mühendislik yapısında ekipleri tek bir devasa yapıda tutmaya çalışmak, monolitik bir veritabanına sınırsız yük bindirmeye benzer.</p><p>Ölçeklenmenin yolu ekibi sonsuza kadar büyütmek değil; Dunbar’ın sınırlarına saygı duyarak sistemi küçük, bağımsız ve yüksek güvene sahip modüllere bölebilmektir.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316">Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Dunbar’s Number — Laws of Software Engineering</li><li>Robin Dunbar, Neocortex size as a constraint on group size in primates (1992)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0c8d1c37059b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #11 Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-11-brookss-law-geciken-bir-projeye-i%CC%87nsan-eklemek-neden-onu-daha-da-bd74647c9316?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/bd74647c9316</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[project-management]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Wed, 28 Oct 2026 12:43:42 GMT</pubDate>
            <atom:updated>2026-10-28T12:43:42.776Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #11 Brooks’s Law: Geciken Bir Projeye İnsan Eklemek Neden Onu Daha da Geciktirir?</h3><p>Artık genelde projelere yeni insan eklemiyoruz, onun yerine yeni Yapay zeka ajanları ekliyoruz ama gene de teslim tarihine (deadline) bir ay kalmış bir projede işlerin planlandığı gibi gitmediğini fark ettiğimizde, yönetim toplantılarında en sık duyulan refleks şudur:</p><p><em>“Hemen ekibe 3–4 yazılımcı daha kaydıralım, el birliğiyle projeyi yetiştirelim.”</em></p><p>Gündelik hayatta bu sezgisel bir mantıktır: Bir tarlayı sürmek veya bir duvarı örmek için çalışan sayısını iki katına çıkarırsanız, iş yarı sürede biter. Ancak yazılım geliştirmede bu refleks genellikle ateşe benzin dökmekle sonuçlanır.</p><p>IBM’in OS/360 işletim sistemi projesindeki deneyimlerinden yola çıkan Fred Brooks, 1975 tarihli <em>The Mythical Man-Month</em> eserinde bu gerçeği yazılım dünyasının en ünlü kanunlarından biriyle ifade etmiştir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IPhu5jDsWcPXJ6vsxd6KzQ.jpeg" /></figure><p>İlkenin orijinal tanımı şöyledir:</p><blockquote><em>Adding manpower to a late software project makes it later.</em></blockquote><p>Türkçesiyle:</p><blockquote><em>Geç kalan bir yazılım projesine insan kaynağı eklemek, projeyi daha da geciktirir.</em></blockquote><p>Brooks, yazılım projelerinde “insan” ile “zaman”ın birbirinin yerine geçen değişkenler olduğu varsayımını (insan-ay / man-month kavramını) bir efsane olarak nitelendirir. Projeye sonradan dahil edilen geliştiricilerin süreci hızlandırmak yerine yavaşlatmasının arkasında üç temel neden yatar:</p><h3>1. Alışma Süreci (Ramp-up Time)</h3><p>Yeni katılan geliştiriciler ilk günden tam verimle kod yazamaz. Mimariyi, iş kurallarını (domain), şirket içi araçları ve kod tabanını öğrenmek zorundadırlar.</p><p>Asıl kritik nokta şudur: Yeni gelenleri eğitecek, onlara kod incelemesi (code review) yapacak ve sorularını yanıtlayacak kişiler, projenin iç dinamiklerini en iyi bilen mevcut kıdemli mühendislerdir. Dolayısıyla yeni kaynak eklemek, halihazırda gecikmiş olan çekirdek ekibin üretim hızını doğrudan aşağı çeker.</p><h3>2. İletişim Yükünün Katlanarak Artması (Communication Overhead)</h3><p>Yazılım geliştirme izole bir iş değildir; sürekli müzakere, hizalanma ve koordinasyon gerektirir. Bir ekipteki iletişim kanallarının sayısı doğrusal değil, kombinatoryal olarak artar.</p><p>Ekipteki kişi sayısı n olduğunda, potansiyel iletişim kanalı sayısı şu formülle hesaplanır:</p><p>n(n-1)/2</p><p>4 kişilik bir ekipte yönetilmesi gereken <strong>6</strong> iletişim kanalı varken,</p><ul><li>Ekip 8 kişiye çıktığında bu kanal sayısı <strong>28</strong>’e,</li><li>12 kişiye çıktığında ise <strong>66</strong>’ya fırlar.</li></ul><p>Kişi sayısı arttıkça toplantı süreleri uzar, mimari mutabakatlar zorlaşır ve mesajlaşma trafiği kod yazma süresini yutmaya başlar.</p><h3>3. İşin Bölünemez Doğası (Task Partitioning)</h3><p>Fred Brooks’un kitabındaki meşhur analojisi meseleyi çok net özetler:</p><blockquote>Dokuz kadının bir araya gelmesi, bir bebeğin bir ayda doğmasını sağlamaz.</blockquote><p>Bazı işler doğası gereği sıralıdır (sequential). Bir veritabanı modeli oturmadan servis katmanı yazılamaz,API kontratı çıkmadan arayüz tamamlanamaz. Görevler birbirinden bağımsız parçalara bölünemiyorsa,ekibe eklenen fazladan kişiler birbirlerinin adımlarını beklemek zorunda kalır ve çakışmalar (merge conflicts) artar.</p><h3>Geciken Bir Projede Ne Yapılmalı?</h3><p>Bir proje gecikmeye başladığında insan eklemek çözüm değilse, hangi adımlar atılmalıdır?</p><ul><li><strong>Kapsamı Küçültün (Scope Reduction):</strong> Teslim tarihini tutturmanın en gerçekçi yolu, özellik listesini acımasızca budamak ve yalnızca mutlak gerekli olan MVP çekirdeğine odaklanmaktır.</li><li><strong>Teslim Tarihini Gerçekçi Olarak Öteleyin:</strong> Zaman tahmininin hatalı olduğunu baştan kabul edip takvimi güncellemek, projeye aceleyle insan yığıp kaliteyi çökertmekten daha az maliyetlidir.</li><li><strong>Yeni Kaynakları Kritik Yoldan Uzak Tutun:</strong> Eğer ekibe mutlaka yeni geliştiriciler dahil edilecekse, bu kişileri doğrudan geciken ana geliştirme hattına (critical path) sokmak yerine; dokümantasyon, bağımsız testler veya ortam kurulumları gibi ana ekibin odağını bölmeyecek alanlara yönlendirin.</li></ul><h3>Sonuç</h3><p>Brooks’s Law, yazılım mühendisliğinin karmaşık bir organizasyonel koordinasyon işi olduğunu hatırlatır.İnsanlar fabrika tezgahındaki makineler gibi birbirinin yerine ikame edilemez.</p><p>Bir proje geciktiğinde yapılacak en tehlikeli hamle, sırf yönetimsel bir aksiyon alıyor gibi görünmek adına ekibe kontrolsüzce yeni insanlar eklemektir. Olgun ekipler kriz anlarında ekibi büyütmeye değil, karmaşıklığı ve kapsamı küçültmeye odaklanır.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9">Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Brooks’s Law — Laws of Software Engineering</li><li>Fred Brooks, The Mythical Man-Month: Essays on Software Engineering (1975)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd74647c9316" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #10 Conway’s Law: Sistem Mimarisi Organizasyon Yapısını Neden Aynalar?]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-10-conways-law-sistem-mimarisi-organizasyon-yap%C4%B1s%C4%B1n%C4%B1-neden-aynalar-5dfbd4a4d7b9?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/5dfbd4a4d7b9</guid>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[yazılım-mimarisi]]></category>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[teams-and-teamwork]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Sun, 25 Oct 2026 13:02:58 GMT</pubDate>
            <atom:updated>2026-10-25T13:02:58.130Z</atom:updated>
            <content:encoded><![CDATA[<p>Serinin ilk 9 yazısında ağırlıklı olarak <strong>sistem mimarisi ve teknik tasarım</strong> odaklı kanunları (Gall, Hyrum, Leaky Abstractions, Tesler, CAP, Second-System, Dağıtık Sistem Yanılgıları, İstenmeyen Sonuçlar ve Zawinski) inceledik.</p><p>Bu yazıyla birlikte seride yeni bir faza geçiyoruz: <strong>Ekipler ve Organizasyonlar (Teams).</strong></p><p>Çünkü yazılım, yalnızca sunucularda ve kod satırlarında var olmaz; onu geliştiren insanların, iletişim biçimlerinin ve kurumsal yapıların doğrudan bir sonucudur.</p><p>Yeni fazın ilk ve en etkili ilkesi, 1967 yılında bilgisayar bilimci Melvin Conway tarafından ortaya konan <strong>Conway’s Law (Conway Yasası)</strong>.</p><p>İlkenin klasik ifadesi şöyledir:</p><blockquote><em>Software systems reflect the communication structure of the organization that builds them.</em></blockquote><p>Türkçesiyle:</p><blockquote>Yazılım sistemleri, bunları geliştiren organizasyonun iletişim yapısını yansıtır.</blockquote><p>Conway’in temel tezi son derece nettir: Bir yazılımın mimarisini belirleyen asıl güç teknik diyagramlar veya mimari kararlar değil; ekibin içindeki iletişim kanalları ve organizasyon şemasıdır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vvb3apdLeGMWA8oDcbm4yQ.jpeg" /></figure><h3>1. Klasik Örnek: Dört Ekip ve Dört Aşamalı Derleyici</h3><p>Melvin Conway’in makalesinde aktardığı en çarpıcı örneklerden biri bir derleyici (compiler) projesidir:</p><p>Bir sistem için derleyici geliştirmek üzere işe koyulan bir organizasyon, projeyi <strong>dört ayrı gruba</strong> böler. Sürecin sonunda ortaya çıkan derleyici tam olarak <strong>dört aşamalı (4-pass compiler)</strong> bir yapıya sahip olur.</p><p>Bunun nedeni dört aşamalı bir derleyicinin teknik olarak en iyi mimari olması değildir. Gruplar arasındaki iletişim hatları ve iş bölümü, doğrudan kodun arayüzlerine (interface) ve modül sınırlarına dönüşmüştür. Ekipler birbirleriyle nasıl konuşuyorsa, kod parçaları da tam olarak o sınırlar üzerinden haberleşecek şekilde tasarlanmıştır.</p><h3>2. Katmanlı Ekipler, Katmanlı Mimariler</h3><p>Günümüz yazılım dünyasında Conway Yasası’nın en yaygın tezahürü departman bazlı iş bölümünde görülür:</p><ul><li>Ayrı bir <strong>Arayüz (Frontend) ekibi</strong>,</li><li>Ayrı bir <strong>Backend ekibi</strong>,</li><li>Ayrı bir <strong>Veritabanı (DBA) ekibi</strong>.</li></ul><p>Bu organizasyon yapısına sahip bir şirketin monolitik veya katmanlı bir mimari (3-tier architecture) üretmesi neredeyse kaçınılmazdır. Özellik geliştirmeleri ekipler arasında ticket handover yöntemiyle ilerlediği için kod tabanı da UI katmanı, servis katmanı ve veri erişim katmanı olarak birbirinden kalın duvarlarla ayrılır.</p><p>Sorun bu katmanların varlığı değil; kullanıcıya yönelik tek bir küçük özelliğin bile hayata geçmesi için üç ayrı ekibin toplantı yapmasını ve birbirini beklemesini gerektirmesidir.</p><h3>3. Ters Conway Manevrası (Inverse Conway Maneuver)</h3><p>Conway Yasası bize mimarinin organizasyonu takip ettiğini söyler. O halde hedeflenen mimariyi kurmanın yolu nedir?</p><p>Cevap: <strong>Ters Conway Manevrası.</strong></p><p>Eğer bağımsız dağıtılabilen, gevşek bağlı (loosely coupled) mikroservisler veya modüller inşa etmek istiyorsanız, önce organizasyonunuzu bu şekilde yapılandırmalısınız.</p><p>Yani katmanlara göre ayrılmış ekipler yerine; içinde frontend, backend, test ve ürün sorumlusunu barındıran <strong>uçtan uca otonom ürün ekipleri (cross-functional teams)</strong> kurmanız gerekir. Ekip sınırları ile yazılımın iş alanı sınırları (Bounded Contexts) örtüştüğünde, sistem mimarisi de doğal olarak modüler ve bağımsız bir yapıya evrilir.</p><h3>Sonuç</h3><p>Bir yazılım mimarisini değiştirmek istediğinizde yalnızca kod bloklarını yeniden düzenlemek yetmez. Ekipler arasındaki duvarları, raporlama zincirlerini ve iletişim alışkanlıklarını değiştirmediğiniz sürece sistem eninde sonunda eski organizasyonel reflekslerine geri dönecektir.</p><p>Mimari kararlar teknik tercihlerden ibaret değildir; bir organizasyonun insan ilişkilerinin dijital dünyadaki izdüşümüdür.</p><p>İyi bir mimar, yalnızca sınıfların ve servislerin nasıl konuşacağını değil; insanların birbirleriyle nasıl iletişim kurduğunu da hesaba katmak zorundadır.</p><p>Yazılım Mühendisliğinin Kanunları — 10</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22">Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Conway’s Law — Laws of Software Engineering</li><li>Melvin E. Conway, How Do Committees Invent? (F. D. Thompson Publications, Inc., 1968)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5dfbd4a4d7b9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #9 Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-9-zawinskis-law-yaz%C4%B1l%C4%B1mlar-neden-s%C3%BCrekli-%C5%9Fi%C5%9Fer-ve-e-posta-okumaya-da9ece6feb22?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/da9ece6feb22</guid>
            <category><![CDATA[yazılım-mühendisliği]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[complexity]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Sat, 24 Oct 2026 16:58:58 GMT</pubDate>
            <atom:updated>2026-10-24T16:58:58.126Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #9 Zawinski’s Law: Yazılımlar Neden Sürekli Şişer ve E-posta Okumaya Çalışır?</h3><p>Odaklanmış, hızlı ve tek bir amaca hizmet eden harika bir araç geliştirdiğinizi düşünün.</p><p>İlk başta her şey yolundadır: Kullanıcılar aracın hafifliğini ve sadeliğini över. Ancak zaman geçtikçe talepler gelmeye başlar:<em>”Projeyi çalışma arkadaşımla paylaşabilsem…”, “Şuraya bir yorum alanı eklesek…”, “Değişiklik olduğunda bana bildirim/e-posta gelse…”</em></p><p>Bir süre sonra fark edersiniz ki o yalın araç; içinde sohbet pencereleri, bildirim merkezleri ve entegrasyonlar barındıran devasa bir iletişim platformuna dönüşmüş.</p><p>Netscape’in ilk geliştiricilerinden Jamie Zawinski (jwz) tarafından 1995 yılında ortaya atılan <strong>Zawinski’s Law (Zawinski Yasası)</strong>, yazılımların bu kaçınılmaz şişme eğilimini mizahi ama son derece gerçekçi bir tespitle açıklar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v7dm7WP6htAK_MlcLajE4A.jpeg" /></figure><p>İlkenin orijinal ifadesi şöyledir:</p><blockquote><em>Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.</em></blockquote><p>Türkçesiyle:</p><blockquote><em>Her program, e-posta okuyabilecek seviyeye gelene kadar genişlemeye çalışır. Bu şekilde genişleyemeyen programlar, genişleyebilenlerle değiştirilir.</em></blockquote><p>Zawinski bu ilkeyi ortaya attığında internetin erken dönemleriydi ve “iletişim” denince akla gelen temel protokol e-postaydı. Ancak kuralın işaret ettiği asıl dinamik; <strong>kapsam şişmesi (scope creep / feature bloat)</strong> ve yazılımların er ya da geç kullanıcılar arası iletişimi kendi içine çekme arzusudur.</p><h3>1. Tarihsel Çıkış Noktası: Emacs ve Netscape</h3><p>Zawinski bu kuralı gözlemlerken iki büyük örneğe dayanıyordu:</p><ul><li><strong>Emacs:</strong> Başlangıçta yalnızca bir metin düzenleyici olan Emacs; zamanla içine dosya yöneticisi, oyunlar, takvim ve en sonunda e-posta/haber okuyucu (Gnus) alarak adeta kendi başına bir işletim sistemine dönüştü.</li><li><strong>Netscape Navigator:</strong> Sadece web sayfalarını gezinmek için tasarlanan tarayıcı, kullanıcıların tarayıcıdan çıkmadan iletişim kurma talepleri neticesinde kısa sürede <em>Netscape Mail &amp; News</em> bileşenini içine alarak devasa bir internet paketine (suite) evrildi.</li></ul><p>Zawinski’nin vurguladığı kritik detay şuydu: Bir araç ne kadar iyi olursa olsun, kullanıcılar işlerini yaparken başka bir programa geçmek (context switching) istemiyordu.</p><h3>2. Modern Dünyada “E-posta Okumak” Ne Anlama Geliyor?</h3><p>Bugün Zawinski Yasası’ndaki “e-posta”, genel olarak <strong>iletişim, iş birliği ve entegrasyon</strong> anlamına gelir:</p><ul><li>Kod editörleri (VS Code, JetBrains) artık sadece kod yazmıyor; canlı iş birliği (Live Share), entegre chat ve yapay zeka asistanları barındırıyor.</li><li>Tasarım araçları (Figma), çizim aracı olmanın ötesine geçip sesli sohbet ve anlık mesajlaşma platformlarına dönüştü.</li><li>Proje yönetim araçları (Notion, Trello, Jira) kendi içinde e-posta gönderen, bildirim üreten ve mesajlaşılan merkezler hâline geldi.</li></ul><p>Modern bir yazılımın “e-posta okumaya başlaması”, onun artık tek bir işlevi yerine getiren saf bir araç olmaktan çıkıp bir <strong>çalışma ortamı</strong> olmaya soyunmasıdır.</p><h3>3. Unix Felsefesi ile Pazar Gerçeğinin Çatışması</h3><p>Yazılım mühendisliğinin altın kurallarından biri Unix felsefesidir: <em>“Bir işi yap ve onu en iyi şekilde yap.”</em></p><p>Mühendislik açısından odaklanmış, küçük ve hafif araçlar ideal olanıdır. Ancak Zawinski Yasası, mühendislik idealleriyle pazar gerçekleri arasındaki acımasız çatışmayı hatırlatır: Genişlemeyi reddeden ve yalnızca tek bir işe odaklanan araçlar teknik olarak daha zarif kalabilir; fakat kullanıcılar genellikle “her işini tek bir pencerede çözen”, daha şişkin (bloated) araçları tercih eder. Bu yüzden genişlemeyen araçlar, genişleyenler tarafından pazarın dışına itilme riskiyle karşı karşıya kalır.</p><h3>Şişkinliğin (Software Bloat) Mühendislik Bedeli</h3><p>Bir yazılımın sürekli yeni iletişim ve işlev katmanları ekleyerek büyümesi bedelsiz değildir:</p><ul><li><strong>Güvenlik Yüzeyinin Genişlemesi (Attack Surface):</strong> E-posta okumak veya dış dünyadan gelen mesajları/içerikleri işlemek; HTML parsing, dosya indirme ve ağ protokolleri demektir. Eklenen her yeni iletişim kanalı, sisteme yeni güvenlik açığı potansiyelleri getirir.</li><li><strong>Kaynak Tüketimi:</strong> Başlangıçta birkaç megabayt bellek tüketen hafif bir araç, içine tarayıcı motorları (Electron gibi), mesajlaşma kuyrukları ve arka plan işçileri eklendikçe yüzlerce megabayt RAM tüketen bir canavara dönüşür.</li><li><strong>Çekirdek Odak Kaybı:</strong> Ekip zamanının büyük kısmını ürünün asıl varoluş amacını geliştirmeye değil; bildirim altyapısını, sohbet protokollerini ve kullanıcı izinlerini yönetmeye harcamaya başlar.</li></ul><h3>Sonuç</h3><p>Zawinski Yasası, yazılımların zaman içinde karmaşıklaşmasının ve şişmesinin kaçınılmaz bir pazar yerçekimi olduğunu gösterir.</p><p>Bir yazılım mimarı veya ürün geliştiricisi olarak görevimiz bu baskıyı tamamen görmezden gelmek değildir. Asıl hüner; kullanıcıların iletişim ve entegrasyon ihtiyaçlarını karşılarken ürünün çekirdek değerini şişkinlik (bloat) altında ezilmekten koruyabilmektir.</p><p>Her program eninde sonunda e-posta okumak isteyebilir; ancak iyi bir mühendislik vizyonu, programın ne zaman durması gerektiğini bilen sınırlara sahip olmalıdır.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li><li><a href="https://www.google.com/search?q=https://medium.com/%40gokhan-gurgec/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883">Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Zawinski’s Law — Laws of Software Engineering</li><li>Jamie Zawinski, The Netscape Dormando Group Notes (1995)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da9ece6feb22" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #8 Law of Unintended Consequences: İstenmeyen Sonuçlar Yasası]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-8-law-of-unintended-consequences-i%CC%87stenmeyen-sonu%C3%A7lar-yasas%C4%B1-a1e9d2841883?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/a1e9d2841883</guid>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[yazılım-mimarisi]]></category>
            <category><![CDATA[systems-thinking]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Fri, 23 Oct 2026 16:01:03 GMT</pubDate>
            <atom:updated>2026-10-23T16:01:03.130Z</atom:updated>
            <content:encoded><![CDATA[<p>Üretim ortamında (production) kritik bir servis anlık bir ağ dalgalanması nedeniyle hata veriyor. Geliştirici ekibi olarak hemen harika ve iyi niyetli bir çözüm buluyoruz:</p><p><em>“İstek başarısız olursa istemci hemen 3 kez daha denesin (retry mekanizması).”</em></p><p>Değişikliği canlıya alıyoruz. İlk birkaç gün her şey mükemmel görünüyor; geçici hatalar kullanıcıya yansımadan çözülüyor. Ancak bir gün arka plandaki veritabanı yoğunluktan dolayı hafifçe yavaşlıyor. Normalde dakikada 1.000 istek alan sistem, devreye giren agresif retry politikası yüzünden bir anda 4.000 istekle boğulmaya başlıyor.</p><p>Yavaşlayan servis toparlanmak yerine tamamen çöküyor. Kendi ellerimizle yazdığımız iyileştirme, kendi backend’imize yapılmış bir DDoS saldırısına dönüşüyor.</p><p>İşte bu senaryo, yazılım mühendisliğinde ve karmaşık sistemlerde sıklıkla karşımıza çıkan <strong>Law of Unintended Consequences (İstenmeyen Sonuçlar Yasası)</strong> ilkesinin tipik bir örneğidir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PSG4YIOd4yr09Zu1APdX8w.jpeg" /></figure><p>İlke:</p><blockquote><em>Whenever you change a complex system, expect surprise</em></blockquote><p>Türkçesiyle özet şu şekildedir:</p><blockquote><em>“Karmaşık bir sisteme yapılan herhangi bir amaçlı müdahale, her zaman öngörülmeyen ve hedeflenmemiş sonuçlar (yan etkiler) doğurur.”</em></blockquote><p>Bu sonuçlar bazen beklenmedik bir fayda sağlasa da, mühendislik dünyasında genellikle iki tehlikeli biçimde ortaya çıkar:</p><ol><li><strong>Geri tepen çözümler (Perverse Results / Kobra Etkisi):</strong> Çözümün, çözmeye çalıştığı problemi daha da büyütmesi.</li><li><strong>Beklenmeyen yan etkiler (Unexpected Drawbacks):</strong> Bir problemi çözerken tamamen alakasız başka bir kritik alanı bozması.</li></ol><p>Yazılım geliştirme süreçlerinde iyi niyetle aldığımız kararların nasıl ters teptiğine ve karmaşıklığın bunu nasıl tetiklediğine yakından bakalım.</p><h3>1. Performans İçin Cache Eklemek: Veritabanını Kurtarırken Belleği ve Tutarlılığı Kaybetmek</h3><p>Veritabanı sorguları yavaşladığında akla gelen ilk refleks önbellekleme (caching) yapmaktır. Redis veya Memcached ekleyerek sorgu sürelerini mikrosaniyelere düşürmeyi hedefleriz.</p><p>Ancak cache eklemek, sisteminize yeni bir durum (state) ve bağımlılık katmanı ekler:</p><ul><li><strong>Cache Invalidation:</strong> Veritabanındaki veri güncellendiğinde cache’teki veriyi temizlemek yazılımın en zor problemlerinden birine dönüşür. Kullanıcılar güncellenmemiş (stale) veriler görmeye başlar.</li><li><strong>Thundering Herd (Cache Stampede):</strong> Popüler bir verinin cache süresi (TTL) dolduğu anda, gelen binlerce istek aynı milisaniyede veritabanına hücum eder ve normalde çalışacak olan veritabanını bir anda kilitler.</li></ul><p>Performansı artırmak amacıyla atılan basit bir adım, dağıtık veri tutarlılığı ve bellek yönetimi krizini beraberinde getirir.</p><h3>2. Yerel Optimizasyonların Küresel Bedeli: İndeksler ve Kilitler (Locks)</h3><p>Karmaşık sistemlerde bir noktayı optimize etmek, genellikle başka bir noktaya gizli bir yük bindirir:</p><ul><li><strong>Sorgu Optimizasyonu vs. Yazma Maliyeti:</strong> Yavaş çalışan bir SELECT sorgusunu hızlandırmak için tabloya yeni indeksler ekleyebilirsiniz. Okuma performansı anında düzelir. Ancak her yeni indeks; INSERT, UPDATE ve DELETEişlemlerinde diske ekstra yazma, replikasyon gecikmesi ve veritabanı kilitlenme sürelerinde artış demektir.</li><li><strong>Race Condition Çözümü vs. Deadlock:</strong> Çok iş parçacıklı (multithreaded) bir yapıda yarış durumunu engellemek için kod bloklarına kilit (mutex/lock) koyabilirsiniz. Hatalı veri yazımını engellersiniz, ancak kilit süreleri uzadığında sistem genelinde <em>thread starvation</em> veya <em>deadlock</em> (kilitlenme) yaşanabilir.</li></ul><p>Bir katmandaki iyileştirme, görünmez bağlarla bağlı olduğu diğer katmanda performans darboğazına dönüşür.</p><h3>3. İkinci Dereceden Düşünme (Second-Order Thinking)</h3><p>Karmaşık sistemlerde doğrusal düşünce tarzı iflas eder:</p><ul><li><strong>Birinci Dereceden Düşünme (First-Order):</strong> “X problemi var, Y çözümünü uygularsam X çözülür.”</li><li><strong>İkinci Dereceden Düşünme (Second-Order):</strong> “Y çözümünü uygularsam X çözülecek. <strong>Peki ya sonra ne olacak?</strong> Bu çözüm diğer servisleri, ağ trafiğini, kullanıcı davranışlarını ve veri tutarlılığını nasıl etkileyecek?”</li></ul><p>Sistem mühendisliğinde olgunluk, yalnızca problemi anlık olarak çözmek değil; çözümün sistemin geri kalanında tetikleyeceği zincirleme reaksiyonları öngörebilmektir.</p><h3>Bu Tuzaktan Nasıl Kaçınabiliriz?</h3><p>İstenmeyen sonuçları sıfıra indirmek karmaşık sistemlerde imkansızdır; ancak etkilerini sınırlandırmak mümkündür:</p><ul><li><strong>Geri Alınabilirlik (Reversibility):</strong> Mimari kararları iki yönlü kapılar (two-way doors) gibi tasarlayın. Bir değişiklik beklenmeyen bir etki yarattığında sistemi dakikalar içinde eski hâline döndürebilecek esneklikte (Feature Flags, Canary Deployment) olun.</li><li><strong>Defansif Tasarım:</strong> İstemcilere retry mekanizması ekliyorsanız, araya mutlaka rastgele bekleme süresi koyan <em>Exponential Backoff</em> ve <em>Jitter</em> ekleyin. Servislerin önüne aşırı yüklenmeyi engelleyecek <em>Rate Limiter</em> ve <em>Circuit Breaker</em> yerleştirin.</li><li><strong>Gözlemlenebilirlik (Observability):</strong> Yalnızca hedeflenen metriği değil, komşu sistemlerin durumunu da izleyin.Örneğin sorgu sürelerini düşürmek için cache eklediğinizde veritabanı CPU kullanımını, bellek doluluğunu ve cache miss oranlarını eş zamanlı takip edin.</li></ul><h3>Sonuç</h3><p>Yazılım sistemleri izole edilmiş kod parçalarından ibaret değildir; birbiriyle sürekli etkileşim hâlinde olan dinamik ekosistemlerdir.</p><p>Bir mimar veya mühendis olarak masaya oturup bir bileşeni değiştirdiğimizde kendimize sormamız gereken soru yalnızca <em>“Bu kod çalışıyor mu?”</em> olmamalıdır. Asıl kritik soru şudur:</p><p><strong>“Bu çözüm, sistemin hangi görünmez dengesini bozacak?”</strong></p><p>İyi bir yazılım tasarımı, yalnızca planlanan hedefe ulaşan tasarım değil; planlanmamış etkileri yönetecek kadar esnek ve dayanıklı olan tasarımdır.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li><li><a href="https://medium.com/@gokhan-gurgec/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12">Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Law of Unintended Consequences — Laws of Software Engineering</li><li>Robert K. Merton, The Unanticipated Consequences of Purposive Social Action (1936)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a1e9d2841883" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laws of Software Engineering #7 Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük…]]></title>
            <link>https://gokhan-gurgec.medium.com/laws-of-software-engineering-7-fallacies-of-distributed-computing-da%C4%9F%C4%B1t%C4%B1k-sistemlerin-8-b%C3%BCy%C3%BCk-cce980fbeb12?source=rss-b5f116717c9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/cce980fbeb12</guid>
            <category><![CDATA[yazılım-mimarisi]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[software-design]]></category>
            <category><![CDATA[sofware-engineering]]></category>
            <category><![CDATA[yazılım-geliştirme]]></category>
            <dc:creator><![CDATA[Gökhan Gürgeç]]></dc:creator>
            <pubDate>Wed, 21 Oct 2026 19:56:38 GMT</pubDate>
            <atom:updated>2026-10-21T19:56:38.199Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laws of Software Engineering #7 Fallacies of Distributed Computing: Dağıtık Sistemlerin 8 Büyük Yanılgısı</h3><p>Monolitik bir uygulamada bir fonksiyonu çağırdığınızda sonuç oldukça basittir: İşlem ya anında gerçekleşir ya da bir hata fırlatılır. Her şey aynı bellek alanında, aynı işlemcinin kontrolü altındadır.</p><p>Peki ya uygulamanızı mikroservislere böler ve o fonksiyonu başka bir sunucuya taşırsanız ne olur?</p><p>Birçok geliştirici için ilk varsayım şudur: <em>“Sadece bir HTTP isteği atacağım, aynı veriyi alıp işime devam edeceğim.”</em></p><p>Oysa işin içine ağ (network) girdiğinde, yazılım geliştirmenin kuralları tamamen değişir. Lokal ortamınızda (localhost) kusursuz çalışan kodunuz, üretim ortamındaki (production) gerçek bir ağa çıktığında hiç beklemediğiniz şekillerde kırılmaya başlar.</p><p>1990&#39;ların ortalarında Sun Microsystems mühendisleri (özellikle L. Peter Deutsch ve James Gosling), geliştiricilerin dağıtık sistemler tasarlarken düştükleri temel yanılgıları bir liste hâline getirdiler. Bugün bu liste, <strong>Fallacies of Distributed Computing (Dağıtık Hesaplamanın Yanılgıları)</strong> olarak bilinir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vfdi-tWEhvxmL8q5UuqTLQ.jpeg" /></figure><p>İlkenin temel önermesi şudur:</p><blockquote><em>Geliştiriciler, dağıtık bir sistem tasarlarken ağın kusursuz olduğunu varsayarak 8 temel yanılgıya düşerler. Bu varsayımların hepsi yanlıştır ve eninde sonunda sistemin çökmesine neden olur.</em></blockquote><p>Bu 8 yanılgı sadece tarihi bir belge değildir; bulut bilişim ve mikroservis mimarilerinin dünyayı yönettiği günümüzde her zamankinden daha geçerlidir. Gelin bu 8 yanılgıyı yakından inceleyelim.</p><h3>1. Ağ güvenilirdir (The network is reliable)</h3><p>Lokal bir metot çağrısı neredeyse hiçbir zaman “yarı yolda” kaybolmaz. Ancak ağ üzerinden gönderilen bir istek; kopan bir kablo, bozulan bir switch, çöken bir yönlendirici (router) veya anlık bir yoğunluk nedeniyle hedefine ulaşamayabilir. Daha da kötüsü, istek hedefe ulaşır, işlem başarıyla yapılır ancak <strong>yanıt</strong> size dönerken ağ kopabilir.</p><p>Eğer ağın hep çalışacağını varsayarsanız, uygulamanız sonsuza kadar yanıt bekleyebilir. Bu yüzden dağıtık sistemlerde <em>Timeout</em> (zaman aşımı) ve <em>Retry</em> (yeniden deneme) mekanizmaları bir seçenek değil, zorunluluktur. İşlemlerin tekrarlanması durumunda verinin bozulmaması için API’lerinizi <em>Idempotent</em> (tekrarlanabilir) tasarlamanız gerekir.</p><h3>2. Gecikme sıfırdır (Latency is zero)</h3><p>Bellek içi (in-memory) bir fonksiyonu çağırmak mikrosaniyeler sürer. Oysa aynı işlemi ağ üzerinden başka bir veri merkezindeki servise yaptırmak milisaniyeler, hatta saniyeler alabilir.</p><p>Siparişleri listelerken, her siparişin kullanıcı bilgisini almak için User servisine tek tek HTTP isteği attığınızı düşünün. Lokal veritabanında milisaniyeler sürecek bu işlem, ağ üzerindeki gecikmelerin üst üste binmesiyle uygulamanızı tamamen felç edebilir. Dağıtık sistemlerde ağ üzerinden yapılan çağrı sayısını (network round-trip) minimize etmek ve verileri toplu (batch) getirmek şarttır.</p><h3>3. Bant genişliği sonsuzdur (Bandwidth is infinite)</h3><p>Videoların 4K, internetin gigabit hızlarında olduğu bir çağda bant genişliğini dert etmemek kolaydır. Ancak binlerce mikroservisin sürekli birbirine devasa JSON’lar fırlattığı bir arka plan sisteminde, bant genişliği hızla tükenebilir.</p><p>İhtiyacınız olmayan tüm veri tabanı kolonlarını ağ üzerinden diğer servise gönderiyorsanız, bir süre sonra ağ donanımlarınızın sınırlarına takılırsınız. Yalnızca ihtiyaç duyulan veriyi ileten GraphQL gibi teknolojiler veya gRPC gibi sıkıştırılmış ikili (binary) protokoller bu yanılgıyı aşmak için doğmuştur.</p><h3>4. Ağ güvenlidir (The network is secure)</h3><p>Lokal ağınızda sunucuların birbiriyle şifresiz (HTTP) konuşması size güvenli gelebilir. Ancak günümüzde sistemler bulut üzerinde, farklı bölgelere yayılmış (multi-region) ve internete daha açık haldedir.</p><p>Ağı güvenli varsayıp servisler arası iletişimi kimlik doğrulamasız (authentication olmadan) yapmak, “Sıfır Güven” (Zero Trust) felsefesine tamamen aykırıdır. Ağ üzerindeki her paketin dinlenebileceğini (sniffing) veya değiştirilebileceğini varsayarak TLS/mTLS (karşılıklı şifreleme) kullanmak zorunludur.</p><h3>5. Topoloji değişmez (Topology doesn’t change)</h3><p>Bugün veritabanınız IP’si sabit olan 1. rack’takı sunucuda çalışıyor olabilir. Yarın bulut sağlayıcınız o sunucuyu kapatıp başka bir IP’den yeniden başlatabilir. Konteyner mimarilerinde (Kubernetes) pod’ların IP adresleri dakikalar içinde değişir.</p><p>Topolojinin sabit olduğunu varsayıp kodun içine IP adreslerini (hardcode) gömerseniz sisteminiz ilk güncellemede çöker. Bu yüzden DNS, Load Balancer ve <em>Service Discovery</em> (servis keşfi) gibi mekanizmaları kullanılır. Böylece servisler fiziksel IP’lere değil, mantıksal isimlere güvenir.</p><h3>6. Tek bir sistem yöneticisi vardır (There is one administrator)</h3><p>Küçük bir uygulamada sunucuyu yöneten, veritabanına bakan ve kodu yazan kişi aynı olabilir. Ancak dağıtık bir sistemde farklı servisler, farklı şirketler (SaaS ürünleri) veya farklı ekipler tarafından yönetilir.</p><p>Veritabanı ekibi sizden habersiz bir tabloyu güncellediğinde veya ödeme entegratörü API versiyonunu değiştirdiğinde sisteminiz çökebilir. Mimarilerimizi bu dış bağımlılıkların her an kırılabileceğini (ve muhatap bulamayacağımızı) hesaplayarak tasarlamalı, sistemleri birbirine çok sıkı bağlamaktan (tight coupling) kaçınmalıyız.</p><h3>7. Taşıma maliyeti sıfırdır (Transport cost is zero)</h3><p>İki servis birbiriyle konuşurken veriyi JSON’a çevirmek (Serialization), ağdan göndermek ve karşı tarafta tekrar objeye dönüştürmek (Deserialization) zorundadır. Bu işlem CPU döngüleri, bellek (RAM) ve zaman harcar.</p><p>Ayrıca bulut dünyasında taşıma maliyeti kelimenin tam anlamıyla “paradır”. AWS, Azure veya Google Cloud üzerinde farklı bölgeler (regions) veya hatta aynı bölgedeki farklı erişilebilirlik alanları (availability zones) arasında gigabaytlarca veri transfer ettiğinizde, ay sonunda devasa ağ faturalarıyla karşılaşırsınız.</p><h3>8. Ağ homojendir (The network is homogeneous)</h3><p>Ağdaki tüm cihazların, sunucuların, router’ların ve işletim sistemlerinin aynı standartlarda çalıştığını varsaymaktır. Oysa ağın bir ucu en son model bir bulut sunucusuyken, diğer ucu 3G ile bağlanan eski bir cep telefonu, bir IoT cihazı veya farklı bir iletişim protokolü kullanan eski bir legacy (miras) sistem olabilir. Paket boyutları (MTU), iletim hızları ve bağlantı kaliteleri sürekli değişkenlik gösterir.</p><h3>Sonuç: Hata İçin Tasarlamak (Design for Failure)</h3><p>Fallacies of Distributed Computing bize çok net bir mesaj verir: Dağıtık sistemlerde hata bir ihtimal değil, bir <strong>kesinliktir</strong>.</p><p>Mikroservislere geçmek, kodunuzu parçalara ayırmak kadar basit değildir. Ağı mimarinin merkezine koymak ve şu soruları sormak gerekir:</p><ul><li>Ağ koparsa sistem nasıl ayakta kalacak?</li><li>İstek yavaşlarsa veya kaybolursa sistem sonsuza kadar bekleyecek mi?</li><li>Servisler birbirini kilitlerse bu hatayı nasıl izole edeceğiz (Circuit Breaker)?</li></ul><p>İyi bir mimari, ağın kusursuz olduğuna inanan değil; ağın her an çökebileceğini kabul edip ona göre önlem alan mimaridir.</p><p><strong>Serinin önceki yazıları:</strong></p><ul><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-1-galls-law-ae6cbf698766">Gall’s Law: Karmaşık Sistemler Neden Basit Başlamalı?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-2-hyrums-law-api-nizin-dok%C3%BCmante-edilmemi%C5%9F-s%C3%B6zle%C5%9Fmeleri-989fe14249f9">Hyrum’s Law: API’nizin Dokümante Edilmemiş Sözleşmeleri</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-3-law-of-leaky-abstractions-soyutlamalar-her-%C5%9Feyi-gizleyemez-f326f641a62a">The Law of Leaky Abstractions: Soyutlamalar Her Şeyi Gizleyemez</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-4-teslers-law-karma%C5%9F%C4%B1kl%C4%B1k-yok-olmaz-yer-de%C4%9Fi%C5%9Ftirir-a139a3f77fdf">Tesler’s Law: Karmaşıklık Yok Olmaz, Yer Değiştirir</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-5-cap-theorem-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-neden-her-%C5%9Feye-sahip-olamay%C4%B1z-72006e793774">CAP Theorem: Dağıtık Sistemlerde Neden Her Şeye Sahip Olamayız?</a></li><li><a href="https://gokhan-gurgec.medium.com/laws-of-software-engineering-6-second-system-effect-i%CC%87kinci-sistemi-tasarlarken-neden-a%C5%9F%C4%B1r%C4%B1ya-1fd0b40dde6d">Second-System Effect: İkinci Sistemi Tasarlarken Neden Aşırıya Kaçarız?</a></li></ul><p><strong>Kaynaklar</strong></p><ul><li>Fallacies of Distributed Computing — Laws of Software Engineering</li><li>Arnon Rotem-Gal-Oz, Fallacies of Distributed Computing Explained</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cce980fbeb12" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>