İçeriğe geç
academia.sh

Ders 05 / 11

Danışmanlık ve Koçluk

Aynı kararın buyruk, yazılı gerekçe ve birlikte çalışma biçimlerinde aktarılması: kalıp durum ile kenar durumun ayrılması, iki dalgalı bir modelde doğru uygulanma oranının ve aktarım maliyetinin ölçülmesi, ekip değişiminden sonra hangi aktarım biçiminin ayakta kaldığının sayılması.

İçindekiler

Önceki ders kararın doğduğu koşulları ölçtü: karar verenin gördüğü grafik ne kadar tazeyse karar o kadar uygulanabilir. Kararın uygulanabilir olması ise uygulanacağı anlamına gelmiyor. Üçüncü dersin gözetim ölçümü kararların kodda karşılığını yitirdiğini gösterdi ama kararın ekibe nasıl ulaştığını hiç ayırt etmedi.

Aynı karar üç ayrı biçimde aktarılabilir. Buyruk: kural duyurulur, gerekçe verilmez. Yazılı gerekçe: kural, eşiği ve ödünleşimiyle birlikte yazılır — Sistem Tasarımına Giriş kursunda kurulan karar kaydının biçimi budur. Birlikte çalışma: kararın ilk uygulaması birkaç geliştiriciyle beraber yapılır; danışman mimar ve koçluk sözcükleri bu biçimi anlatır. Bu ders üçünü aynı karar ve aynı durum kümesi üzerinde koşturur.

Kalıp Durum ve Kenar Durum

Aktarım biçimleri arasındaki fark, kararın uygulandığı durumların hepsinde görünmez. Bir kararın geçtiği durumlar ikiye ayrılır. Kalıp durum, kuralın sözüne birebir uyan durumdur: “uç modüller veri erişim modülünü doğrudan ithal etmez” kuralı, bir uç modülde veri erişimine kenar çekilirken doğrudan uygulanır. Bunun için gerekçeyi bilmek gerekmez, kuralı bilmek yeter.

Kenar durum, kuralın sözünün yetmediği durumdur: toplu iş modülü bir uç mudur, günlük rapor sorgusunun geçmesi gereken katman hangisidir, dış katalog için yazılan yeni bir okuma yolu bu kuralın kapsamına girer mi. Bu sorular ancak kararın niçin verildiği bilinerek yanıtlanır. Modelde durumların %35’i kenar durumdur (MN12) ve üç aktarım biçimi yalnız bu durumlarda ayrışır.

İkinci ayrım zamandır. Bir karar verildiği hafta uygulanıp bitmez; aylar sonra da uygulanmaya devam eder ve o sırada ekip değişmiştir. Model bunu iki dalgayla kurar: ilk dalgada on iki geliştirici, ikinci dalgadan önce dördü ayrılır ve yerlerine kararın aktarımını hiç almamış dört kişi gelir (MN13).

Ölçüm

Üç biçimin her biri geliştiriciye bir anlama düzeyi ve bir maliyet verir. Buyruk herkese ulaşır ve ucuzdur; yazılı gerekçe de herkese ulaşır ama okunması gerekir; birlikte çalışma yalnız üç kişiye doğrudan dokunur ve pahalıdır. Bütün olasılık ve saat değerleri modelin seçilmiş girdileridir (MN14); ölçülen şey bu girdiler altındaki farktır. Aynı durum kümesi ve aynı atış dizisi üç biçime de verilir, böylece karşılaştırma eşleştirilmiş olur.

// mimari/aktarim.mjs — ayni kararin uc aktarim biciminde dogru uygulanma orani ve maliyeti
// MODEL kutuphane agi; gercek kisi ve ekip yoktur. Iki dalga: ikincisinden once 4 kisi ayrilir.
function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; }

const KISI = 12, D1 = 8, D2 = 6, KENAR_ORANI = 0.35, AYRILAN = 4;
const SAAT = { buyruk: 2.2, "yazili gerekce": 10.0, "birlikte calisma": 24.0 };
const DOGRUDAN = { buyruk: KISI, "yazili gerekce": KISI, "birlikte calisma": 3 };
const BICIMLER = Object.keys(SAAT);

function kosum(tohum) {
  const rast = uretec(tohum);
  const durum = (kisiler, adet) => kisiler.flatMap((k) =>
    Array.from({ length: adet }, () => ({ kisi: k, kenar: rast() < KENAR_ORANI, atis: rast() })));

  const eski = [...Array(KISI).keys()];
  const D = { bir: durum(eski, D1) };
  const okur = Array.from({ length: KISI + AYRILAN }, () => rast() < 0.7); // gerekceyi okuyanlar
  const eslik = new Set();
  while (eslik.size < 3) eslik.add(Math.floor(rast() * KISI));              // birlikte calisilanlar
  const ayrilan = new Set();
  while (ayrilan.size < AYRILAN) ayrilan.add(Math.floor(rast() * KISI));
  const yeni = Array.from({ length: AYRILAN }, (_, i) => KISI + i);
  const ikinciEkip = [...eski.filter((k) => !ayrilan.has(k)), ...yeni];
  D.iki = durum(ikinciEkip, D2);
  const eslikKalan = [...eslik].filter((k) => !ayrilan.has(k)).length;

  // olasilik: kalip durumda kuralin bilinmesi yeter, kenar durumda gerekcenin anlasilmasi gerekir
  const P = {
    buyruk: (k, kenar) => (k >= KISI ? (kenar ? 0.10 : 0.30) : kenar ? 0.15 : 0.95),
    "yazili gerekce": (k, kenar) => (kenar ? (okur[k] ? 0.60 : 0.15) : 0.95),
    "birlikte calisma": (k, kenar) => (k >= KISI
      ? (eslikKalan ? (kenar ? 0.50 : 0.95) : kenar ? 0.15 : 0.60)
      : kenar ? (eslik.has(k) ? 0.95 : 0.50) : 0.95),
  };
  const say = (bicim, liste) => liste.filter((d) => d.atis < P[bicim](d.kisi, d.kenar)).length;
  return { eslikKalan, kenar1: D.bir.filter((d) => d.kenar).length, kenar2: D.iki.filter((d) => d.kenar).length,
    n1: D.bir.length, n2: D.iki.length,
    bicim: Object.fromEntries(BICIMLER.map((b) => [b, { d1: say(b, D.bir), d2: say(b, D.iki) }])) };
}

const TOHUM = 5150;
const r = kosum(TOHUM);
const sut = (s, n) => String(s).padEnd(n);
console.log(`${KISI} gelistirici; birinci dalga ${r.n1} durum (${r.kenar1} kenar), ikinci dalga ${r.n2} durum (${r.kenar2} kenar)`);
console.log(`tohum ${TOHUM}; ikinci dalgadan once ${AYRILAN} kisi ayrildi, birlikte calisilan ${r.eslikKalan}/3 kisi kaldi\n`);
console.log(sut("aktarim bicimi", 19) + sut("dalga 1", 11) + sut("dalga 2", 11) + sut("toplam", 15) + sut("saat", 8) + "dogrudan kisi");
console.log("-".repeat(81));
for (const b of BICIMLER) {
  const v = r.bicim[b], t = v.d1 + v.d2;
  console.log(sut(b, 19) + sut(`${v.d1}/${r.n1}`, 11) + sut(`${v.d2}/${r.n2}`, 11) +
    sut(`${t}/${r.n1 + r.n2} (${((t / (r.n1 + r.n2)) * 100).toFixed(0)}%)`, 15) + sut(SAAT[b].toFixed(1), 8) + DOGRUDAN[b]);
}

console.log("\nbir onceki bicime gore artis (bu tohumda):");
for (let i = 1; i < BICIMLER.length; i++) {
  const a = r.bicim[BICIMLER[i - 1]], b = r.bicim[BICIMLER[i]];
  const dt = (b.d1 + b.d2) - (a.d1 + a.d2), ds = SAAT[BICIMLER[i]] - SAAT[BICIMLER[i - 1]];
  console.log(`  ${sut(BICIMLER[i], 19)}+${sut(dt, 4)}dogru  +${sut(ds.toFixed(1), 6)}saat  saat basina ${(dt / ds).toFixed(2)} dogru`);
}

// tek tohum gurultulu olabilir: 200 tohumda ortalama
const N = 200;
const top = Object.fromEntries(BICIMLER.map((b) => [b, { d1: 0, d2: 0 }]));
for (let t = 0; t < N; t++) {
  const k = kosum(1000 + t * 7);
  for (const b of BICIMLER) { top[b].d1 += k.bicim[b].d1; top[b].d2 += k.bicim[b].d2; }
}
console.log(`\n${N} tohumda ortalama dogru uygulama:`);
console.log(sut("aktarim bicimi", 19) + sut("dalga 1", 10) + sut("dalga 2", 10) + sut("toplam", 10) + "saat basina");
console.log("-".repeat(62));
for (const b of BICIMLER) {
  const d1 = top[b].d1 / N, d2 = top[b].d2 / N;
  console.log(sut(b, 19) + sut(d1.toFixed(1), 10) + sut(d2.toFixed(1), 10) + sut((d1 + d2).toFixed(1), 10) + ((d1 + d2) / SAAT[b]).toFixed(2));
}
const ort = (b) => (top[b].d1 + top[b].d2) / N;
console.log(`\ndalga 2 farki: yazili gerekce ${(top["yazili gerekce"].d2 / N).toFixed(1)}, birlikte calisma ${(top["birlikte calisma"].d2 / N).toFixed(1)}, buyruk ${(top.buyruk.d2 / N).toFixed(1)}`);
console.log(`yazili gerekce - buyruk = ${(ort("yazili gerekce") - ort("buyruk")).toFixed(1)} dogru, +7.8 saat -> saat basina ${((ort("yazili gerekce") - ort("buyruk")) / 7.8).toFixed(2)}`);
console.log(`birlikte calisma - yazili gerekce = ${(ort("birlikte calisma") - ort("yazili gerekce")).toFixed(1)} dogru, +14.0 saat -> saat basina ${((ort("birlikte calisma") - ort("yazili gerekce")) / 14).toFixed(2)}`);
12 gelistirici; birinci dalga 96 durum (27 kenar), ikinci dalga 72 durum (26 kenar)
tohum 5150; ikinci dalgadan once 4 kisi ayrildi, birlikte calisilan 2/3 kisi kaldi

aktarim bicimi     dalga 1    dalga 2    toplam         saat    dogrudan kisi
---------------------------------------------------------------------------------
buyruk             71/96      43/72      114/168 (68%)  2.2     12
yazili gerekce     83/96      59/72      142/168 (85%)  10.0    12
birlikte calisma   84/96      62/72      146/168 (87%)  24.0    3

bir onceki bicime gore artis (bu tohumda):
  yazili gerekce     +28  dogru  +7.8   saat  saat basina 3.59 dogru
  birlikte calisma   +4   dogru  +14.0  saat  saat basina 0.29 dogru

200 tohumda ortalama dogru uygulama:
aktarim bicimi     dalga 1   dalga 2   toplam    saat basina
--------------------------------------------------------------
buyruk             64.7      37.7      102.4     46.56
yazili gerekce     75.1      56.3      131.4     13.14
birlikte calisma   80.1      58.9      139.1     5.79

dalga 2 farki: yazili gerekce 56.3, birlikte calisma 58.9, buyruk 37.7
yazili gerekce - buyruk = 29.0 dogru, +7.8 saat -> saat basina 3.71
birlikte calisma - yazili gerekce = 7.7 dogru, +14.0 saat -> saat basina 0.55

Üç Biçimin Farkı

Tek tohumlu tabloda üç biçim sırasıyla %68, %85 ve %87 doğru uygulama veriyor. İki yüz tohumda ortalama toplamlar 102,4, 131,4 ve 139,1. Sıra beklendiği gibi; asıl bilgi artışların biçiminde.

Buyruktan yazılı gerekçeye geçmek ortalama 29 doğru uygulama kazandırıyor ve 7,8 saate mal oluyor: saat başına 3,71. Yazılı gerekçeden birlikte çalışmaya geçmek 7,7 doğru uygulama kazandırıyor ve 14 saate mal oluyor: saat başına 0,55. İki artış arasındaki oran yaklaşık yedi kat. Bu, koçluğun değersiz olduğunu söylemiyor; söylediği şey, gerekçenin yazılmamış olduğu bir yerde koçlukla başlamanın en pahalı yol olduğudur.

Sağdaki “saat başına” sütunu ise ters yönde okunmalı. Buyruk saat başına 46,56 doğru uygulama üretiyor, birlikte çalışma 5,79. Ortalama verim en ucuz biçimde en yüksektir ve bu her zaman böyledir; ucuz olanın verimi yüksek, sonucu düşüktür. Bir aktarım biçimini ortalama verime bakarak seçmek, buyruğu seçmek demektir. Karar, artışa bakılarak verilir: bir sonraki saat kaç doğru uygulama getiriyor.

Ekip Değiştiğinde Ne Kalıyor

İkinci dalga sütunu bu dersin asıl bulgusudur. İlk dalgada buyruk ile yazılı gerekçe arasındaki ortalama fark 10,4 doğru uygulama (64,7’ye karşı 75,1). İkinci dalgada, yani dört kişi ayrılıp yerlerine yeni kişiler geldikten sonra fark 18,6‘ya çıkıyor (37,7’ye karşı 56,3). Buyruk zamanla değil, kişi değişimiyle çöküyor: duyuruyu duymamış birinin elinde kalıp durum bile belirsizdir.

Birlikte çalışmanın ikinci dalgadaki değeri 58,9, yazılı gerekçenin 56,3 — aradaki fark 2,6. Bu fark, birlikte çalışılan kişilerin ayrılıp ayrılmadığına bağlı. Tek tohumlu koşumda üç kişiden ikisi kalmıştı; hiçbiri kalmasaydı biçim buyruğa yaklaşırdı. Koçluğun aktardığı şey bir belgede değil, bir kişide duruyor ve o kişiyle birlikte gidebiliyor.

Üç biçim için tek cümlelik sonuç şudur ve üçü de bir sayıya bağlı: buyruk en ucuz aktarımdır ve kenar durumların %15’ini doğru geçer; yazılı gerekçe orta maliyetlidir, kenar durumların yarısından çoğunu doğru geçer ve ekip değiştiğinde ayakta kalır; birlikte çalışma en yüksek doğruluğu verir, en pahalıdır ve dayanıklılığı birlikte çalışılan kişilerin kalmasına bağlıdır.

Özet

  • Aktarım biçimleri kalıp durumlarda ayrışmaz; fark yalnız kararın gerekçesini gerektiren kenar durumlardan gelir, modelde durumların %35’i kenar durumdur.
  • Aynı 168 durumda üç biçim %68, %85 ve %87 doğru uygulama verdi; iki yüz tohumdaki ortalamalar 102,4, 131,4 ve 139,1 oldu.
  • Artışlar eşit değil: buyruktan yazılı gerekçeye geçiş saat başına 3,71 doğru uygulama, yazılı gerekçeden birlikte çalışmaya geçiş saat başına 0,55 getiriyor.
  • Ortalama verim en ucuz biçimde en yüksektir (buyruk 46,56, birlikte çalışma 5,79); aktarım biçimi ortalama verime değil artışa bakılarak seçilir.
  • Ekip değişimi buyruk ile yazılı gerekçe arasındaki farkı 10,4’ten 18,6’ya çıkarıyor; koçluğun kazancı birlikte çalışılan kişilerin kalmasına bağlıdır, yazılı gerekçeninki değildir.

Sonraki Adım

Bu konu mimarın rolünü tanımladı ve her parçasını bir sayıya bağladı: kararın ne olduğu geri alma maliyetiyle, düzeyi kapsadığı birim sayısıyla, sorumlulukları gözetimsiz kararın uygulanma oranıyla, koddan kopmanın bedeli ölü karar oranıyla, aktarım biçimi de doğru uygulanma oranıyla ölçüldü.

Bütün bu ölçümlerde kararlar hazır girdi olarak alındı. Karar kümesi verildi, kapsamı ölçüldü, aktarıldı ve izlendi — ama kararın kendisi nasıl verilir sorusuna hiç girilmedi. Çelişen iki kalite niteliği arasında seçim nasıl yapılır; bir sistemdeki karmaşıklığın hangisi işin doğasından gelir ve hangisi sonradan eklenmiştir; hangi kararın geri alınabilir olduğu karar anında nasıl bilinir; bir teknoloji seçiminin çıkış maliyeti nasıl hesaplanır. Sonraki konu bu sorulara geçer ve ilki en zorudur: iki nitelik birbiriyle çelişiyorsa, kazananı seçen ağırlıklar nereden gelir ve ağırlık değiştiğinde kazanan değişir mi.

İ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