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.