Wieviel LOC pro Tag?
-
Ach Xin du Schelm.
Gemeint ist natürlich dass mehr LOC bei gleichem Feature-Set nicht unbedingt ein Indikator für "gut" ist. Genau so wie bei Flugzeugen mehr Gewicht bei gleichem Feature-Set nicht unbedingt gut ist.
(Und mit Feature-Set meine ich natürlich alles, also auch Dinge wie "wie Sicher ist das Ding" bei Flugzeugen oder "wie viel Bugs hat das Ding" bei Software.)Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
-
Xin schrieb:
Shade Of Mine schrieb:
LOC ist eine sinnlos dumme Metrik.
Hmm... jain. Sie ist dumm um die Produktivität zu messen, aber ein Indiz um Komplexität und Aufwand einer Software zu messen.
Nein. LOC ist sinnlos und dumm. Nichts anderes. In Pascal habe ich mehr LOCs als in C. In Bash habe ich mehr LOCs als in Python.
Je nach Library gehen die LOCs rauf und runter. Verwende ich zB das Facebook SDK direkt, habe ich massig LOCs für simple Aufgaben, verwende ich die korrekt gekapselten Bundles, habe ich kaum LOCs.
LOCs sagen nichts aus.
LOC ergibt keinen Sinn, wenn man nur 3 Bildschirmseiten oder einen Algorithmus misst, aber als Maß für eine Software durchaus. Gute und schlechte Programmierer gleichen sich bezogen auf die LOC ja aus, es kommt ein Maß für einen Norm-Programmierer raus.
Nun kann man abschätzen, wieviel Normprogrammierer-Jahre man für ein Problem braucht, sofern man das Problem in der Größe ungefähr einordnen kann.Unterschiedliche Aufgaben produzieren unterschiedliche LOCs. Wir haben zB einen Guru bei uns, der kaum LOCs produziert, aber seine Zeilen sind eben die kompliziertesten.
Eine Zeile Code hat komplett unterschiedliche Komplexitäten. Man kann die nicht miteinander vergleichen.
Shade Of Mine schrieb:
Alleine der Boilerplate für diese Projekte sind viele hundert Zeilen.
Boilerplate zählt nicht.
Und was genau ist Boilerplate Code denn?
Da gibt es keine Definition. Ist eine Schleife Boilerplate? Was ist mit einer Klassendefinition?Du kannst hier natürlich wieder frei erfundene Metriken anwenden ob eine Zeile Code nun unter Boilerplate fällt oder nicht - aber das ist objektiv nicht möglich.
LOC ist eine Dumme Metrik. Nichts aber auch garnichts sagt sie aus. Nicht mal den Hauch eines Indikators. Und wie bereits gesagt, Jemand der LOCs für irgendetwas anderes als eine lustige Zahl ansieht, den kann ich nicht ernst nehmen. Sorry. Ich meine wir duellieren uns in der Arbeit auch mit wer die meisten Commits und die meisten LOCs bei einem Projekt gemacht hat, aber wir machen das aus Spaß, weil es lustig ist Zahlen zu vergleichen. Aber derjenige mit den wenigstens LOCs kann dennoch die meiste Arbeit gemacht haben und umgekehrt. LOC und Produktivität steht in keinem Verhältnis zueinander. LOC ist eine lustige Zahl die Spaß macht um zu Zeigen wer den größten e-penis hat. Aber das war es auch schon.
-
Gibt es überhaupt kluge Metriken? Meiner aus leidvoller Erfahrung gespeisten Meinung nach sind Metriken untaugliche Krücken. Ich finde es schon fast menschenverachtend, kreative Arbeit anhand irgendwelcher leicht zu messenden Zahlen zu beurteilen. Nach welcher Metrik ist die Mona Lisa zu beurteilen? Größe eher klein, Anzahl der Farben, Krümmungsradius der Mundwinkel? Es geht nichts über das Lesen von Code, und die einzige sinnvolle "Metrik" ist die Anzahl der WTFs pro Minute dabei.
-
hustbaer schrieb:
Ach Xin du Schelm.
Gemeint ist natürlich dass mehr LOC bei gleichem Feature-Set nicht unbedingt ein Indikator für "gut" ist. Genau so wie bei Flugzeugen mehr Gewicht bei gleichem Feature-Set nicht unbedingt gut ist.
(Und mit Feature-Set meine ich natürlich alles, also auch Dinge wie "wie Sicher ist das Ding" bei Flugzeugen oder "wie viel Bugs hat das Ding" bei Software.)Warum sollte das Feature Set gleich bleiben? Wenn alles gleich ist, wäre ja kein Maßstab erforderlich, um etwas zu messen.
Wichtig wäre bestenfalls die Sprache gleich zu lassen, da eine spezialisierte Sprache in ihrem Umfeld logischerweise kürzer ist als eine nicht spezialisierte Sprache.hustbaer schrieb:
Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
Bei gleichen Featureset... wieso ist dann das Programm mit den wenigsten LOCs nicht das beste?
Per Batchfile braucht 1 Zeile um Windows 3.11 zu programmieren. Also ich habe Windows nie mit 3 Millionen Zeilen Code geschrieben, sondern immer DOS benutzt, wenn ich ein Windows brauchte.
Wundert mich, dass Microsoft nicht gleich in DOS programmiert hat, das ist doch viel effizienter. Irgendwo muss es da doch noch einen Haken geben. Ah... die Sache mit der spezialisierten Sprache...
-
Xin schrieb:
hustbaer schrieb:
Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
Bei gleichen Featureset... wieso ist dann das Programm mit den wenigsten LOCs nicht das beste?
Um das kürzest mögliche Programm zu machen, musst du viele Umformungen machen, die zu sehr schlechter Lesbarkeit führen. z.B. Hilfsvariablen für Zwischenergebnisse entfernen oder Funktionen die nur an genau einer Stelle aufgerufen werden dort inlinen. Das ist schonmal schlecht, weil es sehr nützliche Informationen entfernt, nämlich die Namen dieser Hilfsvariablen bzw. Funktionen.
Und dann geht's erst mit den wirklich bescheuerten Dingen los
-
Bitte ein Bit schrieb:
Shade Of Mine schrieb:
LOC ist eine sinnlos dumme Metrik.
Das Problem ist auch, dass bei einer Beurteilung nach LOC die Entwicklung sich anpasst und es schnell zu einem Copy-Paste-Modify Vorgehensmodell kommt. Und das ist ja bekanntlich nicht sonderlich gut und gleicht einem Schneeballsystem. Solange das Ganze noch junfräulich ist, sieht alles gut aus. Aber die letzten Entwickler im System haben die Arschkarte gezogen.
Der erste, der an die Kundenzufriedenheit denkt, der erste, der möchte, daß sein Unternehmen nicht mit Karacho an die Wand fährt, der hat satt die wenigsten LOC und fliegt.
*helau*
-
Xin schrieb:
hustbaer schrieb:
Ach Xin du Schelm.
Gemeint ist natürlich dass mehr LOC bei gleichem Feature-Set nicht unbedingt ein Indikator für "gut" ist. Genau so wie bei Flugzeugen mehr Gewicht bei gleichem Feature-Set nicht unbedingt gut ist.
(Und mit Feature-Set meine ich natürlich alles, also auch Dinge wie "wie Sicher ist das Ding" bei Flugzeugen oder "wie viel Bugs hat das Ding" bei Software.)Warum sollte das Feature Set gleich bleiben?
Weil ich mir ziemlich sicher bin dass das so gemeint ist.
Xin schrieb:
Wenn alles gleich ist, wäre ja kein Maßstab erforderlich, um etwas zu messen.
Jetzt hast du mich verloren.
Es ist ja nicht alles gleich. Beide Programme können das selbe, aber eins ist kürzer, und daher (bis auf die von mir bereits erwähnten Extremfälle) besser.
Das ist der Unterschied.-----
Ich schätze mal der Gates hat das inetwa so gemeint: Du hast nen Auftrag ein Programm mit Feature-Set X zu bauen. Und du misst den "Progress" Anhand der LOC die deine Programmierer raushauen.
Und das ist vergleichbar mit: du hast nen Auftrag ein Flugzeug mit Feature-Set X zu bauen. Und misst den "Progress" den deine einzelnen Ingenieure machen daran wie schwer das Zeugs das sie für's Flugzeug entwerfen ist.
"Progress" ist hier nicht als Fortschritt im Sinn von "fortschrittlich" zu verstehen, sondern wie beim Progress-Bar. Also wie sehr ein Programmierer/Ingenieure das Projekt vorantreibt in Richtung Fertigstellung.
Und das macht halt beides keinen Sinn.ps:
Bzw. auch wenn es um Fortschritt im Sinn von "fortschrittlich" geht macht es keinen Sinn. Wenn du die selbe Erweiterung (=> Fortschritt) von 10 Programmierern implementieren lässt, dann bekommst du 10 unterschiedlich lange Programme. Dabei wird so-gut-wie nie das längste das beste sein.
Insgesamt hat du zwar fast immer einen LOC-Zuwachs, aber einen unterschiedlich grossen.
-
Bashar schrieb:
Gibt es überhaupt kluge Metriken?
Ich bin sicher, Du willst auf die Postinganzahl raus.
(ps: +=1)
-
hustbaer schrieb:
Um das kürzest mögliche Programm zu machen, musst du viele Umformungen machen, die zu sehr schlechter Lesbarkeit führen. z.B. Hilfsvariablen für Zwischenergebnisse entfernen oder Funktionen die nur an genau einer Stelle aufgerufen werden dort inlinen. Das ist schonmal schlecht, weil es sehr nützliche Informationen entfernt, nämlich die Namen dieser Hilfsvariablen bzw. Funktionen.
Und dann geht's erst mit den wirklich bescheuerten Dingen los
Jaaa…
Also wenn wir beide und messen, wer am wenigsten LOC für das selbe Problem verwendet, dann wirds ein Hacker-Contest. Das ist Quatsch.
Also ich hab da so meinen Stiefel wie ich gerne rumproggere und mache halt so Sachen, wie daß ich innere Schleifen(mit eigenständiger Bedeutung) sauoft auslagere, was mich dann {} mal nicht gezählt 2 LOC kostet. Und Monsterklassen mag ich nicht, was mich dann pro Fragmentklasse(mit eigenständiger Bedeutung) 10 LOC kostet. Und so rotze ich den Code coll mit unnötigen Zeilen.
Macht aber nix, das ist so ungefähr, wie die Kosten, die man zahlt, um eine Liste in ein Array zu stopfen, um sie zu sortieren.Ich bin dicht an den minimalen LOC, würde ich denken. Ein Faktor 2 kümmert keinen.
-
Ich schrüb doch schon:
hustbaer schrieb:
Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
War das nicht klar genug?
-
volkard schrieb:
Bashar schrieb:
Gibt es überhaupt kluge Metriken?
Ich bin sicher, Du willst auf die Postinganzahl raus.
(ps: +=1)Du bist ja gerissen. Wie soll ich das denn bestreiten, ohne es gleichzeitig zu bestätigen? Indem ich mich auslogge :p
-
hustbaer schrieb:
Ich schrüb doch schon:
hustbaer schrieb:
Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
War das nicht klar genug?
Würde ich so nicht unterschreiben - da du durch gutes, flexibles Design oft viel Code generierst die zwar das direkte Problem nicht lösen aber Erweiterungen und Anpassungen an den Code erleichtern.
Wenn wir jetzt mal von etwas komplexeren ausgehen als Berechne fact N. Sondern zB sagen: implementiere einen HTTP Server.
Dann denke ich ist kürzerer Code kein indikativ für guten Code.
-
hustbaer schrieb:
Ich schrüb doch schon:
hustbaer schrieb:
Natürlich ist auch das Programm mit den wenigsten LOC nicht das beste. Das Optimum liegt irgendwo mitten drin - aber erfahrungsgemäss näher am Minimum als am Durchschnitt.
War das nicht klar genug?
Ich bestätigte Dich. Ich wiederholte Dich in anderen Worten, um es
anderenmir klar zu machen.Ok, Shade Of Mine hat eine Insel mit Faktor 4 gefunden. Aber damit hat sichs. Deppencode hat Faktor 100 mehr und den sieht man oft. Hab mal eine handgeschriebene C-Datei mit 400k gesehen und der Entwickler hat sich nicht geschämt. Gehts noch?
-
@volkard
Ah
Dachte es wäre als Korrektur gemeint.@Shade Of Mine
Wenn du von expliziten Plugin-Schnittstellen sprichst, dann könnte man fast schon wieder sagen dass die beiden Programme nicht mehr das selbe Feature-Set haben.
Wenn du nur "Vorbereitung auf eventuelle Erweiterungen" meinst, dann ... ui. Also da ist meine Erfahrung: lieber nicht machen bevor man weiss was man braucht. Weil man erfahrungsgemäss immer für das vorbereitet was man dann nie braucht.Ich hab' nix gegen gutes Softwaredesign. Single-Responsibility-Principle, Dependency-Injection (basic, also ohne Framework/Container) etc. führen auch zu viel Boilerplate-Code, das ist schon alles OK.
Aber ansonsten lieber YAGNI/KISS. Wenn man dann erweitern muss, dann kann man ja refactoren. Wenn man darin Übung hat geht das auch relativ flott. Und wenn man keine Übung darin hat, dann schreibt man schlechten Code. Weil keine Übung bedeutet dass man es selten macht, und wenn man es selten macht räumt keiner den Mist wieder zusammen den so-gut-wie jeder so-gut-wie immer beim 1. oder 2. Ansatz fabriziert.
-
hustbaer schrieb:
@volkard
Ah
Dachte es wäre als Korrektur gemeint.Ich kriege es einfach nicht hin, mich klar auszudrücken, sorry,
Andauernd meinen alle Leute, ich hätte was ironisch gemeint. Das ist nicht der Fall. Ich meine nie was ironisch.
Merkt Euch das mal bitte.
-
hustbaer schrieb:
Ich hab' nix gegen gutes Softwaredesign. Single-Responsibility-Principle, Dependency-Injection (basic, also ohne Framework/Container) etc. führen auch zu viel Boilerplate-Code, das ist schon alles OK.
Aber ansonsten lieber YAGNI/KISS. Wenn man dann erweitern muss, dann kann man ja refactoren. Wenn man darin Übung hat geht das auch relativ flott. Und wenn man keine Übung darin hat, dann schreibt man schlechten Code. Weil keine Übung bedeutet dass man es selten macht, und wenn man es selten macht räumt keiner den Mist wieder zusammen den so-gut-wie jeder so-gut-wie immer beim 1. oder 2. Ansatz fabriziert.
Damit machst du es dir viel zu einfach.
Du brauchst keine komplexen Plugin Schnittstellen definieren um den Code leicht anpassbar zu machen.Klar kannst du jetzt mit bla bla kommen wie "dann sind die Programme nicht mehr 100% gleich" aber sobald du komplexe Probleme löst, hast du komplexe Lösungen.
Ich finde es einfach viel zu simpel das wieder alles auf die Codelänge zu reduzieren. Code länge und Qualität stehen in keiner Relation zu einander.
Man kann Sachen sehr ausführlich machen und sehr abgekürzt. Keines von Beiden ist von vornherein besser. Oft ist das auch eine Frage wie sicher sich das Team in einer Domaine bewegt. Denn das Zeilen schreiben ist beim Programmieren immer der trivialste und schnellste Part.
Das wird scheinbar gerne vergessen. Das tippen, das produzieren des Codes selber, ist eigentlich vernachlässigbar wenig beim Programmieren. Deshalb kann eine Metrik die du auf diese Zeilen legst immer nur einen verschwindend geringen Teil der Arbeit messen.
-
Shade Of Mine schrieb:
Klar kannst du jetzt mit bla bla kommen wie "dann sind die Programme nicht mehr 100% gleich" aber sobald du komplexe Probleme löst, hast du komplexe Lösungen.
Ich bin mir nicht 100% sicher was du damit meinst.
Aber falls ich dich richtig verstehe...Für mich ist es natürlich ein signifikanter Unterschied, ob ein Programm mit z.B. der Anforderung beauftragt/konzipiert wurde, dass es ohne Schnittstellenänderungen erweiterbar sein muss -- oder eben nicht. *
Bei kleinen bis mittelgrossen Projekten die nicht vom Kunden "customized" werden, die keine SDKs/Frameworks/APIs sind gegen die Kunden eigene Software entwickeln etc., sondern einfach nur ganz normale Programme sind die halt irgendwas tun, macht es nach meiner Erfahrung keinen Sinn all zu viel vorauszuplanen.
Das heisst nicht dass man grundlegende Prinzipien des Software-Design misachtet, aber es heisst dass man nicht signifikant viel Code schreibt für etwas was man nicht braucht.Das führt aber dazu, dass man bei Änderungen - wie schon erwähnt - öfters mal refactoren muss. Was dann u.U. einige Schnittstellen "bricht". Wenn das Programm allerdings "am Stück" bearbeitet werden kann, dann macht das nix, weil im Zuge des Refactoring einfach alle Stellen die von diesen Schnittstellen abhängig sind angepasst werden.
Das ist aber natürlich ein KO für bestimmte Arten von Software - einige Beispiele hab' ich ja schon erwähnt.
Den Hinweis auf die Signifikanz dieses Unterschied als "blabla" abzutun halte ich nicht für sinnvoll.
Deswegen hab' ich auch "Feature-Set" und nicht "Funktion" geschrieben. (Ein bessere Begriff ist mir nicht eingefallen. Falls du einen besseren weisst lass es mich wissen.)
* Nur ein Beispiel - gibt viele Möglichkeiten. Genau so könnte es sein dass die Schnittstellenänderungen grundsätzlich egal ist, aber die Zeilenanzahl der Änderung möglichst klein bleiben muss. Kann für Genehmigungen von Folgeversionen wichtig sein. Oder dass es mit wenig RAM auskommen muss, mit wenig CPU-Power, ...
Bei manchen Projekten ist es auch wichtig dass das Programm branch/merge/cherrypicking-freundlich ist. Was auch wieder erfordert dass man sich vorab viel Gedanken macht und viel Zeit investiert, um das Design zu finden mit dem man am längsten ohne gröbere Refactorings auskommen wird.
-
Shade Of Mine schrieb:
Wenn wir jetzt mal von etwas komplexeren ausgehen als Berechne fact N. Sondern zB sagen: implementiere einen HTTP Server.
Dann denke ich ist kürzerer Code kein indikativ für guten Code.
Kannst du mal 1-2 konkrete Beispiele geben lang gut vs. kurz schlecht?
Es gibt viele Dinge wo es gut ist etwas längeren Code zu haben, und wo "etwas" u.U. auch 2x oder 3x so viel sein kann.
Nur kann ich ja nicht wissen was du meinst, also kann ich auch nicht sinnvoll darauf antworten.
-
volkard schrieb:
Ich meine nie was ironisch.
Und das ist auch gut so. Geht mir ähnlich. Alleine schon deshalb weil es Viele nicht kapieren.
-
Shade Of Mine schrieb:
Ich finde es einfach viel zu simpel das wieder alles auf die Codelänge zu reduzieren. Code länge und Qualität stehen in keiner Relation zu einander.
Man kann Sachen sehr ausführlich machen und sehr abgekürzt. Keines von Beiden ist von vornherein besser. Oft ist das auch eine Frage wie sicher sich das Team in einer Domaine bewegt.
Wie gut sich jemand in einer Domäne auskennt ist elementar, um Code zu produzieren. Eine dieser Domänen ist die Programmier-Sprache. Ich sage dann davon, dass man eine Programmiersprache sprechen kann, ob man Rhethorik der Sprache kennt oder gar ein Dichter ist.
Mit Mehrfachvererbung und generischer Programmierung kann man häufig LOC sparen. Qualitative Entwickler sind also an den LOC durchaus zu erkennen: Sie produzieren weniger LOC für das gleiche Feature. Damit produzieren sie hoffentlich mehr Features/LOC. Hier muss man eher einen Ausgleichsfaktor einbringen, um sie vergleichbar zu halten.
LOC sind nie ein Maß, um einen einzelnen zu bewerten. Sie sind nur ein Maß, um alle Entwickler an einem Projekt bzw. eben das Projekt zu bemessen. Dann sind 1000, 10000 oder 100k LOC je nach Projektgröße mehr oder weniger aber im Unschärfebereich der Schätzung.
Die Information, dass ein Projekt um die 1'000'000 +/- 100'000 LOC besitzt ist daher durchaus sinnvoll und wenn der Projektmanager abschätzen kann, ob seine Entwickler eher "Normalentwickler" sind oder eher schneller, bzw. langsamer.