İçeriğe geç
academia.sh

Ders 01 / 10

Kurumsal Mimari Kavramı

Tek sistemin dışına çıkan düzey: kurumun sistemlerini, sahiplerini, bütçelerini ve iş yeteneklerini bir veri yapısına çevirmek, iş ile teknoloji arasındaki hizalamayı üç sayıya bağlamak — hiçbir sistemin karşılamadığı yetenek, birden çok sistemin karşıladığı yetenek ve hiçbir yeteneğe bağlanamayan sistem.

İçindekiler

Önceki kurs kararı bir kayda, sistemi bir görünüme çevirdi ve her belgeyi yanıtladığı soru sayısıyla ölçtü. O kayıtların ve görünümlerin hepsinin ortak bir sınırı vardı: tek bir sistemin içinde duruyorlardı. Oysa bir sistem kendi başına durmaz. Yanında, aynı üyeye aynı gün hizmet veren başka sistemler vardır; bazısı dışarıdan alınmıştır, bazısının bütçesi başka bir birimin kaleminden çıkar, bazısına o kurumun hiçbir çalışanı kod yazamaz.

Bu ders ölçeği bir basamak yukarı taşıyor. Mimarın Rolü kursundaki mimarlık düzeyleri dersi kurumsal düzeyi kapsamla tanımlamıştı: bir kararın bağladığı dağıtım birimi sayısı. O dersin habersiz birim ölçümü burada tekrarlanmaz, girdi olarak alınır. Değişen şey birimin kendisidir: artık ayrı yayınlanan bir dağıtım birimi değil, ayrı sahibi ve ayrı bütçesi olan bir sistem sayılıyor. Kurumsal mimari (enterprise architecture) bu ölçeğin adıdır ve ilk sorusu şudur: kurumun yapmak zorunda olduğu işler ile elindeki sistemler birbirini ne kadar karşılıyor.

Kurum Bir Veri Yapısıdır

İş ve teknoloji hizalaması (business–IT alignment), söz olarak bakıldığında ölçülemez bir iddiadır. Ölçülebilir hale gelmesi için iki listenin yan yana konması gerekir: kurumun karşılamak zorunda olduğu iş yetenekleri (business capability) ve bu yetenekleri karşıladığını iddia eden sistemler. Yetenek listesi sistemlerden türetilmez; kurumun kendi işinden gelir (KM1). Bu ayrım ölçümün tamamını taşır: liste sistemlerden türetilseydi karşılanmayan bir yetenek hiç görünmezdi.

Model olarak bölgesel bir kütüphane ağı kullanılıyor. Kurgudur; gerçek bir kurum, satıcı, ürün ya da kişi anlatılmaz. Ağda şube sistemleri, dışarıdan alınmış bir katalog sistemi, içeride yazılmış ödünç ve ücretlendirme servisleri, ayrı bir üyelik sistemi, belediye tarafında duran bir kimlik doğrulama servisi ve raporlama isteyen bir yönetim birimi var. Sahipler ve bütçeler ayrıdır.

Bir sistem, ayrı bütçeden ödenen, ayrı sahibi olan ve ayrı yayınlanan yazılımdır (KM2). Sistem kaydındaki karşılama listesi bir iddiadır; iddianın kodda karşılığı olup olmadığı bu derste sınanmaz (KM3). Bağ (integration edge), aynı veri varlığı üzerinden yazan sistemden okuyan sisteme giden yönlü çifttir (KM4) — bu kursun ölçü birimi budur.

// kurum/model.mjs — MODEL bolgesel kutuphane agi: sistemler, sahipler, yetenekler, veri.
// Kurgudur; gercek bir kurum, satici, urun ya da kisi anlatilmaz.
export const SISTEM = {
  katalog: { sahip: "dis-saglayici", butce: "hizmet-bedeli" },
  odunc: { sahip: "bt-birimi", butce: "ic-gelistirme" },
  ucretlendirme: { sahip: "bt-birimi", butce: "ic-gelistirme" },
  uyelik: { sahip: "uye-hizmetleri", butce: "uye-hizmetleri" },
  kimlik: { sahip: "belediye-bt", butce: "belediye" },
  "sube-yerel": { sahip: "sube-yonetimi", butce: "sube" },
  kiosk: { sahip: "sube-yonetimi", butce: "sube" },
  raporlama: { sahip: "yonetim-birimi", butce: "yonetim" },
  arsiv: { sahip: "yok", butce: "yok" },
};
// YETENEK — kurumun karsilamak zorunda oldugu is yetenekleri (sistemden bagimsiz liste)
export const YETENEK = ["materyal-arama", "odunc-verme", "iade-alma", "ayirtma",
  "uyelik-acma", "uye-dogrulama", "ucret-hesaplama", "ucret-tahsilati",
  "subeler-arasi-aktarim", "demirbas-sayimi", "kullanim-raporlama",
  "satin-alma-onerisi", "gecikme-bildirimi"];
// KARSILAMA[s] = s sisteminin karsiladigini iddia ettigi yetenekler
export const KARSILAMA = {
  katalog: ["materyal-arama", "demirbas-sayimi"],
  odunc: ["odunc-verme", "iade-alma", "ayirtma", "gecikme-bildirimi"],
  ucretlendirme: ["ucret-hesaplama", "gecikme-bildirimi"],
  uyelik: ["uyelik-acma", "uye-dogrulama"],
  kimlik: ["uye-dogrulama"],
  "sube-yerel": ["iade-alma", "subeler-arasi-aktarim", "demirbas-sayimi"],
  kiosk: ["odunc-verme", "materyal-arama"],
  raporlama: ["kullanim-raporlama"],
  arsiv: [],
};
// VERI[v] = veri varligi; hangi sistem yaziyor, hangileri okuyor
export const VERI = {
  "uye-kaydi": { yazan: ["uyelik"], okuyan: ["odunc", "ucretlendirme", "kiosk", "raporlama"] },
  "kimlik-eslesmesi": { yazan: ["kimlik", "uyelik"], okuyan: ["odunc", "kiosk"] },
  "materyal-kaydi": { yazan: ["katalog"], okuyan: ["odunc", "kiosk", "sube-yerel", "raporlama"] },
  "nusha-durumu": { yazan: ["katalog", "odunc", "sube-yerel"], okuyan: ["kiosk", "raporlama"] },
  "odunc-hareketi": { yazan: ["odunc", "kiosk"], okuyan: ["ucretlendirme", "raporlama"] },
  "ucret-kaydi": { yazan: ["ucretlendirme"], okuyan: ["uyelik", "raporlama", "kiosk"] },
  "ceza-kurali": { yazan: ["ucretlendirme"], okuyan: ["odunc", "kiosk"] },
  "aktarim-istegi": { yazan: ["sube-yerel"], okuyan: ["odunc", "katalog"] },
  "eski-kayit": { yazan: [], okuyan: ["arsiv", "raporlama"] },
  "sayim-farki": { yazan: ["sube-yerel"], okuyan: [] },
};
export const SISTEMLER = Object.keys(SISTEM);
export const sahibi = (s) => SISTEM[s].sahip;
// bag = ayni veri varligi uzerinden yazan sistemden okuyan sisteme giden yonlu cift
export function baglar() {
  const b = new Map();
  for (const [v, d] of Object.entries(VERI))
    for (const y of d.yazan) for (const o of d.okuyan)
      if (y !== o) b.set(`${y}->${o}`, [...(b.get(`${y}->${o}`) ?? []), v]);
  return b;
}

Ölçüm

İkinci dosya hizalamayı üç sayıya indirger ve aynı modeli iki envanter biçiminde okur.

// kurum/hizalama.mjs — bosluk, ortusme, yetim sistem; iki envanter biciminin gordugu
import { SISTEM, YETENEK, KARSILAMA, VERI, SISTEMLER, sahibi, baglar } from "./model.mjs";

const sut = (s, n) => String(s).padEnd(n);
const sahipler = [...new Set(SISTEMLER.map(sahibi))].filter((o) => o !== "yok");
const karsilayan = (y) => SISTEMLER.filter((s) => KARSILAMA[s].includes(y));
const B = baglar();
const ciftYonlu = [...B.keys()].filter((k) => {
  const [a, b] = k.split("->");
  return B.has(`${b}->${a}`) && a < b;
});
const sahipAsan = [...B.keys()].filter((k) => {
  const [a, b] = k.split("->");
  return sahibi(a) !== sahibi(b);
});

console.log(`MODEL kurum: ${SISTEMLER.length} sistem, ${sahipler.length} sahip, ` +
  `${YETENEK.length} is yetenegi, ${Object.keys(VERI).length} veri varligi`);
console.log(`bag: ${B.size} yonlu bag, ${ciftYonlu.length} cift yonlu, ` +
  `${sahipAsan.length} tanesi sahip degistiriyor\n`);

console.log(sut("is yetenegi", 24) + sut("sistem", 8) + sut("sahip", 7) + "durum");
console.log("-".repeat(60));
const durumu = (n, os) => (n === 0 ? "bosluk" : n === 1 ? "tek" : os > 1 ? "ortusme+cakisma" : "ortusme");
for (const y of YETENEK) {
  const k = karsilayan(y);
  const os = new Set(k.map(sahibi)).size;
  console.log(sut(y, 24) + sut(k.length, 8) + sut(os, 7) + durumu(k.length, os));
}

const bosluk = YETENEK.filter((y) => karsilayan(y).length === 0);
const ortusme = YETENEK.filter((y) => karsilayan(y).length > 1);
const cakisma = ortusme.filter((y) => new Set(karsilayan(y).map(sahibi)).size > 1);
const yetim = SISTEMLER.filter((s) => KARSILAMA[s].length === 0);
const uzlasma = ortusme.reduce((t, y) => t + new Set(karsilayan(y).map(sahibi)).size - 1, 0);

console.log(`\nbosluk=${bosluk.length} (${bosluk.join(", ")})`);
console.log(`ortusme=${ortusme.length}, bunlarin ${cakisma.length}'i sahiplik cakismasi`);
console.log(`yetim sistem=${yetim.length} (${yetim.join(", ")})`);
console.log(`hizalama orani = ${YETENEK.length - bosluk.length}/${YETENEK.length} = ` +
  `${(((YETENEK.length - bosluk.length) / YETENEK.length) * 100).toFixed(1)}%`);
console.log(`ortusen yetenekler icin gereken uzlasma sayisi = ${uzlasma}`);

// ---- iki envanter bicimi ayni modelden turetiliyor ----
// A: sistem envanteri  — kayit birimi sistemdir, yetenek adi sistem kaydinin icinde gecer
// B: yetenek envanteri — kayit birimi yetenektir, sistem adi yetenek kaydinin icinde gecer
const bulgu = [...bosluk.map((y) => ["bosluk", y]), ...ortusme.map((y) => ["ortusme", y]),
  ...yetim.map((s) => ["yetim", s])];
const evrenA = new Set(Object.values(KARSILAMA).flat()); // A yalniz iddia edilen yetenekleri bilir
const gorurA = (t) => t !== "bosluk";                    // yetim sistem A'da bos kayit olarak durur
const gorurB = (t) => t !== "yetim";                     // yetenek kaydi hicbir sistemi anmaz
const sayA = bulgu.filter(([t]) => gorurA(t)).length;
const sayB = bulgu.filter(([t]) => gorurB(t)).length;
console.log(`\nA sistem envanterinin yetenek evreni: ${evrenA.size}/${YETENEK.length} yetenek`);
console.log(sut("bicim", 20) + sut("gorulen bulgu", 16) + "gormedigi");
console.log("-".repeat(60));
console.log(sut("A sistem envanteri", 20) + sut(`${sayA}/${bulgu.length}`, 16) + `${bosluk.length} bosluk`);
console.log(sut("B yetenek envanteri", 20) + sut(`${sayB}/${bulgu.length}`, 16) + `${yetim.length} yetim sistem`);
console.log(sut("kurum modeli (A+B)", 20) + sut(`${bulgu.length}/${bulgu.length}`, 16) + "-");
MODEL kurum: 9 sistem, 6 sahip, 13 is yetenegi, 10 veri varligi
bag: 23 yonlu bag, 4 cift yonlu, 20 tanesi sahip degistiriyor

is yetenegi             sistem  sahip  durum
------------------------------------------------------------
materyal-arama          2       2      ortusme+cakisma
odunc-verme             2       2      ortusme+cakisma
iade-alma               2       2      ortusme+cakisma
ayirtma                 1       1      tek
uyelik-acma             1       1      tek
uye-dogrulama           2       2      ortusme+cakisma
ucret-hesaplama         1       1      tek
ucret-tahsilati         0       0      bosluk
subeler-arasi-aktarim   1       1      tek
demirbas-sayimi         2       2      ortusme+cakisma
kullanim-raporlama      1       1      tek
satin-alma-onerisi      0       0      bosluk
gecikme-bildirimi       2       1      ortusme

bosluk=2 (ucret-tahsilati, satin-alma-onerisi)
ortusme=6, bunlarin 5'i sahiplik cakismasi
yetim sistem=1 (arsiv)
hizalama orani = 11/13 = 84.6%
ortusen yetenekler icin gereken uzlasma sayisi = 5

A sistem envanterinin yetenek evreni: 11/13 yetenek
bicim               gorulen bulgu   gormedigi
------------------------------------------------------------
A sistem envanteri  7/9             2 bosluk
B yetenek envanteri 8/9             1 yetim sistem
kurum modeli (A+B)  9/9             -

Hizalamanın Üç Sayısı

Hizalama tek bir sayı değil, üç ayrı sayıdır ve üçü farklı şeyi söyler.

Boşluk, hiçbir sistemin karşılamadığı iş yeteneğidir. Modelde iki tane var: ücret tahsilatı ve satın alma önerisi. İkisi de yapılıyor — ücret bankoda alınıyor, satın alma önerileri elde tutulan çizelgelerde toplanıyor — ama hiçbir sistemin kaydında geçmiyor. Boşluk, işin yapılmadığı anlamına gelmez; işin sistem dışında yapıldığı anlamına gelir. Hizalama oranı bu modelde 11/13, yani %84,6.

Örtüşme, birden çok sistemin aynı yeteneği karşıladığı durumdur: altı tane. Örtüşmenin kendisi kusur değildir; kiosk ile ödünç servisinin ikisinin de ödünç verebilmesi bir gerekliliktir. Belirleyici olan örtüşmenin kaç sahibe yayıldığıdır. Altı örtüşmenin beşinde karşılayan sistemlerin sahibi farklı; bunlar sahiplik çakışmasıdır (ownership conflict). Gecikme bildirimi iki sistem tarafından karşılanıyor ama ikisinin de sahibi aynı birim; kuralın değişmesi tek bir masada halledilir. Diğer beşinde kural değişikliği iki ayrı bütçenin, iki ayrı takvimin ve iki ayrı önceliğin uzlaşmasını gerektirir. Modelde uzlaşma sayısı beştir ve bu sayı kurumun koordinasyon yükünün alt sınırıdır.

Yetim sistem, hiçbir yeteneğe bağlanamayan sistemdir: arşiv. Sahibi de yok. Yetim sistem kendiliğinden kapatılacak bir şey değildir — arşiv kaydını hâlâ raporlama okuyor — ama savunması olmayan bir kalemdir: bütçe tartışmasında onu kimin savunacağı belirsizdir.

Bağ sayısı bu üç sayının üstüne oturur. On veri varlığı üzerinden yirmi üç yönlü bağ çıkıyor; dördü çift yönlü, yirmisi bir sahiplik sınırını geçiyor. Yirmi üç bağın yirmisinin sahip değiştirmesi, kurum ölçeğinde tümleştirmenin teknik değil örgütsel bir işlem olduğunu sayıyla söyler: bağların %87’sinde bir tarafın yaptığı değişiklik başka bir bütçenin sahibini ilgilendirir.

Envanterin Biçimi Bulguyu Belirler

Aynı model iki biçimde yazılabilir. Sistem envanterinde kayıt birimi sistemdir; her sistemin kaydında karşıladığı yetenekler listelenir. Yetenek envanterinde kayıt birimi yetenektir; her yeteneğin kaydında onu karşılayan sistemler listelenir. İkisi de aynı model üzerinden yazılıyor, ama gördükleri bulgu kümesi aynı değil.

Modelde toplam dokuz bulgu var: iki boşluk, altı örtüşme, bir yetim sistem. Sistem envanteri bunların yedisini gösteriyor. Göremediği boşluktur, çünkü sistem envanterinin yetenek evreni sistem kayıtlarından türer: on üç yeteneğin yalnız on biri herhangi bir kayıtta geçer, hiç geçmeyen iki yetenek envanterde hiç yoktur. Yetenek envanteri sekiz bulguyu gösteriyor; göremediği yetim sistemdir, çünkü hiçbir yeteneğin kaydında adı geçmeyen bir sistem o envantere hiç girmez.

Dokuzun tamamını yalnız iki yönlü eşleme — kurum modeli — gösterir. Kurumsal mimarinin ilk ürünü bu yüzden bir liste değil bir eşlemedir: iki listenin hangi noktalarda birbirine değmediği, listelerin kendisinden daha çok bilgi taşır.

Özet

  • Kurumsal mimarinin birimi dağıtım birimi değil, ayrı sahibi ve ayrı bütçesi olan sistemdir; model kurumda 9 sistem, 6 sahip, 13 iş yeteneği ve 10 veri varlığı var.
  • İş ve teknoloji hizalaması tek sayı değil üç sayıdır: 2 boşluk, 6 örtüşme, 1 yetim sistem; hizalama oranı 11/13 (%84,6).
  • Örtüşmenin maliyetini sahip sayısı belirler: 6 örtüşmenin 5’i iki ayrı sahibe yayılıyor ve toplam 5 uzlaşma gerektiriyor; aynı sahipteki örtüşme tek masada çözülür.
  • Model kurumda 23 yönlü bağ var, 4’ü çift yönlü ve 20’si bir sahiplik sınırını geçiyor.
  • Sistem envanteri 9 bulgunun 7’sini, yetenek envanteri 8’ini gösterir; dokuzunun tamamı yalnız iki listenin eşlemesinden okunur.

Sonraki Adım

Bu ders kurum modelini bir kez kurdu ve üç sayı üretti. Modelin nasıl belgeleneceği hiç sorulmadı: hangi katmanlara ayrılacağı, kaç ayrı görünümle yazılacağı, kimin ne sıklıkta gözden geçireceği ve bu belgenin kendisinin ne kadar bakım isteyeceği açık değil. Kurumsal mimari çerçeveleri tam olarak bu soruya yanıt verme iddiasındadır. Sonraki ders aynı kurum modelini iki çerçeve biçiminde — ayrıntılı katmanlı ve hafif — belgeler; her birinin kaç soruyu yanıtladığını, kaç kalem bakım istediğini ve çerçevenin kendi bakım maliyetinin ne zaman yanıtladığı sorunun değerini aştığını sayar.

İ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