İçeriğe geç
academia.sh

Ders 09 / 09

Güvenlik Borcu

Otuz dört kalemlik bir borç defterinin 21'i açık, 13'ü kabul edilmiş risktir; kabullerin yalnız 5'inde geçerlilik süresi, 2'sinde yeniden değerlendirme noktası yazılıdır. Altı sorunun biri tam, dördü kısmi cevaplanır, biri cevapsızdır; kısmi cevapları tam yapmak 26 alan yazmayı gerektirir. Dört dönemlik kuyruk 48 kişi-günü kapasiteyle 209 kişi-günlük defterin 11 kalemini kapatır ve kalan kuyruğun ortalama yaşı 91 günden 360 güne çıkar. Süresi hiç yazılmamış 8 kabul kalemi hiçbir dönemde yeniden sorulmaz; süresi dolmuş 3 kabulden yalnız biri yeniden değerlendirme noktası taşır.

İçindekiler

Önceki ders iki ölçütü hesapladı ve ikisinin de ölçülen şeye dokunulmadan iyileştirilebildiğini gösterdi. En ucuz iyileştirme yaşlı kalemi kabul edilmiş riske çevirmekti: açık yaşı 59,8 günden 23,4 güne indi, düzeltilen kalem sayısı sıfır kaldı. O yedi kalem bir yere gitti ve gittiği yer bu dersin konusudur.

Kabul edilmiş risk ile açık borç birlikte güvenlik borcunu oluşturur. Yazılım Mimarlığı müfredatında teknik borç ölçülmüştü; o ölçüm burada tekrarlanmaz ve güvenlik borcunu ondan ayıran tek bir alan vardır: kabulün bir süresi olur. Teknik borç kendiliğinden ödenmez ama süresi de dolmaz; kabul edilmiş bir risk, süresi yazılmadığında borç olmaktan çıkıp kayıt olur.

Borç Defteri

UY21. Borç defteri 34 kalemdir: önceki dersin kapanmamış 21 açık kalemi ve daha önce kabule çevrilmiş 13 kalem. Küme kurgu bölgesel ölçüm ağının abone portalı ekibine ait bir modeldir; üreteç bu blokta yazılıdır, tohum görünürdür. UY22. Her kalemin bir çabası (kişi-günü) ve bir risk puanı vardır; ikisi de kurgu veridir. UY23. Bir kabul kaleminde üç alan bulunabilir: adı geçen sahip, geçerlilik süresi ve yeniden değerlendirme noktası. UY24. Alanların dağılımı veri olarak verilmiştir: ilk beş kabulde süre, ilk ikisinde yeniden değerlendirme noktası, ilk altısında sahip yazılıdır.

// borc/defter.mjs — guvenlik borcu defteri MODELDIR: kurgu bolgesel olcum agi, planlama ani.
// Uretec kendi yazilmistir, tohum gorunurdur; defter her kosumda ayni cikar.
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

export const TOHUM = 41100, N_ACIK = 21, N_KABUL = 13;
let s = TOHUM;
const rnd = () => (s = (Math.imul(s, 1664525) + 1013904223) >>> 0) / 4294967296;

// Kabul kalemlerinin ilk besinde gecerlilik suresi, ilk ikisinde yeniden degerlendirme
// noktasi, ilk altisinda adi gecen sahip yazilidir; kalanlarda alan bostur. Bu dagilim veridir.
const SURE = [90, 120, 180, 180, 365];

export const DEFTER = [];
for (let i = 0; i < N_ACIK + N_KABUL; i++) {
  const kabul = i >= N_ACIK, k = i - N_ACIK;
  DEFTER.push({
    kod: `D${String(i + 1).padStart(2, "0")}`,
    sinif: kabul ? "kabul" : "acik",
    kaynak: rnd() < (kabul ? .75 : .70) ? "hat disi" : "hat",
    risk: 4 + Math.floor(rnd() * 21),                  // 4-24 arasi kurgu risk puani
    caba: 1 + Math.floor(rnd() * 13),                  // kisi-gunu
    yas: kabul ? 40 + Math.floor(rnd() * 380) : 20 + Math.floor(rnd() * 160),
    sure: kabul && k < SURE.length ? SURE[k] : null,
    yeniden: kabul && k < 2,
    sahip: kabul ? k < 6 : true,
  });
}
export const acik = DEFTER.filter((d) => d.sinif === "acik");
export const kabuller = DEFTER.filter((d) => d.sinif === "kabul");
export const doldu = (d) => d.sure !== null && d.yas > d.sure;

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model: ${DEFTER.length} borc kalemi, ${acik.length} acik + ${kabuller.length} kabul edilmis risk`);
  const y = gen([16, 8, 10, 12, 12, 14]);
  console.log("\n" + y("sinif", "kalem", "kisi-gunu", "risk toplam", "suresi var", "suresi dolmus"));
  for (const [ad, k] of [["acik borc", acik], ["kabul edilmis", kabuller]])
    console.log(y(ad, k.length, k.reduce((a, d) => a + d.caba, 0), k.reduce((a, d) => a + d.risk, 0),
      k.filter((d) => d.sure !== null).length, k.filter(doldu).length));

  // Bir borc kalemine sorulacak sorular ve her birinin istedigi alan.
  const SORU = [["kalem acik mi kabul mu", "sinif", DEFTER.length, DEFTER.length],
    ["kabulu kim verdi", "sahip", N_KABUL, kabuller.filter((d) => d.sahip).length],
    ["kabul kac gun gecerli", "sure", N_KABUL, kabuller.filter((d) => d.sure !== null).length],
    ["kabulun suresi doldu mu", "sure+yas", N_KABUL, kabuller.filter((d) => d.sure !== null).length],
    ["yeniden degerlendirme ne zaman", "yeniden nokta", N_KABUL, kabuller.filter((d) => d.yeniden).length],
    ["kalem hangi donemde kapanacak", "kuyruk sirasi", DEFTER.length, 0]];
  const cevap = (t, b) => t === 0 ? "yok" : t === b ? "tam" : "kismi";
  const z = gen([32, 16, 8, 10, 8]);
  console.log("\n" + z("soru", "gereken alan", "taban", "tasiyan", "cevap"));
  for (const [m, a, b, t] of SORU) console.log(z(m, a, b, t, cevap(t, b)));
  const n = (c) => SORU.filter(([, , b, t]) => cevap(t, b) === c).length;
  const yok = (f) => N_KABUL - kabuller.filter(f).length;
  const eksik = yok((d) => d.sahip) + yok((d) => d.sure !== null) + yok((d) => d.yeniden);
  console.log(`\n${SORU.length} sorunun ${n("tam")}'i tam, ${n("kismi")}'i kismi cevaplaniyor, ` +
    `${n("yok")}'i cevapsiz`);
  console.log(`kismi cevaplari tam yapmak icin ${eksik} alan yazilir; suresi dolmus ` +
    `${kabuller.filter(doldu).length} kalemin ${kabuller.filter((d) => doldu(d) && d.yeniden).length}'i ` +
    `yeniden degerlendirme noktasi tasiyor`);
}
model: 34 borc kalemi, 21 acik + 13 kabul edilmis risk

sinif              kalem kisi-gunu risk toplam  suresi var suresi dolmus
acik borc             21       141         274           0             0
kabul edilmis         13        68         185           5             3

soru                                gereken alan   taban   tasiyan   cevap
kalem acik mi kabul mu                     sinif      34        34     tam
kabulu kim verdi                           sahip      13         6   kismi
kabul kac gun gecerli                       sure      13         5   kismi
kabulun suresi doldu mu                 sure+yas      13         5   kismi
yeniden degerlendirme ne zaman     yeniden nokta      13         2   kismi
kalem hangi donemde kapanacak      kuyruk sirasi      34         0     yok

6 sorunun 1'i tam, 4'i kismi cevaplaniyor, 1'i cevapsiz
kismi cevaplari tam yapmak icin 26 alan yazilir; suresi dolmus 3 kalemin 1'i yeniden degerlendirme noktasi tasiyor

İlk tablo defterin iki sınıfını yan yana koyuyor ve asıl bilgi son iki sütunda. Kabul edilmiş 13 kalemin yalnız beşinde geçerlilik süresi yazılı; kalan sekizde kabul, sonu olmayan bir karardır. Süresi yazılı beşin üçünün süresi planlama anında zaten dolmuş durumda ve bunu kimse sormadığı için üçü de defterde kabul olarak duruyor. Risk toplamı sütunu ölçeği veriyor: kabul edilmiş kalemler defterin risk toplamının 185’ini taşıyor, açık borç 274’ünü. Kabul, riski kaldırmaz; yalnız onu ölçütlerin baktığı sütundan çıkarır.

Soru tablosunda altı sorunun biri tam cevaplanıyor. Kalan beşi yalnız kabul kalemlerini ilgilendiriyor; dördü kısmi, biri hiç cevaplanmıyor. Kısmi olanları tam yapmak 26 alan yazmayı gerektiriyor — yedi sahip, sekiz süre, on bir yeniden değerlendirme noktası. Bu, kurstaki en ucuz bedeldir ve bir hat kurulumu ya da ek hacim gerektirmez; yazılacak şey kararın kendisidir. Son satır bunun karşılığını veriyor: süresi dolmuş üç kabulden yalnız biri kendisini yeniden gündeme getirecek bir nokta taşıyor.

Kuyruğu Koşturmak

UY25. Kapasite dönem başına 12 kişi-günü, dönem 90 gün ve planlama ufku dört dönemdir; üçü de kurgu veridir. Sıralama kuralı birim çabaya düşen risktir ve kapasiteye sığmayan kalem sonraki döneme kalır. UY26. İki koşum karşılaştırılır: kabul edilmiş kalemin hiç geri gelmediği defter ve süresi dolan kabulün — yeniden değerlendirme noktası varsa — kuyruğa geri girdiği defter.

// borc/kuyruk.mjs — borc sabit kapasiteli bir kuyruk olarak dort donem kosturulur.
import { DEFTER, acik, kabuller, doldu, gen } from "./defter.mjs";

const KAPASITE = 12, DONEM = 4, DONEM_GUN = 90;   // kisi-gunu, donem sayisi, donem uzunlugu

// Siralama birim cabaya dusen risktir; kapasiteye sigmayan kalem sonraki doneme kalir.
// geriDonus acikken: suresi dolan ve yeniden degerlendirme noktasi olan kabul kuyruga girer.
const kosuf = (geriDonus) => {
  const kuyruk = acik.map((d) => ({ ...d })), bekleyen = kabuller.map((d) => ({ ...d }));
  const satir = [];
  for (let t = 1; t <= DONEM; t++) {
    let geri = 0;
    if (geriDonus) for (const d of bekleyen)
      if (!d.donuk && d.yeniden && doldu(d)) { d.donuk = true; kuyruk.push(d); geri++; }
    kuyruk.sort((a, b) => b.risk / b.caba - a.risk / a.caba);
    let kalan = KAPASITE;
    for (const d of kuyruk) if (!d.kapali && d.caba <= kalan) { d.kapali = true; kalan -= d.caba; }
    const acikta = kuyruk.filter((d) => !d.kapali);
    satir.push([t, geri, kuyruk.filter((d) => d.kapali).length, KAPASITE - kalan, acikta.length,
      acikta.reduce((a, d) => a + d.caba, 0),
      Math.round(acikta.reduce((a, d) => a + d.yas, 0) / acikta.length)]);
    for (const d of [...acikta, ...bekleyen.filter((x) => !x.donuk)]) d.yas += DONEM_GUN;
  }
  return { satir, acikta: kuyruk.filter((d) => !d.kapali), bekleyen,
    geri: satir.reduce((a, s) => a + s[1], 0) };
};

const y = gen([8, 10, 10, 12, 10, 14, 10]);
const KOSUM = [["A: kabul geri gelmez", false], ["B: suresi dolan geri gelir", true]];
KOSUM.forEach(([ad, geriDonus], i) => {
  const r = kosuf(geriDonus);
  console.log((i ? "\n" : "") + ad);
  console.log(y("donem", "geri gelen", "kapanan", "harcanan", "kalan", "kalan kisi-gunu", "ort yas"));
  for (const s of r.satir) console.log(y(...s));
  const gizli = r.bekleyen.filter((d) => !d.donuk);
  console.log(`defterde gorunen borc ${r.acikta.length} kalem / ` +
    `${r.acikta.reduce((a, d) => a + d.caba, 0)} kisi-gunu; ` +
    `kuyruga hic girmeyen kabul ${gizli.length} kalem / ` +
    `${gizli.reduce((a, d) => a + d.caba, 0)} kisi-gunu, risk toplami ` +
    `${gizli.reduce((a, d) => a + d.risk, 0)}`);
});

console.log(`\ndort donemde toplam kapasite ${KAPASITE * DONEM} kisi-gunu; defterin tamami ` +
  `${DEFTER.reduce((a, d) => a + d.caba, 0)} kisi-gunu`);
console.log(`planlama aninda suresi dolmus ${kabuller.filter(doldu).length} kabulun ` +
  `${kabuller.filter((d) => doldu(d) && d.yeniden).length} tanesi yeniden degerlendirme noktasi ` +
  `tasiyor; dort donem boyunca kuyruga geri donen kabul ${kosuf(true).geri}`);
console.log(`suresi hic yazilmamis ${kabuller.filter((d) => d.sure === null).length} kalem ` +
  `hicbir donemde yeniden sorulmuyor`);
A: kabul geri gelmez
donem   geri gelen   kapanan    harcanan     kalankalan kisi-gunu   ort yas
1                0         4          12        17           129        91
2                0         7          12        14           117       175
3                0         9          10        12           107       259
4                0        11          12        10            95       360
defterde gorunen borc 10 kalem / 95 kisi-gunu; kuyruga hic girmeyen kabul 13 kalem / 68 kisi-gunu, risk toplami 185

B: suresi dolan geri gelir
donem   geri gelen   kapanan    harcanan     kalankalan kisi-gunu   ort yas
1                1         4          11        18           133        87
2                1         7          11        16           130       175
3                0         9          12        14           118       260
4                0        11          11        12           107       349
defterde gorunen borc 12 kalem / 107 kisi-gunu; kuyruga hic girmeyen kabul 11 kalem / 57 kisi-gunu, risk toplami 150

dort donemde toplam kapasite 48 kisi-gunu; defterin tamami 209 kisi-gunu
planlama aninda suresi dolmus 3 kabulun 1 tanesi yeniden degerlendirme noktasi tasiyor; dort donem boyunca kuyruga geri donen kabul 2
suresi hic yazilmamis 8 kalem hicbir donemde yeniden sorulmuyor

Kuyruk dört dönemde 11 kalem kapatıyor ve iki koşumda da aynı sayıyı kapatıyor. Kapasite sabittir: dört dönemde 48 kişi-günü, defterin tamamı ise 209 kişi-günü. Bu oran planın sınırını yazıyor — bu kapasiteyle defter kapanmaz, yalnız sıralanır. Üçüncü dönemde harcanan kapasite 10 kişi-gününde kalıyor, çünkü sıradaki kalem kalan iki güne sığmıyor; sabit kapasiteli bir kuyruk kapasitesini tam kullanamaz ve bu kayıp sıralama kuralının değil kalem boyutunun sonucudur.

Asıl bilgi son iki sütunda. Kalan kalem sayısı 17’den 10’a düşerken ortalama yaş 91 günden 360 güne çıkıyor. Kuyruk kısalıyor ve yaşlanıyor: birim çabaya düşen risk kuralı ucuz ve riskli kalemleri öne alıyor, pahalı kalemler her dönem bir sonrakine devrediyor. Bir borç planının başarısı kapanan kalem sayısıyla değil, hiç sıraya gelmeyen kalemin yaşıyla okunur.

İki koşum arasındaki fark tek satırdır ve dersin cevabıdır. A koşumunda dört dönem sonunda defter 10 kalem ve 95 kişi-günü gösteriyor; kuyruğa hiç girmeyen 13 kabul kalemi 68 kişi-günü ve 185 risk puanı taşıyor ve hiçbir dönemde sorulmuyor. B koşumunda süresi dolan iki kabul geri geliyor, defter 12 kaleme çıkıyor ve gizli kalan yük 185’ten 150’ye iniyor. Defterin büyümesi kötüleşme değil, ölçümün genişlemesidir. Geri dönen kalem sayısının ikide kalmasının nedeni de bellidir: sekiz kabulde süre hiç yazılmamıştır ve süresi olmayan bir kabul, hiçbir kuralın geri getiremeyeceği tek kalem türüdür.

Özet

  • Güvenlik borcu iki sınıftan oluşur ve teknik borçtan tek bir alanla ayrılır: kabulün bir süresi vardır. Defterin 34 kaleminin 21’i açık borç, 13’ü kabul edilmiş risktir.
  • Kabullerin yalnız 5’inde süre, 2’sinde yeniden değerlendirme noktası, 6’sında adı geçen sahip yazılıdır; süresi yazılı beşin üçünün süresi planlama anında zaten dolmuştur.
  • Altı sorunun biri tam, dördü kısmi cevaplanır, biri cevapsızdır; kısmi olanları tam yapmanın bedeli 26 alandır ve bu bedel hiçbir hat kurulumu ya da ek hacim gerektirmez.
  • Dört dönemde 48 kişi-günü kapasite 209 kişi-günlük defterin 11 kalemini kapatır; kalan kuyruk 17 kalemden 10’a inerken ortalama yaşı 91 günden 360 güne çıkar.
  • Süresi ve yeniden değerlendirme noktası yazılmayan kabul defterden kalıcı olarak düşer: 13 kabulden 11’i hiçbir dönemde yeniden sorulmaz ve 150 risk puanı ölçüm dışında kalır.

Kurs Kapanışı

Dokuz ders boyunca tek bir soru soruldu: olaydan sonra sorulacak soruların kaçı cevaplanabiliyor ve cevaplanabilir kılmak neye mal oluyor. Her dersin kendi kalem kümesi, kendi soru kümesi ve kendi bedel sütunu vardı.

Ders Kaç soru Cevaplanabilen Cevaplanabilir kılmanın bedeli
Denetim Kaydı Tasarımı 16 soru 6 → 13 1,45 kat hacim, 65→45 gün saklama, 3 kişisel veri kalemi
Uygulamaya Özgü Tespit Senaryoları 18 kötüye kullanım 15 → 18 173 yanlış uyarı, 30 günde 101 uyandırma
Uygulama İhlali Müdahalesi 12 adım 5 → 12 kayıttan 630→151 dakika; kayıtsızken 41 200 abonelik bildirim
Kısa Ömürlü İş Yüklerinde İz 5 soru × 2 000 iş yükü 6 604 / 10 000 çift 91 084 ek gönderim, 33 çekirdek-dakika
Dış Bildirim Kanalı 91 benzersiz bildirim cevapsız 36 → 0, kesin 15 → 20 5 alan, 1,45 kat hacim, 20 gün kısa saklama
Kontrollerin Mühendislik Karşılığı 26 kontrol 11 sorgu, 6 belge 9 kontrole pratik, 6 belgeye makine izi kurmak
Kanıt Otomasyonu 24 kanıt kalemi 12 dönem boyu, 6 son 90 gün 170 saat kurulum, 3 017 kat hacim, yüzde 0,63 inceleme
Uygulama Güvenlik Ölçütleri 8 soru 5 tam, 1 kısmi 568 ek durum geçişi kaydı
Güvenlik Borcu 6 soru 1 tam, 4 kısmi 26 alan; 209 kişi-günlük borca 48 kişi-günü kapasite

Bu kurs M25 Uygulama Güvenliği ve DevSecOps müfredatının beşinci ve son kursudur. Beş kursun her biri aynı kalemi başka bir aşamada yakaladı ve her biri kendi birimiyle saydı.

Kurs Ölçü ekseni Birim
K01 Güvenli Geliştirme Yaşam Döngüsü yakalama aşaması ve kat aşama
K02 Güvenli Kodlama kapsama dışarıda kalan nokta
K03 Güvenlik Otomasyonu ve Tedarik Zinciri denetimin bulduğu, kaçırdığı ve hattan aldığı süre bulgu ve dakika
K04 Çalışma Zamanı Güvenliği ve Sır Yönetimi en pahalı aşamada tutmak kaçırılan ve yanlış kesilen
K05 Tespit, Müdahale ve Uyumluluk sorunun cevaplanabilirliği cevaplanamayan soru

Beş kurs boyunca sorulan tek soru şuydu: bir kalem hangi aşamada yakalandı ve o aşamada kaça mal oldu. Güvenlik bir aşama değil, her aşamada farklı fiyatı olan bir karardır; ve en pahalı aşama her zaman sonuncusudur. Bu kursun defteri bunun son biçimidir — kabul edilmiş bir risk, kalemin hiçbir aşamada yakalanmamasının kayda geçmiş hâlidir ve süresi yazılmadığında yakalanma ihtimali de kayıttan düşer.

Müfredatın kuralı bir kez daha yazılır: bedeli yazılmayan denetim ölçülmemiş sayılır. Bir kaydın, bir uyarının, bir kanıt kaleminin ya da bir ölçütün yanına hacmi, dakikası, kişisel veri kalemi ve kişi-günü yazılmıyorsa o denetim hakkında bilinen tek şey yapıldığıdır — kaça mal olduğu ve neyi kaçırdığı değil.

İ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