İçeriğe geç
academia.sh

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=3 ile dalga=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ız dalga=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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat