Como muitas dessas perguntas, acho que a resposta é:
Depende
Existem razões para acreditar que assumir a posição de que todo programador deve conhecer todas as linhas de código é equivocado.
Se assumirmos por um momento que alguém com um profundo entendimento de um trecho de código fará alterações 5 vezes mais rápidas do que alguém que não o conhece (e não um salto gigante de fé em minha experiência) e é preciso com cerca de um mês de experiência em codificação para obter uma boa compreensão de um módulo de tamanho significativo (também não razoável), então podemos executar alguns números (completamente falsos e fictícios):
- Programador A: tem uma compreensão profunda
- Programador B: nenhum
Digamos que o programador A tenha 1 unidade de trabalho por dia. Em 4 semanas de 5 dias úteis, ele pode obter 20 unidades de trabalho.
Então, o programador B, começando com 0,2 unidades de trabalho por dia e terminando com 0,96 unidades de trabalho em seu 20º dia (no 21º dia eles são tão bons quanto o programador A), realizará 11,6 unidades de trabalho no mesmo período de 20 dias. Durante esse mês, o programador B atingiu 58% de eficiência em comparação com o programador A. No entanto, agora você tem outro programador que conhece esse módulo, bem como o primeiro.
Claro, em um projeto de tamanho decente, você pode ter ... 50 módulos? Então, se familiarizar com todos eles leva cerca de 4 anos, e isso significa que o programador de aprendizado está, em média, trabalhando com eficiência de 58% comparado ao programador A ... hmmm.
Então, considere este cenário: os mesmos programadores, o mesmo projeto (A sabe tudo, e B não sabe nada disso.) Digamos que haja 250 dias úteis no ano. Vamos supor que a carga de trabalho é distribuída aleatoriamente nos 50 módulos. Se dividirmos os dois programadores uniformemente, A e B receberão 5 dias úteis em cada módulo. A pode fazer 5 unidades de trabalho em cada módulo, mas B só recebe, de acordo com minha pequena simulação do Excel, 1.4 unidades de trabalho feitas em cada módulo. Total (A + B) é 6,4 unidades de trabalho por módulo. Isso porque B passa a maior parte do tempo sem nenhuma habilidade com o módulo em que está trabalhando.
Nesta situação, é melhor ter B focado em um subconjunto menor de módulos. Se B foca em apenas 25 módulos, eles recebem 10 dias em cada, totalizando 3,8 unidades de trabalho em cada. O programador A poderia então gastar 7 dias cada nos 25 módulos em que B não está trabalhando, e 3 dias cada trabalhando nos mesmos módulos B. A produtividade total varia de 6,8 a 7 unidades por módulo, com média de 6,9, e isso é significativamente maior do que as 6,4 unidades por módulo que fizemos quando A e B espalharam o trabalho uniformemente.
À medida que reduzimos o escopo dos módulos em que o B trabalha, obtemos ainda mais eficiência (até certo ponto).
Treinamento
Eu também argumentaria que alguém que não sabe tanto sobre um módulo irá interromper a pessoa que faz muito mais do que alguém com mais experiência. Então, esses números acima não levam em conta que quanto mais tempo B gasta em código que eles não entendem, mais tempo de A eles ocupam fazendo perguntas, e algumas vezes A tem que ajudar a consertar ou solucionar o que B fez. Treinar alguém é uma atividade demorada.
Solução ideal
É por isso que acho que a solução ideal deve ser baseada em perguntas como:
- Qual é o tamanho do seu time? Faz sentido ter todo mundo treinado em todas as partes, ou se temos uma equipe de 10 pessoas, podemos apenas garantir que cada módulo seja conhecido por pelo menos 3 pessoas? (Com 10 programadores e 50 módulos, cada programador precisa conhecer 15 módulos para obter uma cobertura de 3x.)
- Como está sua rotatividade de funcionários? Se você está entregando os funcionários em média a cada três anos, e leva mais tempo do que isso para realmente conhecer todos os cantos do sistema, eles não estarão por perto o tempo suficiente para que o treinamento se pague de volta.
- Você realmente precisa de um especialista para diagnosticar um problema? Muitas pessoas usam a desculpa, "e se essa pessoa sair de férias", mas eu fui chamado várias vezes para diagnosticar um problema em um sistema que eu não tive nenhuma experiência. Pode ser verdade que a pessoa experiente poderia encontrá-lo muito mais rápido, mas isso não significa que você não pode viver sem eles por uma semana ou duas. Poucos sistemas de software são tão importantes que o problema precisa ser diagnosticado em 1 hora em vez de 5 horas ou o mundo terminará. Você tem que pesar esses riscos.
É por isso que penso "depende". Você não quer dividir 20 módulos entre dois programadores no meio (10 cada), porque então você não tem flexibilidade, mas você também não quer cruzar train 10 programadores em todos os 50 módulos porque você perde muito eficiência e você não precisa de muita redundância.