Ders 10 / 10
Uyumluluk Gereksinimleri
Dışarıdan gelen kısıtların denetime çevrilmesi: beş kısıt türünün 15 bildirilmiş kopya üzerinde koşturulması, dar erişim tanımıyla 10 ihlalin 7'sinin yakalanıp 3'ünün kaçması, tanım genişleyince yakalananın 8'e ve yanlış alarmın 3'e çıkması, gevşetme yerine yılda 27.375 satır kanıt üretilmesi ve kısıtın mimariye bir yeni bileşen ile 11 yeni bağa mal olması.
İçindekiler
Önceki ders kuralın eskimesini ölçtü ve iki çıkış yolu saydı: yapılandırmayı güncellemek ya da kuralı gevşetmek. İkisi de mimarinin elindeydi, çünkü kuralları mimarinin kendisi koymuştu — kapı listesini, izin listesini ve istisnaları seçen de, eskiyince değiştiren de aynı taraftı.
Bu dersin kısıtları dışarıdan gelir. Bir uyumluluk gereksinimi (compliance requirement), sistemin dışındaki bir yükümlülüğün mimariye düşen payıdır; kaldırmak, gevşetmek ya da kendi kararıyla istisna yazmak seçenek değildir. Kursun ölçüsü aynı kalır — kısıt koşturulabilir bir denetime çevrilebiliyor mu, çevrilemiyorsa yerine ne konuyor — ama üç yerde ayrışır: gevşetmenin yerini kanıt alır, çevrilemeyen kısım kuralın yorumunda durur ve kısıt mimarinin biçimini doğrudan değiştirir. Kısıtlar burada tür olarak anılır: saklama süresi zorunluluğu, veri yerleşimi kısıtı, silme hakkı, erişim kaydı tutma yükümlülüğü, denetlenebilirlik yükümlülüğü.
Beş Kısıt Türü, Beş Denetim
Örnek yine kursun kurgu bölgesel kütüphane ağıdır. YN19 — veri sınıfı çizelgesi: beş veri sınıfı, her biri için saklama alt sınırı, üst sınırı, izinli bölge, silme hakkının olup olmadığı ve erişim kaydı yükümlülüğü. YN20 — bildirilmiş kopya çizelgesi: on beş kopya; her satır bir veri sınıfının bir bileşende, bir bölgede duran örneğidir ve en eski kaydın yaşını, erişim kaydının tutulup tutulmadığını, silme akışına bağlı olup olmadığını taşır. YN21 — bilinen ihlal kümesi: on elle etiketli ihlal; ikisi çizelgede hiç görünmeyen bildirilmemiş kopyadır. YN22 — erişim tanımının iki kapsamı: dar tanım yalnız doğrudan okumayı erişim sayar, geniş tanım türetilmiş okumayı da sayar.
Aşağıdaki dosya çizelgeleri, beş denetimi ve ölçümü kurar. Süreç içi bir modeldir; gerçek depo, ağ ya da kayıt yoktur.
// uyum/olc.mjs — disaridan gelen kisitlarin koşturulabilir denetime cevrilmesi. Surec ici model: // bolgesel kutuphane agi (kurgu); gercek depo, ag ve kayit yoktur, her kopya bir satirdir. const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|")); const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); // Veri sinifi: ad|saklama alt siniri (gun)|ust sinir (0 = yok)|izinli bolge|silme hakki|erisim kaydi const SINIF = Object.fromEntries(satir(` uye-kimlik|0|1825|ic|1|1 odunc-kaydi|365|1095|ic|1|1 odeme-kaydi|3650|0|ic|0|1 arama-gecmisi|0|180|ic dis|1|1 erisim-kaydi|730|2555|ic|0|0`).map(([ad, alt, ust, b, s, k]) => [ad, { alt: +alt, ust: +ust, bolge: b.split(" "), silme: s === "1", kayit: k === "1" }])); // Bildirilmis kopya: sinif|bilesen|bolge|en eski kaydin yasi|erisim kaydi tutuluyor|silme akisinda|okuma const KOPYA = satir(` uye-kimlik|uyelik|ic|900|1|1|dogrudan uye-kimlik|odunc|ic|1200|1|1|dogrudan uye-kimlik|bildirim|ic|400|0|0|dogrudan uye-kimlik|arsiv|dis|2000|0|0|dogrudan uye-kimlik|yedek|ic|2200|0|0|dogrudan odunc-kaydi|odunc|ic|1200|1|1|dogrudan odunc-kaydi|rapor|ic|1500|0|0|turetilmis odunc-kaydi|arsiv|dis|2000|0|0|dogrudan odeme-kaydi|ucret|ic|2000|1|0|dogrudan odeme-kaydi|yedek|ic|2200|0|0|dogrudan odeme-kaydi|rapor|ic|3700|0|0|turetilmis arama-gecmisi|katalog-kapisi|ic|30|0|1|turetilmis arama-gecmisi|rapor|ic|300|0|0|turetilmis erisim-kaydi|olay-gunlugu|ic|800|1|0|dogrudan erisim-kaydi|yedek|ic|2200|0|0|dogrudan`).map(([sinif, bilesen, bolge, yas, kayit, silme, okuma]) => ({ ad: `${sinif}|${bilesen}`, sinif, bilesen, bolge, yas: +yas, kayit: kayit === "1", silme: silme === "1", okuma })); // Bes kisit turu. "kapsam" erisim tanimidir: dar yalnizca dogrudan okumayi erisim sayar. const denetim = (kapsam) => ({ "D1 saklama ust siniri": (k) => SINIF[k.sinif].ust > 0 && k.yas > SINIF[k.sinif].ust, "D2 saklama alt siniri": (k) => SINIF[k.sinif].alt > 0 && k.yas < SINIF[k.sinif].alt, "D3 veri yerlesimi": (k) => !SINIF[k.sinif].bolge.includes(k.bolge), "D4 silme hakki": (k) => SINIF[k.sinif].silme && !k.silme, "D5 erisim kaydi": (k) => SINIF[k.sinif].kayit && !k.kayit && (kapsam === "genis" || k.okuma === "dogrudan"), }); // Elle etiketlenmis gercek ihlal kumesi (model girdisi); son ikisi bildirilmemis kopyadir const GERCEK = satir(` uye-kimlik|bildirim uye-kimlik|arsiv odunc-kaydi|odunc odunc-kaydi|rapor odunc-kaydi|arsiv odeme-kaydi|yedek arama-gecmisi|katalog-kapisi arama-gecmisi|rapor uye-kimlik|rapor odeme-kaydi|bildirim`).map((x) => x.join("|")); const KAPSAM = ["dar", "genis"]; console.log(`${KOPYA.length} bildirilmis kopya, ${Object.keys(SINIF).length} veri sinifi, ` + `${Object.keys(denetim("dar")).length} kisit turu, ${GERCEK.length} elle etiketli ihlal ` + `(${GERCEK.filter((a) => !KOPYA.some((k) => k.ad === a)).length} tanesi bildirilmemis kopya)`); const K = [-24, 12, 12]; console.log(); yaz(K, "kisit turu", "isaretli: dar", "genis"); for (const ad of Object.keys(denetim("dar"))) yaz(K, ad, ...KAPSAM.map((s) => KOPYA.filter(denetim(s)[ad]).length)); const S = [-16, 16, 11, 7, 14, 13], R = {}; console.log(); yaz(S, "erisim tanimi", "isaretli kopya", "yakalanan", "kacan", "yanlis alarm", "dogru gecen"); for (const s of KAPSAM) { const d = denetim(s); const isaretli = KOPYA.filter((k) => Object.values(d).some((f) => f(k))); const yakalanan = isaretli.filter((k) => GERCEK.includes(k.ad)).length; R[s] = { isaretli: isaretli.length, yakalanan, kacan: GERCEK.length - yakalanan, yanlis: isaretli.length - yakalanan, dogru: KOPYA.length - isaretli.length - (GERCEK.length - yakalanan - GERCEK.filter((a) => !KOPYA.some((k) => k.ad === a)).length) }; yaz(S, s, R[s].isaretli, `${yakalanan}/${GERCEK.length}`, R[s].kacan, R[s].yanlis, R[s].dogru); } // Kanit: gevsetme secenegi yok, kosum kaydi isteniyor. Kanit da bir veri sinifidir. const SATIR_BAYT = 120, GUN = 365, SAKLA = SINIF["erisim-kaydi"].ust; const kosum = KOPYA.length * Object.keys(denetim("dar")).length; console.log(`\nkanit: kosum basina ${KOPYA.length} x 5 = ${kosum} satir; gunde bir kosum -> ` + `yilda ${(kosum * GUN).toLocaleString("tr-TR")} satir, ` + `${((kosum * GUN * SATIR_BAYT) / 1e6).toFixed(2)} MB`); console.log(`kanit ${SAKLA} gun saklanir (erisim kaydi ust siniri) -> ` + `${(kosum * SAKLA).toLocaleString("tr-TR")} satir, ${((kosum * SAKLA * SATIR_BAYT) / 1e6).toFixed(2)} MB`); // Kisitin mimariye maliyeti: yerinden oynayan bilesen ve yeni bag const M = [-28, 10, 12]; console.log(); yaz(M, "mimariye maliyet", "dar", "genis"); const disari = new Set(KOPYA.filter(denetim("dar")["D3 veri yerlesimi"]).map((k) => k.bilesen)); const silmeBag = KOPYA.filter(denetim("dar")["D4 silme hakki"]).length; yaz(M, "yerinden oynayan bilesen", disari.size, disari.size); yaz(M, "yeni bilesen (silme yayini)", 1, 1); yaz(M, "yeni bag: silme akisi", silmeBag, silmeBag); const kayitBag = KAPSAM.map((s) => KOPYA.filter(denetim(s)["D5 erisim kaydi"]).length); yaz(M, "yeni bag: erisim kaydi", ...kayitBag); yaz(M, "yeni bag toplam", ...kayitBag.map((x) => x + silmeBag)); // Cevrilemeyen kisim: yukumlulugun yorumu ve kapsamin siniri const [YORUM, GOZDEN, SAAT] = [6, 2, 3]; // model girdisi console.log(`\ncevrilemeyen: yukumlulugun yorumu ve kapsamin siniri; yerine ${YORUM} yorum kaydi, ` + `yilda ${GOZDEN} gozden gecirme x ${SAAT} kisi-saat = ${YORUM * GOZDEN * SAAT} kisi-saat/yil`); console.log(`yorum dar'dan genis'e cevrilince: yakalanan ${R.dar.yakalanan} -> ${R.genis.yakalanan}, ` + `kacan ${R.dar.kacan} -> ${R.genis.kacan}, yanlis alarm ${R.dar.yanlis} -> ${R.genis.yanlis}, ` + `yeni bag ${kayitBag[0] + silmeBag} -> ${kayitBag[1] + silmeBag}`);
15 bildirilmis kopya, 5 veri sinifi, 5 kisit turu, 10 elle etiketli ihlal (2 tanesi bildirilmemis kopya) kisit turu isaretli: dar genis D1 saklama ust siniri 6 6 D2 saklama alt siniri 2 2 D3 veri yerlesimi 2 2 D4 silme hakki 6 6 D5 erisim kaydi 5 9 erisim tanimi isaretli kopya yakalanan kacan yanlis alarm dogru gecen dar 9 7/10 3 2 5 genis 11 8/10 2 3 4 kanit: kosum basina 15 x 5 = 75 satir; gunde bir kosum -> yilda 27.375 satir, 3.29 MB kanit 2555 gun saklanir (erisim kaydi ust siniri) -> 191.625 satir, 23.00 MB mimariye maliyet dar genis yerinden oynayan bilesen 1 1 yeni bilesen (silme yayini) 1 1 yeni bag: silme akisi 6 6 yeni bag: erisim kaydi 5 9 yeni bag toplam 11 15 cevrilemeyen: yukumlulugun yorumu ve kapsamin siniri; yerine 6 yorum kaydi, yilda 2 gozden gecirme x 3 kisi-saat = 36 kisi-saat/yil yorum dar'dan genis'e cevrilince: yakalanan 7 -> 8, kacan 3 -> 2, yanlis alarm 2 -> 3, yeni bag 11 -> 15
Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır. Beş kısıt türünün beşi de koşturulabilir bir denetime çevriliyor: saklama süresinin iki ucu birer karşılaştırma, yerleşim bir küme üyeliği, silme hakkı bir erişilebilirlik sorusu, erişim kaydı bir yüklem. Dar tanımda on beş kopyanın dokuzu işaretleniyor; on ihlalin yedisi yakalanıyor, üçü kaçıyor, iki temiz kopyaya yanlış alarm veriliyor.
Kaçan üçün ikisi denetimin göremeyeceği yerdedir: çizelgede bildirilmemiş kopyalar. Denetim yalnız bildirilen kopyayı okur ve bildirilmeyen için ürettiği sayı yoktur — bu kuralın kaçırması değil, veri kaynağının eksikliğidir ve kuralı sıkılaştırmak onu kapatmaz. Yanlış alarmların ikisi de kapsam kusurudur: yedekteki üye kimliği saklama üst sınırını aştığı için işaretleniyor ama yedek ayrı bir düzenin konusudur; ücret bileşenindeki ödeme kaydı alt sınırın altında görünüyor ama alt sınırı karşılayan kayıt başka bir depoda duruyor. İkisi de denetimin yanlışı değil, denetimin baktığı çizelgenin dar oluşudur.
Gevşetme Yok, Kanıt Var
Önceki derste yanlış alarmın ürettiği davranış kuralı kapatmaktı ve iki kural kapatıldığında yakalanan yediden dörde inmişti. Burada o düğme yoktur. Dışarıdan gelen kısıtın ayırt edici yanı, uyulmadığının değil uyulduğunun gösterilmesinin istenmesidir: istisna yerine kanıt.
Kanıt bir çıktıdır ve bedeli sayılır. Koşum başına on beş kopya çarpı beş kısıt, yani 75 satır; günde bir koşumla yılda 27.375 satır ve 3,29 MB. Kanıt kaydı denetlenebilirlik yükümlülüğü gereği saklanır — YN23, erişim kaydının üst sınırı olan 2555 gün — ve toplamı 191.625 satır, 23,00 MB olur. Buradaki kapalı halka söylenmeye değer: kanıt da bir veri sınıfıdır. Kendi saklama süresi, kendi yerleşim kısıtı ve kendi erişim kaydı yükümlülüğü vardır; denetim, ürettiği kaydı da denetlemek zorundadır.
Kısıtın Mimariye Maliyeti
Kısıt yalnız bir denetim eklemez, bileşenleri de yerinden oynatır. YN24 — kısıtın uygulanışı: izinli bölgenin dışında duran kopyaları taşıyan bileşen bölge içine taşınır, silme hakkı için bir silme yayını bileşeni eklenir ve akışa bağlı olmayan her kopyaya bir bağ açar, erişim kaydı tutulmayan her erişim için olay günlüğüne bir bağ açılır.
Alt tablo bunu sayıyor: bir bileşen yerinden oynuyor (arşiv, bölge dışındaki iki kopyayı taşıdığı için), bir bileşen doğuyor ve on bir yeni bağ açılıyor — altısı silme akışı, beşi erişim kaydı. Bu bağların hiçbiri bir niteliği yükseltmek için seçilmedi ve hiçbiri bir ödünleşmenin sonucu değil; mimarinin biçimini burada bir dış yükümlülük belirliyor. Ölçünün değeri de bu: kısıtın bedeli “uyum maliyeti” diye tek kalemde değil, taşınan bileşen ve açılan bağ olarak duruyor.
Çevrilemeyen Kısım: Yükümlülüğün Yorumu
Beş denetimin beşi de bir tanımı verilmiş kabul eder. “Erişim” nedir — bir raporun türetilmiş okuması erişim midir? “Silme” nedir — maskeleme silme sayılır mı? Denetim bu soruları yanıtlamaz, yanıtı girdi olarak alır. Çevrilemeyen kısım budur: yükümlülüğün yorumu ve kapsamın sınırı.
Yerine konan şey yazılı yorum kaydıdır ve bedeli sayılır — YN25: altı yorum kaydı, yılda iki gözden geçirme, kalem başına üç kişi-saat, toplam 36 kişi-saat. Asıl ölçüm ise yorumun sonucudur. Aynı denetim, “erişim” tanımı dardan genişe çevrildiğinde başka bir şey ölçer: yakalanan yediden sekize çıkar, kaçan üçten ikiye iner, yanlış alarm ikiden üçe çıkar ve mimarideki yeni bağ on birden on beşe. Tek bir sözcüğün kapsamı dört sayıyı birden değiştiriyor. Çevrilemeyen kısım denetimin dışında değil, girdisindedir; kuralın kendisi kadar açık yazılmadığında denetimin ürettiği her sayı tartışmalı hâle gelir.
Özet
- Beş dış kısıt türünün beşi de koşturulabilir denetime çevrildi: saklama süresinin alt ve üst sınırı, veri yerleşimi, silme hakkı, erişim kaydı.
- Dar erişim tanımında on beş bildirilmiş kopyanın dokuzu işaretleniyor; on ihlalin yedisi yakalanıyor, üçü kaçıyor, iki temiz kopyaya yanlış alarm veriliyor.
- Kaçan üçün ikisi bildirilmemiş kopyadır: denetim yalnız bildirilen kopyayı okur ve bildirilmeyen için ürettiği sayı yoktur.
- Gevşetme seçeneği yoktur, yerine kanıt istenir: yılda 27.375 satır ve 3,29 MB, 2555 günlük saklamayla 191.625 satır ve 23,00 MB. Kanıt da bir veri sınıfıdır ve kendi kısıtlarına tabidir.
- Kısıtın mimariye maliyeti sayıldı: bir bileşen yerinden oynuyor, bir bileşen doğuyor, on bir yeni bağ açılıyor (geniş tanımda on beş).
- Çevrilemeyen kısım yükümlülüğün yorumu ve kapsamın sınırıdır; yerine konan altı yorum kaydı yılda 36 kişi-saat eder ve tanımı genişletmek yakalananı 7’den 8’e, yanlış alarmı 2’den 3’e taşır.
Kurs Kapanışı
Kurs on derste tek bir soruyu sordu: bir nitelik ya da mimari kural, koşturulabilir bir denetime çevrilebiliyor mu, çevrilemiyorsa yerine ne konuyor?
| Ders | Denetime çevrilen | Yakalanan / kaçan / yanlış alarm | Çevrilemeyen ve yerine konan |
|---|---|---|---|
| Nitelik Ağacı | 30 yaprağın 25’i bir sayıya, 20’si denetime bağlandı | 11 / 7 / 23 | 10 yaprak; çeyrek ölçüm oturumu ve gözden geçirme kaçanın 4’ünü 8,5 pencere gecikme ve 100 kişi-saatle yakalıyor |
| Nitelikler Arası Gerilim | 12 karardan gerilim matrisi, eşik taraması | sekiz puanda 4 / 1 / 0, altı puanda 4 / 1 / 5 | düşüşün kabul edilebilirliği bir yargıdır; yerine 5 muafiyet kaydı, yanlış alarm 5 → 0 |
| Güvenlik Mimarisi | 7 bölge, 8 sınır, 18 geçiş; sınır başına gerekli denetim | 6 / 4 / 3 (3 açık boşluk) | sınırın doğru yerde olup olmadığı; 8 sınır için çeyrekte gözden geçirme, 24 kişi-saat |
| Ölçeklenebilirlik Kararları | üç ölçek birimi adayında kopyalama kuralı | 5 / 1 / 1 (3 doğru sessizlik) | bildirilmeyen paylaşılan kaynak; yerine kopyalama sınaması, 10 denemede 60 kişi-saat |
| Sürdürülebilirlik Ölçütleri | 12 değişikliğin dosya, modül ve derinlik ölçütü; eşik kuralı | 3 / 1 / 1 (7 doğru sessizlik) | değişikliğin zorluğu; çeyrekte 12 kişi-saatlik yerleşim gözden geçirmesi, altı çeyrekte 72 |
| Mimari Yönetişim Modelleri | 9 yönetişim kuralının 5’i denetime çevrildi; 24 karar | merkezî 12 / 0 / 8, federatif 9 / 3 / 1, danışman 6 / 6 / 1 | 4 kural; yerine 1/3 örneklem, 32 elle bakış, 12 ihlalin 7’sini görmüyor |
| Uygunluk İşlevleri | F1 yüzey büyüklüğü, F2 ölü yüzey oranı | F1 > 2 ile 5 / 0 / 6, > 10 ile 1 / 4 / 0; F2 4 / 1 / 1 |
“dışa açılan ad modülün işini anlatır”; yerine 66 sembolün 22’sini okuyan örneklem |
| Bağımlılık ve Katman Denetimi | aynı katman kuralının beş biçimi; 13 modül, 34 kenar | yasak listesi 3 / 6 / 0, katman izin listesi 7 / 2 / 1, modül izin listesi 9 / 0 / 0 | onaylanmış göç kenarı kuralla anlatılamıyor; yerine 2 süreli istisna kaydı, süre denetimi olmadan yakalama 7 → 6 |
| Evrimsel Mimari | değişime açıklığı ölçen uygunluk işlevi; 12 öneri | 7 / 1 / 1 | henüz istenmemiş değişikliğin ucuzluğu; yerine 6 senaryo ve yılda 4 gözden geçirme (24 kalem), gelen 12 değişikliğin 5’ini kapsıyor |
| Uyumluluk Gereksinimleri | beş dış kısıt türü, 15 bildirilmiş kopya | dar tanımda 7 / 3 / 2, geniş tanımda 8 / 2 / 3 | yükümlülüğün yorumu ve kapsamın sınırı; yerine 6 yorum kaydı, yılda 36 kişi-saat |
Tablonun kuralı adıyla anılmalı: bir nitelik ya da mimari kural, koşturulabilir bir denetime çevrilebildiği ölçüde yönetilebilir; çevrilemeyen kısım adıyla yazılır ve yerine konan sayılır. “Bu nitelik önemlidir” cümlesi bu kursta hiçbir yerde karar taşımadı. Üç sütun birbirinin yerine de geçmez: ikincisi denetimin neye baktığını, üçüncüsü ne kadarını doğru gördüğünü, dördüncüsü hiç bakamadığı yerde ne yapıldığını söyler. Üçünü birden yazmayan bir yönetişim düzeni yalnız yakaladıklarını bilir.
Tabloda iki örüntü tekrar ediyor. Birincisi, yakalamayı artıran her ayar yanlış alarmı da artırıyor — Nitelik Ağacı’nın 23 alarmı, Nitelikler Arası Gerilim’in altı puanlık eşiği, bu dersin geniş erişim tanımı — ve yanlış alarmın bedeli kuralın kapatılmasıdır: Nitelik Ağacı’nda iki denetim kapatılınca yakalanan 11’den 9’a, Uygunluk İşlevleri’nde F1 dördüncü yayımda kapanınca 9 ihlalli yayımın 8’i, Evrimsel Mimari’de iki kural kapatılınca yakalanan 7’den 4’e gitti. İkincisi, çevrilemeyenin yerine konan şey her derste insan zamanıdır ve pahalıdır: 100, 24, 60, 72 ve 36 kişi-saat, 32 elle bakış, 22 sembollük örneklem, 24 inceleme kalemi.
Kursun bıraktığı soru tablonun altındadır. Kurallar yazıldı, denetime çevrildi, yakaladığı ve kaçırdığı sayıldı. Ama kuralı yazan, koşturan, yanlış alarm karşısında kapatan ve çevrilemeyen kısım için gözden geçirme oturumuna oturan insanlardır. Ekiplerin nasıl bölündüğü, kararın hangi sınırda alındığı ve teslimatın nasıl aktığı mimariyi doğrudan biçimlendiriyor; bu kurs boyunca hiç ele alınmadı. Sonraki kurs Süreç, Ekip ve Teslimat o katmanı ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.