Ders 04 / 10
Ölçekli Çerçeveler
Çok ekipli eşgüdümün bedelinin sayılması: aynı yirmi dört kişi ve yirmi dört modül bir ile on iki ekip arasında bölünür, bağımlı iş kalemi başına eşgüdüm turu, ortak kanal sayısı, eşgüdüm katmanının gecikmesi ve ortak planlama turunun maliyeti ölçülür.
İçindekiler
Önceki dersin bütün ölçümleri tek ekip üzerinde yapıldı: bir biriktirme listesi, bir iş sınırı, dört kişi. Bu varsayım kaldırıldığında yeni bir maliyet kalemi doğar. Bir iş kalemi birden çok ekibin sahip olduğu modüllere dokunduğunda, ekipler arasında bir eşgüdüm turu geçmesi gerekir; bu tur ne çalışmadır ne de kuyrukta beklemedir, akış süresine eklenir ama hiçbir kaleme yaklaştırmaz.
Ölçekli çerçeveler bu turu düzene sokma girişimidir: bir eşgüdüm katmanı, düzenli bir ortak planlama turu ve ekipler arası bağımlılıkları önceden görünür kılan bir liste. Bu ders çerçeveleri adlarıyla değil bu üç ögeyle ele alır ve tek bir soruyu ölçer — ekip sayısı arttıkça eşgüdüm bedeli ne kadar büyür. Through-line bölgesel kütüphane ağıdır ve kurgudur; ağın yirmi dört modülü ve yirmi dört kişilik geliştirme kadrosu sabit tutulur, değişen yalnız ekip sınırlarıdır.
Aynı İşin Farklı Bölünmeleri
Aşağıdaki blok bir modeldir, ölçüm değil.
SM19 — yirmi dört modül ve yirmi dört kişi sabittir; E ekip yalnızca sınırları değiştirir.
Modüller bitişik bloklara bölünür ve her ekipte 24 / E kişi bulunur. Karşılaştırmanın anlamlı
olması için kadro büyümez: ölçülen şey işgücü değil, sınırın kendisidir.
SM20 — kırk iş kalemi bir üreteçle türetilir, üreteç kendi yazılır ve tohum görünürdür. Her kalem bir ile dört modüle dokunur; ilkinden sonraki her dokunuş bir bağımlılık türü taşır — ortak veri, ortak uç, ortak altyapı ya da sıralı teslim.
SM21 — bir kalem t ekibe yayılıyorsa t - 1 eşgüdüm turu gerekir ve her tur iki ekibe 2
adam-güne mal olur. Ayrıca kalemin dokunduğu her ekip çifti arasında sürekli bir kanal açılır.
SM22 — eşgüdüm katmanı bir dönemde en çok altı tur işler; sırasını bekleyen kalem gecikir. İşin kendisi eşgüdümden bağımsız olarak sekiz dönem sürer, eşgüdüm birikirse dönem sayısı uzar.
SM23 — ortak planlama turunda her ekip sunar ve herkes dinler. Maliyeti dönem sayısı, kişi sayısı ve ekip sayısının çarpımıyla büyür.
SM24 — ekip içi eşgüdüm kişi çiftine göre büyür: E ekipli bir düzende toplam iç çift sayısı
E · s(s-1)/2, burada s = 24 / E. Bu, ekip sayısı arttıkça azalan tek kalemdir.
// olcek.mjs — ayni is yukunun farkli ekip sayilarina bolunmesi (model) import { writeFileSync } from "node:fs"; const MODUL = 24, INSAN = 24; // modul ve kisi sayisi sabit; degisen yalnizca ekip sinirlari const TUR_BEDEL = 2; // bir esgudum turunun iki ekibe maliyeti (adam-gun) const IC_BEDEL = 0.2; // ekip ici kisi cifti basina donem maliyeti (adam-gun) const PLAN_BEDEL = 0.1; // ortak planlama turunda kisi ve ekip basina (adam-gun) const TEMEL_DONEM = 8; // isin kendisi, esgudumden bagimsiz, bu kadar donem surer const DONEM_TUR = 6; // esgudum katmaninin bir donemde isleyebildigi tur sayisi // SM20: uretec kendi yazilir, tohum gorunur; ayni kalem kumesi butun ekip sayilarinda kullanilir. let tohum = 20251103; const rast = () => (tohum = (tohum * 1103515245 + 12345) % 2147483648) / 2147483648; const TIP = ["ortak veri", "ortak uc", "ortak altyapi", "sirali teslim"]; const KALEM = [...Array(40)].map((no) => { const kac = 1 + Math.floor(rast() * 4); const modul = [], tip = []; while (modul.length < kac) { const m = Math.floor(rast() * MODUL); if (!modul.includes(m)) { modul.push(m); if (modul.length > 1) tip.push(TIP[Math.floor(rast() * 4)]); } } return { no, modul, tip }; }); // SM19: E ekip, modulleri bitisik bloklara boler; her ekipte INSAN / E kisi bulunur. const ekipOf = (E) => (m) => Math.min(E - 1, Math.floor((m * E) / MODUL)); function kostur(E, atla = null) { const ekip = ekipOf(E); let tur = 0, bagimli = 0, yayilan = 0; const cift = new Set(); const dizi = []; // esgudum katmanina giren turlar, kalem sirali for (const k of KALEM) { const goz = k.modul.filter((_, i) => i === 0 || k.tip[i - 1] !== atla); // atlanan tip dusurulur const t = [...new Set(goz.map(ekip))]; if (t.length <= 1) continue; bagimli += 1; yayilan += t.length; tur += t.length - 1; for (let i = 0; i < t.length; i++) for (let j = i + 1; j < t.length; j++) cift.add(`${Math.min(t[i], t[j])}-${Math.max(t[i], t[j])}`); dizi.push({ no: k.no, tur: t.length - 1 }); } // SM22: esgudum katmani donem basina DONEM_TUR tur isler; sirasini bekleyen kalem gecikir. let biriken = 0, gecikmeToplam = 0; for (const d of dizi) { biriken += d.tur; gecikmeToplam += Math.ceil(biriken / DONEM_TUR); } const donem = Math.max(TEMEL_DONEM, Math.ceil(tur / DONEM_TUR)); const kisi = INSAN / E; return { E, kisi, bagimli, tur, cift: cift.size, donem, gecikme: dizi.length ? gecikmeToplam / dizi.length : 0, yayilma: bagimli ? yayilan / bagimli : 1, disBedel: tur * TUR_BEDEL, planBedel: +(donem * INSAN * E * PLAN_BEDEL).toFixed(1), // her ekip sunar, herkes dinler icBedel: +(E * ((kisi * (kisi - 1)) / 2) * IC_BEDEL * donem).toFixed(1) }; } const EKIP = [1, 2, 3, 4, 6, 8, 12]; const TARAMA = EKIP.map((E) => { const r = kostur(E); return { ...r, toplam: +(r.disBedel + r.planBedel + r.icBedel).toFixed(1) }; }); writeFileSync("olcek.json", JSON.stringify({ TARAMA, TIP, atlamali: TIP.map((t) => ({ tip: t, satir: EKIP.map((E) => kostur(E, t).tur) })) })); console.log(`modul: ${MODUL}, kisi: ${INSAN}, is kalemi: ${KALEM.length}, ` + `bagimlilik bagi: ${KALEM.reduce((a, k) => a + k.tip.length, 0)} (tohum ${20251103})`); console.log(`tip dagilimi: ${TIP.map((t) => `${t} ${KALEM.reduce((a, k) => a + k.tip.filter((x) => x === t).length, 0)}`).join(", ")}`); const dort = TARAMA[3]; console.log(`\ndort ekip, ayrintili: ekip basina ${dort.kisi} kisi, ${MODUL / 4} modul`); console.log(` ${dort.bagimli}/${KALEM.length} kalem birden cok ekibe yayiliyor, ` + `yayilan kalem ortalama ${dort.yayilma.toFixed(2)} ekip`); console.log(` esgudum turu ${dort.tur}, ortak kanal gereken ekip cifti ${dort.cift}/${(4 * 3) / 2}, ` + `${dort.donem} donem`); console.log(` bedel: dis esgudum ${dort.disBedel}, ortak planlama ${dort.planBedel}, ` + `ekip ici ${dort.icBedel} adam-gun`);
modul: 24, kisi: 24, is kalemi: 40, bagimlilik bagi: 69 (tohum 20251103) tip dagilimi: ortak veri 18, ortak uc 13, ortak altyapi 21, sirali teslim 17 dort ekip, ayrintili: ekip basina 6 kisi, 6 modul 31/40 kalem birden cok ekibe yayiliyor, yayilan kalem ortalama 2.61 ekip esgudum turu 50, ortak kanal gereken ekip cifti 6/6, 9 donem bedel: dis esgudum 100, ortak planlama 86.4, ekip ici 108 adam-gun
Dört ekipli düzende kırk kalemin otuz biri birden çok ekibe yayılır ve yayılan kalem ortalama 2,61 ekibe dokunur. Altı olası ekip çiftinin altısı da en az bir kalem yüzünden birbirine bağlı hâle gelir: dört ekibin hiçbiri diğerinden yalıtılmış değildir.
Ekip Sayısının Taranması
// esgudum.mjs — olcek.mjs'in yazdigi tarama sonucunu okur; ekip sayisi bastan sona taranir import { readFileSync } from "node:fs"; const { TARAMA, TIP, atlamali } = JSON.parse(readFileSync("olcek.json", "utf8")); const tablo = (baslik, satir, ust) => { const yaz = (h) => console.log(h.map((c, i) => String(c).padStart(baslik[i][1])).join("")); if (ust) { console.log(); console.log(ust); } yaz(baslik.map((b) => b[0])); satir.forEach(yaz); }; tablo([["ekip", 6], ["ekipte kisi", 13], ["bagimli kalem", 15], ["yayilma", 9], ["esgudum turu", 14], ["ekip cifti", 12], ["kalem basina gecikme", 22]], TARAMA.map((r) => [r.E, r.kisi, `${r.bagimli}/40`, r.yayilma.toFixed(2), r.tur, r.cift, r.gecikme.toFixed(1)])); // SM24: buyume duzeni iki oranla okunur; hangisi sabit kaliyorsa buyume o duzendedir. tablo([["ekip", 6], ["esgudum turu", 14], ["tur / ekip", 12], ["ekip cifti", 12], ["cift / (E(E-1)/2)", 19]], TARAMA.filter((r) => r.E > 1).map((r) => [r.E, r.tur, (r.tur / r.E).toFixed(1), r.cift, (r.cift / ((r.E * (r.E - 1)) / 2)).toFixed(2)]), "buyume duzeni:"); tablo([["ekip", 6], ["donem", 8], ["dis esgudum", 13], ["ortak planlama", 16], ["ekip ici", 10], ["toplam", 9]], TARAMA.map((r) => [r.E, r.donem, r.disBedel, r.planBedel, r.icBedel, r.toplam]), "esgudum bedeli (adam-gun):"); const enAz = TARAMA.reduce((a, b) => (b.toplam < a.toplam ? b : a)); console.log(`\nen az esgudum bedeli ${enAz.E} ekipte (${enAz.toplam} adam-gun); ` + `tek ekipte ${TARAMA[0].toplam}, on iki ekipte ${TARAMA[TARAMA.length - 1].toplam} adam-gun`); tablo([["bagimlilik turu", 17], ...TARAMA.map((r) => [`${r.E} ekip`, 9])], atlamali.map((a) => [a.tip, ...a.satir.map((t, i) => t - TARAMA[i].tur)]), "bir bagimlilik turu kaldirilirsa esgudum turundaki degisim:"); const dort = atlamali.map((a) => ({ tip: a.tip, kazanc: TARAMA[3].tur - a.satir[3] })) .sort((a, b) => b.kazanc - a.kazanc); console.log(`\ndort ekipte en cok tur kazandiran: ${dort.map((d) => `${d.tip} (${d.kazanc})`).join(", ")}`);
ekip ekipte kisi bagimli kalem yayilma esgudum turu ekip cifti kalem basina gecikme
1 24 0/40 1.00 0 0 0.0
2 12 27/40 2.00 27 1 2.8
3 8 30/40 2.37 41 3 3.8
4 6 31/40 2.61 50 6 4.6
6 4 32/40 2.69 54 15 4.8
8 3 33/40 2.76 58 27 5.2
12 2 34/40 2.94 66 55 5.9
buyume duzeni:
ekip esgudum turu tur / ekip ekip cifti cift / (E(E-1)/2)
2 27 13.5 1 1.00
3 41 13.7 3 1.00
4 50 12.5 6 1.00
6 54 9.0 15 1.00
8 58 7.3 27 0.96
12 66 5.5 55 0.83
esgudum bedeli (adam-gun):
ekip donem dis esgudum ortak planlama ekip ici toplam
1 8 0 19.2 441.6 460.8
2 8 54 38.4 211.2 303.6
3 8 82 57.6 134.4 274
4 9 100 86.4 108 294.4
6 9 108 129.6 64.8 302.4
8 10 116 192 48 356
12 11 132 316.8 26.4 475.2
en az esgudum bedeli 3 ekipte (274 adam-gun); tek ekipte 460.8, on iki ekipte 475.2 adam-gun
bir bagimlilik turu kaldirilirsa esgudum turundaki degisim:
bagimlilik turu 1 ekip 2 ekip 3 ekip 4 ekip 6 ekip 8 ekip 12 ekip
ortak veri 0 -6 -10 -12 -15 -14 -18
ortak uc 0 -4 -5 -8 -8 -11 -13
ortak altyapi 0 -4 -9 -11 -11 -17 -18
sirali teslim 0 -7 -11 -14 -15 -14 -17
dort ekipte en cok tur kazandiran: sirali teslim (14), ortak veri (12), ortak altyapi (11), ortak uc (8)
Doğrusal Değil, İki Ayrı Düzen
Sorunun cevabı tek bir büyüme düzeni değil, iki ayrı düzendir ve ikisi ters yönde okunur.
Eşgüdüm turu doğrusalın altında kalır. Tur sayısı 27’den 66’ya çıkarken ekip sayısı altı katına
çıkar; tur / ekip oranı 13,5’ten 5,5’e düşer. Sebebi tavandır: bir kalem en çok dört modüle
dokunduğu için en çok dört ekibe yayılabilir ve turu üçü geçemez. Ekip sayısı arttıkça yeni bağımlı
kalem bulunmaz, var olanlar biraz daha yayılır — yayılma 2,00’den 2,94’e çıkar ve orada durur.
Ortak kanal sayısı ise tam olarak karesel büyür. cift / (E(E-1)/2) oranı iki, üç, dört ve altı
ekipte tam 1,00’dir: olası her ekip çifti en az bir kalem yüzünden birbirine bağlanır. Doyma
ancak sekiz ve on iki ekipte başlar (0,96 ve 0,83) ve orada bile çift sayısı 27 ile 55’tir. Eşgüdüm
turunun sayısı ölçülüdür, ama o turların dağıldığı kanal sayısı ölçülü değildir.
Bedel tablosu bu iki düzenin toplamını gösterir. Tek ekipte dış eşgüdüm sıfırdır ama yirmi dört kişinin iç eşgüdümü 441,6 adam-gün tutar. On iki ekipte iç eşgüdüm 26,4 adam-güne iner ama ortak planlama turu 316,8 adam-güne çıkar — her ekip sunduğu ve herkes dinlediği için bu kalem doğrudan ekip sayısıyla büyür. Toplam üç ekipte en azdır (274 adam-gün) ve iki uçta neredeyse eşittir: 460,8 ile 475,2. Aynı iş, aynı yirmi dört kişi, iki farklı yoldan iki kat pahalıya mal olur.
Eşgüdüm katmanının kendi gecikmesi ayrı bir sütundur: bağımlı kalem başına 2,8 dönemden 5,9 döneme çıkar. Bu süre boyunca kalem üzerinde kimse çalışmaz.
Hangi Bağımlılığı Kaldırmak Ne Kazandırır
Son tablo turların nereden geldiğini ayırır. Dört ekipli düzende sıralı teslim bağımlılığını kaldırmak elli turdan on dördünü siler, ortak veri on ikisini, ortak altyapı on birini, ortak uç sekizini. Sıra ekip sayısıyla değişir: on iki ekipte ortak veri ile ortak altyapı öne geçer (on sekizer tur), sıralı teslim on yedide kalır.
Okunacak şey sıralama değil, ölçüdür. Dört ekipte tek bir bağımlılık türünü ortadan kaldırmak turların %16 ile %28 arasında bir bölümünü siler; dördünü birden kaldırmak gerekmez, ama hiçbiri tek başına sorunu çözmez de. Ekip sınırını değiştirmeden yapılabilecek en ucuz iyileştirme, en çok tur üreten bağımlılık türünü mimariden kaldırmaktır.
Özet
- Aynı 24 modül ve 24 kişi bir ile on iki ekibe bölündü; kadro sabit tutulduğu için ölçülen tek şey sınırın kendisidir.
- Eşgüdüm turu doğrusalın altında büyür (27’den 66’ya,
tur / ekip13,5’ten 5,5’e düşer), çünkü bir kalem en çok dört modüle dokunur ve yayılması 2,94’te durur. - Ortak kanal sayısı karesel büyür: iki ile altı ekip arasında olası her ekip çifti bağlanır
(
cift / (E(E-1)/2)tam 1,00), on ikide çift sayısı 55’tir. - Toplam eşgüdüm bedeli üç ekipte en azdır (274 adam-gün) ve iki uçta neredeyse eşittir — tek ekipte 441,6 adam-gün iç eşgüdüm, on iki ekipte 316,8 adam-gün ortak planlama.
- Dört ekipte tek bir bağımlılık türünü kaldırmak elli turun 8 ile 14’ünü siler; sıralı teslim en çok, ortak uç en az kazandırır, sıra ekip sayısıyla değişir.
Sonraki Adım
Bu dersin bütün sayıları bir kabulün üstünde duruyor: kusur bulunduğunda geri dönülür. Kaç turun geri dönüldüğü sayıldı, ama kusurun ne zaman bulunduğu hep aynı yerde varsayıldı — işin sonunda. Sonraki ders bu varsayımı kaldırır ve konuyu kapatır: kusurun doğduğu adım ile bulunduğu adım arasındaki mesafe, yani hata bulma gecikmesi, doğrudan ölçülür. Tümleştirme sıklığı günde bir kezden haftada bir keze taranır, eşli çalışma oranı sıfırdan bire taranır ve her ayarda bu gecikme kaç adım ile kaç saattir, yeniden iş ne kadar değişir, toplam iş gücü ne olur sayılır. Eşli çalışmanın iki kişilik maliyeti hesaba katılır — bir işin iki kişiyle yapılması, bulunan hatayı ucuzlatsa bile, iş gücünü iki katına çıkarır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.