İçeriğe geç
academia.sh

Ders 09 / 12

Politika ve Uyumluluk Otomasyonu

Aynı altı kural aynı on iki servis tanımında iki düzende koşturulur: kuralı belge olarak yayımlamak ve kuralı hatta gömmek. Uyum oranı, ihlal sayısı ve ekiplerin harcadığı zaman karşılaştırılır; asıl ölçü görünmezliktir — kaç ekip kuralı hiç görmeden uyuyor, kaçı muafiyet istiyor ve muafiyetin ömrü ne kadar.

İçindekiler

Katalog kimin sorumlu olduğunu söyler, ama kimsenin uymak zorunda olduğu bir kural koymaz. Ölçüm ağının kişisel veri taşıyan servisleri için kütük maskeleme, saklama süresi ve imzalı paket zorunludur. Bu kurallar bugün bir belgede yazılıdır ve her ekibin okuyup uygulaması beklenir. Beklemek bir mekanizma değildir; bu dersin sorusu kuralın nerede durduğudur.

Politika otomasyonu, kuralı okunacak bir metin olmaktan çıkarıp bildirim kabul eden bir kapıya taşımaktır. Kuralların nasıl tarandığı — uygunluk işlevi, tarama sırası, yakalanan ve kaçan ihlal — M20/K04’te ve M22/K05’in doğrulama dersinde ölçüldü ve burada tekrarlanmaz. Buranın ölçü birimi görünmezliktir: kural hatta gömülünce kaç ekip onu hiç görmeden uyar.

Ölçüm bölgesel ölçüm ağı üzerindedir: su sayacı okumalarını toplayan, doğrulayan ve saha iş emri açan kurgu yazılım. Kural kümesi de tanım kümesi de node ile yazılmış bir modeldir.

PT19. Kural kümesi altı kuraldır ve ders içinde kendi küçük biçimimizle tanımlanır. Tanım kümesi on iki servistir; her tanım sekiz alan taşır. PT20. Belge düzeninde ekip belgeyi okur ve kendi servislerine uygular. Süreler önceden yazılıdır: belge okuma ekip başına 20 dakika, servis başına gözden geçirme 15 dakika, denetimde yakalanan ihlalin düzeltilmesi 25 dakika. PT21. Hatta gömülü düzende dört kural hattın kendi düzelttiği türdendir, iki kural ret üretir. Ret düzeltmesi 8 dakika, muafiyet başvurusu 30 dakikadır. PT22. Muafiyet kayıtları, verilen süreler ve gerekçeler önceden yazılıdır; bugün, veriliş gününden geçen gün sayısıyla anılır. PT23. Kuralları hatta gömmenin bir kerelik bedeli kural başına 90 dakikadır. PT24. Bir ekibin kuralı görmesi, ya ret iletisi alması ya da muafiyet başvurusu yapmasıdır; hattın sessizce düzelttiği ihlal ekibe hiç görünmez.

İki Düzen, Aynı Kural Kümesi

// kural.mjs — alti kural ve on iki servis tanimi; ikisi de ders icinde tanimli. Model.
export const ALAN = ["ekip", "veri-sinifi", "maskeleme", "imzalama", "saglik-ucu",
  "kutuk-duzeyi", "saklama-gun", "duman"];
const HAM = {
  "okuma-toplayici":    ["sayac-okuma", "olcum", "kapali", "var", "/saglik", "ozet", 365, "var"],
  "okuma-cozumleyici":  ["sayac-okuma", "olcum", "kapali", "var", "/saglik", "ozet", 365, "var"],
  "dogrulama-akisi":    ["dogrulama", "olcum", "kapali", "var", "/saglik", "ozet", 400, "var"],
  "kural-deposu":       ["dogrulama", "olcum", "kapali", "yok", "/saglik", "ozet", 365, "var"],
  "fatura-hesaplayici": ["faturalama", "kisisel", "acik", "var", "/saglik", "ozet", 400, "var"],
  "tarife-servisi":     ["faturalama", "ozet", "kapali", "yok", "yok", "ayrinti", 700, "yok"],
  "fatura-yazici":      ["faturalama", "kisisel", "kapali", "yok", "/saglik", "ozet", 500, "yok"],
  "saha-emir":          ["saha", "kisisel", "kapali", "yok", "yok", "ayrinti", 800, "yok"],
  "harita-ucu":         ["saha", "ozet", "kapali", "yok", "yok", "ozet", 365, "yok"],
  "rapor-derleyici":    ["raporlama", "ozet", "kapali", "var", "/saglik", "ozet", 365, "var"],
  "gosterge-ucu":       ["raporlama", "ozet", "kapali", "yok", "/saglik", "ozet", 365, "yok"],
  "olcum-deposu":       ["sayac-okuma", "kisisel", "kapali", "var", "/saglik", "ozet", 400, "var"] };
export const TANIM = Object.fromEntries(Object.entries(HAM).map(([a, d]) =>
  [a, Object.fromEntries(ALAN.map((x, i) => [x, d[i]]))]));

// kural: [ad, olcut, tur, duzeltme]  — tur "otomatik" ise hat kendi duzeltir, "ret" ise ekip duzeltir
export const KURAL = [
  ["K1 maskeleme", (t) => t["veri-sinifi"] !== "kisisel" || t.maskeleme === "acik", "ret",
    (t) => ({ ...t, maskeleme: "acik" })],
  ["K2 imzali paket", (t) => t.imzalama === "var", "otomatik", (t) => ({ ...t, imzalama: "var" })],
  ["K3 saglik ucu", (t) => t["saglik-ucu"] !== "yok", "otomatik",
    (t) => ({ ...t, "saglik-ucu": "/saglik" })],
  ["K4 kutuk duzeyi", (t) => t["kutuk-duzeyi"] !== "ayrinti", "otomatik",
    (t) => ({ ...t, "kutuk-duzeyi": "ozet" })],
  ["K5 saklama suresi", (t) => t["saklama-gun"] <= 400, "ret", (t) => ({ ...t, "saklama-gun": 400 })],
  ["K6 duman sinamasi", (t) => t.duman === "var", "otomatik", (t) => ({ ...t, duman: "var" })]];

// muafiyet: [servis, kural, verilis gunu (bugunden geriye), verilen sure (gun), gerekce]
export const MUAFIYET = [
  ["olcum-deposu", "K1 maskeleme", 210, 30, "ham olcum maskelenirse dogrulama kiriliyor"],
  ["saha-emir", "K5 saklama suresi", 120, 90, "saha kayitlari 800 gun tutulmak zorunda"],
  ["tarife-servisi", "K4 kutuk duzeyi", 240, 14, "acik hata arayisi surduruluyor"],
  ["harita-ucu", "K6 duman sinamasi", 45, 60, "dis ucun sinama kosumu yok"]];

export const EKIP = ["sayac-okuma", "dogrulama", "faturalama", "saha", "raporlama"];
export const SURE = { okuma: 20, gozden: 15, duzeltme: 25, ret: 8, basvuru: 30, gomme: 90 };

Kural kümesi iki düzende de aynıdır; değişen tek şey kuralın nerede durduğudur. Belge düzeninde kural metindedir ve uygulama ekibin dikkatine bağlıdır. Hatta gömülü düzende kural bir kapıdadır ve dört kural için kapı düzeltmeyi kendi yapar, iki kural için ret verir. Kuralın ayrımı teknik değil bilgiseldir: sağlık ucunun yolunu platform bilir, saklama süresini yalnız servisin ekibi bilir.

// duzen.mjs — ayni kural kumesi iki duzende kosturulur: belge olarak yayimlamak ve hatta gommek.
import { TANIM, KURAL, MUAFIYET, EKIP, SURE } from "./kural.mjs";

const SERVIS = Object.keys(TANIM), cift = SERVIS.length * KURAL.length;
const muaf = (s, k) => MUAFIYET.some(([a, b]) => a === s && b === k);

const belge = () => {                               // kural belgede yazili, ekip okuyup uyguluyor
  let ihlal = 0;
  const ekipIhlal = Object.fromEntries(EKIP.map((e) => [e, 0]));
  for (const s of SERVIS) for (const [ad, olcut] of KURAL)
    if (!olcut(TANIM[s])) { ihlal++; ekipIhlal[TANIM[s].ekip]++; }
  const zaman = EKIP.length * SURE.okuma + SERVIS.length * SURE.gozden + ihlal * SURE.duzeltme;
  return { ihlal, uyum: cift - ihlal, zaman, ekipIhlal, gorulen: cift };
};

const hat = () => {                                 // kural hatta gomulu: otomatik duzeltme ya da ret
  let otomatik = 0, ret = 0, kalan = 0;
  const goren = new Set();
  for (const s of SERVIS) {
    let t = TANIM[s];
    for (const [ad, olcut, tur, duzelt] of KURAL) {
      if (olcut(t)) continue;
      if (muaf(s, ad)) { kalan++; goren.add(t.ekip); continue; }   // muafiyet kurali gorunur kilar
      if (tur === "otomatik") { t = duzelt(t); otomatik++; }
      else { t = duzelt(t); ret++; goren.add(t.ekip); }
    }
  }
  const zaman = ret * SURE.ret + MUAFIYET.length * SURE.basvuru;
  return { ihlal: kalan, uyum: cift - kalan, zaman, otomatik, ret, goren,
    gorulen: ret + MUAFIYET.length };
};

const B = belge(), H = hat();
console.log(`kural ${KURAL.length}  servis ${SERVIS.length}  denetlenen cift ${cift}` +
  `  ekip ${EKIP.length}`);
console.log(`belge duzeni : uyum ${B.uyum}/${cift} (%${(B.uyum / cift * 100).toFixed(0)})` +
  `  ihlal ${B.ihlal}  ekiplerin harcadigi ${B.zaman} dk`);
console.log(`hatta gomulu : uyum ${H.uyum}/${cift} (%${(H.uyum / cift * 100).toFixed(0)})` +
  `  kayitli istisna ${H.ihlal}  ekiplerin harcadigi ${H.zaman} dk`);
console.log(`hat ${H.otomatik} ihlali ekibe hic sormadan duzeltti, ${H.ret} ihlalde ret verdi`);
console.log(`ekip basina ihlal (belge duzeni): ` +
  EKIP.map((e) => `${e} ${B.ekipIhlal[e]}`).join("  "));

const hicGormeyen = EKIP.filter((e) => !H.goren.has(e));
console.log(`\ngorunmezlik: ${cift - H.gorulen}/${cift} cift kural hic gorunmeden uyumlu` +
  `  (ekibin gordugu ${H.gorulen}: ${H.ret} ret + ${MUAFIYET.length} muafiyet)`);
console.log(`kurali hic gormeyen ekip ${hicGormeyen.length}/${EKIP.length}: ${hicGormeyen.join(", ")}` +
  `   belge duzeninde bes ekibin besi de ${KURAL.length} kuralin tamamini okudu`);
const gomme = KURAL.length * SURE.gomme;
console.log(`hatta gomme bedeli ${gomme} dk (bir kerelik, ${KURAL.length} kural x ${SURE.gomme} dk);` +
  ` donem basina kazanc ${B.zaman - H.zaman} dk; ${(gomme / (B.zaman - H.zaman)).toFixed(2)} donemde oduyor`);
kural 6  servis 12  denetlenen cift 72  ekip 5
belge duzeni : uyum 50/72 (%69)  ihlal 22  ekiplerin harcadigi 830 dk
hatta gomulu : uyum 68/72 (%94)  kayitli istisna 4  ekiplerin harcadigi 152 dk
hat 14 ihlali ekibe hic sormadan duzeltti, 4 ihlalde ret verdi
ekip basina ihlal (belge duzeni): sayac-okuma 1  dogrulama 1  faturalama 9  saha 9  raporlama 2

gorunmezlik: 64/72 cift kural hic gorunmeden uyumlu  (ekibin gordugu 8: 4 ret + 4 muafiyet)
kurali hic gormeyen ekip 2/5: dogrulama, raporlama   belge duzeninde bes ekibin besi de 6 kuralin tamamini okudu
hatta gomme bedeli 540 dk (bir kerelik, 6 kural x 90 dk); donem basina kazanc 678 dk; 0.80 donemde oduyor

Üç sayı aynı yöne gider. Uyum oranı yüzde 69’dan yüzde 94’e çıkar, ihlal 22’den 4 kayıtlı istisnaya iner, ekiplerin harcadığı zaman 830 dakikadan 152 dakikaya düşer. Kuralları hatta gömmenin bir kerelik bedeli 540 dakikadır ve tek bir denetim döneminin kazancı bunu karşılar.

Asıl sayı dördüncü satırdadır: hat on dört ihlali ekibe hiç sormadan düzeltti. Yetmiş iki çiftin altmış dördünde kural hiç görünmeden karşılandı; ekiplerin gördüğü yalnız sekiz çifttir ve bunların dördü ret, dördü muafiyettir. Beş ekibin ikisi — doğrulama ve raporlama — bu dönemde kuralların hiçbirini görmedi, oysa belge düzeninde beşi de altı kuralın tamamını okumak zorundaydı.

İhlallerin ekiplere dağılımı bir başka şeyi gösterir. Belge düzenindeki 22 ihlalin 18’i iki ekipten gelir: faturalama 9, saha 9. Belge herkese eşit yazılmıştı ve herkes eşit okumadı. Hatta gömülü düzende bu eşitsizlik ortadan kalkmaz, görünmez olur — hat sessizce düzelttiği için hangi ekibin dikkatsiz olduğu artık hiçbir yerde yazılı değildir. Gizlenen katman burada yalnız kuralı değil, kuralın kimin elinde ihlal edildiği bilgisini de gizler.

Gizlenen katman bir yerde geri sızar. Hattın sessizce yaptığı düzeltme ekibin beklediği davranışı değiştirdiğinde, ekip bunu kural metninden değil sonuçtan öğrenir: kütük düzeyi ayrıntıdan özete çekilince açık bir hata arayışı elindeki ayrıntıyı kaybeder. Sızma tam olarak muafiyet başvurusuna yol açan şeydir; tarife servisinin muafiyeti bu yüzden istenmiştir. Sessiz düzeltme uyum oranını yükseltir ve aynı anda ekibin kendi sisteminde neyin neden değiştiğini bilmediği bir alan açar.

Muafiyetin Ömrü

// muafiyet.mjs — muafiyetlerin omru: verilen sure, gecen sure, suresi dolmus ve hala acik olanlar.
import { TANIM, KURAL, MUAFIYET, SURE } from "./kural.mjs";

const otomatik = new Set(KURAL.filter(([, , t]) => t === "otomatik").map(([a]) => a));
console.log("servis            kural               verilen  gecen  gecikme  durum");
let verilenT = 0, gecenT = 0, acikDolmus = 0;
for (const [s, k, gecen, sure] of MUAFIYET) {
  const gecikme = gecen - sure;
  verilenT += sure; gecenT += gecen; acikDolmus += gecikme > 0 ? 1 : 0;
  console.log(`${s.padEnd(18)}${k.padEnd(20)}${String(sure).padStart(5)} g${String(gecen).padStart(7)}` +
    `${String(Math.max(0, gecikme)).padStart(9)}  ${gecikme > 0 ? "suresi dolmus, hala acik" : "suresi icinde"}`);
}
const n = MUAFIYET.length;
console.log(`ortalama verilen sure ${(verilenT / n).toFixed(1)} gun, ortalama gecen ` +
  `${(gecenT / n).toFixed(1)} gun -> omur verilen surenin ${(gecenT / verilenT).toFixed(1)} kati`);
console.log(`suresi dolmus ve hala acik ${acikDolmus}/${n}`);

const otoMuaf = MUAFIYET.filter(([, k]) => otomatik.has(k));
const ekipler = [...new Set(MUAFIYET.map(([s]) => TANIM[s].ekip))];
console.log(`otomatik kural uzerindeki muafiyet ${otoMuaf.length}/${n}` +
  ` (${otoMuaf.map(([s, k]) => `${s}/${k.split(" ")[0]}`).join(", ")});` +
  ` bu kurallar ilgili ekibe yalnizca muafiyet yuzunden gorundu`);
console.log(`muafiyetsiz duzende hattan gecemeyecek servis ${n}/${Object.keys(TANIM).length}` +
  ` (%${Math.round(n / Object.keys(TANIM).length * 100)}), ${ekipler.length} ekip: ${ekipler.join(", ")}`);

const cift = Object.keys(TANIM).length * KURAL.length;
console.log(`\nbasvuru zamani ${n * SURE.basvuru} dk; muafiyet kaydi ${n} ihlali gorunur kiliyor,` +
  ` belge duzeninde ayni ${n} ihlal 22 ihlalin icinde ayirt edilemiyordu`);
for (const c of [0, 1, 2, 3, 4]) {                  // ceyrek basina bir yeni muafiyet varsayimi
  const u = cift - (n + c);
  if (c === 0 || c === 4) console.log(`${c === 0 ? "bugun" : c + ". ceyrek"}: acik muafiyet ` +
    `${n + c}, uyum ${u}/${cift} (%${(u / cift * 100).toFixed(0)})`);
}
servis            kural               verilen  gecen  gecikme  durum
olcum-deposu      K1 maskeleme           30 g    210      180  suresi dolmus, hala acik
saha-emir         K5 saklama suresi      90 g    120       30  suresi dolmus, hala acik
tarife-servisi    K4 kutuk duzeyi        14 g    240      226  suresi dolmus, hala acik
harita-ucu        K6 duman sinamasi      60 g     45        0  suresi icinde
ortalama verilen sure 48.5 gun, ortalama gecen 153.8 gun -> omur verilen surenin 3.2 kati
suresi dolmus ve hala acik 3/4
otomatik kural uzerindeki muafiyet 2/4 (tarife-servisi/K4, harita-ucu/K6); bu kurallar ilgili ekibe yalnizca muafiyet yuzunden gorundu
muafiyetsiz duzende hattan gecemeyecek servis 4/12 (%33), 3 ekip: sayac-okuma, saha, faturalama

basvuru zamani 120 dk; muafiyet kaydi 4 ihlali gorunur kiliyor, belge duzeninde ayni 4 ihlal 22 ihlalin icinde ayirt edilemiyordu
bugun: acik muafiyet 4, uyum 68/72 (%94)
4. ceyrek: acik muafiyet 8, uyum 64/72 (%89)

Muafiyet, hattın dışına çıkmanın tek kayıtlı yoludur ve dört serviste kullanılmıştır. Verilen süreler kısadır — ortalama 48,5 gün — ama üzerinden geçen süre ortalama 153,8 gündür: muafiyetin ömrü verilen sürenin üç katıdır ve dördün üçü süresi dolduğu hâlde hâlâ açıktır. En uzunu iki yüz yirmi altı gün gecikmiştir ve gerekçesi geçici bir hata arayışıdır.

Muafiyetlerin ikisi hattın kendi düzelttiği kurallar üzerindedir. Bu iki kural ilgili ekiplere yalnızca muafiyet yüzünden görünmüştür: muafiyet, görünmez kuralı görünür kılan tek yoldur. Kuralı hiç görmeden uyan ekip onu tartışamaz da; kuralın yanlış olduğunu ancak muafiyet isteyen fark eder.

Dışına çıkanların sayısı da buradan okunur. Muafiyet düzeni olmasaydı bu dört servis hattan hiç geçemezdi: on iki servisin dördü, yani yüzde otuz üçü ve üç ekip altın yolun tamamen dışında kalırdı. Muafiyetin bedeli 120 dakikalık başvuru zamanıdır ve karşılığında dört ihlal ad ad görünür olur; belge düzeninde aynı dört ihlal, 22 ihlalin içinde ayırt edilemiyordu. Ama kayıt kendi başına kapanma üretmez: çeyrek başına bir yeni muafiyet açılıp hiçbiri kapanmazsa dördüncü çeyrekte uyum yüzde 94’ten yüzde 89’a iner. Kapatma işi hattın değil, muafiyeti verenin üzerindedir.

Özet

  • Aynı 6 kural aynı 12 servis tanımında koşturuldu: belge düzeninde uyum 50/72 (%69), hatta gömülü düzende 68/72 (%94); ihlal 22’den 4 kayıtlı istisnaya indi.
  • Ekiplerin harcadığı zaman 830 dakikadan 152 dakikaya düştü; hatta gömmenin 540 dakikalık bir kerelik bedeli tek denetim döneminde karşılandı.
  • Görünmezlik ölçüldü: 72 çiftin 64’ünde kural hiç görünmeden karşılandı, 5 ekibin 2’si bu dönemde kuralların hiçbirini görmedi; belge düzeninde 5 ekibin 5’i 6 kuralın tamamını okumak zorundaydı.
  • Belge düzenindeki 22 ihlalin 18’i iki ekipten geliyordu; hat bunu düzeltti ama aynı zamanda hangi ekibin dikkatsiz olduğu bilgisini de görünmez kıldı.
  • 4 muafiyetin ortalama verilen süresi 48,5 gün, üzerinden geçen süre 153,8 gündü — ömür verilen sürenin 3,2 katı ve 4’ün 3’ü süresi dolduğu hâlde açık.
  • Muafiyet düzeni olmasaydı 12 servisin 4’ü (%33) ve 3 ekip altın yolun tamamen dışında kalırdı; muafiyet, hattın gizlediği kuralı ekibe gösteren tek yoldur.

Sonraki Adım

Ortam istendiği anda geliyor, iskelet yeni servisi başlatıyor, katalog sahibi gösteriyor ve kurallar hatta gömülü. Dört yetenek de bir şeyi gizledi ve gizlediği şeyin bedelini birileri ödedi — ama o bedelin kime yazıldığı henüz sorulmadı. Ölçüm ağında paylaşılan bir depo, paylaşılan bir hat havuzu ve paylaşılan bir gösterge yığını var; bunların faturası bugün tek bir kaleme yazılıyor ve hiçbir ekip kendi tükettiğini görmüyor. Bir sonraki ders ekip bazlı muhasebeyi ele alır: paylaşılan kaynağın bölüştürülmesi, bölüştürülemeyen kalem ve maliyeti görünür kılmanın davranışa etkisi.

İ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