Ders 13 / 17
Açık Yönetimi Programı
52 haftada gelen 884 bulguya karşı haftalık 84 adam-saatlik düzeltme kapasitesi: 13,2 saatlik açıklık yıl sonunda 684 saatlik bir kuyruk bırakıyor, dört önceliklendirme kuralı aynı kümede 709 ile 843 arasında kalem kapatıyor ve risk maruziyeti 6.681 ile 18.511 puan-hafta arasında değişiyor. Kuralın değeri kapasiteye bağlı: 101 saat/haftada kuyruk boşalıyor, 109 saat/haftada kuralların sırası tersine dönüyor.
İçindekiler
Önceki konu ortak bir dil kurdu: kontroller gereksinimlere eşlendi, kanıtsız kalan gereksinim sayıldı ve dışarıdan bakan birinin ne göreceği ölçüldü. Bu ölçümlerin hepsinin ortak bir özelliği var — yılda bir kez doğrudurlar. Belgelendirme fotoğrafı çekildiği anda geçerlidir; ertesi sabah yeni bir bulgu düşer, bir yama gecikir ve bir kullanıcı eski alışkanlığına döner. Bu konunun beş dersi iki fotoğraf arasındaki günleri ölçer.
İlk ders bulgunun kendisiyle başlar. Bir tarama düzeni her hafta yeni kalem üretir, düzeltme ekibinin haftalık kapasitesi sabittir ve ikisi eşit değildir. Program ölçeğinde sorulan soru “bu bulgu ne kadar ciddi” değildir; o soru Güvenlik Araçları ve Sızma Testi kursunda kanıtlanmış bulgu düzeyinde ölçüldü ve buraya tek bir puan sütunu olarak girer. Buradaki soru şudur: gelen akış kapasiteden büyükse hangi kalem bekler ve beklemenin karşılığı nedir.
Ölçü birimi puan-haftadır: bir kalemin puanı ile açık kaldığı hafta sayısının çarpımı. Kapatılan kalem sayısı bir çıktı ölçüsüdür; toplam puan-hafta — bu derste risk maruziyeti — programın gerçekten düşürdüğü şeyi verir ve düşük olması istenir.
- GP1. 52 haftalık ufuk, altı varlık sınıfı ve haftalık bulgu akışı kurgusal bölgesel ölçüm ağına aittir ve modeldir. Gerçek bir tarama koşulmuyor, gerçek bir varlık taranmıyor.
- GP2. Puan sütunu dışarıdan gelen bir girdidir. Bir bulgunun nasıl kanıtlandığı ve nasıl puanlandığı bu derste yeniden türetilmez.
- GP3. Çaba adam-saat cinsindendir ve düzeltme boyunca değişmez. Gerçekte aynı sınıftaki ilk düzeltme sonrakileri ucuzlatır; bu öğrenme etkisi modellenmedi.
- GP4. Kapasite haftalık sabittir ve bölünebilir: yarım kalan kalem ertesi hafta kaldığı yerden sürer. Bağlam değiştirme bedeli yok sayıldı.
- GP5. Kapatılan kalem yeniden açılmaz ve düzeltmenin kendisi yeni bulgu üretmez.
- GP6. Rastgelelik üreteci ders içinde yazılıdır ve tohum görünürdür.
// acik/model.mjs — acik yonetimi programinin MODELIDIR: kurgu bolgesel olcum aginda haftalik // bulgu akisi, sabit duzeltme kapasitesi ve kuyruk. Gercek bir tarama kosmuyor; puan sutunu // disaridan gelen bir girdidir. export const TOHUM = 20260803, HAFTA = 52, KAPASITE = 84, YASLI = 12, YUKSEK = 7; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; export const SINIF = [ // ad, haftalik yeni bulgu, puan egilimi (0-10), caba egilimi (adam-saat) { ad: 'saha-ucu', hafta: 6, puan: 5.2, caba: 3 }, { ad: 'sube-ucu', hafta: 3, puan: 5.8, caba: 4 }, { ad: 'toplayici', hafta: 2, puan: 6.6, caba: 9 }, { ad: 'islem-sunucusu', hafta: 2, puan: 7.1, caba: 14 }, { ad: 'ag-aygiti', hafta: 1, puan: 6.0, caba: 7 }, { ad: 'bulut-hesabi', hafta: 3, puan: 6.3, caba: 5 }, ]; export const AKIS = (() => { const r = uretec(TOHUM); const liste = []; let no = 0; for (let h = 1; h <= HAFTA; h += 1) for (const s of SINIF) for (let k = 0; k < s.hafta; k += 1) { const p = Math.min(10, Math.max(1, s.puan + (r() - 0.5) * 4.4)); liste.push({ no: (no += 1), gelis: h, sinif: s.ad, puan: +p.toFixed(1), caba: Math.max(1, Math.round(s.caba * (0.5 + r()))) }); } return liste; })(); export const gelen = (h) => AKIS.filter((b) => b.gelis === h); export const TALEP = AKIS.reduce((a, b) => a + b.caba, 0) / HAFTA; export const KURAL = { 'puan': (b) => b.puan, 'puan/caba': (b) => b.puan / b.caba, 'gelis sirasi': (b) => -b.gelis, 'puan + yas': (b, h) => b.puan + 0.25 * (h - b.gelis), }; // Kuyruk: her hafta gelenler eklenir, kural sirasi uygulanir, kapasite tepeden harcanir. // Sigmayan kalem yarim kalir ve ertesi hafta kaldigi yerden surer. export function kosum(ad, kapasite = KAPASITE) { const kural = KURAL[ad]; const kuyruk = []; const kapanan = []; for (let h = 1; h <= HAFTA; h += 1) { for (const b of gelen(h)) kuyruk.push({ ...b, kalan: b.caba }); kuyruk.sort((a, b) => kural(b, h) - kural(a, h) || a.no - b.no); let bos = kapasite; while (bos > 0 && kuyruk.length) { const b = kuyruk[0]; if (b.kalan <= bos) { bos -= b.kalan; kapanan.push({ ...b, kapanis: h }); kuyruk.shift(); } else { b.kalan -= bos; bos = 0; } } } const acikHafta = (b) => (b.kapanis ?? HAFTA + 1) - b.gelis; const hepsi = [...kapanan, ...kuyruk]; const yuksek = kapanan.filter((b) => b.puan >= YUKSEK); return { ad, kapanan: kapanan.length, puan: kapanan.reduce((a, b) => a + b.puan, 0), maruziyet: hepsi.reduce((a, b) => a + b.puan * acikHafta(b), 0), kuyruk: kuyruk.length, saat: kuyruk.reduce((a, b) => a + b.kalan, 0), yuksekSure: yuksek.reduce((a, b) => a + acikHafta(b), 0) / yuksek.length, yasli: kuyruk.filter((b) => HAFTA - b.gelis + 1 > YASLI).length, yuksekAcik: kuyruk.filter((b) => b.puan >= YUKSEK).length }; }
Akış ile Kapasite Arasındaki Fark
// acik/akis.mjs — gelen bulgu akisi, duzeltme kapasitesi ve dort onceliklendirme kuralinin // ayni kume uzerindeki sonucu import { AKIS, SINIF, HAFTA, KAPASITE, TALEP, YASLI, YUKSEK, KURAL, kosum } from './model.mjs'; const y = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd()); console.log(`${HAFTA} haftada ${AKIS.length} bulgu, ${SINIF.length} varlik sinifi; ` + `haftalik talep ${TALEP.toFixed(1)} adam-saat, kapasite ${KAPASITE} adam-saat`); console.log(`aciklik ${(TALEP - KAPASITE).toFixed(1)} adam-saat/hafta; ` + `puani ${YUKSEK} ve uzeri olan ${AKIS.filter((b) => b.puan >= YUKSEK).length} kalem`); const A = [-14, 8, 10, 11, 12, 13, 13]; console.log('\n1. sinif basina akis'); y(A, 'sinif', 'kalem', 'ort puan', 'ort caba', 'saat/hafta'); for (const s of SINIF) { const l = AKIS.filter((b) => b.sinif === s.ad); y(A, s.ad, l.length, (l.reduce((a, b) => a + b.puan, 0) / l.length).toFixed(1), (l.reduce((a, b) => a + b.caba, 0) / l.length).toFixed(1), (l.reduce((a, b) => a + b.caba, 0) / HAFTA).toFixed(1)); } console.log('\n2. dort onceliklendirme kurali, ayni kume, ayni kapasite'); y(A, 'kural', 'kapanan', 'kapatilan', 'maruziyet', 'yetisemeyen', `${YASLI} haftadan`, `acik puan>=${YUKSEK}`); y(A, '', 'kalem', 'puan', 'puan-hafta', 'kalem', 'yasli', 'kalem'); for (const k of Object.keys(KURAL)) { const x = kosum(k); y(A, k, x.kapanan, x.puan.toFixed(0), Math.round(x.maruziyet), x.kuyruk, x.yasli, x.yuksekAcik); }
52 haftada 884 bulgu, 6 varlik sinifi; haftalik talep 97.2 adam-saat, kapasite 84 adam-saat
aciklik 13.2 adam-saat/hafta; puani 7 ve uzeri olan 228 kalem
1. sinif basina akis
sinif kalem ort puan ort caba saat/hafta
saha-ucu 312 5.3 3.0 18.2
sube-ucu 156 5.8 4.0 11.9
toplayici 104 6.6 8.9 17.8
islem-sunucusu 104 7.0 13.8 27.7
ag-aygiti 52 5.7 7.0 7.0
bulut-hesabi 156 6.5 4.9 14.6
2. dort onceliklendirme kurali, ayni kume, ayni kapasite
kural kapanan kapatilan maruziyet yetisemeyen 12 haftadan acik puan>=7
kalem puan puan-hafta kalem yasli kalem
puan 709 4579 18219 175 122 0
puan/caba 843 5050 6681 41 27 6
gelis sirasi 763 4564 18511 121 0 33
puan + yas 747 4593 18208 137 12 9
İlk tablo dersin başlangıç koşulunu veriyor ve tek bir satırı okumak yeter: haftalık talep 97,2 adam-saat, kapasite 84. Aradaki 13,2 saatlik açıklık her hafta yeniden doğuyor ve elli iki hafta sonunda 684 saatlik bir kuyruk bırakıyor. Bu, hiçbir önceliklendirme kuralının kapatamayacağı bir farktır; kural yalnız hangi kalemin beklediğine karar verir.
Sınıf satırları farkın nereden geldiğini gösteriyor. Saha uçları en çok kalemi üretiyor (312) ama kalem başına yalnız 3 saat tutuyor; işlem sunucuları dört kat daha az kalem üretiyor (104) ve haftalık talebin en büyük payını alıyor (27,7 saat). Aynı sınıf en yüksek ortalama puanı da taşıyor. Pahalı ve yüksek puanlı kalemlerin aynı sınıfta toplanması, sonraki tablodaki bütün gerilimin kaynağıdır.
Dört Kural, İki Farklı Yanıt
İkinci tablo aynı 884 kalemi aynı kapasiteyle dört ayrı sırayla işliyor. Saf puan sırası 709 kalem kapatıyor; puanı çabaya bölen sıra 843. İkincisi yalnız kalem sayısında değil, kapatılan toplam puanda da öndedir (5.050’ye karşı 4.579). Bu şaşırtıcı görünebilir, çünkü saf puan sırası tanım gereği en yüksek puanlı kalemi önce alır. Nedeni tabloda: en yüksek puanlı sınıf aynı zamanda en pahalı olandır, ve pahalı bir kalem üzerinde geçen her saat, aynı sürede kapatılabilecek üç ucuz kalemi bekletir.
Risk maruziyeti farkı daha büyüktür: 18.219 puan-haftaya karşı 6.681, yaklaşık 2,7 kat. Geliş sırasıyla çalışan kuyruk en kötüsüdür (18.511) ve nedeni sütunlarda görünüyor — bu kuralda on iki haftadan yaşlı tek bir kalem yok, ama açık kalan 33 kalemin puanı 7 ve üzeridir. Kuyruğun genç olması riskin düşük olduğu anlamına gelmiyor; yalnız kimsenin uzun süre beklemediği anlamına geliyor.
Son iki sütun kuralların sıralamasını tersine çeviriyor. Saf puan sırası 122 kalemi on iki haftadan uzun süre bekletiyor ama açık bıraktığı yüksek puanlı kalem sayısı sıfırdır: bu kural hiçbir zaman yüksek bir kalemi aç bırakmaz, onun yerine düşük puanlı her şeyi süresiz erteler. Puanı çabaya bölen kural ise altı yüksek puanlı kalemi açık bırakıyor ve bunlar tam olarak pahalı olanlardır. Aynı veriden iki farklı öncelik çıkıyor: maruziyete bakan yönetici puan/çaba kuralını, “hiçbir yüksek kalem açıkta kalmasın” kuralını benimseyen yönetici saf puanı seçer. İki karar da aynı tablodan destek bulur.
Kuralın Değeri Kapasiteye Bağlı
// acik/kapasite.mjs — kapasite degistikce kuralin degeri: hangi noktada kuyruk bosaliyor ve // hangi noktada kurallarin sirasi degisiyor import { TALEP, KURAL, kosum } from './model.mjs'; const AD = Object.keys(KURAL); const y = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd()); const A = [-10, 8, 11, 11, 13, 11, 13, 11]; y(A, 'kapasite', 'talebin', ...AD, 'en dusuk'); y(A, 'saat/hf', 'kati', 'maruziyet', 'maruziyet', 'maruziyet', 'maruziyet', 'maruziyet'); for (let c = 84; c <= 120; c += 6) { const s = AD.map((k) => kosum(k, c)); const m = Math.round(Math.min(...s.map((x) => x.maruziyet))); const en = AD.filter((_, i) => Math.round(s[i].maruziyet) === m); y(A, c, (c / TALEP).toFixed(2), ...s.map((x) => Math.round(x.maruziyet)), en.length === 1 ? en[0] : 'esit'); } const bos = (() => { for (let c = 84; c <= 160; c += 1) if (AD.every((k) => kosum(k, c).kuyruk === 0)) return c; })(); const donus = (() => { for (let c = 84; c <= 160; c += 1) { const s = AD.map((k) => kosum(k, c).maruziyet); if (s[1] > s[0]) return c; } })(); console.log(`\nkuyrugun dort kuralda da bosaldigi ilk kapasite: ${bos} saat/hafta ` + `(talebin ${(bos / TALEP).toFixed(2)} kati)`); console.log(`kural sirasinin degistigi kapasite: ${donus} saat/hafta ` + `(talebin ${(donus / TALEP).toFixed(2)} kati); altinda puan/caba, ustunde puan onde`); for (const c of [84, bos, donus]) { const s = AD.map((k) => kosum(k, c).maruziyet); console.log(` ${String(c).padStart(3)} saat/hafta: en iyi ile en kotu kural arasi ` + `${(Math.max(...s) - Math.min(...s)).toFixed(0)} puan-hafta ` + `(${(Math.max(...s) / Math.max(1, Math.min(...s))).toFixed(1)} kat)`); }
kapasite talebin puan puan/caba gelis sirasi puan + yas en dusuk saat/hf kati maruziyet maruziyet maruziyet maruziyet maruziyet 84 0.86 18219 6681 18511 18208 puan/caba 90 0.93 10663 3671 9881 9884 puan/caba 96 0.99 1615 831 1578 1689 puan/caba 102 1.05 281 181 353 297 puan/caba 108 1.11 74 55 89 74 puan/caba 114 1.17 11 14 11 11 esit 120 1.24 0 0 0 0 esit kuyrugun dort kuralda da bosaldigi ilk kapasite: 101 saat/hafta (talebin 1.04 kati) kural sirasinin degistigi kapasite: 109 saat/hafta (talebin 1.12 kati); altinda puan/caba, ustunde puan onde 84 saat/hafta: en iyi ile en kotu kural arasi 11831 puan-hafta (2.8 kat) 101 saat/hafta: en iyi ile en kotu kural arasi 233 puan-hafta (2.0 kat) 109 saat/hafta: en iyi ile en kotu kural arasi 34 puan-hafta (1.6 kat)
Üçüncü tablo kuralı sabit tutup kapasiteyi değiştiriyor ve iki ayrı eşik veriyor. Birincisi 101 saat/haftadır: talebin 1,04 katına çıkıldığında dört kuralın hepsinde kuyruk boşalıyor, yani yetişemeyen kalem sıfır oluyor. İkincisi 109 saat/haftadır ve bu dersin asıl kanıtıdır — o noktada kuralların sırası tersine dönüyor. Kapasite dar olduğu sürece puanı çabaya bölen kural en düşük maruziyeti verir; kapasite talebin 1,12 katını geçtiğinde saf puan sırası öne çıkar. Bolluk varken hiçbir kalem aç kalmadığı için ucuzu öne almanın kazancı biter ve yüksek puanlıya önce dokunmak maruziyeti daha çok düşürür.
Son üç satır kuralın ne kadar değerli olduğunu ölçüyor. 84 saat/haftada en iyi kuralla en kötüsü arasında 11.831 puan-hafta var; 101’de bu fark 233’e, 109’da 34’e iniyor. Kural bir darlık aracıdır ve darlık azaldıkça değeri erir.
Aynı sayılar iki müdahaleyi de karşılaştırılabilir kılıyor. Kapasite 84’te sabitken kuralı değiştirmek maruziyeti 18.219’dan 6.681’e indiriyor. Kuralı en iyi seçenekte tutup kapasiteyi 84’ten 101’e — yüzde yirmi — çıkarmak ise 6.681’i 233’e indiriyor. İkinci hamle birincisinin yaklaşık yirmi dokuz katıdır. Önceliklendirme kuralı üzerinde tartışmak, kapasite açıklığı yazılmadığında ölçüsüz bir tartışmadır; iki sayı yan yana yazıldığında hangi kararın büyük olduğu görünür.
Özet
- 52 haftada 884 bulgu haftalık 97,2 adam-saat talep üretiyor, kapasite 84 adam-saat: 13,2 saatlik açıklık yıl sonunda 684 saatlik bir kuyruk bırakıyor ve hiçbir kural bu farkı kapatmaz.
- Puanı çabaya bölen kural saf puan sırasından hem daha çok kalem (843’e karşı 709) hem daha çok puan (5.050’ye karşı 4.579) kapatıyor; risk maruziyeti 6.681’e karşı 18.219 puan-hafta.
- Aynı tablo iki farklı öncelik veriyor: maruziyete bakan puan/çaba kuralını seçer, “hiçbir yüksek puanlı kalem açıkta kalmasın” ölçütü saf puanı seçer (0’a karşı 6 açık yüksek kalem).
- Geliş sırasıyla çalışan kuyrukta on iki haftadan yaşlı kalem yok ama açık kalan 33 kalemin puanı 7 ve üzeri: genç kuyruk düşük risk demek değildir.
- Kuyruk 101 saat/haftada (talebin 1,04 katı) boşalıyor; 109 saat/haftada kuralların sırası tersine dönüyor ve saf puan öne geçiyor. Kural bir darlık aracıdır.
- Kapasiteyi yüzde yirmi artırmak maruziyeti 6.681’den 233’e indiriyor; en iyi kuralı seçmek 18.219’dan 6.681’e. İkinci hamle birincisinin yirmi dokuz katıdır.
Sonraki Adım
Bu ders düzeltmeyi tek boyutlu bir işlem saydı: bir kaleme adam-saat harcanır ve kalem kapanır. Gerçekte her düzeltme bir değişikliktir ve değişiklik üretim ortamına dokunur. Kalemi hızlı kapatmak, onu sınamadan uygulamak demektir; sınamak ise açık kalma süresini uzatır. Sonraki ders bu dengeyi ölçer: yama penceresi daraldıkça istismar edilebilir hâle gelmeden yakalanan açık sayısı artıyor, ama aynı daralma sınama kapsamını düşürüp plan dışı kesinti üretiyor. İki eğri aynı eksen üzerinde çizilir ve kesiştikleri nokta hesaplanır — o nokta, hız ile riskin eşitlendiği pencere uzunluğudur.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.