Ders 06 / 11
Mimari Görünümler
Bir soru kümesinin mantıksal, süreç, geliştirme ve fiziksel görünüme uygulanması: her görünümün yanıtladığı soru sayısı, hiçbir görünümün yanıtlamadığı soru sınıfı, iki görünümün birden yanıtladığı yineleme ve tek görünümle yetinmenin kaçırdığı soru sayısı.
İçindekiler
Önceki konu kararı bir nesneye çevirdi: her kararın bağlamı, elenen alternatifi, taşıdığı risk ve bıraktığı borç yazılı duruyor. Bölgesel kütüphane ağının kayıt yığını artık “dış kataloga tek bağlayıcı üzerinden erişilir” ya da “bildirimler kuyruğa yazılır” diyebiliyor. Ama bu yığın tek tek kararların kaydıdır. Altı ay sonra gelen biri hepsini arka arkaya okuduğunda kararların listesini öğrenir, sistemin resmini öğrenmez. “Bir ödünç isteği geldiğinde ne oluyor” sorusunun yanıtı hiçbir kaydın içinde bütün hâlde durmaz; parçaları on ayrı kayda dağılmıştır.
Görünüm bu boşluğu doldurmak için vardır. Bir görünüm, sistemin tek bir ilgi ekseninden bakılmış hâlidir; o eksende anlamlı olan bilgiyi taşır, gerisini taşımaz. Yaygın bölme dörttür: mantıksal görünüm, süreç görünümü, geliştirme görünümü ve fiziksel görünüm. Bu ders dördünü çizimleriyle değil, taşıdıkları bilgi ögeleriyle tanımlar ve tek bir soruyla ölçer: bu görünüm, sonradan gelen birinin sorduğu soruların kaçını yanıtlıyor.
Görünüm Bir Bilgi Kümesidir
Diyagram çizilmiyor. Çizilen şeyin altındaki yapı modelleniyor: bir görünüm, belirli türden bilgi ögelerini taşıyabilen bir kaptır. Mantıksal görünüm modülleri, sorumlulukları, modüller arası bağımlılığı, arayüzleri ve veri varlıklarını taşır — ama bir modülün hangi makinede koştuğunu taşımaz. Süreç görünümü koşan süreçleri, çağrı sırasını, eşzamanlılık noktalarını ve kuyrukları taşır — ama kaynak dizin yapısını taşımaz. Geliştirme görünümü kaynak ağacını, yapı birimlerini, takım sahipliğini ve dış bağımlılıkları taşır. Fiziksel görünüm düğümleri, ağ bağlantılarını, yerleşimi ve kapasiteyi taşır.
Öge listeleri elle seçilmiştir (GR1); başka bir ağda sınırlar biraz farklı çizilebilir. Seçimin kendisi ölçümün girdisidir, sonucu değil.
Soru kümesi de bir veri yapısıdır (GR2). Yirmi dört soru, altı ay sonra gelen birinin gerçekten sorduğu türden: bir kural nerede duruyor, bir istek hangi süreçte işleniyor, bir kod hangi dizinde, bir servis hangi düğümde. Her sorunun yanıtı için gereken bilgi ögeleri yazılıdır. Kural tek cümledir (GR3): bir görünüm bir soruyu ancak gereken ögelerin hepsini taşıyorsa yanıtlar. Yarısını taşımak yanıt değildir; okuyucu kalanı başka bir yerden bulmak zorundadır.
// gorunum/model.mjs — MODEL bolgesel kutuphane agi: dort gorunumun tasidigi bilgi // ogeleri ve alti ay sonra gelen birinin sordugu soru kumesi. Gercek bir kurum // degildir; oge listeleri ve sorular elle secilmistir. // Bir gorunum yalnizca listesindeki bilgi ogelerini tasir (GR1). export const GORUNUM = { mantiksal: ["modul", "sorumluluk", "modul-bagimliligi", "arayuz", "veri-varligi"], surec: ["modul", "arayuz", "surec", "cagri-sirasi", "es-zamanlilik", "kuyruk"], gelistirme: ["modul", "kaynak-agaci", "yapi-birimi", "takim", "dis-bagimlilik"], fiziksel: ["dugum", "ag-baglantisi", "yerlesim", "kapasite", "yapi-birimi"], }; export const GORUNUMLER = Object.keys(GORUNUM); // SORU — gerek: yaniti icin gereken bilgi ogeleri (GR2). Bir gorunum soruyu ancak // gereken ogelerin hepsini tasiyorsa yanitlar (GR3). export const SORU = [ { id: "S01", metin: "odunc suresi kurali hangi modulde duruyor", gerek: ["modul", "sorumluluk"] }, { id: "S02", metin: "ceza hesabi uye kaydina bagli mi", gerek: ["modul", "modul-bagimliligi"] }, { id: "S03", metin: "katalog baglayicisi disa hangi arayuzu veriyor", gerek: ["modul", "arayuz"] }, { id: "S04", metin: "uye ile odunc kaydi arasindaki iliski ne", gerek: ["veri-varligi"] }, { id: "S05", metin: "sistemde hangi adlandirilmis parcalar var", gerek: ["modul"] }, { id: "S06", metin: "ayirtma istegi hangi surecte islenir", gerek: ["modul", "surec"] }, { id: "S07", metin: "bildirim kuyrugunu hangi surec tuketir", gerek: ["kuyruk", "surec"] }, { id: "S08", metin: "iki sube ayni kopyayi ayni anda verirse ne kilitlenir", gerek: ["es-zamanlilik"] }, { id: "S09", metin: "odunc verme akisinda cagrilar hangi sirayla gider", gerek: ["cagri-sirasi"] }, { id: "S10", metin: "kiosk ucundan gelen cagri es zamansiz mi", gerek: ["cagri-sirasi", "kuyruk"] }, { id: "S11", metin: "ceza hesabi kodu hangi dizinde duruyor", gerek: ["kaynak-agaci"] }, { id: "S12", metin: "bu module hangi takim bakiyor", gerek: ["modul", "takim"] }, { id: "S13", metin: "kac ayri yapi birimi var", gerek: ["yapi-birimi"] }, { id: "S14", metin: "katalog baglayicisi hangi dis kutuphaneyi kullaniyor", gerek: ["modul", "dis-bagimlilik"] }, { id: "S15", metin: "odunc servisi hangi dugumde kosuyor", gerek: ["yerlesim", "dugum"] }, { id: "S16", metin: "sube ucu ile merkez arasindaki bag hangi tur", gerek: ["ag-baglantisi", "dugum"] }, { id: "S17", metin: "merkez dugumunun kapasitesi ne", gerek: ["dugum", "kapasite"] }, { id: "S18", metin: "hangi yapi birimi hangi dugume yerlesir", gerek: ["yapi-birimi", "yerlesim"] }, { id: "S19", metin: "ceza hesabina bakan takim hangi dugumdeki yayini etkiler", gerek: ["takim", "yerlesim"] }, { id: "S20", metin: "odunc akisindaki hangi cagri ag uzerinden gider", gerek: ["cagri-sirasi", "ag-baglantisi"] }, { id: "S21", metin: "hangi veri varligi hangi dugumde durur", gerek: ["veri-varligi", "yerlesim"] }, { id: "S22", metin: "kilit tutulan modulun sorumlulugu ne", gerek: ["es-zamanlilik", "sorumluluk"] }, { id: "S23", metin: "bir yapi birimini yayinlamak kac sureci yeniden baslatir", gerek: ["yapi-birimi", "surec"] }, { id: "S24", metin: "ayirtma kuyrugunun tikanmasi hangi takimin isi", gerek: ["kuyruk", "takim"] }, ]; export const OGELER = [...new Set(Object.values(GORUNUM).flat())].sort(); export const yanitlar = (g, s) => s.gerek.every((o) => GORUNUM[g].includes(o)); export const yanitlayan = (s) => GORUNUMLER.filter((g) => yanitlar(g, s));
Ölçüm
İkinci dosya soru kümesini dört görünüme uygular, yanıtlanan ve yanıtlanamayan soruları sayar, yinelemeyi çıkarır ve üç düzeni aynı değişiklik akışında koşturur.
// gorunum/olcum.mjs — soru kumesi dort gorunume uygulanir; yanitlanan, yanitlanamayan, // yinelenen soru ve bakim maliyeti sayilir. import { GORUNUM, GORUNUMLER, SORU, OGELER, yanitlayan } from "./model.mjs"; const sut = (s, n) => String(s).padEnd(n); const kisa = { mantiksal: "man", surec: "sur", gelistirme: "gel", fiziksel: "fiz" }; const olcum = SORU.map((s) => ({ ...s, y: yanitlayan(s) })); console.log(sut("soru", 6) + sut("gereken oge", 34) + "yanitlayan gorunum"); console.log("-".repeat(72)); for (const o of olcum) console.log(sut(o.id, 6) + sut(o.gerek.join("+"), 34) + (o.y.length ? o.y.map((g) => kisa[g]).join(",") : "- yok -")); const bir = olcum.filter((o) => o.y.length === 1).length; const cok = olcum.filter((o) => o.y.length > 1); const sifir = olcum.filter((o) => o.y.length === 0); console.log(`\n${SORU.length} soru: tek gorunum ${bir}, birden cok gorunum ${cok.length}, hicbiri ${sifir.length}`); console.log(`dort gorunum birlikte ${SORU.length - sifir.length}/${SORU.length} soruyu yanitliyor`); console.log("\ngorunum yanit kacirdigi en sik eksik oge"); console.log("-".repeat(62)); for (const g of GORUNUMLER) { const kacan = olcum.filter((o) => !o.y.includes(g)); const sayac = {}; for (const o of kacan) for (const e of o.gerek.filter((x) => !GORUNUM[g].includes(x))) sayac[e] = (sayac[e] || 0) + 1; const ilk = Object.entries(sayac).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, 3); console.log(sut(g, 13) + sut(SORU.length - kacan.length, 7) + sut(kacan.length, 11) + ilk.map(([e, n]) => `${e}(${n})`).join(" ")); } // ---- yineleme: bir oge kac gorunumde tekrarlaniyor ---- const kacGorunumde = (o) => GORUNUMLER.filter((g) => GORUNUM[g].includes(o)).length; const yerlesim = OGELER.reduce((t, o) => t + kacGorunumde(o), 0); console.log(`\n${OGELER.length} ayri bilgi ogesi ${yerlesim} kez yaziliyor; ${yerlesim - OGELER.length} yazim yineleme`); console.log("yinelenen oge: " + OGELER.filter((o) => kacGorunumde(o) > 1).map((o) => `${o} x${kacGorunumde(o)}`).join(", ")); console.log("yinelenen soru: " + cok.map((o) => `${o.id}(${o.y.length})`).join(", ")); // ---- yanitlanamayan sorularin istedigi capraz eslemeler ---- const ciftAdi = (a, b) => [a, b].sort().join(" <-> "); const eslemeler = [...new Set(sifir.map((o) => ciftAdi(o.gerek[0], o.gerek[1])))]; console.log(`\nyanitlanamayan ${sifir.length} soru ${eslemeler.length} capraz esleme istiyor:`); for (const o of sifir) { const sahip = o.gerek.map((e) => GORUNUMLER.filter((g) => GORUNUM[g].includes(e)).map((g) => kisa[g]).join("/")); console.log(` ${o.id} ${sut(ciftAdi(o.gerek[0], o.gerek[1]), 36)}(${sahip.join(" ile ")})`); } // ---- bakim: 200 degisiklik uc duzende ---- // AGIRLIK — her bilgi ogesinin degisme sikligi (GR4); elle secilmistir const AGIRLIK = { modul: 10, sorumluluk: 8, "modul-bagimliligi": 12, arayuz: 9, "veri-varligi": 6, surec: 5, "cagri-sirasi": 7, "es-zamanlilik": 3, kuyruk: 4, "kaynak-agaci": 6, "yapi-birimi": 4, takim: 3, "dis-bagimlilik": 5, dugum: 2, "ag-baglantisi": 2, yerlesim: 3, kapasite: 2, }; function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; } const rast = uretec(70321); // tohum gorunur; ayni tohum ayni diziyi verir const toplamAgirlik = OGELER.reduce((t, o) => t + AGIRLIK[o], 0); const secOge = () => { let r = rast() * toplamAgirlik; for (const o of OGELER) if ((r -= AGIRLIK[o]) < 0) return o; return OGELER.at(-1); }; const N = 200; let tekYazim = 0, dortYazim = 0, dortYineleme = 0, eslemeTazeleme = 0; for (let i = 0; i < N; i++) { const o = secOge(); if (GORUNUM.surec.includes(o)) tekYazim++; const k = kacGorunumde(o); dortYazim += k; dortYineleme += k - 1; eslemeTazeleme += eslemeler.filter((e) => e.split(" <-> ").includes(o)).length; } const enIyiTek = GORUNUMLER.map((g) => [g, olcum.filter((o) => o.y.includes(g)).length]).sort((a, b) => b[1] - a[1])[0]; console.log(`\n${N} degisiklik olayi, en iyi tek gorunum = ${enIyiTek[0]}`); console.log(sut("duzen", 26) + sut("yanit", 8) + sut("yazim", 8) + "yaniti basina yazim"); console.log("-".repeat(64)); const satir = (ad, yanit, yazim) => console.log(sut(ad, 26) + sut(`${yanit}/${SORU.length}`, 8) + sut(yazim, 8) + (yazim / yanit).toFixed(2)); satir("tek gorunum", enIyiTek[1], tekYazim); satir("dort gorunum", SORU.length - sifir.length, dortYazim); satir("dort gorunum + esleme", SORU.length, dortYazim + eslemeTazeleme); console.log(`dort gorunumun ${dortYazim} yaziminin ${dortYineleme}'i ayni olguyu ikinci kez yazmak`); console.log(`${eslemeler.length} esleme ${N} degisiklikte ${eslemeTazeleme} kez tazeleniyor, karsiliginda ${sifir.length} soru aciliyor`);
soru gereken oge yanitlayan gorunum ------------------------------------------------------------------------ S01 modul+sorumluluk man S02 modul+modul-bagimliligi man S03 modul+arayuz man,sur S04 veri-varligi man S05 modul man,sur,gel S06 modul+surec sur S07 kuyruk+surec sur S08 es-zamanlilik sur S09 cagri-sirasi sur S10 cagri-sirasi+kuyruk sur S11 kaynak-agaci gel S12 modul+takim gel S13 yapi-birimi gel,fiz S14 modul+dis-bagimlilik gel S15 yerlesim+dugum fiz S16 ag-baglantisi+dugum fiz S17 dugum+kapasite fiz S18 yapi-birimi+yerlesim fiz S19 takim+yerlesim - yok - S20 cagri-sirasi+ag-baglantisi - yok - S21 veri-varligi+yerlesim - yok - S22 es-zamanlilik+sorumluluk - yok - S23 yapi-birimi+surec - yok - S24 kuyruk+takim - yok - 24 soru: tek gorunum 15, birden cok gorunum 3, hicbiri 6 dort gorunum birlikte 18/24 soruyu yanitliyor gorunum yanit kacirdigi en sik eksik oge -------------------------------------------------------------- mantiksal 5 19 yerlesim(4) cagri-sirasi(3) dugum(3) surec 7 17 yerlesim(4) dugum(3) takim(3) gelistirme 5 19 yerlesim(4) cagri-sirasi(3) dugum(3) fiziksel 5 19 modul(7) cagri-sirasi(3) kuyruk(3) 17 ayri bilgi ogesi 21 kez yaziliyor; 4 yazim yineleme yinelenen oge: arayuz x2, modul x3, yapi-birimi x2 yinelenen soru: S03(2), S05(3), S13(2) yanitlanamayan 6 soru 6 capraz esleme istiyor: S19 takim <-> yerlesim (gel ile fiz) S20 ag-baglantisi <-> cagri-sirasi (sur ile fiz) S21 veri-varligi <-> yerlesim (man ile fiz) S22 es-zamanlilik <-> sorumluluk (sur ile man) S23 surec <-> yapi-birimi (gel/fiz ile sur) S24 kuyruk <-> takim (sur ile gel) 200 degisiklik olayi, en iyi tek gorunum = surec duzen yanit yazim yaniti basina yazim ---------------------------------------------------------------- tek gorunum 7/24 86 12.29 dort gorunum 18/24 279 15.50 dort gorunum + esleme 24/24 396 16.50 dort gorunumun 279 yaziminin 79'i ayni olguyu ikinci kez yazmak 6 esleme 200 degisiklikte 117 kez tazeleniyor, karsiliginda 6 soru aciliyor
Yanıtlanan ve Yanıtlanamayan
Dört görünüm birlikte yirmi dört sorunun on sekizini yanıtlıyor. On beşinin yanıtı tek bir görünümde, üçünün yanıtı birden çok görünümde duruyor. Altı soru hiçbir görünümde yanıt bulmuyor.
Yanıtlanamayan altının ortak bir özelliği var, ve bu özellik dersin asıl bulgusudur: her biri iki farklı görünümde duran iki ögeyi birleştirmeyi istiyor. Ceza hesabına bakan takımın hangi düğümdeki yayını etkilediği sorusu, geliştirme görünümündeki takım bilgisiyle fiziksel görünümdeki yerleşim bilgisini yan yana koymadan yanıtlanmaz. Ödünç akışındaki hangi çağrının ağ üzerinden gittiği, süreç görünümündeki çağrı sırasını fiziksel görünümdeki ağ bağlantısıyla eşlemeyi ister. Bir yapı birimini yayınlamanın kaç süreci yeniden başlattığı, geliştirme ile süreç görünümü arasındaki eşlemedir.
Bu, dört görünümün eksik seçilmiş olmasından çıkmıyor. Görünümler tanımı gereği ilgi eksenine göre ayrıldığı için, eksenler arasına düşen soru sınıfı boşta kalır. Dört görünüm ne kadar iyi yazılırsa yazılsın bu altı soru orada durmayacak; onlar için ayrı bir şey, görünümler arasında bir eşleme gerekir. Altı sorunun istediği altı ayrı eşleme çıktının sonunda listeli.
Yanıtlanamayan sorunun sayılması bu kursun en değerli ölçüsüdür, çünkü belgeyi okuyan biri sorusuna yanıt bulamadığında bunu kimseye bildirmez; kodun içine bakar, birine sorar ya da tahmin eder. Sayı tutulmazsa boşluk görünmez.
Tek Görünümün Kaçırdığı
Alt tablo her görünümün tek başına ne yaptığını gösteriyor. En iyisi süreç görünümü: yirmi dört sorunun yedisini yanıtlıyor, on yedisini kaçırıyor. Mantıksal, geliştirme ve fiziksel görünümün her biri beş soru yanıtlayıp on dokuz soru kaçırıyor.
“En sık eksik öge” sütunu kaçırılan soruların sınıfını adlandırıyor. Mantıksal görünüm tek başına kullanıldığında en çok yerleşim (4 soru), çağrı sırası (3) ve düğüm (3) bilgisini arıyor — yani kaçırdığı şey çalışma anı ve yerleşim sınıfıdır. Fiziksel görünümün eksiği bambaşka: yedi soruda modül bilgisi eksik kalıyor. Fiziksel görünüm nerede koşulduğunu bilir, neyin koştuğunu adlandırmaz.
Buradan çıkan pratik sonuç şudur: bir sistemin belgesi tek görünümden ibaretse, kaçırdığı sorular rastgele dağılmaz; hep aynı sınıftan olur. Mantıksal görünümle yetinen bir belge yerleşim ve çalışma anı sorularını sistematik olarak yanıtsız bırakır; fiziksel görünümle yetinen bir belge de “bu düğümde ne koşuyor” sorusunu.
Yinelemenin Bedeli
Üç soru birden çok görünümde yanıtlanıyor. Bu ilk bakışta iyi görünür — iki yerden de bulunabilen bilgi. Bedeli öge tarafında duruyor: on yedi ayrı bilgi ögesi görünümlere yirmi bir kez yazılıyor. Dört yazım yinelemedir. Modül kimliği üç görünümde, arayüz iki görünümde, yapı birimi iki görünümde tekrarlanır. Modül adı değiştiğinde üç yerde değişmesi gerekir; üçünden biri unutulursa iki görünüm birbiriyle çelişir.
Alt tablo bunu değişiklik akışında sayıyor. Ögelerin değişme sıklığı elle seçilmiş bir ağırlık tablosundan geliyor (GR4); tohumu 70321 olan üreteçle iki yüz değişiklik olayı üretiliyor. Aynı tohum aynı diziyi verir.
Dört görünüm düzeni iki yüz değişikliğe karşılık 279 yazım istiyor; bunun 79’u aynı olguyu ikinci ya da üçüncü kez yazmaktır. Buna karşılık on sekiz soru yanıtlanıyor: yanıt başına 15,50 yazım. Tek görünüm düzeni 86 yazımla yetiniyor ama yalnız yedi soru yanıtlıyor: yanıt başına 12,29 yazım. Dördün üstüne altı çapraz eşleme eklendiğinde bütün küme yanıtlanıyor; eşlemeler iki yüz değişiklikte 117 kez tazeleniyor ve yanıt başına yazım 16,50’ye çıkıyor.
Sıralamanın okunuşu şudur: kapsam arttıkça yanıt başına maliyet de artıyor, ama artış yavaş. Yanıt sayısı yediden yirmi dörde, üç kattan fazla çıkarken yanıt başına yazım 12,29’dan 16,50’ye, üçte bir kadar artıyor. Tek görünümün ucuzluğu bir yanılsamadır: ucuz olan yazım değil, yazılmayan on yedi sorunun okuyucuya devredilmiş olmasıdır. Bu sayılar modelin girdilerine bağlıdır; ağırlık tablosu yerleşim ve düğüm ögelerine daha yüksek değer verseydi fiziksel görünümün payı artar, sıralama değişmezdi.
Özet
- Görünüm, sistemin tek bir ilgi ekseninden bakılmış hâlidir ve çizimiyle değil taşıdığı bilgi ögesi kümesiyle tanımlanır; mantıksal, süreç, geliştirme ve fiziksel görünümün öge listeleri ayrıdır ve yalnız üç ögede örtüşür.
- Yirmi dört soruluk kümede dört görünüm birlikte 18 soruyu yanıtlıyor; 15 soru tek görünümde, 3 soru birden çok görünümde yanıt buluyor, 6 soru hiçbir görünümde yanıt bulmuyor.
- Yanıtlanamayan altı sorunun hepsi iki farklı görünümdeki ögeyi birleştirmeyi istiyor; bu boşluk görünümlerin kötü seçilmesinden değil eksene göre ayrılmalarından çıkar ve altı çapraz eşleme ister.
- Tek görünümle yetinildiğinde en iyi durum 7/24’tür (süreç görünümü); kaçırılan sorular rastgele değil aynı sınıftandır — mantıksal görünüm yerleşim ve çalışma anı sorularını, fiziksel görünüm yedi soruda modül kimliğini eksik bırakır.
- On yedi bilgi ögesi görünümlere 21 kez yazılıyor, 4 yazım yinelemedir; tohumu 70321 olan üreteçle 200 değişiklikte dört görünüm 279 yazım istiyor ve bunun 79’u aynı olgunun ikinci yazımıdır. Yanıt başına yazım tek görünümde 12,29, dört görünümde 15,50, eşlemeler eklendiğinde 16,50’dir.
Sonraki Adım
Dört görünüm sistemi ilgi eksenine göre kesti: ne, ne zaman, kimin kodunda, nerede. Kesilmeyen bir eksen kaldı. Mantıksal görünüm bu modelde bütün modülleri tek bir listede taşıyor; ağın dışarıya nasıl göründüğünü soran biriyle bir modülün içindeki işlev yerleşimini soran biri aynı listeye bakmak zorunda. Birincisi aradığından çok fazlasını okur, ikincisi aradığı ayrıntıyı hiç bulamaz. Sonraki ders aynı sistemi bağlamdan koda dört ölçek düzeyinde modeller ve şunu ölçer: düzey başına kaç düğüm ve kenar var, bir soru hangi düzeyde yanıtlanıyor, yanlış düzeyde bakan biri kaç gereksiz düğüm okuyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.