Ders 04 / 11
Güvenlik Şampiyonları
Beş ekibin haftalık 35 incelemesi üzerinde güvenlik yetkinliğinin dağılımı ölçülür: merkezî ekip tek başına 16 incelemeyi kapsar ve 19'u güvenlik gözü olmadan geçer, dört şampiyonla kapsam doyar. Bir şampiyon ortalama 0,86 ekibe yeter ve her ekipte bir şampiyon olsa bile haftada 6 inceleme merkeze kalır; beşinci şampiyon eklendiğinde uzmanlık isteyen kalemlerin yakalanması 2'den 1'e düşer, çünkü merkez o incelemeleri artık görmez.
İçindekiler
Önceki üç ders sırasıyla denetimleri aşamalara dağıttı, aşama başına maliyeti hesapladı ve gereksinimleri sınanabilir biçime çevirdi. Üçü de bir kişiyi çağırdı ama adını hiç koymadı: tasarım oturumunda gözlenemez bir yüklemi fark eden, statik çözümlemenin doksan uyarısından altı gerçek kalemi ayıran, kötüye kullanım senaryosunu yürüten kişi. Bu kişinin her ekipte hazır bulunduğu varsayıldı.
Bu ders o varsayımı ölçer. Güvenlik şampiyonu (security champion), kendi ekibinin içinde çalışan ve zamanının bir bölümünü güvenlik incelemesine ayıran bir geliştiricidir; merkezî bir güvenlik ekibinin alternatifi değil, kapasitesinin uzantısıdır. Ölçülecek üç şey vardır: kaç incelemede güvenlik gözü var, kaçı bekliyor ve bir şampiyonun kapasitesi kaç ekibe yetiyor.
- DY17. Ekipler, geliştirici sayıları ve haftalık inceleme sayıları kurgusaldır; toplam inceleme yükü önceki derslerin değişiklik akışıyla uyumludur.
- DY18. Bir şampiyon yalnız kendi ekibinin incelemesine bakar; bağlam bilgisi aktarılamayan bir kaynaktır. Merkezî uzman herhangi bir ekibe bakabilir ve kapasitesi ortak havuzdadır.
- DY19. Kalem zorluğu üç düzeydir: 1 kontrol listesiyle, 2 eğitimli gözle, 3 uzmanlıkla görülür. Şampiyon en çok 2. düzeyi yakalar; 3. düzey merkezî uzmanın işidir.
- DY20. Bir kalem ancak güvenlik gözü olan bir incelemede yakalanır. Kapsanmayan incelemeden geçen kalem, önceki derslerin diliyle geç akışa düşer.
- DY21. Eskalasyon oranı, şampiyonun göremediği bir kalemi yine de merkeze ilettiği durumların payıdır ve model değeridir. Sıfır olduğunda şampiyon modelinin derinlik tavanı görünür hâle gelir.
Kapsanan ve Kapsanmayan İnceleme
Model ekipleri inceleme yüküyle sıralar ve iki kapasite kaynağını ayırır: şampiyonların kendi ekiplerinde harcadığı zaman ile merkezî ekibin ortak havuzu.
// ekip.mjs — bes ekip, inceleme yuku ve guvenlik yetkinliginin dagilimi (model) // satir: ekip | gelistirici | haftalik inceleme export const EKIP = ` abone-portali 6 10 sayac-toplama 5 8 faturalama 4 6 saha-uygulamasi 4 5 ortak-kitaplik 3 6` .trim().split('\n').map((r) => { const [ad, g, i] = r.trim().split(/\s+/); return { ad, gelistirici: +g, inceleme: +i }; }); export const SAMPIYON_PAY = 0.2; // sampiyonun kendi zamanindan ayirdigi oran export const SAMPIYON_INCELEME = 6; // bu payla haftada bakabildigi inceleme sayisi export const MERKEZ_KISI = 2, MERKEZ_INCELEME = 8; // merkezi guvenlik ekibi // Kalem zorlugu: 1 kontrol listesiyle, 2 egitimli gozle, 3 uzmanlikla gorulur. // Dagilim onceki derslerin 23 kalemlik kumesi uzerine modellenmistir. export const ZORLUK = [[1, 11], [2, 7], [3, 5]]; export const SAMPIYON_DERINLIK = 2; // sampiyonun yakalayabildigi en yuksek zorluk export const TOPLAM_INCELEME = EKIP.reduce((s, e) => s + e.inceleme, 0); export const TOPLAM_GELISTIRICI = EKIP.reduce((s, e) => s + e.gelistirici, 0);
// kosum1.mjs — sampiyon sayisi arttikca guvenlik gozu olan inceleme ve bekleyen inceleme import { EKIP, SAMPIYON_PAY, SAMPIYON_INCELEME, MERKEZ_KISI, MERKEZ_INCELEME, TOPLAM_INCELEME, TOPLAM_GELISTIRICI } from './ekip.mjs'; const merkez = MERKEZ_KISI * MERKEZ_INCELEME; // Sampiyon yalniz kendi ekibinin incelemesine bakar; merkez havuzdan herhangi bir ekibe. const sirali = [...EKIP].sort((a, b) => b.inceleme - a.inceleme); console.log(`${EKIP.length} ekip, ${TOPLAM_GELISTIRICI} gelistirici, ` + `${TOPLAM_INCELEME} inceleme/hafta; merkez ${merkez} inceleme/hafta`); console.log('\nsampiyon sampiyon kapsami merkez kullanilan bosta merkez kapsanan bekleyen kisi-esdeger'); for (let s = 0; s <= EKIP.length; s++) { const kaps = sirali.slice(0, s).reduce((a, e) => a + Math.min(e.inceleme, SAMPIYON_INCELEME), 0); const kalan = TOPLAM_INCELEME - kaps, kullanilan = Math.min(kalan, merkez); const esdeger = (s * SAMPIYON_PAY + MERKEZ_KISI).toFixed(1); console.log(String(s).padEnd(10) + String(kaps).padEnd(18) + String(kullanilan).padEnd(19) + String(merkez - kullanilan).padEnd(14) + String(kaps + kullanilan).padEnd(10) + String(kalan - kullanilan).padEnd(10) + esdeger); } console.log('\nbir sampiyon kendi ekibine yetiyor mu'); console.log('ekip inceleme sampiyon kapasitesi acik merkeze kalan %'); for (const e of sirali) console.log(e.ad.padEnd(17) + String(e.inceleme).padEnd(10) + String(SAMPIYON_INCELEME).padEnd(21) + String(Math.max(0, e.inceleme - SAMPIYON_INCELEME)).padEnd(6) + ((Math.max(0, e.inceleme - SAMPIYON_INCELEME) / e.inceleme) * 100).toFixed(0)); const acik = sirali.reduce((a, e) => a + Math.max(0, e.inceleme - SAMPIYON_INCELEME), 0); console.log(`her ekipte bir sampiyon olsa bile ${acik} inceleme/hafta merkeze kalir; ` + `bir sampiyon ortalama ${(SAMPIYON_INCELEME / (TOPLAM_INCELEME / EKIP.length)).toFixed(2)} ekibe yeter`);
5 ekip, 22 gelistirici, 35 inceleme/hafta; merkez 16 inceleme/hafta sampiyon sampiyon kapsami merkez kullanilan bosta merkez kapsanan bekleyen kisi-esdeger 0 0 16 0 16 19 2.0 1 6 16 0 22 13 2.2 2 12 16 0 28 7 2.4 3 18 16 0 34 1 2.6 4 24 11 5 35 0 2.8 5 29 6 10 35 0 3.0 bir sampiyon kendi ekibine yetiyor mu ekip inceleme sampiyon kapasitesi acik merkeze kalan % abone-portali 10 6 4 40 sayac-toplama 8 6 2 25 faturalama 6 6 0 0 ortak-kitaplik 6 6 0 0 saha-uygulamasi 5 6 0 0 her ekipte bir sampiyon olsa bile 6 inceleme/hafta merkeze kalir; bir sampiyon ortalama 0.86 ekibe yeter
Sıfırıncı satır başlangıç durumunu veriyor: iki kişilik merkezî ekip haftada 16 incelemeye bakabiliyor, 19 inceleme güvenlik gözü olmadan geçiyor. Kapsanan oran yüzde 46’dır ve bu sayı merkezî ekibin çalışkanlığıyla ilgili değildir — 35 incelemeye 16 kapasite ayrılmıştır.
Şampiyon eklendikçe kapsanan sayı 16’dan 22’ye, 28’e, 34’e çıkıyor ve dördüncü şampiyonda doyuyor. Beşinci şampiyon kapsanan sayıyı hiç değiştirmiyor; yalnız merkezin boşta kalan kapasitesini 5’ten 10’a çıkarıyor. Kişi eşdeğeri sütunu bedeli veriyor: dört şampiyonla toplam güvenlik yetkinliği 2,8 tam zamanlı kişiye denk gelir ve bunun 0,8’i yirmi iki geliştiricinin içinden çıkar. Aynı kapsamı merkezî ekibi büyüterek elde etmek için 35 incelemeye yetecek kadar uzman gerekirdi; şampiyon modeli, kapsamı yeni kişi almadan doyurmanın yoludur.
Bir Şampiyon Kaç Ekibe Yetiyor
İkinci tablo yaygın bir tasarım varsayımını sayıyla yanlışlıyor. “Her ekipte bir şampiyon” cümlesi kapsamın tamamlandığını ima eder; sayılar öyle demiyor. Bir şampiyonun haftalık kapasitesi altı inceleme, ortalama ekip yükü yedi incelemedir — yani bir şampiyon ortalama 0,86 ekibe yeter.
Dağılım ortalamadan daha keskindir. Abone portalı haftada on inceleme üretir; şampiyon altısına bakar, dördü merkeze kalır ve bu, o ekibin incelemelerinin yüzde 40’ıdır. Sayaç toplama servisinde oran yüzde 25’tir. Küçük üç ekipte açık sıfırdır ve saha uygulamasında şampiyonun bir incelemelik boş kapasitesi vardır, ama o kapasite başka bir ekibe aktarılamaz — bağlam taşınmaz.
Sonuç şudur: her ekipte bir şampiyon bulunsa bile haftada altı inceleme merkeze kalır. Şampiyon sayısı kapsamı ekip sınırında doyurur, kurum genelinde doyurmaz; kalan yükü karşılayacak bir merkezî kapasite her durumda gerekir. Kapasitenin ekip yüküne göre dağıtılmaması durumunda ise en çok inceleme üreten ekip en çok açığı taşır — tabloyu sıralayan sütun budur.
Derinlik Kapsamla Birlikte Büyümüyor
Kapsanan inceleme sayısı yakalanan kalem sayısı demek değildir. Bir incelemede kimin oturduğu, hangi zorluktaki kalemin görüleceğini belirler.
// kosum2.mjs — kapsam buyurken derinlik ne oluyor: zorluk 3 kalemler kimin gozunden geciyor import { EKIP, SAMPIYON_INCELEME, MERKEZ_KISI, MERKEZ_INCELEME, ZORLUK, SAMPIYON_DERINLIK, TOPLAM_INCELEME } from './ekip.mjs'; const merkez = MERKEZ_KISI * MERKEZ_INCELEME; const sirali = [...EKIP].sort((a, b) => b.inceleme - a.inceleme); const sig = ZORLUK.filter(([z]) => z <= SAMPIYON_DERINLIK).reduce((a, [, n]) => a + n, 0); const derin = ZORLUK.filter(([z]) => z > SAMPIYON_DERINLIK).reduce((a, [, n]) => a + n, 0); const ESKALASYON = 0.6; // sampiyonun "emin degilim" deyip merkeze ilettigi derin kalem orani console.log(`${sig + derin} kalem: sampiyonun gorebildigi ${sig}, uzmanlik isteyen ${derin}`); console.log('\nsampiyon sampiyon kapsami merkez kapsami sig yakalanan derin yakalanan eskalasyonla toplam'); for (let s = 0; s <= EKIP.length; s++) { const kaps = sirali.slice(0, s).reduce((a, e) => a + Math.min(e.inceleme, SAMPIYON_INCELEME), 0); const mk = Math.min(TOPLAM_INCELEME - kaps, merkez); const sy = Math.round((sig * (kaps + mk)) / TOPLAM_INCELEME); const dy = Math.round((derin * mk) / TOPLAM_INCELEME); const de = Math.round((derin * (mk + ESKALASYON * kaps)) / TOPLAM_INCELEME); console.log(String(s).padEnd(10) + String(kaps).padEnd(18) + String(mk).padEnd(16) + String(sy).padEnd(15) + String(dy).padEnd(17) + String(de).padEnd(14) + (sy + de)); } console.log(`\neskalasyonun merkeze getirdigi ek yuk 5 sampiyonda ` + `${(derin * ESKALASYON * 29 / TOPLAM_INCELEME).toFixed(1)} kalem; ` + `merkezin bosta kapasitesi ${merkez - 6} inceleme/hafta`);
23 kalem: sampiyonun gorebildigi 18, uzmanlik isteyen 5 sampiyon sampiyon kapsami merkez kapsami sig yakalanan derin yakalanan eskalasyonla toplam 0 0 16 8 2 2 10 1 6 16 11 2 3 14 2 12 16 14 2 3 17 3 18 16 17 2 4 21 4 24 11 18 2 4 22 5 29 6 18 1 3 21 eskalasyonun merkeze getirdigi ek yuk 5 sampiyonda 2.5 kalem; merkezin bosta kapasitesi 10 inceleme/hafta
Sığ kalem sütunu beklendiği gibi davranıyor: sekizden on sekize çıkıyor ve dördüncü şampiyonda tamamlanıyor. Derin kalem sütunu davranmıyor. Merkezî ekip tek başına iki derin kalem yakalıyor ve bu sayı şampiyon sayısı dörde çıkana kadar hiç değişmiyor; beşinci şampiyonda bire düşüyor.
Düşüşün nedeni tabloda yan sütunda duruyor. Şampiyonlar 29 incelemeyi kapsadığında merkeze yalnız 6 inceleme kalır; merkezin baktığı inceleme sayısı azaldıkça uzmanlık isteyen kalemleri görme olasılığı da azalır. Şampiyon o incelemelerde oturmaktadır ama derin kalemi görecek düzeyde değildir. Kapsamı büyüten karar, derinliği küçültmüştür. Toplam sütunu bunu tek sayıyla veriyor: en iyi sonuç dört şampiyonda 22 kalem, beş şampiyonda 21 kalemdir.
Son sütun karşı önlemi ölçüyor. Şampiyonun göremediği bir kalemi yine de merkeze iletebildiği bir eskalasyon yolu varsa derin kalem sayısı beş şampiyonda 1’den 3’e çıkar. Bunun bedeli merkeze gelen 2,5 kalemlik ek yüktür ve merkezin haftada 10 incelemelik boş kapasitesi bunu karşılar. Şampiyon modelinin işe yaraması yetkinliğin dağıtılmasına değil, yetersizliğin bildirilebilmesine bağlıdır: “emin değilim” diyebilen bir şampiyon, emin olmaya çalışan bir şampiyondan daha çok kalem yakalatır.
Bir sınırlama yazılmalıdır. Model, şampiyonun derinlik tavanını sabit tutuyor; gerçekte tavan eğitimle yükselir ve bu ölçümün dışındadır. Ölçülen şey belirli bir tavanla kapsamın nasıl davrandığıdır; eğitimin katkısı ayrı bir karardır ve kendi bedeli vardır.
Kapsanmayan İnceleme Ne Oluyor
Kapsanmayan bir incelemenin akıbeti kapasite sorusu değil, kural sorusudur. Güvenlik incelemesi zorunluysa kapsanmayan değişiklik bekler; zorunlu değilse geçer ve taşıdığı kalem kaçar.
// kosum3.mjs — kapsanmayan inceleme iki ayri kurala baglanabilir: bloklayan ve bloklamayan import { EKIP, SAMPIYON_INCELEME, MERKEZ_KISI, MERKEZ_INCELEME, ZORLUK, SAMPIYON_DERINLIK, TOPLAM_INCELEME } from './ekip.mjs'; const HAFTA = 12, merkez = MERKEZ_KISI * MERKEZ_INCELEME; const sirali = [...EKIP].sort((a, b) => b.inceleme - a.inceleme); const sig = ZORLUK.filter(([z]) => z <= SAMPIYON_DERINLIK).reduce((a, [, n]) => a + n, 0); const derin = ZORLUK.filter(([z]) => z > SAMPIYON_DERINLIK).reduce((a, [, n]) => a + n, 0); console.log(' acik bloklayan kural bloklamayan kural'); console.log('sampiyon /hafta bekleyen degisiklik kacan bekleyen kacan kalem'); for (let s = 0; s <= EKIP.length; s++) { const kaps = sirali.slice(0, s).reduce((a, e) => a + Math.min(e.inceleme, SAMPIYON_INCELEME), 0); const mk = Math.min(TOPLAM_INCELEME - kaps, merkez), acik = TOPLAM_INCELEME - kaps - mk; const yakalanan = Math.round((sig * (kaps + mk)) / TOPLAM_INCELEME) + Math.round((derin * (mk + 0.6 * kaps)) / TOPLAM_INCELEME); console.log(String(s).padEnd(10) + String(acik).padEnd(8) + String(acik * HAFTA).padEnd(21) + '0'.padEnd(7) + '0'.padEnd(10) + (sig + derin - yakalanan)); } console.log('\nbloklayan kuralda hicbir kalem kacmaz, 12 haftada 228 degisiklige kadar beklenir;'); console.log('bloklamayan kuralda hicbir degisiklik beklemez, 13 kaleme kadar gozsuz gecer.');
acik bloklayan kural bloklamayan kural sampiyon /hafta bekleyen degisiklik kacan bekleyen kacan kalem 0 19 228 0 0 13 1 13 156 0 0 9 2 7 84 0 0 6 3 1 12 0 0 2 4 0 0 0 0 1 5 0 0 0 0 2 bloklayan kuralda hicbir kalem kacmaz, 12 haftada 228 degisiklige kadar beklenir; bloklamayan kuralda hicbir degisiklik beklemez, 13 kaleme kadar gozsuz gecer.
Aynı açık sayısı iki bambaşka sonuç veriyor. Yetkinlik hiç dağıtılmamışken bloklayan kural on iki haftada 228 değişikliği bekletir ve hiçbir kalem kaçırmaz; bloklamayan kural hiçbir değişikliği bekletmez ve 13 kalem güvenlik gözü görmeden geçer. İlk dersin kapı tablosuyla aynı takas buradadır, ama bu kez bekletmenin nedeni kapının kapasitesi değil, inceleyecek yetkinliğin bulunmamasıdır.
Kararın yönü şampiyon sayısına bağlıdır. Sıfır ve bir şampiyonda bloklayan kural işletilemez — biriken 228 ve 156 değişiklik ekipleri durdurur, kural birkaç hafta içinde bir istisna listesine dönüşür ve fiilen bloklamayan kurala iner. Üçüncü şampiyondan sonra açık haftada bir incelemeye düşer; on iki haftada 12 değişiklik bekler ve bloklayan kural artık taşınabilir hâle gelir. Bloklayan bir kural yetkinlik dağıtılmadan yazılamaz; yazılırsa uygulanmaz ve uygulanmayan bir kural, kapsandığı sanılan incelemeleri de kapsamsız bırakır.
Son satır önceki tablonun bulgusunu bir kez daha gösteriyor. Beşinci şampiyonda açık sıfırdır, bekleyen değişiklik sıfırdır ve her şey kapsanmış görünür; buna rağmen kaçan kalem sayısı dört şampiyondaki 1’den 2’ye çıkar. Kapsam sütununa bakan bir ölçüm bu artışı hiç görmez.
Özet
- 5 ekip haftada 35 inceleme üretiyor; iki kişilik merkezî ekip 16’sını kapsıyor ve 19 inceleme güvenlik gözü olmadan geçiyor.
- Şampiyon eklendikçe kapsanan inceleme 16’dan 34’e çıkar ve dördüncü şampiyonda 35’e doyar; beşinci şampiyon kapsamı değiştirmez, yalnız merkezin boş kapasitesini 5’ten 10’a çıkarır.
- Bir şampiyonun kapasitesi 6 inceleme, ortalama ekip yükü 7 incelemedir: bir şampiyon 0,86 ekibe yeter. Her ekipte bir şampiyon olsa bile haftada 6 inceleme merkeze kalır ve bunun 4’ü tek bir ekipten gelir.
- Dört şampiyonlu düzenin bedeli 2,8 kişi eşdeğeridir ve 0,8’i mevcut 22 geliştiricinin içinden çıkar; kapsam yeni kişi alınmadan doyar. Kapsanmayan inceleme için bloklayan kural 12 haftada 228 değişikliği bekletir ve hiç kalem kaçırmaz, bloklamayan kural hiç bekletmez ve 13 kalem kaçırır; bloklayan kural ancak üçüncü şampiyondan sonra taşınabilir hâle gelir.
- Uzmanlık isteyen 5 kalemin yakalanması şampiyon sayısıyla artmaz: dört şampiyona kadar 2’de sabit kalır, beşinci şampiyonda 1’e düşer, çünkü merkez o incelemeleri artık görmez.
- Eskalasyon yolu derin kalem sayısını beş şampiyonda 1’den 3’e çıkarır; bedeli merkeze gelen 2,5 kalemlik ek yüktür ve merkezin 10 incelemelik boş kapasitesi bunu karşılar.
Sonraki Adım
Bu ders yetkinliğin nereye konacağını ölçtü ve dört şampiyonlu bir düzende 23 kalemin 22’sinin yakalandığını buldu. Yakalanmak bir kalemi kapatmaz. Önceki derslerin hepsi bulunan kalemin düzeltildiğini varsaydı; sola kaydırmanın 250 saatlik kazancı bile o varsayımın üstünde duruyordu ve orada bir üst sınır olduğu yazılmıştı. Bulunan kalemi düzeltecek olan aynı yirmi iki geliştiricidir ve onların zamanı özellik işiyle paylaşılır. Sonraki ders sınırlı geliştirme kapasitesini kalem kümesine dağıtır: bir sprint kapasitesi kaç kalem alıyor, birim kapasite başına kaç kalem kapanıyor, sıralama ölçütü değiştiğinde kaç kalem dışarıda kalıyor ve dışarıda kalanların kümesi ölçüt değiştiğinde ne kadar değişiyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.