Як і багато таких питань, я думаю, що відповідь:
Це залежить
Є підстави вважати, що зайняття позиції, згідно з якою кожен програміст повинен знати кожен рядок коду, є помилковим.
Якщо припустити на мить, що хтось із глибоким розумінням фрагмента коду зробить зміни в 5 разів швидше, ніж той, хто цього зовсім не знає (не гігантський стрибок віри в мій досвід), і це займе близько місяця досвід кодування, щоб отримати дійсно хороше розуміння модуля зі значним розміром (також нерозумно), тоді ми можемо запустити кілька (повністю фіктивних і вигаданих) чисел:
- Програміст A: має глибоке розуміння
- Програміст В: немає
Скажімо, програміст А отримує 1 одиницю виконаної роботи на день. За 4 тижні 5 робочих днів він може отримати 20 одиниць роботи.
Таким чином, програміст B, починаючи з 0,2 одиниці роботи на день і закінчуючи 0,96 одиниць роботи на 20-й день (на 21 день вони такі ж хороші, як програміст А), виконає 11,6 одиниць роботи за той же самий час 20-денний період. Протягом цього місяця програміст B досяг 58% ефективності порівняно з програмістом А. Однак у вас зараз є інший програміст, який знає цей модуль, як і перший.
Звичайно, у проекті пристойного розміру у вас може бути ... 50 модулів? Отже, ознайомлення з усіма ними займає близько 4 років, а це означає, що програміст, який навчається, працює в середньому на 58% ефективності порівняно з програмістом А ... хм.
Тому врахуйте цей сценарій: ті ж програмісти, той самий проект (A це все знає, а B нічого не знає.) Скажімо, що в році є 250 робочих днів. Припустимо, що навантаження розподіляється випадковим чином на 50 модулів. Якщо ми розділимо обох програмістів рівномірно, A і B отримують по 5 робочих днів на кожному модулі. А може виконати 5 одиниць роботи на кожному модулі, але B отримує, згідно з моїм маленьким моделюванням Excel, 1,4 одиниці роботи, виконаної на кожному модулі. Всього (A + B) - 6,4 одиниці роботи на модуль. Це тому, що B проводить більшу частину свого часу без будь-яких навичок за допомогою модуля, над яким вони працюють.
У цій ситуації оптимальніше зосередитись на Б меншій підмножині модулів. Якщо B зосереджується лише на 25 модулях, вони отримують 10 днів на кожен, що складає 3,8 одиниці роботи на кожному. Потім програміст А може витратити 7 днів кожен на 25 модулів, над якими B не працює, і 3 дні кожен працює над тими ж, що і B. Загальна продуктивність коливається від 6,8 до 7 одиниць на модуль, в середньому 6,9, і це значно вище ніж 6,4 одиниці на модуль, що ми зробили, коли A і B розподілили роботу рівномірно.
Коли ми звужуємо область модулів, над якими працює B, ми отримуємо ще більшу ефективність (до певного моменту).
Навчання
Я також зауважу, що той, хто не знає стільки про модуль, перерве людину, яка робить набагато більше, ніж хтось із більшим досвідом. Отже, ці цифри вище не враховують, що чим більше часу Б витрачає на код, якого вони не розуміють, тим більше часу А займає, задаючи питання, а іноді А потрібно допомогти виправити чи усунути неполадки, що зробив Б. Навчання когось - це трудомістка діяльність.
Оптимальне рішення
Ось чому я думаю, що оптимальне рішення має базуватися на таких питаннях:
- Наскільки ваша команда? Чи є сенс, щоб усі проходили тренування на кожній частині, або якщо у нас є команда з 10 осіб, чи можемо ми просто переконатися, що кожен модуль знає щонайменше 3 людини? (Маючи 10 програмістів і 50 модулів, кожен програміст повинен знати 15 модулів, щоб отримати 3-кратне покриття.)
- Яким чином обіг вашого працівника? Якщо ви переводите працівників в середньому кожні 3 роки, і це займає більше часу, ніж це дійсно знає кожен куточок системи, то вони не будуть довгі, щоб навчання окупилося.
- Вам дійсно потрібен експерт для діагностики проблеми? Дуже багато людей використовують виправдання "що робити, якщо ця людина їде у відпустку", але мене не раз телефонували, щоб діагностувати проблему в системі, з якою у мене не було досвіду. Це може бути правдою, що досвідчена людина може знайти це набагато швидше, але це не означає, що ти не можеш прожити без них тиждень-два. Небагато програмних систем настільки критично важливі, що проблему доведеться діагностувати за 1 годину замість 5 годин, інакше світ закінчиться. Ви повинні зважити ці ризики.
Ось чому я думаю, що "це залежить". Ви не хочете розділяти 20 модулів між двома програмістами прямо в середині (по 10), тому що у вас немає гнучкості, але ви також не хочете перетинати 10 програмістів на всі 50 модулів, оскільки ви втрачаєте багато ефективність, і вам не потрібно стільки зайвих надмірностей.