İçeriğe geç
academia.sh

Ders 02 / 11

Mimarlık Düzeyleri

Uygulama, çözüm ve kurumsal mimarinin karar kapsamıyla ayrılması: aynı karar kümesinin işlettiği birimlere göre üç düzeye dağıtılması, her düzeyin kapsadığı karar ve etkilediği birim sayısı, kararın yanlış düzeyde verilmesinde habersiz kalan birim, yinelenen karar ve çelişen gerçekleştirim sayıları.

İçindekiler

Önceki ders on bir kararı tek bir kod tabanı üzerinde ölçtü ve hepsini aynı düzlemde sıraladı. Oysa o kararların hepsi aynı yerde verilmez. Ayar değerlerinin nereden okunacağı bütün sistemi bağlar; günlük raporun ayrı bir modülde üretilmesi iki birimin ötesine geçmez; kiosk ucunun ayrı bir dağıtım birimi olması yalnız kendi içinde kalır.

Mimarlık düzeyleri bu ayrımın adıdır: uygulama mimarisi, çözüm mimarisi ve kurumsal mimari. Üç düzey genellikle unvanla anlatılır. Bu derste unvanla değil kapsamla tanımlanıyorlar ve kapsam sayılıyor: bir karar kaç dağıtım birimini bağlıyor.

Düzeyi Kapsam Belirler

Önceki dersin erişim alanı ölçüsü modül düzeyindeydi. Düzey sorusu için bir eşleme daha gerekir: hangi modülü hangi birim işletiyor. Dağıtım birimi ayrı yayınlanan, ayrı koşan ve genellikle ayrı bir ekibin baktığı parçadır; Yazılım Tasarımı müfredatının alan odaklı tasarım kursunda kurulan sınırlı bağlam ayrımıyla aynı yöne bakar, ama sınırı çizen şey burada alan değil işletme sorumluluğudur.

Bir kararın kapsamı şudur: kararın erişim alanındaki modüllerden en az birini işleten birimlerin kümesi (MN4). Kapsam bir birimse karar uygulama düzeyindedir; bütün ağı ya da ağın büyük bölümünü bağlıyorsa kurumsal; ikisinin arasındaysa çözüm düzeyindedir. “Büyük bölüm” bir eşiktir ve eşiğin kaynağı yazılmalıdır: burada birimlerin üçte ikisi seçildi (MN5).

İlk dosya önceki dersin ithal grafiğini ve karar gövdelerini yeniden verir; blok kendi başına çalışsın diye grafik tekrarlanıyor.

// mimari/model.mjs — MODEL kutuphane agi kod tabani: ithal grafigi ve kararlarin govdesi.
// Gercek bir kurum degildir; kenarlar ve karar govdeleri elle secilmistir.
export const ITHAL = {
  yapilandirma: [], zaman: [], kayit: ["yapilandirma"],
  "veri-erisim": ["yapilandirma", "kayit"], "olay-yolu": ["yapilandirma", "kayit"],
  "kimlik-dogrulama": ["veri-erisim", "yapilandirma", "kayit"], yetki: ["kimlik-dogrulama"],
  "katalog-baglayici": ["yapilandirma", "kayit"],
  "katalog-onbellek": ["katalog-baglayici", "zaman"],
  "odunc-kural": ["yapilandirma", "zaman"],
  "odunc-cekirdek": ["odunc-kural", "veri-erisim", "olay-yolu", "zaman", "katalog-baglayici"],
  ayirtma: ["odunc-cekirdek", "bildirim-kuyruk", "veri-erisim"],
  "uye-kayit": ["veri-erisim", "kayit"],
  "uye-ceza": ["uye-kayit", "odunc-kural", "zaman", "veri-erisim"],
  "sube-envanter": ["veri-erisim", "olay-yolu"],
  "sube-esitleme": ["sube-envanter", "olay-yolu", "katalog-baglayici", "kayit"],
  "bildirim-kuyruk": ["veri-erisim", "olay-yolu"],
  "bildirim-eposta": ["bildirim-kuyruk", "yapilandirma"],
  "rapor-gunluk": ["veri-erisim", "zaman"],
  "rapor-toplu": ["veri-erisim", "sube-envanter", "zaman", "kayit"],
  "web-ucu": ["odunc-cekirdek", "katalog-onbellek", "uye-kayit", "ayirtma", "kimlik-dogrulama"],
  "personel-ucu": ["odunc-cekirdek", "uye-kayit", "uye-ceza", "sube-envanter", "rapor-gunluk",
    "kimlik-dogrulama", "yetki"],
  "kiosk-ucu": ["odunc-cekirdek", "katalog-onbellek", "kimlik-dogrulama"],
  "toplu-is": ["rapor-toplu", "sube-esitleme", "bildirim-kuyruk", "bildirim-eposta"],
};
export const KARAR = [
  { ad: "veri erisimi tek katmandan gecer", govde: ["veri-erisim"] },
  { ad: "ayar degerleri tek kaynaktan okunur", govde: ["yapilandirma"] },
  { ad: "envanter olay yolu uzerinden esitlenir", govde: ["olay-yolu", "sube-esitleme"] },
  { ad: "dis kataloga tek baglayici uzerinden erisilir", govde: ["katalog-baglayici"] },
  { ad: "kimlik dogrulama tek modulde toplanir", govde: ["kimlik-dogrulama"] },
  { ad: "odunc suresi kurali yapilandirmadan okunur", govde: ["odunc-kural"] },
  { ad: "saat kaynagi tek modulden alinir", govde: ["zaman"] },
  { ad: "ceza hesabi uye kaydindan ayri durur", govde: ["uye-ceza"] },
  { ad: "gunluk rapor ayri bir modulde uretilir", govde: ["rapor-gunluk"] },
  { ad: "eposta bildirimi duz metin govdeyle gider", govde: ["bildirim-eposta"] },
  { ad: "kiosk ucu ayri bir dagitim birimidir", govde: ["kiosk-ucu"] },
];
export const MODULLER = Object.keys(ITHAL);
export function bagimliKapanis(cekirdek) {
  const kapali = new Set(cekirdek);
  for (let buyudu = true; buyudu; ) {
    buyudu = false;
    for (const m of MODULLER)
      if (!kapali.has(m) && ITHAL[m].some((h) => kapali.has(h))) { kapali.add(m); buyudu = true; }
  }
  return kapali;
}

Ölçüm

İkinci dosya birim eşlemesini kurar, her kararın kapsamını sayar ve aynı karar kümesini üç düzende koşturur.

// mimari/duzey.mjs — kararlarin kapsadigi birim sayisi ve uc duzeye dagilimi
import { KARAR, bagimliKapanis } from "./model.mjs";

// BIRIM — MODEL kutuphane aginin dagitim birimleri; her birim hangi modulleri isletir
const BIRIM = {
  "web-portali": ["web-ucu"],
  "personel-uygulamasi": ["personel-ucu"],
  "kiosk-agi": ["kiosk-ucu"],
  "odunc-servisi": ["odunc-cekirdek", "odunc-kural", "ayirtma"],
  "uye-servisi": ["uye-kayit", "uye-ceza"],
  "katalog-tumlestirme": ["katalog-baglayici", "katalog-onbellek"],
  "envanter-servisi": ["sube-envanter", "sube-esitleme"],
  "bildirim-servisi": ["bildirim-kuyruk", "bildirim-eposta"],
  "rapor-servisi": ["rapor-gunluk", "rapor-toplu", "toplu-is"],
  "ortak-altyapi": ["yapilandirma", "kayit", "zaman", "veri-erisim", "olay-yolu",
    "kimlik-dogrulama", "yetki"],
};
const BIRIMLER = Object.keys(BIRIM);
const B = BIRIMLER.length;
const KURUMSAL_ESIK = Math.ceil((B * 2) / 3); // secilmis kural: birimlerin ucte ikisi

const kapsam = (k) => {
  const alan = bagimliKapanis(k.govde);
  return BIRIMLER.filter((b) => BIRIM[b].some((m) => alan.has(m)));
};
const duzeyAdi = (n, e = KURUMSAL_ESIK) => (n === 1 ? "uygulama" : n >= e ? "kurumsal" : "cozum");

const olcum = KARAR.map((k) => ({ ad: k.ad, n: kapsam(k).length, kume: kapsam(k) }));
const sut = (s, n) => String(s).padEnd(n);
console.log(`${B} birim, ${KARAR.length} karar, kurumsal esigi = ${KURUMSAL_ESIK} birim\n`);
console.log(sut("karar", 46) + sut("birim", 8) + "duzey");
console.log("-".repeat(64));
for (const o of [...olcum].sort((a, b) => b.n - a.n)) console.log(sut(o.ad, 46) + sut(o.n, 8) + duzeyAdi(o.n));

console.log("");
for (const d of ["kurumsal", "cozum", "uygulama"]) {
  const g = olcum.filter((o) => duzeyAdi(o.n) === d);
  const etkilenen = new Set(g.flatMap((o) => o.kume));
  console.log(`${sut(d, 10)} karar=${sut(g.length, 4)} etkiledigi birim=${sut(etkilenen.size, 4)} ort. kapsam=${(g.reduce((t, o) => t + o.n, 0) / g.length).toFixed(1)}`);
}
console.log("esik duyarliligi: " + [6, 7, 8].map((e) =>
  `esik ${e} -> ${olcum.filter((o) => duzeyAdi(o.n, e) === "kurumsal").length} kurumsal`).join(", "));

// ---- karsilastirma: ayni karar kumesi uc duzende ----
// SECENEK[k] = kararin makul secenek sayisi; bagimsiz veren birim bunlardan birini secer
const SECENEK = [3, 4, 3, 2, 3, 4, 2, 3, 2, 3, 2];
function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; }
const rast = uretec(48151); // tohum gorunur; ayni tohum ayni sayilari verir

let habersiz = 0, yineleme = 0, celisen = 0;
olcum.forEach((o, i) => {
  const oteki = o.n - 1;               // kararin sahibi disindaki kapsam birimleri
  habersiz += oteki; yineleme += oteki;
  const sahibinSecimi = Math.floor(rast() * SECENEK[i]);
  for (let j = 0; j < oteki; j++) if (Math.floor(rast() * SECENEK[i]) !== sahibinSecimi) celisen++;
});
const danismaYerel = 0, danismaUc = olcum.reduce((t, o) => t + o.n - 1, 0), danismaMerkez = KARAR.length * (B - 1);

console.log(`\n${sut("duzen", 12) + sut("habersiz", 10) + sut("yineleme", 10) + sut("celisen", 9)}danisma`);
console.log("-".repeat(50));
console.log(sut("yerel", 12) + sut(habersiz, 10) + sut(yineleme, 10) + sut(celisen, 9) + danismaYerel);
console.log(sut("uc duzey", 12) + sut(0, 10) + sut(0, 10) + sut(0, 9) + danismaUc);
console.log(sut("merkezi", 12) + sut(0, 10) + sut(0, 10) + sut(0, 9) + danismaMerkez);

console.log(`\nyerel duzen ${danismaUc} danismadan kacinir, karsiliginda ${celisen} celisen gerceklestirim alir`);
console.log(`basabas: bir celisen gerceklestirim ${(danismaUc / celisen).toFixed(2)} danismadan pahaliysa uc duzey kazanir`);
console.log(`merkezi duzen uc duzeyden ${danismaMerkez - danismaUc} fazla danisma harcar, celisen sayisi ikisinde de 0`);
const tekil = olcum.filter((o) => o.n === 1).length;
console.log(`bunun ${tekil * (B - 1)}'i kapsami tek birim olan ${tekil} karar icin harcanir`);
10 birim, 11 karar, kurumsal esigi = 7 birim

karar                                         birim   duzey
----------------------------------------------------------------
ayar degerleri tek kaynaktan okunur           10      kurumsal
veri erisimi tek katmandan gecer              9       kurumsal
envanter olay yolu uzerinden esitlenir        8       kurumsal
saat kaynagi tek modulden alinir              8       kurumsal
dis kataloga tek baglayici uzerinden erisilir 7       kurumsal
odunc suresi kurali yapilandirmadan okunur    5       cozum
kimlik dogrulama tek modulde toplanir         4       cozum
ceza hesabi uye kaydindan ayri durur          2       cozum
gunluk rapor ayri bir modulde uretilir        2       cozum
eposta bildirimi duz metin govdeyle gider     2       cozum
kiosk ucu ayri bir dagitim birimidir          1       uygulama

kurumsal   karar=5    etkiledigi birim=10   ort. kapsam=8.4
cozum      karar=5    etkiledigi birim=8    ort. kapsam=3.0
uygulama   karar=1    etkiledigi birim=1    ort. kapsam=1.0
esik duyarliligi: esik 6 -> 5 kurumsal, esik 7 -> 5 kurumsal, esik 8 -> 4 kurumsal

duzen       habersiz  yineleme  celisen  danisma
--------------------------------------------------
yerel       47        47        31       0
uc duzey    0         0         0        47
merkezi     0         0         0        99

yerel duzen 47 danismadan kacinir, karsiliginda 31 celisen gerceklestirim alir
basabas: bir celisen gerceklestirim 1.52 danismadan pahaliysa uc duzey kazanir
merkezi duzen uc duzeyden 52 fazla danisma harcar, celisen sayisi ikisinde de 0
bunun 9'i kapsami tek birim olan 1 karar icin harcanir

Dağılımın Okunması

On bir karar beş kurumsal, beş çözüm ve bir uygulama düzeyi kararına ayrıldı. Kurumsal düzeydeki beş kararın ortalama kapsamı 8,4 birim, çözüm düzeyindeki beş kararınki 3,0 birim. Birleşim sütunu da bilgi veriyor: kurumsal düzeydeki beş karar on birimin tamamına dokunuyor, çözüm düzeyindeki beş karar sekiz birime.

Eşiğin kırılganlığı burada da ölçülü. Kurumsal eşiği yediden altıya indirmek hiçbir kararı değiştirmiyor, çünkü kapsamı altı birim olan karar yok; sekize çıkarmak ise dış katalog bağlayıcısı kararını kurumsal düzeyden çözüm düzeyine indiriyor. Eşik bir seçimdir, sıralama değildir; hangi kararın hangi kararın üstünde olduğu ölçümden gelir, sınır bir kuraldan.

Dağılımın söylediği asıl şey şudur: hiçbir karar konusu gereği bir düzeye ait değildir. Saatin nereden okunacağı, konu olarak bakıldığında bir uygulama ayrıntısıdır; kapsamı sekiz birimdir ve bu modelde envanter eşitlemesiyle aynı düzeye düşer. Kararın düzeyi kararın konusundan değil, kaç birimin ona bağımlı olmasından çıkar.

Yanlış Düzeyin Bedeli

Alt tablo aynı on bir kararı üç düzende koşturuyor. Yerel düzende her karar gövdesinin bulunduğu birimde verilir ve orada kalır. Merkezî düzende her karar bütün birimlere danışılarak verilir. Üç düzeyli düzende her karar ölçülen kapsamının düzeyinde verilir ve yalnız kapsamdaki birimlere danışılır.

Yerel düzende kapsam içindeki 47 birim kararı hiç duymuyor. Duymayan birim işini yapmak zorunda olduğu için aynı kararı kendisi veriyor: 47 yinelenen karar. Yinelenen kararların hepsi çakışmıyor — her karar için makul seçenek sayısı ikiyle dört arasında (MN6) ve bağımsız veren birim bunlardan birini seçiyor. Tohumu 48151 olan üreteçle 47 yinelemenin 31’i sahibin seçiminden farklı çıktı, yani 31 çelişen gerçekleştirim.

Yerel düzenin kazancı 47 danışmadan kaçınmasıdır. Buradan başabaş noktası okunur: bir çelişen gerçekleştirimin uzlaştırılması 1,52 danışmadan pahalıysa üç düzeyli düzen kazanır. Bu, bir tercih değil bir hesaptır ve sayı modelin girdilerine bağlıdır; seçenek sayıları büyüdükçe çelişen gerçekleştirim artar ve başabaş noktası aşağı iner.

Merkezî düzen çelişkiyi de sıfıra indiriyor, ama 99 danışmayla — üç düzeyli düzenden 52 fazla. Bunun dokuzu tek bir karar için harcanıyor: kiosk ucunun ayrı bir dağıtım birimi olması kararının kapsamı tek birim, buna rağmen dokuz birime daha danışılıyor. Yanlış düzeyde karar vermenin iki yönü var ve ikisinin de bir sayısı var: kararı olduğundan alçak düzeyde vermek habersiz birim ve çelişen gerçekleştirim üretir, olduğundan yüksek düzeyde vermek boşa danışma üretir.

Özet

  • Bir kararın düzeyi konusundan değil kapsamından okunur; kapsam, kararın erişim alanındaki modülleri işleten dağıtım birimlerinin sayısıdır.
  • Model ağda on birim ve on bir karar var; kurumsal eşiği birimlerin üçte ikisi (7 birim) olarak seçildiğinde beş kurumsal, beş çözüm ve bir uygulama düzeyi kararı çıkıyor.
  • Kurumsal düzeydeki beş karar on birimin tamamına dokunuyor (ortalama kapsam 8,4); çözüm düzeyindeki beş karar sekiz birime (ortalama kapsam 3,0).
  • Yerel düzende 47 birim kararı duymuyor, 47 karar yeniden veriliyor ve tohumu 48151 olan üreteçle bunların 31’i sahibin seçiminden farklı çıkıyor; başabaş noktası bir çelişen gerçekleştirimin 1,52 danışmaya eşit olduğu yerdir.
  • Merkezî düzen çelişkiyi sıfırlar ama 99 danışma harcar; bunun dokuzu kapsamı tek birim olan tek bir karar içindir.

Sonraki Adım

İki ders de kararı verilmiş bir şey gibi ele aldı: karar vardır, kapsamı ölçülür, düzeyi belirlenir. Kararın kim tarafından verildiği, verildikten sonra kime ve nasıl duyurulduğu ve duyurulduktan sonra gerçekten uygulanıp uygulanmadığı hiç sorulmadı. Üç düzeyli düzenin 47 danışmasını yapan biri var; o kişinin işi yalnız karar vermek değil. Sonraki ders mimarın işini üç sorumluluğa ayırır — karar, iletişim ve gözetim — ve üçünü bir matris olarak kurar. Ölçülecek olan şudur: karar verilmiş ve duyurulmuş olmasına rağmen kodda karşılığı olmayan kararların oranı, ve bu oranın gözetim eklendiğinde ne kadar değiştiği.

İ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