---
title: 'Ödünleşim Çözümlemesi'
source: 'https://academia.sh/tr/kurslar/mimari-dokumantasyon/odunlesim-cozumlemesi'
course: 'Mimari Karar ve Dokümantasyon'
language: tr
updated: '2026-08-17T18:10:33+00:00'
license: 'CC BY-SA 4.0'
---

# Ödünleşim Çözümlemesi

Alternatiflerin nitelik ekseninde puanlandığı tablonun kayda geçmiş halinin ölçülmesi: üçüncü bir kişinin kayıttaki tabloyla aynı sonuca varıp varamadığı sayılır, eksik ölçüt, yazılmamış ağırlık ve kaynağı belirsiz puan üç ayrı kusur olarak ayrılır, her kusur tek tek giderilerek yeniden üretilebilen karar oranı ölçülür ve tamamlamanın dakika cinsinden bedeli kazanılan çözümleme başına hesaplanır.

Önceki ders bir değerlendirme turunun kararı çevirdiğini ölçtü ve geriye "şu bilgi yüzünden
değişti" biçiminde tek satırlık bir gerekçe bıraktı. O satırın arkasında birden çok alternatif,
birden çok nitelik ve her alternatifin her nitelikteki durumu vardı. **Ödünleşim çözümlemesi** bu
tablonun adıdır.

Tablonun nasıl kurulacağı, ağırlıkların kazananı nasıl belirlediği ve ağırlık uzayının taranmasıyla
kararın ne kadar dayanıklı olduğu önceki kursta ölçüldü. Burada tekrarlanmaz. Bu dersin sorusu
başkadır: çözümleme yapıldıktan ve kayda geçtikten sonra, o kaydı okuyan **üçüncü bir kişi** aynı
sonuca varabiliyor mu. Ölçülecek nicelik budur — **yeniden üretilebilirlik**.

## Kayıttaki Tablo ve Üçüncü Kişi

Bir çözümlemenin yeniden üretilebilmesi için kayıtta dört şeyin bulunması gerekir: alternatifler,
ölçütler, puanlar ve ağırlıklar. Pratikte üç kusur görülür ve üçü farklı biçimde bozar.

**Eksik ölçüt.** Kararda etkili olmuş bir nitelik tabloya hiç girmemiştir. Tablo eksiksiz görünür,
çünkü eksik olan sütunun yeri boş kalmaz — sütun yoktur.

**Yazılmamış ağırlık.** Ölçütler yazılmıştır, ağırlıklar yazılmamıştır. Okuyan kişi bir varsayım
yapmak zorunda kalır ve yapacağı varsayım eşit ağırlıktır; önceki kursta ölçüldüğü gibi eşit
ağırlık da bir ağırlık kümesidir, yalnızca seçildiği söylenmemiştir.

**Kaynağı belirsiz puan.** Puan yazılıdır ama nereden geldiği yazılı değildir. Bu kusur kazananı
değiştirmez, doğrulamayı engeller: okuyan kişi aynı sonuca varır, ama vardığı sonucun doğru olup
olmadığını sınayamaz.

Aşağıdaki model beş çözümleme kaydı içerir. Her kaydın yanında modelin girdisi olarak kayda
girmemiş olan gerçek bilgi durur: eksik ölçütün adı ve puanları ile kararın gerçekten dayandığı
ağırlık vektörü (**KK10**). Üçüncü kişi bunları görmez; yalnızca kaydı okur. Kurgu bir modeldir.

```js
// odun/tablo.mjs — kayda gecmis odunlesim cozumlemeleri; kurgu bir modeldir
// Kayittaki tablo, eksik olan olcut ve gercek agirlik modelin girdisidir (KK10).
export const COZUMLEME = [
  { ad: "arama-dizini", alt: ["katalog-ici", "ayri-servis", "dis-hizmet"],
    olcut: ["yanit-suresi", "isletme-yuku", "maliyet"],
    puan: [[2, 2, 2], [5, 4, 3], [4, 5, 2]], agirlik: null, kaynaksiz: 2,
    eksik: { ad: "veri-tazeligi", puan: [5, 2, 2] }, gercek: [0.20, 0.15, 0.15, 0.50],
    kayitli: "katalog-ici" },
  { ad: "rapor-uretimi", alt: ["merkez", "sube", "gece-toplu"],
    olcut: ["tazelik", "sunucu-yuku", "gelistirme-suresi"],
    puan: [[4, 2, 4], [5, 4, 2], [2, 5, 5]], agirlik: [0.50, 0.30, 0.20], kaynaksiz: 1,
    eksik: null, gercek: [0.50, 0.30, 0.20], kayitli: "sube" },
  { ad: "uye-kimligi", alt: ["merkezi-servis", "sube-tablosu", "gunluk-kopya"],
    olcut: ["tutarlilik", "kesinti-dayanimi", "isletme-yuku"],
    puan: [[5, 2, 3], [2, 5, 4], [3, 4, 2]], agirlik: null, kaynaksiz: 0,
    eksik: null, gercek: [0.55, 0.25, 0.20], kayitli: "merkezi-servis" },
  { ad: "ceza-motoru", alt: ["odunc-servisi", "katalog-modulu", "sube-ayari"],
    olcut: ["degistirilebilirlik", "kurulum-yuku"],
    puan: [[5, 3], [2, 5], [3, 4]], agirlik: [0.60, 0.40], kaynaksiz: 2,
    eksik: { ad: "sube-istisnasi", puan: [2, 3, 5] }, gercek: [0.35, 0.25, 0.40],
    kayitli: "sube-ayari" },
  { ad: "yedekleme-yolu", alt: ["gece-penceresi", "surekli-akis", "haftalik-tam"],
    olcut: ["veri-kaybi-penceresi", "isletme-yuku", "maliyet"],
    puan: [[4, 4, 4], [5, 2, 2], [2, 5, 5]], agirlik: [0.45, 0.30, 0.25], kaynaksiz: 3,
    eksik: null, gercek: [0.45, 0.30, 0.25], kayitli: "gece-penceresi" },
];

export const kazanan = (alt, puan, w) => alt
  .map((ad, i) => ({ ad, toplam: puan[i].reduce((t, p, j) => t + p * w[j], 0) }))
  .sort((a, b) => b.toplam - a.toplam)[0].ad;

export const esit = (n) => Array(n).fill(1 / n);

// Okuyanin elindeki tablo: eksik olcut yok, agirlik yazilmamissa esit varsayilir.
export function okunan(c, duzelt = {}) {
  const olcut = duzelt.olcutEkle && c.eksik ? [...c.olcut, c.eksik.ad] : [...c.olcut];
  const puan = c.alt.map((_, i) => duzelt.olcutEkle && c.eksik
    ? [...c.puan[i], c.eksik.puan[i]] : [...c.puan[i]]);
  let w = duzelt.agirlikYaz ? c.gercek.slice(0, olcut.length)
    : c.agirlik ? c.agirlik.slice(0, olcut.length) : esit(olcut.length);
  while (w.length < olcut.length) w = [...w, 1 / olcut.length];  // eklenen olcut icin varsayilan
  const s = w.reduce((t, x) => t + x, 0);
  return { olcut, puan, w: w.map((x) => x / s) };
}

if (import.meta.url.endsWith(process.argv[1].split("/").pop())) {
  const k = (a) => COZUMLEME.filter(a).length;
  console.log(`${COZUMLEME.length} cozumleme; kusur: eksik olcut ${k((c) => c.eksik)}, ` +
    `yazilmamis agirlik ${k((c) => !c.agirlik)}, kaynagi belirsiz puan ` +
    `${COZUMLEME.reduce((t, c) => t + c.kaynaksiz, 0)}\n`);
  console.log("kayittaki tabloyla yeniden uretim:");
  for (const c of COZUMLEME) {
    const o = okunan(c);
    const kusur = [c.eksik && "eksik olcut", !c.agirlik && "yazilmamis agirlik",
      c.kaynaksiz && `${c.kaynaksiz} kaynaksiz puan`].filter(Boolean);
    console.log(`  ${c.ad.padEnd(15)} kayitli ${c.kayitli.padEnd(15)} okunan ` +
      `${kazanan(c.alt, o.puan, o.w).padEnd(15)} kusur: ${kusur.join(", ") || "-"}`);
  }
  const DUZELTME = [["kayitta oldugu gibi", {}], ["agirlik yazilinca", { agirlikYaz: true }],
    ["eksik olcut eklenince", { olcutEkle: true }],
    ["ikisi de", { agirlikYaz: true, olcutEkle: true }],
    ["kaynaklar da yazilinca", { agirlikYaz: true, olcutEkle: true, kaynakYaz: true }]];
  console.log("\nduzeltme etkisi (yeniden uretilebilen / ayrica dogrulanabilen):");
  for (const [ad, d] of DUZELTME) {
    const uret = COZUMLEME.filter((c) => {
      const o = okunan(c, d);
      return kazanan(c.alt, o.puan, o.w) === c.kayitli;
    });
    const dogrulanan = uret.filter((c) => d.kaynakYaz || c.kaynaksiz === 0);
    console.log(`  ${ad.padEnd(22)} ${uret.length}/${COZUMLEME.length}   ${dogrulanan.length}/${COZUMLEME.length}`);
  }
}
```

```
5 cozumleme; kusur: eksik olcut 2, yazilmamis agirlik 2, kaynagi belirsiz puan 8

kayittaki tabloyla yeniden uretim:
  arama-dizini    kayitli katalog-ici     okunan ayri-servis     kusur: eksik olcut, yazilmamis agirlik, 2 kaynaksiz puan
  rapor-uretimi   kayitli sube            okunan sube            kusur: 1 kaynaksiz puan
  uye-kimligi     kayitli merkezi-servis  okunan sube-tablosu    kusur: yazilmamis agirlik
  ceza-motoru     kayitli sube-ayari      okunan odunc-servisi   kusur: eksik olcut, 2 kaynaksiz puan
  yedekleme-yolu  kayitli gece-penceresi  okunan gece-penceresi  kusur: 3 kaynaksiz puan

duzeltme etkisi (yeniden uretilebilen / ayrica dogrulanabilen):
  kayitta oldugu gibi    2/5   0/5
  agirlik yazilinca      3/5   1/5
  eksik olcut eklenince  3/5   0/5
  ikisi de               5/5   1/5
  kaynaklar da yazilinca 5/5   5/5
```

Beş çözümlemenin ikisi kayıttaki haliyle yeniden üretilebiliyor. Üçünde okuyan kişi kayıtta yazan
karardan farklı bir kazanana varıyor: `arama-dizini` kaydında `katalog-ici` yazıyor ama tablo
`ayri-servis` veriyor, `uye-kimligi` kaydında `merkezi-servis` yazıyor ama tablo `sube-tablosu`
veriyor. Bu, kaydı okuyanın kararı yanlış anlaması değildir; kayıttaki tablo gerçekten o sonucu
üretir. Kararın kendisi doğrudur, kaydı yanlıştır.

Düzeltme tablosu üç kusurun ağırlığını ayırıyor. Ağırlıkları yazmak yeniden üretilebilen çözümleme
sayısını 2'den 3'e çıkarıyor; eksik ölçütü eklemek de 2'den 3'e. Tek başına ikisi de yetmiyor,
çünkü `arama-dizini` her iki kusuru birden taşıyor: ağırlık yazıldığında eksik sütun hâlâ yok,
sütun eklendiğinde ağırlık hâlâ eşit varsayılıyor. İkisi birden giderildiğinde beş çözümlemenin
beşi yeniden üretilebilir oluyor. Kusurlar toplanmıyor, çarpışıyor.

Üçüncü kusurun etkisi ikinci sütundadır. Beş çözümleme yeniden üretilebilir hale geldiğinde bile
yalnızca biri doğrulanabilir: kalan dördünde puanların kaynağı yazılı değil, dolayısıyla okuyan
kişi aynı kazanana varıyor ama puanların doğru olduğunu sınayamıyor. Bu iki durum arasındaki fark
küçük görünüp büyüktür. Yeniden üretilebilen bir çözümleme kararın **tutarlı** olduğunu gösterir;
doğrulanabilen bir çözümleme kararın **dayanaklı** olduğunu gösterir. `yedekleme-yolu` kaydı
kayıttaki haliyle doğru kazananı veriyor, ama üç puanın hiçbirinin nereden geldiği yazılmamış —
üçünün de yanlış olması ve kazananın yine de aynı çıkması mümkündür.

## Soru Kümesi ve Tamamlama

Aynı beş kayıt bir soru kümesine uygulanır. Yanıt önceki derste ayrıldığı gibi doğru, eksik ya da
yanlış olabilir; ayrım burada özellikle önemlidir, çünkü eksik ölçüt taşıyan bir tablo "hangi
ölçütler kullanıldı" sorusuna **yanlış** yanıt verir: liste eksiktir ama tam görünür.

```js
// odun/soru.mjs — soru kumesi cozumleme kayitlarina uygulanir; tamamlama maliyeti olculur
import { COZUMLEME, kazanan, okunan } from "./tablo.mjs";

const uretilebilir = (c, d) => {
  const o = okunan(c, d);
  return kazanan(c.alt, o.puan, o.w) === c.kayitli;
};
const SORU = [
  ["O1", "hangi olcutler kullanildi", (c, t) => (!t && c.eksik ? "yanlis" : "dogru")],
  ["O2", "olcutlerin agirligi neydi", (c, t) => (!t && !c.agirlik ? "eksik" : "dogru")],
  ["O3", "bu puan nereden geldi", (c, t) => (!t && c.kaynaksiz ? "eksik" : "dogru")],
  ["O4", "ayni tabloyla ayni sonuc cikar mi",
    (c, t) => (uretilebilir(c, t ? { agirlikYaz: true, olcutEkle: true } : {}) ? "dogru" : "yanlis")],
  ["O5", "hangi alternatifler degerlendirildi", () => "dogru"],
];

const durum = {};
for (const tam of [false, true]) {
  const say = { dogru: 0, eksik: 0, yanlis: 0 };
  for (const c of COZUMLEME)
    for (const [kod, , kural] of SORU) {
      const d = kural(c, tam);
      say[d] += 1;
      (durum[kod] ??= { false: [], true: [] })[tam].push(d);
    }
  console.log(`${tam ? "tamamlandiktan sonra" : "kayitta oldugu gibi  "}: ` +
    `dogru ${say.dogru}, eksik ${say.eksik}, yanlis ${say.yanlis} ` +
    `(${SORU.length} soru x ${COZUMLEME.length} cozumleme)`);
}
console.log("\nkayitta oldugu haliyle soru basina dogru olmayan yanit (y = yanlis, e = eksik):");
for (const [kod, metin] of SORU) {
  const d = durum[kod][false];
  const y = d.filter((x) => x === "yanlis").length, e = d.filter((x) => x === "eksik").length;
  console.log(`  ${kod} ${metin.padEnd(36)} ${y ? `${y}y` : e ? `${e}e` : "-"}`);
}

// Tamamlama sureleri modelin girdisidir (KK11).
const DK = { agirlik: 15, olcut: 20, kaynak: 5 };
const say = { agirlik: COZUMLEME.filter((c) => !c.agirlik).length,
  olcut: COZUMLEME.filter((c) => c.eksik).length,
  kaynak: COZUMLEME.reduce((t, c) => t + c.kaynaksiz, 0) };
const toplam = Object.entries(say).reduce((t, [a, n]) => t + n * DK[a], 0);
console.log("\ntamamlama maliyeti:");
for (const [a, n] of Object.entries(say))
  console.log(`  ${a.padEnd(8)} ${n} kalem x ${DK[a]} dk = ${n * DK[a]} dk`);
const once = COZUMLEME.filter((c) => uretilebilir(c, {})).length;
const sonra = COZUMLEME.filter((c) => uretilebilir(c, { agirlikYaz: true, olcutEkle: true })).length;
console.log(`  toplam ${toplam} dk; yeniden uretilebilen ${once}/${COZUMLEME.length} -> ` +
  `${sonra}/${COZUMLEME.length}, kazanilan cozumleme basina ${(toplam / (sonra - once)).toFixed(1)} dk`);
```

```
kayitta oldugu gibi  : dogru 14, eksik 6, yanlis 5 (5 soru x 5 cozumleme)
tamamlandiktan sonra: dogru 25, eksik 0, yanlis 0 (5 soru x 5 cozumleme)

kayitta oldugu haliyle soru basina dogru olmayan yanit (y = yanlis, e = eksik):
  O1 hangi olcutler kullanildi            2y
  O2 olcutlerin agirligi neydi            2e
  O3 bu puan nereden geldi                4e
  O4 ayni tabloyla ayni sonuc cikar mi    3y
  O5 hangi alternatifler degerlendirildi  -

tamamlama maliyeti:
  agirlik  2 kalem x 15 dk = 30 dk
  olcut    2 kalem x 20 dk = 40 dk
  kaynak   8 kalem x 5 dk = 40 dk
  toplam 110 dk; yeniden uretilebilen 2/5 -> 5/5, kazanilan cozumleme basina 36.7 dk
```

Yirmi beş yanıtın on dördü doğru, altısı eksik, beşi yanlış. Yanlışların dağılımı kusurların
niteliğini gösteriyor: eksik ölçüt ve yeniden üretilemezlik yanlış üretiyor, yazılmamış ağırlık ve
kaynağı belirsiz puan eksik üretiyor. Aradaki fark okuyanın davranışını belirler. Ağırlığın
yazılmadığını gören kişi bir şeyin eksik olduğunu bilir ve sorabilir; eksik ölçütü gören kişi
hiçbir şey görmez, çünkü tablo tamdır.

Tamamlamanın bedeli 110 dakika: iki ağırlık vektörü, iki ölçüt sütunu ve sekiz puan kaynağı. Bu
sürenin sonunda yeniden üretilebilen çözümleme sayısı 2'den 5'e çıkıyor, yani kazanılan çözümleme
başına 36,7 dakika. Sayının kendisi modelin girdilerine bağlıdır; taşıdığı bilgi oranlardadır. Puan
kaynaklarını yazmak toplam sürenin yüzde 36'sını alıyor ve yeniden üretilebilirliği hiç
değiştirmiyor — yalnızca doğrulanabilirliği sıfırdan beşe çıkarıyor. Ağırlıkları yazmak ise 30
dakikada üç çözümlemeye dokunuyor.

Buradan çıkan sıra şudur: önce eksik ölçüt, sonra ağırlık, en son puan kaynağı. Bu sıra kusurların
ağırlığından değil, fark edilebilirliklerinden gelir. En sinsi kusur en ucuz olanı değil, kendini
göstermeyenidir.

## Özet

- Bir ödünleşim çözümlemesinin kayda geçmiş hali, üçüncü bir kişinin aynı kazanana varıp
  varamamasıyla ölçülür; beş kaydın ikisi kayıttaki haliyle yeniden üretilebildi.
- Üç kusur farklı biçimde bozar: eksik ölçüt tabloyu tam gösterir, yazılmamış ağırlık okuyanı eşit
  ağırlık varsaymaya iter, kaynağı belirsiz puan kazananı değiştirmeden doğrulamayı engeller.
- Ağırlıkları yazmak yeniden üretilebilen sayıyı 2'den 3'e, eksik ölçütü eklemek de 2'den 3'e
  çıkardı; iki kusuru birden taşıyan çözümleme yalnızca ikisi birden giderildiğinde üretilebilir
  oldu ve sayı 5'e çıktı.
- Yeniden üretilebilirlik ile doğrulanabilirlik ayrı ölçülerdir: beş çözümleme üretilebilir hale
  geldiğinde bile puan kaynakları yazılmadan yalnızca biri doğrulanabiliyordu.
- Soru kümesinde eksik ölçüt ve yeniden üretilemezlik yanlış yanıt, yazılmamış ağırlık ve kaynaksız
  puan eksik yanıt üretti; tamamlamanın bedeli 110 dakika, kazanılan çözümleme başına 36,7 dakika.

## Sonraki Adım

Buraya kadar ölçülen her şey verilmiş bir kararla ilgiliydi: kararın kaydı, verilme süreci ve
dayandığı tablo. Üçünde de karar bir noktada kesinleşiyor ve kayıt kapanıyor. Oysa her kararın
yanında kapanmayan bir şey kalır: kararın dayandığı varsayımın tutmama ihtimali. `arama-dizini`
çözümlemesinde `veri-tazeligi` ölçütüne 0,50 ağırlık verildi, çünkü tazeliğin kritik olduğu
varsayıldı; o varsayım yanlışsa karar da yanlıştır ve bunu ancak zaman gösterir. Bu, kayda
geçirilecek bir karar değil, izlenecek bir belirsizliktir. Sonraki ders belirsizliği olasılık ve
etkiyle modelleyip bir dönem koşturur, kaydedilen riskin gerçekleşme oranını ve hiç kaydedilmemiş
olduğu halde gerçekleşen riski sayar.
