İçeriğe geç
academia.sh

Ders 05 / 11

Teknik Borç Yönetimi

Bilinçli ve bilinçsiz borcun ayrılması ve ölçülmesi: borç kalemleri iki sınıfa bölünür, borç faizi aynı değişikliğin borçlu ve borçsuz modülde çıkardığı iş farkı olarak modellenir, kalem başına yıllık faiz ve modül başına fazladan iş oranı hesaplanır, bilinçsiz borcun fark edilme gecikmesi tekrar eşiğine bağlı olarak ölçülür ve o gecikme boyunca fark edilmeden ödenen faiz sayılır.

İçindekiler

Risk kaydı gerçekleşmemiş bir şeyi izler: olasılığı olan, henüz olmamış bir olay. Yanında ikinci bir kayıt durur ve o, çoktan gerçekleşmiş bir şeyi izler. Bir karar verilirken bazen bilerek eksik bir çözüm seçilir; eksiklik sistemde kalır ve her değişiklikte fazladan iş çıkarır. Bu eksikliğin adı teknik borçtur.

Teknik borcun bir gösterge olarak nasıl tanımlandığı kalite göstergeleri konusunda ele alındı; burada tekrarlanmaz. Bu dersin iki sorusu vardır. Birincisi: borç kalemleri iki sınıfa ayrıldığında — bilerek alınan ve farkında olmadan alınan — bu ayrım ölçülebilir bir fark yaratıyor mu. İkincisi: borç faizi nedir ve nasıl sayılır.

İki Sınıf ve Faiz

Bilinçli borç, karar anında bilinerek seçilmiş eksikliktir: hızlı çıkmak için, ya da doğru çözümün ne olduğu henüz bilinmediği için. Kayda geçirilebilir, çünkü onu seçen kişi seçtiğini bilir. Bilinçsiz borç ise seçilmemiştir; bir varsayımın yanlış olduğu, bir kopyanın iki yere düştüğü sonradan anlaşılır. Kayda geçirilemez, çünkü kayıt yazılırken kimse onun farkında değildir.

Faizi ölçmenin yolu tek bir soruya indirgenir: aynı değişiklik borçlu modülde, borçsuz modüldekine göre kaç dakika fazla sürüyor. Bu, borcun “kötü” olduğunu söylemez; ne kadar kötü olduğunu söyler. Aşağıdaki modelde beş değişiklik türü, taban süreleri ve yıllık sayıları modelin girdisidir (KK14). Her borç kalemi hangi değişiklik türlerini etkilediğini ve o türde kaç dakika ek iş çıkardığını taşır. Kurgu bir modeldir.

// borc/faiz.mjs — borc kalemleri iki sinifa ayrilir, faiz degisiklik basina eklenen is olarak olculur
// Degisiklik turleri, taban sureler ve yillik sayilar modelin girdisidir (KK14); kurgu bir modeldir.
export const DEGISIKLIK = [
  { tur: "kural-degisikligi", taban: 120, yillik: 12 },
  { tur: "yeni-alan", taban: 90, yillik: 8 },
  { tur: "yeni-ekran", taban: 240, yillik: 6 },
  { tur: "hata-duzeltme", taban: 60, yillik: 30 },
  { tur: "basarim-ayari", taban: 150, yillik: 4 },
];

// ekIs: ayni degisiklik borclu modulde borcsuz moduldekine gore kac dakika fazla suruyor
export const KALEM = [
  { ad: "kural-kopyasi", sinif: "bilincli", modul: "odunc", ekIs: 35,
    etkiler: ["kural-degisikligi", "hata-duzeltme"] },
  { ad: "elle-alan-eslemesi", sinif: "bilincli", modul: "katalog-esleme", ekIs: 45,
    etkiler: ["yeni-alan", "hata-duzeltme"] },
  { ad: "gecici-uyelik-tablosu", sinif: "bilincli", modul: "uyelik", ekIs: 20,
    etkiler: ["yeni-alan", "yeni-ekran"] },
  { ad: "sabit-rapor-sorgusu", sinif: "bilincli", modul: "raporlama", ekIs: 30,
    etkiler: ["yeni-ekran"] },
  { ad: "testsiz-ceza-dali", sinif: "bilincsiz", modul: "odunc", ekIs: 40,
    etkiler: ["kural-degisikligi", "hata-duzeltme", "basarim-ayari"] },
  { ad: "iki-yerde-tarih-bicimi", sinif: "bilincsiz", modul: "katalog-esleme", ekIs: 25,
    etkiler: ["yeni-alan", "hata-duzeltme"] },
  { ad: "gizli-sube-varsayimi", sinif: "bilincsiz", modul: "uyelik", ekIs: 55,
    etkiler: ["yeni-ekran", "hata-duzeltme"] },
  { ad: "kopyalanmis-yetki-kontrolu", sinif: "bilincsiz", modul: "raporlama", ekIs: 35,
    etkiler: ["yeni-ekran", "yeni-alan", "hata-duzeltme"] },
  { ad: "elle-onbellek-temizligi", sinif: "bilincsiz", modul: "odunc", ekIs: 15,
    etkiler: ["basarim-ayari", "hata-duzeltme"] },
];

export const MODUL = [...new Set(KALEM.map((k) => k.modul))];
export const yillik = (tur) => DEGISIKLIK.find((d) => d.tur === tur).yillik;
export const kalemFaizi = (k) => k.ekIs * k.etkiler.reduce((t, tur) => t + yillik(tur), 0);
export const tabanIs = DEGISIKLIK.reduce((t, d) => t + d.taban * d.yillik, 0);  // modul basina

if (import.meta.url.endsWith(process.argv[1].split("/").pop())) {
  const bilincli = KALEM.filter((k) => k.sinif === "bilincli");
  console.log(`${KALEM.length} borc kalemi: ${bilincli.length} bilincli (kayitli), ` +
    `${KALEM.length - bilincli.length} bilincsiz (kayit disi)`);
  console.log(`modul basina yilda ${DEGISIKLIK.reduce((t, d) => t + d.yillik, 0)} degisiklik, ` +
    `borcsuz modulde ${tabanIs} dk\n`);

  console.log("kalem basina yillik faiz (degisiklik basina ek is x yillik degisiklik sayisi):");
  for (const k of [...KALEM].sort((a, b) => kalemFaizi(b) - kalemFaizi(a)))
    console.log(`  ${k.ad.padEnd(26)} ${k.sinif.padEnd(10)} ${k.modul.padEnd(15)} ` +
      `${String(k.ekIs).padStart(2)} dk x ${String(k.etkiler.reduce((t, tur) => t + yillik(tur), 0)).padStart(2)} ` +
      `degisiklik = ${String(kalemFaizi(k)).padStart(4)} dk/yil`);

  console.log("\nsinif basina toplam faiz:");
  for (const s of ["bilincli", "bilincsiz"]) {
    const g = KALEM.filter((k) => k.sinif === s);
    const f = g.reduce((t, k) => t + kalemFaizi(k), 0);
    console.log(`  ${s.padEnd(10)} ${g.length} kalem, ${f} dk/yil, kalem basina ${(f / g.length).toFixed(0)} dk`);
  }

  console.log("\nmodul basina yillik is (taban + faiz):");
  for (const m of MODUL) {
    const f = KALEM.filter((k) => k.modul === m).reduce((t, k) => t + kalemFaizi(k), 0);
    console.log(`  ${m.padEnd(15)} taban ${tabanIs.toFixed(0)} + faiz ${String(f).padStart(4)} = ` +
      `${(tabanIs + f).toFixed(0)} dk  (%${(100 * f / tabanIs).toFixed(1)} fazla)`);
  }
}
9 borc kalemi: 4 bilincli (kayitli), 5 bilincsiz (kayit disi)
modul basina yilda 60 degisiklik, borcsuz modulde 6000 dk

kalem basina yillik faiz (degisiklik basina ek is x yillik degisiklik sayisi):
  gizli-sube-varsayimi       bilincsiz  uyelik          55 dk x 36 degisiklik = 1980 dk/yil
  testsiz-ceza-dali          bilincsiz  odunc           40 dk x 46 degisiklik = 1840 dk/yil
  elle-alan-eslemesi         bilincli   katalog-esleme  45 dk x 38 degisiklik = 1710 dk/yil
  kopyalanmis-yetki-kontrolu bilincsiz  raporlama       35 dk x 44 degisiklik = 1540 dk/yil
  kural-kopyasi              bilincli   odunc           35 dk x 42 degisiklik = 1470 dk/yil
  iki-yerde-tarih-bicimi     bilincsiz  katalog-esleme  25 dk x 38 degisiklik =  950 dk/yil
  elle-onbellek-temizligi    bilincsiz  odunc           15 dk x 34 degisiklik =  510 dk/yil
  gecici-uyelik-tablosu      bilincli   uyelik          20 dk x 14 degisiklik =  280 dk/yil
  sabit-rapor-sorgusu        bilincli   raporlama       30 dk x  6 degisiklik =  180 dk/yil

sinif basina toplam faiz:
  bilincli   4 kalem, 3640 dk/yil, kalem basina 910 dk
  bilincsiz  5 kalem, 6820 dk/yil, kalem basina 1364 dk

modul basina yillik is (taban + faiz):
  odunc           taban 6000 + faiz 3820 = 9820 dk  (%63.7 fazla)
  katalog-esleme  taban 6000 + faiz 2660 = 8660 dk  (%44.3 fazla)
  uyelik          taban 6000 + faiz 2260 = 8260 dk  (%37.7 fazla)
  raporlama       taban 6000 + faiz 1720 = 7720 dk  (%28.7 fazla)

Kalem tablosunun ilk bilgisi sıralamadadır: en yüksek faizli kalem, değişiklik başına en çok iş çıkaran kalem değildir. gecici-uyelik-tablosu değişiklik başına 20 dakika ekliyor ve yılda 280 dakika tutuyor; elle-onbellek-temizligi 15 dakika ekliyor ve 510 dakika tutuyor. Fark, kalemin kaç değişikliğe dokunduğundadır. Bir borç kaleminin ağırlığı ne kadar çirkin olduğuyla değil, ne sıklıkta yola çıktığıyla ölçülür.

Sınıf tablosu ikinci bilgiyi veriyor. Beş bilinçsiz kalem yılda 6820 dakika, dört bilinçli kalem 3640 dakika tutuyor; kalem başına 1364’e karşı 910 dakika. Bilinçsiz borç kalem başına daha pahalıdır. Nedeni ahlaki değil yapısaldır: bilinçli borç bir kararın parçası olarak alınır ve alınırken kapsamı düşünülür, bilinçsiz borç ise kimse bakmadan büyür. Ölçülen fark bu iki durumun aynı şey olmadığının sayısal karşılığıdır.

Modül tablosu faizi taban işle karşılaştırıyor. odunc modülünde aynı yıllık değişiklik kümesi 9820 dakika sürüyor, borçsuz bir modülde 6000; fazladan iş yüzde 63,7. raporlama modülünde aynı oran yüzde 28,7. İki modül aynı işi yapmıyor sayılmaz — tam olarak aynı değişiklik kümesi koşturuldu. Aradaki farkın tamamı borçtur.

Fark Edilme Gecikmesi

Bilinçli borcun kayda geçme gecikmesi sıfırdır: seçildiği anda bilinir. Bilinçsiz borç ise bir noktada fark edilir ve o noktaya kadar faizi ödenmeye devam eder. Fark etme, tek bir acı verici değişiklikle değil, aynı fazladan işin tekrarlanmasıyla olur — biri iki farklı işte aynı yerde takıldığında bir örüntü görür. Modelde bir kalem, aynı fazladan işi eşik sayıda kez çıkardığında fark edilir (KK15). Bu, gecikmenin kalemin büyüklüğüne değil, dokunduğu değişikliklerin sıklığına bağlanması demektir.

// borc/gecikme.mjs — bilincsiz borcun fark edilme gecikmesi ve o ana kadar odenen faiz
import { KALEM, yillik, kalemFaizi } from "./faiz.mjs";

// Bir kalem, ayni fazladan isi ESIK kez cikardiginda fark edilir; degisiklikler yil icinde
// duzgun dagilir. Ikisi de modelin girdisidir (KK15).
const ESIK = [8, 24, 48];
const AY = 12;
const etkilenen = (k) => k.etkiler.reduce((t, tur) => t + yillik(tur), 0);
const gecikme = (k, esik) => (AY * esik) / etkilenen(k);
const bilincsiz = KALEM.filter((k) => k.sinif === "bilincsiz");

console.log(`${bilincsiz.length} bilincsiz kalem; bilincli borc kayda yazildigi icin gecikmesi 0 ay`);
console.log("esik  ortalama gecikme  12. ayda fark edilmemis  fark edilmeden odenen faiz  yillik faizin payi");
const yillikFaiz = bilincsiz.reduce((t, k) => t + kalemFaizi(k), 0);
for (const esik of ESIK) {
  const g = bilincsiz.map((k) => gecikme(k, esik));
  const odenen = bilincsiz.reduce((t, k) => t + esik * k.ekIs, 0);
  console.log(`  ${String(esik).padStart(2)}  ${(g.reduce((a, b) => a + b, 0) / g.length).toFixed(1).padStart(13)} ay ` +
    `${String(g.filter((x) => x > AY).length).padStart(20)}  ${String(odenen).padStart(21)} dk ` +
    `${("%" + (100 * odenen / yillikFaiz).toFixed(0)).padStart(15)}`);
}

console.log(`\nkalem basina (esik 24; yillik bilincsiz faiz ${yillikFaiz} dk):`);
for (const k of [...bilincsiz].sort((a, b) => gecikme(a, 24) - gecikme(b, 24)))
  console.log(`  ${k.ad.padEnd(26)} ${String(etkilenen(k)).padStart(2)} degisiklik/yil, ` +
    `${gecikme(k, 24).toFixed(1).padStart(4)} ay sonra fark edilir, o ana kadar ${24 * k.ekIs} dk odenir`);

// Soru kumesi: 9 kalem x 4 soru; 12. ayda kayitta olan kalemlere gore
const SORU = ["B1 bu eksiklik bilerek mi secildi", "B2 ne zaman girdi",
  "B3 geri donus kosulu neydi", "B4 degisiklik basina ne kadar is cikariyor"];
console.log(`\nsoru kumesi 12. ayda (${KALEM.length} kalem x ${SORU.length} soru = ` +
  `${KALEM.length * SORU.length} yanit):`);
// Bilincli kalem dort soruyu da yanitlar; fark edilmis bilincsiz kalem B1 ve B4'u yanitlar,
// B2 ve B3 eksik kalir; hic fark edilmemis kalem B1'e yanlis yanit verir, kalani eksiktir.
const B = KALEM.length - bilincsiz.length;
for (const esik of ESIK) {
  const bulunan = bilincsiz.filter((k) => gecikme(k, esik) <= AY).length;
  const disi = bilincsiz.length - bulunan;
  console.log(`  esik ${String(esik).padStart(2)}: kayitta ${B + bulunan}/${KALEM.length} kalem -> ` +
    `dogru ${4 * B + 2 * bulunan}, eksik ${2 * bulunan + 3 * disi}, yanlis ${disi}`);
}
5 bilincsiz kalem; bilincli borc kayda yazildigi icin gecikmesi 0 ay
esik  ortalama gecikme  12. ayda fark edilmemis  fark edilmeden odenen faiz  yillik faizin payi
   8            2.5 ay                    0                   1360 dk             %20
  24            7.4 ay                    0                   4080 dk             %60
  48           14.7 ay                    5                   8160 dk            %120

kalem basina (esik 24; yillik bilincsiz faiz 6820 dk):
  testsiz-ceza-dali          46 degisiklik/yil,  6.3 ay sonra fark edilir, o ana kadar 960 dk odenir
  kopyalanmis-yetki-kontrolu 44 degisiklik/yil,  6.5 ay sonra fark edilir, o ana kadar 840 dk odenir
  iki-yerde-tarih-bicimi     38 degisiklik/yil,  7.6 ay sonra fark edilir, o ana kadar 600 dk odenir
  gizli-sube-varsayimi       36 degisiklik/yil,  8.0 ay sonra fark edilir, o ana kadar 1320 dk odenir
  elle-onbellek-temizligi    34 degisiklik/yil,  8.5 ay sonra fark edilir, o ana kadar 360 dk odenir

soru kumesi 12. ayda (9 kalem x 4 soru = 36 yanit):
  esik  8: kayitta 9/9 kalem -> dogru 26, eksik 10, yanlis 0
  esik 24: kayitta 9/9 kalem -> dogru 26, eksik 10, yanlis 0
  esik 48: kayitta 4/9 kalem -> dogru 16, eksik 15, yanlis 5

Eşik tablosu gecikmenin bedelini veriyor. Sekiz tekrarda fark edilen bir borç ortalama 2,5 ay sonra kayda girer ve o zamana kadar 1360 dakika ödetir; yirmi dört tekrarda 7,4 ay ve 4080 dakika. Kırk sekiz tekrar gerektiren bir örüntü ise bir yıl içinde hiç fark edilmez ve ödenen faiz yıllık bilinçsiz faizin yüzde 120’sine çıkar — yani bir yıldan fazla süre boyunca kimse neyin yavaşlattığını bilmez. Bu üç satır arasındaki fark tek bir şeye bağlıdır: fazladan işin bir örüntü olarak görülmesi ne kadar sürüyor.

Kalem tablosu bu bağın sonucunu gösteriyor ve sezgiye ters düşüyor. gizli-sube-varsayimi en yüksek faizli kalemdir — yılda 1980 dakika — ama fark edilmesi en geç olanlardan biridir, 8,0 ay. testsiz-ceza-dali daha az faiz taşır ve 6,3 ayda fark edilir. Nedeni modelin kuralıdır: fark etme, her seferinde ne kadar acıdığına değil, kaç kez tekrarlandığına bağlıdır. Az sayıda ama ağır darbe indiren bir borç, sık ama hafif darbe indirenden daha uzun süre görünmez kalır. Fark etme kuralı büyüklüğe bağlansaydı sıra tersine dönerdi; ölçülen sonuç kuralın kendisine bağlıdır ve kural yazılı olmadan sonuç yorumlanamaz.

Soru kümesi tablosu iki eşikte aynı çıkıyor, üçüncüsünde ayrılıyor. Fark edilmiş bir bilinçsiz borç kaleminin dört sorudan ikisi yanıtlanır: bilerek seçilmediği söylenebilir ve değişiklik başına çıkardığı iş ölçülebilir. Ne zaman girdiği ve geri dönüş koşulunun ne olduğu yanıtsız kalır, çünkü o bilgi kalem girerken yazılmamıştır ve sonradan üretilemez. Bilinçli borcun bilinçsiz borçtan tek gerçek üstünlüğü budur: aynı faizi öder, ama dört soruyu da yanıtlar.

Özet

  • Bir borç kaleminin yıllık faizi, değişiklik başına eklediği iş ile dokunduğu değişiklik sayısının çarpımıdır; en yüksek faizli kalem, değişiklik başına en çok iş çıkaran kalem değildir.
  • Beş bilinçsiz kalem yılda 6820, dört bilinçli kalem 3640 dakika tuttu; kalem başına 1364’e karşı 910 dakika, yani bilinçsiz borç kalem başına daha pahalı çıktı.
  • Aynı yıllık değişiklik kümesi odunc modülünde 9820, borçsuz bir modülde 6000 dakika sürüyor — yüzde 63,7 fazladan iş; raporlama modülünde aynı oran yüzde 28,7.
  • Bilinçsiz borcun fark edilme gecikmesi tekrar eşiğine bağlıdır: sekiz tekrarda 2,5 ay ve 1360 dakika, yirmi dörtte 7,4 ay ve 4080 dakika, kırk sekizde bir yılda hiç fark edilmiyor ve ödenen faiz yıllık bilinçsiz faizin yüzde 120’sine çıkıyor.
  • Fark edilme sırası faiz sırasıyla aynı değildir; en yüksek faizli kalem 8,0 ayla en geç fark edilenlerdendir, çünkü bu modelde fark etme büyüklüğe değil tekrara bağlanmıştır.

Sonraki Adım

Bu konu boyunca yazılan her şey bir kararın etrafında toplandı. Karar kaydı kararın gerekçesini, öneri süreci kararın nasıl verildiğini, ödünleşim çözümlemesi neye tercih edildiğini, risk kaydı neyin tutmayabileceğini, borç kaydı neyin bilerek eksik bırakıldığını tutuyor. Beş kayıt biçimi ve her biri için ölçülmüş bir soru kümesi var.

Hepsinin ortak bir sınırı var: her biri tek bir kararın kaydıdır. Kütüphane ağının sistemine yeni gelen biri bu kayıtların hepsini okuduğunda kırk kararın gerekçesini öğrenir, ama sistemin neye benzediğini öğrenemez. Hangi parçalar var, hangisi hangisine bağlı, veri nereden nereye akıyor, hangi parça hangi makinede duruyor — bu soruların hiçbiri tek tek kararların kaydında yanıtlanmaz, çünkü hiçbiri tek bir karara ait değildir. Kayıtları üst üste koymak da bir resim vermez; kırk kaydın toplamı sistemin haritası değildir. Sonraki konu bu boşluğu ele alır: sistemin bütününü gösteren bir anlatımın ne olduğunu, kaç farklı bakışa ihtiyaç duyduğunu ve her bakışın hangi soruyu yanıtladığını ölçer.

İ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