---
title: 'Mimar ve Geliştirici İlişkisi'
source: 'https://academia.sh/tr/kurslar/mimarin-rolu/mimar-ve-gelistirici-iliskisi'
course: 'Mimarın Rolü'
language: tr
updated: '2026-08-17T18:10:33+00:00'
license: 'CC BY-SA 4.0'
---

# Mimar ve Geliştirici İlişkisi

Fildişi kule sorununun bir bilgi farkı olarak modellenmesi: karar verenin bildiği ithal grafiği ile gerçek grafiğin ayrı tutulması, koda dokunan ve dokunmayan iki düzenin aynı değişim dizisinde koşturulması, ölü doğan karar oranı, ortalama bilgi farkı ve geri bildirim gecikmesinin sayılması.

Önceki dersin gözetim düzeni bir şeyi sessizce varsaydı: kısıtları yazan, ihlalleri sayan ve geri
alan kişinin ithal grafiğini gerçekten görebildiğini. Bu varsayım her düzende doğru değil. Karar
veren kişi koda hiç dokunmuyorsa, kararını verdiği andaki grafik ile aylar sonraki grafik arasında
bir fark birikir.

**Fildişi kule** bu farkın adıdır. Genellikle bir kişilik kusuru gibi anlatılır — uzaktan
konuşan, uygulamadan kopuk bir tutum. Bu derste kusur değil, ölçülebilir bir büyüklük olarak
alınıyor: karar verenin bildiği grafik ile gerçek grafik arasındaki kenar farkı. Fark büyüdükçe
kararların ne kadarının daha yayımlandığı anda uygulanamaz olduğu sayılabilir.

## Ölü Doğan Karar

Bir karar, gerçekleşmiş bir durumu yasakladığında ölü doğar. Kütüphane ağı modelinde bu somut bir
biçim alır: mimar "personel ucu şube envanterine doğrudan bakmasın" der; oysa o kenar üç ay önce
eklenmiştir ve mimar bunu bilmemektedir. Karar duyurulur, ekip kararın zaten ihlal edildiğini
söyler, karar geri çekilir. Kararın yanlış olması gerekmez — geç olması yeter.

Model bunu şöyle kurar. İki grafik tutulur: **gerçek** grafik ve mimarın **bildiği** grafik.
Geliştiriciler her tur kısayol ekler; bir kısayol, dolaylı olarak zaten erişilen bir modüle
doğrudan kenar çekmektir. Mimar her tur bir karar verir ve kararını yalnız bildiği grafiğe bakarak
seçer. Karar, seçtiği kenar gerçek grafikte zaten varsa ölü sayılır (**MN10**).

İki düzen karşılaştırılır. **Koda dokunan mimar** her tur kod üzerinde çalışır ve eklenen
kenarların %95'ini görür. **Koda dokunmayan mimar** altı turda bir rapor alır ve raporda
kenarların %70'i görünür; kalanı hiç görünmez (**MN11**). İki düzen aynı kısayol dizisini alır;
dizi bir kez üretilir ve tohumu yazılıdır.

## Ölçüm

```js
// mimari/bilgi-farki.mjs — karar verenin bildigi grafik ile gercek grafik arasindaki fark
// ITHAL, onceki derslerin MODEL kutuphane agi grafigidir; blok kendi basina calissin diye tekrar veriliyor.
const ITHAL = {
  yapilandirma: [], zaman: [], kayit: ["yapilandirma"],
  "veri-erisim": ["yapilandirma", "kayit"], "olay-yolu": ["yapilandirma", "kayit"],
  "kimlik-dogrulama": ["veri-erisim", "yapilandirma", "kayit"], yetki: ["kimlik-dogrulama"],
  "katalog-baglayici": ["yapilandirma", "kayit"],
  "katalog-onbellek": ["katalog-baglayici", "zaman"],
  "odunc-kural": ["yapilandirma", "zaman"],
  "odunc-cekirdek": ["odunc-kural", "veri-erisim", "olay-yolu", "zaman", "katalog-baglayici"],
  ayirtma: ["odunc-cekirdek", "bildirim-kuyruk", "veri-erisim"],
  "uye-kayit": ["veri-erisim", "kayit"],
  "uye-ceza": ["uye-kayit", "odunc-kural", "zaman", "veri-erisim"],
  "sube-envanter": ["veri-erisim", "olay-yolu"],
  "sube-esitleme": ["sube-envanter", "olay-yolu", "katalog-baglayici", "kayit"],
  "bildirim-kuyruk": ["veri-erisim", "olay-yolu"],
  "bildirim-eposta": ["bildirim-kuyruk", "yapilandirma"],
  "rapor-gunluk": ["veri-erisim", "zaman"],
  "rapor-toplu": ["veri-erisim", "sube-envanter", "zaman", "kayit"],
  "web-ucu": ["odunc-cekirdek", "katalog-onbellek", "uye-kayit", "ayirtma", "kimlik-dogrulama"],
  "personel-ucu": ["odunc-cekirdek", "uye-kayit", "uye-ceza", "sube-envanter", "rapor-gunluk",
    "kimlik-dogrulama", "yetki"],
  "kiosk-ucu": ["odunc-cekirdek", "katalog-onbellek", "kimlik-dogrulama"],
  "toplu-is": ["rapor-toplu", "sube-esitleme", "bildirim-kuyruk", "bildirim-eposta"],
};
const MODULLER = Object.keys(ITHAL);

function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; }
const kopya = (g) => Object.fromEntries(MODULLER.map((m) => [m, [...g[m]]]));
const erisir = (g, a, b) => {
  const gor = new Set([a]), yig = [a];
  while (yig.length) for (const h of g[yig.pop()]) if (!gor.has(h)) { gor.add(h); yig.push(h); }
  return gor.has(b);
};
const kisayollar = (g) => {
  const c = [];
  for (const a of MODULLER) for (const b of MODULLER)
    if (a !== b && !g[a].includes(b) && erisir(g, a, b)) c.push([a, b]);
  return c;
};
const kenarSayisi = (g) => MODULLER.reduce((t, m) => t + g[m].length, 0);

const TUR = 18, TURDA = 3, TOHUM = 31337;
const temel = kopya(ITHAL);
const havuz = kisayollar(temel);
const cek = uretec(TOHUM);
const kalan = [...havuz], DIZI = [];
for (let i = 0; i < TUR * TURDA; i++) DIZI.push(kalan.splice(Math.floor(cek() * kalan.length), 1)[0]);
console.log(`temel grafik ${kenarSayisi(temel)} kenar; ${TUR} tur boyunca ${DIZI.length} kisayol eklenir (tohum ${TOHUM})`);

// duzen: gorusKapsami = bir yenilemede gercek kenarlarin gorunen orani, yenileme = kac turda bir
function kosu(gorusKapsami, yenileme) {
  const gercek = kopya(temel), bilinen = kopya(temel);
  const rast = uretec(TOHUM + 1);          // karar cekilisi ve gorunurluk atisi, ayni tohumdan
  const eklemeTuru = new Map();
  let olu = 0, farkToplam = 0;
  const gecikme = [];
  for (let t = 0; t < TUR; t++) {
    const c = kisayollar(bilinen);         // mimar yalnizca bildigi grafige bakar
    const [a, b] = c[Math.floor(rast() * c.length)];
    if (gercek[a].includes(b)) olu++;      // yasaklanan kenar gercekte zaten var: karar olu dogar
    for (const [x, y] of DIZI.slice(t * TURDA, (t + 1) * TURDA)) {
      gercek[x].push(y); eklemeTuru.set(`${x}>${y}`, t);
    }
    farkToplam += kenarSayisi(gercek) - kenarSayisi(bilinen);
    if ((t + 1) % yenileme !== 0) continue;
    for (const x of MODULLER) for (const y of gercek[x])
      if (!bilinen[x].includes(y) && rast() < gorusKapsami) {
        bilinen[x].push(y); gecikme.push(t - eklemeTuru.get(`${x}>${y}`));
      }
  }
  const gorunmeyen = kenarSayisi(gercek) - kenarSayisi(bilinen);
  return { olu, ortFark: farkToplam / TUR, gorunmeyen,
    ortGecikme: gecikme.length ? gecikme.reduce((a, b) => a + b, 0) / gecikme.length : 0 };
}

const sut = (s, n) => String(s).padEnd(n);
const D = kosu(0.95, 1);  // koda dokunan mimar: her tur, kenarlarin %95'i
const K = kosu(0.7, 6);   // koda dokunmayan mimar: alti turda bir, kenarlarin %70'i
console.log(`\n${sut("duzen", 26) + sut("olu karar", 12) + sut("ort. bilgi farki", 18) + sut("gorunmeyen kenar", 18)}ort. gecikme (tur)`);
console.log("-".repeat(92));
for (const [ad, r] of [["koda dokunan mimar", D], ["koda dokunmayan mimar", K]])
  console.log(sut(ad, 26) + sut(`${r.olu}/${TUR}`, 12) + sut(r.ortFark.toFixed(1), 18) +
    sut(r.gorunmeyen, 18) + r.ortGecikme.toFixed(2));

console.log(`\nuygulanabilirlik orani: dokunan ${(((TUR - D.olu) / TUR) * 100).toFixed(0)}%, dokunmayan ${(((TUR - K.olu) / TUR) * 100).toFixed(0)}%`);
console.log(`olu karar farki = ${K.olu - D.olu} karar; bilgi farki ${(K.ortFark / Math.max(D.ortFark, 0.1)).toFixed(1)} kat`);
console.log(`gecikme farki = ${(K.ortGecikme - D.ortGecikme).toFixed(2)} tur; dokunmayan mimarin hic gormedigi kenar = ${K.gorunmeyen}`);
```

```
temel grafik 64 kenar; 18 tur boyunca 54 kisayol eklenir (tohum 31337)

duzen                     olu karar   ort. bilgi farki  gorunmeyen kenar  ort. gecikme (tur)
--------------------------------------------------------------------------------------------
koda dokunan mimar        0/18        3.1               1                 0.02
koda dokunmayan mimar     8/18        13.8              9                 3.40

uygulanabilirlik orani: dokunan 100%, dokunmayan 56%
olu karar farki = 8 karar; bilgi farki 4.5 kat
gecikme farki = 3.38 tur; dokunmayan mimarin hic gormedigi kenar = 9
```

## Üç Sayının Okunması

**Uygulanabilirlik oranı.** Koda dokunmayan mimarın on sekiz kararından sekizi yayımlandığı anda
gerçekleşmiş bir durumu yasaklıyor: oran **%56**. Koda dokunan mimarda bu koşumda hiç ölü karar
çıkmadı, oran %100. İkinci sayının tam yüz olması modelin garantisi değildir — o mimarın da bir
kenarlık kör noktası vardı ve on sekiz çekilişin hiçbiri o kenara denk gelmedi; başka bir tohumla
bir iki ölü karar çıkabilir. Fark yönü ise tohumdan bağımsızdır: raporla beslenen bilgi, kodla
beslenen bilgiden geç ve eksik gelir.

**Bilgi farkı.** Gerçek grafikle bilinen grafik arasındaki ortalama kenar farkı dokunan mimarda
3,1, dokunmayan mimarda 13,8 — **4,5 kat**. Dokunan mimardaki 3,1 sıfır değil, çünkü bir turun
içinde eklenen kenarlar o turun kararından sonra gelir; bu, hiçbir düzende sıfırlanamayan bir
gecikmedir. Dokunmayan mimardaki 13,8 ise birikir: raporlar arasında eklenen kenarlar üst üste
yığılır.

**Görünmeyen kenar.** Sayının en sert olanı budur. Dokunmayan mimarın on sekiz tur sonunda hiç
görmediği kenar sayısı **9**. Bunlar gecikmiş bilgi değil, hiç gelmeyen bilgidir; rapor bir
özettir ve özetin dışında kalan her kenar kalıcı olarak görünmez. Bir sonraki kararın dayanağı
64 + 54 = 118 kenarlık bir grafik değil, dokuz kenarı eksik bir grafiktir.

**Geri bildirim gecikmesi.** Bir kenarın eklenmesiyle karar verene ulaşması arasında geçen
ortalama tur sayısı dokunan mimarda 0,02, dokunmayan mimarda **3,40**. Altı turluk rapor
aralığının ortalama gecikmesi budur. Gecikme yalnız bir bekleme değil: bu üç buçuk tur boyunca
verilen her karar eski bir grafiğe dayanır ve ölü karar oranını besleyen şey de odur.

## Farkın Kapatılması

Ölçünün pratik sonucu, mimarın koda dokunmasının bir tercih değil bir **bilgi tazeleme yolu**
olmasıdır. Fark iki değişkene bağlı: tazeleme sıklığı ve tazelemenin kapsamı. Altı turda bir
rapor almak sıklığı düşürür; raporun kenarların %70'ini taşıması kapsamı düşürür. İkisinden
yalnız birini düzeltmek yetmez — sıklık artırılıp kapsam düşük kalırsa görünmeyen kenar birikmeye
devam eder.

Buradan iki uygulanabilir yol çıkar ve ikisi de ölçülebilir. Birincisi kapsamı yükseltmektir:
kararın dayandığı grafiği rapordan değil doğrudan koddan üretmek — önceki dersin kısıt denetimi
tam olarak bunu yapıyordu ve orada ölçülen 24 saatlik gözetim yükü, aynı zamanda bilgi farkını
kapatan yüktür. İkincisi sıklığı artırmaktır: mimarın kararı vermeden önce kararın dokunduğu
modülleri okuması, yani kararı grafiğin o parçasına bakarak vermesi.

Fildişi kulenin sorunu, kararların kötü olması değildir. Koda dokunmayan mimarın on kararı
uygulanabilirdi; sekizi geç kaldığı için değersizleşti. Aynı kişi aynı ölçütlerle karar veriyor;
değişen tek şey karar anında elindeki grafiğin yaşı.

## Özet

- Fildişi kule bir tutum değil, karar verenin bildiği grafik ile gerçek grafik arasındaki
  ölçülebilir bilgi farkıdır.
- Aynı 54 kısayoldan oluşan değişim dizisinde koda dokunmayan mimarın on sekiz kararından sekizi
  ölü doğdu (uygulanabilirlik %56); koda dokunan mimarda bu koşumda ölü karar çıkmadı.
- Ortalama bilgi farkı 3,1 kenara karşı 13,8 kenar, yani 4,5 kat; dokunan mimardaki 3,1 hiçbir
  düzende sıfırlanamayan tur içi gecikmedir.
- Dokunmayan mimarın on sekiz tur sonunda hiç görmediği kenar sayısı 9; özet rapor bir gecikme
  değil kalıcı bir kör nokta üretir.
- Geri bildirim gecikmesi 0,02 tura karşı 3,40 tur; kararın niteliği değil, karar anındaki
  grafiğin yaşı değişiyor.

## Sonraki Adım

Bu ders kararın **doğduğu** koşulları ölçtü: karar verenin gördüğü grafik ne kadar tazeyse karar o
kadar uygulanabilir. Kararın uygulanabilir olması ise uygulanacağı anlamına gelmiyor. Bir önceki
dersin gözetim ölçümü, kararların kodda karşılığını yitirdiğini gösterdi; o ölçüm kararın ekibe
nasıl ulaştığını hiç ayırt etmedi. Oysa aynı karar bir kural olarak duyurulabilir, gerekçesiyle
yazılabilir ya da uygulanırken birlikte çalışılarak aktarılabilir. Sonraki ders aynı kararı üç
aktarım biçiminde koşturur ve ikisini sayar: doğru uygulanma oranı ve aktarımın maliyeti — kaç
saat, kaç kişi.
