İçeriğe geç
academia.sh

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şmezsayac 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 raporlama tam sığar; kalan dördü yedi ekip-eksen çiftinde dışarıdadır.
  • Dışarıda kalmanın derecesi ölçüldü: dogrulama 21, faturalama 23, sayac okuma 41 iş günü kaybeder; saha on kalemin hepsini kaybeder ve yoldan hiçbir şey almaz.
  • Kısmen sığan ekip soyutlamanın sızdığı yerdir: sayac okuma yolun 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat