Ders 07 / 09
Kanıt Otomasyonu
Yirmi dört denetim kanıtı kalemi hatta yerleştirilir: elle dokunulan kalem 24'ten 9'a, yıllık derleme yükü 213 saatten 96,2 saate iner, 170 saatlik kurulum 1,46 yılda karşılanır ve altı kalem hiçbir koşulda otomatikleşmez. Bedel karşı sütunda çıkar: dönem başına kanıt kaydı 24'ten 72.401'e, 3.017 kata yükselir, incelenen oran yüzde 100'den yüzde 0,63'e düşer ve kişisel veri türü taşıyan altı kalem 90 günlük saklama penceresi yüzünden dönemin yalnız yüzde 24,7'sini cevaplar.
İçindekiler
Önceki ders yirmi altı denetim maddesini ekibin on sekiz pratiğiyle eşleştirdi ve üç iş türü ayırdı. Bunlardan ikisi ölçülemedi: dokuz kontrolün karşılığında hiçbir pratik yok, beşinin karşılığı da başka bir katmanda. Geriye ölçülebilir olan on yedi kontrol kaldı — on biri makinece okunabilir iz bırakıyor, altısı yalnız bir belge bırakıyor.
Bu ders o on yedi kontrolün kanıtını izler. Sorulan şey pratiğin var olup olmadığı değil, kanıtın nerede üretildiğidir. Bir pratiğin koşması ile o pratiğin koştuğunun kanıtlanabilmesi iki ayrı iştir ve ikincisi çoğunlukla dönem sonunda, elle yapılır. Ölçü birimi de buradan çıkar: elle dokunulan kalem sayısı ve o kalemlerin yıllık derleme yükü.
Kanıt Kalemi Kümesi
UY7. Kanıt kalemi kümesi 24’tür ve önceki dersin karşılığı çıkan 17 kontrolüne bağlanır; küme kurgu bölgesel ölçüm ağına aittir ve modeldir. UY8. Her kalemin bir türü vardır: iz bir sistemde kendiliğinden oluşan kayıttır, karar bir kişinin gerekçesidir, toplantı bir tatbikat ya da toplantı tutanağıdır. UY9. Elle derlenen kanıt derleme günü üretilir ve hangi aralığı kapsadığı kaydın üstünde yazmaz; hatta üretilen kanıt bir dönem damgası taşır — bu ayrım modelin varsayımıdır. UY10. Dakikalar dönem başına veri olarak verilmiştir, ölçülmemiştir; derleme yılda üç kez yapılır ve bu da kurgudur.
// kanit/kalem.mjs — denetim kaniti kalemleri MODELDIR: kurgu bolgesel olcum agi, bir donem. // Kalemler onceki dersin karsiligi cikan 17 kontroluna baglanir; sayilar kurgudur. export const gen = (B) => (...h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); // kod|kontrol|tur|kaynak|elle dakika|donemde uretilen kayit|kisisel veri export const KALEM = ` K01|IC-01|iz|hat|120|312|yok|bagimlilik envanteri K02|IC-01|iz|hat|90|312|yok|koken bilgisi K03|IC-02|iz|kosum|150|8640|var|kisa omurlu kimlik verilisi K04|IC-02|karar|kosum|240|24|var|erisim gozden gecirme karari K05|IC-04|iz|kosum|180|54000|var|uygulama denetim kaydi K06|IC-05|iz|kosum|100|960|yok|uyari kurali tetiklenmesi K07|IC-06|toplanti|elle|300|2|yok|olay mudahale tatbikat raporu K08|IC-06|karar|elle|120|6|yok|rol atama karari K09|IC-07|toplanti|elle|360|2|yok|kurtarma hedefi olcum raporu K10|IC-08|iz|hat|110|312|yok|imaj tarama raporu K11|YS-05|toplanti|elle|180|4|yok|yonetim gozden gecirme tutanagi K12|DK-01|iz|depo|130|486|yok|degisiklik onay kaydi K13|DK-01|karar|depo|90|18|yok|acil degisiklik gerekcesi K14|DK-02|iz|kosum|140|420|var|uretim erisimi verilisi K15|DK-03|toplanti|elle|300|2|yok|geri yukleme tatbikat raporu K16|DK-04|karar|kosum|280|24|var|ayricalikli erisim gozden gecirmesi K17|DK-05|iz|depo|120|486|yok|kod incelemesi onayi K18|DK-05|iz|depo|80|486|yok|dal koruma kural durumu K19|DK-06|iz|hat|160|312|yok|acik tarama sonucu K20|DK-06|iz|hat|140|312|yok|statik cozumleme sonucu K21|SG-01|iz|kosum|150|1440|yok|bolut kurali durumu K22|SG-01|iz|kosum|130|1440|yok|kabul denetleyicisi red kaydi K23|SG-02|karar|elle|420|1|var|veri siniflandirma tablosu K24|SG-04|iz|kosum|170|2400|var|veri sahibi talebi izi `.trim().split("\n").map((l) => { const [kod, kontrol, tur, kaynak, dk, kayit, kisisel, ad] = l.trim().split("|"); return { kod, kontrol, tur, kaynak, dk: +dk, kayit: +kayit, kisisel, ad }; }); export const TUR = ["iz", "karar", "toplanti"]; export const DERLEME = 3; // yilda uc kez kanit derlemesi (kurgu) export const KURULUM = { hat: 6, depo: 8, kosum: 12, elle: 0 }; // kalem basina kisi-saat if (import.meta.url === `file://${process.argv[1]}`) { const y = gen([12, 8, 10, 12, 14, 16]); console.log(y("kalem turu", "kalem", "sistemde", "elle", "donem dakika", "donem kaydi")); for (const t of TUR) { const k = KALEM.filter((x) => x.tur === t); console.log(y(t, k.length, k.filter((x) => x.kaynak !== "elle").length, k.filter((x) => x.kaynak === "elle").length, k.reduce((a, x) => a + x.dk, 0), k.reduce((a, x) => a + x.kayit, 0))); } const dk = KALEM.reduce((a, x) => a + x.dk, 0); console.log(y("TOPLAM", KALEM.length, KALEM.filter((x) => x.kaynak !== "elle").length, KALEM.filter((x) => x.kaynak === "elle").length, dk, KALEM.reduce((a, x) => a + x.kayit, 0))); console.log(`\nbaslangic durumu: ${KALEM.length} kalemin ${KALEM.length}'u elle derleniyor`); console.log(`derleme basina ${(dk / 60).toFixed(1)} saat, yilda ${DERLEME} derleme -> ` + `${(DERLEME * dk / 60).toFixed(1)} saat`); console.log(`kisisel veri turu tasiyan kalem ` + `${KALEM.filter((x) => x.kisisel === "var").length}/${KALEM.length}`); }
kalem turu kalem sistemde elle donem dakika donem kaydi iz 15 15 0 1970 72318 karar 5 3 2 1150 73 toplanti 4 0 4 1140 10 TOPLAM 24 18 6 4260 72401 baslangic durumu: 24 kalemin 24'u elle derleniyor derleme basina 71.0 saat, yilda 3 derleme -> 213.0 saat kisisel veri turu tasiyan kalem 7/24
Tablonun ikinci ve üçüncü sütunu bu dersin asıl gerilimini kuruyor. Yirmi dört kalemin on sekizi zaten bir sistemde oluşuyor — hatta, depoda ya da koşumda. Buna karşın başlangıç durumunda yirmi dördünün de kanıtı elle derleniyor. Kayıt sistemde vardır ve dönem sonunda bir kişi onu dışa aktarır, bir dizine koyar, bir tabloya işler. Aradaki fark bir mühendislik açığı değil, bir bağlantı açığıdır: kaydın var olması, denetimin sorduğu biçimde durduğu anlamına gelmez.
Kalem sayısının kontrol sayısından fazla olması da bir bilgidir: on yedi kontrol yirmi dört kalem istiyor. Bazı maddeler tek kalemle karşılanmaz — kod değişikliğinin ikinci gözden geçtiğini göstermek hem inceleme onayını hem dal koruma kuralının durumunu ister, çünkü ilki olayın gerçekleştiğini, ikincisi gerçekleşmemesinin engellendiğini söyler. Kanıt kalemi sayısı kontrol sayısıyla değil, kontrolün sorusunun kaç parçadan oluştuğuyla belirlenir.
Üçüncü satır bunun sınırını da veriyor. Dört toplantı kaleminin hiçbiri bir sistemde oluşmuyor ve bu, araç eksikliğinden değil, kalemin doğasından kaynaklanıyor: bir tatbikatın sonucu bir kişi tarafından yazılır. Dakika sütunu ise dağılımın dengesiz olduğunu söylüyor — dört toplantı kalemi 1.140 dakika, yani toplam yükün dörtte biri; oysa kalem sayısının altıda biri.
Üretimi Hatta Yerleştirmek
UY11. Karar türü bir kalemin kaydı otomatikleşir — kararın verildiği, veren kişi ve zaman damgası bir sistemden okunur; gerekçe metni elle kalır. Kalan elle iş, kalemin dakikasının 0,4 katı sayıldı ve bu oran modelin varsayımıdır. UY12. Kurulum bedeli kalem başına kişi-saat olarak verilmiştir (hat 6, depo 8, koşum 12) ve veridir; bakım bedeli modellenmedi, bu da amorti süresini olduğundan kısa gösterir.
// kanit/otomasyon.mjs — kanit uretimi hatta yerlestirilir: elle toplanan kalem kaca iniyor. import { KALEM, DERLEME, KURULUM, gen } from "./kalem.mjs"; // Iz turu kalem bir sistemde kendiliginden olusur: hatta uretilir. Karar turunun kaydi // otomatiklesir, gerekcesi elle kalir (kalemin dakikasinin 0,4 kati). Toplanti otomatiklesmez. const durum = (k) => k.kaynak === "elle" ? "elle kalir" : k.tur === "iz" ? "hatta uretilir" : k.tur === "karar" ? "yari otomatik" : "elle kalir"; const kalan = (k) => durum(k) === "hatta uretilir" ? 0 : durum(k) === "yari otomatik" ? Math.round(0.4 * k.dk) : k.dk; const DURUM = ["hatta uretilir", "yari otomatik", "elle kalir"]; const y = gen([18, 8, 20, 16]); console.log(y("otomasyon sonucu", "kalem", "kalan elle dakika", "kurulum saat")); for (const d of DURUM) { const k = KALEM.filter((x) => durum(x) === d); console.log(y(d, k.length, k.reduce((a, x) => a + kalan(x), 0), k.reduce((a, x) => a + KURULUM[x.kaynak], 0))); } const kalanDk = KALEM.reduce((a, x) => a + kalan(x), 0); const kurulum = KALEM.reduce((a, x) => a + (durum(x) === "elle kalir" ? 0 : KURULUM[x.kaynak]), 0); console.log(y("TOPLAM", KALEM.length, kalanDk, kurulum)); const oncesi = DERLEME * KALEM.reduce((a, x) => a + x.dk, 0) / 60; const sonrasi = DERLEME * kalanDk / 60; const elleKalem = KALEM.filter((x) => durum(x) !== "hatta uretilir"); console.log(`\nelle dokunulan kalem ${KALEM.length} -> ${elleKalem.length} ` + `(${KALEM.filter((x) => durum(x) === "elle kalir").length} tam, ` + `${KALEM.filter((x) => durum(x) === "yari otomatik").length} kismi)`); console.log(`yillik derleme yuku ${oncesi.toFixed(1)} -> ${sonrasi.toFixed(1)} saat; ` + `kazanc ${(oncesi - sonrasi).toFixed(1)} saat/yil`); console.log(`kurulum ${kurulum} saat -> amorti ${(kurulum / (oncesi - sonrasi)).toFixed(2)} yil`); console.log(`hicbir kosulda otomatiklesmeyen kalem: ` + KALEM.filter((x) => durum(x) === "elle kalir").map((x) => `${x.kod} ${x.tur}`).join(", "));
otomasyon sonucu kalem kalan elle dakika kurulum saat hatta uretilir 15 0 138 yari otomatik 3 244 32 elle kalir 6 1680 0 TOPLAM 24 1924 170 elle dokunulan kalem 24 -> 9 (6 tam, 3 kismi) yillik derleme yuku 213.0 -> 96.2 saat; kazanc 116.8 saat/yil kurulum 170 saat -> amorti 1.46 yil hicbir kosulda otomatiklesmeyen kalem: K07 toplanti, K08 karar, K09 toplanti, K11 toplanti, K15 toplanti, K23 karar
Elle dokunulan kalem 24’ten 9’a iniyor: altısı tam elle, üçü kısmi. Yıllık derleme yükü 213 saatten 96,2 saate düşüyor ve kazanç yılda 116,8 saat. Kurulum 170 saat tutuyor, yani yatırım 1,46 yılda karşılanıyor. Bu üç sayı birlikte okunmalıdır: tek başına “otomasyon yükü yarıdan fazla düşürdü” cümlesi doğrudur ama ilk yılın net bakiyesi eksidir.
Son satır otomasyonun tavanını veriyor. Altı kalem hiçbir koşulda otomatikleşmez ve ikisi karar, dördü toplantı türündedir. Bu altı kalem kalan elle yükün 1.680 dakikasını, yani 1.924 dakikanın yüzde 87’sini taşır. Otomasyon yükün büyük kısmını değil, kalem sayısının büyük kısmını aldı; kalan dokuz kalem sayıca az, dakikaca ağırdır. Sıradaki iyileştirmenin nereye bakacağı bu sütunda yazıyor ve orası bir hat değil, bir toplantı düzenidir.
Kısmi otomatikleşen üç kalem ayrı bir sınıftır ve en çok yanlış anlaşılanıdır. Erişim gözden geçirme kararı bir sistemde işaretlenir, ama neden o erişimin sürdürüldüğü bir cümledir ve o cümleyi bir hat yazamaz. Kaydın otomatikleşmesi, kararın otomatikleştiği anlamına gelmez; otomatikleşen şey kararın var olduğunun kanıtıdır, içeriğinin değil.
Otomatik Kanıtın Bedeli
UY13. Denetçi bir kalemden en çok 25 kayıt inceler; denetim dönemi 365 gün, kişisel veri türü taşıyan kanıt kaleminin saklama penceresi 90 gündür. Üçü de kurgu veridir ve pencere kararı kalemin taşıdığı veri türünden gelir.
// kanit/bedel.mjs — otomatik kanitin bedeli: hacim, ornekleme orani ve saklama penceresi. import { KALEM, gen } from "./kalem.mjs"; const ORNEK = 25, DONEM_GUN = 365, SAKLAMA_GUN = 90; // ucu de kurgu veridir const otomatik = (k) => k.kaynak !== "elle" && k.tur !== "toplanti"; const kayit = KALEM.reduce((a, k) => a + k.kayit, 0); const incelenen = KALEM.reduce((a, k) => a + Math.min(k.kayit, ORNEK), 0); const y = gen([26, 18, 20]); console.log(y("kanit hacmi", "derleme oncesi", "hatta uretilirken")); console.log(y("donem basina kanit kaydi", KALEM.length, kayit)); console.log(y("denetcinin inceledigi", KALEM.length, incelenen)); console.log(y("incelenen oran", "%100", `%${(100 * incelenen / kayit).toFixed(2)}`)); // Kisisel veri turu tasiyan kanit kalemi saklama penceresine tabidir; pencere donemden kisa // oldugunda kalem donemin yalnizca bir bolumunu cevaplar. const kisisel = KALEM.filter((k) => otomatik(k) && k.kisisel === "var"); const tam = KALEM.filter((k) => otomatik(k) && k.kisisel === "yok"); const elle = KALEM.filter((k) => !otomatik(k)); const pay = (100 * SAKLAMA_GUN / DONEM_GUN).toFixed(1); const z = gen([28, 10, 16]); console.log("\n" + z("kanitin kapsadigi ara", "kalem", "donem payi")); console.log(z(`donem boyu (${DONEM_GUN} gun)`, tam.length, "%100")); console.log(z(`son ${SAKLAMA_GUN} gun (saklama kisiti)`, kisisel.length, `%${pay}`)); console.log(z("tek gun (elle derleme)", elle.length, "-")); console.log(`\nkisisel veri turu tasiyan otomatik kalem: ` + kisisel.map((k) => k.kod).join(", ")); console.log(`${KALEM.length} kanit kaleminden ${tam.length} kalem donemin tamamini, ` + `${kisisel.length} kalem son ${SAKLAMA_GUN} gunu, ${elle.length} kalem tek gunu cevapliyor`); console.log(`kanit kaydi ${KALEM.length} -> ${kayit} (${Math.round(kayit / KALEM.length)} kat); ` + `incelenen kayit ${incelenen}`);
kanit hacmi derleme oncesi hatta uretilirken donem basina kanit kaydi 24 72401 denetcinin inceledigi 24 458 incelenen oran %100 %0.63 kanitin kapsadigi ara kalem donem payi donem boyu (365 gun) 12 %100 son 90 gun (saklama kisiti) 6 %24.7 tek gun (elle derleme) 6 - kisisel veri turu tasiyan otomatik kalem: K03, K04, K05, K14, K16, K24 24 kanit kaleminden 12 kalem donemin tamamini, 6 kalem son 90 gunu, 6 kalem tek gunu cevapliyor kanit kaydi 24 -> 72401 (3017 kat); incelenen kayit 458
İlk tablo ilk bakışta otomasyonun aleyhine okunur: kanıt kaydı 24’ten 72.401’e, 3.017 kata çıkıyor ve incelenen oran yüzde 100’den yüzde 0,63’e düşüyor. Bu okuma yanlıştır ve yanlış olma nedeni kursun ölçüsündedir. Derleme öncesindeki yüzde 100, yirmi dört belgenin tamamının okunduğunu söyler; o yirmi dört belgenin hangi aralığı anlattığını söylemez. Sonraki durumda incelenen 458 kayıt bir örneklemdir, ama arkasındaki 72.401 kaydın tamamı sorgulanabilir durumdadır — denetçinin bir sonraki sorusu örneklemi büyütmeyi değil, sorguyu değiştirmeyi gerektirir. Daha çok kayıt daha az inceleme demektir; daha az cevap demek zorunda değildir.
Bu koşullu cümlenin koşulu ikinci tabloda görünüyor. Kişisel veri türü taşıyan altı kalem — kimlik verilişi, denetim kaydı, üretim erişimi, veri sahibi talebi ve iki gözden geçirme kararı — 90 günlük bir saklama penceresine tabidir. Denetim dönemi 365 gündür. Bu altı kalem dönemin yüzde 24,7’sini cevaplar; dönemin ilk dokuz ayı hakkındaki her soru cevapsızdır ve cevapsız olduğu ancak soru sorulduğunda anlaşılır. Otomasyon bu kalemleri kanıtsız yapmadı; kanıtın ömrünü kanıt üretiminden ayrı bir kısıt haline getirdi.
Sorgulanabilirlik koşulu da bedava değildir. Hatta üretilen bir kanıt kaydının denetimde işe yaraması için üç alan taşıması gerekir: hangi kontrole ait olduğu, hangi ana ait olduğu ve üretildikten sonra değiştirilmediğinin gösterilebilmesi. Bu üç alan kurulum saatinin içindedir ve üçü de eksik olabilir. Alanları eksik bir otomatik kanıt yığını, elle derlenmiş yirmi dört belgeden daha az cevap verir — sayısı büyüktür, sorgulanamaz ve hangi dönemi anlattığı yazmaz. Otomasyonun kazancı hacimden değil, bu üç alandan gelir.
Üç satır birlikte okunduğunda tablo şudur: yirmi dört kalemin on ikisi dönemin tamamını, altısı son doksan günü, altısı tek bir günü cevaplıyor. Otomasyondan önce bu üç sınıf birbirinden ayırt edilemiyordu, çünkü hepsi aynı biçimde — dönem sonunda derlenmiş bir belge olarak — duruyordu. Ölçmenin ilk kazancı sayının kendisi değil, üç sınıfın ayrılmış olmasıdır.
Özet
- Yirmi dört kanıt kaleminin on sekizi zaten bir sistemde oluşuyordu, buna karşın yirmi dördünün de kanıtı dönem sonunda elle derleniyordu; açık mühendislik değil, bağlantı açığıdır.
- Üretim hatta yerleştirildiğinde elle dokunulan kalem 24’ten 9’a, yıllık derleme yükü 213 saatten 96,2 saate iner; 170 saatlik kurulum 1,46 yılda karşılanır ve ilk yılın bakiyesi eksidir.
- Altı kalem hiçbir koşulda otomatikleşmez ve kalan elle yükün yüzde 87’sini taşır: otomasyon yükün değil, kalem sayısının büyük kısmını aldı.
- Kararın kaydı otomatikleşir, gerekçesi elle kalır; otomatikleşen şey kararın var olduğunun kanıtıdır, içeriğinin değil.
- Bedel karşı sütunda çıkar: kanıt kaydı 3.017 kat artar, incelenen oran yüzde 0,63’e iner ve kişisel veri türü taşıyan altı kalem 90 günlük saklama penceresi yüzünden dönemin yüzde 24,7’sini cevaplar.
Sonraki Adım
Kanıt üretimi hatta yerleşti ve üç sınıf ayrıldı: dönemin tamamını, son doksan günü ve tek günü cevaplayan kalemler. Bu ölçümlerin hepsi kanıtın var olup olmadığı üzerineydi. Denetim maddelerinin bir bölümü ise varlık değil, sayı ister: açık tanımlı süre içinde kapatıldı mı, kapatılmayanlar ne kadar süredir açık.
Sonraki ders bu iki sayıyı bir uygulama ekibinin ölçeğinde hesaplar — ortalama düzeltme süresi ve açık yaşı. İkisi aynı bulgu kümesinden çıkar, aynı dönemde ters yönlere gider ve ikisinin de hesaplanabilmesi kayıtta belirli zaman damgalarının bulunmasına bağlıdır. Damga eksikse kalem hesaba hiç girmez; girmeyen kalemler rastgele mi seçilir, yoksa hep aynı sınıftan mıdır?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.