¿Por qué seguimos teniendo dificultades para medir el progreso a medida que se desarrolla el software?

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:

  • 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.

Existen dos problemas principales para medir el “progreso” en el caso de cualquier proyecto de investigación, incluida la programación.

Primero, necesita saber cuál es realmente su objetivo. Si le pido que pinte una pared de azul, puede determinar si la pared es, de hecho, azul, o no. Si le pido que invente algo, los requisitos finales rara vez son predecibles desde el principio. El software, en particular, es un producto que es casi todo un “diseño”: el código fuente es el modelo, los 2.643 segundos que lleva convertir ese código fuente en un “producto” es insignificante en comparación con el año que podría tomar hasta codificar ese diseño.

En segundo lugar, necesita alguna unidad de medida. “Cantidad finalizada = Cantidad finalizada ÷ Cantidad total”, más o menos, ¿verdad? Como no puede predecir de manera confiable el esfuerzo total, y no hay unidades de medida significativas para la cantidad que se ha hecho hasta ahora, las cosas son bastante malas.

Ahora, podemos predecir algunas piezas pequeñas, por eso tratamos de realizar un desarrollo iterativo . Crear archivos de proyecto y configurar repositorios para un equipo puede llevar uno o dos días. Agregar un campo adicional a, por ejemplo, un registro de Persona y actualizar lugares apropiados para mostrarlo y editarlo, tal vez unas pocas horas o días, dependiendo de la complejidad. Podemos adivinar estas pequeñas piezas, pero solo dentro de los estrechos límites de la experiencia personal y la experiencia con el programa en cuestión. Los marcos o productos similares pueden dar una idea, pero cualquier programa grande tendrá su propio “ecosistema” interno que debe ser navegado.

Es relativamente sencillo obtener estimaciones bastante buenas, con suficiente práctica, para pequeños cambios incrementales, pero prácticamente imposible de predecir.

  • cuantas “cosas” necesitarán ser inventadas,
  • cuán “fácil” será inventar cualquiera de esas cosas,
  • cuánto trabajo adicional se necesitará para probar, depurar, refinar y hacer que esas cosas funcionen con sistemas de construcción e implementación reproducibles,
  • qué trabajo de soporte adicional será necesario para capacitar a los evaluadores y autores de documentación para ajustar su trabajo en torno al cambio,
  • &C.

La falacia común es comparar la programación con la “ingeniería”. Puede ser, pero rara vez. Más a menudo, es un escenario de investigación y desarrollo.

Mala comparación: “Inventar e implementar software es como construir una casa, y un contratista puede estimar la fecha de finalización simplemente mirando los planos”. La segunda mitad es cierta, y la mayoría de los programadores pueden decirle cuánto tiempo llevará. compilar un programa, una vez que los planos, es decir, el código fuente, hayan terminado, pero esa no es una figura muy interesante.

Mejor comparación: “Inventar e implementar software es como inventar e implementar un nuevo procedimiento médico, por lo que no tenemos una estimación precisa de cuándo estará disponible la cura para el cáncer”.

Principalmente, es porque las personas que desean desarrollar software muy raramente entienden qué es lo que están pidiendo, y mucho menos lo que realmente necesitan.

Eso se explica mejor en una broma bastante antigua:

Estimado Sr. Arquitecto – Una carta abierta

Si los arquitectos tuvieran que trabajar como programadores

Estimado Sr. Arquitecto!

Por favor diseña y construyeme una casa. No estoy muy seguro de lo que necesito, así que debes usar tu discreción.

Mi casa debería tener entre dos y cuarenta y cinco habitaciones. Solo asegúrese de que los planes sean tales que las habitaciones se puedan agregar o eliminar fácilmente. Cuando me traigas los planos, tomaré la decisión final de lo que quiero. También tráigame el desglose de costos para cada configuración para que pueda elegir arbitrariamente uno.

Tenga en cuenta que la casa que finalmente elegí debe costar menos que la que estoy viviendo actualmente. Sin embargo, asegúrese de corregir todas las deficiencias que existen actualmente en mi casa (el piso de mi cocina vibra cuando la cruzo). , y las paredes no tienen suficiente aislamiento en ellas).

También tenga en cuenta al diseñar esta casa que deseo mantener el costo anual de mantenimiento lo más bajo posible. Esto debería significar la incorporación de características de costo adicional como revestimiento de aluminio o vinilo. Si elige no especificar el aluminio, prepárese para explicar en detalle.

Tenga en cuenta que las prácticas de diseño modernas y los últimos materiales se utilizan en la construcción de la casa. La casa debería ser muy bonita . Sin embargo, tenga en cuenta que la cocina debe estar diseñada para acomodar, entre otras cosas, mi refrigerador Gibson de 1952.

Para asegurarse de que está construyendo la casa correcta para nuestra familia, asegúrese de contactar a cada uno de los niños y también a los suegros. Mi suegra tendrá sentimientos muy fuertes acerca de cómo debe diseñarse la casa, ya que nos visita al menos una vez al año. Asegúrese de sopesar todas estas opciones cuidadosamente y tome la decisión correcta. Sin embargo, me reservo el derecho de anular cualquier decisión que se le ocurra.

Por favor, no me moleste con pequeños detalles en este momento. Su trabajo es desarrollar los planes generales para esta casa. Obtenga una idea general. No es apropiado en este momento elegir el color de la alfombra. Sin embargo, tenga en cuenta que a mi esposa le gusta el verde.

Además, no se preocupe en este momento por adquirir recursos para construir esta casa. Su primera prioridad es desarrollar planes detallados y especificaciones. Sin embargo, una vez que acepte estos planes, esperaré tener la casa bajo techo dentro de las 48 horas .

Mientras diseña esta casa específicamente para mí, tenga en cuenta que tarde o temprano tendré que vender esta casa. Debería atraer a los compradores potenciales. Asegúrese de que antes de finalizar los planes, hay un consenso de la población en mi área de que les gustan las características que tiene esta casa.

Se recomienda correr y mirar la casa de mi vecino que él había construido el año pasado. Nos gusta mucho. Tiene muchas características que nos gustaría tener en nuestro nuevo hogar, particularmente la piscina de 75 pies. Con una ingeniería cuidadosa, creo que puede diseñar esto en nuestra nueva casa sin afectar el costo de construcción .

Por favor, prepare un conjunto completo de planos. En este momento no es necesario hacer el diseño real, ya que estos planos solo se utilizarán para las ofertas de construcción . Sin embargo, tenga en cuenta que cualquier aumento de costos en el futuro como resultado de los cambios de diseño resultará en que le den una palmada.

Debe estar encantado de trabajar en un proyecto tan interesante como este. Poder usar nuevos tipos de construcción y tener tanta libertad en sus diseños es algo que no sucede muy a menudo. Contácteme lo más rápido posible con sus ideas de diseño. Me entusiasma ver lo que se te ocurre.

Sinceramente tuyo

Dr. Joe Fontanero

PD: Mi esposa me acaba de decir que no está de acuerdo con muchas de las instrucciones que le he dado en esta carta. Como arquitecto, es su responsabilidad resolver estos problemas. Lo he intentado en el pasado y no he podido lograr esto. Si no puede manejar esto, tendré que buscar un nuevo arquitecto.

PPS Quizás lo que necesito no es una casa, sino un remolque de viaje. Avíseme lo antes posible si ese es el caso.

Quizás aquellos que estén interesados ​​en rastrear tales cosas deberían reconocer que tales mediciones siempre serán blanditas en el mejor de los casos porque:

La producción de software está más cerca de un acto creativo que de estampar widgets en una cinta transportadora.

Se descubren cosas no anticipadas, se contabilizan y se acomodan mientras se produce software. Uno no puede planificar con precisión los fenómenos que son inherentemente provisionales, por lo que medir el progreso suele ser una ceremonia gratuita.

La pregunta que haría es: ¿Cuánto valor tiene medir el progreso?

More Interesting

¿Cuál es mejor, un desarrollador de software que escribe las pruebas unitarias pero no cumple con la fecha límite del proyecto o un desarrollador de software que ignora las pruebas unitarias y cumple con la fecha límite del proyecto?

¿Qué tipo de garantía incluyen típicamente los desarrolladores independientes de software móvil en un contrato con un cliente?

¿Cuánto cuesta el desarrollo de software personalizado en Canadá?

¿Cómo empiezo a contribuir en proyectos de código abierto?

Como desarrollador de software Java con 3 años de experiencia, ¿cuáles son todas las habilidades requeridas para un desarrollador de software?

¿'The Zone' es realmente malo para la productividad del equipo de desarrollo de software?

Alguien desarrolló el software que estaba buscando, estamos en diferentes países, ¿cuál es el mejor enfoque si solo quiero usar / pagar por el software?

¿Cuáles son los beneficios para el desarrollo de software para la industria de la salud?

Cómo manejar el trabajo artístico en el desarrollo de juegos independientes como desarrollador de software

¿Qué habilidades debe adquirir un desarrollador de RPA para destacar?

¿Qué tipo de desarrolladores de software todavía usan C?

¿Cuál es la mejor empresa de desarrollo de software en Estados Unidos?

¿Es posible construir un mejor servidor en Go que C ++?

Preguntas de la entrevista técnica: ¿Cómo diseñaría un sistema para almacenar el historial de búsqueda de sus usuarios?

Cómo pasar de un trabajo académico al desarrollo de software