Ders 03 / 12
Altın Yollar
Önerilen ve desteklenen yolun kapsam olarak ölçülmesi: bir altın yol dil, veri deposu ve dağıtım biçimi eksenlerinde tanımlanır, beş ekibin gereksinimine uygulanır, dışına çıkanın kaybettiği destek kalem kalem sayılır ve kapsam genişletildikçe sığan ekip, bakım yükü ile bileşim sayısı birlikte taranır.
İçindekiler
Önceki ders iki işletme biçimini karşılaştırdı ve ikisinin de aynı şeyi söylemediğini gösterdi: platformun sınırı. Talep üzerine düzen sırayı, ürün düzeni ihtiyacın genişliğini takip etti; hiçbiri “bu istek kapsam içinde mi” sorusuna yazılı bir karşılık vermedi.
Altın yol (golden path) o yazılı karşılıktır: platformun önerdiği ve desteklediği yolun kapsamı. Bir yol iyi niyet beyanı değil, bir kapsam tanımıdır — hangi dil, hangi veri deposu, hangi dağıtım biçimi. Kapsam yazıldığı anda ikiye böler: içeride kalanlar desteği alır, dışarıda kalanlar almaz. Bu ders yolu kapsam olarak yazar, beş ekibe uygular, dışarıda kalanın kaybettiğini kalem kalem sayar ve sonra yolu genişletir. Through-line bölgesel ölçüm ağı ve onun beş ekibidir; ağ da ekipler de kurgudur.
Yolu Kapsam Olarak Yazmak
PY13 — altın yol üç eksende kapsam olarak tanımlanır: dil, veri deposu, dağıtım biçimi. Yolun on destek kalemi vardır ve her kalem tek bir eksene bağlıdır. Her kalemin iki sayısı var: ekibin o kalemden yılda kazandığı iş günü ve o eksene eklenen her seçenek için platformun yılda ödediği bakım. Gerekçe: destek bir bütün değildir; bir ekip yolun bir kısmını alıp bir kısmını alamaz ve bu ancak kalemler eksenlere bağlandığında ölçülebilir.
PY14 — beş ekibin gereksinimi üç eksende yazılır; bir ekip ancak her üç eksende de kapsamın içindeyse yola tam sığar. PY15 — dışında kaldığı eksene bağlı destek kalemlerinin hepsini kaybeder, içeride kaldığı eksenlerin kalemlerini kullanmayı sürdürür. Gerekçe: yolun dışına çıkmak hep-ya-hiç değildir; kısmen yararlanma da ölçülmesi gereken bir durumdur.
// yol.mjs — bir altin yol kapsam olarak tanimlanir ve bes ekibe uygulanir (model) import { writeFileSync } from "node:fs"; // PY13 — altin yol uc eksende kapsam olarak tanimlanir: dil, veri deposu, dagitim bicimi. // Yolun on destek kalemi vardir; her kalem tek bir eksene baglidir. Deger, ekibin o kalemden // yilda kazandigi is gunu; bakim, o eksendeki her secenek icin platformun yilda odedigi. const KALEM = [ ["iskelet uretimi", "dil", 6, 4], ["derleme hatti", "dil", 8, 5], ["bagimlilik taramasi", "dil", 5, 3], ["sinama kosumu", "dil", 4, 3], ["sema gocu", "depo", 7, 5], ["yedek ve geri alma", "depo", 9, 6], ["baglanti havuzu", "depo", 4, 3], ["dagitim adimi", "dagitim", 10, 6], ["geri alma adimi", "dagitim", 6, 4], ["gosterge baglama", "dagitim", 5, 3], ].map(([ad, eksen, deger, bakim]) => ({ ad, eksen, deger, bakim })); const EKSEN = ["dil", "depo", "dagitim"]; // PY14 — bes ekibin gereksinimi uc eksende yazilir; bir ekip ancak her uc eksende de yolun // kapsami icindeyse yola sigar. Ekipler ve gereksinimleri kurgudur. const EKIP = [ ["sayac okuma", "dil A", "zaman serisi", "kenar birimi"], ["dogrulama", "dil A", "iliskisel", "toplu is"], ["faturalama", "dil B", "iliskisel", "uzun omurlu servis"], ["saha", "dil C", "belge", "kenar birimi"], ["raporlama", "dil A", "iliskisel", "uzun omurlu servis"], ].map(([ad, dil, depo, dagitim]) => ({ ad, ister: { dil, depo, dagitim } })); // PY15 — disina cikan ekip, disarida kaldigi eksene bagli destek kalemlerinin hepsini // kaybeder; ici eksenlerin kalemlerini kullanmayi surdurur. const YOL0 = { dil: ["dil A"], depo: ["iliskisel"], dagitim: ["uzun omurlu servis"] }; const disari = (yol, e) => EKSEN.filter((x) => !yol[x].includes(e.ister[x])); const kayip = (yol, e) => KALEM.filter((k) => disari(yol, e).includes(k.eksen)); const kazanc = (yol, e) => KALEM.filter((k) => !disari(yol, e).includes(k.eksen)) .reduce((t, k) => t + k.deger, 0); writeFileSync("yol.json", JSON.stringify({ KALEM, EKSEN, EKIP, YOL0 })); const eksenToplam = (x) => KALEM.filter((k) => k.eksen === x).reduce((t, k) => t + k.deger, 0); console.log("eksen".padEnd(10) + "kalem".padStart(6) + "toplam deger".padStart(14) + "secenek basina bakim".padStart(22) + " kalemler"); for (const x of EKSEN) { const g = KALEM.filter((k) => k.eksen === x); console.log(x.padEnd(10) + `${g.length}`.padStart(6) + `${eksenToplam(x)}`.padStart(14) + `${g.reduce((t, k) => t + k.bakim, 0)}`.padStart(22) + " " + g.map((k) => k.ad).join(", ")); } console.log(`yola tam sigan ekibin yillik kazanci: ` + `${KALEM.reduce((t, k) => t + k.deger, 0)} is gunu`); const TAM = KALEM.reduce((t, k) => t + k.deger, 0); console.log("\nyol: dil A / iliskisel / uzun omurlu servis"); console.log("ekip".padEnd(13) + "sigan eksen".padStart(12) + "kazanc".padStart(8) + "yolun payi".padStart(12) + "kayip kalem".padStart(13) + "kayip deger".padStart(13) + " disarida kalan eksen"); for (const e of EKIP) { const d = disari(YOL0, e), K = kayip(YOL0, e); console.log(e.ad.padEnd(13) + `${EKSEN.length - d.length}/3`.padStart(12) + `${kazanc(YOL0, e)}`.padStart(8) + `%${(100 * kazanc(YOL0, e) / TAM).toFixed(0)}`.padStart(12) + `${K.length}`.padStart(13) + `${K.reduce((t, k) => t + k.deger, 0)}`.padStart(13) + " " + (d.length ? d.map((x) => `${x} (${e.ister[x]})`).join(", ") : "-")); } console.log("eksen basina disarida kalan ekip — " + EKSEN.map((x) => `${x}: ${EKIP.filter((e) => disari(YOL0, e).includes(x)).length}`).join(", ")); console.log("\ndisina cikanin kalem kalem kaybettigi destek:"); for (const e of EKIP.filter((e) => disari(YOL0, e).length)) console.log(` ${e.ad}: ` + kayip(YOL0, e).map((k) => `${k.ad} (${k.deger})`).join(", "));
eksen kalem toplam deger secenek basina bakim kalemler dil 4 23 15 iskelet uretimi, derleme hatti, bagimlilik taramasi, sinama kosumu depo 3 20 14 sema gocu, yedek ve geri alma, baglanti havuzu dagitim 3 21 13 dagitim adimi, geri alma adimi, gosterge baglama yola tam sigan ekibin yillik kazanci: 64 is gunu yol: dil A / iliskisel / uzun omurlu servis ekip sigan eksen kazanc yolun payi kayip kalem kayip deger disarida kalan eksen sayac okuma 1/3 23 %36 6 41 depo (zaman serisi), dagitim (kenar birimi) dogrulama 2/3 43 %67 3 21 dagitim (toplu is) faturalama 2/3 41 %64 4 23 dil (dil B) saha 0/3 0 %0 10 64 dil (dil C), depo (belge), dagitim (kenar birimi) raporlama 3/3 64 %100 0 0 - eksen basina disarida kalan ekip — dil: 2, depo: 2, dagitim: 3 disina cikanin kalem kalem kaybettigi destek: sayac okuma: sema gocu (7), yedek ve geri alma (9), baglanti havuzu (4), dagitim adimi (10), geri alma adimi (6), gosterge baglama (5) dogrulama: dagitim adimi (10), geri alma adimi (6), gosterge baglama (5) faturalama: iskelet uretimi (6), derleme hatti (8), bagimlilik taramasi (5), sinama kosumu (4) saha: iskelet uretimi (6), derleme hatti (8), bagimlilik taramasi (5), sinama kosumu (4), sema gocu (7), yedek ve geri alma (9), baglanti havuzu (4), dagitim adimi (10), geri alma adimi (6), gosterge baglama (5)
Kimin Dışında Kaldığı
Yola tam sığan bir ekip yılda 64 iş günü kazanır. Başlangıç yolunda — dil A, ilişkisel depo,
uzun ömürlü servis — bu kazancı beş ekipten yalnız biri alır: raporlama. Geri kalan dördü
yedi ekip-eksen çiftinde dışarıdadır.
Dışarıda kalmanın dereceleri vardır ve tablo bunu ayırır. dogrulama üç eksenin ikisinde
içeridedir: dil ve depo desteğini alır, yalnız dağıtım kalemlerini kaybeder — dağıtım adımı (10),
geri alma adımı (6), gösterge bağlama (5), toplam 21 iş günü. faturalama da 2/3’tür ama
kaybettiği eksen dildir: dört kalem, 23 iş günü. sayac okuma iki eksende dışarıdadır ve
altı kalem, 41 iş günü kaybeder — yolun içinde olduğu tek eksen dil olduğu için kazancı 23’te
kalır.
saha ekibi sıfır eksende içeridedir. On destek kaleminin hepsini kaybeder ve yoldan hiçbir
şey almaz. Bu ayrımın karar değeri şudur: dogrulama için yolun dışına çıkmak 21 iş günlük bir
eksiktir, saha için yolun varlığı ile yokluğu aynı şeydir. Aynı yol, aynı kuruluşta, bir ekibe
küçük bir eksik, başka bir ekibe tam bir yokluk olarak görünür.
Kısmen sığan ekipler bu kursun sızan soyutlama dediği durumun kendisidir. sayac okuma
platformun içindedir — iskelet üretimini, derleme hattını, bağımlılık taramasını ve sınama koşumunu
platformdan alır — ama şema göçünü, yedeği, bağlantı havuzunu, dağıtımı, geri almayı ve gösterge
bağlamayı kendi kurar. Ekip her iki dünyayı birden bilmek zorundadır; yolun sağladığı sadeleşme onun
için %36‘da kalır. dogrulama için %67, faturalama için %64. Yolun ortalama etkisi bu beş
ekipte %53’tür, oysa tanım “beş ekipten biri hariç hepsi kısmen destekleniyor” cümlesiyle çok daha
iyi görünür.
Son satır hangi ekseni genişletmek gerektiğini söyler: dil ekseninde iki, depo ekseninde iki, dağıtım ekseninde üç ekip dışarıdadır. Kapsam kararı, en çok ekibin çarptığı eksenden başlar — tabloda o eksen dağıtım biçimidir.
Yolu Genişletmek
PY16 — yolun bakım yükü, her destek kaleminin bağlı olduğu eksendeki seçenek sayısıyla çarpılmasıdır; kapsama eklenen her seçenek o eksenin bütün kalemlerinin bakımını bir kez daha getirir. PY17 — yolun kendi karmaşıklığı, sınanması gereken bileşim sayısıdır (dil × depo × dağıtım) ve her bileşim yılda 3 iş günü tutar. Gerekçe: kapsam genişledikçe kalemler yalnız çoğalmaz, birbirleriyle çarpışır; bir dil ile bir depo bir arada çalışıyor diye o dilin başka bir depoyla çalışacağı çıkmaz. PY18 — genişletme her adımda tek eksene tek seçenek ekler.
// genislet.mjs — yolun kapsami adim adim genisletilir import { readFileSync } from "node:fs"; const { KALEM, EKSEN, EKIP, YOL0 } = JSON.parse(readFileSync("yol.json", "utf8")); // PY16 — yolun bakim yuku, her destek kaleminin bagli oldugu eksendeki secenek sayisiyla // carpilmasidir: kapsama eklenen her secenek o eksenin butun kalemlerinin bakimini bir kez // daha getirir. PY17 — yolun kendi karmasikligi, sinanmasi gereken bilesim sayisidir // (dil x depo x dagitim) ve her bilesim yilda 3 is gunu tutar. PY18 — genisletme her adimda // tek eksene tek secenek ekler. const BILESIM_BEDELI = 3; const ADIM = [ ["dagitim", "toplu is"], ["dil", "dil B"], ["depo", "zaman serisi"], ["dagitim", "kenar birimi"], ["dil", "dil C"], ["depo", "belge"], ]; const disari = (yol, e) => EKSEN.filter((x) => !yol[x].includes(e.ister[x])); const olc = (yol) => { const kazanc = EKIP.reduce((t, e) => t + KALEM .filter((k) => !disari(yol, e).includes(k.eksen)).reduce((a, k) => a + k.deger, 0), 0); const bakim = KALEM.reduce((t, k) => t + k.bakim * yol[k.eksen].length, 0); const bilesim = EKSEN.reduce((t, x) => t * yol[x].length, 1); return { kazanc, bakim, bilesim, yuk: bakim + bilesim * BILESIM_BEDELI, sigan: EKIP.filter((e) => disari(yol, e).length === 0).length, cikma: EKIP.reduce((t, e) => t + disari(yol, e).length, 0) }; }; const yol = { dil: [...YOL0.dil], depo: [...YOL0.depo], dagitim: [...YOL0.dagitim] }; const S = [{ ad: "baslangic", ...olc(yol), kapsam: "1/1/1" }]; for (const [eksen, secenek] of ADIM) { yol[eksen] = [...yol[eksen], secenek]; S.push({ ad: `+${secenek}`, ...olc(yol), kapsam: EKSEN.map((x) => yol[x].length).join("/") }); } console.log("asama".padEnd(16) + "kapsam".padStart(8) + "sigan ekip".padStart(11) + "disari cikma".padStart(13) + "kazanc".padStart(8) + "bakim".padStart(7) + "bilesim".padStart(9) + "bilesim yuku".padStart(14) + "toplam yuk".padStart(12) + "net".padStart(6)); for (const s of S) console.log(s.ad.padEnd(16) + s.kapsam.padStart(8) + `${s.sigan}/5`.padStart(11) + `${s.cikma}`.padStart(13) + `${s.kazanc}`.padStart(8) + `${s.bakim}`.padStart(7) + `${s.bilesim}`.padStart(9) + `${s.bilesim * BILESIM_BEDELI}`.padStart(14) + `${s.yuk}`.padStart(12) + `${s.kazanc - s.yuk}`.padStart(6)); const enIyi = S.reduce((a, b) => (a.kazanc - a.yuk >= b.kazanc - b.yuk ? a : b)); const son = S[S.length - 1], ilk = S[0]; console.log(`\nen yuksek net: "${enIyi.ad}" asamasi, kapsam ${enIyi.kapsam}, ` + `${enIyi.sigan}/5 ekip sigar, net ${enIyi.kazanc - enIyi.yuk} is gunu`); console.log(`bes ekibin hepsinin sigdigi asama (${son.kapsam}): net ${son.kazanc - son.yuk} — ` + `baslangictan (${ilk.kapsam}, ${ilk.sigan}/5 ekip) ${ilk.kazanc - ilk.yuk - son.kazanc + son.yuk}` + ` is gunu dusuk`); console.log(`kapsam bir seceneklikten uc seceneklige cikarken kazanc ` + `%${(100 * (son.kazanc / ilk.kazanc - 1)).toFixed(0)} artti, yuk ` + `%${(100 * (son.yuk / ilk.yuk - 1)).toFixed(0)} artti`);
asama kapsam sigan ekip disari cikma kazanc bakim bilesim bilesim yuku toplam yuk net baslangic 1/1/1 1/5 7 171 42 1 3 45 126 +toplu is 1/1/2 2/5 6 192 55 2 6 61 131 +dil B 2/1/2 3/5 5 215 70 4 12 82 133 +zaman serisi 2/2/2 3/5 4 235 84 8 24 108 127 +kenar birimi 2/2/3 4/5 2 277 97 12 36 133 144 +dil C 3/2/3 4/5 1 300 112 18 54 166 134 +belge 3/3/3 5/5 0 320 126 27 81 207 113 en yuksek net: "+kenar birimi" asamasi, kapsam 2/2/3, 4/5 ekip sigar, net 144 is gunu bes ekibin hepsinin sigdigi asama (3/3/3): net 113 — baslangictan (1/1/1, 1/5 ekip) 13 is gunu dusuk kapsam bir seceneklikten uc seceneklige cikarken kazanc %87 artti, yuk %360 artti
Tarama beklenen yönde başlar. Dağıtım eksenine toplu iş eklenince dogrulama yola girer ve net
126’dan 131’e çıkar; dil B eklenince faturalama girer, net 133 olur. Üçüncü adımda kırılma
görünür: zaman serisi deposu kapsama alınır, kazanç 215’ten 235’e çıkar ama sığan ekip sayısı
değişmez — sayac okuma hâlâ kenar birimini bekler — ve net 133’ten 127’ye düşer. Kapsam
büyümüştür, kimse yola girmemiştir.
Dördüncü adım en yüksek noktadır: kenar birimi eklenince hem sayac okuma yola girer hem saha
dağıtım kalemlerini kazanır, net 144 iş günü olur. Kapsam 2/2/3’tür, beş ekipten dördü sığar.
Buradan sonrası kaybettirir: dil C eklenince net 134’e, belge deposu eklenince 113’e iner.
Son satır dersin kararıdır. Beş ekibin hepsinin sığdığı yol (3/3/3), hiç genişletilmemiş yoldan 13 iş günü daha kötüdür — üstelik başlangıç yolunda beş ekipten yalnız biri sığıyordu. Kapsam bir seçeneklikten üç seçenekliğe çıkarken kazanç %87 arttı, yük %360. Sınanması gereken bileşim sayısı birden yirmi yediye çıktı; yolun kendi karmaşıklığı, yolun ortadan kaldırdığı karmaşıklığı geçti. Herkesi kapsayan yol, artık yol değildir.
Özet
- Altın yol üç eksende kapsam olarak yazıldı (dil, veri deposu, dağıtım biçimi) ve on destek kalemi eksenlere bağlandı; yola tam sığan ekip yılda 64 iş günü kazanır.
- Başlangıç yolunda beş ekipten yalnız
raporlamatam sığar; kalan dördü yedi ekip-eksen çiftinde dışarıdadır. - Dışarıda kalmanın derecesi ölçüldü:
dogrulama21,faturalama23,sayac okuma41 iş günü kaybeder;sahaon kalemin hepsini kaybeder ve yoldan hiçbir şey almaz. - Kısmen sığan ekip soyutlamanın sızdığı yerdir:
sayac okumayolun sadeleştirmesinin ancak %36’sını alır, geri kalanını kendi kurar ve iki dünyayı birden bilmek zorunda kalır. - Kapsam genişletildikçe net 126, 131, 133, 127, 144, 134 ve 113 iş günü izler; en yüksek nokta 2/2/3 kapsamında, beş ekipten dördünün sığdığı aşamadadır.
- Beş ekibin hepsinin sığdığı yol başlangıç yolundan 13 iş günü kötüdür; kapsam üçe çıkarken kazanç %87, yük %360 arttı ve sınanacak bileşim sayısı birden yirmi yediye çıktı.
Sonraki Adım
Bu derste yol bir kapsam olarak yazıldı ve kapsamın iki yüzü sayıldı: içeride kalanın kazancı,
dışarıda kalanın kaybı. Yolun tanımında söylenmeyen bir şey vardı — yola girmek zorunlu muydu?
Bütün tabloda ekiplerin gereksinimleri sabit tutuldu ve yol onlara uyduğu kadar uydu. Zorunluluk
konulsaydı saha ekibi kenar biriminden vazgeçer miydi, yoksa yol onun meşru bir gereksinimini mi
engellerdi? Sonraki ders her kalem için üç kip dener — zorunlu, öntanımlı ama değiştirilebilir,
serbest — ve çeşitlilik ile uyumu birlikte sayar: kaç ayrı seçim doğuyor, ortak araç kaç kalemde
işe yaramaz hâle geliyor, zorunluluk kaç ekipte gerçek bir gereksinimi engelliyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.