Hombre mítico mes 10 líneas por día de desarrollador: ¿qué tan cerca en grandes proyectos? [cerrado]

129

Todo el mundo siempre dice que pueden superar las "10 líneas por desarrollador por día" del "Mes del Hombre Mítico", y al comenzar un proyecto, generalmente puedo obtener un par de cientos de líneas en un día.

Pero en mi empleador anterior, todos los desarrolladores eran muy agudos, pero era un gran proyecto, más de un millón de líneas de código, con requisitos de certificación muy onerosos e interconectado con otros proyectos de varias millones de líneas. En algún momento, como ejercicio de curiosidad, tracé líneas de código en el producto de envío en mi grupo (sin contar las herramientas que desarrollamos), y efectivamente, incrementalmente, llegó a alrededor de 12 líneas de adición neta por desarrollador por día. Sin contar los cambios, el código de prueba o el hecho de que los desarrolladores no estaban trabajando en el código real del proyecto todos los días.

¿Cómo están las otras personas? ¿Y qué tipo de requisitos enfrenta (imagino que es un factor)?

Matthias Wandel
fuente
13
debe ser wiki comunitario.
Malfist
24
Si "10" estuviera en binario, estaría más cerca de la marca.
geofftnz
2
Pregunta muy interesante :)
Emil H
9
Encontré esta bonita cita "Medir el progreso de la programación por líneas de código es como medir el progreso de la construcción de aviones por peso" en este sitio web [enlace] ( devtopics.com/101-great-computer-programming-quotes )
mm24
2
@ Greg Bacon, Bill el Lagarto: Realmente me gustaría que esta pregunta se volviera a abrir. Puede que no se ajuste exactamente a las reglas de SO, pero definitivamente está atrayendo visitantes. (35875 espectadores hasta ahora)
Skippy Fastol

Respuestas:

46

Creo que la cantidad de líneas agregadas depende en gran medida del estado del proyecto, la tasa de adición a un nuevo proyecto será mucho mayor que la tasa de un proyecto inicial.

El trabajo es diferente entre los dos: en un proyecto grande, generalmente pasa la mayor parte del tiempo calculando las relaciones entre las partes, y solo una pequeña cantidad para cambiar / agregar realmente. mientras que en un nuevo proyecto, principalmente escribes ... hasta que sea lo suficientemente grande y la tasa disminuya.

Liran Orevi
fuente
En efecto. Al principio de dicho proyecto, el anuncio neto era mucho más grande.
Matthias Wandel
1
Por lo tanto, sostiene la teoría de dividir un gran proyecto en muchas partes independientes (incluso pueden ser proyectos independientes), para desacoplar.
sergzach
108

En uno de mis proyectos actuales, en algunos módulos, estoy orgulloso de haber contribuido con un recuento negativo de líneas a la base del código. Identificar qué áreas del código han crecido complejidad innecesaria y pueden simplificarse con un diseño más limpio y claro es una habilidad útil.

Por supuesto, algunos problemas son inherentemente complejos y requieren soluciones complejas, pero en la mayoría de los proyectos grandes las áreas que han tenido requisitos mal definidos o cambiantes tienden a tener soluciones demasiado complejas con un mayor número de problemas por línea.

Dado un problema a resolver, prefiero la solución que reduce el recuento de líneas. Por supuesto, al comienzo de un proyecto pequeño puedo generar más de diez líneas de código por día, pero tiendo a no pensar en la cantidad de código que he escrito, solo en lo que hace y qué tan bien lo hace. Ciertamente no trataría de superar diez líneas por día o considerarlo un logro hacerlo.

Charles Bailey
fuente
49
+1 por contribuir líneas negativas. Una vez trabajé en un pequeño proyecto donde reduje el recuento de líneas de 15K a 5K mientras agregaba nuevas características (y disminuía en gran medida el recuento de errores y aumentaba la velocidad).
rmeador
55

Me gusta esta cita:

Si deseamos contar líneas de código, no debemos considerarlas como "líneas producidas" sino como "líneas gastadas". - Edsger Dijkstra

Algunas veces has contribuido más eliminando código que agregando

rlovtang
fuente
30

Debería dejar de usar esta métrica, no tiene sentido en su mayor parte. La cohesión, el acoplamiento y la complejidad son métricas más importantes que las líneas de código.

Otávio Décio
fuente
25
No lo estaba usando como una métrica de productividad. Este fue un ejercicio privado para mi propia curiosidad.
Matthias Wandel
3
Lo suficientemente justo. Aun así, es difícil responder sin una definición más precisa de lo que se debe considerar una línea de código.
Otávio Décio
1
@Matthias: Debería editar eso en el OP si fuera usted, por mi parte hubiera sido menos ... agresivo: P
annakata
28

¿Cómo están las otras personas?

Soy el único desarrollador de tiempo completo en nuestra empresa y he escrito 500,000 líneas de código OCaml y F # en los últimos 7 años, lo que equivale a unas 200 líneas de código por día. Sin embargo, la gran mayoría de ese código son ejemplos tutoriales que consisten en cientos de proyectos separados, cada uno de unos cientos de líneas de largo. Además, hay mucha duplicación entre OCaml y F #. No mantenemos ninguna base de código interna mayor a 50kLOC.

Además de desarrollar y mantener nuestro propio software, también he consultado a muchos clientes en la industria durante los últimos 7 años. Para el primer cliente , escribí 2,000 líneas de OCaml durante 3 meses, que son 20 líneas de código por día. Para el siguiente cliente , cuatro de nosotros escribimos un compilador que generó millones de líneas de código C / C ++ / Python / Java / OCaml, así como documentación en 6 meses, que es de 2,000 líneas de código por día por desarrollador. Para otro cliente, reemplacé 50kLOC de C ++ con 6kLOC de F # en 6 meses, que es -352 líneas de código por día. Para otro cliente más , estoy reescribiendo 15kLOC de OCaml en F #, que tendrá el mismo tamaño, así que 0 líneas de código por día.

Para nuestro cliente actual , reemplazaré 1,600,000 líneas de código C ++ y Mathematica con ~ 160kLOC de F # en 1 año (escribiendo un compilador a medida) que será -6,000 líneas de código por día. Este será mi proyecto más exitoso hasta la fecha y le ahorrará a nuestro cliente millones de dólares al año en costos continuos. Creo que todos deberían apuntar a escribir -6,000 líneas de código por día.

JD
fuente
1
Me gusta tu respuesta y entiendo el sarcasmo. Como curiosidad, ¿podría aclarar por qué reescribir el código en F # le ahorrará dinero a su cliente? Estaba familiarizado con OCaml y escribí un intérprete en ese idioma y no toqué el idioma desde hace unos años, y ahora sigo escuchando sobre F # (así que tengo una curiosidad genuina sobre esto)
mm24
77
@ mm24 "¿podría aclarar por qué reescribir el código en F # le ahorrará dinero a su cliente". En primer lugar, Wolfram Research los jodió realmente y les cobró contratos de consultoría de £ 1 millón para solucionar problemas que introdujeron deliberadamente en las actualizaciones de Mathematica, por ejemplo, cambiar la semántica de [LongDash]. En segundo lugar, pueden consolidar dos bases de código (Mathematica y C ++) que actualmente se mantienen en conjunto en una base de código F #, reduciendo no solo el esfuerzo duplicado sino muchas interacciones con actualizaciones de productos y correcciones identificadas en las pruebas.
JD
77
@ mm24 En tercer lugar, la automatización. Están haciendo muchas cosas a mano para las cuales hay herramientas .NET preexistentes para automatizar o .NET facilita la construcción de dichas herramientas. Las tareas incluyen el código de instrumentación con temporizadores para medir el rendimiento (usar un generador de perfiles), escribir serializadores a mano (usar una biblioteca), copiar nombres de valores clave a mano (usar la reflexión) y actualizaciones críticas a los sistemas en vivo enviados por negocios. TI a mano (escriba una herramienta para que las empresas puedan hacer cambios directamente).
JD
77
@ mm24 Cuarto, mejoras de rendimiento masivas. F # es un orden de magnitud más rápido que Mathematica y su código de prueba de concepto en F # es 5 veces más rápido que su código C ++ de producción. Esto significa que las pruebas se ejecutan en segundos en lugar de horas, momento en el que las pruebas se convierten en una parte integral del desarrollo, mejorando drásticamente la productividad.
JD
77
@ mm24 En quinto lugar, mayores capacidades. Quieren eliminar el código muerto y medir la cobertura del código de sus pruebas, pero no pueden hacerlo con las herramientas que utilizan. Pasar a .NET hace que esto (¡y más!) Sea fácil.
JD
13

Sin verificar realmente mi copia de "The Mythical Man-Month" (todos los que leen esto realmente deberían tener una copia disponible), hubo un capítulo en el que Brooks observó la productividad por líneas escritas. El punto interesante, para él, no era el número real de líneas escritas por día, sino el hecho de que parecía ser más o menos lo mismo en ensamblador y en PL / I (creo que ese era el lenguaje de nivel superior utilizado).

Brooks no estaba dispuesto a arrojar algún tipo de cifra arbitraria de productividad, pero estaba trabajando a partir de datos en proyectos reales, y por lo que puedo recordar, podrían haber sido 12 líneas / día en promedio.

Señaló que podría esperarse que la productividad varíe. Dijo que los compiladores eran tres veces más difíciles que los programas de aplicación, y los sistemas operativos tres veces más difíciles que los compiladores. (Parece que le ha gustado usar multiplicadores de tres para separar las categorías).

No sé si él apreció las diferencias individuales entre la productividad del programador (aunque en un argumento de orden de magnitud postuló un factor de siete diferencias), pero como sabemos, una productividad superior no es solo una cuestión de escribir más código, pero también escribiendo el código correcto para hacer el trabajo.

También está la cuestión del medio ambiente. Brooks especuló un poco sobre qué haría que los desarrolladores fueran más rápidos o más lentos. Al igual que muchas personas, se preguntó si las modas actuales (depuración interactiva utilizando sistemas de tiempo compartido) eran mejores que las antiguas (planificación previa cuidadosa para una toma de dos horas con toda la máquina).

Dado eso, no tendría en cuenta ningún número de productividad real que se le ocurrió como inútil; El valor continuo del libro está en los principios y las lecciones más generales que las personas persisten en no aprender. (Oye, si todos los hubieran aprendido, el libro sería de interés histórico solamente, al igual que todos los argumentos de Freud de que hay algo así como una mente subconsciente).

David Thornley
fuente
3
Una idea sobre la productividad diferente del programador: en mi experiencia, un programador mediocre tardará x veces más en resolver un problema dado, pero también, desafortunadamente, escribirá x veces más código mientras está en ello. Entonces, con las simples "líneas de código por día", el programador mediocre es igual de productivo.
Matthias Wandel
11

Es fácil obtener un par de cientos de líneas de código por día. Pero trate de obtener un par de cientos de líneas de código de calidad por día y no es tan fácil. Supere eso con la depuración y pasando por días con pocas o ninguna línea nueva por día y el promedio disminuirá bastante rápido. He pasado semanas depurando problemas difíciles y la respuesta es 1 o 2 líneas de código.

Jeffrey Hines
fuente
En efecto. Pero llegará a ese escenario con más frecuencia a medida que el proyecto se haga más grande. He escrito programas perfectos de 10 líneas que no tenían errores. Todo es cuestión de escala.
Matthias Wandel
1
No hay programas que no tengan errores.
Daniel Moura
14
¡Bah! su gramática tiene errores ...
RAL
3
@DanielMoura Oh, no estoy de acuerdo con eso ... Un programa "hola mundo" podría no ser muy útil, pero podrías decir con bastante confianza que no tenía ningún error :)
WendiKidd
10

Sería mucho mejor darse cuenta de que hablar de líneas físicas de código no tiene mucho sentido. El número de líneas físicas de código (LoC) depende tanto del estilo de codificación que puede variar de un orden de magnitud de un desarrollador a otro.

En el mundo .NET hay una manera conveniente de contar la LoC. Punto de secuencia . Un punto de secuencia es una unidad de depuración, es la parte del código resaltada en rojo oscuro al poner un punto de interrupción. Con el punto de secuencia podemos hablar de LoC lógico , y esta métrica se puede comparar en varios lenguajes .NET. La métrica del código lógico LoC es compatible con la mayoría de las herramientas .NET, incluida la métrica del código VisualStudio, NDepend o NCover.

Por ejemplo, aquí hay un método de 8 LoC (los puntos de secuencia de paréntesis iniciales y finales no se tienen en cuenta):

texto alternativo

La producción de LoC debe contarse a largo plazo. Algunos días escupirás más de 200 LoC, otros días pasarás 8 horas reparando un error sin siquiera agregar un LoC. Algunos días limpiarás el código muerto y eliminarás el LoC, algunos días pasarás todo el tiempo refactorizando el código existente y no agregando ningún LoC nuevo al total.

Personalmente, cuento una única LoC en mi propio puntaje de productividad solo cuando:

  1. Está cubierto por pruebas unitarias
  2. está asociado a algún tipo de contrato de código (si es posible, no todos los LoC, por supuesto, pueden verificarse mediante contratos).

En esta condición, mi puntaje personal en los últimos 5 años codificando la herramienta NDepend para desarrolladores .NET es un promedio de 80 LoC físicos por día sin sacrificar de ninguna manera la calidad del código . El ritmo es sostenido y no veo que disminuya en el corto plazo. Con todo, NDepend es una base de código C # que actualmente pesa alrededor de 115K LoC físico

Para aquellos que odian contar LoC (vi muchos de ellos en los comentarios aquí), atestiguo que una vez calibrado adecuadamente, contar LoC es una excelente herramienta de estimación . Después de codificar y medir docenas de características logradas en mi contexto particular de desarrollo, llegué al punto en el que puedo estimar con precisión el tamaño de cualquier característica TODO en LoC y el tiempo que me llevará entregarla a producción.

rev. Patrick del equipo NDepend
fuente
1
Tu publicación es fundamental y merece muchos más votos a favor.
Skippy Fastol
9

No hay tal cosa como una bala de plata.

Una sola métrica como esa es inútil por sí misma.

Por ejemplo, tengo mi propia biblioteca de clases. Actualmente, las siguientes estadísticas son verdaderas:

Líneas totales: 252.682
Líneas de código: 127.323
Comentarios: 99.538
Líneas vacías: 25.821

Supongamos que no escribo ningún comentario, es decir, 127.323 líneas de código. Con su relación, esa biblioteca de códigos me tomaría alrededor de 10610 días para escribir. Eso es 29 años.

Ciertamente no pasé 29 años escribiendo ese código, ya que todo es C #, y C # no ha existido tanto tiempo.

Ahora, puede argumentar que el código no es tan bueno, ya que obviamente debo haber superado su métrica de 12 líneas por día, y sí, aceptaré eso, pero si voy a reducir la línea de tiempo a cuando se lanzó 1.0 (y no comencé a hacerlo hasta que se lanzó 2.0), que es 2002-02-13, aproximadamente 2600 días, el promedio es de 48 líneas de código por día.

¿Todas esas líneas de código son buenas? Diablos no. ¿Pero hasta 12 líneas de código al día?

Diablos no.

Todo depende

Puede tener un programador de primer nivel produciendo código en el orden de miles de líneas por día, y un programador mediano produciendo código en el orden de cientos de líneas por día, y la calidad es la misma.

Y sí, habrá errores.

El total que quieres es el saldo. La cantidad de código ha cambiado, versus la cantidad de errores encontrados, versus la complejidad del código, versus la dificultad de corregir esos errores.

Lasse V. Karlsen
fuente
¡Amén! (más espacios para cumplir 15 char min)
Nate
Tenga en cuenta que esas estadísticas fueron calculadas por DPack ( usysware.com/dpack ).
Lasse V. Karlsen
55
Quizás la regla de 10 líneas por día no se aplica a algo más pequeño, como la biblioteca de clases que escribió (supongo que usted mismo). Gran parte de los números de Brooks provienen de grandes proyectos (OS360 de IBM), que está en una escala fundamentalmente diferente a la biblioteca de su clase. Supongo que la observación de Brooks es (con frecuencia) válida para proyectos grandes que requieren muchas personas y redes de comunicación humana significativas, pero no es válida para proyectos más pequeños.
J. Polfer
6

Steve McConnell ofrece una estadística interesante en su libro "Estimación de software" (p. 62 Tabla 5.2). Distingue entre los tipos de proyecto (Aviónico, Negocio, Telco, etc.) y el tamaño del proyecto 10 kLOC, 100 kLOC, 250 kLOC. Los números se dan para cada combinación en LOC / StaffMonth. EG Avionic: 200, 50, 40 Sistemas de intranet (internos): 4000, 800, 600 Sistemas integrados: 300, 70, 60

Lo que significa: por ejemplo. para el proyecto Avionic 250-kLOC hay 40 (LOC / mes) / 22 (días / mes) == <2LOC / día!

Valentin Heinitz
fuente
1
250 líneas de código Terra? ¿Qué le pasa a KLoC?
fadedbee
4

Creo que esto proviene de los días de desarrollo de la cascada , donde la fase de desarrollo real de un proyecto podría ser tan poco como 20-30% del tiempo total del proyecto. Tome las líneas de código totales y divídalas por el tiempo completo del proyecto y obtendrá alrededor de 10 líneas / día. Divídase solo por el período de codificación, y se acercará a lo que la gente cita.

pgs
fuente
3

Nuestra base de código es de aproximadamente 2.2MLoC para un esfuerzo de aproximadamente 150 años-hombre. Eso hace alrededor de 75 líneas de c ++ o c # por desarrollador por día, durante toda la vida del proyecto.

Steve Cooper
fuente
2

Creo que el tamaño del proyecto y la cantidad de desarrolladores involucrados son factores importantes en esto. Estoy muy por encima de esto en mi carrera, pero he trabajado solo todo el tiempo, así que no hay pérdida por trabajar con otros programadores.

Loren Pechtel
fuente
1
Los proyectos pequeños ayudan, y también lo hace el solitario. Al principio me sorprendió ver que alcanzamos esta figura histórica, al menos de forma incremental. Al comienzo de dicho proyecto, mi productividad era al menos 10 veces mayor.
Matthias Wandel
2

Buena planificación, buen diseño y buenos programadores. Obtiene todo ese conjunto y no pasará 30 minutos escribiendo una línea. Sí, todos los proyectos requieren que se detenga y planifique, piense, discuta, pruebe y depure, pero a dos líneas por día cada compañía necesitaría un ejército para que los tetris funcionen ...

En pocas palabras, si estuvieras trabajando para mí a 2 líneas por hora, será mejor que me consigas muchos ataúdes y masajees mis pies para que no te despidan.

lcabral
fuente
1

Uno sospecha que esta parte perenne de gerente-dulce fue acuñada cuando todo era una aplicación de sistema escrita en C porque, si nada más, el número mágico variaría en órdenes de magnitud según el idioma, la escala y la naturaleza de la aplicación. Y luego tienes que descartar comentarios y atributos. Y en última instancia, ¿a quién le importa la cantidad de líneas de código escritas? ¿Se supone que debes terminar cuando alcances las 10K líneas? 100K? Tan arbitrario.

Es inutil.

annakata
fuente
¿Cómo describe el tamaño de un proyecto entonces?
Matthias Wandel
1
Si es de "The Mythical Man-Month", es anterior a C por un largo camino. En ese libro, Brooks analizó la idea de que la producción del programador en líneas / día es bastante constante a pesar del lenguaje, y supuso que escribir en un lenguaje más expresivo (menos líneas por unidad funcional) daría como resultado programadores más productivos. Era consciente de que el número variaría ampliamente (su regla general era que los sistemas operativos eran aproximadamente 9 veces más difíciles que los programas de aplicación).
David Thornley
2
Unidades de código discreto, puntos de conectividad (es decir, interacción de unidades), niveles, clases (en OOP) ... hay alrededor de un millón de formas. KLOC no es realmente una buena medida que no sea como una unidad potencial de complejidad. (Por ejemplo, "esto tardó 3 semanas en depurar porque tuve que analizar 4 KLOC para encontrarlo")
John Rudy
2
@David: Sé de dónde es, puedo leer la pregunta y tengo dicho libro en el estante frente a mí en este momento. Curiosamente, la primera fecha publicada también dice que es post C por 3 años. Mi punto, claramente mal hecho, era que es arcaico, y que el concepto mismo es inútil. Ja! Realmente es bíblico.
annakata
Bueno, teníamos muchos puntos de conectividad y cosas así. ¿Pero cómo cuentas eso? ¿Cuándo se convierte algo en un punto de conectividad? ¿Cuándo importa una clase? El tamaño del código compilado es probablemente una mejor métrica dentro de un sistema e idioma dados, pero varía de un sistema a otro.
Matthias Wandel