İçeriğe geç
academia.sh

Ders 01 / 12

Platform Mühendisliği Nedir

Platformun bir soyutlama olarak ölçülmesi: yedi kursun her ekipte yeniden kurulan on sekiz kalemi listelenir, ekip başına yeniden kurma işi sayılır, ekip sayısı taranarak platformun kendini ödediği eşik çıkarılır ve az ekipte platformun kaybettirdiği iş günü aynı tabloda gösterilir.

İçindekiler

Önceki kurs sertleştirmeyi kapatırken bir soru bıraktı. Yedi kurs boyunca her katman ayrı ayrı kuruldu: ortam sağlandı, hat kuruldu, küme nesnesi yazıldı, altyapı kaydı tutuldu, gösterge bağlandı, varsayılan yüzey daraltıldı. Bunların hepsini her ekip yeniden mi kuracak?

Karşılık bir görüş değil, bir sayıdır: ortak bir yere taşımanın bedeli peşin ödenir, kazancı ekip sayısıyla çarpılır ve ikisi belli bir ekip sayısında eşitlenir. Bu kursun ölçü birimi soyutlamadır — platform bir katmanı gizler, yerine bir arayüz koyar, o arayüzün de kendi bedeli olur. Her ders üçünü sayar: ne gizlendi ve kaç ekip ne kadar kurtuldu, gizlenen nerede geri sızdı, kim yolun dışına çıktı.

Platformun bir ekip türü olarak nerede durduğu — akış odaklı ekipler, bilişsel yük, ekip topolojileri — ekip-ve-teslimat/02 dersinde ölçüldü; tekrarlanmaz. Burada platform ekip düzeni değil, soyutlamadır. Through-line bölgesel ölçüm ağıdır; bu kursta ağın yazılımını üreten beş ekip eklenir: sayaç okuma, doğrulama, faturalama, saha ve raporlama. Ağ da ekipler de kurgudur.

Yedi Kursun Bıraktığı Kalem Kümesi

PY1 — yedi kursun bıraktığı iş, altı türde on sekiz kaleme ayrılır: ortam, hat, küme nesnesi, kayıt, gösterge ve sertleştirme adımı. Her kalem üç sayı taşır: bir ekibin kalemi kendi kurup üç yıl sürdürmesinin bedeli, platformun kalemi bir kez devralmasının bedeli ve devirden sonra ekipte kalan iş. Birim iş günüdür. Gerekçe: kalem kümesi sayılmadan platform tartışması ölçülemez.

PY2 — bir kalemin eşiği, devir bedelinin ekip başına net kazanca bölümünün yukarı yuvarlanmasıdır; net kazanç, ekip başına iş ile ekipte kalan işin farkıdır. Gerekçe: devir bir kez ödenir, kazanç her ekipte tekrarlanır.

PY3 — iki düzen karşılaştırılır: her ekibin on sekiz kalemi kendi kurduğu düzen ve platformun hepsini devraldığı düzen. PY4 — üçüncü düzen, seçici devir, yalnız eşiği beşe kadar olan kalemleri taşır; geri kalanlar ekiplerde tam bedelle durur. Gerekçe: devir kurumsal değil, kalem kalem verilen bir karardır.

// kalem.mjs — yedi kursun biraktigi kalem kumesi, kalem basina esik ve ekip taramasi (model)
import { writeFileSync } from "node:fs";

// PY1 — yedi kursun biraktigi ve her ekipte yeniden kurulan 18 kalem: tur, ad, ekip basina
// is, platform devri (bir kez), devirden sonra ekipte kalan is. Birim is gunu, pencere uc
// yil. PY2 — kalem esigi = ceil(devir / (ekip - kalan)). Sayilar kurgudur.
const KALEM = [
  ["ortam", "gelistirme ortami", 12, 55, 3],
  ["ortam", "sinama ortami", 9, 40, 2],
  ["ortam", "gizli deger baglama", 7, 46, 2],
  ["hat", "derleme adimi", 8, 30, 2],
  ["hat", "sinama kosumu", 6, 22, 4],
  ["hat", "kanit uretimi", 10, 44, 1],
  ["hat", "dagitim adimi", 11, 52, 3],
  ["kume nesnesi", "is yuku tanimi", 9, 38, 3],
  ["kume nesnesi", "ag kurali", 7, 34, 2],
  ["kume nesnesi", "olcekleme kurali", 5, 18, 3],
  ["kayit", "altyapi durum kaydi", 13, 62, 2],
  ["kayit", "surum kaydi", 6, 20, 1],
  ["gosterge", "dort gosterge baglama", 8, 30, 5],
  ["gosterge", "gunluk toplama", 7, 26, 2],
  ["gosterge", "uyari kurali", 9, 24, 6],
  ["sertlestirme", "taban imge taramasi", 10, 42, 1],
  ["sertlestirme", "yetki daraltma", 12, 50, 4],
  ["sertlestirme", "gizli deger dondurme", 8, 33, 2],
].map(([tur, ad, ekip, devir, kalan]) => ({ tur, ad, ekip, devir, kalan,
  net: ekip - kalan, esik: Math.ceil(devir / (ekip - kalan)), sizma: kalan / ekip }));
writeFileSync("kalem.json", JSON.stringify(KALEM));

const T = (d, f) => d.reduce((t, k) => t + f(k), 0);
const pay = (a, b) => `%${(100 * a / b).toFixed(1)}`;
const grup = (t) => KALEM.filter((k) => k.tur === t);
console.log(`${KALEM.length} kalem — ekip basina ${T(KALEM, (k) => k.ekip)}, devir ` +
  `${T(KALEM, (k) => k.devir)}, devirden sonra ekipte kalan ${T(KALEM, (k) => k.kalan)} is gunu ` +
  `(kalan payi ${pay(T(KALEM, (k) => k.kalan), T(KALEM, (k) => k.ekip))})`);
console.log("tur basina kalan payi — " + [...new Set(KALEM.map((k) => k.tur))]
  .map((t) => `${t} ${pay(T(grup(t), (k) => k.kalan), T(grup(t), (k) => k.ekip))}`).join(", "));

console.log("\n" + "kalem".padEnd(23) + "ekip".padStart(5) + "kalan".padStart(7) +
  "devir".padStart(7) + "esik".padStart(6));
for (const k of [...KALEM].sort((a, b) => a.esik - b.esik || a.ad.localeCompare(b.ad)))
  console.log(k.ad.padEnd(23) + `${k.ekip}`.padStart(5) + `${k.kalan}`.padStart(7) +
    `${k.devir}`.padStart(7) + `${k.esik}`.padStart(6));

// PY3 — iki duzen: her ekip 18 kalemi kendi kurar; ya da platform devralir, ekipte artik
// kalir. PY4 — ucuncu duzen, secici devir, yalniz esigi bese kadar olan kalemleri tasir.
const TAM = T(KALEM, (k) => k.ekip);
const H_DEVIR = T(KALEM, (k) => k.devir), H_KALAN = T(KALEM, (k) => k.kalan);
const S_DEVIR = T(KALEM.filter((k) => k.esik <= 5), (k) => k.devir);
const S_KALAN = T(KALEM, (k) => (k.esik <= 5 ? k.kalan : k.ekip));
const im = (v) => (v > 0 ? `+${v}` : `${v}`);
console.log("\n" + "ekip".padStart(5) + "platformsuz".padStart(13) + "tum kalemler".padStart(14) +
  "fark".padStart(8) + "secici".padStart(9) + "fark".padStart(8) + "kazanan".padStart(14));
for (let n = 1; n <= 12; n++) {
  const yok = n * TAM, hep = H_DEVIR + n * H_KALAN, sec = S_DEVIR + n * S_KALAN;
  const en = Math.min(yok, hep, sec);
  console.log(`${n}`.padStart(5) + `${yok}`.padStart(13) + `${hep}`.padStart(14) +
    im(yok - hep).padStart(8) + `${sec}`.padStart(9) + im(yok - sec).padStart(8) +
    (en === yok ? "platformsuz" : en === sec ? "secici" : "tum kalemler").padStart(14));
}
const esik = (devir, ekipte) => Math.ceil(devir / (TAM - ekipte));
console.log(`\ntum kalemler devredilirse esik: ${esik(H_DEVIR, H_KALAN)} ekip; ` +
  `secici devirde: ${esik(S_DEVIR, S_KALAN)} ekip (devir ${H_DEVIR} ve ${S_DEVIR})`);
const agir = KALEM.filter((k) => k.sizma > 0.4).sort((a, b) => b.esik - a.esik);
console.log(`artik isi sifir olan kalem: ${KALEM.filter((k) => k.kalan === 0).length} / ` +
  `${KALEM.length}; artigi ekip isinin %40'ini asan kalem: ${agir.length} — ` +
  agir.map((k) => `${k.ad} (${pay(k.kalan, k.ekip)}, esik ${k.esik})`).join(", "));
18 kalem — ekip basina 157, devir 666, devirden sonra ekipte kalan 48 is gunu (kalan payi %30.6)
tur basina kalan payi — ortam %25.0, hat %28.6, kume nesnesi %38.1, kayit %15.8, gosterge %54.2, sertlestirme %23.3

kalem                   ekip  kalan  devir  esik
surum kaydi                6      1     20     4
derleme adimi              8      2     30     5
kanit uretimi             10      1     44     5
taban imge taramasi       10      1     42     5
altyapi durum kaydi       13      2     62     6
gizli deger dondurme       8      2     33     6
gunluk toplama             7      2     26     6
sinama ortami              9      2     40     6
ag kurali                  7      2     34     7
dagitim adimi             11      3     52     7
gelistirme ortami         12      3     55     7
is yuku tanimi             9      3     38     7
yetki daraltma            12      4     50     7
uyari kurali               9      6     24     8
olcekleme kurali           5      3     18     9
dort gosterge baglama      8      5     30    10
gizli deger baglama        7      2     46    10
sinama kosumu              6      4     22    11

 ekip  platformsuz  tum kalemler    fark   secici    fark       kazanan
    1          157           714    -557      264    -107   platformsuz
    2          314           762    -448      392     -78   platformsuz
    3          471           810    -339      520     -49   platformsuz
    4          628           858    -230      648     -20   platformsuz
    5          785           906    -121      776      +9        secici
    6          942           954     -12      904     +38        secici
    7         1099          1002     +97     1032     +67  tum kalemler
    8         1256          1050    +206     1160     +96  tum kalemler
    9         1413          1098    +315     1288    +125  tum kalemler
   10         1570          1146    +424     1416    +154  tum kalemler
   11         1727          1194    +533     1544    +183  tum kalemler
   12         1884          1242    +642     1672    +212  tum kalemler

tum kalemler devredilirse esik: 7 ekip; secici devirde: 5 ekip (devir 666 ve 136)
artik isi sifir olan kalem: 0 / 18; artigi ekip isinin %40'ini asan kalem: 4 — sinama kosumu (%66.7, esik 11), dort gosterge baglama (%62.5, esik 10), olcekleme kurali (%60.0, esik 9), uyari kurali (%66.7, esik 8)

Eşik Nerede

İlk iki satır peşin bedeli verir: bir ekibin yedi kursun tamamını kendi kurup üç yıl sürdürmesi 157 iş günü, aynı kalemleri platformun devralması 666 iş günüdür — tek bir ekibin işinin dört katından fazlası. Devirden sonra ekipte duran iş 48 iş günü, ekip başına işin %30,6’sı. Tür başına en yüksek artık gösterge kalemlerindedir (%54,2), çünkü hangi göstergenin izleneceği ve uyarının hangi değerde çalacağı ekibin kendi işine bağlıdır; en düşüğü kayıt kalemleridir (%15,8), altyapı durum kaydının tutulma biçimi ekipten ekibe değişmez.

Tablo kararı kalem başına verir. surum kaydi dört ekipte kendini öder; sinama kosumu on bir ekipten önce ödemez, çünkü altı iş gününün dördü ekipte kalır ve net kazanç ikiye iner. Beş ekiplik bir kuruluşta on sekiz kalemin yalnız dördü kendini öder.

Tarama üç bölge gösterir. Bir ile dört ekip arasında platformsuz düzen kazanır; tek ekipte tüm kalemleri devretmek 557 iş günü kaybettirir. Beş ve altı ekipte seçici devir öne geçer. Yedi ekipten sonra tüm kalemlerin devri kazanır ve fark açılır: on iki ekipte 642 iş günü. Beş ekiplik satır bu kursun ilk kararıdır: beş ekip tüm kalemleri platforma taşıdığında 121 iş günü kaybeder, platformsuz düzenin %15,4 üstüne çıkar; aynı beş ekip seçici devirle 9 iş günü kazanır. Soru “platform kuralım mı” değil, “kaç ekip ve hangi kalemler” sorusudur.

Son satır sızmayı adlandırır: on sekiz kalemin hiçbirinde artık iş sıfır değildir, dördünde ekip işinin %40’ını aşar ve bu dördünün eşikleri 8, 9, 10 ve 11’dir — listenin en geç ödeyen ucu. İki sayı aynı kaynaktan gelir: artık büyüdükçe net kazanç küçülür, eşik yukarı çıkar. En çok sızan kalem, en geç kendini ödeyen kalemdir.

Beş Ekip ve Dışına Çıkanlar

PY5 — ölçüm ağının yazılımını beş ekip üretir ve her ekibin platformun biçimine sığmayan kalemleri vardır. PY6 — dışına çıkan ekip o kalemin tam bedelini öder, üstüne platformun ürettiği biçimle kendi biçimini bağdaştırmak için ceil(ekip / 4) uyum bedeli öder. Gerekçe: dışarı çıkmak platformdan kurtulmak değildir; ekip yine platformun sınırına değer ve çıktısını onun beklediği biçime çevirmek zorunda kalır.

// ekipler.mjs — bes ekip, disina cikilan kalemler ve muafiyetli esik
import { readFileSync } from "node:fs";
const KALEM = JSON.parse(readFileSync("kalem.json", "utf8"));
const bul = (ad) => KALEM.find((k) => k.ad === ad);

// PY5 — bolgesel olcum aginin yazilimini ureten bes ekip ve platformun bicimine sigmayan
// kalemleri; ekipler de gerekceler de kurgudur. PY6 — disina cikan ekip kalemin tam
// bedelini oder, ustune bagdastirma icin ceil(ekip / 4) uyum bedeli oder.
const EKIP = [
  ["sayac okuma", { "gelistirme ortami": "donanim benzetimi", "ag kurali": "dogrudan hat" }],
  ["dogrulama", { "olcekleme kurali": "gece toplu kosumu", "is yuku tanimi": "uzun is" }],
  ["faturalama", { "altyapi durum kaydi": "saklama zorunlulugu",
    "surum kaydi": "geriye donuk hesap", "gizli deger dondurme": "ayri imza zinciri" }],
  ["saha", { "dagitim adimi": "baglantisiz calisma", "gunluk toplama": "aralikli baglanti",
    "gelistirme ortami": "donanim benzetimi" }],
  ["raporlama", {}],
].map(([ad, disari]) => ({ ad, disari }));

const uyum = (k) => Math.ceil(k.ekip / 4);
const TAM = KALEM.reduce((t, k) => t + k.ekip, 0);
const bedel = (e, uygun) => KALEM.reduce((t, k) => t + (uygun(k)
  ? (k.ad in e.disari ? k.ekip + uyum(k) : k.kalan) : k.ekip), 0);
console.log("ekip".padEnd(13) + "disina cikan".padStart(13) + "disarida is".padStart(13) +
  "iceride artik".padStart(15) + "toplam".padStart(8) + "kurtulan".padStart(10));
for (const e of EKIP) {
  const d = Object.keys(e.disari);
  e.dis = d.reduce((t, ad) => t + bul(ad).ekip + uyum(bul(ad)), 0);
  e.ic = KALEM.filter((k) => !d.includes(k.ad)).reduce((t, k) => t + k.kalan, 0);
  e.toplam = e.dis + e.ic;
  console.log(e.ad.padEnd(13) + `${d.length}`.padStart(13) + `${e.dis}`.padStart(13) +
    `${e.ic}`.padStart(15) + `${e.toplam}`.padStart(8) + `${TAM - e.toplam}`.padStart(10));
}

const ODENEN = EKIP.reduce((t, e) => t + e.toplam, 0);
const DEVIR = KALEM.reduce((t, k) => t + k.devir, 0);
const dokunulan = new Set(EKIP.flatMap((e) => Object.keys(e.disari)));
const ort = ODENEN / EKIP.length;
console.log(`\nen az bir ekibin disina ciktigi kalem: ${dokunulan.size} / ${KALEM.length}; ` +
  `toplam disari cikma: ${EKIP.reduce((t, e) => t + Object.keys(e.disari).length, 0)}`);
console.log(`5 ekip — platformsuz ${5 * TAM}, tum kalemler muafiyetsiz ${DEVIR + 5 * 48}, ` +
  `tum kalemler muafiyetli ${DEVIR + ODENEN} is gunu`);
console.log(`muafiyetli ortalama ekip bedeli ${ort.toFixed(1)}; net kazanc ` +
  `${(TAM - ort).toFixed(1)}; esik ${Math.ceil(DEVIR / (TAM - ort))} ekip`);

// Secici devir ayni bes ekipte, muafiyetler yerinde dururken tekrar denenir.
const sec = (k) => k.esik <= 5;
const S = KALEM.filter(sec).reduce((t, k) => t + k.devir, 0) +
  EKIP.reduce((t, e) => t + bedel(e, sec), 0);
console.log(`5 ekip, secici devir, muafiyetli: ${S} is gunu — platformsuza gore ` +
  `${5 * TAM - S} is gunu, %${(100 * (5 * TAM - S) / (5 * TAM)).toFixed(1)}`);
ekip          disina cikan  disarida is  iceride artik  toplam  kurtulan
sayac okuma              2           24             43      67        90
dogrulama                2           19             42      61        96
faturalama               3           35             43      78        79
saha                     3           38             40      78        79
raporlama                0            0             48      48       109

en az bir ekibin disina ciktigi kalem: 9 / 18; toplam disari cikma: 10
5 ekip — platformsuz 785, tum kalemler muafiyetsiz 906, tum kalemler muafiyetli 998 is gunu
muafiyetli ortalama ekip bedeli 66.4; net kazanc 90.6; esik 8 ekip
5 ekip, secici devir, muafiyetli: 783 is gunu — platformsuza gore 2 is gunu, %0.3

Tek bir ekip platformun tarif ettiği ekiptir: raporlama on sekiz kalemin hepsini devralır ve 109 iş günü kurtarır. Diğer dördü kurtardığı işin bir kısmını geri verir. faturalama üç kalemin dışındadır — saklama zorunluluğu, geriye dönük hesap ve ayrı imza zinciri yüzünden — ve 79 iş günü kurtarır, raporlamanın otuz iş günü gerisinde. saha da 79 iş günü kurtarır ama dışarıda kalan işi daha ağırdır (38’e karşı 35), çünkü bağlantısız çalışma dağıtım adımının tamamını dışarı taşır.

On sekiz kalemin dokuzunda en az bir ekip yolun dışındadır; kalem kümesinin yarısı beş ekibin hepsine birden hizmet edemiyor. gelistirme ortami iki ekibin birden dışındadır: sayaç okuma da saha da donanım benzetimine ihtiyaç duyar.

Muafiyetlerin faturası son iki satırdadır. Muafiyetsiz hesapta beş ekip 906 iş günü ödüyordu; muafiyetlerle 998 iş gününe çıkar, platformsuz düzenin (785) %27 üstüne. Ortalama ekip bedeli 48’den 66,4’e çıktığı için net kazanç 109’dan 90,6’ya iner ve eşik yedi ekipten sekize kayar. Seçici devir bile kaçamaz: faturalama seçili dört kalemden birinin, surum kaydinin dışındadır; seçici devrin beş ekipteki kazancı 9 iş gününden 2 iş gününe, 785 iş günlük toplamın %0,3’üne düşer. Bu ölçüde bir fark karar taşımaz.

Özet

  • Yedi kursun bıraktığı iş altı türde on sekiz kaleme ayrıldı: bir ekibin hepsini kendi kurup üç yıl sürdürmesi 157, platformun devralması 666 iş günüdür.
  • Devirden sonra ekipte kalan artık 48 iş günü, ekip başına işin %30,6’sıdır; hiçbir kalemde sıfır değildir, en yükseği gösterge kalemlerindedir (%54,2).
  • Ekip taraması üç bölge verdi: 1–4 ekipte platformsuz düzen, 5–6 ekipte seçici devir, 7 ekipten sonra tüm kalemlerin devri kazanır. Beş ekipte hepsini devretmek 121 iş günü kaybettirir.
  • Beş ekiplik kuruluşta on sekiz kalemin yalnız dördü kendini öder; en çok sızan dört kalemin eşikleri 8, 9, 10 ve 11’dir — artık büyüdükçe eşik yukarı çıkar.
  • Beş ekibin dördü en az bir kalemin dışına çıkar, on sekiz kalemin dokuzunda muafiyet vardır. Muafiyetler beş ekiplik toplamı 906’dan 998 iş gününe, eşiği yedi ekipten sekize, seçici devrin kazancını 9 iş gününden 2 iş gününe (%0,3) taşır.

Sonraki Adım

Platform burada bir maliyet hesabı olarak kuruldu: devredilen kalem, ekipte kalan artık ve kendini ödeme eşiği. Hesap kalem bedellerinin bilindiğini varsayıyordu; ekiplerin hangi kalemi isteyip istemediği hiç sorulmadı. Devir bedeli ödendikten sonra bir kalemin kullanılmaması, onu 666 iş günlük yatırımın ölü bir parçasına çevirir. Sonraki ders platformu iki işletme biçiminde koşturur — talep üzerine yapılan ve ürün gibi yönetilen — ve benimsemeyi, hiç kullanılmayan yetenekleri, onlara harcanan işi, geri bildirim döngüsünün uzunluğunu ve ürün yaklaşımının ürün ekiplerinden çektiği kişi sayısı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