Ders 06 / 11
Tehdit Modellemenin Amacı
Tehdit modelleme oturumunun kendi ölçüsü: 18 kalemlik envanterde oturumun 40 geliştirici saati sürüp 10 kalem bulması, kalem başına 4,0 saate karşılık 866 saat kurtarması, aynı kalemin geç yakalandığında 4 ile 30 kat arasında değişen bir maliyet farkı üretmesi, toplam düzeltme saatinin 1.872'den 1.006'ya inmesi ve oturumun hiç dokunmadığı sekiz kalemin toplam saatin %48,4'ünü taşıması.
İçindekiler
Önceki konu güvenlik işini aşamalara dağıttı, gereksinimi sınanabilir biçimde yazdı ve sınırlı geliştirme kapasitesinin nasıl bölüneceğini sordu. Bütün o hesapların ortak girdisi hazır bir kalem listesiydi: hangi açığın var olduğu biliniyordu, tartışılan yalnız sırasıydı. Oysa tasarım aşamasında böyle bir liste kendiliğinden ortaya çıkmaz.
Tehdit modelleme, o listeyi tasarım aşamasında üretmenin yöntemidir. Bu ders yöntemin adımlarını değil, amacını ve fiyatını ölçer: oturum kaç saat sürer, kaç kalem bulur, kalem başına kaç saat harcar ve bulduğu kalem geç yakalansaydı kaç kat pahalıya gelirdi. Konu boyunca aynı kurgu bölgesel ölçüm ağının yazılımı üzerinde çalışılır.
Oturum Nerede Durur
Aşağıdaki envanter bir modeldir: gerçek bir ürün, gerçek bir ekip ölçümü ya da gerçek bir kayıt yoktur. Kalemler yalnız üç sütunla anılır — nerede doğdukları, nerede görülebildikleri ve düzeltmelerinin kaç geliştirici saati tuttuğu. Hiçbir istismar adımı yazılmaz.
TD1: düzeltme işi geliştirici saati olarak ölçülür; taban saat kalemin tasarım aşamasındaki karşılığıdır ve sonraki aşamalarda bir çarpanla büyür. TD2: her kalemin doğduğu aşama ile görülebildiği aşama ayrı şeylerdir; kodda doğan bir kalem yalnız çalışma zamanında görülebilir olabilir. TD3: oturum tasarım aşamasında koşar ve yalnız görülür aşaması tasarımdan geç olmayan kalemleri bulur. TD4: oturumun bedeli katılımcı sayısı ile süresinin çarpımıdır.
// tehdit/kalem.mjs — asama kumesi ve kalem envanteri (model): kurgu bolgesel olcum agi // yaziliminin gelistirme kayitlarindan turetilmistir, gercek bir olcum degildir. Hicbir // istismar adimi yoktur; kalem yalnizca nerede dogdugu, nerede gorulebildigi ve // duzeltmesinin kac gelistirici saati oldugu ile yazilir. export const ASAMA = ["gereksinim", "tasarim", "kod", "yapi", "dagitim", "calisma-zamani"]; // TD1: duzeltme isi gelistirici saati olarak olculur. `taban`, kalemin tasarim asamasinda // duzeltilmesinin saatidir; sonraki asamalarda asagidaki carpanla buyur. export const CARPAN = { gereksinim: 1, tasarim: 1, kod: 4, yapi: 6, dagitim: 12, "calisma-zamani": 30 }; // TD2: satirlar "ad dogus gorulur varsayilan taban" biciminde yazilir. `dogus` kalemin // uretildigi, `gorulur` en erken gorulebildigi, `varsayilan` tehdit modelleme oturumu // olmadiginda fiilen yakalandigi asamadir. export const KALEM = ` guven-siniri-cizilmemis tasarim tasarim dagitim 6 sayac-kimligi-dogrulanmiyor tasarim tasarim calisma-zamani 8 fatura-kaydi-degistirilebilir tasarim tasarim dagitim 10 abone-verisi-korumasiz-akiyor tasarim tasarim dagitim 4 yetki-karari-istemcide tasarim tasarim kod 7 denetim-gunlugu-eksik gereksinim tasarim calisma-zamani 5 saha-cihazi-sir-tasiyor tasarim tasarim dagitim 9 rapor-ucu-kimliksiz tasarim tasarim kod 3 olcum-yedegi-korumasiz tasarim tasarim calisma-zamani 6 oturum-suresi-tanimsiz gereksinim tasarim kod 2 girdi-uzunlugu-sinirsiz kod kod yapi 2 sorgu-birlestirmesi-elle kod kod yapi 4 zamanlama-farki-sizdiriyor kod kod calisma-zamani 5 eszamanli-istek-yaris-kosulu kod calisma-zamani calisma-zamani 12 bagimlilik-surumu-sabitlenmemis yapi yapi dagitim 3 imaj-icinde-artik-arac yapi yapi dagitim 2 varsayilan-kimlik-bilgisi-acik dagitim dagitim calisma-zamani 4 gunluk-kaydinda-kimlik-bilgisi kod calisma-zamani calisma-zamani 6` .trim().split("\n").map((r) => { const [ad, dogus, gorulur, varsayilan, taban] = r.trim().split(/\s+/); return { ad, dogus, gorulur, varsayilan, taban: +taban }; }); export const sira = (a) => ASAMA.indexOf(a); export const maliyet = (k, asama) => k.taban * CARPAN[asama]; // TD3: tehdit modelleme oturumu tasarim asamasinda kosar ve yalnizca `gorulur` asamasi // tasarimdan gec olmayan kalemleri bulur; kalanlarina hic dokunmaz. export const bulunur = (k) => sira(k.gorulur) <= sira("tasarim"); // TD4: oturumun bedeli katilimci sayisi x oturum sayisi x oturum suresidir. export const OTURUM = { katilimci: 5, sayi: 4, saat: 2 }; export const OTURUM_SAAT = OTURUM.katilimci * OTURUM.sayi * OTURUM.saat;
// tehdit/oturum.mjs — oturum kac saat suruyor, kac kalem buluyor, kalem basina kac saat // ve ayni kalem gec yakalandiginda maliyeti kac kat. import { ASAMA, CARPAN, KALEM, OTURUM, OTURUM_SAAT, sira, maliyet, bulunur } from "./kalem.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 topla = (ks, f) => ks.reduce((s, k) => s + f(k), 0); const bulunan = KALEM.filter(bulunur), kacan = KALEM.filter((k) => !bulunur(k)); console.log(`${KALEM.length} kalem, ${ASAMA.length} asama; carpanlar ` + `${ASAMA.map((a) => `${a} x${CARPAN[a]}`).join(", ")}`); const A = [-33, -12, -16, -16, 9, 11, 14, 6]; console.log("\n1. kalem nerede doguyor, nerede gorulebiliyor, nerede yakalaniyor"); yaz(A, "kalem", "dogus", "gorulur", "varsayilan", "gecikme", "tasarimda", "varsayilanda", "kat"); for (const k of KALEM) { const t = maliyet(k, "tasarim"), v = maliyet(k, k.varsayilan); yaz(A, k.ad, k.dogus, k.gorulur, k.varsayilan, sira(k.varsayilan) - sira(k.dogus), t, v, (v / t).toFixed(1)); } const B = [-16, 8, 10, 17, 9, 9]; console.log("\n2. gorulur asamasina gore kalem sinifi"); yaz(B, "gorulur asama", "kalem", "kalem %", "varsayilan saat", "saat %", "oturum"); for (const a of ASAMA) { const g = KALEM.filter((k) => k.gorulur === a); if (!g.length) continue; const s = topla(g, (k) => maliyet(k, k.varsayilan)); yaz(B, a, g.length, ((g.length / KALEM.length) * 100).toFixed(1), s, ((s / topla(KALEM, (k) => maliyet(k, k.varsayilan))) * 100).toFixed(1), sira(a) <= sira("tasarim") ? "bulur" : "bulmaz"); } const OTURUMSUZ = topla(KALEM, (k) => maliyet(k, k.varsayilan)); const OTURUMLU = topla(bulunan, (k) => maliyet(k, "tasarim")) + topla(kacan, (k) => maliyet(k, k.varsayilan)) + OTURUM_SAAT; const C = [-34, 14, 22]; console.log("\n3. oturumun kendi olcusu"); for (const [ad, x, y] of [ ["oturum sayisi x katilimci x saat", `${OTURUM.sayi}x${OTURUM.katilimci}x${OTURUM.saat}`, OTURUM_SAAT + " saat"], ["bulunan kalem", bulunan.length, (OTURUM_SAAT / bulunan.length).toFixed(1) + " saat/kalem"], ["dokunulmayan kalem", kacan.length, ((kacan.length / KALEM.length) * 100).toFixed(1) + " %"], ["oturumsuz toplam duzeltme", OTURUMSUZ + " saat", "-"], ["oturumlu toplam duzeltme", OTURUMLU + " saat", (OTURUMSUZ / OTURUMLU).toFixed(2) + " kat"], ["oturumun kurtardigi saat", OTURUMSUZ - OTURUMLU + " saat", ((OTURUMSUZ - OTURUMLU) / OTURUM_SAAT).toFixed(1) + " x oturum saati"], ]) yaz(C, ad, x, y); const D = [-22, 8, 16, 15, 8]; console.log("\n4. oturumun degdigi ve degmedigi kalemler ayri ayri"); yaz(D, "kume", "kalem", "oturumsuz saat", "oturumlu saat", "kat"); for (const [ad, ks, saat] of [ ["oturumun buldugu", bulunan, topla(bulunan, (k) => maliyet(k, "tasarim"))], ["oturumun bulmadigi", kacan, topla(kacan, (k) => maliyet(k, k.varsayilan))], ]) { const o = topla(ks, (k) => maliyet(k, k.varsayilan)); yaz(D, ad, ks.length, o, saat, (o / saat).toFixed(1)); } const enGec = [...KALEM].sort((x, y) => maliyet(y, y.varsayilan) - maliyet(x, x.varsayilan))[0]; console.log(`en pahali tek kalem ${enGec.ad}: ${maliyet(enGec, enGec.varsayilan)} saat, ` + `oturum bunu ${bulunur(enGec) ? "bulur" : "bulmaz"}; oturumun bulmadigi ` + `${kacan.length} kalem toplam duzeltme saatinin ` + `%${((topla(kacan, (k) => maliyet(k, k.varsayilan)) / OTURUMSUZ) * 100).toFixed(1)}'ini tasiyor`);
18 kalem, 6 asama; carpanlar gereksinim x1, tasarim x1, kod x4, yapi x6, dagitim x12, calisma-zamani x30 1. kalem nerede doguyor, nerede gorulebiliyor, nerede yakalaniyor kalem dogus gorulur varsayilan gecikme tasarimda varsayilanda kat guven-siniri-cizilmemis tasarim tasarim dagitim 3 6 72 12.0 sayac-kimligi-dogrulanmiyor tasarim tasarim calisma-zamani 4 8 240 30.0 fatura-kaydi-degistirilebilir tasarim tasarim dagitim 3 10 120 12.0 abone-verisi-korumasiz-akiyor tasarim tasarim dagitim 3 4 48 12.0 yetki-karari-istemcide tasarim tasarim kod 1 7 28 4.0 denetim-gunlugu-eksik gereksinim tasarim calisma-zamani 5 5 150 30.0 saha-cihazi-sir-tasiyor tasarim tasarim dagitim 3 9 108 12.0 rapor-ucu-kimliksiz tasarim tasarim kod 1 3 12 4.0 olcum-yedegi-korumasiz tasarim tasarim calisma-zamani 4 6 180 30.0 oturum-suresi-tanimsiz gereksinim tasarim kod 2 2 8 4.0 girdi-uzunlugu-sinirsiz kod kod yapi 1 2 12 6.0 sorgu-birlestirmesi-elle kod kod yapi 1 4 24 6.0 zamanlama-farki-sizdiriyor kod kod calisma-zamani 3 5 150 30.0 eszamanli-istek-yaris-kosulu kod calisma-zamani calisma-zamani 3 12 360 30.0 bagimlilik-surumu-sabitlenmemis yapi yapi dagitim 1 3 36 12.0 imaj-icinde-artik-arac yapi yapi dagitim 1 2 24 12.0 varsayilan-kimlik-bilgisi-acik dagitim dagitim calisma-zamani 1 4 120 30.0 gunluk-kaydinda-kimlik-bilgisi kod calisma-zamani calisma-zamani 3 6 180 30.0 2. gorulur asamasina gore kalem sinifi gorulur asama kalem kalem % varsayilan saat saat % oturum tasarim 10 55.6 966 51.6 bulur kod 3 16.7 186 9.9 bulmaz yapi 2 11.1 60 3.2 bulmaz dagitim 1 5.6 120 6.4 bulmaz calisma-zamani 2 11.1 540 28.8 bulmaz 3. oturumun kendi olcusu oturum sayisi x katilimci x saat 4x5x2 40 saat bulunan kalem 10 4.0 saat/kalem dokunulmayan kalem 8 44.4 % oturumsuz toplam duzeltme 1872 saat - oturumlu toplam duzeltme 1006 saat 1.86 kat oturumun kurtardigi saat 866 saat 21.6 x oturum saati 4. oturumun degdigi ve degmedigi kalemler ayri ayri kume kalem oturumsuz saat oturumlu saat kat oturumun buldugu 10 966 60 16.1 oturumun bulmadigi 8 906 906 1.0 en pahali tek kalem eszamanli-istek-yaris-kosulu: 360 saat, oturum bunu bulmaz; oturumun bulmadigi 8 kalem toplam duzeltme saatinin %48.4'ini tasiyor
Sayılar ölçüm sınıfındadır; girdileri TD1–TD4’tür.
Kırk Saatlik Oturum
Üçüncü tablo bu dersin ana sorusunu yanıtlar. Dört oturum, beş katılımcı, oturum başına iki saat: toplam 40 geliştirici saati. Oturum on kalem bulur, yani kalem başına 4,0 saat. Bu sayı tehdit modellemeyi bir yöntem olarak değil, bir iş kalemi olarak yazar; onay isteyen bir ekip için tartışılabilir olan tek biçim budur.
Karşılığı aynı satırda durur. Oturum olmasaydı on sekiz kalemin toplam düzeltme işi 1.872 saat olurdu; oturumla birlikte 1.006 saate iner. Fark 866 saattir ve harcanan 40 saatin 21,6 katıdır. Bu oranın büyüklüğü tek bir şeyden gelir: oturumun bulduğu kalemler zaten geç aşamada yakalanacak kalemlerdi ve geç aşamanın çarpanı yüksekti.
Toplam üzerinden bakıldığında ise kazanç çok daha ölçülüdür: 1.872 saat 1.006 saate iner, yani 1,86 kat. Aynı ölçüm iki farklı büyüklük verir ve ikisi de doğrudur. Oturumun değdiği kalemler için oran 16,1’dir; bütün envanter için 1,86. Hangi sayının yazıldığı, oturumun neyi kapsadığının açıkça söylenip söylenmediğine bağlıdır.
Aynı Kalem, Üç Aşama Sonra
Birinci tablonun son sütunu her kalem için tek soruyu yanıtlar: aynı kalem varsayılan aşamasında yakalandığında tasarımdakinin kaç katına mal olur. Değerler 4,0 ile 30,0 arasında dağılır ve bu aralık dersin en önemli bulgusudur — “geç yakalamak pahalıdır” cümlesi tek bir kat sayısı taşımaz, kalemin nereye kadar gidebildiğine bağlı bir dağılım taşır.
Uçları karşılaştırmak yeterlidir. yetki-karari-istemcide kodda yakalanır: 7 saat yerine 28 saat,
kat 4,0. sayac-kimligi-dogrulanmiyor çalışma zamanına kadar gider: 8 saat yerine 240 saat,
kat 30,0. İki kalemin taban saati birbirine yakındır; aradaki otuz katlık farkı üreten şey kalemin
kendi büyüklüğü değil, kaç aşama boyunca görülmeden ilerlediğidir.
gecikme sütunu bunu doğrudan sayar. denetim-gunlugu-eksik gereksinim aşamasında doğar ve
çalışma zamanında yakalanır: beş aşama geç. Aynı kalemin taban saati yalnız 5’tir; beş aşama
gecikme onu 150 saate çıkarır. Buna karşılık imaj-icinde-artik-arac yapı aşamasında doğar ve
dağıtımda yakalanır — bir aşama geç, 2 saat yerine 24. Envanterin en pahalı kalemi olan
eszamanli-istek-yaris-kosulu ise üç aşama gecikmeyle 360 saate ulaşır ve tek başına oturumsuz
toplamın yaklaşık beşte birini taşır.
Kapsama Tavanı
Birinci tablonun dogus sütunu tek başına okunduğunda oturumun üst sınırını verir. Envanterin
2 kalemi gereksinim, 8 kalemi tasarım, 5 kalemi kod, 2 kalemi yapı, 1 kalemi dağıtım aşamasında
doğar. Tasarım aşaması bittiğinde henüz doğmamış olan kalem sayısı sekizdir.
Bir kalem doğmadan görülemez; gorulur sütunu hiçbir satırda dogus sütunundan erken olamaz.
Bu, oturumun kapsamına yapısal bir tavan koyar: tasarımdan sonra doğan hiçbir kalem tasarım
oturumunda bulunamaz — o kalem oturum yürütülürken henüz yoktur. Sekiz kalemin dışarıda kalması
oturumun kalitesizliğinden değil, sırasından gelir.
Tavanın altında ise oturumun kendi başarısı ölçülür. Gereksinim ve tasarım aşamasında doğan on
kalemin onunda da gorulur sütunu tasarımı gösterir; bu envanterde oturum tavanın tamamına
ulaşır. Gerçek bir oturumda bu oran daha düşüktür ve iki sayı ayrı yazılmalıdır: kaç kalem
yapısal olarak bulunabilirdi, bunların kaçı fiilen bulundu. İkisi karıştırıldığında %100 kapsama
bildiren bir ekip, envanterin %44,4’ünü hiç ölçmemiş olur.
İki kalem bu ayrımı doğrudan gösterir. eszamanli-istek-yaris-kosulu ve
gunluk-kaydinda-kimlik-bilgisi kod aşamasında doğar ama ancak çalışma zamanında görülür;
ikisinin de gecikmesi üç aşamadır. Bunlar ne tasarım oturumunun ne de kodu okuyan bir denetimin
kapsamındadır — doğdukları aşamada bile görünmezler.
Tasarımda Görülemeyen Sekiz Kalem
Dördüncü tablo bu dersin sınırını yazar. Oturumun değdiği on kalem 966 saatten 60 saate iner — 16,1 kat. Oturumun bulmadığı sekiz kalem ise 906 saatten 906 saate iner; kat 1,0. Oturum ne kadar iyi yürütülürse yürütülsün bu sekiz kaleme hiçbir şey yapmaz.
İkinci tablo o sekizin nerede durduğunu ayırır. Üç kalem ancak kodda görülebilir, iki kalem yapıda, bir kalem dağıtımda, iki kalem yalnız çalışma zamanında. Kalem sayısı olarak envanterin %44,4’ü, düzeltme saati olarak %48,4’üdür. Yani tasarım aşamasında yürütülen en eksiksiz oturum bile toplam işin yarısına yaklaşan bir bölümünü olduğu yerde bırakır.
Bu sınıf rastgele değildir. Yarış koşulu, zamanlama farkı ve günlük kaydına düşen kimlik bilgisi, tasarımda bir kutu ya da bir ok olarak görünmez; ancak yazılmış kodun ya da koşan sistemin davranışında ortaya çıkar. Tasarım belgesi bu kalemleri taşımaz, dolayısıyla tasarımı okuyan hiçbir oturum onları bulamaz. Çalışma zamanında görülebilen iki kalem tek başına 540 saat taşır — oturumun kurtardığı 866 saatin yaklaşık üçte ikisi kadar.
Buradan çıkan karar sadedir: tehdit modelleme oturumu, kendisinden sonra gelen denetimlerin yerine geçmez. Oturumun kapsama sınırı yazılmadan verilen “tasarımda hepsini yakalarız” cümlesi, ölçüldüğünde envanterin yarısını dışarıda bırakan bir iddiadır.
Özet
- Tehdit modelleme oturumu ölçülebilir bir iş kalemidir: dört oturum, beş katılımcı, iki saat — 40 geliştirici saati, 10 kalem, kalem başına 4,0 saat.
- Oturum 866 saat kurtarır; bu, harcanan 40 saatin 21,6 katıdır. Aynı ölçüm bütün envanter üzerinden 1,86 kat, yalnız değdiği kalemler üzerinden 16,1 kat verir.
- Aynı kalemin geç yakalanma katı 4,0 ile 30,0 arasında dağılır; katı belirleyen şey kalemin büyüklüğü değil, kaç aşama boyunca görülmeden ilerlediğidir.
- Beş aşama geciken 5 saatlik bir kalem 150 saate, bir aşama geciken 2 saatlik bir kalem 24 saate çıkar; gecikme sayısı taban saatten daha belirleyicidir.
- Envanterin 8 kalemi tasarımda görülemez ve oturum onlara hiç dokunmaz — kalem sayısının %44,4’ü, düzeltme saatinin %48,4’ü. Bu kalemler için oturumun katı 1,0’dır.
Sonraki Adım
Bu ders oturumun fiyatını ve kapsama sınırını yazdı, ama oturumun içinde ne yapıldığını hiç açmadı. On kalemin nasıl bulunduğu bir kutu olarak kaldı: “tasarım okundu ve kalemler çıktı.”
Tasarımı okumak bir yöntem değildir; bir tasarım metni yüzlerce cümle içerir ve hangi cümlenin güvenlik kalemi doğurduğu belli değildir. Yöntemin ilk adımı, tasarımı üzerinde sayım yapılabilir bir yapıya çevirmektir: hangi bileşen hangi veriyi kimden alıp kime veriyor ve bu alışverişlerin hangileri bir güven düzeyinden başka bir güven düzeyine geçiyor. Sonraki ders bu yapıyı kurar ve konunun temel ölçümünü yapar: veri akış çizgesinde güven sınırını geçen akış sayısı, sınırı geçen her akışın taşıdığı kalem ve sınır çizilmediğinde kaç akışın görünmez kaldığı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.