---
title: 'Mimari Yönetişim Modelleri'
source: 'https://academia.sh/tr/kurslar/mimari-yonetisim/mimari-yonetisim-modelleri'
course: 'Kalite Nitelikleri ve Yönetişim'
language: tr
updated: '2026-08-17T18:10:33+00:00'
license: 'CC BY-SA 4.0'
---

# Mimari Yönetişim Modelleri

Merkezî, federatif ve danışman yönetişimin aynı karar akışında koşturulması: karar başına bekleme turu, kurala uyum oranı, yakalanan ve kaçan ihlal, yerel bağlamın kaçırılmasından doğan yanlış alarm ve karar hızı ile tutarlılık arasındaki takasın taranması.

Önceki konu her niteliği bir ölçüye bağladı ve hangi kararın hangi niteliği koruduğunu yazdı. O
ölçülerin ortak bir kusuru var: hepsi **bir kez** alındı. Bir ölçü alındığı gün doğrudur; altı ay
sonra hâlâ doğru olup olmadığını söyleyen bir mekanizma yoktur. Bu arada yeni modüller girer, yeni
bağımlılıklar açılır ve kararı verenler ortamdan ayrılır. Ölçünün tazeliğini koruyan şey ölçünün
kendisi değil, kararların hangi düzenle alındığıdır.

Yönetişim tam olarak budur: mimari kararların kim tarafından, hangi sırayla ve hangi kurala göre
alındığı. Bu ilk ders karar akışının kendisini ölçer; sonraki iki ders kuralların makine tarafından
denetlenmesini yazar. Through-line **bölgesel kütüphane ağıdır** — şube sistemleri, dışarıdan
alınmış katalog, içeride yazılmış ödünç ve ücretlendirme servisleri, ayrı bir üyelik sistemi ve
belediyedeki kimlik servisi — ve kurgudur.

## Ölçülecek Karar Akışı

Aşağıdaki blok bir **modeldir**, ölçüm değil: gerçek bir kurumun karar kaydından çıkarılmamıştır,
karar akışını üç yönetişim modelinde koşturulabilir hâle getiren bir veri yapısıdır. Modelin
girdisi bir çeyreğin mimari kararlarıdır.

**YN1 — bir çeyrekte yirmi dört mimari karar alınır ve her kararın gerçekten kural ihlali olup
olmadığı sonradan bilinmektedir.** Gerekçe: yakalama ve kaçırma ancak bilinen bir ihlal kümesine
karşı sayılabilir; bu ders o kümeyi girdi olarak sabitler. Her kararda dört ayrı bilgi taşınır:
**belirti** (kararın yüzeyde kurala takılan yanı), **yerel mazeret** (kararı meşru kılan ama yalnız
birimin gördüğü ayrıntı), **örtük belirti** (ancak ortak bir gözden geçirmede fark edilen yan) ve
kararın **kural sürümüne** duyarlı olup olmadığı.

```js
// yonetisim.mjs — ayni karar akisini uc yonetisim modelinde kosturur (model)
// bayrak: b belirti  m yerel mazeret  y yeni kural  g kural gevsedi  o ortuk belirti  d danisildi
import { writeFileSync } from "node:fs";

const KARAR = [
  "katalog tablosuna dogrudan yazma      | odunc   | ortak | bo",
  "sube ici raf onbellegi                | sube    | yerel | bm",
  "uye alanlarinin kopyalanmasi          | ucret   | ortak | b",
  "kimlik servisine sube ucundan cagri   | sube    | ortak | bmd",
  "raf etiketi alani                     | katalog | yerel | -",
  "ortak ucta surum etiketinin dusmesi   | katalog | ortak | by",
  "gecikme hesabinin odunce tasinmasi    | ucret   | ortak | b",
  "adres alaninin bildirimde saklanmasi  | uyelik  | yerel | bmd",
  "dis katalog yanitinin ham saklanmasi  | odunc   | ortak | byd",
  "sube raporunun depodan okunmasi       | sube    | ortak | b",
  "ucret tablosuna odunc tarafindan yazma| odunc   | ortak | bo",
  "dondurma bayraginin oduncte tutulmasi | uyelik  | ortak | bm",
  "kimlik belirtecinin gunluge yazilmasi | kimlik  | ortak | by",
  "bildirim metninin uyelikte tutulmasi  | uyelik  | yerel | bg",
  "zaman asimi degerinin elle ayari      | odunc   | yerel | -",
  "sube ici toplu ice aktarma            | sube    | yerel | bmd",
  "dis katalogdan fiyat okuma            | ucret   | ortak | bo",
  "katalog ucunun sayfalamasiz yayimi    | katalog | ortak | byd",
  "uyelik kaydinin subede cogaltilmasi   | uyelik  | ortak | bm",
  "kimlik onbellek suresinin uzatilmasi  | kimlik  | yerel | bgd",
  "odunc olayinin bildirime yazilmasi    | odunc   | ortak | bd",
  "sube ekraninda dogrudan sorgu         | sube    | yerel | bo",
  "ucret iadesinin uyelige dokunmasi     | ucret   | ortak | bm",
  "arama sonucunun subede onbelleklenmesi| katalog | yerel | bmd",
].map((s) => {
  const [ad, birim, kapsam, bayrak] = s.split("|").map((x) => x.trim());
  const v = (c) => bayrak.includes(c);
  return { ad, birim, kapsam, belirti: v("b"), mazeret: v("m"), yeni: v("y"),
           gevsek: v("g"), ortuk: v("o"), danisildi: v("d") };
});

// YN2: kural surumu 2 yururlukte; "yeni" kararlar 2 ile ihlal, 1 ile uygun okunur; "gevsek"
// kararlar tersi. Birimlerin surumu modele gore dagilir (esgudum ritueli kadar guncel kalirlar).
const SURUM = {
  federatif: { sube: 2, katalog: 1, odunc: 2, ucret: 2, uyelik: 2, kimlik: 1 },
  danisman:  { sube: 1, katalog: 1, odunc: 2, ucret: 1, uyelik: 1, kimlik: 1 },
};

const gercek = (k) => (k.gevsek ? false : k.belirti && !k.mazeret);   // bilinen ihlal kumesi
const birimKarari = (k, s) => {
  if (k.ortuk) return false;                       // birim tek basina ortuk belirtiyi gormez
  if (k.yeni) return s === 2 && k.belirti && !k.mazeret;
  if (k.gevsek) return s === 1 && k.belirti;
  return k.belirti && !k.mazeret;
};
const MODEL = {
  "merkezi":            (k) => k.belirti && !k.gevsek,          // ceker gorur, mazereti gormez
  "federatif":          (k) => k.yeni || k.gevsek
    ? birimKarari({ ...k, ortuk: false }, SURUM.federatif[k.birim])
    : k.belirti && !k.mazeret,                                  // ortak liste ortugu acar
  "danisman":           (k) => k.danisildi ? gercek(k) : birimKarari(k, SURUM.danisman[k.birim]),
  "merkezi + soru turu": (k) => gercek(k),                       // yerel baglami sorar
};

// bekleme: her model kendi kuyrugunu kendi kapasitesiyle isler (tur basina karar)
function kuyruk(liste, kapasite, ekTur = () => 0) {
  const sira = liste.map((k) => ({ k, kalan: 1 + ekTur(k) }));
  const tur = new Map(liste.map((k) => [k.ad, 0]));
  let t = 0;
  while (sira.length) {
    t += 1; let kap = kapasite; const ertelenen = [];
    while (kap > 0 && sira.length) {
      const it = sira.shift(); kap -= 1; it.kalan -= 1;
      if (it.kalan === 0) tur.set(it.k.ad, t); else ertelenen.push(it);
    }
    sira.push(...ertelenen);
  }
  return tur;
}
const BEKLEME = {
  "merkezi": kuyruk(KARAR, 3),
  "federatif": new Map([...kuyruk(KARAR.filter((k) => k.kapsam === "ortak"), 4),
                        ...KARAR.filter((k) => k.kapsam === "yerel").map((k) => [k.ad, 0])]),
  "danisman": new Map([...kuyruk(KARAR.filter((k) => k.danisildi), 5),
                       ...KARAR.filter((k) => !k.danisildi).map((k) => [k.ad, 0])]),
  "merkezi + soru turu": kuyruk(KARAR, 3, (k) => (k.mazeret ? 1 : 0)),
};

writeFileSync("karar.json", JSON.stringify(KARAR));
const ihlal = KARAR.filter(gercek).length;
console.log(`karar: ${KARAR.length} (${KARAR.filter((k) => k.kapsam === "ortak").length} ortak kapsamli), ` +
  `bilinen ihlal: ${ihlal}, yerel mazeretli: ${KARAR.filter((k) => k.mazeret).length}, ` +
  `ortuk belirtili: ${KARAR.filter((k) => k.ortuk).length}`);
console.log(`\n${"model".padEnd(21)}${"ort. bekleme".padStart(13)}${"en uzun".padStart(9)}` +
  `${"yakalanan".padStart(11)}${"kacan".padStart(7)}${"yanlis alarm".padStart(14)}${"uyum".padStart(8)}`);
for (const [ad, karar] of Object.entries(MODEL)) {
  const y = KARAR.filter((k) => gercek(k) && karar(k)).length;
  const kc = KARAR.filter((k) => gercek(k) && !karar(k)).length;
  const ya = KARAR.filter((k) => !gercek(k) && karar(k)).length;
  const bek = KARAR.map((k) => BEKLEME[ad].get(k.ad));
  const ort = bek.reduce((a, b) => a + b, 0) / bek.length;
  console.log(`${ad.padEnd(21)}${ort.toFixed(2).padStart(13)}${String(Math.max(...bek)).padStart(9)}` +
    `${`${y}/${ihlal}`.padStart(11)}${String(kc).padStart(7)}${String(ya).padStart(14)}` +
    `${`%${((100 * (KARAR.length - kc - ya)) / KARAR.length).toFixed(1)}`.padStart(8)}`);
}

// yanlis alarmin kaynagi: yerel baglam mi, kural surumu mu
console.log(`\nyanlis alarmin kaynagi (karar adiyla):`);
for (const [ad, karar] of Object.entries(MODEL)) {
  const ya = KARAR.filter((k) => !gercek(k) && karar(k));
  const baglam = ya.filter((k) => k.mazeret).length;
  console.log(`  ${ad.padEnd(21)}${String(ya.length).padStart(3)} yanlis alarm; ` +
    `${baglam} yerel baglamin kacirilmasi, ${ya.length - baglam} eski kural surumu` +
    (ya.length ? ` (${ya.map((k) => k.ad.split(" ")[0]).join(", ")})` : ""));
}
```

```
karar: 24 (15 ortak kapsamli), bilinen ihlal: 12, yerel mazeretli: 8, ortuk belirtili: 4

model                 ort. bekleme  en uzun  yakalanan  kacan  yanlis alarm    uyum
merkezi                       4.50        8      12/12      0             8   %66.7
federatif                     1.50        4       9/12      3             1   %83.3
danisman                      0.46        2       6/12      6             1   %70.8
merkezi + soru turu           6.17       11      12/12      0             0  %100.0

yanlis alarmin kaynagi (karar adiyla):
  merkezi                8 yanlis alarm; 8 yerel baglamin kacirilmasi, 0 eski kural surumu (sube, kimlik, adres, dondurma, sube, uyelik, ucret, arama)
  federatif              1 yanlis alarm; 0 yerel baglamin kacirilmasi, 1 eski kural surumu (kimlik)
  danisman               1 yanlis alarm; 0 yerel baglamin kacirilmasi, 1 eski kural surumu (bildirim)
  merkezi + soru turu    0 yanlis alarm; 0 yerel baglamin kacirilmasi, 0 eski kural surumu
```

## Üç Modelin Okunması

Modellerin ayrımı kimin neyi gördüğüdür. **Merkezî yönetişim** kararların hepsini tek kurulda
inceler: tek kural sürümü vardır, örtük belirtiyi görür, ama şubenin o önbelleği neden koyduğunu
bilmez. **Federatif yönetişim** kararı birime bırakır, birim yerel mazereti görür ve ortak
kapsamlı kararlar temsilcilerin kuruluna gider; ortak gözden geçirme listesi örtük belirtiyi de
açar. **Danışman yönetişim** kararı tümüyle birime bırakır ve merkez yalnız danışıldığında konuşur.

Merkezî model **on iki ihlalin on ikisini de yakalar ve hiçbirini kaçırmaz**, ama sekiz yanlış
alarm üretir ve uyum oranı %66,7'de kalır. Yanlış alarmların **sekizinin sekizi de yerel bağlamın
kaçırılmasından** doğar: kurul kararın yüzeyini görüp mazereti göremediği için meşru bir kararı
engeller. Karar başına ortalama bekleme 4,5 tur, en uzun bekleme 8 turdur.

Danışman model tersini yapar: ortalama bekleme 0,46 tura iner, ama on iki ihlalin **altısı kaçar**.
Kaçanların dördü örtük belirtili kararlardır — hiçbir gözden geçirme adımı olmadığı için kimse fark
etmez. İkisi eski kural sürümüyle alınmıştır.

Federatif model üçünün en yüksek uyumunu verir (%83,3) ve bunu 1,5 turluk beklemeyle yapar. Bedeli
üç kaçan ihlaldir ve üçü de aynı kaynaktan gelir: kural sürümü güncel olmayan birimler. Tek yanlış
alarmının kaynağı da odur — gevşetilmiş bir kuralı eski sürümle okuyan birim, artık serbest olan
bir kararı engeller. **Federatif modelde ölçülen şey kuralın kendisi değil, yayılma hızıdır.**

Dördüncü satır bir model değil, merkezî modelin bir alt sınırıdır: kurul yerel mazereti olan sekiz
kararı **önceden bildiği** varsayılarak yalnız onlarda soru turu açar. Sonuç eksiksizdir — 12/12
yakalama, sıfır kaçırma, sıfır yanlış alarm, %100 uyum — ve bedeli ortalama beklemenin 4,5'ten 6,17
tura, en uzun beklemenin 8'den 11 tura çıkmasıdır. Bu satır ulaşılabilir bir çalışma biçimi değil,
soru turunun en ucuz hâlidir.

## Hız ile Tutarlılık Arasındaki Takas

Gerçek bir kurul hangi kararın mazereti olduğunu önceden bilmez; sorusunu sıradaki adaya sorar ve
çoğu soru boşa gider. Aşağıdaki blok bunu tarar: kurul, yüzeyden engelleyeceği yirmi kararın ilk
`s` tanesine soru turu açar.

```js
// takas.mjs — yonetisim.mjs'in yazdigi karar akisini okur; merkezi kurulun soru sayisi taranir
import { readFileSync } from "node:fs";

const KARAR = JSON.parse(readFileSync("karar.json", "utf8"));
const gercek = (k) => (k.gevsek ? false : k.belirti && !k.mazeret);
const yuzeyde = (k) => k.belirti && !k.gevsek;                 // kurulun soru sormadan gordugu

function bekleme(sorulan) {                                    // sorulan karar bir tur daha bekler
  const sira = KARAR.map((k) => ({ k, kalan: sorulan.has(k.ad) ? 2 : 1 }));
  const tur = new Map(); let t = 0;
  while (sira.length) {
    t += 1; let kap = 3; const ertelenen = [];
    while (kap > 0 && sira.length) {
      const it = sira.shift(); kap -= 1; it.kalan -= 1;
      if (it.kalan === 0) tur.set(it.k.ad, t); else ertelenen.push(it);
    }
    sira.push(...ertelenen);
  }
  return [...tur.values()];
}

const engellenecek = KARAR.filter(yuzeyde);                    // kurulun bakacagi 20 karar
console.log(`kurulun yuzeyden engelleyecegi karar: ${engellenecek.length}; ` +
  `bunlarin ${engellenecek.filter((k) => k.mazeret).length} tanesinin yerel bir mazereti var`);
console.log(`\n${"sorulan".padStart(8)}${"ort. bekleme".padStart(13)}${"ek bekleme".padStart(12)}` +
  `${"en uzun".padStart(9)}${"yanlis alarm".padStart(14)}${"kalkan alarm".padStart(14)}` +
  `${"alarm / ek tur".padStart(16)}`);
for (const s of [0, 4, 8, 12, 16, 20]) {
  const sorulan = new Set(engellenecek.slice(0, s).map((k) => k.ad));
  const karar = (k) => (sorulan.has(k.ad) ? gercek(k) : yuzeyde(k));
  const ya = KARAR.filter((k) => !gercek(k) && karar(k)).length;
  const b = bekleme(sorulan);
  const ort = b.reduce((a, c) => a + c, 0) / b.length;
  const ek = ort - 4.5;
  console.log(`${String(s).padStart(8)}${ort.toFixed(2).padStart(13)}${ek.toFixed(2).padStart(12)}` +
    `${String(Math.max(...b)).padStart(9)}${String(ya).padStart(14)}${String(8 - ya).padStart(14)}` +
    `${(s === 0 ? "-" : ((8 - ya) / ek).toFixed(2)).padStart(16)}`);
}
```

```
kurulun yuzeyden engelleyecegi karar: 20; bunlarin 8 tanesinin yerel bir mazereti var

 sorulan ort. bekleme  ek bekleme  en uzun  yanlis alarm  kalkan alarm  alarm / ek tur
       0         4.50        0.00        8             8             0               -
       4         5.83        1.33       10             6             2            1.50
       8         7.13        2.63       11             5             3            1.14
      12         8.38        3.88       12             4             4            1.03
      16         9.54        5.04       14             2             6            1.19
      20        10.67        6.17       15             0             8            1.30
```

İlk dört soru 1,33 turluk ek beklemeyle iki yanlış alarm kaldırır; bütün adaylara sormak sekizini
de kaldırır ve karar başına ortalama beklemeyi 4,5'ten 10,67 tura çıkarır. Asıl ölçü son sütundur:
**ek bekleme turu başına kaldırılan yanlış alarm**. Kurul hangi adaya soracağını önceden bilemediği
için soruların çoğu boşa gider — yirmi sorunun yalnız sekizi bir alarmı kaldırır.

**Hiçbir model her iki uçta birden iyi değildir**: merkezî model kaçırmayı sıfırlar, danışman model
beklemeyi sıfırlar, federatif model ikisinin arasında en yüksek uyumu verir ve bedelini kural
yayılımında öder.

## Yönetişim Kuralı Denetime Çevrilebilir mi

Yukarıdaki modelin tamamı bir varsayıma dayanır: kararı inceleyen **insandır**. Bu kursun sorusu
ise kuralın makinece denetlenip denetlenemeyeceğidir. Kural kümesi bu gözle ayrıldığında ortaya iki
yığın çıkar.

```js
// kural.mjs — yonetisim kural kumesinin denetlenebilirligi ve orneklemin yakaladigi
import { readFileSync } from "node:fs";

const KURAL = [                                   // her satir: kural | makinece denetlenebilir mi
  ["her ortak uc surum etiketi tasir", true],
  ["hicbir birim baska birimin tablosuna yazmaz", true],
  ["her dis cagri zaman asimi degeri tasir", true],
  ["kimlik belirteci gunluge yazilmaz", true],
  ["yeni bagimlilik bir karar kaydiyla gelir", true],
  ["sinir, degisim birlikteligine gore cizilir", false],
  ["karar en az iki secenegin bedeliyle gerekcelendirilir", false],
  ["yerel cozum ortak sozlesmeye donusmeden once tartisilir", false],
  ["disa acilan ad, modulun isini anlatir", false],
];
const cevrilen = KURAL.filter(([, d]) => d);
console.log(`kural: ${KURAL.length}; denetime cevrilen ${cevrilen.length}, cevrilemeyen ${KURAL.length - cevrilen.length}`);

// YN3: cevrilemeyen kurallar icin yerine konan sey uc kararda bir orneklem incelemesidir
const KARAR = JSON.parse(readFileSync("karar.json", "utf8"));
const gercek = (k) => (k.gevsek ? false : k.belirti && !k.mazeret);
const ornek = KARAR.filter((_, i) => i % 3 === 2);
const yakalanan = ornek.filter(gercek).length;
const toplam = KARAR.filter(gercek).length;
console.log(`\norneklem: ${KARAR.length} kararin ${ornek.length} tanesi incelendi (1/3); ` +
  `${toplam} ihlalin ${yakalanan} tanesi orneklemin icinde, ${toplam - yakalanan} tanesi disinda`);
console.log(`inceleme yuku: ${ornek.length} karar x ${KURAL.length - cevrilen.length} cevrilemeyen kural = ` +
  `${ornek.length * (KURAL.length - cevrilen.length)} elle bakis`);
```

```
kural: 9; denetime cevrilen 5, cevrilemeyen 4

orneklem: 24 kararin 8 tanesi incelendi (1/3); 12 ihlalin 5 tanesi orneklemin icinde, 7 tanesi disinda
inceleme yuku: 8 karar x 4 cevrilemeyen kural = 32 elle bakis
```

Dokuz kuralın beşi bir denetime çevrilir: her biri kaynakta ya da yapılandırmada aranabilir bir
örüntüye karşılık gelir. Dördü çevrilemez, çünkü ölçtükleri şey metnin biçimi değil gerekçenin
niteliğidir; "iki seçeneğin bedeliyle gerekçelendirme" kuralını sınayan bir işlev, gerekçenin var
olup olmadığını sayabilir ama yeterli olup olmadığını sayamaz.

Çevrilemeyen dördünün yerine konan şey **örneklem incelemesidir** ve bedeli iki yönlüdür: sekiz
karara dört kural için otuz iki elle bakış, ve kapsam eksikliği — on iki bilinen ihlalin **yedisi
örneklemin dışında kalır**. Denetime çevrilen beş kuralda bu eksiklik yoktur; onlar her karara
uygulanır. Makinece denetlenen kural arttıkça insanın gözden geçireceği kural azalır ve kurulun
bekleme turu düşer.

## Özet

- Aynı 24 kararlık akış üç modelde koşturuldu; merkezî model 12 ihlalin 12'sini yakalar ve hiç
  kaçırmaz, ama 8 yanlış alarm verir ve uyum %66,7'de kalır — alarmların 8'i de yerel bağlamın
  kaçırılmasından doğar.
- Danışman model beklemeyi 0,46 tura indirir ve 12 ihlalin 6'sını kaçırır; kaçanların 4'ü hiçbir
  gözden geçirmede görülmeyen örtük belirtili kararlardır.
- Federatif model en yüksek uyumu verir (%83,3, 1,50 tur bekleme) ve tek zayıflığı kural
  yayılımıdır: 3 kaçan ihlalin ve 1 yanlış alarmın kaynağı güncel olmayan kural sürümüdür.
- Merkezî kurul yerel bağlamı sorarak %100 uyuma çıkar; bedeli ortalama beklemenin 4,50'den 10,67
  tura, en uzun beklemenin 8'den 15 tura çıkmasıdır ve 20 sorunun yalnız 8'i bir alarmı kaldırır.
- Dokuz yönetişim kuralının 5'i denetime çevrilir, 4'ü çevrilemez; çevrilemeyenlerin yerine konan
  1/3 örneklem 32 elle bakış ister ve 12 ihlalin 7'sini görmez.

## Sonraki Adım

Bu dersin son tablosu bir sınır çizdi: dokuz kuralın beşi makinece denetlenebilir. O beşi denetime
çevirmenin bedeli henüz sayılmadı. Bir mimari kuralı koşturulabilir bir işleve çevirmek, kuralı bir
**sayıya** ve bir **eşiğe** indirmek demektir; eşik seçildiği anda hem kaçan ihlal hem de yanlış
alarm ortaya çıkar. Sonraki ders bir uygunluk işlevini gerçekten yazar: bir mimari kuralı sayıya
çeviren işlev bilinen bir ihlal kümesinde koşturulur, eşiği baştan sona taranır ve her eşikte kaç
ihlalin yakalandığı, kaçının kaçtığı, kaç yanlış alarm üretildiği sayılır. Aynı koşumda ikinci bir
soru daha sorulur — yanlış alarm veren bir kuralın ekipte ürettiği davranış nedir ve kural devre
dışı bırakıldığında arkasından kaç ihlal geçer.
