İçeriğe geç
academia.sh

Ders 08 / 11

Diyagram Türünün Soruya Göre Seçilmesi

Yapı, sıra, durum ve dağıtım gösteren diyagram türlerinin bir soru kümesine eşlenmesi: soru başına doğru tür, yanlış türle yanıtlanmaya çalışılan sorunun bıraktığı eksik bilgi ögesi sayısı ve kod değiştiğinde her türün güncellemek zorunda kaldığı öge sayısı.

İçindekiler

Önceki iki ders tek bir yapıyı ölçtü: düğüm ve kenar. Görünümler o yapıyı ilgi eksenine, katmanlı yaklaşım ölçek eksenine göre böldü. Sorulan soruların hepsi aynı biçimdeydi — ne neye bağlı.

Sonradan gelen birinin soruları hep bu biçimde değil. Bölgesel kütüphane ağında “ödünç isteği geldiğinde çağrılar hangi sırayla gider” diye soran biri bağımlılık listesine bakarak yanıt bulamaz: liste kimin kimi çağırabildiğini söyler, hangisinin önce çağrıldığını söylemez. “Bir kopya hangi durumlardan geçer” sorusu ise ne bağımlılık ne sıra ister; durum ve geçiş ister. Bunlar farklı diyagram türleri gerektirir.

Bu ders türleri gösterim adıyla anmıyor. Bir tür, taşıyabildiği bilgi ögeleriyle tanımlanıyor ve işleviyle anılıyor: yapı gösteren, sıra gösteren, durum gösteren, dağıtım gösteren. Ölçülen şey ikisi: hangi tür hangi soruyu yanıtlıyor, ve o türü güncel tutmak kaça mal oluyor.

Türü İşlevi Ayırır

Yapı gösteren diyagram katılımcıları, aralarındaki durağan bağı, bağın yönünü ve çokluğu taşır. Sıra gösteren diyagram katılımcıları, iletileri, iletilerin sırasını, eşzamansızlığı ve koşullu dalları taşır. Durum gösteren diyagram durumları, geçişleri, tetikleyicileri ve koruma koşullarını taşır. Dağıtım gösteren diyagram düğümleri, yapı eserlerini, yerleşimi ve iletişim yollarını taşır.

Listelerin ilginç yanı örtüşmenin azlığıdır: dört liste toplam on yedi yer tutuyor ama on altı ayrı bilgi ögesi içeriyor — yalnız katılımcı iki türde birden bulunuyor. Türler farklı çizim alışkanlıkları değil, farklı bilgi kümeleridir; bu yüzden birbirinin yerine geçemezler.

Model üç parçadan oluşuyor. Türlerin taşıdığı öge listeleri elle yazılmıştır (GR11). Ağ için çizilmiş yedi diyagram ve her birinin bağlı olduğu kod ögeleri de öyle (GR12); dağıtım gösteren diyagram koda değil kap ve düğüme bağlı olduğu için bağlı öge sayısı düşük tutulmuştur. Soru kümesi on sekiz sorudur (GR13) ve bir tür bir soruyu ancak gereken ögelerin hepsini taşıyorsa yanıtlar (GR14).

// gorunum/tur.mjs — MODEL bolgesel kutuphane agi: diyagram turleri islevleriyle
// tanimlanir, soru kumesine eslenir ve bakim maliyeti sayilir. Gercek bir gosterim
// ya da urun degildir; oge listeleri ve sorular elle secilmistir.

// TUR — her diyagram turunun tasiyabildigi bilgi ogeleri (GR11)
const TUR = {
  yapi: ["katilimci", "statik-bag", "yon", "cokluk"],
  sira: ["katilimci", "ileti", "sira", "es-zamansizlik", "kosul-dali"],
  durum: ["durum", "gecis", "tetikleyici", "koruma-kosulu"],
  dagitim: ["dugum", "yapi-eseri", "yerlesim", "iletisim-yolu"],
};
const TURLER = Object.keys(TUR);

// DIYAGRAM — cizilmis diyagramlar ve her birinin bagli oldugu kod ogeleri (GR12).
// Dagitim gosteren diyagram koda degil kap ve dugume baglidir; bu yuzden bagli
// oge sayisi dusuktur.
const DIYAGRAM = {
  "yapi/odunc-servisi": { tur: "yapi", bagli: ["odunc-ac", "iade-al", "uzatma", "sure-hesabi", "limit-denetimi", "gecikme-cezasi", "ayirtma-sirasi", "ayirtma-bildirimi"] },
  "yapi/veri-semasi": { tur: "yapi", bagli: ["odunc-tablosu", "ceza-tablosu", "kopya-tablosu"] },
  "sira/odunc-acma": { tur: "sira", bagli: ["odunc-ac", "sure-hesabi", "limit-denetimi", "kopya-durumu", "odunc-tablosu", "konu-tanimi"] },
  "sira/ayirtma-bildirimi": { tur: "sira", bagli: ["ayirtma-sirasi", "ayirtma-bildirimi", "kuyruga-yaz", "kuyruktan-oku", "ileti-govdesi"] },
  "durum/kopya": { tur: "durum", bagli: ["kopya-durumu", "odunc-ac", "iade-al", "ayirtma-sirasi"] },
  "durum/ceza": { tur: "durum", bagli: ["ceza-birikimi", "gecikme-cezasi", "ceza-tablosu"] },
  "dagitim/ag": { tur: "dagitim", bagli: ["esitleme-isi", "abonelik"] },
};

// SORU — gerek: yaniti icin gereken bilgi ogeleri (GR13). Bir tur soruyu ancak
// gereken ogelerin hepsini tasiyorsa yanitlar (GR14).
const SORU = [
  { id: "U01", metin: "odunc cekirdegi hangi ogelere bagli", gerek: ["katilimci", "statik-bag"] },
  { id: "U02", metin: "bagimlilik hangi yone gidiyor", gerek: ["statik-bag", "yon"] },
  { id: "U03", metin: "bir uyenin kac odunc kaydi olabilir", gerek: ["katilimci", "cokluk"] },
  { id: "U04", metin: "odunc acma akisinda ilk cagri hangisi", gerek: ["ileti", "sira"] },
  { id: "U05", metin: "bildirim cagrisi es zamansiz mi", gerek: ["ileti", "es-zamansizlik"] },
  { id: "U06", metin: "limit asilirsa akis nereye sapar", gerek: ["sira", "kosul-dali"] },
  { id: "U07", metin: "kopya hangi durumlardan gecer", gerek: ["durum", "gecis"] },
  { id: "U08", metin: "iade hangi gecisi tetikler", gerek: ["gecis", "tetikleyici"] },
  { id: "U09", metin: "ayirtmali kopya dogrudan odunc verilebilir mi", gerek: ["gecis", "koruma-kosulu"] },
  { id: "U10", metin: "odunc servisi hangi dugumde kosuyor", gerek: ["yapi-eseri", "yerlesim"] },
  { id: "U11", metin: "sube ile merkez arasindaki yol hangi tur", gerek: ["dugum", "iletisim-yolu"] },
  { id: "U12", metin: "kac ayri dugum var", gerek: ["dugum"] },
  { id: "U13", metin: "odunc akisinda hangi katilimcilar var", gerek: ["katilimci"] },
  { id: "U14", metin: "ceza birikimi hangi kosulda durur", gerek: ["gecis", "koruma-kosulu"] },
  { id: "U15", metin: "gecikme cezasini hangi ileti hangi durumda tetikler", gerek: ["ileti", "sira", "durum"] },
  { id: "U16", metin: "hangi dugumdeki katilimci hangi iletiyi gonderiyor", gerek: ["dugum", "katilimci", "ileti"] },
  { id: "U17", metin: "ayirtma bildirimi hangi sirayla gonderilir", gerek: ["ileti", "sira"] },
  { id: "U18", metin: "hangi yapi eseri hangi dugume kopyalanir", gerek: ["yapi-eseri", "yerlesim", "dugum"] },
];

const sut = (s, n) => String(s).padEnd(n);
const eksik = (t, s) => s.gerek.filter((o) => !TUR[t].includes(o));
const dogruTur = (s) => TURLER.filter((t) => eksik(t, s).length === 0);

// ---- tur tablosu ----
console.log(sut("tur", 10) + sut("bilgi ogesi", 14) + sut("diyagram", 10) + "bagli oge");
console.log("-".repeat(46));
for (const t of TURLER) {
  const d = Object.values(DIYAGRAM).filter((x) => x.tur === t);
  console.log(sut(t, 10) + sut(TUR[t].length, 14) + sut(d.length, 10) + d.reduce((a, x) => a + x.bagli.length, 0));
}

// ---- soru -> tur eslemesi ve yanlis turun biraktigi eksik bilgi ----
console.log("\nsoru  gereken oge                    dogru tur      en yakin yanlis tur");
console.log("-".repeat(78));
let tek = 0, coklu = 0, yok = 0, eksikToplam = 0;
for (const s of SORU) {
  const d = dogruTur(s);
  d.length === 1 ? tek++ : d.length > 1 ? coklu++ : yok++;
  const yanlis = TURLER.filter((t) => !d.includes(t)).map((t) => [t, eksik(t, s).length])
    .sort((a, b) => a[1] - b[1] || a[0].localeCompare(b[0]))[0];
  eksikToplam += yanlis[1];
  console.log(sut(s.id, 6) + sut(s.gerek.join("+"), 31) + sut(d.length ? d.join(",") : "- yok -", 15) + `${yanlis[0]} (${yanlis[1]} oge eksik)`);
}
console.log("-".repeat(78));
console.log(`${SORU.length} soru: tek dogru tur ${tek}, birden cok tur ${coklu}, hicbir tur ${yok}`);
console.log(`dort tur birlikte ${SORU.length - yok}/${SORU.length} soruyu yanitliyor`);
console.log(`en yakin yanlis tur secilseydi toplam ${eksikToplam} bilgi ogesi eksik kalirdi (soru basina ${(eksikToplam / SORU.length).toFixed(2)})`);
for (const s of SORU.filter((x) => dogruTur(x).length === 0))
  console.log(`  ${s.id}: gereken ${s.gerek.join("+")} — ` + TURLER.map((t) => `${t} ${eksik(t, s).join("/")} tasimaz`).join("; "));

// ---- her turun tek basina yanitladigi soru ----
console.log("");
for (const t of TURLER) {
  const y = SORU.filter((s) => dogruTur(s).includes(t));
  console.log(`${sut("yalniz " + t, 18)}yanit ${sut(`${y.length}/${SORU.length}`, 8)}(${y.map((s) => s.id).join(" ")})`);
}

// ---- bakim: 150 kod degisikligi ----
// AGIRLIK — kod ogesinin degisme sikligi (GR15); elle secilmistir
const AGIRLIK = {
  "odunc-ac": 9, "iade-al": 7, uzatma: 5, "sure-hesabi": 8, "limit-denetimi": 6, "gecikme-cezasi": 8,
  "ayirtma-sirasi": 5, "ayirtma-bildirimi": 4, "kopya-durumu": 6, "esitleme-isi": 3,
  "kuyruga-yaz": 3, "kuyruktan-oku": 3, "ileti-govdesi": 4, "ceza-birikimi": 5,
  "konu-tanimi": 2, abonelik: 2, "odunc-tablosu": 4, "ceza-tablosu": 3, "kopya-tablosu": 3,
  // hicbir diyagrama bagli olmayan kod ogeleri
  "raf-yeri": 4, "dis-sorgu": 5, "kayit-donusturme": 4, "uye-olustur": 4, "onbellek-anahtari": 3,
};
const OGELER = Object.keys(AGIRLIK);
function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; }
const rast = uretec(20903); // tohum gorunur
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 = 150;
const guncelleme = Object.fromEntries(TURLER.map((t) => [t, 0]));
let dokunulmayan = 0;
for (let i = 0; i < N; i++) {
  const o = secOge();
  let dokundu = false;
  for (const d of Object.values(DIYAGRAM)) if (d.bagli.includes(o)) { guncelleme[d.tur]++; dokundu = true; }
  if (!dokundu) dokunulmayan++;
}
console.log(`\n${N} kod degisikligi (tohum 20903); ${dokunulmayan} degisiklik hicbir diyagrama dokunmuyor`);
console.log(sut("tur", 10) + sut("guncellenen oge", 17) + sut("yanit", 8) + "yanit basina bakim");
console.log("-".repeat(56));
for (const t of TURLER) {
  const y = SORU.filter((s) => dogruTur(s).includes(t)).length;
  console.log(sut(t, 10) + sut(guncelleme[t], 17) + sut(y, 8) + (guncelleme[t] / y).toFixed(1));
}
const toplamGuncelleme = TURLER.reduce((a, t) => a + guncelleme[t], 0);
console.log("-".repeat(56));
console.log(sut("toplam", 10) + sut(toplamGuncelleme, 17) + sut(SORU.length - yok, 8) + (toplamGuncelleme / (SORU.length - yok)).toFixed(1));
tur       bilgi ogesi   diyagram  bagli oge
----------------------------------------------
yapi      4             2         11
sira      5             2         11
durum     4             2         7
dagitim   4             1         2

soru  gereken oge                    dogru tur      en yakin yanlis tur
------------------------------------------------------------------------------
U01   katilimci+statik-bag           yapi           sira (1 oge eksik)
U02   statik-bag+yon                 yapi           dagitim (2 oge eksik)
U03   katilimci+cokluk               yapi           sira (1 oge eksik)
U04   ileti+sira                     sira           dagitim (2 oge eksik)
U05   ileti+es-zamansizlik           sira           dagitim (2 oge eksik)
U06   sira+kosul-dali                sira           dagitim (2 oge eksik)
U07   durum+gecis                    durum          dagitim (2 oge eksik)
U08   gecis+tetikleyici              durum          dagitim (2 oge eksik)
U09   gecis+koruma-kosulu            durum          dagitim (2 oge eksik)
U10   yapi-eseri+yerlesim            dagitim        durum (2 oge eksik)
U11   dugum+iletisim-yolu            dagitim        durum (2 oge eksik)
U12   dugum                          dagitim        durum (1 oge eksik)
U13   katilimci                      yapi,sira      dagitim (1 oge eksik)
U14   gecis+koruma-kosulu            durum          dagitim (2 oge eksik)
U15   ileti+sira+durum               - yok -        sira (1 oge eksik)
U16   dugum+katilimci+ileti          - yok -        sira (1 oge eksik)
U17   ileti+sira                     sira           dagitim (2 oge eksik)
U18   yapi-eseri+yerlesim+dugum      dagitim        durum (3 oge eksik)
------------------------------------------------------------------------------
18 soru: tek dogru tur 15, birden cok tur 1, hicbir tur 2
dort tur birlikte 16/18 soruyu yanitliyor
en yakin yanlis tur secilseydi toplam 31 bilgi ogesi eksik kalirdi (soru basina 1.72)
  U15: gereken ileti+sira+durum — yapi ileti/sira/durum tasimaz; sira durum tasimaz; durum ileti/sira tasimaz; dagitim ileti/sira/durum tasimaz
  U16: gereken dugum+katilimci+ileti — yapi dugum/ileti tasimaz; sira dugum tasimaz; durum dugum/katilimci/ileti tasimaz; dagitim katilimci/ileti tasimaz

yalniz yapi       yanit 4/18    (U01 U02 U03 U13)
yalniz sira       yanit 5/18    (U04 U05 U06 U13 U17)
yalniz durum      yanit 4/18    (U07 U08 U09 U14)
yalniz dagitim    yanit 4/18    (U10 U11 U12 U18)

150 kod degisikligi (tohum 20903); 24 degisiklik hicbir diyagrama dokunmuyor
tur       guncellenen oge  yanit   yanit basina bakim
--------------------------------------------------------
yapi      97               4       24.3
sira      74               5       14.8
durum     59               4       14.8
dagitim   11               4       2.8
--------------------------------------------------------
toplam    241              16      15.1

Soru Başına Doğru Tür

On sekiz sorunun on beşinde tek bir doğru tür var. Bir soru iki türle birden yanıtlanıyor: ödünç akışında hangi katılımcıların bulunduğunu soran U13, hem yapı hem sıra gösteren diyagramla yanıtlanabiliyor, çünkü katılımcı iki türde birden bulunan tek ögedir. İki soru hiçbir türle yanıtlanmıyor.

Tür seçiminin bir tercih olmadığı buradan okunur. Ödünç açma akışında ilk çağrının hangisi olduğu sorulduğunda sıra gösteren diyagram bir seçenek değil, tek seçenektir; sıra ögesini taşıyan başka tür yok. Aynı biçimde çokluğu yalnız yapı gösteren, koruma koşulunu yalnız durum gösteren, iletişim yolunu yalnız dağıtım gösteren diyagram taşır. Bir soru sorulduğunda hangi diyagramın çizileceği tartışma konusu değildir; sorunun gerektirdiği bilgi ögeleri türü belirler.

Tek türle yetinen bir belge dört ile beş soru arasında yanıt verir. Sıra gösteren tür en yüksek paya sahip (5/18), çünkü öge listesi en uzun olan tür odur. Dördü birlikte on altı soruyu yanıtlıyor.

Yanlış Türün Bıraktığı Eksik

Asıl ölçü sağdaki sütunda. Her soru için, doğru tür yerine seçilebilecek en yakın yanlış tür ve o türün taşımadığı öge sayısı yazılı. Toplam 31 bilgi ögesi, soru başına 1,72.

Sayı iki nedenle önemli. Birincisi, yanlış tür soruyu yanıtsız bırakmaz — yarı yanıtlı bırakır. Ödünç akışının ilk çağrısı sorulduğunda yapı gösteren diyagram katılımcıları listeler; okuyucu bir şey görür, hatta ilgili bir şey görür, ama sıra bilgisi orada yoktur. Bulunan yanıtın eksik olduğu belli değildir; eksik olan öge, olmadığı için görünmez.

İkincisi, en yakın yanlış tür bazen çok yakındır. U15 gecikme cezasını hangi iletinin hangi durumda tetiklediğini soruyor; sıra gösteren diyagram üç gerekli ögeden ikisini taşıyor, yalnız durum ögesini taşımıyor. Tek bir öge eksik, ama eksik olan öge sorunun yarısıdır. U16 aynı biçimde sıra gösteren diyagrama bir öge uzaklıkta: düğüm.

Bu iki soru hiçbir türle yanıtlanmıyor ve nedeni önceki dersinkiyle aynı: soru iki türün ögelerini birleştirmeyi istiyor. Çalışma anındaki bir iletiyi bir duruma bağlamak, ya da bir iletiyi gönderen katılımcıyı bir düğüme bağlamak, tek bir türün taşıyabileceğinden fazlasıdır. Türler çoğaltılarak kapatılabilecek bir boşluk değildir; her yeni tür kendi bilgi kümesiyle gelir ve kümeler arasında yine boşluk kalır.

Bakım Maliyeti

Alt tablo diyagramları koda bağlayarak ölçüyor. Yüz elli kod değişikliği üretiliyor; öge seçimi elle yazılmış bir ağırlık tablosundan geliyor (GR15) ve tohum 20903 görünür. Bir değişiklik, değişen kod ögesine bağlı her diyagramda bir öge güncellemesi gerektiriyor.

Yüz elli değişikliğin 24’ü hiçbir diyagrama dokunmuyor — kodun bir kısmı hiçbir diyagramda görünmüyor. Kalan değişiklikler toplam 241 diyagram ögesi güncellemesi doğuruyor.

Türler arasındaki fark büyük. Yapı gösteren tür 97 güncelleme istiyor ve dört soru yanıtlıyor: yanıt başına 24,3. Dağıtım gösteren tür 11 güncelleme istiyor ve yine dört soru yanıtlıyor: yanıt başına 2,8. Aradaki dokuz katlık fark, çizim ustalığından değil bağlanma sıklığından geliyor. Yapı gösteren diyagram doğrudan kod ögelerine bağlıdır ve kod en sık değişen şeydir; dağıtım gösteren diyagram düğüme ve kaba bağlıdır, onlar seyrek değişir.

Buradan çıkan kural şudur: bir diyagramın değeri yanıtladığı soru sayısıysa, maliyeti kod değişikliği başına güncellenen öge sayısıdır, ve ikisinin oranı türden türe dokuz kat değişir. Bir belge kümesi kısılacaksa kesilecek yer yanıt başına bakımı en yüksek olan yerdir — bu modelde yapı gösteren diyagramlar. Sayılar modelin girdilerine bağlıdır; bağlı öge listeleri daraltılırsa maliyet düşer, ama yanıtlanan soru da değişmez, çünkü yanıt öge listesinden değil türün bilgi kümesinden gelir.

Özet

  • Diyagram türleri gösterim adıyla değil taşıdıkları bilgi ögesiyle ayrılır: yapı gösteren tür durağan bağı ve çokluğu, sıra gösteren tür iletiyi ve sırayı, durum gösteren tür geçişi ve koruma koşulunu, dağıtım gösteren tür düğümü ve yerleşimi taşır; on altı ayrı ögeden yalnız katılımcı iki türde birden bulunur.
  • On sekiz sorunun 15’inde tek bir doğru tür var, biri iki türle yanıtlanıyor, ikisi hiçbir türle yanıtlanmıyor; dört tür birlikte 16/18 soruyu yanıtlıyor, tek tür 4 ile 5 arasında.
  • Yanlış tür soruyu yanıtsız değil yarı yanıtlı bırakır: en yakın yanlış tür seçilseydi toplam 31 bilgi ögesi eksik kalırdı, soru başına 1,72. U15’te sıra gösteren tür üç ögeden ikisini taşıyor, eksik olan tek öge sorunun yarısıdır.
  • Hiçbir türle yanıtlanamayan iki soru, iki türün ögelerini birleştirmeyi istiyor; tür eklemek bu boşluğu kapatmaz, yeni kümeler arasında yenisini açar.
  • Tohumu 20903 olan üreteçle 150 kod değişikliğinin 24’ü hiçbir diyagrama dokunmuyor; kalanlar 241 öge güncellemesi doğuruyor. Yanıt başına bakım yapı gösteren türde 24,3, sıra ve durum gösteren türde 14,8, dağıtım gösteren türde 2,8 — dokuz katlık fark bağlanma sıklığından gelir.

Sonraki Adım

Üç ders de aynı biçimde soru sordu: bir şeyin neye bağlı olduğu, hangi sırayla çağrıldığı, nerede koştuğu. Hepsinin yanıtı sistemin yapısında duruyor ve bakılacak yer bilindiğinde kesin bir yanıt çıkıyor.

Sonradan gelen birinin sorularının bir kısmı bu türden değil. “Ağ yoğun saatte yeterince hızlı mı”, “bir şube kopunca ödünç verme durur mu”, “bu sistem yeni bir şube eklemeye ne kadar açık” soruları hiçbir diyagramda düğüm ya da kenar olarak durmaz. Bunlar sistemin yapısı hakkında değil davranışının niteliği hakkındadır ve bu hâlleriyle sınanamazlar: “yeterince hızlı” bir ölçü değildir. Sonraki ders bu soruları uyaran, ortam, yanıt ve yanıt ölçüsü alanları olan senaryolara çevirir ve şunu ölçer: alanları dolu senaryo sayısı, ölçüsü yazılmadığı için sınanamayan senaryo sayısı.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat