İçeriğe geç
academia.sh

Ders 10 / 11

Teknoloji Değerlendirme

Aday araçların olgunluk, ekosistem ve çıkış maliyeti ölçütleriyle ağırlıklandırılması: on iki modüllük bir kaynak ağacı diske yazılıp taranarak çıkış maliyetinin 53,0 ile 60,5 saat arasında ölçülmesi, yerleşik yeteneğin toplam satırı 127'den 73'e indirirken çıkışı büyütmesi, kazananın ağırlık kümesine göre değişmesi ve sarmalayıcının kod payını 33,5 saatten 4,0 saate indirirken veri payını hiç azaltmaması.

İçindekiler

Önceki ders bir kararın nasıl anlatılacağını ölçtü ve kararın içeriğini sabit tuttu: ödünç kayıtları sürekli bir akışa taşınacaktı. O akışı hangi aracın taşıyacağı seçilmedi. Bölgesel kütüphane ağının modelinde bu seçim bir kez yapılır ve uzun süre yaşar; ödünç servisleri içeride yazılmıştır ama akışı taşıyan araç dışarıdan gelir.

Bu ders adayları ürün adıyla anmaz. Bir ürün adı yazmak bu dersi beş yılda eskitirdi; onun yerine adaylar betimleyici özelliklerle modellenir — A, B ve C, her biri bir olgunluk profili, bir ekosistem profili ve bir yerleşik yetenek kümesidir. Ölçülecek üç şey vardır: olgunluk (maturity), ekosistem ve çıkış maliyeti (exit cost). Üçüncüsü ötekilerden ayrılır, çünkü tek başına gerçek kod üzerinden okunabilir.

Çıkış Maliyeti Kaynak Ağacından Okunur

Olgunluk ve ekosistem, adayın kendisine ait niteliklerdir ve dışarıdan verilir. Çıkış maliyeti öyle değildir: adayın değil, adayın kendi kodumuza nasıl girdiğinin özelliğidir. Bu yüzden ölçülebilir.

Aşağıdaki modül kümesi gerçekten diske yazılır ve sonra taranır. Sayılar dosyalardan okunur. Ödünç servisinin modelinde on iki modül vardır ve her biri yedi yetenekten bir alt kümeye ihtiyaç duyar. Bir aday, ihtiyaç duyulan yeteneği yerleşik olarak sağlıyorsa modül o adaya bağlanır; sağlamıyorsa modül o yeteneği elde yazar ve adaya bağlanmaz.

MP13: çıkış maliyeti = bağ satırı × 0,5 saat + bağlı modül × 2 saat + taşınacak kayıt / 50.000. Üç terim ayrı işleri sayar: çağrının yeniden yazılması, modülün yeniden sınanması ve verinin taşınması. Taşınacak kayıt modelde 1.200.000’dir ve hangi aday seçilirse seçilsin aynıdır.

MP14: adayların yaş, kırıcı sürüm sıklığı, açık kusurun kapanma süresi, uyarlayıcı sayısı, belgelenmiş işlev oranı ve bağımsız gerçekleştirim sayısı değerleri model değerleridir; hiçbir gerçek araçtan alınmamıştır ve ölçütlerin nasıl ağırlıklandırıldığını göstermek için vardır.

// degerlendirme/kod.mjs — aday secimini kod uzerinde olcen model. Uc aday gercek bir urun
// degil, betimleyici ozellik kumesidir. Modul kumesi diske gercekten yazilir ve cikis
// maliyeti yazilan dosyalar taranarak olculur; sayilar dosyalardan okunur, elle yazilmaz.
import { mkdirSync, writeFileSync, readFileSync, rmSync } from "node:fs";

export const YETENEKLER = ["yayin", "dinleme", "obek", "islem", "gecikmeli", "oynatma", "olu"];

// Odunc servisinin modelindeki on iki modul ve her birinin ihtiyac duydugu yetenekler.
export const MODULLER = {
  "api": ["yayin", "dinleme"],
  "uzatma": ["yayin"],
  "gecikme": ["yayin", "gecikmeli"],
  "rezervasyon": ["yayin", "dinleme", "islem"],
  "bildirim": ["dinleme", "gecikmeli", "olu"],
  "rapor": ["dinleme", "obek"],
  "sube-devri": ["yayin", "islem"],
  "ceza": ["yayin", "olu"],
  "uyelik": ["dinleme"],
  "katalog-koprusu": ["yayin", "dinleme", "oynatma"],
  "gunluk": ["obek", "oynatma"],
  "olcum": ["dinleme", "obek"],
};

// MP14: adaylar yalnizca ozellikleriyle taninir. "destek" adayin yerlesik olarak sagladigi
// yeteneklerdir; saglamadigi her yetenek modulde elde yazilir.
export const ADAYLAR = {
  A: { destek: ["yayin", "dinleme"], yas: 11, kiriciSurum: 0.4, kusurGun: 21,
       uyarlayici: 9, belgeliIslev: 0.95, bagimsizGerceklestirim: 3 },
  B: { destek: ["yayin", "dinleme", "obek", "olu"], yas: 6, kiriciSurum: 1.1, kusurGun: 9,
       uyarlayici: 38, belgeliIslev: 0.92, bagimsizGerceklestirim: 1 },
  C: { destek: YETENEKLER, yas: 2, kiriciSurum: 3.0, kusurGun: 4,
       uyarlayici: 41, belgeliIslev: 0.55, bagimsizGerceklestirim: 1 },
};

// Bir modulu gercek bir kaynak dosya olarak uretir.
function modulMetni(ad, ihtiyac, destek, istemciYolu, sarmalYolu = null) {
  const yerlesik = ihtiyac.filter((y) => destek.includes(y));
  const elde = ihtiyac.filter((y) => !destek.includes(y));
  const s = [];
  if (yerlesik.length > 0) s.push(`import { istemci } from "${sarmalYolu ?? istemciYolu}";`);
  for (const y of elde) {
    s.push(`function elde_${y}(kayit) {`);
    s.push(`  const kuyruk = [];`);
    s.push(`  for (const k of kayit) kuyruk.push({ ad: "${y}", k });`);
    s.push(`  return kuyruk;`);
    s.push(`}`);
  }
  s.push(`export async function ${ad.replace(/-/g, "_")}(kayit) {`);
  for (const y of yerlesik) s.push(`  await istemci.${y}(kayit);`);
  for (const y of elde) s.push(`  elde_${y}(kayit);`);
  s.push(`  return kayit.length;`);
  s.push(`}`);
  return s.join("\n") + "\n";
}

// Sarmalayici: yalnizca kendisine verilen yetenek kumesini disa acar. Her yetenek icin
// cagri aktarimi ve hata cevirisi yazilir.
function sarmalMetni(kapsam) {
  const s = [`import { istemci as ham } from "../aday/istemci.mjs";`, `export const istemci = {`];
  for (const y of kapsam) {
    s.push(`  ${y}: async (kayit) => {`);
    s.push(`    try { return await ham.${y}(kayit); }`);
    s.push(`    catch (e) { throw new Error("ileti araci hatasi: " + e.message); }`);
    s.push(`  },`);
  }
  s.push(`};`);
  return s.join("\n") + "\n";
}

// Uretilen dosyalar taranir: adayin istemcisine baglanan modul ve cagri satiri sayilir.
function tara(kok, modulAdlari, ekDosya = []) {
  let bagliModul = 0, bagSatiri = 0, toplamSatir = 0, eldeIslev = 0;
  const dosyalar = [...modulAdlari.map((a) => `${kok}/${a}.mjs`), ...ekDosya];
  for (const yol of dosyalar) {
    const satirlar = readFileSync(yol, "utf8").trimEnd().split("\n");
    toplamSatir += satirlar.length;
    const ham = satirlar.some((s) => /from "\.\.\/aday\/istemci\.mjs"/.test(s));
    if (ham) bagliModul += 1;
    if (ham) bagSatiri += satirlar.filter((s) => /(istemci|ham)\.\w+\(/.test(s)).length;
    eldeIslev += satirlar.filter((s) => /^function elde_/.test(s)).length;
  }
  return { bagliModul, bagSatiri, toplamSatir, eldeIslev };
}

// Bir adayin dogrudan kullanimini uretir ve olcer.
export function dogrudan(kok, aday) {
  rmSync(kok, { recursive: true, force: true });
  mkdirSync(`${kok}/aday`, { recursive: true });
  mkdirSync(`${kok}/odunc`, { recursive: true });
  writeFileSync(`${kok}/aday/istemci.mjs`, `export const istemci = {};\n`);
  for (const [ad, ihtiyac] of Object.entries(MODULLER))
    writeFileSync(`${kok}/odunc/${ad}.mjs`, modulMetni(ad, ihtiyac, aday.destek, "../aday/istemci.mjs"));
  return tara(`${kok}/odunc`, Object.keys(MODULLER));
}

// Ayni adayin sarmalayici arkasindan kullanimi. Sarmalayicinin kapsamadigi yetenege ihtiyaci
// olan modul, istemciye dogrudan baglanmak zorundadir: sizinti budur.
export function sarmalli(kok, aday, kapsam) {
  rmSync(kok, { recursive: true, force: true });
  mkdirSync(`${kok}/aday`, { recursive: true });
  mkdirSync(`${kok}/ortak`, { recursive: true });
  mkdirSync(`${kok}/odunc`, { recursive: true });
  writeFileSync(`${kok}/aday/istemci.mjs`, `export const istemci = {};\n`);
  writeFileSync(`${kok}/ortak/sarmal.mjs`, sarmalMetni(kapsam));
  let sizan = 0;
  for (const [ad, ihtiyac] of Object.entries(MODULLER)) {
    const yerlesik = ihtiyac.filter((y) => aday.destek.includes(y));
    const disarida = yerlesik.filter((y) => !kapsam.includes(y));
    if (disarida.length > 0) sizan += 1;
    const yol = disarida.length > 0 ? "../aday/istemci.mjs" : "../ortak/sarmal.mjs";
    writeFileSync(`${kok}/odunc/${ad}.mjs`,
      modulMetni(ad, ihtiyac, aday.destek, "../aday/istemci.mjs", yol));
  }
  const sarmalSatiri = readFileSync(`${kok}/ortak/sarmal.mjs`, "utf8").trimEnd().split("\n").length;
  return { ...tara(`${kok}/odunc`, Object.keys(MODULLER), [`${kok}/ortak/sarmal.mjs`]),
    sizan, sarmalSatiri };
}

// MP13: cikis maliyeti = baglayan cagri satiri x 0,5 saat + bagli modul x 2 saat sinama
// + tasinacak kayit / 50.000 saat. Veri payi adaydan bagimsizdir.
export const TASINACAK_KAYIT = 1_200_000;
export const cikisMaliyeti = (o) =>
  o.bagSatiri * 0.5 + o.bagliModul * 2 + TASINACAK_KAYIT / 50_000;

Ağırlık Kazananı Belirler

Ölçütler farklı birimlerdedir: yıl, gün, adet, oran, saat. Toplanabilmeleri için hepsi sıfır ile bir arasına çekilir ve yüksek değer her zaman iyiyi gösterir. Bundan sonrası bir ağırlık kararıdır ve ağırlık teknik bir sayı değil, bir tercih beyanıdır.

// degerlendirme/secim.mjs — olgunluk, ekosistem ve cikis maliyeti agirliklandirilir
import { ADAYLAR, MODULLER, YETENEKLER, dogrudan, sarmalli, cikisMaliyeti, TASINACAK_KAYIT }
  from "./kod.mjs";

const KOK = "./uretilen";
const olcum = {};
for (const [ad, aday] of Object.entries(ADAYLAR)) olcum[ad] = dogrudan(`${KOK}/${ad}`, aday);

console.log(`modul ${Object.keys(MODULLER).length}, yetenek ${YETENEKLER.length}, tasinacak kayit ${TASINACAK_KAYIT}\n`);
console.log("aday  destek  bagli modul  bag satiri  elde yazilan islev  toplam satir  cikis (saat)");
console.log("---- ------- ------------ ----------- ------------------- ------------- -------------");
for (const [ad, aday] of Object.entries(ADAYLAR)) {
  const o = olcum[ad];
  console.log(`${ad.padStart(4)} ${`${aday.destek.length}/7`.padStart(7)} ${String(o.bagliModul).padStart(12)} ` +
    `${String(o.bagSatiri).padStart(11)} ${String(o.eldeIslev).padStart(19)} ` +
    `${String(o.toplamSatir).padStart(13)} ${cikisMaliyeti(o).toFixed(1).padStart(13)}`);
}

// Butun olcutler 0-1 araligina cekilir; yuksek her zaman iyidir.
const olcut = {
  yas: (a) => Math.min(1, a.yas / 10),
  kiriciSurum: (a) => 1 / (1 + a.kiriciSurum),
  kusurGun: (a) => 1 / (1 + a.kusurGun / 10),
  bagimsizGerceklestirim: (a) => Math.min(1, a.bagimsizGerceklestirim / 3),
  uyarlayici: (a) => Math.min(1, a.uyarlayici / 40),
  belgeliIslev: (a) => a.belgeliIslev,
  kapsam: (a) => a.destek.length / YETENEKLER.length,
  cikis: (a, ad) => 1 / (1 + cikisMaliyeti(olcum[ad]) / 50),
  azSatir: (a, ad) => 1 / (1 + olcum[ad].toplamSatir / 100),
};

const bir = Object.fromEntries(Object.keys(olcut).map((k) => [k, 1]));
const AGIRLIK = {
  "olgunluk agirlikli": { ...bir, yas: 3, kiriciSurum: 3, kusurGun: 3, bagimsizGerceklestirim: 3 },
  "ekosistem agirlikli": { ...bir, uyarlayici: 3, belgeliIslev: 3, kapsam: 3 },
  "cikis agirlikli": { ...bir, cikis: 6 },
  "gelistirme agirlikli": { ...bir, kapsam: 3, azSatir: 4 },
  "esit": { ...bir },
};

const puanla = (ad, w) => {
  let t = 0, top = 0;
  for (const [k, f] of Object.entries(olcut)) { t += w[k] * f(ADAYLAR[ad], ad); top += w[k]; }
  return t / top;
};

console.log(`\nagirlik kumesi          A       B       C   kazanan   fark`);
console.log(`--------------------- ------- ------- ------- ------- ------`);
for (const [ad, w] of Object.entries(AGIRLIK)) {
  const p = Object.fromEntries(Object.keys(ADAYLAR).map((k) => [k, puanla(k, w)]));
  const s = Object.entries(p).sort((x, y) => y[1] - x[1]);
  console.log(`${ad.padEnd(21)} ${p.A.toFixed(4).padStart(7)} ${p.B.toFixed(4).padStart(7)} ` +
    `${p.C.toFixed(4).padStart(7)} ${s[0][0].padStart(7)} ${(s[0][1] - s[1][1]).toFixed(4).padStart(6)}`);
}

// Sarmalayici, adaylarin ortak kesisimini kapsayabilir; kesisim disi her yetenek sizintidir.
const kesisim = YETENEKLER.filter((y) => Object.values(ADAYLAR).every((a) => a.destek.includes(y)));
console.log(`\nadaylarin ortak yetenek kesisimi: ${kesisim.join(", ")} (${kesisim.length}/7)`);
console.log(`\naday B secilirse sarmalayici kapsami:`);
console.log("kapsam                  sarmal satiri  sizan modul  bagli modul  bag satiri  cikis (saat)  dusus");
console.log("---------------------- -------------- ------------ ------------ ----------- ------------- ------");
const ham = cikisMaliyeti(olcum.B);
for (const kapsam of [kesisim, ["yayin", "dinleme", "obek"], ADAYLAR.B.destek]) {
  const o = sarmalli(`${KOK}/sarmal`, ADAYLAR.B, kapsam);
  const m = cikisMaliyeti(o);
  console.log(`${kapsam.join(",").padEnd(22)} ${String(o.sarmalSatiri).padStart(14)} ` +
    `${String(o.sizan).padStart(12)} ${String(o.bagliModul).padStart(12)} ${String(o.bagSatiri).padStart(11)} ` +
    `${m.toFixed(1).padStart(13)} ${`${((1 - m / ham) * 100).toFixed(1)}%`.padStart(6)}`);
}
const tam = sarmalli(`${KOK}/sarmal`, ADAYLAR.B, ADAYLAR.B.destek);
const veri = TASINACAK_KAYIT / 50_000;
const kazanc = ham - cikisMaliyeti(tam);
console.log(`\nB'de cikis: sarmalayicisiz ${ham.toFixed(1)} saat, tam kapsamli sarmalayiciyla ${cikisMaliyeti(tam).toFixed(1)} saat`);
console.log(`kod payi ${(ham - veri).toFixed(1)} -> ${(cikisMaliyeti(tam) - veri).toFixed(1)} saat; veri payi ${veri.toFixed(1)} saat iki durumda da ayni`);
console.log(`MP15: sarmalayicinin ${tam.sarmalSatiri} satiri yilda ${(tam.sarmalSatiri * 0.1).toFixed(1)} saat bakim ister`);
console.log(`basabas gecis olasiligi = yillik bakim / kazanc = ${(tam.sarmalSatiri * 0.1 / kazanc).toFixed(3)}`);
const eksik = YETENEKLER.filter((y) => !ADAYLAR.A.destek.includes(y));
console.log(`A secilseydi ${olcum.A.eldeIslev} elde yazilan islev gerekirdi; ayni islevler bir sarmalayicinin ardinda ${eksik.length} kez yazilirdi`);
modul 12, yetenek 7, tasinacak kayit 1200000

aday  destek  bagli modul  bag satiri  elde yazilan islev  toplam satir  cikis (saat)
---- ------- ------------ ----------- ------------------- ------------- -------------
   A     2/7           11          14                  11           127          53.0
   B     4/7           12          19                   6           103          57.5
   C     7/7           12          25                   0            73          60.5

agirlik kumesi          A       B       C   kazanan   fark
--------------------- ------- ------- ------- ------- ------
olgunluk agirlikli     0.6763  0.5416  0.4749       A 0.1347
ekosistem agirlikli    0.5563  0.6812  0.6785       B 0.0026
cikis agirlikli        0.5608  0.5472  0.5243       A 0.0136
gelistirme agirlikli   0.5226  0.5683  0.6294       C 0.0612
esit                   0.6026  0.5928  0.5642       A 0.0098

adaylarin ortak yetenek kesisimi: yayin, dinleme (2/7)

aday B secilirse sarmalayici kapsami:
kapsam                  sarmal satiri  sizan modul  bagli modul  bag satiri  cikis (saat)  dusus
---------------------- -------------- ------------ ------------ ----------- ------------- ------
yayin,dinleme                      11            5            6          11          41.5  27.8%
yayin,dinleme,obek                 15            2            3           7          33.5  41.7%
yayin,dinleme,obek,olu             19            0            1           4          28.0  51.3%

B'de cikis: sarmalayicisiz 57.5 saat, tam kapsamli sarmalayiciyla 28.0 saat
kod payi 33.5 -> 4.0 saat; veri payi 24.0 saat iki durumda da ayni
MP15: sarmalayicinin 19 satiri yilda 1.9 saat bakim ister
basabas gecis olasiligi = yillik bakim / kazanc = 0.064
A secilseydi 11 elde yazilan islev gerekirdi; ayni islevler bir sarmalayicinin ardinda 5 kez yazilirdi

İlk tablonun bütün sayıları diske yazılmış dosyalardan okunmuştur; ikinci tablo bu sayıları girdi alan bir hesaptır.

Yerleşik Yetenek Hem Tasarruf Hem Bağdır

İlk tablo tek bir eğilim gösteriyor ve iki yöne birden gidiyor. Yerleşik yetenek 2/7’den 7/7’ye çıktıkça toplam satır 127’den 73’e iniyor (yüzde 42 azalma) ve elde yazılan işlev 11’den 0’a düşüyor. Aynı yönde çıkış maliyeti 53,0 saatten 60,5 saate çıkıyor ve bağ satırı 14’ten 25’e yükseliyor.

İki sütun aynı olayı sayıyor. Adayın sağladığı her yetenek, yazılmayan bir işlev ve kurulan bir bağdır. En zengin adayla hiç kod yazılmıyor; ayrılırken yeniden yazılacak yirmi beş satır kalıyor. En dar adayla on bir işlev elde yazılıyor; o işlevler ayrılırken taşınıyor, çünkü kimseye bağlı değiller. Zengin bir araç geliştirmeyi hızlandırdığı için değil, hızlandırdığı ölçüde pahalı bir çıkış bırakır.

Kazanan Ağırlığa Bağlıdır

İkinci tabloda beş ağırlık kümesi ve üç ayrı kazanan var. Olgunluk ağırlıklandırıldığında A, ekosistem ağırlıklandırıldığında B, geliştirme yükü ağırlıklandırıldığında C kazanıyor. Adaylar değişmedi; yalnız ölçütlerin çarpanları değişti.

Fark sütunu ikinci bir uyarı taşıyor. Ekosistem ağırlıklı satırda B, C’yi 0,0026 farkla geçiyor; olgunluk ağırlıklı satırdaki fark 0,1347, yani elli kattan fazlası. İlk satırda kazanan bir sonuç, ikincisinde bir yuvarlama artığıdır. Bir değerlendirme tablosu tek bir kazanan adı üretiyorsa eksiktir; farkı da yazmalıdır, çünkü küçük fark ölçütün birini biraz farklı tanımlamanın kazananı değiştireceği anlamına gelir.

Çıkış ağırlıklı satırda kazanan değişmiyor. Sebebi son bölümde görünüyor: çıkış maliyetinin büyük kısmı adaydan bağımsızdır.

Sarmalayıcının Ödettiği

Üçüncü tablo, seçim yanlış çıkarsa çıkışı ucuzlatmak için konan sarmalayıcı katmanı ölçüyor. Sarmalayıcı yalnız kendisine verilen yeteneği dışa açar; kapsamadığı bir yeteneğe ihtiyaç duyan modül araca doğrudan bağlanmak zorundadır. Bu sızıntıdır ve sayılabilir.

Üç adayın ortak yetenek kesişimi 2/7’dir. Sarmalayıcı gerçekten taşınabilir olsun isteniyorsa kapsamı en fazla bu kesişim olabilir — ve o kapsamda 5 modül sızıyor, çıkış maliyeti 57,5 saatten yalnız 41,5 saate iniyor (yüzde 27,8). Kapsam adayın kendi yetenek kümesine kadar genişletildiğinde sızıntı sıfırlanıyor ve çıkış 28,0 saate iniyor (yüzde 51,3) — ama artık sarmalayıcı seçilen adayın yeteneklerini dışa açtığı için başka bir adaya geçiş, o yetenekleri sarmalayıcının ardında elde yazmayı gerektirir. Son satır bunun ölçüsünü veriyor: dar bir aday doğrudan kullanıldığında 11 elde yazılan işlev gerekiyor, aynı işlevler bir sarmalayıcının ardında 5 kez yazılıyor.

Asıl sınır kod payıyla veri payının ayrılmasında. Sarmalayıcı kod payını 33,5 saatten 4,0 saate indiriyor; veri payı 24,0 saat iki durumda da aynı kalıyor, çünkü 1.200.000 kayıt hangi araca geçilirse geçilsin taşınacaktır. Sarmalayıcının azaltabileceği en büyük miktar toplam çıkışın yarısı kadardır.

Bedelin kendisi de bir sayıdır. MP15: sarmalayıcının her satırı yılda 0,1 saat bakım ister. On dokuz satır yılda 1,9 saat eder; kazanç 29,5 saattir. Sarmalayıcı, araç değiştirme olasılığı yıllık 0,064’ten büyükse kendini ödüyor. Bu eşik, sarmalayıcının yazılıp yazılmayacağını bir tahmine değil, bir karşılaştırmaya bağlar.

Özet

  • Aday ürün adıyla değil, olgunluk ve ekosistem ölçütleriyle betimlenir; çıkış maliyeti adayın değil, adayın koda nasıl girdiğinin özelliğidir ve on iki modüllük bir kaynak ağacı diske yazılıp taranarak ölçülür (MP13, MP14).
  • Yerleşik yetenek 2/7’den 7/7’ye çıktığında toplam satır 127’den 73’e, elde yazılan işlev 11’den 0’a iner; aynı anda çıkış maliyeti 53,0 saatten 60,5 saate çıkar. Sağlanan her yetenek hem yazılmayan bir işlev hem kurulan bir bağdır.
  • Beş ağırlık kümesi üç ayrı kazanan üretti. Kazanan, adayların değil ağırlıkların sonucudur; ekosistem ağırlıklı satırda fark 0,0026, olgunluk ağırlıklı satırda 0,1347 — birinci fark bir sonuç değildir ve tablo kazananla birlikte farkı da yazmalıdır.
  • Sarmalayıcının kapsamı adayların ortak kesişimiyle sınırlıdır (2/7); o kapsamda 5 modül sızar ve çıkış yalnız yüzde 27,8 azalır. Tam kapsam sızıntıyı sıfırlar ama sarmalayıcıyı seçilen adaya bağlar.
  • Sarmalayıcı çıkışın kod payını 33,5 saatten 4,0 saate indirir, veri payı olan 24,0 saati hiç azaltmaz; on dokuz satırlık bakım yüküyle karşılaştırıldığında yıllık geçiş olasılığı 0,064’ten büyükse kendini öder (MP15).

Sonraki Adım

Bu dersin bütün sayıları bir ana bağlıdır. Adayın yaşı, kırıcı sürüm sıklığı, uyarlayıcı sayısı ve belgelenmiş işlev oranı ölçüldükleri gün doğrudur; ağırlıklar da o günün önceliklerini yansıtır. Karar bu tabloyla verilir ve tablo yerinde durur — ama tablonun dayandığı sayılar durmaz. Sıradaki ders, kursun son dersi, bunu bir modele çevirir: bir kararın dayanağının geçerlilik süresi vardır, yenilenmeyen dayanağa yaslanan kararın yanlış çıkma oranı vardır ve öğrenmeye ayrılan pay bu oranı düşürür. Sorusu şudur: bilgi tazeliği bir erdem değil, bir bütçe dağıtımıysa o bütçe nasıl dağıtılır?

İ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