Sobre productividad y SLOC
El problema con SLOC
El problema con la métrica SLOC es que mide una aproximación de la cantidad de código escrito, sin tener en cuenta:
- la calidad del código (es decir, ¿qué pasa si por cada 100 SLOC tiene que agregar otros 90 SLOC debido a errores, pero que no sabe en el momento en que se entrega su código?)
- los objetivos alcanzados con el código (es decir, ¿el 10K SLOC maneja todos los casos de uso esperados o historias de usuarios? ¿o solo un pequeño subconjunto?)
- la capacidad de mantenimiento del código (es decir, ¿tendrá que agregar 1% o 50% más de código para ajustar el código a los requisitos de evolución esperados?).
De lo contrario, la producción de un código de espagueti que no se puede mantener propenso a errores con muchas partes copiadas se considerará más productivo que el código reutilizable diseñado cuidadosamente.
Por lo tanto, SLOC definitivamente no es la mejor manera de medir la productividad.
¿Qué productividad estamos considerando?
La productividad se mide para un proceso. Por lo tanto, SLOC podría ser un indicador perfectamente válido para el proceso de codificación solo.
Si, por ejemplo, no comprende bien los requisitos deficientes, pasa cinco meses para producir el software, se lo muestra al usuario, descubre que está completamente equivocado y pasa otros 5 meses para reescribirlo desde cero, tendría la misma productividad en SLOC / mes, que un equipo escriba el código correctamente la primera vez, por ejemplo, porque usaron un proceso ágil que reduce los malentendidos mediante la retroalimentación frecuente. Esta aparente igual productividad esconde grandes problemas.
Por lo tanto, la medición de la productividad del desarrollo de software debe tener en cuenta todo el proceso, incluido el análisis de requisitos, el diseño de qué codificar, codificar, probar, depurar y verificar que se cumplan las expectativas del usuario. Como todas estas actividades son muy diferentes, lo mejor es medir lo único que importa: el software de trabajo, es decir, lo que el software producido significa para el usuario .
¿Cómo medir los entregables de software?
Existen varios enfoques:
- El enfoque típico en la ingeniería de software clásica es Function Points (FP). Los puntos de función se miden en función de los requisitos a cumplir (por ejemplo, número de formularios, número de campos en cada formulario, etc.). La productividad se mide en FP por unidad de tiempo y por persona. Algunas compañías incluso tienen datos que indican cuántos puntos de función puede producir un desarrollador por unidad de tiempo en un idioma determinado para un dominio determinado. El problema con FP es que requiere requisitos muy detallados por adelantado y lleva mucho tiempo.
- Un enfoque más moderno y pragmático son los puntos de historia (SP). Estos se utilizan para evaluar la complejidad del código que se va a producir, y se utilizan de forma rutinaria para evaluar la velocidad de los equipos de desarrollo. Sin embargo, SP es una medida de estimación para el trabajo realizado antes de que se conozcan todos los detalles. No es una medida final de lo que realmente sucedió. Por lo tanto, se debe tener cuidado al usarlo como una medida de productividad porque podría ser contraproducente en el proceso de estimación .
Acerca de la productividad de la escritura estática frente a la dinámica
Tengo que confesar que personalmente soy un fanático de los lenguajes estáticamente tipados, porque en mi interior sé que es más confiable (años de codificación me lo demostraron).
Entonces, una cosa que estoy segura es que el lenguaje de tipo estático puede evitar muchos más errores / errores en el momento de la compilación (por ejemplo, errores tipográficos, falta de coincidencia en los tipos esperados, etc.) que los lenguajes de tipo no estático. Pero con toda objetividad, no me atrevería a generalizar esto abusivamente como una mayor productividad.
¿Tu arquitecto tiene razón?
Tal vez tal vez no.
Pero sus argumentos no parecen válidos: la ganancia de productividad del lenguaje tipado estáticamente proviene de un número significativo de errores que el compilador detecta por adelantado.
En consecuencia, no es posible descubrir esta ganancia de productividad "más alta" mirando SLOC solo sin mirar el reprocesamiento requerido para lenguajes escritos dinámicamente. Entonces su comparación no puede ser justa.
El argumento de circunstancias comparables tampoco es válido. Algunos lenguajes de tipo dinámico permiten algunas construcciones de nivel superior que requieren menos código que hacer lo mismo en uno de los lenguajes clásicos de tipo estático. Por lo tanto, podría necesitar menos tiempo, escribir menos código, pero agregar los mismos gastos generales de análisis, prueba y verificación. Por lo tanto, medir la productividad mediante el SLOC diluiría las ganancias potenciales de productividad, creando así un sesgo contra el lenguaje de tipo dinámico.
¿Algún estudio para apoyar esa afirmación?
Existen varios estudios académicos recientes sobre el tema. Aunque algunos de ellos ven una ventaja de la escritura estática, en general se limita a un propósito específico (documentación, reutilización de código o API mal documentados, etc.). La redacción prudente también se usa porque el IDE moderno ha reducido significativamente los riesgos relacionados con la escritura dinámica: