Ders 13 / 18
Nöbet Düzeni
Nöbetin kendi bedeli: bir yıllık 136 çağrının 61'inin gece gelmesi, sekiz sorudan beşinin çizelgeden yanıtlanıp üçünün yanıtsız kalması, kişi başına yıllık yükün üç kişilik ekipte 17,3 nöbet haftası ve 118,7 toparlanma saatine çıkması, ortalama bandın sekiz kişide geçilmesine karşılık en yüklü kişinin hiçbir düzende banda girmemesi ve gecelik toplu işin saatini kaydırmanın eşiği sekiz kişiden dört kişiye indirmesi.
İçindekiler
Sinyal üretildi, süzüldü ve doğrulandı. Ölçüt toplandı, günlük ayrıştırıldı, gösterge tablosu kuruldu, uyarı kuralı bir eşiğe bağlandı. Zincirin sonunda duran bir gösterge değil, saat 02.40’ta telefonu çalan bir insandır.
Nöbet düzeni, hangi çağrının hangi anda kime gideceğini önceden belirleyen çizelgedir. M20/K05
İşletim Devri dersi tam devir ile paylaşımlı nöbeti karşılaştırıp devrin bedelini saydı;
burada nöbet biçimi verilidir, ölçülen nöbetin kendi bedelidir: kişi başına yıllık nöbet
haftası, gece uyandırma ve toparlanma penceresi.
Çizelge, Kapsama ve Soru Kümesi
Örnek, kursun kurgu bölgesel ölçüm ağıdır: su sayacı okuma toplayıcı, doğrulayıcı, faturalama ve iş emri servisleri. Ağ da nöbet de kurgudur; gerçek bir çizelge ya da çağrı kaydı yoktur.
OY1: Dört servis tek ekibin nöbetindedir; gecelik toplu iş 02.00’de başlar, iki saat sürer.
OY2: Yıl 52 haftadır; nöbet sırayla devreder, vardiya 1 ya da 2 hafta tutar, ekip sekiz kişilik
havuzun ilk n kişisidir. OY3: 00.00–06.00 arasında gelen çağrı uykudan kaldırır, gündüz gelen
kaldırmaz. OY4: Gece uyandırmasının toparlanma penceresi 4 saattir; aynı vardiyada her ek
uyandırma pencereyi 2 saat büyütür, vardiya devrinde birikim sıfırlanır. OY5: Nöbetçi çağrının
servisine dokunamıyorsa sırada onu kapsayan ilk kişi yedek olarak uyandırılır (4 saatlik
pencere) ve ilk adım 10 yerine 35 dakikada başlar. OY6: Bant, kişi başına yılda en çok 13 nöbet
haftası, 12 gece uyandırma ve 60 toparlanma saatidir.
// nobet/duzen.mjs — kurgu bolgesel olcum aginin nobet duzeni modeli (model): gercek bir nobet // cizelgesi, cagri kaydi ya da kisi yok; yil bir tur dizisidir. Rastgelelik kendi uretecimizden. export const HAFTA = 52, GUN = 7, SAAT = 24, YIL = HAFTA * GUN; export const SERVIS = ["okuma-toplayici", "dogrulayici", "faturalama", "is-emri"]; export const GECE_SON = 6, TOPLU_IS = 2; // 00-06 arasi cagri uyandirir; toplu is 02'de baslar export const TOPARLANMA = 4, BIRIKIM = 2; // ilk uyandirma 4 saat, ayni vardiyada her ek +2 saat export const YEDEK_PENCERE = 4; // yedek de uyandirilir: kendi 4 saatlik penceresi export const ILK_ADIM = 10, YEDEK_ADIM = 35; // ilk adima baslama gecikmesi (dakika) export const ESIK = { nobet: 13, gece: 12, toparlanma: 60 }; // kisi basina yillik bantlar // gunluk cagri olasiligi ve cagrinin gecelik toplu is penceresine dusme payi export const ORAN = { "okuma-toplayici": 0.16, dogrulayici: 0.09, faturalama: 0.06, "is-emri": 0.05 }; export const TOPLU = { "okuma-toplayici": 0.40, dogrulayici: 0.35, faturalama: 0.30, "is-emri": 0.10 }; // Kapsama: havuzun sekiz kisisi ve dokunabildigi servisler. Ilk uc kisi dort servisi de kapsar. export const KAPSAM = ` k1 okuma-toplayici dogrulayici faturalama k2 dogrulayici is-emri k3 okuma-toplayici faturalama is-emri k4 okuma-toplayici dogrulayici k5 faturalama is-emri k6 okuma-toplayici is-emri k7 dogrulayici faturalama k8 okuma-toplayici dogrulayici faturalama is-emri` .trim().split("\n").map((r) => { const [ad, ...s] = r.trim().split(/\s+/); return { ad, s }; }); // kaydirmali uretec; tohum gorunur, dizi kosumdan kosuma ayni export function uretec(tohum) { let x = tohum >>> 0 || 1; return () => { x ^= x << 13; x >>>= 0; x ^= x >>> 17; x ^= x << 5; x >>>= 0; return x / 4294967296; }; } // topluSaat: ayni tohumda cagri kumesi aynidir, yalnizca toplu ise bagli cagrilarin saati kayar. export function cagrilar(tohum, topluSaat = TOPLU_IS) { const r = uretec(tohum), liste = []; for (let g = 0; g < YIL; g++) for (const s of SERVIS) { if (r() >= ORAN[s]) continue; const toplu = r() < TOPLU[s]; const saat = toplu ? topluSaat + Math.floor(r() * 2) : Math.floor(r() * SAAT); liste.push({ gun: g, saat, servis: s, toplu, gece: saat < GECE_SON }); } return liste; } // duzen: n kisi, vardiya v hafta. "dagitik" karsit kosumda cizelge yoktur, gece cagrisi // ekibin tamamina duser. kos(): kisi basina yillik nobet/uyandirma/toparlanma sayaci. export function kos(cagri, n, v, dagitik = false) { const kisi = KAPSAM.slice(0, n).map((k) => ({ ...k, hafta: 0, uyandi: 0, yedek: 0, toparlanma: 0, vardiya: -1, ardisik: 0 })); let disi = 0, gecikme = 0; for (let h = 0; h < HAFTA; h++) kisi[Math.floor(h / v) % n].hafta++; for (const c of cagri) { const vardiya = Math.floor(c.gun / (GUN * v)); const i = vardiya % n, nobetci = kisi[i]; const yerinde = dagitik ? kisi.some((k) => k.s.includes(c.servis)) : nobetci.s.includes(c.servis); if (!yerinde) disi++; gecikme += yerinde ? ILK_ADIM : YEDEK_ADIM; if (!c.gece) continue; if (dagitik) { // duzen yok: gece cagrisi herkesi kaldirir for (const k of kisi) { k.uyandi++; k.toparlanma += TOPARLANMA; } continue; } if (nobetci.vardiya !== vardiya) { nobetci.vardiya = vardiya; nobetci.ardisik = 0; } nobetci.uyandi++; nobetci.toparlanma += TOPARLANMA + BIRIKIM * nobetci.ardisik++; if (yerinde) continue; for (let d = 1; d < n; d++) { // kapsama disi: yedek de uyandirilir const y = kisi[(i + d) % n]; if (!y.s.includes(c.servis)) continue; y.uyandi++; y.yedek++; y.toparlanma += YEDEK_PENCERE; break; } } const en = (f) => Math.max(...kisi.map(f)); const ort = (f) => kisi.reduce((a, k) => a + f(k), 0) / n; const bant = (h, u, t) => h <= ESIK.nobet && u <= ESIK.gece && t <= ESIK.toparlanma; return { n, v, kisi, disi, hafta: ort((k) => k.hafta), uyandi: ort((k) => k.uyandi), enUyandi: en((k) => k.uyandi), toparlanma: ort((k) => k.toparlanma), enToparlanma: en((k) => k.toparlanma), yedek: kisi.reduce((a, k) => a + k.yedek, 0), gecikme: gecikme / cagri.length, ortBant: bant(ort((k) => k.hafta), ort((k) => k.uyandi), ort((k) => k.toparlanma)), kisiBant: kisi.every((k) => bant(k.hafta, k.uyandi, k.toparlanma)) }; }
// nobet/olc.mjs — nobetin kendi bedeli: ekip buyuklugu ve vardiya uzunlugu taramasi. import { cagrilar, kos, KAPSAM, ESIK, HAFTA, YEDEK_PENCERE } from "./duzen.mjs"; const TOHUM = 20260615; 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 s1 = (x) => x.toFixed(1); const ea = (b) => (b ? "evet" : "hayir"); const C = cagrilar(TOHUM); const gece = C.filter((c) => c.gece); console.log(`tohum ${TOHUM}: ${HAFTA} haftada ${C.length} cagri, ${gece.length} tanesi gece ` + `(${gece.filter((c) => c.toplu).length} tanesi gecelik toplu is penceresinde)`); const S = [-6, -11, 12, 16, 18, 10, 10]; console.log("\n1. nobet duzeni taramasi (kisi basina yillik; ort / en yuklu kisi)"); yaz(S, "kisi", "vardiya", "nobet haf.", "uyandirma", "toparlanma saati", "ort bant", "kisi bant"); const tarama = []; for (const n of [3, 4, 5, 6, 8]) for (const v of [1, 2]) { const R = kos(C, n, v); tarama.push(R); yaz(S, n, `${v} haf.`, s1(R.hafta), `${s1(R.uyandi)} / ${R.enUyandi}`, `${s1(R.toparlanma)} / ${s1(R.enToparlanma)}`, ea(R.ortBant), ea(R.kisiBant)); } const D = kos(C, 5, 1, true); yaz(S, 5, "duzen yok", "-", `${s1(D.uyandi)} / ${D.enUyandi}`, `${s1(D.toparlanma)} / ${s1(D.enToparlanma)}`, ea(D.ortBant), ea(D.kisiBant)); console.log(`bant: nobet <= ${ESIK.nobet} haf., uyandirma <= ${ESIK.gece}, ` + `toparlanma <= ${ESIK.toparlanma} saat`); const Q = [-42, 20, 8]; console.log("\n2. nobet duzeninin yanitladigi soru kumesi"); yaz(Q, "soru", "veri", "yanit"); const SORU = [ ["gece 02.40'ta kim nobetci", "nobet cizelgesi", true], ["nobet ne zaman devrediyor", "nobet cizelgesi", true], ["nobetci bu servise dokunabiliyor mu", "kapsama cizelgesi", true], ["dokunamiyorsa kim, ne zaman cagrilir", "kapsama cizelgesi", true], ["nobetci son otuz gunde kac kez uyandi", "uyandirma kaydi", true], ["cagri hangi adimla kapaniyor", "-", false], ["uyandirmadan sonra kac saat uretken degil", "-", false], ["bu duzen bir yil surdurulur mu", "-", false]]; for (const [q, d, y] of SORU) yaz(Q, q, d, y ? "evet" : "hayir"); console.log(`${SORU.length} sorudan ${SORU.filter((x) => x[2]).length} tanesi cizelgeden ` + `yanitlanir, ${SORU.filter((x) => !x[2]).length} tanesi yanitsiz kalir`); const K = [-6, 14, 18, 20, 13]; console.log("\n3. kapsama disi cagrinin bedeli (vardiya 1 hafta)"); yaz(K, "kisi", "kapsam disi", "yedek uyandirma", "yedegin payi (saat)", "ilk adim dk"); for (const R of tarama.filter((r) => r.v === 1)) yaz(K, R.n, `${R.disi} (%${((R.disi / C.length) * 100).toFixed(0)})`, R.yedek, s1((R.yedek * YEDEK_PENCERE) / R.n), s1(R.gecikme)); const H = [-6, 8, 12, 14, 17]; console.log("\n4. bes kisilik ekipte yuk dagilimi (vardiya 1 haf. / 2 haf.)"); yaz(H, "kisi", "kapsam", "nobet haf.", "uyandirma", "toparlanma saati"); const [A, B] = [kos(C, 5, 1), kos(C, 5, 2)]; for (let i = 0; i < 5; i++) yaz(H, KAPSAM[i].ad, KAPSAM[i].s.length, A.kisi[i].hafta, `${A.kisi[i].uyandi} / ${B.kisi[i].uyandi}`, `${s1(A.kisi[i].toparlanma)} / ${s1(B.kisi[i].toparlanma)}`); const C9 = cagrilar(TOHUM, 9); // ayni cagri kumesi, toplu is 09.00'da const T = [-6, 16, 20, 11, 10]; console.log(`\n5. gecelik toplu is 02.00 yerine 09.00'da kosarsa (vardiya 1 hafta)`); console.log(`gece cagrisi ${gece.length} -> ${C9.filter((c) => c.gece).length}`); yaz(T, "kisi", "uyandirma 02 / 09", "toparlanma 02 / 09", "bant 02", "bant 09"); for (const n of [3, 4, 5, 6, 8]) { const [a, b] = [kos(C, n, 1), kos(C9, n, 1)]; yaz(T, n, `${s1(a.uyandi)} / ${s1(b.uyandi)}`, `${s1(a.toparlanma)} / ${s1(b.toparlanma)}`, ea(a.ortBant), ea(b.ortBant)); }
tohum 20260615: 52 haftada 136 cagri, 61 tanesi gece (41 tanesi gecelik toplu is penceresinde) 1. nobet duzeni taramasi (kisi basina yillik; ort / en yuklu kisi) kisi vardiya nobet haf. uyandirma toparlanma saati ort bant kisi bant 3 1 haf. 17.3 25.7 / 29 118.7 / 138.0 hayir hayir 3 2 haf. 17.3 28.7 / 38 154.7 / 180.0 hayir hayir 4 1 haf. 13.0 19.8 / 25 91.0 / 110.0 hayir hayir 4 2 haf. 13.0 19.3 / 27 107.0 / 146.0 hayir hayir 5 1 haf. 10.4 16.2 / 20 74.4 / 96.0 hayir hayir 5 2 haf. 10.4 16.6 / 22 90.4 / 124.0 hayir hayir 6 1 haf. 8.7 13.3 / 16 61.3 / 82.0 hayir hayir 6 2 haf. 8.7 14.5 / 20 78.0 / 96.0 hayir hayir 8 1 haf. 6.5 10.1 / 14 46.5 / 66.0 evet hayir 8 2 haf. 6.5 11.3 / 16 60.0 / 96.0 evet hayir 5 duzen yok - 61.0 / 61 244.0 / 244.0 hayir hayir bant: nobet <= 13 haf., uyandirma <= 12, toparlanma <= 60 saat 2. nobet duzeninin yanitladigi soru kumesi soru veri yanit gece 02.40'ta kim nobetci nobet cizelgesi evet nobet ne zaman devrediyor nobet cizelgesi evet nobetci bu servise dokunabiliyor mu kapsama cizelgesi evet dokunamiyorsa kim, ne zaman cagrilir kapsama cizelgesi evet nobetci son otuz gunde kac kez uyandi uyandirma kaydi evet cagri hangi adimla kapaniyor - hayir uyandirmadan sonra kac saat uretken degil - hayir bu duzen bir yil surdurulur mu - hayir 8 sorudan 5 tanesi cizelgeden yanitlanir, 3 tanesi yanitsiz kalir 3. kapsama disi cagrinin bedeli (vardiya 1 hafta) kisi kapsam disi yedek uyandirma yedegin payi (saat) ilk adim dk 3 42 (%31) 16 21.3 17.7 4 42 (%31) 18 18.0 17.7 5 50 (%37) 20 16.0 19.2 6 44 (%32) 19 12.7 18.1 8 45 (%33) 20 10.0 18.3 4. bes kisilik ekipte yuk dagilimi (vardiya 1 haf. / 2 haf.) kisi kapsam nobet haf. uyandirma toparlanma saati k1 3 11 20 / 22 96.0 / 124.0 k2 2 11 18 / 14 84.0 / 90.0 k3 3 10 20 / 21 86.0 / 112.0 k4 2 10 14 / 14 66.0 / 68.0 k5 2 10 9 / 12 40.0 / 58.0 5. gecelik toplu is 02.00 yerine 09.00'da kosarsa (vardiya 1 hafta) gece cagrisi 61 -> 20 kisi uyandirma 02 / 09 toparlanma 02 / 09 bant 02 bant 09 3 25.7 / 9.3 118.7 / 38.7 hayir hayir 4 19.8 / 6.5 91.0 / 27.0 hayir evet 5 16.2 / 5.0 74.4 / 20.8 hayir evet 6 13.3 / 4.7 61.3 / 19.3 hayir evet 8 10.1 / 3.0 46.5 / 12.5 evet evet
Sayılar ölçüm sınıfındadır; girdileri OY1–OY6 varsayımlarıdır. Çizelgesiz karşıt koşum birinci tablonun son satırındadır: düzen yokken her gece çağrısı ekibin tamamını kaldırır, kişi başına uyandırma 61’e ve toparlanma 244 saate çıkar. Nöbet düzeninin ilk işi yükü azaltmak değil, tek kişiye yıkmaktır — beş kişide aynı çağrı kümesi kişi başına 16,2 uyandırma yapar.
Ekip Küçüldükçe Ne Oluyor
Nöbet haftası doğrudan ekip büyüklüğünden çıkar: üç kişide 17,3 hafta, yani yılın üçte biri. Uyandırma ve toparlanma bundan hızlı bozulur, çünkü kapsama dışı çağrının yedeği de aynı küçük havuzdan gelir — üç kişide 25,7 uyandırma ve 118,7 saat, sekiz kişide 10,1 ve 46,5.
Vardiya uzunluğu toplamı değiştirmez ama birikimi değiştirir. İki haftalık vardiyada toparlanma üç kişide 118,7’den 154,7, altı kişide 61,3’ten 78,0 saate çıkar; uyandırma sayısı neredeyse sabit kalır. Nedeni tektir: uzun vardiya uyandırmaları tek kişide üst üste bindirir ve her ek uyandırma pencereyi iki saat açar. Aynı sayıda uyandırma, dağıtıldığında daha ucuzdur.
Eşik Ortalamada mı, Kişide mi
Ortalamaya bakıldığında düzen sekiz kişide banda girer; altı kişide toparlanma 61,3 ile 60 saatlik sınırın dışında, uyandırma 13,3 ile 12’nin üstündedir. Kişiye bakıldığında hiçbir düzen banda girmez: sekiz kişide bile en yüklü kişi 14 uyandırma ve 66 toparlanma saati taşır.
Dördüncü tablo nedenini gösterir. Beş kişilik ekipte k1 20, k5 9 kez uyanır; toparlanma 96,0 ile
40,0 saat arasında dağılır, oysa nöbet haftaları 10 ile 11’dir. Fark kapsamadan gelir: üç servis
kapsayan kişi hem kendi nöbetinde hem başkasının nöbetinde yedek olarak uyanır. Ortalama nöbet
yükü, yükü en ağır taşıyan kişi hakkında hiçbir şey söylemez.
Yanıtsız Kalan Üç Soru
Çizelge ile kapsama çizelgesi sekiz sorudan beşini yanıtlar ve beşi de kim ile ne zaman biçimindedir. Yanıtsız üçü aynı boşluğa düşer: çağrının hangi adımla kapanacağı, uyandırmanın kaç saat üretkenlik götürdüğü, düzenin bir yıl sürdürülüp sürdürülemeyeceği.
“Hangi adımla” yanıtsızsa çağrı kapsama dışına düşer: üçüncü tabloda bu pay %31 ile %37 arasındadır ve ekip büyüdükçe düşmez, çünkü kapsam kişinin özelliğidir, havuzun değil. Faturası iki kalemdir — ilk adıma başlama 10 dakikadan 17,7–19,2 dakikaya çıkar ve yılda 16 ile 20 arasında ikinci bir kişi uyandırılır; bu ikinci uyandırma beş kişide kişi başına 16,0 toparlanma saatidir, oradaki 74,4 saatin beşte birinden fazlası. Toparlanma penceresinin kendisi ise hiçbir işletim verisinde yoktur: modelde varsayımdır, alanda ölçülmez, bu yüzden nöbetin bedeli kayda geçmez ve düzen ancak bir kişi ayrıldığında görünür.
Uyandırmayı Kim Üretiyor
Beşinci tablo aynı çağrı kümesini tek değişiklikle koşturur: gecelik toplu iş 02.00 yerine 09.00’da başlar. Çağrı sayısı değişmez, gece çağrısı 61’den 20’ye iner ve bant sekiz kişide değil dört kişide geçilir; beş kişide uyandırma 16,2’den 5,0’a, toparlanma 74,4’ten 20,8 saate düşer. Üç kişilik ekip bundan sonra bile banda girmez — 9,3 uyandırma içeride, 17,3 nöbet haftası dışarıda. Nöbet düzeni bir çizelge sorusu gibi görünür, faturası iş takviminde yazılıdır.
Özet
- Yıllık 136 çağrının 61’i gece gelir; çizelge olmadığında kişi başına yük 61 uyandırma ile 244 toparlanma saatidir. Çizelgeyle bu yük üç kişide 17,3 nöbet haftası, 25,7 uyandırma ve 118,7 toparlanma saatine, sekiz kişide 6,5 / 10,1 / 46,5’e iner.
- Vardiyayı iki haftaya çıkarmak uyandırma sayısını değiştirmez, toparlanmayı büyütür: üç kişide 118,7 → 154,7, altı kişide 61,3 → 78,0 saat.
- Ortalamaya göre bant sekiz kişide geçilir, kişiye göre hiçbir düzende geçilmez; beş kişide aynı çizelgeyle 20 ve 9 uyandırma, 96,0 ve 40,0 toparlanma saati yan yana durur.
- Sekiz sorudan beşi yanıtlanır, üçü yanıtsız kalır; “hangi adımla” yanıtsızlığı çağrıların %31–%37’sini kapsama dışına düşürür ve yılda 16–20 ikinci uyandırma üretir.
- Gecelik toplu işi 09.00’a almak gece çağrısını 61’den 20’ye indirir, eşiği sekizden dört kişiye çeker.
Sonraki Adım
Bu ders her çağrının bir insanı uyandırmaya değdiğini varsaydı. Sonraki ders bilinen bir olay kümesini önem düzeyi kuralıyla etiketler ve yanlış sınıflandırmayı iki yönde sayar: fazla yükseltilenin gereksiz uyandırması, fazla düşürülenin geciken müdahalesi. Tırmandırma zinciri de aynı kümede taranır — kaç basamak, basamak başına kaç dakika, kaç olay kimseye ulaşmadan kalır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.