Ders 17 / 18
Raporlama
61 rapor kaydı yeniden üretilebilirlik cinsinden denetleniyor. Beş zorunlu alanın her biri ayrı ayrı yüksek oranda dolu olduğu halde beşinin birlikte dolu olma oranı yüzde 31,1; ikinci bir okuyucunun yeniden üretebildiği bulgu 8, yeniden test turunda kapandı denebilen bulgu 3. Eksik alanların yazılması 9,4 saat tutuyor ve kapandı denebilen bulguyu 49'a çıkarıyor; 12 bulgu ortam değişkeni taşıdığı için hiçbir durumda adım adım yeniden üretilemiyor. Düzeltme önerisi 29 bulguda doğrudan uygulanabilir, 22'sinde ayrı bir karar gerektiriyor, 10'unda hiç yok.
İçindekiler
Bir önceki ders 61 kanıtı iki ayrı eksende sıraya koydu ve 40 adam-günlük bir düzeltme bütçesinin neyi kapattığını ölçtü. Sıradaki adım bulgunun bir düzeltme ekibine gitmesidir, ve o ekip bulguyu ilk kez okuyacaktır. Test ekibinin elinde kanıt olması, o kanıtın karşı tarafta yeniden görülebileceği anlamına gelmez.
Bu ders raporu tek bir ölçüyle sınar: yeniden üretilebilirlik. Bir bulgu, onu üretmemiş bir kişi tarafından aynı sonuçla gözlenebiliyorsa yeniden üretilebilir; gözlenemiyorsa düzeltmenin işe yarayıp yaramadığı da hiçbir zaman doğrulanamaz. Yeniden üretim adımları (reproduction steps) bu yüzden bir anlatı değil, bir rapor kalemidir. Bu derste hiçbir örnek adım yazılmaz; ölçülen şey adımın hangi bilgileri taşıması gerektiği ve o bilgilerin kaç kayıtta gerçekten bulunduğudur.
- TS25. Rapor kümesi önceki dersin 61 bulgusudur. Kayıtlar kurgudur ve hiçbir saldırı adımı içermez; sayılan şey alan adlarıdır.
- TS26. Sekiz alan tanımlıdır: ön koşul, girdi tanımı, gözlenen sonuç, zaman damgası, kanıt kimliği, ortam bilgisi, beklenen davranış ve düzeltme önerisi.
- TS27. İlk beş alan yeniden üretim için zorunludur. Kalan üçü kaydı tamamlar ama adım kümesinin kendisine girmez.
- TS28. Bir kayıt ortam değişkeni taşıyabilir: ortam bilgisi yazılı olsa bile değeri koşumdan koşuma değişir. Bu kayıtlar adım adım yeniden üretilemez.
- TS29. İkinci bir okuyucu bir bulguyu ancak adım kümesi tamsa, ortam bilgisi yazılıysa ve ortam değişkeni yoksa yeniden üretebilir.
- TS30. Bir bulgu, yeniden test turunda ancak yeniden üretilebiliyorsa ve beklenen davranışı yazılıysa “kapandı” denebilir. Alan yazım süreleri kurgudur.
Alan Denetimi
// rapor.mjs — rapor kayitlarinin yeniden uretilebilirlik denetimi. // MODELDIR; kayitlar kurgudur ve hicbir saldiri adimi icermez, yalnizca // bir adimin tasimasi gereken ALAN ADLARI sayilir. export const TOHUM = 20260519, N = 61; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); // Yeniden uretim adimi bir rapor kalemidir. Alanlar, adimin tasimasi gereken // bilgilerdir; doluluk orani kurgudur ve alan zorlugunu yansitir. export const ALAN = [ { ad: "onkosul", doluluk: 0.82, zorunlu: true, dakika: 4 }, { ad: "girdi tanimi", doluluk: 0.74, zorunlu: true, dakika: 6 }, { ad: "gozlenen sonuc", doluluk: 0.91, zorunlu: true, dakika: 5 }, { ad: "zaman damgasi", doluluk: 0.88, zorunlu: true, dakika: 1 }, { ad: "kanit kimligi", doluluk: 0.63, zorunlu: true, dakika: 3 }, { ad: "ortam bilgisi", doluluk: 0.57, zorunlu: false, dakika: 4 }, { ad: "beklenen davranis", doluluk: 0.49, zorunlu: false, dakika: 7 }, { ad: "duzeltme onerisi", doluluk: 0.86, zorunlu: false, dakika: 12 }, ]; // Duzeltme onerisi sinifi: dogrudan uygulanabilir, karar gerektiren, yapisal. const ONERI = [["dogrudan", 0.41], ["karar gerektiren", 0.34], ["yapisal", 0.25]]; const oneriSec = (u) => { let t = 0; for (const [ad, p] of ONERI) { t += p; if (u < t) return ad; } return ONERI.at(-1)[0]; }; export const KAYIT = Array.from({ length: N }, (_, i) => { const dolu = {}; for (const a of ALAN) dolu[a.ad] = r() < a.doluluk; return { no: i + 1, dolu, oneri: dolu["duzeltme onerisi"] ? oneriSec(r()) : "yok", // Ortama bagli: kayit ortam bilgisi tasisa bile degeri kosumdan kosuma degisiyor. degisken: r() < 0.23 }; }); const ZORUNLU = ALAN.filter((a) => a.zorunlu).map((a) => a.ad); export const tamAdim = (k) => ZORUNLU.every((ad) => k.dolu[ad]); // Ikinci bir okuyucu bulguyu ancak adim kumesi tamsa, ortam bilgisi varsa ve // ortam degiskeni yoksa yeniden uretebilir. export const yenidenUretilir = (k) => tamAdim(k) && k.dolu["ortam bilgisi"] && !k.degisken; if (import.meta.url === `file://${process.argv[1]}`) { const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yz = gen([20, 10, 9, 10, 16, 12]); console.log(`model (tohum ${TOHUM}): ${N} rapor kaydi, ${ALAN.length} alan, ` + `${ZORUNLU.length} tanesi yeniden uretim icin zorunlu`); console.log("\n" + yz(["alan", "zorunlu", "dolu", "eksik", "tek eksik olan", "dk/bulgu"])); for (const a of ALAN) { const dolu = KAYIT.filter((k) => k.dolu[a.ad]).length; // Tek eksik olan: bu alan dolsaydi kayit adim kumesini tamamlayacak olanlar. const tek = KAYIT.filter((k) => !k.dolu[a.ad] && a.zorunlu && ZORUNLU.filter((z) => !k.dolu[z]).length === 1).length; console.log(yz([a.ad, a.zorunlu ? "evet" : "hayir", dolu, N - dolu, tek, a.dakika])); } const tam = KAYIT.filter(tamAdim), uretilir = KAYIT.filter(yenidenUretilir); const ortamsiz = tam.filter((k) => !k.dolu["ortam bilgisi"]).length; const degisken = tam.filter((k) => k.dolu["ortam bilgisi"] && k.degisken).length; const y2 = gen([34, 9, 9]); console.log("\n" + y2(["kayit sinifi", "bulgu", "yuzde"])); for (const [ad, s] of [["adim kumesi tam", tam.length], ["adim eksik", N - tam.length], ["tam ama ortam bilgisi yok", ortamsiz], ["tam, ortam yazili, degeri degisken", degisken], ["ikinci okuyucu yeniden uretebilir", uretilir.length]]) { console.log(y2([ad, s, `${(100 * s / N).toFixed(1)}`])); } const eksikSay = ZORUNLU.map((z) => [z, KAYIT.filter((k) => !k.dolu[z]).length]) .sort((a, b) => b[1] - a[1])[0]; console.log(`\nen cok eksik kalan zorunlu alan "${eksikSay[0]}" ` + `(${eksikSay[1]} kayitta yok); kayit basina tam alan yazimi ` + `${ALAN.reduce((a, x) => a + x.dakika, 0)} dakika tutuyor`); }
model (tohum 20260519): 61 rapor kaydi, 8 alan, 5 tanesi yeniden uretim icin zorunlu alan zorunlu dolu eksik tek eksik olan dk/bulgu onkosul evet 55 6 1 4 girdi tanimi evet 41 20 9 6 gozlenen sonuc evet 56 5 2 5 zaman damgasi evet 54 7 1 1 kanit kimligi evet 36 25 11 3 ortam bilgisi hayir 37 24 0 4 beklenen davranis hayir 30 31 0 7 duzeltme onerisi hayir 51 10 0 12 kayit sinifi bulgu yuzde adim kumesi tam 19 31.1 adim eksik 42 68.9 tam ama ortam bilgisi yok 7 11.5 tam, ortam yazili, degeri degisken 4 6.6 ikinci okuyucu yeniden uretebilir 8 13.1 en cok eksik kalan zorunlu alan "kanit kimligi" (25 kayitta yok); kayit basina tam alan yazimi 42 dakika tutuyor
İlk tabloya alan alan bakıldığında rapor iyi görünüyor: gözlenen sonuç 61 kayıttan 56’sında, ön koşul 55’inde, zaman damgası 54’ünde yazılı. Tek tek hiçbir alan felaket değildir. İkinci tablo ise beş zorunlu alanın birlikte dolu olduğu kayıt sayısını 19’da, yani yüzde 31,1’de bırakıyor. Bağımsız eksiklikler toplanmaz, çarpılır: her alanı ayrı ayrı yüksek oranda dolduran bir ekip, birleşik ölçüde yine de üçte bir düzeyinde kalabilir. Rapor niteliği alan başına değil, kayıt başına ölçülmelidir.
“Tek eksik olan” sütunu en ucuz kazancın nerede olduğunu söylüyor. Kanıt kimliği 11 kayıtta tek başına eksik olan alandır: yalnız o alan doldurulduğunda adım kümesi tam olan kayıt 19’dan 30’a çıkar. Alanın maliyeti kayıt başına 3 dakikadır ve eksik olduğu 25 kayıt için 75 dakika tutar — yüzde elli yedilik bir artış, bir buçuk saatin altında bir işle. Girdi tanımı 9 kayıtta tek eksiktir ve eksik olduğu 20 kayıt 120 dakika tutar. Sütunun boş kalması da bilgi taşıyor: ortam bilgisi, beklenen davranış ve düzeltme önerisi hiçbir kayıtta tek eksik değildir, çünkü zorunlu alan kümesine girmezler ve adım kümesini tek başlarına tamamlayamazlar.
Üçüncü sayı asıl uyarıdır. Adım kümesi tam olan 19 kayıttan yalnız 8’i ikinci bir okuyucu tarafından yeniden üretilebiliyor. Kalanların 7’sinde ortam bilgisi hiç yazılmamış, 4’ünde ortam yazılı ama değeri koşumdan koşuma değişiyor. Yeniden üretilebilirlik, adımların yazılmış olmasıyla bitmiyor; adımların aynı koşullarda yürütülebilir olmasını da gerektiriyor.
Tamamlamanın Bedeli ve Yeniden Test
// kapanis.mjs — eksik alanlari tamamlamanin bedeli ve yeniden test turunda // kac bulgunun "kapandi" denebildigi. import { KAYIT, ALAN, tamAdim, yenidenUretilir } from "./rapor.mjs"; const N = KAYIT.length; const dk = (ad) => ALAN.find((a) => a.ad === ad).dakika; const ZORUNLU = ALAN.filter((a) => a.zorunlu).map((a) => a.ad); const eksikDakika = (alanlar) => KAYIT.reduce((a, k) => a + alanlar.filter((ad) => !k.dolu[ad]).reduce((s, ad) => s + dk(ad), 0), 0); // Bir bulgu ancak yeniden uretilebiliyorsa ve beklenen davranisi yaziliysa // yeniden test turunda "kapandi" denebilir. const kapanir = (k) => yenidenUretilir(k) && k.dolu["beklenen davranis"]; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yz = gen([28, 12, 11, 18, 16]); const ADIMLAR = [ ["bugunku rapor", [], (k) => yenidenUretilir(k), kapanir], ["zorunlu alanlar tamamlanir", ZORUNLU, (k) => k.dolu["ortam bilgisi"] && !k.degisken, (k) => k.dolu["ortam bilgisi"] && !k.degisken && k.dolu["beklenen davranis"]], ["ortam bilgisi de yazilir", [...ZORUNLU, "ortam bilgisi"], (k) => !k.degisken, (k) => !k.degisken && k.dolu["beklenen davranis"]], ["beklenen davranis da yazilir", [...ZORUNLU, "ortam bilgisi", "beklenen davranis"], (k) => !k.degisken, (k) => !k.degisken], ]; console.log(`${N} bulgu; eksik alan yazimi kayit basina alan suresi kadar ek yuk getiriyor`); console.log(yz(["tamamlama adimi", "ek dakika", "ek saat", "yeniden uretilir", "kapandi denir"])); for (const [ad, alanlar, u, kap] of ADIMLAR) { const d = eksikDakika(alanlar); console.log(yz([ad, d, (d / 60).toFixed(1), KAYIT.filter(u).length, KAYIT.filter(kap).length])); } const degisken = KAYIT.filter((k) => k.degisken).length; console.log(`butun alanlar yazilsa bile ${degisken} bulgu ortam degiskeni tasidigi icin ` + `adim adim yeniden uretilemiyor; bunlar icin kanit kaydinin kendisi tek dayanaktir`); // Duzeltme onerisi sinifi: kac kalem dogrudan uygulanabilir. const SINIF = ["dogrudan", "karar gerektiren", "yapisal", "yok"]; const y2 = gen([20, 9, 18, 16, 18]); console.log("\n" + y2(["oneri sinifi", "bulgu", "yeniden uretilir", "kapandi denir", "ek karar gerekir"])); for (const s of SINIF) { const l = KAYIT.filter((k) => k.oneri === s); console.log(y2([s, l.length, l.filter(yenidenUretilir).length, l.filter(kapanir).length, s === "dogrudan" || s === "yok" ? 0 : l.length])); } console.log(`\n${N} bulgunun ${KAYIT.filter((k) => k.oneri === "dogrudan").length}'inde oneri ` + `dogrudan uygulanabilir; ${KAYIT.filter((k) => k.oneri === "karar gerektiren" || k.oneri === "yapisal").length}'i duzeltmeden once ayri bir karar gerektiriyor, ` + `${KAYIT.filter((k) => k.oneri === "yok").length}'inde oneri hic yok`); console.log(`yeniden test turunda kapandi denebilecek bulgu ${KAYIT.filter(kapanir).length}; ` + `adim kumesi tam olan ${KAYIT.filter(tamAdim).length} bulgunun bile bir bolumu bu esigi ` + `gecmiyor`);
61 bulgu; eksik alan yazimi kayit basina alan suresi kadar ek yuk getiriyor tamamlama adimi ek dakika ek saat yeniden uretilir kapandi denir bugunku rapor 0 0.0 8 3 zorunlu alanlar tamamlanir 251 4.2 27 14 ortam bilgisi de yazilir 347 5.8 49 25 beklenen davranis da yazilir 564 9.4 49 49 butun alanlar yazilsa bile 12 bulgu ortam degiskeni tasidigi icin adim adim yeniden uretilemiyor; bunlar icin kanit kaydinin kendisi tek dayanaktir oneri sinifi bulgu yeniden uretilir kapandi denir ek karar gerekir dogrudan 29 5 1 0 karar gerektiren 12 1 1 12 yapisal 10 1 1 10 yok 10 1 0 0 61 bulgunun 29'inde oneri dogrudan uygulanabilir; 22'i duzeltmeden once ayri bir karar gerektiriyor, 10'inde oneri hic yok yeniden test turunda kapandi denebilecek bulgu 3; adim kumesi tam olan 19 bulgunun bile bir bolumu bu esigi gecmiyor
İlk satır bu kursun en keskin sayısını veriyor: bugünkü rapordaki 61 bulgunun 3’ü yeniden test turunda kapandı denebilir durumdadır. Kalan 58 bulgu için düzeltme uygulandıktan sonra “işe yaradı mı” sorusuna yanıt verecek bir dayanak yoktur; düzeltme yapılır, kaynak harcanır ve sonuç ölçülemez.
Merdivenin geri kalanı bu boşluğun fiyatını yazıyor. Zorunlu alanları tamamlamak 251 dakika, yani 4,2 saat tutuyor ve kapandı denebilen bulguyu 14’e çıkarıyor. Ortam bilgisi de yazıldığında toplam 5,8 saatte 25 bulguya, beklenen davranış da yazıldığında 9,4 saatte 49 bulguya ulaşılıyor. Önceki dersin düzeltme bütçesi 40 adam-gündü; 9,4 saat, o bütçenin yaklaşık yüzde üçüdür. Rapor yazımı bir ek yük olarak görüldüğünde kesilen ilk kalem olur, oysa kesilen şey düzeltme bütçesinin ölçülebilirliğidir.
12 bulgu bu merdivenin dışında kalıyor. Bunlarda ortam değişkeni vardır ve bütün alanlar yazılsa bile adım adım yeniden üretim aynı sonucu vermez. Bu kayıtlar için tek dayanak, gözlem anında alınmış kanıt kaydının kendisidir: hangi kimlikle saklandığı, ne zaman alındığı ve bütünlüğünün nasıl gösterildiği. Yeniden üretilemeyen bir bulgu rapordan silinmez; “ortama bağlı” etiketiyle ve kanıt kimliğiyle durur. Bu, kanıt kimliği alanının niçin en ucuz alanlardan biri olduğu halde en çok eksik kalan zorunlu alan olmasını da açıklıyor: yazması üç dakika sürer, ama yazılmadığında hem adım kümesini bozar hem de ortama bağlı bulguların tek dayanağını ortadan kaldırır. Kayıtta yalnız bir kimlik dizesi durur; o kimliğin gösterdiği kanıtın nerede saklandığı ve nasıl doğrulanacağı ayrı bir kalemdir.
İkinci tablo iki ekseni birbirinden ayırıyor. Düzeltme önerisi 29 bulguda doğrudan uygulanabilir durumdadır, ama bu 29’un yalnız 5’i yeniden üretilebiliyor ve yalnız 1’i kapandı denebiliyor. Öneri niteliği ile kanıt niteliği bağımsız iki eksendir: iyi yazılmış bir öneri, doğrulanamayan bir bulguya bağlıysa uygulanır ama sonucu ölçülemez. Ters durum da vardır — 10 bulguda hiç öneri yoktur ve bunlar düzeltme kuyruğuna girdiklerinde ilk adımda durur.
Kalan 22 bulgu düzeltmeden önce ayrı bir karar gerektiriyor: 12’sinde öneri bir seçim sunuyor, 10’unda yapısal bir değişiklik gerekiyor. Bu ayrımın raporda yazılı olması, düzeltme ekibinin kuyruğu doğru sıralaması için gereklidir; “karar gerektiren” bir kalem, doğrudan uygulanabilir bir kalemle aynı sprint içine konamaz.
Özet
- Beş zorunlu alanın her biri ayrı ayrı yüksek oranda dolu olduğu halde beşi birlikte yalnız 19 kayıtta, yani yüzde 31,1’inde dolu: bağımsız eksiklikler toplanmaz, çarpılır.
- Kanıt kimliği 11 kayıtta tek eksik olan alandır ve tamamlandığında adım kümesi tam olan kayıt 19’dan 30’a çıkar; maliyeti 25 eksik kayıt için 75 dakikadır.
- Adım kümesi tam olan 19 kayıttan yalnız 8’i ikinci bir okuyucu tarafından yeniden üretilebiliyor; 7’sinde ortam bilgisi yok, 4’ünde ortam yazılı ama değeri değişken.
- Bugünkü raporda 61 bulgunun 3’ü yeniden test turunda kapandı denebilir; eksik alanların yazımı 9,4 saat tutuyor ve bu sayıyı 49’a çıkarıyor — düzeltme bütçesinin yaklaşık yüzde üçü.
- 12 bulgu ortam değişkeni taşıdığı için hiçbir durumda adım adım yeniden üretilemiyor; bunlar için tek dayanak kanıt kaydının kimliği, zamanı ve bütünlüğüdür.
- Öneri niteliği ile kanıt niteliği bağımsızdır: doğrudan uygulanabilir öneri taşıyan 29 bulgunun yalnız 1’i kapandı denebiliyor, 22 bulgu ise düzeltmeden önce ayrı bir karar gerektiriyor.
Sonraki Adım
Rapor yazıldı ve hangi bulgunun doğrulanabilir olduğu sayıldı. Bütün bu ölçüm tek bir varsayıma dayanıyordu: raporun gideceği yer bellidir ve orada bir düzeltme ekibi vardır. Bulgu kurumun kendi sözleşmeli değerlendirmesinden değil de dışarıdan geldiğinde bu varsayım düşer. O zaman kime, hangi kanaldan ve ne kadar süre içinde bildirileceği; düzeltmenin ne kadar bekleneceği ve bulgunun ne zaman yayımlanabileceği ayrı bir sürecin konusu olur. Sonraki ders sorumlu açıklamayı süre ve adım olarak ölçer ve kursu kapatır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.