Wieviel LOC pro Tag?
-
SeppJ schrieb:
Xin schrieb:
Das würde ich so nicht sagen. Ich mache auch seit 10 Jahren regelmäßig alle 2 Jahre folgenden Anfänger-Fehler:
if( cond1 ) if( cond2 ) OneAndTwo(); else NotOne();
Du glaubst nicht, wie viele Fehler dieser Art ich schon direkt während des Fehlermachens gefunden habe, einfach weil mein Editor automatisch den Code einrückt. So ein Gerät sollte Pflicht sein.
Das ist die eine Perspektive. Ich arbeite mit Visual Studio, CodeBlocks, CodeLite, Kate und TextWrangler. Letztere sind eigentlich eher nur Editoren.
Die Programmierung mit einfachen Editoren hilft mir Methodennamen zu optimieren. Nachschlagen kostet Zeit; um Zeit zu sparen, achte ich darauf, Methodennamen zu vereinheitlichen. Wenn ich nachschlagen muss, ist der Methodenname fraglich.Keiner formatiert meinen Code oder rückt ihn ein. Das tat Eclipse. Ich habe es gehasst, wenn ich meinen Code optisch ausgerichtet habe, so dass Ähnlichkeiten sofort ins Auge fielen und der Code dann automatisch so angepasst wurde, dass man den Algorithmus aus der Formatierung nicht mehr lesen konnte.
Ich verzichte auf Diskussionen mit meinem Computer, wann mein Code richtig formatiert ist. Ich hasse es, wenn mein Computer besser wissen will, was ich tun will. Ich hasse auch Autokorrektur, weil es aus einem Tippfehler ein komplett anderes Wort macht - ich also noch mehr korrigieren muss. Computer sollten nicht intelligenter tun, als sie sind.
Den beschriebenen Fehler mache ich zuverlässig alle 2 Jahre mal, er kostet mich in der Regel kaum mehr als 5 Minuten, weil ich ihn sofort sehe, wenn ich nach Fehlern suche und den fraglichen Code überfliege. Dieses fehlerhafte Konstrukt programmiere ich nicht, sondern es entsteht, wenn ich einen solchen Block ändere und dabei abgelenkt werde.
SeppJ schrieb:
Auch beliebt und durch gutes Arbeitsgerät direkt vermeidbar sind einfache Tippfehler. Semikolon vergessen, Klammern passen nicht, und so weiter.
Fehler, die man nicht kompilieren kann sind ja Kleinkram.
Darum liebe ich Const-Correctness: Man kann es nicht kompilieren, wenn man nicht sauber arbeitet.SeppJ schrieb:
Und ein Kapitel über gängige Compiler (oder Compiler/IDE-Gespanne) und wie man Warnungen aktiviert.
Das entspricht so auch meiner Erfahrung und deswegen gibt's das bei uns auch.
SeppJ schrieb:
Ich glaube kaum etwas anderes hat meine Produktivität so sehr gesteigert, wie ein guter Editor und Compilerwarnungen.
Ich habe auf dem SAS/C mit C angefangen. Der Compiler hatte so gute Fehlermeldungen, dass ich mich oft genug gefragt habe, warum er den Fehler nicht gleich selbst behebt.
Gute Fehlermeldungen sind also möglich.
Viele lernen mit Visual Studio. Visual C++ liefert gelegentlich Fehlermeldungen, die ich selbst nach der Lektüre der Hilfsseiten von Microsoft nicht verstehe und die Fehlermeldung auch nicht nachvollziehen kann, wenn ich den Fehler gefunden habe.SeppJ schrieb:
Denn auch wenn man als erfahrener Programmierer all diese Fehler kennt und bei der Fehlersuche sofort sieht, so macht man sie doch trotzdem immer mal wieder versehentlich. Es bringt so viel, wenn die Notwendigkeit, diese Arten von Fehlern zu suchen, gänzlich entfällt.
Ich klicke meistens nur auf die Zeile und gucke mir die Codestelle an. Das geht schneller, als die Fehlermeldung zu lesen. In 95% der Fälle reicht mir das.
-
SeppJ schrieb:
Klammern passen nicht, und so weiter.
Deshalb hab ich (nicht nur) heute in einem anderen thread gesagt: "Formatier das so, daß man es auch lesen und verstehen kann". So oder so ähnlich.
Zurück zun Thema.
10 - 30 LOC/Tag
Das wären etwa zwischen 1 und 4 Zeilen/StdWenn ich hier nicht nur rundrum verarscht werde dann fange ich wieder an zu arbeiten.
Da schaffe ich ja sogar in ASM manchmal 2 Zeilen/Std.mov eax, ecx
und jetzt ne Std. frei?
-
EOP schrieb:
Da schaffe ich ja sogar in ASM manchmal 2 Zeilen/Std.
mov eax, ecx
und jetzt ne Std. frei?
Es gibt eben solche Zeilen und es gibt andere Zeilen. In Assembler sind eben 80-90% des Codes Teile, die irgendwelche Konzepte umsetzen, die in anderen Sprachen nicht einmal eine einzelne Zeile wert sind. volkard meint sicherlich nicht 30 Zeilen Boilerplatecode, sondern 5-10 Codestücke, die insgesamt wirklich was richtig schwieriges umsetzen und dann in typischen Sprachen eben jeweils 3-6 Zeilen lang sind. Oder in Assembler dann eben 10-20 Zeilen, dann muss man eben mehr LOC/h schaffen. Deswegen ist das ja auch eine dumme Metrik (neben anderen Gründen). Problemlösungen pro Zeit wäre besser.
-
LOC ist eine sinnlos dumme Metrik.
Es hängt einfach davon ab was dein Job ist. Ich warte zB eine alte Software - da sind Änderungen 70% der Zeit den Code verstehen und die passende Stelle für die Änderung suchen, dann die Zeile ausbessern und 30% Testen ob noch alles läuft.
Da schreibe ich vielleicht 100 Zeilen im Jahr (neue Features die alle heiligen Zeiten mal kommen ausgenommen).
In der Arbeit entwicklen wir viele Webseiten und WebApps für Kunden. Alleine der Boilerplate für diese Projekte sind viele hundert Zeilen. Da schreiben die Entwickler sicher mehrere Tausend Zeilen in der Woche wenn die Entwicklung startet und es wird graduell weniger.
Ein neues Feature für eine Software sind sehr viele Zeilen. Einen Bug fixen sind idR keine neuen Zeilen und Refactoring entfernt sogar Zeilen.
Deshalb weiß man, sobald Jemand von LOCs zu reden anfängt was man von ihm halten muss.
-
Xin schrieb:
Ich mache meine Bugs aber lieber selbst. Darin bin ich aber schlecht, wenn ich im Jahr zwei Bugs bekomme, die ich selbst verschuldet habe, ist das viel.
Den Satz verstehe ich nicht ganz. Das erscheint mir zu wenig.
Was verstehst du unter einem Fehler?
Es gibt ja diverse Arten von Fehlern. Von einem Designfehler angefangen zu einfachen Abstürzen, falsche Berechnungen, Portabilitätsfehlern, Compiler Fehler, inkonsistentem Verhalten oder auch algorithmische Fehler,...
// WinAPI Beispiel zu Portabilitätsfehler: // Ich öffne einen "Datei speichern..." Dialog ohne die Bedeutung von WINVER verstanden zu haben. OPENFILENAMEW ofn = {0}; ofn.lStructSize = 54; // Hinter lStructSize steckt ein wenig mehr als nur die Größe des Structs. #ifndef OFN_EXPLORER #define OFN_EXPLORER 0x00080000 // Auch ein Klassiker der WinAPI Programmierung #endif ofn.Flags = OFN_OFN_EXPLORER; GetSaveFileName(&ofn) // Kleiner Flüchtigskeitsfehler std::string FileName = "C:\Benutzer\Kaiser Wilhelm\Info.doc"; std::string CmdLine = std::string("wordpad.exe") + FileName; system(CmdLine.c_str());
Das testen ist bei mir zu einer Phase geworden. D.h. ich teste nicht in dem ich hingehe und es im Debugger teste. Ich nutze manuelle oder automatische Testreihen, nutze Blackbox Tests, teste Annahmen mit Hilfe von Assertions,Test auf unterschiedlichen Plattformen, schaue wie sich das Program verhält wenn die Annahmen über die Eingaben nicht erfüllt sind,...
-
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.
-
EOP schrieb:
10 - 30 LOC/Tag
Das wären etwa zwischen 1 und 4 Zeilen/StdWenn ich hier nicht nur rundrum verarscht werde dann fange ich wieder an zu arbeiten.
Meine "Lieblingsprogrammiersprache"...
public class HelloWorld { // 2 Fehlermöglichkeiten: public vergessen, Hello World falsch geschrieben public static void main(String[ ] args) // public, static, main, Argumente, kann alles falsch sein, tut aber nix. { // Ausgabe Hello World! System.out.println("Hello World!"); // <- eine Zeile Code. } }
So ein Hello World ist wie ein Roland Emerich-Film: Hier gibt's viel zu gucken, aber unglaublich wenig Handlung.
Der Code deckt sich mit dem Hello World aus Python.
print "Hello World\n"
Beides produzieren die gleiche Ausgabe, beide 1 LOC, aber Python hat dafür keinen Boilerplate.
EOP schrieb:
Da schaffe ich ja sogar in ASM manchmal 2 Zeilen/Std.
mov eax, ecx
und jetzt ne Std. frei?
hehehe, ja, wenn Du garantieren kannst, dass sie zwei Zeilen auf Dauer korrekt sind.
Dafür brauchst Du vielleicht einen Test. Und wenn Du dann nach einer Stunde weiterschreibst und feststellst, dass eine von den beiden Zeilen doch nicht zum Algorithmus passt, dann musst du die Zeile ändern und hast in der nächsten Stunde schon 50% mehr Arbeit zu leisten.
Zwischendurch Recherchieren, was Du eigentlich entwickeln sollst, Tests entwickeln, das über 10 Jahre warten - kommen am Schluss 10 Zeilen raus.
Es sind eben nicht die hunderte Zeilen, die sich mancher vorstellt.Die Chance in Assembler aufwendig zu debuggende Fehler zu machen ist gegeben. Ich habe auch Programme mit GUI in Assembler gemacht, ich bin mir da wirklich für nichts zu schade. Aber ich benutzte viele Macros. Gutes Assembler ist nicht wirklich weit von C entfernt. Aber wenn Du einen echten Bug hast, dann wirst Du tierisch ausgebremst und das reduziert Deine Ausbeute. Und so stehst Du dann am Ende doch mit relativ wenig Zeilen da. Die Macros müssen ja auch erstmal fehlerfrei sein. Und ein if oder while oder strlen in C ist relativ gut abgetestet, wie auch ein a = b+1; einfach praktischer ist Expressions in ASM-Manier runterzubeten.
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. 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.Shade Of Mine schrieb:
Da schreibe ich vielleicht 100 Zeilen im Jahr (neue Features die alle heiligen Zeiten mal kommen ausgenommen).
Ich habe das mal mit meinem privaten Projekt durchgerechnet. Ich bin unglaublich produktiv, obwohl es ja nur in der Freizeit stattfindet.
Mit Deiner beruflichen Produktivität gleicht sich das ja wieder ausIch bin im Beruf äußerst produktiv. Ein von mir erzeugtes .cpp hat 43000 Zeilen, der dazugehörige Header mit inline-Funktionalität 57000. Macht 100000 Lines, abzüglich Deklaratives. Sagen wir 50000 LOC. Alleine die 2 Dateien ergeben dann 200LOC/d. Und die laufen sehr zuverlässig.
Wenn man jetzt noch verschweigt, dass die beiden Dateien von einem Python-Skript mit 1300 Zeilen (5,2 LOC/d) erzeugt werden, klingt das richtig gut.
Verschweigt man das nicht, bleibt mir vorrangig die Erweiterungen zu den generierten Klassen mit 1800 Zeilen (7,2 LOC) zusätzlich zu besagtem Python-Skript, womit ich auf 12,4 LOC/d komme. Das Debuggen bringt ja in der Regel keine neuen Zeilen.Ich gleiche meine privaten LOC/d beruflich also auch wieder aus. Ganz einfach, weil ich im Beruf in einem großen Projekt arbeite und privat im Vergleich noch im Aufbau bin.
Shade Of Mine schrieb:
Alleine der Boilerplate für diese Projekte sind viele hundert Zeilen.
Boilerplate zählt nicht.
Shade Of Mine schrieb:
Ein neues Feature für eine Software sind sehr viele Zeilen. Einen Bug fixen sind idR keine neuen Zeilen und Refactoring entfernt sogar Zeilen.
Deshalb weiß man, sobald Jemand von LOCs zu reden anfängt was man von ihm halten muss.
Yepp... auf kurze Sicht gar nichts, auf sehr lange Sicht hat man ein Indiz, mehr nicht.
Bitte ein Bit schrieb:
Xin schrieb:
Ich mache meine Bugs aber lieber selbst. Darin bin ich aber schlecht, wenn ich im Jahr zwei Bugs bekomme, die ich selbst verschuldet habe, ist das viel.
Den Satz verstehe ich nicht ganz. Das erscheint mir zu wenig.
Was verstehst du unter einem Fehler?Einen Quellcode, den ich zur Verwendung von Kunden oder anderen Entwicklern freigegeben habe und der nicht tut, was ich beabsichtigt habe. Das landet bei uns in Bugzilla.
Da landen bei mir auch "Bugs", wo sich Kollegen meinen Code gegriffen haben, bevor ich ihn vorgestellt und zur Verwendung freigegeben und melden, dass ein Feature nicht funktioniert. Liegt das daran, dass ich das Feature noch gar nicht entwickelt habe, ist das für mich kein Bug. Ist das Feature noch in aktiver Entwicklung, ist das für mich kein Bug, sondern unfertig.
Anderes Beispiel: Ich schreibe einen Im- und Exporter für ein aufwendiges Datenformat - siehe 100kLoc generierter Code. Diese 700 Klassen, die dafür generiert werden, haben auch individuelle Aufgaben, die ich Stück für Stück nachreiche. Der Im- und Exporter ist aber bereits im Kunden-Einsatz.
Dann kommt der Kunde an und meldet "Diese Datei funktioniert nicht" und ich bekomme eine Bugmeldung. Das ist ein Bug, wenn etwas nicht einzulesen ist, obwohl ich das bereits fertig programmiert hatte (oder dachte, es wäre fertig). Es ist kein Bug, wenn ich bei einem "not yet implemented" lande. Wenn der Support mir nun 10 Bugs schreibt, weil 10 Dateien aus den gleichen Gründen nicht einzuladen sind... dann ist das 1 Bug - oder eben auch gar keiner, wenn der Grund "not yet implemented" ist. Aber dann habe ich wenigstens neue Testdateien, die ich nutze bevor ich die entsprechenden Code-Stellen für die Öffentlichkeit freigebe.Für einen Bug muss von mir in Code manifestierter Irrtum vorliegen. Ein Not-Yet-Implemented ist der Irrtum des Projektleiters, dass man bei Bugzilla nicht nur Bugs schreiben, sondern auch Feature-Requests formulieren kann. Ein Feature-Request ist aber eben kein Bug.
Bitte ein Bit schrieb:
Es gibt ja diverse Arten von Fehlern. Von einem Designfehler angefangen zu einfachen Abstürzen, falsche Berechnungen, Portabilitätsfehlern, Compiler Fehler, inkonsistentem Verhalten oder auch algorithmische Fehler,...
Alles ist Bug, wenn das Verhalten nicht meinem Wunsch entspricht, sobald ich den Code zur Nutzung freigegeben habe.
Bitte ein Bit schrieb:
// WinAPI Beispiel zu Portabilitätsfehler: // Ich öffne einen "Datei speichern..." Dialog ohne die Bedeutung von WINVER verstanden zu haben. OPENFILENAMEW ofn = {0}; ofn.lStructSize = 54; // Hinter lStructSize steckt ein wenig mehr als nur die Größe des Structs. #ifndef OFN_EXPLORER #define OFN_EXPLORER 0x00080000 // Auch ein Klassiker der WinAPI Programmierung #endif ofn.Flags = OFN_OFN_EXPLORER; GetSaveFileName(&ofn) // Kleiner Flüchtigskeitsfehler std::string FileName = "C:\Benutzer\Kaiser Wilhelm\Info.doc"; std::string CmdLine = std::string("wordpad.exe") + FileName; system(CmdLine.c_str());
Ich habe keine Ahnung von dem Klassiker der Windowsprogrammierung, ich vermute aber dringend, dass die OPENFILENAMEW nicht ausreichend initialisiert ist.
Ansonsten springt nur ins Auge, dass die Backslashs nicht escaped sind und der Name ohne Leerzeichen an "wordpad.exe" angeklebt wird. Welcher genau ist der Flüchtigkeitsfehler?
-
// WinAPI Beispiel zu Portabilitätsfehler: // Ich öffne einen "Datei speichern..." Dialog ohne die Bedeutung von WINVER verstanden zu haben. OPENFILENAMEW ofn = {0}; ofn.lStructSize = 54; // Hinter lStructSize steckt ein wenig mehr als nur die Größe des Structs. #ifndef OFN_EXPLORER #define OFN_EXPLORER 0x00080000 // Auch ein Klassiker der WinAPI Programmierung #endif ofn.Flags = OFN_OFN_EXPLORER; GetSaveFileName(&ofn)
Hast recht, das Struct ist nicht komplett ausgefüllt. Aber das Hauptproblem ist lStructSize und die eigentwillige Definition von OFN_EXPLORER. Der Kern dahinter ist das WINVER Präprozessorflag, welches angibt für welche Windows Version ich entwickle. In der WinAPI dürfte folgendes stehen, wobei ich aber von der WinAPI abweiche, da ich keine Lust habe das exakte Beispiel zu suchen. Es kommt nur auf die WINVER Geschichte an.
#if WINVER > 0x600 // Erst ab Windows 7 funktioniert die Explorer Ansicht #define OFN_EXPLORER 0x00080000 #endif typedef struct { //... #if WINVER > 0x600 // Erst ab Windows 7 haben wir zusätzliche Flags für die Steuerung der Anzeige. int ExFlags; // Liste von zusätzlichen Flags zur Steuerung des Dialogs #endif } OPENFILENAMEW;
Wenn ich ofn.lStructSize auf die maximale Größe von OPENFILENAMEW setze, und WINVER kleiner als 0x600 ist, provoziere ich einen Zugriff auf nicht initialisierten Bereich (ExFlags). Ich möchte ja, und das sagt der Code, Features von Win7 nutzen, obwohl ich nicht für Win7 entwickele sondern auch für WinXP!
std::string FileName = "C:\Benutzer\Kaiser Wilhelm\Info.doc"; std::string CmdLine = std::string("wordpad.exe") + FileName; system(CmdLine.c_str());
Erster Fehler, klar die fehlende doppelte Escape Sequenzen. Den zweiten Fehler erkennt man, wenn man CmdLine betrachtet:
wordpad.exe C:\Benutzer\Kaiser Wilhelm\Info.doc
-> Fehlermeldung von Wordpad: Kann Datei C:\Benutzer\Kaiser nicht öffnen!
-> Ein Leerzeichen auf der Kommandozeile ist ein Trenner für Argumente
-> wordpad.exe "C:\Benutzer\Kaiser Wilhelm\Info.doc"
-
William Henry Gates III schrieb:
Measuring programming progress by lines of code is like measuring aircraft building progress by weight.
-
dot schrieb:
William Henry Gates III schrieb:
Measuring programming progress by lines of code is like measuring aircraft building progress by weight.
Hmm... ist ein typischer Gates. Sieht erstmal gut aus und man fühlt sich genötigt zu nicken und zu sagen "Recht hat er!".
Aber man sollte nicht drüber nachdenken.Der Kitty Hawk Flyer wog etwa 275kg und flog mit einer Person Zuladung 59 Sekunden.
Eine Curtiss C-46R aus den 40ern wiegt 13.290 kg und hob maximal 12t.
Ein A330 wiegt 120t, mit maximaler Zuladung wiegt das Ding 250t.
Wenn man den A330 zerlegt, passt er in den Frachtraum einer Antonow An-225, die 175 t wiegt. Für die 130t Zuladung und Kerosin der A330 ist im Laderaum der Antonov auch noch Platz, maximal darf die Antonov 600t wiegen.Gewicht von Flugzeugen ist durchaus ein Maßstab für den Fortschritt im Flugzeugbau. Einer von vielen, aber durchaus ein bisher zuverlässiges Indiz. Je schwerer das Flugzeug, desto mehr Fracht.
Wie LOCs.
Die Wahrscheinlichkeit 600000kg mit einem 275kg Flugzeug zu transportieren ist in nächerer Zukunft wohl eher nicht gegeben. Ähnlich sieht es aus, Windows 3.11 (3000000loc = 5*600000loc) in (1375 Zeilen = 5*275 Zeilen) zu realisieren.
Mehr Zeilen sind also durchaus ein Indiz auf mehr Features und Fortschritt.Außer man vergleicht C mit DOS.
Um Windows 3.11 in einer Batch-Datei zu rufen, reicht auch eine Zeile.
-
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?