İçeriğe geç
academia.sh

Ders 08 / 11

Gizli Değer ve Veri Yönetimi

Test ortamına giren gizli değerlerin dağıtımı: koşum artefaktlarında ölçülen sızma noktaları, en az yetkinin açık yüzeye etkisi, süreli yetkinin elle bıraktığı adım sayısı ve yedi yetki düzeninin aynı kusur kümesinde ürettiği kaçan hata.

İçindekiler

Önceki ders üretim benzeri ortamı bir bedele bağladı ama o ortama ne konduğunu sormadı. Veri tarafı Test Verisi Yönetimi dersinde ölçülmüştü: maskeleme kişisel alanların içeriğine bakar ve hangi özelliği koruduğu orada sayıldı. Erişim izni, kimlik, imzalama anahtarı ve dış servis belirteci bu ölçümün dışında kaldı. Bunlar gizli değerdir ve maskelenemezler — bir gizli değerin maskelenmiş hâli çalışmaz, dolayısıyla ya girer ya girmez.

Bu dersin dağıttığı kaynak yetkidir: kaç gizli değer, ne kadar kapsamla, ne kadar süreyle test ortamına girer. Dağıtımın iki karşılığı vardır — girmeyen her gizli değer bir kusur sınıfını kaçırır, giren her gizli değer bir sızma yüzeyi açar.

Sızma Yüzeyi

Sızma yüzeyi bir tahmin değil, sayılabilir bir niceliktir: bir koşumun bıraktığı artefaktlardan kaçı gizli değerin kendisini taşıyor. Aşağıdaki koşum, bildirim sınırını gerçekten çağırır ve önceki kursta ölçülen kusuru — bilinmeyen muhatap — tetikler. İki belirteç biçimi denenir: süresiz kalıcı bir belirteç ile yalnız o koşum için verilmiş bir belirteç.

// sizma.mjs — bir belirtecin kosum artefaktlarinda kac yerde gorundugu ve kosumdan sonraki degeri
import { createServer } from 'node:http';

const gecerli = new Set(['B-kalici-9f21', 'B-kosum-4a7c']);
const uyeler = new Set(['U-17']);
const sunucu = createServer((istek, yanit) => {
  const b = istek.headers['x-belirtec'] ?? '';
  const muhatap = new URL(istek.url, 'http://y').searchParams.get('muhatap');
  const [kod, govde] = !gecerli.has(b)
    ? [403, `{"hata":"gecersiz belirtec"}`]
    : uyeler.has(muhatap) ? [202, '{"durum":"kuyruga alindi"}']
      // tani govdesi istegin baglamini geri yaziyor: ucuncu sizma noktasi burasi
      : [404, `{"hata":"bilinmeyen muhatap: ${muhatap}","belirtec":"${b}"}`];
  yanit.writeHead(kod, { 'content-type': 'application/json' });
  yanit.end(govde);
});
sunucu.listen(8941, '127.0.0.1');

const TABAN = 'http://127.0.0.1:8941/bildirim';
const cagir = (b, muhatap) => fetch(`${TABAN}?muhatap=${muhatap}`, { headers: { 'x-belirtec': b } });

// Kosum, Test Ortami Yonetimi dersinde olculen kusuru tetikler: bilinmeyen muhatap.
async function kosum(b) {
  const artefakt = [`ADIM odunc-akisi x-belirtec=${b}`];      // 1: kosum kaydi
  const yanit = await cagir(b, 'U-99');
  artefakt.push(`HATA ${await yanit.text()}`);                // 2: karsi tarafin tani govdesi
  artefakt.push(`YENIDEN 1/1 x-belirtec=${b} sonuc=${yanit.status}`);   // 3: yeniden deneme ozeti
  return { artefakt, sizan: artefakt.filter((s) => s.includes(b)).length };
}

const kalici = await kosum('B-kalici-9f21');
const kosumluk = await kosum('B-kosum-4a7c');
gecerli.delete('B-kosum-4a7c');                               // yetki penceresi kapandi
const sonra = async (b) => (await cagir(b, 'U-17')).status;
const kaliciSonra = await sonra('B-kalici-9f21');
const kosumSonra = await sonra('B-kosum-4a7c');
sunucu.close();

console.log(`kalici belirtec : ${kalici.artefakt.length} artefakt, ${kalici.sizan} tanesinde deger var`);
console.log(`kosum belirteci : ${kosumluk.artefakt.length} artefakt, ${kosumluk.sizan} tanesinde deger var`);
console.log(`sizma noktasi iki bicimde de ayni : ${kalici.sizan === kosumluk.sizan}`);
console.log(`kosumdan sonraki istek, kalici belirtecle : ${kaliciSonra}`);
console.log(`kosumdan sonraki istek, kosum belirteciyle: ${kosumSonra}`);
console.log(`ekibin kodunda olmayan artefakt: ${kosumluk.artefakt[1]}`);
kalici belirtec : 3 artefakt, 3 tanesinde deger var
kosum belirteci : 3 artefakt, 3 tanesinde deger var
sizma noktasi iki bicimde de ayni : true
kosumdan sonraki istek, kalici belirtecle : 202
kosumdan sonraki istek, kosum belirteciyle: 403
ekibin kodunda olmayan artefakt: HATA {"hata":"bilinmeyen muhatap: U-99","belirtec":"B-kosum-4a7c"}

Üç sonuç okunmalı. Birincisi, tek bir başarısız çağrı üç artefakt bırakıyor ve üçü de belirtecin kendisini taşıyor. İkincisi, bu üç noktadan yalnız ikisi ekibin kendi kodundadır; üçüncüsü karşı tarafın tanı gövdesidir ve ekibin yazdığı hiçbir örtme kuralı o gövdeyi öngöremez. Üçüncüsü, iki belirteç biçimi tam olarak aynı sayıda sızıyor — sızma noktası belirtecin niteliğine değil hata yolunun biçimine bağlıdır.

Değişen tek şey koşumdan sonraki değerdir: kalıcı belirteç hâlâ 202 alıyor, koşum belirteci 403. Kaldıraç gizlemek değil, kapsam ve süredir.

Gizli Değer Kataloğu

Test ortamının istediği beş gizli değer vardır ve her biri belirli kusur sınıflarını açar. Sayılar önceki dersin kusur kümesinden gelir: orta aşamada yakalanan otuz iki kusurun tamamı bir gizli değere bağlıdır, gecelik aşamada dördü, sürüm aşamasında biri.

TS14 — üretim kapsamındaki erişim sayıları varsayımdır; dar kapsamdakiler ölçümdür. Dar kapsam, gizli değerin gerçekten dokunduğu alt kümedir ve Test Verisi Yönetimi dersinin ölçtüğü test kümesinden okundu: 772 satır, 200 üye. Üretim tarafındaki sayılar aynı sistemin üretim ölçeğine ilişkin varsayımlardır ve bir büyüklük sırası taşırlar.

TS15 — süreli düzende yetki penceresi 44 dakikadır ve kurulumdaki elle adımlar gizli değer başına sayılır. Pencere, orta aşamanın 41 dakikalık koşumu ile geçici ortamın 3 dakikalık kurulumunun toplamıdır; koşumdan kısa olamaz, çünkü koşum biterken yetkinin de bitmesi gerekir. Elle adımlar üç kalemdir: gizli değer başına bir hesap açma, dar kapsamda bir kapsam listesi yazma, otomatik vermede bir düzenek kurma. Bunlar dönem başına bir kez, koşum başına elle adım ise her koşumda yeniden ödenir.

// gizli.mjs — gizli deger katalogu ve yetki duzenleri
// asama basina geri bildirim suresi ve gizli degere bagli olmayan yakalanan kusur sayisi;
// ikisi de onceki dersin "uretim benzeri agir" satirindan okundu.
export const asamalar = {
  hizli: { geri: 8, serbest: 28 },
  orta: { geri: 49, serbest: 0 },
  gecelik: { geri: 425, serbest: 5 },
  surum: { geri: 2357, serbest: 5 },
};
export const KACAN_TABAN = 5;      // hicbir sinamanin gormedigi iki sinif
export const ELLE = 15;            // TS6: bir elle adim 15 dakika
export const KOSUM = { orta: 100, gecelik: 20, surum: 4 };

// [ad, asama, actigi kusur sayisi, yazma gerekir mi, uretim erisimi, dar kapsam erisimi]
export const gizliler = [
  ['katalog kimligi', 'orta', 13, true, 240000, 772],
  ['bildirim belirteci', 'orta', 10, false, 18000, 200],
  ['odeme anahtari', 'orta', 9, true, 9000, 41],
  ['basarim ortami kimligi', 'gecelik', 4, true, 240000, 772],
  ['olcum deposu kimligi', 'surum', 1, true, 4800, 24],
].map(([ad, asama, sayi, yazma, uretim, dar]) => ({ ad, asama, sayi, yazma, uretim, dar }));

// Bir duzen her gizli deger icin: ortama girer mi, kac kayda erisir, yazabilir mi;
// yetki penceresi (dakika), kurulumda elle adim, kosum basina elle adim.
export const duzenler = [
  { ad: 'uretim kimligi', girer: 1, erisim: (g) => g.uretim, yazar: 1, pencere: Infinity, kurulum: 0, kosumElle: 0 },
  { ad: 'ayri hesap', girer: 1, erisim: () => 772, yazar: 1, pencere: Infinity, kurulum: 5, kosumElle: 0 },
  { ad: 'salt okuma', girer: 1, erisim: () => 772, yazar: 0, pencere: Infinity, kurulum: 5, kosumElle: 0 },
  { ad: 'dar kapsam', girer: 1, erisim: (g) => g.dar, yazar: 1, pencere: Infinity, kurulum: 10, kosumElle: 0 },
  { ad: 'dar kapsam, sureli', girer: 1, erisim: (g) => g.dar, yazar: 1, pencere: 44, kurulum: 10, kosumElle: 1 },
  { ad: 'sureli, otomatik verme', girer: 1, erisim: (g) => g.dar, yazar: 1, pencere: 44, kurulum: 11, kosumElle: 0 },
  { ad: 'taklit', girer: 0, erisim: () => 0, yazar: 0, pencere: 0, kurulum: 0, kosumElle: 0 },
];

Yedi Yetki Düzeni

En az yetki ilkesi burada bir sayıya bağlanır: açık yüzey, sızan gizli değerlerin toplamda kaç kayda erişebildiğidir. Bir gizli değer gerektirdiği yazma iznini alamazsa açtığı kusur sınıfları kaçar; ortama hiç girmezse de aynı şey olur.

// kapsam.mjs — yedi yetki duzeni: sizma yuzeyi, acik yuzey, elle adim, kacan hata
import { asamalar, gizliler, duzenler, KACAN_TABAN, ELLE, KOSUM } from './gizli.mjs';

const SIZMA_NOKTASI = 3;           // olculen deger: hata yolu uc artefakt uretiyor

function olc(d) {
  const giren = d.girer === 1 ? gizliler : [];
  const acik = giren.reduce((a, g) => a + d.erisim(g), 0);
  const elleKosum = d.kosumElle * Object.values(KOSUM).reduce((a, x) => a + x, 0);

  let ek = 0;
  const geri = {};
  for (const [ad, a] of Object.entries(asamalar)) {
    if (ad !== 'hizli') ek += d.kosumElle * ELLE;
    geri[ad] = a.geri + ek;
  }

  let kacan = KACAN_TABAN, agirlik = 0, toplam = 0;
  for (const [ad, a] of Object.entries(asamalar)) {
    agirlik += a.serbest;
    toplam += geri[ad] * a.serbest;
  }
  for (const g of gizliler) {
    if (d.girer === 0 || (g.yazma && d.yazar === 0)) { kacan += g.sayi; continue; }
    agirlik += g.sayi;
    toplam += geri[g.asama] * g.sayi;
  }
  return {
    giren: giren.length, sizma: giren.length * SIZMA_NOKTASI, acik,
    pencere: d.pencere, elle: d.kurulum + elleKosum, geri: toplam / agirlik, kacan,
  };
}

const s = (x, n) => String(x).padStart(n);
console.log(`${'yetki duzeni'.padEnd(24)}${s('giren', 6)}${s('sizma', 7)}${s('acik yuzey', 12)}`
  + `${s('pencere', 9)}${s('elle adim', 11)}${s('ort geri', 10)}${s('kacan/100', 11)}`);
for (const d of duzenler) {
  const r = olc(d);
  console.log(`${d.ad.padEnd(24)}${s(r.giren, 6)}${s(r.sizma, 7)}${s(r.acik, 12)}`
    + `${s(r.pencere === Infinity ? 'sinirsiz' : r.pencere, 9)}${s(r.elle, 11)}`
    + `${s(r.geri.toFixed(1), 10)}${s(r.kacan, 11)}`);
}

const uretim = gizliler.reduce((a, g) => a + g.uretim, 0);
const dar = gizliler.reduce((a, g) => a + g.dar, 0);
const yazan = gizliler.filter((g) => g.yazma);
console.log(`\ngizli deger ${gizliler.length}, yazma isteyen ${yazan.length}, `
  + `bunlarin actigi kusur ${yazan.reduce((a, g) => a + g.sayi, 0)}`);
console.log(`uretim kapsaminda ${uretim} kayit, dar kapsamda ${dar} kayit, `
  + `daralma ${(uretim / dar).toFixed(0)} kat`);
console.log(`kosum sayisi ${Object.values(KOSUM).reduce((a, x) => a + x, 0)}; `
  + `kosum basina bir elle adim ${Object.values(KOSUM).reduce((a, x) => a + x, 0) * ELLE} dakika eder`);
yetki duzeni             giren  sizma  acik yuzey  pencere  elle adim  ort geri  kacan/100
uretim kimligi               5     15      511800 sinirsiz          0     263.5          5
ayri hesap                   5     15        3860 sinirsiz          5     263.5          5
salt okuma                   5     15        3860 sinirsiz          5     304.7         32
dar kapsam                   5     15        1809 sinirsiz         10     263.5          5
dar kapsam, sureli           5     15        1809       44        134     277.1          5
sureli, otomatik verme       5     15        1809       44         11     263.5          5
taklit                       0      0           0        0          0     371.9         42

gizli deger 5, yazma isteyen 4, bunlarin actigi kusur 27
uretim kapsaminda 511800 kayit, dar kapsamda 1809 kayit, daralma 283 kat
kosum sayisi 124; kosum basina bir elle adim 1860 dakika eder

Tablonun Okunması

İlk ve dördüncü satırlar bu dersin ana ölçümüdür. Üretim kimliğiyle dar kapsam arasında kaçan hata da (beş), ortalama geri bildirim de (263,5 dakika) birebir aynıdır; ayrıldıkları tek yer açık yüzeydir — 511.800 kayda karşılık 1.809, iki yüz seksen üç kat. En az yetkinin kaçan hatadaki bedeli sıfırdır. Ödenen şey kurulumdaki on elle adımdır ve bu adımlar dönem başına bir kez ödenir. Kapsamı daraltmayı zorlaştıran şey ölçülebilir bir takas değil, bir kez yapılacak işin ertelenmesidir.

Bu sayının bir koşulu vardır ve dersin başlığındaki ikinci yarıyı bağlar. Dar kapsamın 1.809 kaydı, ortamdaki verinin maskelenmiş test kümesi olduğunu varsayar. Ortama üretimin bir kopyası alınmışsa gizli değerin kapsamı ne kadar dar olursa olsun açık yüzey ortamın kendi büyüklüğüne eşitlenir: 240.000 kayıt orada durur ve o ortama erişebilen her belirteç onlara erişir. İki karar bu yüzden ayrı ayrı verilemez — maskelenmemiş veri en az yetkiyi geçersiz kılar, dar yetki de maskelemenin yerini tutmaz.

Üçüncü satır daraltmanın yanlış eksende yapılması hâlidir. Salt okuma yetkisi kulağa güvenli gelir, ama beş gizli değerin dördü yazma ister: katalog kimliği göç sınamasında şema değiştirir, ödeme anahtarı kart durumunu günceller, ölçüm kimlikleri sonuç yazar. Bu dördünün açtığı yirmi yedi kusur kaçar ve kaçan hata beşten otuz ikiye çıkar. Açık yüzey ise hiç küçülmez — 3.860’ta kalır, çünkü değer hâlâ ortama giriyor ve hâlâ üç noktadan sızıyor. Bu satır iki eksende birden kaybeder.

Ortalama geri bildirim sütunu burada önceki iki dersteki tuzağın tersini gösteriyor. Salt okumada ortalama 263,5’ten 304,7’ye, taklitte 371,9’a çıkıyor. Sebep kaçırılan kusurların ucuz yakalananlar olmasıdır: orta aşamanın kırk dokuz dakikalık kusurları paydadan düştüğünde geriye pahalı yakalananlar kalır ve ortalama yükselir. Aynı sütun bir derste iyileşerek, bir derste kötüleşerek yalan söyleyebiliyor; ikisinde de yalanı açığa çıkaran şey kaçan hata sütunudur.

Son satır sızma yüzeyini gerçekten sıfırlayan tek düzendir. Hiçbir gizli değer girmez, sızma noktası sıfırdır, açık yüzey sıfırdır — ve kaçan hata kırk ikidir. Dış servis taklidi bir sınama biçimi olarak Dış Servis Taklidi dersinde kuruldu; burada bir yetki kararı olarak görünüyor ve bedeli otuz yedi kusurdur. Sızma yüzeyini sıfırlamak isteyen bir düzen, sınamanın kendisini kapatmış olur.

Beşinci ve altıncı satırlar süreli yetkinin bedelini ayırır. Pencerenin sınırsızdan 44 dakikaya inmesi ne sızma noktasını (on beş) ne açık yüzeyi (1.809) değiştirir; değişen tek şey sızan değerin koşumdan sonraki işe yararlığıdır — yukarıdaki koşumun 403’ü budur. Belirteci elle vermek yüz yirmi dört koşumun her birine bir adım ekler: elle adım sayısı ondan yüz otuz dörde, ortalama geri bildirim 263,5’ten 277,1 dakikaya çıkar. Vermeyi otomatikleştirmek aynı pencereyi on bir elle adımla ve geri bildirimi hiç değiştirmeden verir. Aradaki fark tek bir kurulum adımıdır ve 1.860 dakikalık elle işi ortadan kaldırır.

Kararın Geri Dönüşü

Bir gizli değerin sızdığı görüldüğünde verilen karar, tablodaki pencere sütununa bağlıdır. Pencere sınırsızsa karar bir iptal ve yeniden verme işlemidir; o değeri kullanan her sistemin bulunması gerekir ve iş üretim tarafını tutan ekibe düşer. Pencere 44 dakikaysa karar bir kayıt açmakla sınırlıdır, çünkü değer kaydın açıldığı anda çoktan geçersizdir. Aynı olay, aynı sızma noktası, iki ayrı karar.

İkinci geri dönüş hattın kendisindedir. Yetkinin reddi (403) ile kusurun kendisi (404) bir aşamanın gözünde aynı kırmızıdır. Ayrılmadıkları sürece süresi dolmuş bir belirteç kırılgan test gibi görünür ve karantinaya alınır; karantinaya alınan test ise önceki dersin ölçtüğü gibi bir kusur sınıfını hattan düşürür. Yetki hatasını kusur hatasından ayıran bir sınıflandırma, bu yüzden bir güvenlik önlemi değil bir kapı kararıdır.

Özet

  • Gizli değer maskelenemez: ya test ortamına girer ya girmez; giren her değer bir sızma yüzeyi, girmeyen her değer bir kusur sınıfı kaçağı üretir.
  • Tek bir başarısız çağrı üç artefakt bıraktı ve üçü de belirteci taşıdı; bu üçünden biri ekibin kodunda değil, karşı tarafın tanı gövdesindeydi.
  • Sızma noktası sayısı belirtecin biçimine bağlı değildir; kalıcı ve süreli belirteç aynı sayıda sızdı, koşumdan sonra biri 202 aldı, öteki 403.
  • Kapsamı daraltmak açık yüzeyi 511.800 kayıttan 1.809’a indirdi (283 kat) ve kaçan hatayı hiç değiştirmedi; bedeli kurulumdaki on elle adımdır.
  • Salt okumaya çekmek beş gizli değerin dördünü işlevsiz bıraktı: kaçan hata beşten otuz ikiye çıktı, açık yüzey ise hiç küçülmedi.
  • Süreli yetkiyi elle vermek yüz yirmi dört koşuma birer adım ekledi (134 elle adım, geri bildirim 277,1 dakika); vermeyi otomatikleştirmek aynı pencereyi 11 adımla ve 263,5 dakikayla verdi.

Sonraki Adım

Üç ders boyunca üç dağıtım sayıldı: koşum dakikası, ortam-dakikası ve yetki. Üçünün de ürettiği sayılar aynı yerde duruyor — bir koşumun içinde. Yukarıdaki üç artefaktı okuyan kimse yoktur; kapı düzeninin ortalama geri bildirimini, ortam kuyruğunu ve açık yüzeyi kimse ekranında görmez. Bir ölçünün karar değiştirebilmesi için önce okunabilir olması gerekir ve okunabilirliğin de bir bütçesi vardır: kaç satır, kime, ne sıklıkta. Sonraki ders bu dağıtımı ele alır — koşumun bıraktığı yüzlerce satırdan hangilerinin ekibe ulaştığını ve ulaşmayanların hangi kararı sessizce iptal ettiğini sayar.

İ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