Seperti banyak dari pertanyaan ini, saya pikir jawabannya adalah:
Tergantung
Ada alasan untuk percaya bahwa mengambil posisi bahwa setiap programmer harus tahu setiap baris kode salah arah.
Jika kita berasumsi sesaat bahwa seseorang dengan pemahaman mendalam tentang sepotong kode akan membuat perubahan 5 kali lebih cepat daripada seseorang yang tidak mengetahuinya sama sekali (bukan lompatan besar keyakinan dalam pengalaman saya) dan dibutuhkan sekitar satu bulan pengalaman coding untuk mendapatkan pemahaman yang benar-benar baik dari modul berukuran signifikan (juga tidak masuk akal) maka kita dapat menjalankan beberapa (benar-benar palsu dan fiktif) angka:
- Programmer A: memiliki pemahaman yang mendalam
- Programmer B: tidak ada
Katakanlah programmer A mengerjakan 1 unit pekerjaan per hari. Dalam 4 minggu dari 5 hari kerja dia bisa menyelesaikan 20 unit pekerjaan.
Jadi programmer B, mulai dari 0,2 unit kerja per hari, dan berakhir dengan 0,96 unit kerja pada hari ke-20 (pada hari ke 21 mereka sama baiknya dengan programmer A), akan mencapai 11,6 unit kerja dalam waktu yang sama Periode 20 hari. Selama bulan itu programmer B mencapai efisiensi 58% dibandingkan dengan programmer A. Namun, Anda sekarang memiliki programmer lain yang tahu modul itu serta yang pertama.
Tentu saja, pada proyek berukuran layak, Anda mungkin memiliki ... 50 modul? Jadi membiasakan diri dengan semuanya membutuhkan waktu sekitar 4 tahun, dan itu berarti programmer yang belajar, rata-rata, bekerja pada efisiensi 58% dibandingkan dengan programmer A ... hmmm.
Jadi pertimbangkan skenario ini: programmer yang sama, proyek yang sama (A tahu itu semua, dan B tidak tahu apa-apa tentang itu.) Katakanlah ada 250 hari kerja dalam setahun. Mari kita asumsikan bahwa beban kerja didistribusikan secara acak di atas 50 modul. Jika kami membagi kedua programmer secara merata, A dan B keduanya mendapatkan 5 hari kerja pada setiap modul. A dapat melakukan 5 unit kerja pada setiap modul, tetapi B hanya mendapatkan, menurut simulasi Excel kecil saya, 1,4 unit pekerjaan yang dilakukan pada setiap modul. Total (A + B) adalah 6,4 unit kerja per modul. Itu karena B menghabiskan sebagian besar waktu mereka tanpa keahlian dengan modul yang mereka kerjakan.
Dalam situasi ini, lebih optimal untuk fokus pada subset modul yang lebih kecil. Jika B hanya berfokus pada 25 modul, mereka mendapatkan 10 hari masing-masing, dengan total 3,8 unit bekerja pada masing-masing modul. Programmer A kemudian dapat menghabiskan 7 hari masing-masing pada 25 modul yang tidak bekerja B, dan 3 hari masing-masing bekerja pada yang sama dengan B. Produktivitas total berkisar dari 6,8 hingga 7 unit per modul, rata-rata 6,9, dan itu secara signifikan lebih tinggi dari 6,4 unit per modul yang kami lakukan ketika A dan B menyebarkan pekerjaan secara merata.
Saat kami mempersempit ruang lingkup modul tempat B bekerja, kami mendapatkan efisiensi yang lebih tinggi (hingga titik tertentu).
Latihan
Saya juga berpendapat bahwa seseorang yang tidak tahu banyak tentang modul akan mengganggu orang yang melakukan lebih banyak daripada seseorang yang lebih berpengalaman. Jadi angka-angka di atas tidak memperhitungkan bahwa semakin banyak waktu yang dihabiskan B pada kode yang mereka tidak mengerti, semakin banyak waktu A mereka ambil dengan mengajukan pertanyaan, dan kadang-kadang A harus membantu memperbaiki atau memecahkan masalah apa yang B lakukan. Melatih seseorang adalah kegiatan yang menghabiskan waktu.
Solusi Optimal
Itu sebabnya saya pikir solusi optimal harus didasarkan pada pertanyaan seperti:
- Seberapa besar tim Anda? Apakah masuk akal untuk membuat semua orang dilatih secara silang pada setiap bagian, atau jika kita memiliki tim 10 orang, dapatkah kita memastikan setiap modul diketahui oleh setidaknya 3 orang? (Dengan 10 programmer dan 50 modul, setiap programmer harus tahu 15 modul untuk mendapatkan cakupan 3x.)
- Bagaimana pergantian karyawan Anda? Jika Anda membalikkan karyawan rata-rata setiap 3 tahun, dan butuh lebih lama dari itu untuk benar-benar mengetahui setiap sudut sistem, maka mereka tidak akan cukup lama untuk pelatihan agar dapat membayar sendiri.
- Apakah Anda benar-benar membutuhkan seorang ahli untuk mendiagnosis suatu masalah? Banyak orang menggunakan alasan, "bagaimana jika orang itu pergi berlibur", tetapi saya telah berkali-kali dipanggil untuk mendiagnosis masalah dalam suatu sistem yang belum pernah saya alami. Mungkin benar bahwa orang yang berpengalaman dapat menemukannya jauh lebih cepat, tetapi itu tidak berarti Anda tidak dapat hidup tanpanya selama satu atau dua minggu. Beberapa sistem perangkat lunak sangat kritis terhadap misi sehingga masalahnya harus didiagnosis dalam 1 jam, bukan 5 jam atau dunia akan berakhir. Anda harus mempertimbangkan risiko-risiko ini.
Itu sebabnya saya pikir "itu tergantung". Anda tidak ingin membagi 20 modul antara dua programmer di tengah (masing-masing 10), karena Anda tidak memiliki fleksibilitas, tetapi Anda juga tidak ingin melatih 10 programmer di 50 modul karena Anda kehilangan banyak modul. efisiensi dan Anda tidak perlu banyak redundansi.