Ders 16 / 18
Etki Değerlendirmesi
61 kanıtlanmış bulgu önce teknik ağırlıkla, sonra iki ayrı iş bağlamında puanlanıyor. İki iş sıralaması arasında aynı sırada kalan tek bulgu yok, ortalama kayma 22,23 sıra ve ilk on listeleri ortak tek bulgu içermiyor; ikili karşılaştırmaların yüzde 41,6'sı ters dönüyor. 40 adam-günlük bütçede teknik sıralama 12 bulgu düzeltip saha bağlamının yüzde 24,6'sını kapatırken kendi sırası yüzde 28,8'ini kapatıyor, iş puanını düzeltme gününe bölen sıralama ise yüzde 39,4'ünü.
İçindekiler
Bir önceki ders 61 kanıt, 9 askıda aday ve doğrulanmadan bırakılmış bir liste üretti. Bu küme bir düzeltme kuyruğuna girecekse sıraya konmak zorundadır. Sıralama teknik ölçütlerle yapılabilir: açığa dışarıdan mı yoksa ancak içeriden mi ulaşılıyor, kaç kalemi etkiliyor, ne kadar yetki kazandırıyor. Bu üç ölçüt tek bir sayı verir ve o sayı bir sıra üretir.
Bu ders o sıranın tek sıra olmadığını gösterir. Aynı bulgu, hangi işi taşıyan bir varlıkta durduğuna göre farklı ağırlık taşır, ve “hangi iş önemlidir” sorusunun yanıtı kuruma göre değişir. İş etkisi (business impact), bulgunun teknik ağırlığının o varlığın taşıdığı işle çarpılmasıdır. Ölçülecek şey iki puanlamanın hangisinin doğru olduğu değil, aynı listeyi kaç sırada farklı dizdikleridir.
- TS19. Bulgu kümesi önceki dersin 61 kanıtıdır ve her bulgu beş varlık sınıfından birine bağlıdır. Küme de ağırlıklar da kurgudur.
- TS20. Teknik puan üç bileşenden gelir: erişim düzeyi (ağırlık 0,45), etki genişliği (0,30) ve kazanılan yetki (0,25). Sonuç 0 ile 10 arasına ölçeklenir.
- TS21. İş ağırlığı, bir varlık sınıfının o bağlamdaki değeridir. İki bağlam tanımlıdır: gelir ve abone verisi önceliği ile saha kesintisizliği önceliği.
- TS22. İş puanı, teknik puan ile iş ağırlığının çarpımıdır. Aynı bulgu iki bağlamda iki ayrı iş puanı taşır ve teknik puanı ikisinde de aynı kalır.
- TS23. İki sıralamanın farkı dört ölçüyle yazılır: aynı sırada kalan bulgu sayısı, ortalama sıra kayması, ilk on listesinin ortak üyesi ve ters düşen ikili karşılaştırma oranı.
- TS24. Düzeltme bütçesi 40 adam-gündür ve bütün küme 286 adam-gün tutar. Kuyruk sıradan alır, bütçeye sığmayan bulguyu atlar.
Bir Liste, Üç Sıra
// puan.mjs — ayni kanitlanmis bulgu kumesi teknik agirlikla ve iki ayri is // baglaminda puanlanir. MODELDIR; bulgu kumesi ve agirliklar kurgudur. export const TOHUM = 20260222, N = 61; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); // Bir onceki dersin 61 kaniti. Her bulgu bir varlik sinifina baglidir. export const VARLIK = ["abone verisi", "faturalama", "olcum dogrulugu", "saha operasyonu", "ic yonetim"]; const ERISIM = { dis: 1.0, kimlik: 0.6, ic: 0.3 }; export const BULGU = Array.from({ length: N }, (_, i) => { const e = ["dis", "kimlik", "ic"][Math.floor(r() * 3)]; const genislik = Math.round(r() * 18) / 20, yetki = Math.round(r() * 20) / 20; return { no: i + 1, varlik: VARLIK[Math.floor(r() * VARLIK.length)], erisim: e, genislik, yetki, gun: 1 + Math.floor(r() * 8), // duzeltme maliyeti (adam-gun) teknik: +(10 * (0.45 * ERISIM[e] + 0.30 * genislik + 0.25 * yetki)).toFixed(2) }; }); // Is agirligi: bir varlik sinifinin o baglamdaki agirligi. Ayni bulgu, ayni teknik // puanla, iki baglamda farkli is etkisi tasir. export const BAGLAM = { "gelir ve abone verisi": { "abone verisi": 1.0, "faturalama": 0.9, "olcum dogrulugu": 0.6, "saha operasyonu": 0.35, "ic yonetim": 0.3 }, "saha kesintisizligi": { "abone verisi": 0.4, "faturalama": 0.45, "olcum dogrulugu": 0.85, "saha operasyonu": 1.0, "ic yonetim": 0.5 }, }; export const isPuan = (b, ad) => +(b.teknik * BAGLAM[ad][b.varlik]).toFixed(2); // Siralama: puana gore azalan; esitlikte bulgu numarasi. export const sirala = (anahtar) => [...BULGU] .sort((a, b) => anahtar(b) - anahtar(a) || a.no - b.no).map((b) => b.no); export const yer = (s) => new Map(s.map((no, i) => [no, i + 1])); // Iki siralama arasindaki fark: ayni sirada kalan, ortalama kayma, en buyuk kayma, // ilk on ortak ve ters cift orani. export function fark(s1, s2) { const y1 = yer(s1), y2 = yer(s2); const kayma = s1.map((no) => Math.abs(y1.get(no) - y2.get(no))); const ilk10 = new Set(s1.slice(0, 10)); let ters = 0, cift = 0; for (let i = 0; i < s1.length; i++) for (let j = i + 1; j < s1.length; j++) { cift++; if ((y1.get(s1[i]) - y1.get(s1[j])) * (y2.get(s1[i]) - y2.get(s1[j])) < 0) ters++; } return { ayni: kayma.filter((k) => k === 0).length, enBuyuk: Math.max(...kayma), ort: kayma.reduce((a, k) => a + k, 0) / kayma.length, ortak10: s2.slice(0, 10).filter((no) => ilk10.has(no)).length, ters: +(100 * ters / cift).toFixed(1) }; } 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 ADLAR = Object.keys(BAGLAM); const y1 = gen([18, 8, 12, 23, 21]); console.log(`model (tohum ${TOHUM}): ${N} kanitlanmis bulgu, ${VARLIK.length} varlik sinifi`); console.log("\n" + y1(["varlik sinifi", "bulgu", "ort teknik", ...ADLAR])); for (const v of VARLIK) { const l = BULGU.filter((b) => b.varlik === v); const ot = l.reduce((a, b) => a + b.teknik, 0) / l.length; console.log(y1([v, l.length, ot.toFixed(2), ...ADLAR.map((ad) => BAGLAM[ad][v].toFixed(2))])); } const sT = sirala((b) => b.teknik), sA = sirala((b) => isPuan(b, ADLAR[0])); const sB = sirala((b) => isPuan(b, ADLAR[1])); const y2 = gen([24, 10, 12, 12, 14, 13]); console.log("\n" + y2(["karsilastirma", "ayni sira", "ort kayma", "en buyuk", "ilk 10 ortak", "ters cift %"])); for (const [ad, x, y] of [["teknik - gelir baglami", sT, sA], ["teknik - saha baglami", sT, sB], ["gelir - saha baglami", sA, sB]]) { const f = fark(x, y); console.log(y2([ad, f.ayni, f.ort.toFixed(2), f.enBuyuk, `${f.ortak10}/10`, f.ters])); } const yT = yer(sT), yA = yer(sA), yB = yer(sB); const y3 = gen([8, 18, 9, 8, 9, 9, 9]); console.log("\n" + y3(["bulgu", "varlik", "teknik", "sira T", "sira A", "sira B", "A-B fark"])); const ilgi = [...BULGU].sort((a, b) => Math.abs(yA.get(b.no) - yB.get(b.no)) - Math.abs(yA.get(a.no) - yB.get(a.no))).slice(0, 6); for (const b of ilgi) { console.log(y3([b.no, b.varlik, b.teknik.toFixed(2), yT.get(b.no), yA.get(b.no), yB.get(b.no), yA.get(b.no) - yB.get(b.no)])); } }
model (tohum 20260222): 61 kanitlanmis bulgu, 5 varlik sinifi varlik sinifi bulgu ort teknik gelir ve abone verisi saha kesintisizligi abone verisi 16 5.06 1.00 0.40 faturalama 13 5.37 0.90 0.45 olcum dogrulugu 14 5.77 0.60 0.85 saha operasyonu 5 5.24 0.35 1.00 ic yonetim 13 5.94 0.30 0.50 karsilastirma ayni sira ort kayma en buyuk ilk 10 ortak ters cift % teknik - gelir baglami 2 14.79 39 5/10 31.3 teknik - saha baglami 1 10.00 30 2/10 20.6 gelir - saha baglami 0 22.23 43 0/10 41.6 bulgu varlik teknik sira T sira A sira B A-B fark 6 saha operasyonu 6.40 21 47 4 43 17 saha operasyonu 7.05 17 42 2 40 16 saha operasyonu 3.60 51 58 21 37 33 saha operasyonu 7.50 10 38 1 37 34 abone verisi 5.22 37 13 46 -33 31 abone verisi 5.28 33 12 44 -32
İlk tablonun son iki sütunu bu dersin asıl konusudur. Aynı varlık sınıfı, iki bağlamda 0,30 ile 1,00 arasında değişen bir ağırlık taşıyor ve ağırlıklar ortalama teknik puanla hiç ilişkili değil. En dikkat çeken satır iç yönetim: ortalama teknik puanı 5,94 ile listenin en yükseği, ama iki bağlamda da en düşük ağırlıklardan birini taşıyor. Teknik sıralamada en üste çıkan kalemler, iş tarafında en alta düşebilir.
İkinci tablo bunun sayısal karşılığıdır. İki iş bağlamı karşılaştırıldığında 61 bulgunun hiçbiri aynı sırada kalmıyor, ortalama sıra kayması 22,23 ve en büyük kayma 43 sıradır. İlk on listeleri ortak tek bir bulgu içermiyor. İkili karşılaştırmaların yüzde 41,6’sı ters dönüyor, yani iki bulguyu alıp “hangisi daha önemli” diye sorduğunda iki bağlam neredeyse her iki soruda bir ayrı yanıt veriyor.
Teknik sıralamanın iki bağlama uzaklığı ise eşit değil: gelir bağlamıyla ilk on listesinde 5, saha bağlamıyla 2 ortak bulgu var; ters ikili oranı yüzde 31,3’e karşı yüzde 20,6. Bağlamsız sunulan bir sıralama bağlamsız değildir; sessizce bir bağlam seçmiştir ve hangi bağlamı seçtiği raporda yazmaz.
Bu, ağırlık tablosunun kim tarafından doldurulacağı sorusunu doğuruyor. Test ekibi teknik puanı kendi ölçtüğü verilerden çıkarabilir, ama bir varlık sınıfının kurum için ne kadar değerli olduğunu ölçemez; o sayı iş tarafından gelir. Buradan çıkan kural biçimseldir: rapor tek bir sıralanmış liste değil, teknik puan, varlık sınıfı ve ağırlık tablosu birlikte verilmelidir. Ağırlıklar yazılıysa sıralama yeniden üretilebilir; yazılı değilse liste, gerekçesi görünmeyen bir karardır.
Üçüncü tablo tek tek kalemleri gösteriyor. Bulgu 33, saha bağlamında birinci sırada duruyor; teknik sıralamada 10., gelir bağlamında 38. sırada. Bulgu 6 saha bağlamında 4., gelir bağlamında 47. sırada — 43 sıralık bir fark. Bunlar bir puanlama hatası değil, iki farklı sorunun iki farklı yanıtıdır.
Bütçe Altında Sıralamanın Bedeli
// butce.mjs — sinirli duzeltme butcesi altinda hangi siralamanin ne kapattigi. import { BULGU, BAGLAM, isPuan, sirala } from "./puan.mjs"; const BUTCE = 40; // duzeltme butcesi (adam-gun, kurgu) const ADLAR = Object.keys(BAGLAM); const kayit = new Map(BULGU.map((b) => [b.no, b])); const toplam = (ad) => BULGU.reduce((a, b) => a + isPuan(b, ad), 0); // Butce bitene kadar siradan al; sigmayan bulgu atlanir. function kuyruk(siraliNo) { const secilen = []; let gun = 0; for (const no of siraliNo) { const b = kayit.get(no); if (gun + b.gun <= BUTCE) { secilen.push(b); gun += b.gun; } } return { secilen, gun }; } const YOL = [["teknik agirlik", sirala((b) => b.teknik)], ["gelir baglami", sirala((b) => isPuan(b, ADLAR[0]))], ["saha baglami", sirala((b) => isPuan(b, ADLAR[1]))], ["gelir verimi", sirala((b) => isPuan(b, ADLAR[0]) / b.gun)], ["saha verimi", sirala((b) => isPuan(b, ADLAR[1]) / b.gun)]]; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yz = gen([17, 12, 7, 24, 22]); console.log(`butce ${BUTCE} adam-gun; ${BULGU.length} bulgunun tamami ` + `${BULGU.reduce((a, b) => a + b.gun, 0)} adam-gun tutuyor`); console.log(yz(["siralama", "duzeltilen", "gun", `${ADLAR[0]} %`, `${ADLAR[1]} %`])); const sonuc = {}; for (const [ad, s] of YOL) { const { secilen, gun } = kuyruk(s); const kapanan = ADLAR.map((x) => 100 * secilen.reduce((a, b) => a + isPuan(b, x), 0) / toplam(x)); sonuc[ad] = kapanan; console.log(yz([ad, secilen.length, gun, kapanan[0].toFixed(1), kapanan[1].toFixed(1)])); } // Yanlis eksende siralamanin bedeli: her baglamda kendi sirasi ile teknik siralama // arasindaki kapanan is etkisi farki. const y2 = gen([24, 14, 18, 14]); console.log("\n" + y2(["baglam", "teknik ile", "kendi sirasi ile", "kayip puan"])); for (const [i, ad] of ADLAR.entries()) { const t = sonuc["teknik agirlik"][i], k = sonuc[i === 0 ? "gelir baglami" : "saha baglami"][i]; console.log(y2([ad, `${t.toFixed(1)}%`, `${k.toFixed(1)}%`, `${(k - t).toFixed(1)} puan`])); } const enUst = [sirala((b) => isPuan(b, ADLAR[0]))[0], sirala((b) => isPuan(b, ADLAR[1]))[0]]; const yerT = new Map(sirala((b) => b.teknik).map((no, i) => [no, i + 1])); for (const [i, no] of enUst.entries()) { const b = kayit.get(no); console.log(`${ADLAR[i]} baglaminda birinci sirada olan bulgu ${no} (${b.varlik}, ` + `teknik ${b.teknik.toFixed(2)}) teknik siralamada ${yerT.get(no)}. sirada`); }
butce 40 adam-gun; 61 bulgunun tamami 286 adam-gun tutuyor siralama duzeltilen gun gelir ve abone verisi % saha kesintisizligi % teknik agirlik 12 40 27.0 24.6 gelir baglami 9 40 28.8 14.1 saha baglami 9 40 14.5 28.8 gelir verimi 18 40 40.8 31.3 saha verimi 20 40 33.9 39.4 baglam teknik ile kendi sirasi ile kayip puan gelir ve abone verisi 27.0% 28.8% 1.8 puan saha kesintisizligi 24.6% 28.8% 4.2 puan gelir ve abone verisi baglaminda birinci sirada olan bulgu 10 (abone verisi, teknik 9.57) teknik siralamada 1. sirada saha kesintisizligi baglaminda birinci sirada olan bulgu 33 (saha operasyonu, teknik 7.50) teknik siralamada 10. sirada
Bütçe 61 bulgunun yalnız yedide birini karşılıyor, ve tablo bu darlıkta sıralamanın ne kadar iş yaptığını gösteriyor. İlk üç satır aynı 40 günü üç ayrı biçimde harcıyor. Saha bağlamı kendi sırasıyla kendi etkisinin yüzde 28,8’ini kapatırken gelir sırasıyla yalnız yüzde 14,1’ini kapatıyor: yanlış eksenle sıralamak, aynı bütçeyi yarı verimle harcamak demektir.
Teknik sıralamanın iki bağlama bedeli de eşit değil. Gelir bağlamında kendi sırasına göre 1,8 puan, saha bağlamında 4,2 puan geride kalıyor. Teknik ağırlık “yansız” görünür, ama yansızlığı bir bağlama iki katı kadar pahalıya patlıyor.
Son iki satır tek başına daha ilginçtir. İş puanını düzeltme gününe bölen sıralama aynı 40 günde 18 ve 20 bulgu kapatıyor ve her iki bağlamda da öteki üç sıralamayı geçiyor — gelir bağlamında yüzde 40,8, saha bağlamında yüzde 39,4. Nedeni tabloda görünüyor: saf iş etkisiyle sıralamak bütçeyi dokuz pahalı kaleme yatırıyor, maliyete bölmek ise aynı bütçeye iki katından fazla kalem sığdırıyor. Bir raporun “kritik” etiketli ilk on kalemi, düzeltme maliyeti yazılmadığında bu karşılaştırmayı olanaksız kılar.
Son iki satırın gösterdiği bir başka şey de sıralamaların hepsinin aynı yerde başlamadığıdır: gelir bağlamının birinci kalemi teknik sıralamada da birincidir, saha bağlamının birinci kalemi ise teknik sıralamada onuncudur. Rapor tek bir sıra dayattığında bu ikinci kalemin dokuz sıra geride kalması bir karar değil, bir yan etkidir.
Özet
- Aynı 61 bulgu iki iş bağlamında puanlandığında aynı sırada kalan tek bulgu yok; ortalama sıra kayması 22,23, en büyük kayma 43 sıra ve ilk on listeleri ortak üye içermiyor.
- İkili karşılaştırmaların yüzde 41,6’sı iki bağlam arasında ters dönüyor; teknik sıralamanın bağlamlara uzaklığı ise eşit değil (5/10 ve 2/10 ortak), yani bağlamsız bir sıra sessizce bir bağlam seçmiştir.
- İş ağırlığı ile teknik puan ilişkili değildir: iç yönetim sınıfı 5,94 ile en yüksek ortalama teknik puana sahipken iki bağlamda da en düşük ağırlıklardan birini taşıyor.
- 40 adam-günlük bütçede saha bağlamı kendi sırasıyla etkisinin yüzde 28,8’ini, gelir sırasıyla yüzde 14,1’ini kapatıyor; yanlış eksenle sıralamak aynı bütçeyi yarı verimle harcatıyor.
- Teknik sıralama gelir bağlamında 1,8, saha bağlamında 4,2 puan geride kalıyor: yansız görünen eksenin bedeli bağlama göre iki kat değişiyor.
- İş puanını düzeltme gününe bölen sıralama aynı bütçede 18–20 bulgu kapatıp her iki bağlamda da öteki sıralamaları geçiyor; düzeltme maliyeti yazılmayan bir liste bu karşılaştırmayı olanaksız kılar.
Sonraki Adım
Bulgular kanıtlandı ve iki ayrı eksende sıraya kondu. Sıradaki kalem ise bir düzeltme ekibine gidecek, ve o ekip bulguyu ilk kez okuyacak. Elde kanıt olması, o kanıtın karşı tarafta yeniden görülebileceği anlamına gelmez: hangi ön koşulla, hangi girdiyle ve hangi ortamda gözlendiği yazılmamışsa düzeltmenin doğrulanması da olanaksızdır. Sonraki ders raporu yeniden üretilebilirlik cinsinden ölçer: kaç bulgu adım adım yeniden üretilebiliyor, kaçı ortama bağlı kalıyor ve düzeltme önerisinin kaç kalemi doğrudan uygulanabilir durumda.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.