Ders 04 / 11
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ı.
İçindekiler
Ö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
// 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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.