---
title: 'Teknoloji Değerlendirme'
source: 'https://academia.sh/tr/kurslar/mimarin-rolu/teknoloji-degerlendirme'
course: 'Mimarın Rolü'
language: tr
updated: '2026-08-17T18:10:33+00:00'
license: 'CC BY-SA 4.0'
---

# 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ı.

Ö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.

```js
// 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.

```js
// 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?
