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