İçeriğe geç
academia.sh

Ders 11 / 11

Kök Neden Çözümlemesi

Yinelenen kusur sınıfının kaynağına inilmesi: neden zincirinin bir veri yapısı olarak kurulması, belirtiyi düzelten müdahale ile nedeni düzelten müdahalenin aynı kusur kümesinde karşılaştırılması, zincirde derinleştikçe kapsamın büyüyüp uygulanabilirliğin düşmesi ve inceleme eşiğinin kaynağı.

İçindekiler

Göstergeler bir sınıfın tekrar tekrar geldiğini sayar ama nedenini söylemez. Sekiz şema uyuşmazlığı ayrı ayrı düzeltildiyse, sekizin altında tek bir ortak neden olup olmadığı hiçbir göstergede görünmez. Aynı sınıfın yinelenmesi bir kusur değil bir belirtidir.

Kök neden çözümlemesi (root cause analysis) belirtiden nedene inen yöntemdir. Aracı neden zinciridir (causal chain): bir kusurdan başlayıp her adımda “bu neden oldu” diye sorarak ilerleyen halkalar dizisi — yaygın adıyla beş neden (five whys). Zincirin bir yerinde durulur ve orada bir eylem yazılır. Belirtiyi kapatan eyleme düzeltici eylem (corrective action), sınıfın yinelemesini kesen eyleme önleyici eylem (preventive action) denir. Bu dersin sorusu, zincirde nerede durulacağıdır; dağıtılan kaynak inceleme saatidir.

Zincir Bir Veri Yapısıdır

Zincirin ilk iki halkası kusur sınıfına özgüdür: bu kusur neden oluştu, o neden neden vardı. Üçüncüden sonrası paylaşılır — birkaç sınıf aynı süreç eksiğinden beslenir. Derinleştikçe düğüm sayısı azalır, düğüm başına sınıf artar. Buna karşılık derin bir halka ekibin denetiminden çıkar: kodda değil, örgütte değişecek bir şey olur.

TS24 (varsayım) — bir halkayı incelemek 25 dakika sürer, ufuk boyunca inceleme bütçesi 400 dakikadır ve inceleme derinlik başına bir sürüm gecikmeyle yürürlüğe girer. Bütçenin kaynağı Kalite Göstergeleri dersindeki dönemlik 120 dakikalık dikkattir. TS25 (varsayım) — halka k’deki önleyici eylemin bedeli 60, 240, 720 ve 2.400 dakikadır; derin halka daha çok tarafı ilgilendirir. TS26 (varsayım) — eylemin uygulanabilirlik payı derinlikle düşer: 0,90 / 0,70 / 0,40 / 0,00. Beşinci halka ekibin dışındadır. TS27 (varsayım) — kök neden eşiği 3 yinelemedir. Eşiğin kaynağı bir ölçümdür: sınıf başına yineleme ortalaması 60/14 = 4,29’dur, eşik 3 bunun bir basamak altını da kapsar.

// kutuphane/kusurlar.mjs — birinci dersin kusur kumesi, aynen (tohum 20260731, 60 kusur,
// 14 sinif). Bu ders envanterin bedel sutunlarini kullanmaz, yalniz kusur kumesini kullanir.
const AGIRLIK = [["kural-siniri", 9], ["sema-uyusmazligi", 6], ["goc-veri-kaybi", 4],
  ["sozlesme-alani", 5], ["arayuz-durumu", 8], ["gorsel-sapma", 3], ["veri-buyumesi", 4],
  ["sql-birlestirme", 3], ["bilinen-acik", 3], ["erisilebilirlik", 4], ["bozulmus-yanit", 3],
  ["kurtarma-eksigi", 2], ["senaryo-disi", 5], ["anlam-sapmasi", 4]];
export function kusurlar(tohum, n) {
  let x = tohum;
  const rast = () => { x = (1103515245 * x + 12345) % 2147483648; return x / 2147483648; };
  const toplam = AGIRLIK.reduce((a, [, w]) => a + w, 0);
  const liste = [];
  for (let i = 1; i <= n; i += 1) {
    let p = rast() * toplam, sinif = AGIRLIK[AGIRLIK.length - 1][0];
    for (const [s, w] of AGIRLIK) { p -= w; if (p < 0) { sinif = s; break; } }
    liste.push({ no: i, sinif, olasilik: 1 + Math.floor(rast() * 5),
      etki: 1 + Math.floor(rast() * 5), duzeltme: 15 + 15 * Math.floor(rast() * 8) });
  }
  return liste;
}

Beş Müdahale, Aynı Kusur Kümesi

Model yirmi sürüm yürür. Bir sınıf eşik kadar yinelediğinde k. halkası için bir inceleme açılır; bittiğinde o düğümün beslediği bütün sınıfların yinelemesi uygulanabilirlik payınca kesilir. M1 hiç inceleme açmaz.

// kutuphane/kok.mjs — neden zincirini bir veri yapisi olarak kurar ve belirtiyi duzelten
// mudahaleyi nedeni duzeltenle ayni kusur kumesinde karsilastirir. Girdi: kutuphane/kusurlar.mjs
import { kusurlar } from "./kusurlar.mjs";

const TOHUM = 20260731, N = 60, ADAY = 20, PAY = N / ADAY, KAT = 6;   // TS5, TS6
const INCELEME = 25, BUTCE = 400;           // TS24: halka basina inceleme dk, ufkun inceleme butcesi
const BEDEL = [0, 0, 60, 240, 720, 2400];   // TS25: halka k'deki onleyici eylemin bedeli
const UYG = [0, 0, 0.9, 0.7, 0.4, 0];       // TS26: eylemin uygulanabilirlik payi
const v = (x, n = 2) => x.toFixed(n).replace(".", ",");
const g = (x, n) => String(x).padStart(n);

// Neden zinciri: ilk iki halka sinifa ozgudur, ucuncuden sonrasi siniflar arasinda paylasilir.
// Derinlestikce dugum sayisi azalir, cunku ayni neden daha cok sinifi besler.
const G3 = {}, G4 = {};
for (const [neden, alt] of [
  ["sema-degisikligi-gozden-gecmiyor", ["sema-uyusmazligi", "goc-veri-kaybi", "sozlesme-alani"]],
  ["sinir-degeri-yazili-degil", ["kural-siniri", "arayuz-durumu"]],
  ["taban-goruntu-guncellenmiyor", ["gorsel-sapma"]],
  ["olcek-varsayimi-yazili-degil", ["veri-buyumesi", "bozulmus-yanit", "kurtarma-eksigi"]],
  ["guvenlik-kurali-incelemede-yok", ["sql-birlestirme", "bilinen-acik", "erisilebilirlik"]],
  ["kabul-olcutu-eksik", ["senaryo-disi", "anlam-sapmasi"]]]) for (const s of alt) G3[s] = neden;
for (const [neden, alt] of [
  ["degisiklik-turune-gore-kontrol-yok", ["sema-degisikligi-gozden-gecmiyor",
    "sinir-degeri-yazili-degil", "taban-goruntu-guncellenmiyor"]],
  ["varsayim-yazili-degil", ["olcek-varsayimi-yazili-degil", "guvenlik-kurali-incelemede-yok",
    "kabul-olcutu-eksik"]]]) for (const s of alt) G4[s] = neden;
const halka = (s, k) => (k <= 2 ? `${s}#${k}` : k === 3 ? G3[s]
  : k === 4 ? G4[G3[s]] : "surec-sahibi-atanmamis");

// Ikinci dersin butceye sigan dokuz kaleminin gormedigi bes sinif uretime kacar.
const KACAR = new Set(["erisilebilirlik", "bozulmus-yanit", "kurtarma-eksigi",
  "senaryo-disi", "anlam-sapmasi"]);
const KUSUR = kusurlar(TOHUM, N);
const SINIF = [...new Set(KUSUR.map((k) => k.sinif))];

// Ufuk: ADAY surum, surum basina PAY kusur. Bir sinif esik kadar yinelediginde o sinifin
// k. halkasi icin bir inceleme acilir; inceleme derinlik basina bir surum surer (TS24) ve
// bittiginde dugumun besledigi butun siniflarin yinelemesi UYG[k] payinca kesilir.
function ufuk(derinlik, esik) {
  const sayac = new Map(), onlenmis = new Map(), acik = new Set(), bekleyen = [];
  let yineleme = 0, duzeltici = 0, onleyici = 0, inceleme = 0, kacan = 0, an = 0, gec = 0;
  for (let s = 1; s <= ADAY; s += 1) {
    for (const b of bekleyen) if (b.s === s) onlenmis.set(b.d, b.pay);
    for (const k of KUSUR.slice((s - 1) * PAY, s * PAY)) {
      const d = derinlik >= 2 ? halka(k.sinif, derinlik) : null;
      const olusum = 1 - (d ? onlenmis.get(d) || 0 : 0);
      if (olusum <= 0) continue;
      // Inceleme acilmis ama henuz yururluge girmemisse yineleme gecikmede sayilir.
      if (d && acik.has(d) && onlenmis.has(d) === false) gec += olusum;
      yineleme += olusum;
      duzeltici += olusum * k.duzeltme;
      if (KACAR.has(k.sinif)) kacan += olusum;
      const c = (sayac.get(k.sinif) || 0) + olusum;
      sayac.set(k.sinif, c);
      if (derinlik >= 2 && c >= esik && acik.has(d) === false) {
        acik.add(d);
        inceleme += INCELEME * derinlik;
        onleyici += BEDEL[derinlik];
        bekleyen.push({ d, s: s + derinlik - 1, pay: UYG[derinlik] });
        an += s + derinlik - 1;
      }
    }
  }
  const toplam = duzeltici + inceleme + onleyici + KAT * kacan * 60;   // TS5: kacan hatanin kati
  return { acilan: acik.size, inceleme, onleyici, duzeltici, yineleme, kacan, gec,
    an: acik.size ? an / acik.size : 0, toplam, sigar: inceleme <= BUTCE };
}

console.log(`kusur kumesi tohum ${TOHUM}, ${N} kusur, ${SINIF.length} sinif, ${ADAY} surum`);
const say = SINIF.map((s) => KUSUR.filter((k) => k.sinif === s).length);
console.log(`sinif basina yineleme: en az ${Math.min(...say)}, en cok ${Math.max(...say)}, ortalama ${v(N / SINIF.length)}`);

console.log("\nzincirin yapisi — derinlestikce dugum azalir, uygulanabilirlik duser");
console.log("halka  dugum  dugum basina sinif  uygulanabilirlik  onleyici dk  beklenen onlenen sinif");
for (const k of [1, 2, 3, 4, 5]) {
  const d = new Set(SINIF.map((s) => halka(s, k)));
  const kapsam = SINIF.length / d.size;
  console.log(g(k, 5) + g(d.size, 7) + g(v(kapsam), 20) + g(k >= 2 ? v(UYG[k]) : "-", 18) +
    g(k >= 2 ? BEDEL[k] : "-", 13) + g(k >= 2 ? v(kapsam * UYG[k]) : "-", 24));
}

const AD = ["M1 belirtiyi duzelt", "M2 halka 2'de dur", "M3 halka 3'te dur",
  "M4 halka 4'te dur", "M5 halka 5'te dur"];
console.log(`\nayni kusur kumesinde bes mudahale (esik TS27 = 3, inceleme butcesi TS24 = ${BUTCE} dk)`);
console.log("mudahale              acilan  inceleme  butce   onleyici  duzeltici  yineleme  gecikmede  kacan  yururluk  toplam dk");
for (let k = 1; k <= 5; k += 1) { const o = ufuk(k, 3);
  console.log(AD[k - 1].padEnd(22) + g(o.acilan, 6) + g(o.inceleme, 10) +
    g(o.sigar ? "sigar" : "asiyor", 7) + g(o.onleyici, 11) + g(v(o.duzeltici, 0), 11) +
    g(v(o.yineleme), 10) + g(v(o.gec), 11) + g(v(o.kacan), 7) +
    g(o.acilan ? v(o.an, 1) : "-", 10) + g(v(o.toplam, 0), 11));
}

console.log("\nesik TS27'nin duyarliligi — halka 3'te durulursa");
console.log("esik  acilan  inceleme dk  butce   yineleme  kacan  toplam dk");
for (const e of [2, 3, 5]) { const o = ufuk(3, e);
  console.log(g(e, 4) + g(o.acilan, 8) + g(o.inceleme, 13) + g(o.sigar ? "sigar" : "asiyor", 7) +
    g(v(o.yineleme), 10) + g(v(o.kacan), 7) + g(v(o.toplam, 0), 11));
}
kusur kumesi tohum 20260731, 60 kusur, 14 sinif, 20 surum
sinif basina yineleme: en az 1, en cok 7, ortalama 4,29

zincirin yapisi — derinlestikce dugum azalir, uygulanabilirlik duser
halka  dugum  dugum basina sinif  uygulanabilirlik  onleyici dk  beklenen onlenen sinif
    1     14                1,00                 -            -                       -
    2     14                1,00              0,90           60                    0,90
    3      6                2,33              0,70          240                    1,63
    4      2                7,00              0,40          720                    2,80
    5      1               14,00              0,00         2400                    0,00

ayni kusur kumesinde bes mudahale (esik TS27 = 3, inceleme butcesi TS24 = 400 dk)
mudahale              acilan  inceleme  butce   onleyici  duzeltici  yineleme  gecikmede  kacan  yururluk  toplam dk
M1 belirtiyi duzelt        0         0  sigar          0       4125     60,00       0,00  18,00         -      10605
M2 halka 2'de dur         12       600 asiyor        720       2870     42,00       1,00  14,40      12,5       9374
M3 halka 3'te dur          5       375  sigar       1200       2813     40,40       8,00  15,20      10,8       9860
M4 halka 4'te dur          2       200  sigar       1440       3075     44,40       7,00  15,60       8,0      10331
M5 halka 5'te dur          1       125  sigar       2400       4125     60,00      11,00  18,00       9,0      13130

esik TS27'nin duyarliligi — halka 3'te durulursa
esik  acilan  inceleme dk  butce   yineleme  kacan  toplam dk
   2       6          450 asiyor     29,90  10,30       7707
   3       5          375  sigar     40,40  15,20       9860
   5       4          300  sigar     53,00  17,30      11204

Belirti ile Neden

M1 altmış kusuru tek tek düzeltir: 4.125 dakika düzeltici eylem, altmış yineleme, on sekiz kaçan hata. Hiçbir sınıf durmaz, çünkü her müdahale yalnız o kusuru kapatır. M3 beş inceleme açar, yinelemeyi 40,40’a, kaçan hatayı 15,20’ye indirir ve düzeltici bedeli 2.813 dakikaya çeker; aradaki 1.312 dakika yazılmayan düzeltmelerdir.

Bu, önleyici eylemin bedava olduğu anlamına gelmez. M3 önleyici eyleme 1.200, incelemeye 375 dakika öder; toplamı 9.860 dakikadır ve M1’in 10.605’inden 745 dakika iyidir. Yinelemeyi kesmenin getirisi, kestiği yinelemenin kaçan hata payındadır.

M2 en düşük toplamı verir (9.374 dakika), ama on iki inceleme açar ve 600 dakika ister; TS24’ün bütçesi 400’dür. Kâğıttaki en iyi satır bütçede yoktur; sığan en ucuz müdahale M3’tür.

Derinliğin İki Yönü

Yapı tablosu derinliğin iki karşıt etkisini ayırır. Düğüm başına sınıf 1,00’dan 14,00’a çıkar — daha derin bir neden daha çok sınıfı besler — ama uygulanabilirlik 0,90’dan 0,00’a iner. İkisinin çarpımı 0,90, 1,63, 2,80 ve 0,00’dır: dördüncü halkada en yüksek, beşincide sıfır.

Yine de bu sıralama tek başına karar vermez. M4 beklenen kapsamı en yüksek halkadır ama ufukta M3’ten kötüdür (44,40 yinelemeye karşı 40,40). Nedeni gecikmedir: derinlik k, eylemin yürürlüğe girmesini k−1 sürüm geciktirir ve gecikmede yinelenen kusur M2’de 1,00, M3’te 8,00, M5’te 11,00’dır. Derine inmek yalnız pahalı değil, yavaştır; yavaşlık kendi yinelemesini üretir.

Beşinci Halkanın Bedeli

M5 bu dersin en açık sayısıdır. Tek bir inceleme açar, 125 dakika inceleme ve 2.400 dakika önleyici eylem öder, sonra hiçbir şey değişmez: yineleme 60,00, kaçan hata 18,00 — ikisi de M1’in aynısı. Toplamı 13.130 dakikadır, hiç inceleme yapmamaktan 2.525 dakika daha pahalı.

Zincir doğrudur; sorun zincirde değildir. “Süreç sahibi atanmamış” gerçekten on dört sınıfı da besler. Ama o halkada yazılan eylem ekibin uygulayabileceği bir eylem değildir ve uygulanmayan eylem sıfır kusur önler. Beş neden bir derinlik yarışı değildir: durulacak yer ekibin gerçekten değiştirebileceği son halkadır.

Eşik ve Kararın Geri Dönüşü

Eşik taraması aynı biçimi tekrarlar. Eşik 2 en düşük toplamı verir (7.707 dakika, 29,90 yineleme, 10,30 kaçan) ama altı inceleme açar ve 450 dakika ister — bütçeyi aşar. Eşik 5 sığar ama yinelemeyi 53,00’te bırakır. Eşiğin kaynağı bir gereksinim değil iki yönlü bir ölçümdür: sınıf başına ortalama yineleme alt sınırı, inceleme bütçesi üst sınırı verir.

Kararın geri dönüşü iki kuyruktur. Düzeltici eylem kaydı kapatır ve kusurun sahibinde biter. Önleyici eylem bir süreç değişikliği açar — bir inceleme adımı, bir kontrol listesi kalemi, yazılı bir varsayım — ve kapanması ekibin dışında bir onaya bağlıdır. Sahibi yazılmadan açılan kök neden kaydı, planlama konusunun sahipsiz kalemleriyle aynı sonu bulur: kâğıtta kapsanır, gerçekte koşmaz.

Özet

  • Neden zinciri bir veri yapısıdır: ilk iki halka sınıfa özgüdür, sonrası paylaşılır ve düğüm sayısı 14’ten 1’e iner.
  • Belirtiyi düzeltmek altmış yinelemeyi ve on sekiz kaçan hatayı olduğu gibi bırakır; halka 3’te durmak yinelemeyi 40,40’a, kaçan hatayı 15,20’ye indirir.
  • Derinliğin iki yönü vardır: düğüm başına sınıf 1,00’dan 14,00’a çıkarken uygulanabilirlik 0,90’dan 0,00’a iner. Derinlik ayrıca gecikmedir — gecikmede yinelenen kusur M2’de 1,00, M3’te 8,00, M5’te 11,00’dır.
  • Beşinci halkada durmak 2.525 dakikayı hiçbir şey için öder: yineleme ve kaçan hata hiç incelememekle birebir aynı kalır.
  • Eşiğin kaynağı iki yönlü bir ölçümdür: sınıf başına ortalama yineleme alt sınırı, inceleme bütçesi üst sınırı belirler.

Kurs Kapanışı

Bu kursun on bir dersi aynı biçimi izledi: sınırlı bir kaynak dağıtıldı, dağıtımın ürettiği kaçan hata ile geri bildirim süresi ölçüldü.

Ders Dağıtılan kaynak Dağıtım kararı Kaçan hata / geri bildirim süresi
Test Planı sürüm başına 120 dk test bütçesi bütçeye sığan dokuz test 18 kaçan / 16,5 dk (tam kapsam 10 / 40,8)
Risk Temelli Önceliklendirme aynı 120 dk, sıra serbest tahmin/dakika sırası 18 kaçan, kaçan risk 155 / 18,2 dk
Keşifsel Test 120 dk oturum = genişlik × derinlik dört yol, derinlik beş 10,39 kaçan / 74,8 dk
Kabul Ölçütleri ürün tarafının 300 dk dikkati on yedi anlamsal ölçüt (204 dk) 0 kaçan / kabul incelemesi aşaması
Kullanıcı Kabul Testi 600 kullanıcı dk, on iki görev kullanım payına göre 10 kaçan / 26,0 dk bulgu anı
Sürekli Tümleştirmede Test 1021 model dk koşum üç aşama ve erken kesme 5 kaçan / 228,1 dk
Test Ortamlarının Yönetimi ortam sayısı ve ortam-dakikası üretim benzeri ortam gecelik aşamaya 5 kaçan / 252,6 dk
Gizli Değer ve Veri Yönetimi test ortamına giren gizli değer kapsamı 511.800’den 1.809 kayda daraltma 5 kaçan, değişmedi / 263,5 dk
Raporlama 15 dk dikkat, açılan adım öbeklenmiş rapor 0 kök kaçtı / 255,7 dk
Kalite Göstergeleri dönem başına 120 dk dikkat karar değiştiren iki gösterge kaçak oranı %6,25 → %12,50 / 386,8 → 398,0 dk
Kök Neden Çözümlemesi ufuk boyunca 400 dk inceleme üçüncü halkada durma 15,20 kaçan / 10,8. sürümde yürürlük

Son sütunda sıfır yoktur. Bu kursun kuralı budur: her dağıtım bir kaçan hata üretir. Sınırlı bir kaynağı bölmenin bölünmemiş bir hâli yoktur; bütçeye sığan plan on sekiz kusur kaçırır, sığmayan plan zaten koşmaz. Sıfır kaçan hata isteyen bir plan bütçeyi tüketir — Keşifsel Test dersinde oturum bütçesi iki katına çıkarıldığında kaçan hata 6,27’ye inerken net bedelin eksiye düşmesi bunun sayılmış hâliydi. Bir dağıtımı savunmanın tek yolu kaçan hatasını ve geri bildirim süresini birlikte yazmaktır.

Bu kurs, Yazılım Kalitesi ve Test müfredatının beşincisi ve sonuncusuydu. Kalite ve Test Temelleri kavramı kurdu: kusur, sınıf, seviye ve kâhin. Birim Testi ve Test Odaklı Geliştirme en ucuz halkayı işledi — en hızlı koşan, en dar gören test. Tümleşim, Sözleşme ve Uçtan Uca Test gerçek sınırları çalıştırdı ve sahtenin gerçeğe uyup uymadığını sordu. İşlevsel Olmayan Test yük, saldırı ve arıza altındaki davranışı eşiklerle sınadı. Bu kurs hepsinin zaman ve dikkat içindeki yerini belirledi: hangi test ne zaman koşar, kırmızı ne karar üretir. Ortak sonuç tek cümlededir — bir test kümesi ancak bir bütçe içinde anlamlıdır ve o bütçeyi bölen karar okuyanın kendi ekibinde verilir. Buradaki sayılar o kararın biçimini gösterir, yerini almaz.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat