Ders 11 / 12
Göç Stratejileri
Platform geçişinin dalgalara bölünmesi: beş kurgu ekip tek dalgada taşındığında program 65 günden 15 güne inerken taşınan sayısının 4'ten 2'ye düşmesi, geride kalanın üç nedeninin (uyumsuz gereksinim, kritik dönem, sahipsiz servis) sırayla devreye girmesi, çift işletim yükünün 105,3'ten 0'a inmesine karşılık tepe destek yükünün yalnız tek ekiplik dalgada 6 birimlik bütçenin altında kalması ve hiç taşınmayan tek ekip yüzünden eski düzenin süresiz açık kalarak 1.095 günde 41.610 kurgu birim tutması.
İçindekiler
Önceki ders faturayı beş ekibe böldü ve bölünemeyen kalemi saydı. O tablonun sessiz varsayımı şuydu: beş ekip de zaten platformun üstünde. Gerçekte hiçbiri orada doğmadı — hepsi bir yerden taşındı ya da hâlâ taşınmadı. Bu dersin ölçtüğü şey o taşımanın kendisidir.
Aşamalı geçiş kalıbının kendisi — eski düzenin çevresine sarılıp parça parça yerini alan boğucu incir — M16/K06 ve M20/K03’te ölçüldü; burada tekrarlanmaz. Buradaki soru kalıbın değil, takvimin sorusudur: beş ekip kaçarlı gruplar hâlinde taşınırsa ne olur.
Programı Dalgalara Bölmek
Örnek yine kurgu bölgesel ölçüm ağıdır ve beş ekip kurgudur. Yükler, engeller ve bedeller
kurgudur; para birimi de kurgudur ve br diye anılır.
PT31: her ekibin bir taşıma yükü vardır, destek-birimi cinsinden. PT32: program
ceil(5 / dalga) dalga olarak planlanır; her dalga 5 gün hazırlık ve 8 gün kesim-doğrulama
sürer. Dalgasını kaçıran ekip bir sonrakine kalır, son dalgayı da kaçırırsa geride kalır.
PT33: platform ekibinin günlük destek bütçesi 6 birimdir; bir dalganın yükü sekiz günlük
bütçeyi aşarsa aşan kısım dalgayı uzatır. PT34: üç engel vardır — kritik dönem (0–30.
günler arasında taşınamaz), uyumsuz gereksinim (hiç taşınamaz; uyumsuzluk doğrulama
sırasında ortaya çıkar ve yükün %40’ı boşa gider), sahipsiz servis (yük 1,6 katına çıkar ve
ekip yalnız dalgada boşluk varsa taşınır). PT35: taşınmış her ekip son kesime kadar günlük
0,9 birim çift işletim yükü üretir. PT36: eski düzenin sabit günlük işletim bedeli ve
eksik yeteneği platforma eklemenin tek seferlik bedeli yazılıdır.
Plan ve takvim süreç içi bir modeldir; gerçek bir geçiş yoktur ve rastgelelik yoktur.
// goc/dalga.mjs — goc dalgasi modeli: gercek bir gecis yok. Bes ekip, engelleri ve platform // ekibinin destek butcesi bir veri yapisidir. Rastgelelik yoktur, plan tumuyle belirlenimlidir. // Program `ceil(N/w)` dalga olarak planlanir; dalgasini kaciran ekip bir sonrakine kalir, // son dalgayi da kacirirsa geride kalir. Para birimi kurgudur ve `br` diye anilir. export const HAZIRLIK = 5; // her dalganin sabit hazirlik suresi (gun) export const TABAN = 8; // her dalganin kesim ve dogrulama suresi (gun) export const KAPASITE = 6; // platform ekibinin gunluk destek butcesi (destek-birimi) export const CIFT = 0.9; // tasinmis ekip basina gunluk cift isletim yuku export const BOSA = 0.4; // basarisiz denemede harcanan yuk orani export const ADIM = 14; // ekip kendi tasisa yeniden yazacagi altyapi adimi export const KALAN_ADIM = 4; // platform devraldiktan sonra ekibe kalan adim export const ESKI_SABIT = 38; // eski duzenin gunluk sabit isletim bedeli (br) export const YETENEK = 2400; // eksik yetenegi platforma eklemenin tek seferlik bedeli (br) // ekip: ad, tasima yuku (destek-birimi), engel, kritik donem penceresi (gun araligi) export const EKIP = [ { ad: "sayac-okuma", yuk: 18, engel: null, pencere: null }, { ad: "dogrulama", yuk: 14, engel: null, pencere: null }, { ad: "faturalama", yuk: 22, engel: "kritik donem", pencere: [0, 30] }, { ad: "saha", yuk: 26, engel: "uyumsuz gereksinim", pencere: null }, { ad: "raporlama", yuk: 16, engel: "sahipsiz servis", pencere: null }, ]; export const N = EKIP.length; export const etkinYuk = (e) => (e.engel === "sahipsiz servis" ? e.yuk * 1.6 : e.yuk); const cakisir = (p, a, b) => p !== null && !(b < p[0] || a > p[1]); export function planla(w) { const sayi = Math.ceil(N / w), dalgalar = [], tasinan = [], geride = []; let t = 0, kalan = EKIP.map((_, i) => i), bosa = 0; for (let d = 0; d < sayi && kalan.length; d++) { const bas = t + HAZIRLIK, son = bas + TABAN - 1, secilen = []; let yuk = 0; for (const i of kalan) { if (secilen.length >= w) break; const e = EKIP[i], ey = etkinYuk(e); if (cakisir(e.pencere, bas, son)) continue; // kritik donem: sonraki dalgaya kalir if (e.engel === "sahipsiz servis" && yuk + ey > KAPASITE * TABAN) continue; // slack yok secilen.push(i); yuk += ey; } if (!secilen.length) { t += HAZIRLIK + TABAN; continue; } const gecikme = Math.max(0, Math.ceil((yuk - KAPASITE * TABAN) / KAPASITE)); const sure = HAZIRLIK + TABAN + gecikme, kesim = t + sure - 1; for (const i of secilen) { if (EKIP[i].engel === "uyumsuz gereksinim") { // uyumsuzluk dogrulamada ortaya cikar geride.push([i, "uyumsuz gereksinim"]); bosa += EKIP[i].yuk * BOSA; } else tasinan.push([i, kesim]); } dalgalar.push({ bas, son, sure, yuk, secilen }); kalan = kalan.filter((i) => !secilen.includes(i)); t += sure; } for (const i of kalan) geride.push([i, EKIP[i].engel ?? "dalga kalmadi"]); const kesimler = tasinan.map((x) => x[1]); const ilk = kesimler.length ? Math.min(...kesimler) : 0; const bitis = kesimler.length ? Math.max(...kesimler) : 0; const gun = new Array(t + 1).fill(0); for (const x of dalgalar) for (let g = x.bas; g <= x.son; g++) gun[g] += x.yuk / TABAN; for (const [, k] of tasinan) for (let g = k + 1; g <= bitis; g++) gun[g] += CIFT; return { w, dalga: dalgalar.length, program: t, tasinan, geride, bosa, birlikte: bitis - ilk, tepe: Math.max(...gun), cift: tasinan.reduce((a, [, k]) => a + CIFT * (bitis - k), 0), adim: tasinan.length * (ADIM - KALAN_ADIM) }; }
// goc/olc.mjs — dalga buyuklugu taramasi, geride kalanin nedeni ve hic tasinmayanin bedeli. import { EKIP, N, KAPASITE, ESKI_SABIT, YETENEK, ADIM, KALAN_ADIM, planla } from "./dalga.mjs"; const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); const t0 = process.hrtime.bigint(); const W = [1, 2, 3, 5], AYAR = W.map(planla); console.log(`${N} ekip, platform destek butcesi ${KAPASITE} birim/gun`); console.log("\n1. dalga buyuklugu taramasi"); const A = [-7, 8, 10, 10, 9, 15, 10, 10]; yaz(A, "dalga", "sayisi", "program", "tasinan", "geride", "kesim araligi", "tepe yuk", "cift yuk"); for (const r of AYAR) yaz(A, r.w, r.dalga, `${r.program} gun`, `${r.tasinan.length}/${N}`, r.geride.length, `${r.birlikte} gun`, r.tepe.toFixed(2), r.cift.toFixed(1)); console.log(` destek butcesini asan ayar: ` + AYAR.filter((r) => r.tepe > KAPASITE).map((r) => `dalga=${r.w}`).join(", ")); console.log(" kesim araligi: ilk kesimden son kesime — iki duzenin birlikte isletildigi"); console.log(" surenin dalga buyuklugune bagli bolumu; eski duzen hicbir ayarda kapanmaz"); console.log("\n2. geride kalan kim, nedeni ne"); const B = [-16, -20, ...W.map(() => 9)]; yaz(B, "ekip", "neden", ...W.map((w) => `dalga=${w}`)); for (let i = 0; i < N; i++) { const satir = AYAR.map((r) => r.geride.find((x) => x[0] === i)); if (!satir.some(Boolean)) continue; yaz(B, EKIP[i].ad, satir.find(Boolean)[1], ...satir.map((g) => (g ? "geride" : "tasindi"))); } yaz(B, "kurtarilan adim", `${ADIM} yerine ${KALAN_ADIM}`, ...AYAR.map((r) => r.adim)); console.log(` uyumsuzluk dogrulamada ortaya cikar: bosa giden destek ` + `${AYAR[0].bosa.toFixed(1)} birim (her ayarda ayni)`); console.log("\n3. hic tasinmayanin uzun vadeli bedeli (kurgu para birimi)"); const kalanEkip = AYAR[0].geride.length, oncePay = ESKI_SABIT / N; const sonraPay = ESKI_SABIT / kalanEkip, basabas = Math.ceil(YETENEK / ESKI_SABIT); const C = [-24, 12, 12, 13]; yaz(C, "kalem", "gunluk br", "365 gun", "1095 gun"); yaz(C, "eski duzenin isletimi", ESKI_SABIT, ESKI_SABIT * 365, ESKI_SABIT * 1095); yaz(C, "eksik yetenegi eklemek", "-", YETENEK, YETENEK); yaz(C, "fark", "-", ESKI_SABIT * 365 - YETENEK, ESKI_SABIT * 1095 - YETENEK); console.log(` basa bas ${basabas}. gun; eski duzen ${kalanEkip} ekip icin acik kalir`); console.log(` ekip basina eski duzen bedeli ${oncePay.toFixed(1)} -> ${sonraPay.toFixed(1)} ` + `br/gun (${(sonraPay / oncePay).toFixed(1)} kat)`); const ms = Number(process.hrtime.bigint() - t0) / 1e6; // ham olcum basilmaz, bant denetlenir console.log(`\nuc tablo ve dalga taramasi 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
5 ekip, platform destek butcesi 6 birim/gun 1. dalga buyuklugu taramasi dalga sayisi program tasinan geride kesim araligi tepe yuk cift yuk 1 5 65 gun 4/5 1 52 gun 5.95 105.3 2 3 39 gun 4/5 1 26 gun 7.75 46.8 3 2 28 gun 3/5 2 13 gun 7.25 23.4 5 1 15 gun 2/5 3 0 gun 7.25 0.0 destek butcesini asan ayar: dalga=2, dalga=3, dalga=5 kesim araligi: ilk kesimden son kesime — iki duzenin birlikte isletildigi surenin dalga buyuklugune bagli bolumu; eski duzen hicbir ayarda kapanmaz 2. geride kalan kim, nedeni ne ekip neden dalga=1 dalga=2 dalga=3 dalga=5 faturalama kritik donem tasindi tasindi geride geride saha uyumsuz gereksinim geride geride geride geride raporlama sahipsiz servis tasindi tasindi tasindi geride kurtarilan adim 14 yerine 4 40 40 30 20 uyumsuzluk dogrulamada ortaya cikar: bosa giden destek 10.4 birim (her ayarda ayni) 3. hic tasinmayanin uzun vadeli bedeli (kurgu para birimi) kalem gunluk br 365 gun 1095 gun eski duzenin isletimi 38 13870 41610 eksik yetenegi eklemek - 2400 2400 fark - 11470 39210 basa bas 64. gun; eski duzen 1 ekip icin acik kalir ekip basina eski duzen bedeli 7.6 -> 38.0 br/gun (5.0 kat) uc tablo ve dalga taramasi 2000 ms bandinda: evet
Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır.
Dalga Büyüdükçe Takvim Kısalıyor, Kapsam Daralıyor
Birinci tablo dört ayarı yan yana koyar ve iki sütun ters yönde ilerler. Program süresi tek ekiplik dalgada 65 gün, beş ekiplik tek dalgada 15 gündür — dört kattan fazla. Aynı yönde kesim aralığı 52 günden 0 güne, çift işletim yükü 105,3 birimden 0’a iner. Büyük dalga takvimi kısaltır ve bunda gizli bir şey yoktur.
Ters yönde ilerleyen sütun taşınan ekip sayısıdır: 4/5’ten 2/5’e düşer. Beş ekiplik dalga programı dört kattan fazla kısaltırken kapsamı yarıya indirir. On beş günde biten bir geçiş, geçişin kendisinin yarısını hiç yapmamış olmakla ölçülür.
Üçüncü bir sütun ikisinden de bağımsız davranır. Tepe destek yükü tek ekiplik dalgada 5,95
birim, diğer üç ayarda 7,25 ile 7,75 arasındadır; platform ekibinin günlük bütçesi 6 birimdir.
Yalnız dalga=1 bütçenin içinde kalır. Büyük dalga aynı işi daha kısa bir pencereye sıkıştırır
ve sıkıştırılan iş bir yerde taşar: dalga=3 ve dalga=5 ayarlarında ilk dalganın yükü sekiz
günlük bütçeyi aşar ve dalgayı iki gün uzatır.
Bu tablonun okunmayan bir yeri var: kesim aralığı sıfır olan ayar iki düzenin birlikte işletilmediği anlamına gelmez. Sıfır, taşınan iki ekibin aynı gün kesime girdiği anlamına gelir. Eski düzen dört ayarın hiçbirinde kapanmaz ve nedeni ikinci tablodadır.
Geride Kalanın Adı Var
İkinci tablo geride kalanı isimle ve nedenle yazar. Üç neden üç ayrı ayarda devreye girer.
Uyumsuz gereksinim her ayarda geride bırakır. Saha ekibinin uç düğümleri çevrimdışı çalışırken de veri toplar; platform sürekli bağlantı varsayar. Dalga büyüklüğü bu engeli hiç etkilemez, çünkü engel takvimde değil yetenektedir. Uyumsuzluk kesim doğrulaması sırasında ortaya çıktığı için ekibin yükünün %40’ı, 10,4 birim destek, her ayarda boşa gider.
Kritik dönem dalga=3 ve dalga=5’te devreye girer. Faturalama ekibi 0–30. günler
arasında taşınamaz; iki ya da bir dalgalık programda o pencerenin dışına düşen bir dalga
kalmaz. Beş dalgalık programda üçüncü dalga 31. günde başlar ve ekip taşınır. Takvim
esnekliği bir kapasitedir ve yalnız dalga sayısı çoğaldıkça vardır.
Sahipsiz servis yalnız dalga=5’te devreye girer. Raporlama ekibinin iki servisinin sahibi
yoktur; işi platform ekibi yapar ve yük 1,6 katına, 25,6 birime çıkar. Tek dalgalık programda
diğer üç ekip sekiz günlük bütçeyi zaten doldurduğu için bu yüke yer kalmaz.
Son satır platformun ne kazandırdığını sayar: taşınan ekip kendi göç adımlarının 14’ünden
10’unu platforma bırakır, 4 adım kendinde kalır. Kazanç doğrudan taşınan sayısına bağlıdır —
dalga=1’de 40 adım, dalga=5’te 20. Saha ekibi hiçbir ayarda tek adım kazanmaz.
Soyutlamanın sızdığı yer kesim aralığıdır. O gün sayısı boyunca taşınmış ekipler yeni düzende,
taşınmamışlar eskisinde çalışır ve aradaki her bağlantıyı kuran taraf iki düzenin de ayarını
bilmek zorundadır. Platformun kapattığını iddia ettiği katman tam da geçiş sırasında yeniden
açılır ve dalga=1 ayarında bu 52 gün sürer. En çok ekibi taşıyan ayar, soyutlamanın en uzun
süre sızdığı ayardır.
Hiç Taşınmayanın Faturası
Üçüncü tablo tek bir kalemi sorar: hiç taşınmayan ne kadar tutuyor. Eski düzenin sabit işletim bedeli günlük 38 birimdir ve tek bir ekip orada kaldığı sürece ödenir — 365 günde 13.870, 1.095 günde 41.610 birim. Eksik yeteneği platforma eklemek tek seferlik 2.400 birimdir ve başa baş noktası 64. gündür. Üç yıllık farkın 39.210 birim olması bu kararın bir bütçe kalemi değil, bir eşik olduğunu gösterir.
İkinci sayı daha keskindir. Eski düzen beş ekip tarafından paylaşılırken ekip başına günlük 7,6 birim düşüyordu; dört ekip taşındıktan sonra aynı 38 birimi tek başına saha ekibi taşır — 5 kat. Geçiş, geride kalan için maliyeti azaltmaz, beşe katlar. Platformun kazandırmadığı durum burada tek bir çarpanla görünür: saha ekibi 0 adım kazanmış, 10,4 birim destek harcatmış ve işletim payını beş katına çıkarmıştır.
Buradan iki yol çıkar ve ikisi de tablodadır: yeteneği platforma eklemek (2.400 birim, 64 günde kendini öder) ya da iki düzeni süresiz işletmek. Üçüncü bir yol — “geçiş tamamlandı” demek — sayıların hiçbirine karşılık gelmez.
Özet
- Dalga büyüklüğü 1’den 5’e çıkarken program 65 günden 15 güne, kesim aralığı 52 günden 0’a, çift işletim yükü 105,3 birimden 0’a iner; buna karşılık taşınan ekip sayısı 4/5’ten 2/5’e düşer ve geride kalan 1’den 3’e çıkar.
- Tepe destek yükü yalnız tek ekiplik dalgada (5,95) günlük 6 birimlik bütçenin altında kalır;
diğer üç ayarda 7,25–7,75 arasındadır ve
dalga=3iledalga=5’te ilk dalga iki gün uzar. - Geride kalmanın üç nedeni ayrı ayarlarda devreye girer: uyumsuz gereksinim her ayarda (saha,
10,4 birim boşa giden destek), kritik dönem
dalga≥3’te (faturalama), sahipsiz servis yalnızdalga=5’te (raporlama). - Platformun kazancı taşınan sayısıyla orantılıdır — 14 adımın 10’u devredilir,
dalga=1’de 40 adım,dalga=5’te 20; hiç taşınmayan ekip tek adım kazanmaz. - Hiç taşınmayan tek ekip yüzünden eski düzen süresiz açık kalır: günlük 38 birim, 1.095 günde 41.610 birim. Eksik yeteneği eklemek 2.400 birimdir ve 64. günde kendini öder; geride kalanın işletim payı 7,6’dan 38,0 birime, beş katına çıkar.
Sonraki Adım
Altı ders platformun ne yaptığını saydı: ortam sağladı, iskelet üretti, katalog tuttu, kural gömdü, maliyeti böldü ve ekipleri dalgalar hâlinde taşıdı. Her derste bir de karşı sayı vardı — sızan durum, dışına çıkan ekip, kendini ödemeyen eşik. Sıradaki ders bu iki sütunu tek bir soruya bağlar: platformu benimseyen ekiplerle benimsemeyenler arasındaki fark ölçülebilir mi, ve platformun kendi ölçütleri hangi noktada benimseme sayısını değil, benimsemenin işe yaradığını göstermeye başlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.