İçeriğe geç
academia.sh

Ders 11 / 11

Sürekli Öğrenme Disiplini

Bilgi tazeliğinin bir bütçe dağıtımı olarak ölçülmesi: kararın dayandığı bilginin geçerlilik süresine bağlanması, yenilenmeyen dayanağa yaslanan kararın yanlış çıkma oranının 72 aylık bir koşumda sayılması ve aynı yıllık 72 saatin eşit, eskimeye göre ve en bayat önce dağıtıldığında oranı 0,3958, 0,3715 ve 0,2222 vermesi.

İçindekiler

Önceki ders bir aday tablosu kurdu ve bir kazanan çıkardı. Tablonun her hücresi ölçüldüğü gün doğruydu: adayın yaşı, kırıcı sürüm sıklığı, uyarlayıcı sayısı, belgelenmiş işlev oranı. Karar verildi, tablo yerinde duruyor. Tablonun dayandığı sayılar durmuyor.

Bu, bütün kursun ölçtüğü kararlar için geçerlidir. Bir denge kararının ağırlıkları, bir sadeleştirmenin arızi karmaşıklık payı, bir geri alma maliyeti — hepsi bir ölçümden gelir ve her ölçüm bir tarihe aittir. Bu son ders bunu bir modele çevirir: bir kararın dayanağının geçerlilik süresi vardır, süresi geçmiş dayanağa yaslanan kararın yanlış çıkma olasılığı yükselir ve öğrenmeye ayrılan saatler bu olasılığı düşürür. Öğrenme bir erdem değil, bir bütçe dağıtımıdır; ve dağıtımın kendisi, bütçenin büyüklüğünden daha çok fark yaratır.

Dayanağın Geçerlilik Süresi

Modelde her karar üç dayanağa yaslanır. Bir dayanak bir bilgi parçasıdır ve kategorisine göre yaşlanır.

MP16: bir dayanağın geçerlilik süresi kategorisine bağlıdır. Bir ölçümden gelen sayı altı ay, bir aracın olgunluk ve ekosistem profili on sekiz ay, yapısal bir ilke yüz yirmi ay geçerli kalır. Tazeleme maliyetleri de ayrışır: bir ölçümü yeniden koşturmak bir saat, bir aracın profilini yeniden çıkarmak dört saat, yapısal bir ilkeyi yeniden gözden geçirmek on iki saat.

MP17: yanlış çıkma olasılığı dayanak tazeyken tabandadır ve yaş geçerlilik süresini aştıkça artar; yaş ömrün üç katına ulaştığında olasılık bire çıkar. Taban 0,05’tir, yani taze bir dayanak bile yanılabilir. Bir karar üç dayanağının hepsi doğru çıktığında doğrudur.

// ogrenme/model.mjs — bilgi tazeliginin surec ici modeli. Gercek kurum, arac ve kisi yoktur.
// Sure olculmez; ay, karar, bayat dayanak ve yanlis cikan karar sayilir. Rastgelelik kendi
// yazilan bir uretecten gelir ve tohum gorunurdur.

// MP16: bir dayanagin gecerlilik suresi kategorisine baglidir (ay).
export const KATEGORI = {
  olcum: { adet: 30, omur: 6, tazelemeSaat: 1 },
  arac: { adet: 20, omur: 18, tazelemeSaat: 4 },
  yapi: { adet: 10, omur: 120, tazelemeSaat: 12 },
};

export const AY = 72, AYLIK_KARAR = 4, DAYANAK_BASINA_KARAR = 3, TABAN = 0.05;

export function uretec(tohum) {
  let t = tohum;
  return () => ((t = (t * 1103515245 + 12345) % 2147483648) / 2147483648);
}

export function dayanaklar(rast) {
  const d = [];
  for (const [ad, k] of Object.entries(KATEGORI))
    for (let i = 0; i < k.adet; i++) d.push({ kategori: ad, yas: rast() * k.omur });
  return d;
}

// MP17: yanlis cikma olasiligi dayanak tazeyken TABAN'dir ve yas gecerlilik suresini astikca
// artar; yas omrun uc katina ulastiginda 1'e cikar.
export const hataOlasiligi = (d) => {
  const omur = KATEGORI[d.kategori].omur;
  return TABAN + (1 - TABAN) * Math.min(1, Math.max(0, (d.yas - omur) / (2 * omur)));
};

// Dagitim stratejileri: aylik butceyi kategorilere boler. Pay toplami 1'dir.
export const DAGITIM = {
  "esit": () => ({ olcum: 1 / 3, arac: 1 / 3, yapi: 1 / 3 }),
  "eskimeye gore": () => {
    const h = Object.fromEntries(Object.entries(KATEGORI).map(([a, k]) => [a, k.adet / k.omur]));
    const t = Object.values(h).reduce((x, y) => x + y, 0);
    return Object.fromEntries(Object.entries(h).map(([a, v]) => [a, v / t]));
  },
  "yalniz olcum": () => ({ olcum: 1, arac: 0, yapi: 0 }),
  "yalniz yapi": () => ({ olcum: 0, arac: 0, yapi: 1 }),
};

// Kategori payi olmadan, en bayat dayanaktan baslayarak harcayan strateji.
const enBayatOnce = (d, butce) => {
  let kalan = butce;
  for (const x of [...d].sort((a, b) =>
      b.yas / KATEGORI[b.kategori].omur - a.yas / KATEGORI[a.kategori].omur)) {
    const m = KATEGORI[x.kategori].tazelemeSaat;
    if (m > kalan) continue;
    kalan -= m; x.yas = 0;
  }
  return kalan;
};

// Kategori payiyla harcayan strateji: her kategoride en eski dayanak once tazelenir.
const payaGore = (d, butce, pay, kasa) => {
  for (const ad of Object.keys(KATEGORI)) {
    kasa[ad] = (kasa[ad] ?? 0) + butce * pay[ad];
    const m = KATEGORI[ad].tazelemeSaat;
    const sirali = d.filter((x) => x.kategori === ad).sort((a, b) => b.yas - a.yas);
    for (const x of sirali) {
      if (m > kasa[ad]) break;
      kasa[ad] -= m; x.yas = 0;
    }
  }
};

export function kosum({ strateji, butce, tohum = 20260801 }) {
  const rast = uretec(tohum);
  const d = dayanaklar(rast);
  const kasa = {};
  let karar = 0, yanlis = 0, bayatDayanak = 0, kullanilanDayanak = 0;
  for (let ay = 0; ay < AY; ay++) {
    for (const x of d) x.yas += 1;
    if (butce > 0 && strateji === "en bayat once") enBayatOnce(d, butce);
    else if (butce > 0) payaGore(d, butce, DAGITIM[strateji](), kasa);
    for (let i = 0; i < AYLIK_KARAR; i++) {
      let dogru = 1;
      for (let j = 0; j < DAYANAK_BASINA_KARAR; j++) {
        const x = d[Math.floor(rast() * d.length)];
        kullanilanDayanak += 1;
        if (x.yas > KATEGORI[x.kategori].omur) bayatDayanak += 1;
        dogru *= 1 - hataOlasiligi(x);
      }
      karar += 1;
      if (rast() > dogru) yanlis += 1;
    }
  }
  return { karar, yanlis, oran: yanlis / karar, bayatOran: bayatDayanak / kullanilanDayanak,
    yillikSaat: butce * 12 };
}

Aynı Bütçe, Farklı Dağıtım

Altı saat aylık bütçe, yılda yetmiş iki saattir. Aşağıdaki koşum bu saatleri beş ayrı biçimde dağıtır ve altmış dayanak ile 288 karar üzerinde yanlış çıkan kararı sayar.

// ogrenme/butce.mjs — ayni saat butcesi farkli dagitilinca yanlis cikan karar orani degisir
import { KATEGORI, AY, AYLIK_KARAR, TABAN, DAYANAK_BASINA_KARAR, DAGITIM, kosum } from "./model.mjs";

const BUTCE = 6;
console.log(`ay ${AY}, aylik karar ${AYLIK_KARAR}, toplam karar ${AY * AYLIK_KARAR}, tohum 20260801`);
console.log(`dayanak: ${Object.entries(KATEGORI).map(([a, k]) => `${a} ${k.adet} (omur ${k.omur} ay, tazeleme ${k.tazelemeSaat} saat)`).join("; ")}\n`);

const sifir = kosum({ strateji: "esit", butce: 0 });
console.log(`butce ${BUTCE} saat/ay = ${BUTCE * 12} saat/yil`);
console.log("strateji           olcum   arac   yapi   bayat dayanak  yanlis karar  oran   dususu");
console.log("----------------- ------ ------ ------ --------------- ------------- ------ -------");
console.log(`${"butce yok".padEnd(17)} ${"-".padStart(6)} ${"-".padStart(6)} ${"-".padStart(6)} ` +
  `${sifir.bayatOran.toFixed(4).padStart(15)} ${String(sifir.yanlis).padStart(13)} ` +
  `${sifir.oran.toFixed(4).padStart(6)} ${"-".padStart(7)}`);
for (const ad of [...Object.keys(DAGITIM), "en bayat once"]) {
  const r = kosum({ strateji: ad, butce: BUTCE });
  const p = DAGITIM[ad] ? DAGITIM[ad]() : null;
  const s = (k) => (p ? p[k].toFixed(2) : "-").padStart(6);
  console.log(`${ad.padEnd(17)} ${s("olcum")} ${s("arac")} ${s("yapi")} ` +
    `${r.bayatOran.toFixed(4).padStart(15)} ${String(r.yanlis).padStart(13)} ` +
    `${r.oran.toFixed(4).padStart(6)} ${`${((1 - r.oran / sifir.oran) * 100).toFixed(1)}%`.padStart(7)}`);
}

console.log(`\nbutce buyudukce (strateji: eskimeye gore):`);
console.log("saat/ay  saat/yil  bayat dayanak  yanlis karar  oran   saat basina dusen hata");
console.log("------- --------- --------------- ------------- ------ ----------------------");
let oncekiOran = sifir.oran, oncekiSaat = 0;
for (const b of [0, 2, 4, 6, 12, 24, 48]) {
  const r = kosum({ strateji: "eskimeye gore", butce: b });
  const marj = b === 0 ? null : (oncekiOran - r.oran) / ((b - oncekiSaat) * 12);
  console.log(`${String(b).padStart(7)} ${String(b * 12).padStart(9)} ${r.bayatOran.toFixed(4).padStart(15)} ` +
    `${String(r.yanlis).padStart(13)} ${r.oran.toFixed(4).padStart(6)} ` +
    `${(marj === null ? "-" : marj.toExponential(2)).padStart(22)}`);
  oncekiOran = r.oran; oncekiSaat = b;
}

console.log(`\ntohum duyarliligi (butce ${BUTCE}, strateji: eskimeye gore):`);
console.log("tohum       oran");
for (const t of [20260801, 991, 4242]) {
  const r = kosum({ strateji: "eskimeye gore", butce: BUTCE, tohum: t });
  console.log(`${String(t).padStart(9)} ${r.oran.toFixed(4).padStart(9)}`);
}

console.log(`\ntaban: butun dayanaklar taze olsa bile karar basina yanlislik = ${(1 - (1 - TABAN) ** DAYANAK_BASINA_KARAR).toFixed(4)}`);
ay 72, aylik karar 4, toplam karar 288, tohum 20260801
dayanak: olcum 30 (omur 6 ay, tazeleme 1 saat); arac 20 (omur 18 ay, tazeleme 4 saat); yapi 10 (omur 120 ay, tazeleme 12 saat)

butce 6 saat/ay = 72 saat/yil
strateji           olcum   arac   yapi   bayat dayanak  yanlis karar  oran   dususu
----------------- ------ ------ ------ --------------- ------------- ------ -------
butce yok              -      -      -          0.8461           261 0.9063       -
esit                0.33   0.33   0.33          0.4039           114 0.3958   56.3%
eskimeye gore       0.81   0.18   0.01          0.2662           107 0.3715   59.0%
yalniz olcum        1.00   0.00   0.00          0.3403           150 0.5208   42.5%
yalniz yapi         0.00   0.00   1.00          0.7778           260 0.9028    0.4%
en bayat once          -      -      -          0.2940            64 0.2222   75.5%

butce buyudukce (strateji: eskimeye gore):
saat/ay  saat/yil  bayat dayanak  yanlis karar  oran   saat basina dusen hata
------- --------- --------------- ------------- ------ ----------------------
      0         0          0.8461           261 0.9063                      -
      2        24          0.6227           206 0.7153                7.96e-3
      4        48          0.4144           138 0.4792                9.84e-3
      6        72          0.2662           107 0.3715                4.48e-3
     12       144          0.2130            67 0.2326                1.93e-3
     24       288          0.0648            49 0.1701                4.34e-4
     48       576          0.0475            47 0.1632                2.41e-5

tohum duyarliligi (butce 6, strateji: eskimeye gore):
tohum       oran
 20260801    0.3715
      991    0.3854
     4242    0.3715

taban: butun dayanaklar taze olsa bile karar basina yanlislik = 0.1426

Bütün sayılar bu koşuma aittir; üreteç kendi yazılmıştır ve tohum görünür. Tohum duyarlılığı satırları oranın 0,3715 ile 0,3854 arasında oynadığını gösteriyor, yani karşılaştırmalar tohuma bağlı değil.

Dağıtımın Sonucu

İlk tablo, aynı yetmiş iki saatin nereye konduğuna göre yanlış karar oranını 0,9028 ile 0,2222 arasında herhangi bir yere koyabildiğini gösteriyor. Aradaki fark dört kattan fazla ve bütçe hiç değişmedi.

En keskin satır yalniz yapi. Bütün bütçe yapısal ilkelere harcandığında oran 0,9028; hiç bütçe olmadığındaki 0,9063’ten yalnız yüzde 0,4 daha iyi. Yapısal ilkeler yüz yirmi ay geçerli kaldığı için yetmiş iki aylık koşumda zaten bayatlamıyorlar; onları tazelemek hiçbir kararı kurtarmıyor. Öğrenmenin en saygın görünen biçimi, bu modelde ölçülebilir hiçbir şey değiştirmiyor.

Karşı uç da tek başına doğru değil. yalniz olcum bütçenin tamamını en hızlı eskiyen kategoriye koyuyor ve oranı 0,5208’e indiriyor — eşit dağıtımın 0,3958’inden kötü. Bir kategoriyi tamamen ihmal etmek, oradaki dayanakların hepsini bayatlatıyor.

eskimeye gore dağıtımı payları kategorinin eskime hızından çıkarıyor: ölçüm 0,81, araç 0,18, yapı 0,01. Sonuç 0,3715 ile eşit dağıtımdan iyi ama en iyisi değil. en bayat once hiç pay hesaplamıyor; her ay elindeki bütçeyi, geçerlilik süresini en çok aşmış dayanaktan başlayarak harcıyor ve oranı 0,2222’ye indiriyor — yanlış karar sayısı 107 yerine 64.

Sabit pay, bir kategoride harcanacak bayat dayanak kalmadığında bile o saati oraya harcamak zorunda; en bayat once bütün dayanakları tek sırada tutuyor. Bir yan ölçüsü de var: bayat dayanak oranı eskimeye gore ile 0,2662, en bayat once ile 0,2940 — daha çok bayat dayanak kalmasına rağmen daha az yanlış karar çıkıyor. Bayat dayanak saymak yeterli değildir; ne kadar bayat olduğu sayılmalıdır.

Bütçenin Sınırı

İkinci tablo bütçeyi büyütüyor. Yıllık 24 saatten 48 saate çıkıldığında saat başına düşen hata kazancı 7,96e-3’ten 9,84e-3’e yükseliyor; ondan sonra sürekli düşüyor ve 288 saatten 576 saate geçişte 2,41e-5’e iniyor. O son adımda yılda 288 saat daha harcanıyor ve oran yalnız 0,0069 azalıyor.

Sebebi son satırda yazılı: taban 0,1426. Bütün dayanaklar taze olsa bile üç dayanağa yaslanan bir kararın yanlış çıkma olasılığı bu kadardır, çünkü taze bir ölçüm de yanılabilir. Öğrenme bütçesi bu tabanı azaltamaz; yalnız bayatlıktan gelen fazlalığı kesebilir.

Öğrenme kararı böylece iki sayıya iner: bütçe hangi noktada tabana yaklaşıyor ve eldeki bütçe hangi kurala göre dağıtılıyor. İkincisi daha çok fark yaratıyor — yetmiş iki saatte dağıtım kuralını değiştirmek oranı 0,3958’den 0,2222’ye indiriyor, bütçeyi yetmiş iki saatten yüz kırk dört saate çıkarmak ise 0,3715’ten 0,2326’ya.

Özet

  • Bir kararın dayanağı geçerlilik süresi olan bir nesnedir; süre kategoriye bağlıdır (ölçüm 6, araç 18, yapı 120 ay) ve süresi aşıldıkça kararın yanlış çıkma olasılığı tabandan bire doğru yükselir (MP16, MP17).
  • Yetmiş iki aylık koşumda hiç öğrenme bütçesi olmayan düzen 288 kararın 261’ini yanlış çıkardı (oran 0,9063); aynı bütçeyle yalnız yapısal ilkeleri tazelemek oranı 0,9028’e, yani yüzde 0,4 düşürdü.
  • Aynı yıllık 72 saat, dağıtıma göre 0,3958 (eşit), 0,3715 (eskimeye göre) ve 0,2222 (en bayat önce) verdi. Öğrenme bir bütçe dağıtımıdır ve dağıtım kuralı bütçenin kendisinden daha çok fark yaratır.
  • Bayat dayanak sayısı tek başına yanıltıcıdır: en iyi sonucu veren strateji daha çok bayat dayanak bıraktı (0,2940’a karşı 0,2662) ama yanlış kararı 107’den 64’e indirdi.
  • Bütçe büyütmenin getirisi azalır ve bir tabanda durur: 0,1426, bütün dayanaklar taze olsa bile kalan yanlışlık payıdır. Yıllık 288 saatten sonra harcanan her saatin karşılığı 2,41e-5’tir.

Kurs Kapanışı

Ders Modellenen nesne Ölçülen nicelik Karşılaştırmanın sonucu
Yazılım Mimarisi Tanımı Karar–modül eşlemesi ve bağımlı kapanış Geri alma maliyeti (erişilen dosya) Gövde büyüklüğü sıralaması ile geri alma sıralaması 55 çiftin 31’inde ters düştü
Mimarlık Düzeyleri Karar kapsamı ve dağıtım birimi eşlemesi Kapsanan birim, habersiz birim, yinelenen karar Yerel düzen 47 habersiz birim ve 31 çelişen gerçekleştirim; merkezî düzen 0 çelişki ama 99 danışma
Mimarın Sorumlulukları Sorumluluk matrisi ve makinece denetlenebilir kısıt Kodda karşılığını yitiren karar oranı Gözetimsiz düzende uygulanma yüzde 25, gözetimli düzende yüzde 88
Mimar ve Geliştirici İlişkisi Karar verenin bildiği ithal grafiği ile gerçek grafik Ölü doğan karar oranı ve bilgi farkı (kenar) Koda dokunmayan mimarda 18 kararın 8’i ölü doğdu, dokunanda hiç; bilgi farkı 13,8 kenara karşı 3,1
Danışmanlık ve Koçluk Karar aktarım biçimi ve kalıp/kenar durum ayrımı Doğru uygulanma oranı ve aktarım saati başına artış 168 durumda buyruk yüzde 68, yazılı gerekçe yüzde 85, birlikte çalışma yüzde 87; saat başına artış 3,71’e karşı 0,55
Denge Kurmak Alternatif–nitelik tablosu ve ağırlık vektörü Kazananı değiştirebilen ama kaynağı yazılmamış ağırlık sayısı 1771 vektörde kazanan bölgeler yüzde 17,7 ve yüzde 68,4; yazılmamış ağırlık 1’den 0’a indi
Basitleştirmek Modül grafiği ile gereksinim grafiği Özsel ve arızi karmaşıklık payı Sadeleştirme toplamı 37’den 26’ya indirdi, değişikliğin yayıldığı modül 13’ten 16’ya çıktı
Karar Verme Karar kümesi ve bağımlılık kümesi Geri alma maliyeti ve bekleme süresi hepsine-uzun politikası 58,70 adam-gün ve 120 gün; eşiği kırılma noktasından türeten politika 38,70 adam-gün ve 55 gün
Paydaş Yönetimi Paydaş sözlüğü, ilgi kümesi ve ifade dizisi Yanıtlanan soru, onay turu, atlanan kısıt Teknik anlatım 27 soru ve 8 tur; sonuç odaklı anlatım 0 soru ama 4 sürprizle toplam 7 tur; kısıt taşıyan anlatım 3 tur
Teknoloji Değerlendirme Aday özellik kümesi ve on iki modüllük kaynak ağacı Çıkış maliyeti (saat), ağırlığa göre kazanan Beş ağırlık kümesi üç ayrı kazanan verdi; sarmalayıcı kod payını 33,5 saatten 4,0 saate indirdi, veri payı 24,0 saat değişmedi
Sürekli Öğrenme Disiplini Dayanak yaşı ve geçerlilik süresi Yanlış çıkan karar oranı Aynı yıllık 72 saat dağıtıma göre 0,3958, 0,3715 ve 0,2222 verdi; bütçesiz düzen 0,9063

On bir satırın ortak biçimi kursun kuralıdır: bir pratiğin değeri ancak ölçülen farkla savunulur. Hiçbir derste “mimar dengeli olmalıdır”, “mimar sade tasarlamalıdır”, “mimar iletişim kurmalıdır” cümlesi bir sonuç sayılmadı. Her seferinde pratiğin ürünü bir veri yapısına çevrildi, iki uygulama biçimi aynı girdide koşturuldu ve aradaki fark bir sayı olarak yazıldı. Fark ölçülemiyorsa ortada savunulacak bir pratik de yoktur.

Bu kurs boyunca kararlar verildi: dengeler kuruldu, alternatifler elendi, eşikler türetildi, kısıtlar paydaşlara taşındı, adaylar ağırlıklandırıldı ve dayanaklar tazelendi. Hepsinin ortak bir kusuru var. Hepsi kararı verenin belleğinde duruyor. Ağırlık vektörünün kaynağı, elenen alternatifin neden elendiği, eşiğin hangi kırılma noktasından geldiği, sarmalayıcının hangi başabaş olasılığıyla yazıldığı — bunların hiçbiri koda yazılmadı. Altı ay sonra “bu neden böyle” diye soran birine verilecek bir şey yok. Sıradaki kurs, Mimari Karar ve Dokümantasyon, buradan başlar.

İ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