Como muitas dessas perguntas, acho que a resposta é:
Depende
Há razões para acreditar que assumir a posição de que todo programador deve conhecer todas as linhas de código está equivocado.
Se assumirmos por um momento que alguém com um entendimento profundo de um pedaço de código fará alterações 5 vezes mais rápido do que alguém que não o conhece (nem um grande salto de fé na minha experiência) e leva cerca de um mês de experiência em codificação para obter uma compreensão realmente boa de um módulo de tamanho significativo (também não irracional), podemos executar alguns números (completamente falsos e fictícios):
- Programador A: possui profundo entendimento
- Programador B: nenhum
Digamos que o programador A obtenha 1 unidade de trabalho por dia. Em 4 semanas de 5 dias úteis, ele / ela pode realizar 20 unidades de trabalho.
Assim, 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 alcançou 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? Portanto, familiarizar-se com todos eles leva cerca de 4 anos, e isso significa que o programador de aprendizado está, em média, trabalhando com 58% de eficiência em comparação com o programador A ... hmmm.
Portanto, considere este cenário: mesmos programadores, mesmo projeto (A sabe tudo e B não sabe disso). Digamos que existem 250 dias úteis no ano. Vamos supor que a carga de trabalho seja distribuída aleatoriamente pelos 50 módulos. Se dividirmos os dois programadores igualmente, A e B recebem 5 dias úteis em cada módulo. A pode realizar 5 unidades de trabalho em cada módulo, mas B só obtém, de acordo com minha pequena simulação do Excel, 1,4 unidades de trabalho realizadas em cada módulo. O total (A + B) é de 6,4 unidades de trabalho por módulo. Isso ocorre porque B passa a maior parte do tempo sem nenhuma habilidade com o módulo em que está trabalhando.
Nessa situação, é mais ideal focar B em um subconjunto menor de módulos. Se B se concentrar em apenas 25 módulos, eles terão 10 dias em cada um, totalizando 3,8 unidades de trabalho em cada um. O programador A pode passar 7 dias cada um nos 25 módulos em que B não está trabalhando e 3 dias 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 é 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 nos quais B trabalha, obtemos ainda mais eficiência (até certo ponto).
Treinamento
Eu também argumentaria que alguém que não conhece muito sobre um módulo interromperá a pessoa que faz muito mais do que alguém com mais experiência. Portanto, esses números acima não levam em consideração que quanto mais tempo B passa no código que eles não entendem, mais tempo eles gastam fazendo perguntas e, às vezes, A precisando ajudar a corrigir 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 se basear em perguntas como:
- Qual é o tamanho da sua equipe? Faz sentido ter todo mundo treinado em todas as partes, ou se tivermos uma equipe de 10 pessoas, podemos apenas garantir que cada módulo seja conhecido por pelo menos três pessoas? (Com 10 programadores e 50 módulos, cada programador precisa conhecer 15 módulos para obter cobertura 3x).
- Como está a rotatividade de funcionários? Se você está contratando funcionários em média a cada 3 anos e leva mais tempo para conhecer realmente todos os cantos do sistema, eles não estarão disponíveis o tempo suficiente para que o treinamento seja recompensado.
- Você realmente precisa de um especialista para diagnosticar um problema? Muitas pessoas usam a desculpa "e se essa pessoa sai de férias", mas eu fui chamado várias vezes para diagnosticar um problema em um sistema com o qual eu não tinha experiência. Pode ser verdade que a pessoa experiente possa encontrá-la muito mais rapidamente, mas isso não significa que você não possa viver sem ela por uma semana ou duas. Poucos sistemas de software são tão críticos 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 acho que "depende". Você não deseja dividir 20 módulos entre dois programadores no meio (10 cada), porque não tem flexibilidade, mas também não deseja treinar 10 programadores em todos os 50 módulos, pois perde muito eficiência e você não precisa de muita redundância.