Como muchas de estas preguntas, creo que la respuesta es:
Depende
Hay razones para creer que tomar la posición de que cada programador debe saber cada línea de código está equivocado.
Si suponemos por un momento que alguien con un profundo conocimiento de un fragmento de código hará cambios 5 veces más rápido que alguien que no lo sabe en absoluto (no es un gran salto de fe en mi experiencia) y lleva aproximadamente un mes de la experiencia de codificación para obtener una comprensión realmente buena de un módulo de tamaño significativo (tampoco irrazonable), entonces podemos ejecutar algunos números (completamente falsos y ficticios):
- Programador A: tiene un profundo conocimiento
- Programador B: ninguno
Digamos que el programador A realiza 1 unidad de trabajo por día. En 4 semanas de 5 días hábiles, puede realizar 20 unidades de trabajo.
Entonces el programador B, comenzando con 0.2 unidades de trabajo por día, y terminando con 0.96 unidades de trabajo en su vigésimo día (el día 21 son tan buenos como el programador A), logrará 11.6 unidades de trabajo en el mismo Período de 20 días. Durante ese mes, el programador B logró un 58% de eficiencia en comparación con el programador A. Sin embargo, ahora tiene otro programador que conoce ese módulo tan bien como el primero.
Por supuesto, en un proyecto de tamaño decente, podría tener ... ¿50 módulos? Por lo tanto, familiarizarse con todos ellos lleva unos 4 años, y eso significa que el programador de aprendizaje está trabajando, en promedio, con un 58% de eficiencia en comparación con el programador A ...
Considere este escenario: los mismos programadores, el mismo proyecto (A lo sabe todo y B no sabe nada de eso). Digamos que hay 250 días hábiles en el año. Supongamos que la carga de trabajo se distribuye aleatoriamente en los 50 módulos. Si dividimos a ambos programadores en partes iguales, A y B obtienen 5 días hábiles en cada módulo. A puede hacer 5 unidades de trabajo en cada módulo, pero B solo obtiene, según mi pequeña simulación de Excel, 1,4 unidades de trabajo realizadas en cada módulo. El total (A + B) es de 6.4 unidades de trabajo por módulo. Eso es porque B pasa la mayor parte de su tiempo sin ninguna habilidad con el módulo en el que están trabajando.
En esta situación, es más óptimo que B se centre en un subconjunto más pequeño de módulos. Si B se enfoca en solo 25 módulos, obtienen 10 días en cada uno, totalizando 3.8 unidades de trabajo en cada uno. El programador A podría pasar 7 días cada uno en los 25 módulos en los que B no está trabajando, y 3 días trabajando en los mismos módulos que B. La productividad total varía de 6.8 a 7 unidades por módulo, con un promedio de 6.9, y eso es significativamente mayor que las 6.4 unidades por módulo que hicimos cuando A y B distribuyeron el trabajo de manera uniforme.
A medida que reducimos el alcance de los módulos en los que B trabaja, obtenemos aún más eficiencia (hasta cierto punto).
Formación
También argumentaría que alguien que no sabe tanto sobre un módulo interrumpirá a la persona que hace mucho más que alguien con más experiencia. Por lo tanto, estos números anteriores no tienen en cuenta que cuanto más tiempo pasa B en código que no entienden, más tiempo de A dedican a hacer preguntas y, a veces, A tiene que ayudar a solucionar o solucionar lo que B hizo. Entrenar a alguien es una actividad que requiere mucho tiempo.
Solucion optima
Por eso creo que la solución óptima debe basarse en preguntas como:
- ¿Qué tan grande es tu equipo? ¿Tiene sentido que todos tengan entrenamiento cruzado en cada parte, o si tenemos un equipo de 10 personas, podemos asegurarnos de que cada módulo sea conocido por al menos 3 personas? (Con 10 programadores y 50 módulos, cada programador debe conocer 15 módulos para obtener una cobertura 3x).
- ¿Cómo es la rotación de sus empleados? Si está entregando empleados en un promedio de cada 3 años, y se tarda más que eso en conocer realmente cada rincón del sistema, entonces no estarán disponibles el tiempo suficiente para que la capacitación se amortice.
- ¿Realmente necesitas un experto para diagnosticar un problema? Mucha gente usa la excusa, "¿y si esa persona se va de vacaciones?", Pero me han llamado varias veces para diagnosticar un problema en un sistema con el que no tengo experiencia. Puede ser cierto que la persona experimentada pueda encontrarlo mucho más rápido, pero eso no significa que no pueda vivir sin ellos durante una semana o dos. Pocos sistemas de software son tan importantes para la misión que el problema tiene que ser diagnosticado en 1 hora en lugar de 5 horas o el mundo terminará. Tienes que sopesar estos riesgos.
Por eso creo que "depende". No desea dividir 20 módulos entre dos programadores en el medio (10 cada uno), porque entonces no tiene flexibilidad, pero tampoco desea entrenar a 10 programadores en los 50 módulos porque pierde mucho eficiencia y no necesita tanta redundancia.