İçeriğe geç
academia.sh

Ders 11 / 17

Politika, Standart ve Yordam

Belge hiyerarşisinin kanıt üretimi ekseninde ayrılması: 26 belgenin yalnız 10'unun denetimde kanıt üretmesi ve 9'unun ölçülebilir eşik taşımaması, 15 gereksinim zincirinin 9'unun tam olması ve 11'inin kanıtlanabilmesi, politikasız iki zincirin kayıt üreten yordamı sayesinde kanıtlanabilir kalması, eksik halkaları tamamlamanın 104 adam-günü kanıt kazandırırken 14 adam-günü yalnız görünüşü düzeltmesi ve belge sayısı ile kanıt üretimi sıralamalarının ayrışması.

İçindekiler

Önceki dersin son iki tablosunda ölçülen her şey bir belgeye dayanıyordu: envanter bir belgedir, saklama süresi bir belgede yazar, talep akışının adımları bir belgede tanımlıdır. Buraya kadar belgeler tek bir kütle gibi ele alındı. Denetim açısından ise aralarında keskin bir fark vardır ve bu ders o farkı ölçer.

Belge hiyerarşisi üç düzeylidir. Politika niyeti ve sorumluluğu bildirir; kimin neyi sahiplendiğini söyler, ölçülebilir bir eşik vermez. Standart eşiği verir: bir sayı, bir süre, bir yapılandırma değeri. Yordam adım adım bir işi tanımlar ve her koşumunda bir kayıt üretir. Kanıt yalnız son düzeyden çıkar. Bir mimari kuralı koşturulabilir bir denetime çevirmenin bedeli M20/K04’te ölçülmüştü; buradaki soru başkadır — denetçi karşısında hangi belge düzeyi bir kalem olarak sayılır, hangisi yalnız okunup geçilir.

  • CE33. Belge kümesi 26 kalemdir ve sekiz konu alanına dağılmıştır. Belgeler, kayıt sayıları ve yaşlar kurgudur.
  • CE34. Her belgenin bir düzeyi (politika, standart, yordam), ölçülebilir eşik taşıyıp taşımadığı, dönemde ürettiği kayıt sayısı ve son güncellemeden bu yana geçen gün sayısı vardır.
  • CE35. Bir gereksinim, üç düzeyi birbirine bağlayan bir zincir olarak yazılır: politika → standart → yordam. Boş hücre eksik halkadır.
  • CE36. Kanıt kuralı: bir gereksinim ancak kayıt üreten bir yordamı varsa denetimde kanıtlanabilir sayılır. Politika ve standart tek başına kanıt değildir.
  • CE37. Eksik halkayı üretmenin maliyeti düzeye göre değişir: politika 3, standart 8, yordam 15, yordamın kayıt akışı 10 adam-gün (kurgu).
  • CE38. Bir yordam birden çok zincirde geçebilir; o zaman kayıt kalemi de paylaşılır.
// belge/hiyerarsi.mjs — politika, standart ve yordam duzeylerinin kanit uretimi ekseninde ayrimi.
// MODELDIR: bolgesel olcum agi (kurgu); belgeler, kayit sayilari ve yaslar kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// kod | duzey | alan | olculebilir esik | donemde urettigi kayit | son guncellemeden bu yana gun
export const BELGE = Object.fromEntries(satir(`
  P1|politika|erisim|hayir|0|420
  P2|politika|veri|hayir|0|180
  P3|politika|degisiklik|hayir|0|900
  P4|politika|olay|hayir|0|150
  P5|politika|tedarik|hayir|0|640
  P6|politika|farkindalik|hayir|0|300
  S1|standart|erisim|evet|0|120
  S2|standart|erisim|evet|0|540
  S3|standart|veri|evet|0|90
  S4|standart|veri|hayir|0|380
  S5|standart|degisiklik|evet|0|75
  S6|standart|olay|evet|0|200
  S7|standart|tedarik|hayir|0|700
  S8|standart|sureklilik|evet|0|260
  S9|standart|farkindalik|evet|0|340
  Y1|yordam|erisim|evet|240|60
  Y2|yordam|erisim|evet|48|110
  Y3|yordam|veri|evet|365|30
  Y4|yordam|veri|evet|30|45
  Y5|yordam|degisiklik|evet|310|20
  Y6|yordam|olay|evet|18|95
  Y7|yordam|olay|hayir|0|410
  Y8|yordam|tedarik|evet|3|280
  Y9|yordam|sureklilik|evet|4|150
  Y10|yordam|farkindalik|evet|4|85
  Y11|yordam|varlik|evet|12|40`)
  .map(([kod, duzey, alan, esik, kayit, yas]) =>
    [kod, { kod, duzey, alan, esik: esik === "evet", kayit: +kayit, yas: +yas }]));

// gereksinim | politika | standart | yordam  (bos hucre eksik halkadir)
export const ZINCIR = satir(`
  Z01 erisim onayi|P1|S1|Y1
  Z02 ayricalikli erisim|P1|S2|Y2
  Z03 kimlik dogrulama kurallari|P1|S2|
  Z04 veri siniflandirma|P2|S3|Y3
  Z05 silme talebi|P2|S4|Y4
  Z06 saklama suresi|P2|S3|Y3
  Z07 degisiklik onayi|P3|S5|Y5
  Z08 olay bildirimi|P4|S6|Y6
  Z09 olay sonrasi inceleme|P4|S6|Y7
  Z10 tedarikci degerlendirme|P5|S7|Y8
  Z11 tedarikciden cikis|P5||
  Z12 sureklilik tatbikati||S8|Y9
  Z13 farkindalik egitimi|P6|S9|Y10
  Z14 varlik envanteri|||Y11
  Z15 kayitlarin butunlugu|||`)
  .map(([ad, p, s, y]) => ({ ad, kod: ad.split(" ")[0], p, s, y }));

export const DUZEY = ["politika", "standart", "yordam"];
// Kanit kurali: bir gereksinim ancak kayit ureten bir yordamla kanitlanabilir.
export const kanitli = (z) => Boolean(z.y) && BELGE[z.y].kayit > 0;
export const kopus = (z) => !z.p ? "politika yok" : !z.s ? "standart yok"
  : !z.y ? "yordam yok" : BELGE[z.y].kayit === 0 ? "kayit uretmiyor" : "tam";

if (import.meta.url === `file://${process.argv[1]}`) {
  const hepsi = Object.values(BELGE);
  console.log(`model: ${hepsi.length} belge, ${ZINCIR.length} gereksinim zinciri, ` +
    `${new Set(hepsi.map((b) => b.alan)).size} konu alani`);

  const y = gen([12, 8, 11, 14, 14, 13]);
  console.log("\n" + y("duzey", "belge", "esikli", "kayit uretir", "donem kaydi", "ort yas gun"));
  for (const d of DUZEY) {
    const k = hepsi.filter((b) => b.duzey === d);
    console.log(y(d, k.length, k.filter((b) => b.esik).length,
      k.filter((b) => b.kayit > 0).length, k.reduce((a, b) => a + b.kayit, 0),
      (k.reduce((a, b) => a + b.yas, 0) / k.length).toFixed(0)));
  }
  console.log(`toplam ${hepsi.length} belgenin ${hepsi.filter((b) => b.kayit > 0).length} ` +
    `tanesi denetimde kanit uretiyor; ${hepsi.filter((b) => !b.esik).length} tanesi ` +
    `olculebilir esik tasimiyor`);

  const z = gen([18, 10, 12, 40]);
  console.log("\n" + z("zincir durumu", "sayi", "yuzde", "gereksinimler"));
  const DURUM = ["tam", "kayit uretmiyor", "yordam yok", "standart yok", "politika yok"];
  for (const d of DURUM) {
    const k = ZINCIR.filter((x) => kopus(x) === d);
    console.log(z(d, k.length, (100 * k.length / ZINCIR.length).toFixed(0),
      k.map((x) => x.kod).join(" ") || "-"));
  }
  console.log(`\nkanitlanabilir gereksinim ${ZINCIR.filter(kanitli).length}/${ZINCIR.length}; ` +
    `politikasi olan ${ZINCIR.filter((x) => x.p).length}, standardi olan ` +
    `${ZINCIR.filter((x) => x.s).length}, yordami olan ${ZINCIR.filter((x) => x.y).length}`);
  const eski = ZINCIR.filter((x) => x.p && x.y && BELGE[x.p].yas > BELGE[x.y].yas + 180);
  console.log(`politikasi yordamindan 180 gunden fazla eski olan zincir ${eski.length}: ` +
    `${eski.map((x) => `${x.kod} (${BELGE[x.p].yas}/${BELGE[x.y].yas} gun)`).join(", ")}`);
}
model: 26 belge, 15 gereksinim zinciri, 8 konu alani

duzey          belge     esikli  kayit uretir   donem kaydi  ort yas gun
politika           6          0             0             0          432
standart           9          7             0             0          301
yordam            11         10            10          1034          120
toplam 26 belgenin 10 tanesi denetimde kanit uretiyor; 9 tanesi olculebilir esik tasimiyor

zincir durumu           sayi       yuzde                           gereksinimler
tam                        9          60     Z01 Z02 Z04 Z05 Z06 Z07 Z08 Z10 Z13
kayit uretmiyor            1           7                                     Z09
yordam yok                 1           7                                     Z03
standart yok               1           7                                     Z11
politika yok               3          20                             Z12 Z14 Z15

kanitlanabilir gereksinim 11/15; politikasi olan 12, standardi olan 12, yordami olan 12
politikasi yordamindan 180 gunden fazla eski olan zincir 5: Z01 (420/60 gun), Z02 (420/110 gun), Z07 (900/20 gun), Z10 (640/280 gun), Z13 (300/85 gun)

Birinci tablo hiyerarşiyi düzey düzey ayırıyor ve üç sütunu birden okumak gerekiyor. Altı politikanın hiçbiri ölçülebilir eşik taşımıyor ve hiçbiri kayıt üretmiyor; dokuz standardın yedisi eşik taşıyor ama yine hiçbiri kayıt üretmiyor; on bir yordamın onu hem eşik taşıyor hem kayıt üretiyor ve dönemde 1.034 kalem çıkarıyor. Yirmi altı belgenin onu denetimde kanıt üretiyor. Kalan on altısı denetim dosyasına konabilir, okunur, kabul edilir — ama bir işin yapıldığını göstermez, yalnız yapılması gerektiğini söyler.

Yaş sütunu bunun neden böyle olduğunu açıklıyor. Politikaların ortalama yaşı 432 gün, standartların 301, yordamların 120. Sıralamanın yönü rastlantı değildir: kayıt üreten belge her koşumunda gerçeklikle karşılaşır ve tutmadığında değişir; hiç kayıt üretmeyen belge kendiliğinden hiçbir baskıya uğramaz. Son satır bunun keskin biçimini veriyor — beş zincirde politika, kendi yordamından 180 günden fazla eskidir; değişiklik alanında politika 900, yordam 20 günlüktür. Bu zincirlerde iki belge aynı işi farklı biçimde anlatıyor olabilir ve çelişki yalnız okuyan biri fark ederse görünür.

İkinci tablo zincirleri koşturuyor. On beş gereksinimin dokuzu tam zincirdir. Kalan altı zincirin koptuğu yer birbirinden çok farklıdır ve dört ayrı sonuç doğurur: Z09’un yordamı vardır ama kayıt üretmez, Z03’ün standardı vardır yordamı yoktur, Z11’in yalnız politikası vardır, Z12, Z14 ve Z15’in politikası yoktur.

Son satırdan önceki sayı bu dersin ana ayrımını veriyor: kanıtlanabilir gereksinim 11’dir, tam zincir ise 9. Aradaki iki gereksinim — süreklilik tatbikatı ve varlık envanteri — politikasızdır, ama kayıt üreten bir yordamları vardır. Denetimde bu ikisi kanıtlanır. Yani kanıt üretimi hiyerarşinin üst düzeylerine bağlı değildir; kayıt üreten bir yordam, üzerinde hiçbir politika olmasa da bir işin yapıldığını gösterir. Bunun tersi doğru değildir: on iki zincirin politikası vardır ama politikaların hiçbiri tek başına hiçbir gereksinimi kanıtlamaz.

Eksik Halkanın Bedeli

// belge/tamamlama.mjs — kopuk halkayi tamamlamanin bedeli ve alan basina kanit uretimi.
import { BELGE, ZINCIR, DUZEY, gen, kanitli, kopus } from "./hiyerarsi.mjs";

// Eksik halkayi uretmenin maliyeti (adam-gun, kurgu)
const GUN = { politika: 3, standart: 8, yordam: 15, kayit: 10 };
const eksikler = (z) => [...(!z.p ? ["politika"] : []), ...(!z.s ? ["standart"] : []),
  ...(!z.y ? ["yordam", "kayit"] : BELGE[z.y].kayit === 0 ? ["kayit"] : [])];
const maliyet = (z) => eksikler(z).reduce((a, e) => a + GUN[e], 0);

const eksikZincir = ZINCIR.filter((z) => eksikler(z).length > 0);
const y = gen([31, 32, 7, 15, 14]);
console.log(`${eksikZincir.length} zincirde eksik halka var; kanitlanabilir gereksinim ` +
  `${ZINCIR.filter(kanitli).length}/${ZINCIR.length}`);
console.log("\n" + y("gereksinim", "eksik halka", "gun", "kanit kazanci", "gun / kazanc"));
for (const z of [...eksikZincir].sort((a, b) => maliyet(a) - maliyet(b))) {
  const kazanc = kanitli(z) ? 0 : 1;
  console.log(y(z.ad, eksikler(z).join("+"), maliyet(z), kazanc,
    kazanc ? maliyet(z) : "kazanc yok"));
}
const kanitsiz = eksikZincir.filter((z) => !kanitli(z));
const gorunus = eksikZincir.filter((z) => kanitli(z));
console.log(`\nkanit kazandiran ${kanitsiz.length} zincirin toplam bedeli ` +
  `${kanitsiz.reduce((a, z) => a + maliyet(z), 0)} adam-gun; hicbir kanit kazandirmayan ` +
  `${gorunus.length} zincirin bedeli ${gorunus.reduce((a, z) => a + maliyet(z), 0)} adam-gun`);
console.log(`ucuzdan pahaliya siralama: ` +
  `${[...eksikZincir].sort((a, b) => maliyet(a) - maliyet(b)).map((z) => z.kod).join(" < ")}`);
console.log(`kanit kazancina gore siralama: ` +
  `${[...eksikZincir].sort((a, b) => (kanitli(a) ? 1 : 0) - (kanitli(b) ? 1 : 0) ||
    maliyet(a) - maliyet(b)).map((z) => z.kod).join(" < ")}`);

// Alan basina belge sayisi ile kanit uretimi
const alanlar = [...new Set(Object.values(BELGE).map((b) => b.alan))];
const belgeSay = (a) => Object.values(BELGE).filter((b) => b.alan === a);
const z2 = gen([13, 9, 12, 13, 13, 12]);
console.log("\n" + z2("konu alani", "belge", ...DUZEY, "donem kaydi"));
for (const a of alanlar) {
  const k = belgeSay(a);
  console.log(z2(a, k.length, ...DUZEY.map((d) => k.filter((b) => b.duzey === d).length),
    k.reduce((x, b) => x + b.kayit, 0)));
}
const sB = [...alanlar].sort((a, b) => belgeSay(b).length - belgeSay(a).length ||
  a.localeCompare(b));
const sK = [...alanlar].sort((a, b) => belgeSay(b).reduce((x, i) => x + i.kayit, 0) -
  belgeSay(a).reduce((x, i) => x + i.kayit, 0) || a.localeCompare(b));
console.log(`\nbelge sayisina gore ilk uc : ${sB.slice(0, 3).join(", ")}`);
console.log(`kanit uretimine gore ilk uc: ${sK.slice(0, 3).join(", ")}`);
console.log(`ortak: ${sK.slice(0, 3).filter((a) => sB.slice(0, 3).includes(a)).length}/3; ` +
  `tek belgeli varlik alani ${belgeSay("varlik").reduce((x, b) => x + b.kayit, 0)} kayit, ` +
  `dort belgeli olay alani ${belgeSay("olay").reduce((x, b) => x + b.kayit, 0)} kayit uretiyor`);
console.log(`kopus noktalari: ` +
  `${eksikZincir.map((z) => `${z.kod} ${kopus(z)}`).join("; ")}`);
6 zincirde eksik halka var; kanitlanabilir gereksinim 11/15

gereksinim                                          eksik halka    gun  kanit kazanci  gun / kazanc
Z12 sureklilik tatbikati                               politika      3              0    kazanc yok
Z09 olay sonrasi inceleme                                 kayit     10              1            10
Z14 varlik envanteri                          politika+standart     11              0    kazanc yok
Z03 kimlik dogrulama kurallari                     yordam+kayit     25              1            25
Z11 tedarikciden cikis                    standart+yordam+kayit     33              1            33
Z15 kayitlarin butunlugu         politika+standart+yordam+kayit     36              1            36

kanit kazandiran 4 zincirin toplam bedeli 104 adam-gun; hicbir kanit kazandirmayan 2 zincirin bedeli 14 adam-gun
ucuzdan pahaliya siralama: Z12 < Z09 < Z14 < Z03 < Z11 < Z15
kanit kazancina gore siralama: Z09 < Z03 < Z11 < Z15 < Z12 < Z14

konu alani       belge    politika     standart       yordam donem kaydi
erisim               5           1            2            2         288
veri                 5           1            2            2         395
degisiklik           3           1            1            1         310
olay                 4           1            1            2          18
tedarik              3           1            1            1           3
farkindalik          3           1            1            1           4
sureklilik           2           0            1            1           4
varlik               1           0            0            1          12

belge sayisina gore ilk uc : erisim, veri, olay
kanit uretimine gore ilk uc: veri, degisiklik, erisim
ortak: 2/3; tek belgeli varlik alani 12 kayit, dort belgeli olay alani 18 kayit uretiyor
kopus noktalari: Z03 yordam yok; Z09 kayit uretmiyor; Z11 standart yok; Z12 politika yok; Z14 politika yok; Z15 politika yok

Birinci tablo, ucuzdan pahalıya dizildiğinde en yukarıda iki tuzak taşıyor. Süreklilik tatbikatı 3 adam-günde, varlık envanteri 11 adam-günde “tam zincir” hâline gelir; ikisi de hiçbir yeni kanıt üretmez, çünkü ikisi de zaten kanıtlanabilir durumdadır. Toplam 14 adam-gün, denetim raporundaki tablo görüntüsünü düzeltir ve denetimde gösterilen kalem sayısını değiştirmez. Buna karşılık olay sonrası incelemenin kayıt akışını kurmak 10 adam-gündür ve kanıtlanamayan bir gereksinimi kanıtlanabilir yapar.

İki sıralama tam olarak burada ayrışıyor. Ucuzdan pahalıya sıra Z12 ile başlıyor; kanıt kazancına göre sıra Z09 ile başlıyor ve Z12 ile Z14 en sona düşüyor. Eksik halkaları düzeye bakarak tamamlamak — “önce politikaları yazalım, hiyerarşi tamamlansın” — 14 adam-günü yalnız görünüşe harcamak demektir. Kanıt kazandıran dört zincirin toplam bedeli 104 adam-gündür ve bunun 36’sı tek bir zincire, hiçbir düzeyi olmayan kayıt bütünlüğüne gider.

Son tablo aynı ayrışmayı konu alanı düzeyinde gösteriyor. Belge sayısına göre ilk üç erişim, veri ve olay alanlarıdır; kanıt üretimine göre ilk üç veri, değişiklik ve erişimdir. Olay alanı dört belge taşıyor ve dönemde 18 kayıt üretiyor; varlık alanının tek bir belgesi var ve 12 kayıt üretiyor. Bir alanda kaç belge olduğu, o alanda ne kadar kanıt üretildiği hakkında bilgi vermiyor. Belge sayımı bir çaba ölçüsüdür; kayıt sayımı bir sonuç ölçüsüdür ve bu iki sayı arasında yapısal bir bağ yoktur.

Özet

  • Belge hiyerarşisi üç düzeylidir: politika niyeti bildirir, standart ölçülebilir bir eşik verir, yordam koşumunda kayıt üretir. Denetimde kanıt yalnız son düzeyden çıkar.
  • Yirmi altı belgenin onu kanıt üretiyor; altı politikanın hiçbiri eşik taşımıyor ya da kayıt üretmiyor, dokuz standardın yedisi eşik taşıyor ama hiçbiri kayıt üretmiyor.
  • Kayıt üreten belge daha tazedir: politikaların ortalama yaşı 432, yordamların 120 gündür. Beş zincirde politika kendi yordamından 180 günden fazla eskidir.
  • Kanıtlanabilir gereksinim 11, tam zincir 9’dur: iki gereksinim politikasız olduğu hâlde kayıt üreten yordamı sayesinde kanıtlanır. Bunun tersi doğru değildir — hiçbir politika tek başına bir gereksinimi kanıtlamaz.
  • Eksik halkaları düzeye göre tamamlamak yanıltır: 14 adam-gün iki zinciri “tam” gösterir ve hiçbir yeni kanıt üretmez; kanıt kazandıran dört zincirin bedeli 104 adam-gündür ve en ucuzu 10 gündür.
  • Bir konu alanındaki belge sayısı, o alanın kanıt üretimi hakkında bilgi vermiyor: dört belgeli olay alanı 18, tek belgeli varlık alanı 12 kayıt üretiyor.

Sonraki Adım

Bu dersin bütün sayıları bir kabule dayanıyor: zincirin dolu olduğu söylenen hücreleri gerçekten doludur, kayıt üretiyor denen yordam gerçekten üretiyordur, 900 günlük politika hâlâ geçerlidir. Bu kabulün kaynağı bellidir — tabloyu dolduran, belgeleri yazan ve kayıtların üretildiğini bildiren taraf aynı taraftır. Beş ders boyunca ölçülen her şey kurumun kendi beyanı üzerinde koşturuldu.

Sonraki ders konuyu kapatır ve bu kabulü kaldırır: aynı kişi hem kontrolü kurup hem denetlerse kaç bulgu hiç görünmez, kuran ile denetleyeni ayırmak kaç kalemi ortaya çıkarır ve bu ayrımın kendisi kaç kalem ek iş getirir. Bağımsız güvence bir sıfat değil, sayılabilir bir düzenlemedir.

İ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