Mythical man month 10 lignes par jour de développeur - à quel point les grands projets sont-ils proches? [fermé]

129

Tout le monde dit toujours qu'ils peuvent battre les "10 lignes par développeur et par jour" du "Mythical Man Month", et en démarrant un projet, je peux généralement obtenir quelques centaines de lignes par jour.

Mais chez mon ancien employeur, tous les développeurs étaient très pointus, mais c'était un grand projet, plus d'un million de lignes de code, avec des exigences de certification très lourdes, et s'interfaçant avec d'autres projets de plusieurs millions de lignes. À un moment donné, par curiosité, j'ai tracé des lignes de code dans le produit d'expédition de mon groupe (sans compter les outils que nous avons développés), et bien sûr, progressivement, cela s'est élevé à environ 12 lignes ajoutées par développeur et par jour. Sans compter les modifications, le code de test ou le fait que les développeurs ne travaillaient pas quotidiennement sur le code du projet.

Comment vont les autres? Et à quel genre d'exigences faites-vous face (j'imagine que c'est un facteur)?

Matthias Wandel
la source
13
devrait être un wiki communautaire.
Malfist
24
Si "10" était en binaire, ce serait plus proche de la marque.
geofftnz
2
Question très intéressante. :)
Emil H
9
J'ai trouvé cette belle citation «Mesurer la progression de la programmation par lignes de code, c'est comme mesurer la progression de la construction d'un avion en fonction du poids.» dans ce site [lien] ( devtopics.com/101-great-computer-programming-quotes )
mm24
2
@Greg Bacon, Bill the Lizard: J'aimerais vraiment que cette question soit à nouveau ouverte. Cela ne correspond peut-être pas exactement aux règles de SO, mais cela attire certainement les visiteurs. (35875 téléspectateurs jusqu'à présent)
Skippy Fastol

Réponses:

46

Je pense que le nombre de lignes ajoutées dépend fortement de l'état du projet, le taux d'ajout à un nouveau projet sera beaucoup plus élevé que le taux d'un projet de départ.

Le travail est différent entre les deux - dans un grand projet, vous passez généralement la plupart du temps à déterminer les relations entre les parties, et seulement une petite quantité à changer / ajouter. alors que dans un nouveau projet - vous écrivez principalement ... jusqu'à ce qu'il soit assez grand et que le taux diminue.

Liran Orevi
la source
En effet. Au début dudit projet, la publicité nette était beaucoup plus grande.
Matthias Wandel
1
Ainsi, cela soutient la théorie de diviser un grand projet en plusieurs parties indépendantes (peut-être même des projets indépendants) - pour le découplage.
sergzach
108

Sur l'un de mes projets actuels, dans certains modules, je suis fier d'avoir contribué un nombre de lignes négatif à la base de code. Identifier les zones de code qui ont augmenté la complexité inutile et peuvent être simplifiées avec une conception plus propre et plus claire est une compétence utile.

Bien sûr, certains problèmes sont intrinsèquement complexes et nécessitent des solutions complexes, mais sur la plupart des grands projets, les domaines qui ont eu des exigences mal définies ou changeantes ont tendance à avoir des solutions trop complexes avec un plus grand nombre de problèmes par ligne.

Étant donné un problème à résoudre, je préfère de loin la solution qui réduit le nombre de lignes. Bien sûr, au début d'un petit projet, je peux générer beaucoup plus de dix lignes de code par jour, mais j'ai tendance à ne pas penser à la quantité de code que j'ai écrit, seulement à ce qu'il fait et à quel point il le fait. Je n'aurais certainement pas pour objectif de battre dix lignes par jour ou de considérer cela comme un exploit.

Charles Bailey
la source
49
+1 pour les lignes négatives contributives. J'ai déjà travaillé sur un petit projet dans lequel j'ai réduit le nombre de lignes de 15K à 5K tout en ajoutant de nouvelles fonctionnalités (et en diminuant considérablement le nombre de bogues et en augmentant la vitesse).
rmeador le
55

J'aime cette citation:

Si nous voulons compter les lignes de code, nous ne devons pas les considérer comme des «lignes produites» mais comme des «lignes dépensées». - Edsger Dijkstra

Parfois, vous avez contribué davantage en supprimant du code qu'en ajoutant

rlovtang
la source
30

Vous devriez arrêter d'utiliser cette métrique, elle n'a pour la plupart aucun sens. La cohésion, le couplage et la complexité sont des métriques plus importantes que les lignes de code.

Otávio Décio
la source
25
Je ne l'utilisais pas comme mesure de productivité. C'était un exercice privé pour ma propre curiosité.
Matthias Wandel
3
C'est suffisant. Même ainsi, il est difficile de répondre sans une définition plus précise de ce qui doit être considéré comme une ligne de code.
Otávio Décio
1
@Matthias: Je devrais éditer cela dans l'OP si j'étais vous, j'aurais été pour ma part moins ... agressif: P
annakata
28

Comment vont les autres?

Je suis le seul développeur à temps plein de notre entreprise et j'ai écrit 500 000 lignes de code OCaml et F # au cours des 7 dernières années, ce qui équivaut à environ 200 lignes de code par jour. Cependant, la grande majorité de ce code est constituée d'exemples de didacticiels composés de centaines de projets séparés de quelques centaines de lignes chacun. De plus, il y a beaucoup de duplication entre l'OCaml et le F #. Nous ne maintenons aucune base de code interne supérieure à 50 kLOC.

En plus de développer et maintenir notre propre logiciel, j'ai également consulté de nombreux clients dans l'industrie au cours des 7 dernières années. Pour le premier client , j'ai écrit 2000 lignes d'OCaml sur 3 mois, soit 20 lignes de code par jour. Pour le client suivant , quatre d'entre nous ont écrit un compilateur qui a généré des millions de lignes de code C / C ++ / Python / Java / OCaml ainsi qu'une documentation en 6 mois soit 2000 lignes de code par jour et par développeur. Pour un autre client, j'ai remplacé 50kLOC de C ++ par 6kLOC de F # en 6 mois, soit -352 lignes de code par jour. Pour encore un autre client , je réécris 15kLOC d'OCaml en F # qui seront de la même taille donc 0 lignes de code par jour.

Pour notre client actuel , je remplacerai 1 600 000 lignes de code C ++ et Mathematica par ~ 160kLOC de F # en 1 an (en écrivant un compilateur sur mesure) ce qui fera -6 000 lignes de code par jour. Ce sera mon projet le plus réussi à ce jour et permettra à notre client d'économiser des millions de dollars par an en coûts permanents. Je pense que tout le monde devrait viser à écrire -6 000 lignes de code par jour.

JD
la source
1
J'aime ta réponse et je comprends le sarcasme. Par curiosité, pourriez-vous clarifier pourquoi la réécriture du code en F # permettra d'économiser de l'argent pour votre client? Je connaissais OCaml et j'ai écrit un interprète dans cette langue et je n'ai pas touché à la langue depuis quelques années, et maintenant je continue d'entendre parler de F # (donc je suis vraiment curieux à ce sujet)
mm24
7
@ mm24 "pourriez-vous s'il vous plaît clarifier pourquoi la réécriture du code en F # fera économiser de l'argent à votre client". Premièrement, ils ont été vraiment foutus par Wolfram Research qui leur a facturé des contrats de conseil de 1 million de livres sterling pour résoudre les problèmes qu'ils ont délibérément introduits dans les mises à niveau de Mathematica, par exemple en changeant la sémantique de [LongDash]. Deuxièmement, ils parviennent à consolider deux bases de code (Mathematica et C ++) qui sont actuellement maintenues en tandem dans une seule base de code F #, réduisant non seulement les efforts dupliqués, mais aussi de nombreuses interactions avec les mises à jour et les correctifs du produit identifiés lors des tests.
JD
7
@ mm24 Troisièmement, l'automatisation. Ils font beaucoup de choses à la main pour lesquelles il existe des outils .NET préexistants pour automatiser ou .NET facilite la construction de tels outils. Les tâches incluent l'instrumentation du code avec des minuteries pour mesurer les performances (utiliser un profileur), l'écriture manuelle de sérialiseurs (utiliser une bibliothèque), la copie manuelle des noms de valeur-clé (utiliser la réflexion) et les mises à jour critiques des systèmes en direct soumis par l'entreprise sont exécutées par des personnes en IT à la main (rédigez un outil pour que l'entreprise puisse apporter des modifications directement).
JD
7
@ mm24 Quatrièmement, des améliorations de performances massives. F # est d'un ordre de grandeur plus rapide que Mathematica et leur code de preuve de concept en F # est 5 fois plus rapide que leur code C ++ de production. Cela signifie que les tests s'exécutent en quelques secondes plutôt qu'en quelques heures, moment auquel les tests deviennent partie intégrante du développement, améliorant considérablement la productivité.
JD
7
@ mm24 Cinquièmement, des capacités accrues. Ils veulent éliminer le code mort et mesurer la couverture de code de leurs tests, mais ils ne peuvent pas le faire avec les outils sur lesquels ils se trouvent. Le passage à .NET facilite cette tâche (et bien plus!).
JD
13

Sans vraiment vérifier ma copie de "The Mythical Man-Month" (tout le monde qui lit ceci devrait vraiment avoir une copie facilement disponible), il y avait un chapitre dans lequel Brooks a regardé la productivité par des lignes écrites. Le point intéressant, pour lui, n'était pas le nombre réel de lignes écrites par jour, mais le fait qu'il semblait être à peu près le même en assembleur et en PL / I (je pense que c'était le langage de niveau supérieur utilisé).

Brooks n'était pas sur le point de lancer une sorte de chiffre arbitraire de productivité, mais il travaillait à partir de données sur de vrais projets, et pour tout ce dont je me souviens, ils auraient pu être de 12 lignes / jour en moyenne.

Il a souligné que l'on pouvait s'attendre à ce que la productivité varie. Il a dit que les compilateurs étaient trois fois plus durs que les programmes d'application et les systèmes d'exploitation trois fois plus durs que les compilateurs. (Il semble avoir aimé utiliser des multiplicateurs de trois pour séparer les catégories.)

Je ne sais pas s'il a apprécié les différences individuelles entre la productivité des programmeurs (bien que dans un argument d'ordre de grandeur, il ait postulé une différence de facteur sept), mais comme nous le savons, une productivité supérieure n'est pas simplement une question d'écrire davantage code, mais aussi écrire le bon code pour faire le travail.

Il y a aussi la question de l'environnement. Brooks a spéculé un peu sur ce qui rendrait les développeurs plus rapides ou plus lents. Comme beaucoup de gens, il s'est demandé si les modes actuelles (débogage interactif utilisant des systèmes de partage de temps) étaient meilleures que les anciennes méthodes (planification minutieuse pour une prise de vue de deux heures en utilisant toute la machine).

Compte tenu de cela, je ne tiendrais pas compte de tout chiffre de productivité réel qu'il jugeait inutile; la valeur continue du livre réside dans les principes et les leçons plus générales que les gens persistent à ne pas apprendre. (Hé, si tout le monde les avait appris, le livre n'aurait qu'un intérêt historique, un peu comme tous les arguments de Freud selon lesquels il y a quelque chose comme un esprit subconscient.)

David Thornley
la source
3
Une réflexion sur la productivité différente des programmeurs - D'après mon expérience, un programmeur médiocre mettra x fois plus de temps à résoudre un problème donné, mais aussi, malheureusement, écrira x fois plus de code pendant qu'il y est. Ainsi, par les simples "lignes de code par jour", le programmeur médiocre est tout aussi productif.
Matthias Wandel
11

Il est facile d'obtenir quelques centaines de lignes de code par jour. Mais essayez d'obtenir quelques centaines de lignes de code de qualité par jour et ce n'est pas si facile. Ajoutez à cela le débogage et les jours avec peu ou pas de nouvelles lignes par jour et la moyenne diminuera assez rapidement. J'ai passé des semaines à déboguer des problèmes difficiles et la réponse est 1 ou 2 lignes de code.

Jeffrey Hines
la source
En effet. Mais vous rencontrerez ce scénario plus souvent à mesure que le projet s'agrandit. J'ai écrit des programmes parfaits de 10 lignes qui n'avaient aucun bogue. C'est une question d'échelle.
Matthias Wandel
1
Il n'y a pas de programmes qui n'ont pas de bogues.
Daniel Moura
14
Bah! votre grammaire a des bugs ...
RAL
3
@DanielMoura Oh, je ne suis pas d'accord avec ça ... Un programme "bonjour le monde" n'est peut-être pas très utile, mais vous seriez capable de dire en toute confiance qu'il n'a pas de bugs :)
WendiKidd
10

Il vaudrait mieux se rendre compte que parler de lignes de code physiques n'a pas de sens. Le nombre de lignes de code physiques (LoC) dépend tellement du style de codage qu'il peut varier d'un ordre de grandeur d'un développeur à l'autre.

Dans le monde .NET, il existe un moyen pratique de compter la LoC. Point de séquence . Un point de séquence est une unité de débogage, c'est la partie de code surlignée en rouge foncé lors de la mise en place d'un point de rupture. Avec le point de séquence, nous pouvons parler de LoC logique , et cette métrique peut être comparée à travers différents langages .NET. La métrique de code LoC logique est prise en charge par la plupart des outils .NET, y compris la métrique de code VisualStudio, NDepend ou NCover.

Par exemple, voici une méthode à 8 LoC (les points de séquence entre crochets de début et de fin ne sont pas pris en compte):

texte alternatif

La production de LoC doit être comptée sur le long terme. Certains jours, vous cracherez plus de 200 LoC, d'autres jours, vous passerez 8 heures à corriger un bogue en n'ajoutant même pas une seule LoC. Certains jours, vous nettoierez le code mort et supprimerez LoC, certains jours, vous passerez tout votre temps à refactoriser le code existant et à ne pas ajouter de nouvelle LoC au total.

Personnellement, je ne compte une seule LoC dans mon propre score de productivité que lorsque:

  1. Il est couvert par des tests unitaires
  2. il est associé à une sorte de contrat de code (si possible, toutes les LoC ne peuvent évidemment pas être vérifiées par des contrats).

Dans cette condition, mon score personnel au cours des 5 dernières années de codage de l'outil NDepend pour les développeurs .NET est en moyenne de 80 LoC physiques par jour sans sacrifier en aucun cas la qualité du code . Le rythme est soutenu et je ne le vois pas diminuer de si tôt. Dans l'ensemble, NDepend est une base de code C # qui pèse actuellement environ 115K LoC physique

Pour ceux qui détestent compter LoC (j'en ai vu beaucoup dans les commentaires ici), j'atteste qu'une fois correctement calibré, compter LoC est un excellent outil d'estimation . Après avoir codé et mesuré des dizaines de fonctionnalités réalisées dans mon contexte particulier de développement, j'ai atteint le point où je peux estimer précisément la taille de toute fonctionnalité TODO en LoC, et le temps qu'il me faudra pour la livrer en production.

Patrick de l'équipe NDepend
la source
1
Votre message est fondamental et mérite bien plus de votes positifs.
Skippy Fastol
9

Il n'y a pas de solution miracle.

Une seule métrique comme celle-là est inutile en soi.

Par exemple, j'ai ma propre bibliothèque de cours. Actuellement, les statistiques suivantes sont vraies:

Total des lignes: 252.682
Lignes de code: 127.323
Commentaires: 99.538
Lignes vides: 25.821

Supposons que je n'écris aucun commentaire, c'est-à-dire 127,323 lignes de code. Avec votre ratio, cette bibliothèque de code me prendrait environ 10610 jours à écrire. Ça fait 29 ans.

Je n'ai certainement pas passé 29 ans à écrire ce code, car tout est en C #, et C # n'existe pas depuis si longtemps.

Maintenant, vous pouvez affirmer que le code n'est pas si bon, car je dois évidemment dépasser votre métrique de 12 lignes par jour, et oui, je serai d'accord, mais si je dois ramener le calendrier à lorsque la version 1.0 est sortie (et je n'ai pas commencé à la créer avant la sortie de la version 2.0), soit le 13/02/2002, environ 2600 jours, la moyenne est de 48 lignes de code par jour.

Toutes ces lignes de code sont bonnes? Heck non. Mais jusqu'à 12 lignes de code par jour?

Heck non.

Tout dépend.

Vous pouvez avoir un programmeur de premier ordre produisant du code de l'ordre de milliers de lignes par jour, et un programmeur moyen produisant du code de l'ordre de centaines de lignes par jour, et la qualité est la même.

Et oui, il y aura des bugs.

Le total que vous voulez est le solde. Quantité de code modifiée, par rapport au nombre de bogues trouvés, par rapport à la complexité du code, par rapport à la difficulté de corriger ces bogues.

Lasse V. Karlsen
la source
Amen! (plus des espaces pour rencontrer 15 char min)
Nate
Notez que ces statistiques ont été calculées par DPack ( usysware.com/dpack ).
Lasse V. Karlsen
5
Peut-être que la règle des 10 lignes par jour ne s'applique pas à quelque chose de plus petit, comme la bibliothèque de classe que vous avez écrite (je suppose par vous-même). Une grande partie des chiffres de Brooks proviennent de grands projets (OS360 d'IBM), qui est à une échelle fondamentalement différente de celle de votre bibliothèque de classe. Je suppose que l'observation de Brooks est (fréquemment) valable pour les grands projets qui nécessitent de nombreuses personnes et un important réseau de communication humaine, mais invalide pour les petits projets.
J.Polfer
6

Steve McConnell donne une statistique intéressante dans son livre "Software Estimation" (p62 Tableau 5.2) Il distingue les types de projets (Avionique, Business, Telco, etc.) et la taille du projet 10 kLOC, 100 kLOC, 250 kLOC. Les nombres sont donnés pour chaque combinaison dans LOC / StaffMonth. EG Avionic: 200, 50, 40 Systèmes Intranet (internes): 4000, 800, 600 Systèmes embarqués: 300, 70, 60

Ce qui signifie: par exemple. pour le projet Avionic 250-kLOC, il y en a 40 (LOC / mois) / 22 (jours / mois) == <2LOC / jour!

Valentin Heinitz
la source
1
250 lignes de code Terra? Quel est le problème avec KLoC?
fadedbee
4

Je pense que cela vient des jours de développement en cascade , où la phase de développement réelle d'un projet pourrait être aussi peu que 20-30% du temps total du projet. Prenez le total des lignes de code et divisez par la durée totale du projet et vous obtiendrez environ 10 lignes / jour. Divisez simplement par la période de codage, et vous vous rapprocherez de ce que les gens citent.

pgs
la source
3

Notre base de code est d'environ 2,2 MLoC pour environ 150 années-homme d'effort. Cela fait environ 75 lignes de c ++ ou c # par développeur et par jour, sur toute la durée de vie du projet.

Steve Cooper
la source
2

Je pense que la taille du projet et le nombre de développeurs impliqués sont des facteurs importants à cet égard. Je suis bien au-dessus de cela au cours de ma carrière, mais j'ai travaillé seul tout ce temps donc il n'y a aucune perte à travailler avec d'autres programmeurs.

Loren Pechtel
la source
1
Les petits projets aident, tout comme la solitaire. J'ai d'abord été choqué de voir que nous avons atteint ce personnage historique, au moins progressivement. Au début dudit projet, ma productivité était au moins 10 fois supérieure.
Matthias Wandel
2

Bonne planification, bonne conception et bons programmeurs. Vous obtenez tout cela ensemble et vous ne passerez pas 30 minutes à écrire une ligne. Oui, tous les projets exigent que vous vous arrêtiez et planifiiez, réfléchissiez, discutiez, testiez et débogiez mais à deux lignes par jour, chaque entreprise aurait besoin d'une armée pour faire fonctionner Tetris ...

En bout de ligne, si vous travailliez pour moi à raison de 2 lignes par heure, vous feriez mieux de m'acheter beaucoup de cafés et de me masser les pieds pour ne pas vous faire virer.

lcabral
la source
1

On soupçonne que ce petit bonbon éternel du manager a été inventé alors que tout était une application système écrite en C, car à défaut, le nombre magique varierait par ordre de grandeur en fonction de la langue, de l'échelle et de la nature de l'application. Et puis vous devez écarter les commentaires et les attributs. Et finalement, qui se soucie du nombre de lignes de code écrites? Êtes-vous censé avoir terminé lorsque vous avez atteint 10 000 lignes? 100K? Tellement arbitraire.

C'est inutile.

Annakata
la source
Comment décrivez-vous alors la taille d'un projet?
Matthias Wandel
1
Si c'est de "The Mythical Man-Month", il est antérieur à C de loin. Dans ce livre, Brooks a examiné l'idée que la sortie du programmeur en lignes / jour est assez constante malgré le langage, et a supposé qu'écrire dans un langage plus expressif (moins de lignes par unité de fonctionnalité) entraînerait des programmeurs plus productifs. Il était conscient que le nombre varierait considérablement (sa règle de base était que les systèmes d'exploitation étaient environ 9 fois plus difficiles que les programmes d'application).
David Thornley
2
Unités de code discrètes, des points de connectivité (c'est-à-dire une interaction d'unité), des niveaux, des classes (en POO) ... il y a environ un million de façons. Les KLOC ne sont pas vraiment une bonne mesure autre que comme unité potentielle de complexité. (EG, "cela a pris 3 semaines pour déboguer car j'ai dû parcourir 4 KLOC pour le trouver!")
John Rudy
2
@David: Je sais d'où ça vient, je peux lire la question et j'ai dit livre devant sur l'étagère devant moi en ce moment. Fait intéressant, la première date publiée indique également que c'est après 3 ans. Mon argument - clairement mal fait - était que c'est archaïque, et en outre que le concept même est inutile. Hah! C'est vraiment biblique.
annakata
Eh bien, nous avions beaucoup de points de connectivité et autres. Mais comment les comptez-vous? Quand quelque chose devient-il un point de connectivité? Quand un cours est-il important? La taille du code compilé est probablement une meilleure métrique dans un système et une langue donnés, mais elle varie d'un système à l'autre.
Matthias Wandel