Esta es una buena pregunta, y no tengo una respuesta completa, pero la intentaré.
Primero, el software es diferente a casi todos los demás productos, o cosas que se pueden ensamblar. Si está construyendo un puente o un rascacielos, puede saber cuándo está a medio camino. Sabes cuánto has hecho y cuánto te queda por hacer.
El software, por el contrario, es diferente a eso. No puedes simplemente mirar dónde estás y juzgar qué tan cerca estás de tu objetivo. Puedes saber cuándo no has terminado, pero a menudo es difícil saber si estás a medio camino, tres cuartos de camino, o si apenas has comenzado. Esto se debe a varios factores, pero principalmente:
- ¿Qué habilidades blandas deberían los desarrolladores dedicar más tiempo a cultivar para ser más felices y empleables?
- Como desarrollador de software, ¿tiene miedo de envejecer?
- Estoy haciendo B.tech en biotecnología. Quiero ir a los campos de desarrollador de software. ¿Cuál debería ser mi estrategia?
- ¿Java está saturado?
- Como desarrollador de software para principiantes, ¿qué tan importante es poder escribir código rápidamente? ¿Cuál es la cantidad mínima de horas que necesito pasar un día para dominar Java en 3-6 meses?
- Mala planificación . Las personas, especialmente los arquitectos que no son de software, odian la fase de “planificación” y “diseño” de un proyecto de software. La mayoría de las personas no tecnológicas asumen que una vez que se cumplen todos los requisitos, puede comenzar a codificar. Puedes, pero es una muy mala idea. Es mejor hacer un diseño detallado de la aplicación o sistema. Cuanto más complicado es un sistema, más crítico es este paso. Y puede llevar meses, pero generalmente involucra a unas pocas personas (arquitectos de software), por lo que un gran equipo de software puede no estar involucrado y no estar al tanto del progreso del diseño. Esto enfurece a las partes interesadas (generalmente, las que tienen el dinero), por lo que exigen que la codificación comience de inmediato . Por lo tanto, el desarrollo comienza antes de que alguien esté exactamente seguro de cómo van a construir la “cosa” (aplicación o sistema). Inevitablemente, esto aumenta el tiempo de desarrollo porque muchos subsistemas están diseñados “sobre la marcha” y de manera diferente a otros subsistemas. Podría seguir, pero es una mala idea, pero casi siempre sucede. Los interesados odian dejar que los ingenieros diseñen antes de la implementación.
- Descubrimiento Debido a la mala planificación, se realizan descubrimientos en el camino que requieren grandes cambios que son costosos y requieren mucho tiempo. Por ejemplo, suponga que su equipo acaba de terminar el componente A. Es un componente enorme y ha estado bloqueando el desarrollo en los componentes C, D y E. Antes de que alguien más pueda usarlo, debe integrarse con el componente B. Pero, como su el equipo comienza esto, ¡encuentran que es totalmente incompatible con el componente B! El componente B requiere API web, ¡pero el componente A usa WCF! ¡No hay forma de que puedan hablar entre ellos! O el componente A tiene que reescribirse o el componente B lo hace. ¿Cuál se reescribe? ¿De quién es la culpa? ¿Qué hacen todos los otros desarrolladores mientras esto se soluciona? ¿Cuántas semanas llevará reescribir? Caro, pero sucede todo el tiempo cuando la fase de diseño se omite o está incompleta.
Ni siquiera puede distinguir por líneas de código fuente (SLOC). Durante el desarrollo, su SLOC generalmente aumentará, pero incluso puede disminuir a medida que los desarrolladores encuentren soluciones más elegantes. Pero no sabe cuántos SLOC tendrá cuando el producto esté “listo”, por lo que contarlos generalmente es inútil.
Y las cosas que parecen “características pequeñas pero necesarias” pueden convertirse en grandes lonas porque, dado que no había diseño, ¡nadie se dio cuenta de lo increíblemente complejas o caras que realmente son! Los desarrolladores están pirateando la función en su lugar, participando en atajos de ingeniería de software realmente pobres porque tienen que hacerlo en este momento , mientras se retrasan cada vez más, por lo que toman aún más atajos, escriben hacks realmente malos … y continúa y a partir de ahí.
Incluso con un diseño (o arquitectura) realmente exhaustivo y coherente, la fase de desarrollo puede continuar porque algunas cosas se perdieron en la fase de diseño o incluso a sabiendas no se pudieron medir en la fase de diseño, por lo que deben reescribirse durante la implementación fase. En este punto, el desarrollo debe detenerse mientras se elabora un nuevo diseño, pero en general nunca lo es. Una solución viable, pero no óptima, simplemente se cierra de golpe sobre la marcha, paralizando todo el sistema, pero cumple con un plazo arbitrario.
TL / DR: El progreso con el software generalmente es muy difícil de medir debido a la falta de un diseño completo; Incluso con un diseño muy completo, suceden cosas que no se pueden predecir.
Recuerde: el primer 90% del desarrollo lleva el 90% del tiempo. El último 10% toma el otro 90% del tiempo.