Wie vor 20 Jahren von DeMarco und Lister in Peopleware festgestellt wurde, scheitert die überwiegende Mehrheit der gescheiterten Softwareprojekte nicht an technischen Herausforderungen, sondern an soziologischen Problemen . Dies hat sich in den letzten Jahrzehnten nicht geändert, egal wie sehr sich unsere Werkzeuge verbessert haben.
Missmanagement, unrealistische Erwartungen, Versäumnis, die richtigen Leute für den Job zu finden und / oder sie nicht ihren Job machen zu lassen, was zur Folge hat, dass sie nicht gehalten werden; Arbeitsplätze und Werkzeuge, die nicht für SW-Entwicklungsarbeiten geeignet sind; unbehandelte persönliche Konflikte; Politik ; Dies sind nur einige der typischen Probleme, die dazu führen können, dass ein Projekt von Anfang an zum Scheitern verurteilt ist.
Warum ist es schwieriger, guten Code zu schreiben?
Ich bin nicht ganz davon überzeugt, dass es wirklich schwieriger ist, guten Code zu schreiben als noch vor Jahrzehnten. Im Vergleich zu Maschinencode oder Baugruppen ist alles, was wir jetzt im Mainstream haben, viel einfacher zu handhaben. Nur müssen wir möglicherweise mehr davon produzieren.
Liegt es nur an den genannten Faktoren, Zeit und Komplexität?
Ja, die erreichbare Komplexität hat mit zunehmender Leistung unserer Werkzeuge mit Sicherheit zugenommen (und nimmt auch weiterhin zu). Mit anderen Worten, wir gehen immer wieder neue Wege. Das bedeutet für mich, dass es genauso schwierig ist, die größten Herausforderungen von heute zu lösen wie vor 30 Jahren, die größten Herausforderungen dieses Tages zu lösen.
OTOH Da das Feld so enorm gewachsen ist, gibt es heute weit mehr "kleine" oder "bekannte" Probleme als vor 30 Jahren. Diese Probleme sind technisch (sollten) keine Herausforderung mehr sein, aber ... hier kommt die obige Maxime :-(
Auch die Zahl der Programmierer ist seitdem enorm gewachsen. Und zumindest meine persönliche Wahrnehmung ist, dass das durchschnittliche Niveau an Erfahrung und Wissen zurückgegangen ist, einfach weil immer mehr Junioren auf dem Feld sind, als Senioren, die sie ausbilden könnten.
Sind die Methoden nicht richtig geübt?
IMHO sicherlich nicht. DeMarco und Lister haben einige harte Worte zu Big-M-Methoden. Sie sagen, dass keine Methodik ein Projekt erfolgreich machen kann - nur die Leute im Team können. OTOH die Small-M-Methoden, die sie loben, sind ziemlich nahe an dem, was wir heute als "agil" kennen, was sich weit verbreitet (IMHO aus gutem Grund). Ganz zu schweigen von bewährten Praktiken wie Unit-Testing und Refactoring, die noch vor 10 Jahren nicht allgemein bekannt waren und die heutzutage selbst viele Absolventen kennen.
Probleme im Zusammenhang mit der Kodierung unter unrealistischen Fristen und dem Umgang mit technischen Schulden sind seit Weinberg '71 und auch Brooks '72 bekannt. Vorher ist die Literatur nur schwer online zu finden, aber ich bin mir ziemlich sicher, dass es alte CDC-, IBM- und NASA-Berichte gibt, die dasselbe aussagen.
quelle
Ich denke, wir haben alle unsere eigenen Ideen und Schwellenwerte für "Good Code". Es gibt jedoch eine Reihe von Themen, die alle dazu beitragen:
Am Ende denke ich, dass es am besten ist, besser zu verfolgen als "gut" oder "am besten". Wenn wir den besten Code da draußen sehen würden, würden wir ihn als solchen erkennen?
quelle
Warum ist es schwieriger, guten Code zu schreiben?
Weil Software zunehmend auf Abstraktionsebenen aufgebaut wird. Jede neue Technologie, die behauptet, die Entwicklung zu vereinfachen und zu beschleunigen, erhöht die Komplexität, die ein Entwickler verstehen muss. Diese Abstraktion kann einen großen Vorteil für die Produktivität haben. Wenn Sie jedoch nicht verstehen, was sie zu verbergen versucht, ist die Software anfälliger für Fehler und schlechte Qualität.
quelle
In der Tat ist es nicht möglich. Aber nicht aus irgendeinem Grund, den Sie schon gehört haben.
Der weitaus größte Teil der Projekte geht weit über die Möglichkeiten eines menschlichen Gehirns hinaus. Aus diesem Grund haben sich die Leute die Idee der Abstraktion ausgedacht , das heißt, sie verstecken ständig Details und klettern den Abstraktionsbaum höher, bis die Dichte der Zweige (Menge der zu verarbeitenden Informationen) auf ein akzeptables Maß abnimmt.
Wir haben das getan, wir haben das Komplexitätsproblem gelöst, aber das größere Problem, das wir zuvor hatten, wurde dadurch nicht behoben.
Es ist immer noch zu komplex für uns.
Um eine qualitativ hochwertige Lösung zu erstellen, müssen wir in der Lage sein, gleichzeitig alles zu sehen und zu verstehen, dh alle Module in großen und kleinen Implementierungsdetails. Um alle Diskrepanzen auf einmal zu sehen, sehen Sie jeden Code im Kontext aller möglichen Szenarien und optimieren Sie gleichzeitig die gesamte Codebasis.
Das werden wir nie schaffen.
Und wenn wir nicht können, werden wir niemals Qualitätscode produzieren.
Manager werden die Verwirrung von Modulen bemerken, kennen jedoch keine internen Probleme und Einschränkungen pro Modul.
Modulprogrammierer kennen lokale Einschränkungen, können diese jedoch im Kontext eines größeren Zusammenhangs nicht optimieren.
Es gibt keine Möglichkeit, Verständnis zwischen Managern und Programmierern (und sogar zwischen Programmierern) zu vermitteln. Und selbst wenn es welche gäbe, könnte die Kapazität des menschlichen Gehirns damit nicht umgehen.
Es gibt wenig, was wir tun können, außer es weiter zu versuchen (eine sinnlose Übung). Lassen Sie uns einfach den Code mehr oder weniger betriebsbereit halten und das Leben genießen.
quelle
Ich bestreite die Prämisse Ihrer Frage. Es ist einfacher als je zuvor, guten Code zu schreiben, und aus diesem Grund gehen wir Probleme viel härter an, als wir es zuvor getan haben.
Ich möchte mich nicht für einen bestimmten Anbieter entscheiden, sondern Windows 1.0 mit Windows 7 vergleichen. Letzteres enthält tausendmal mehr Code, aber die durchschnittliche Zeitspanne zwischen Abstürzen hat sich hundertfach erhöht. Wir sollten in der Lage sein, eine Excel-Tabelle in ein Word-Dokument einzubetten, seit Windows 3.1, aber heutzutage funktioniert es mehr oder weniger.
Ohne in die Sentimentalität "Sie Kinder heutzutage mit Ihrer Enten-Typisierung und VM" fallen zu wollen, würde ich vorschlagen, dass Sie keine Ahnung haben, wie schwierig es war, guten Code in den 80er Jahren zu schreiben: TINY-, SMALL- und HUGE-Speichermodelle, Overlays , nicht-eintretende OS-Aufrufe (Schauder). Gute Befreiung von all dem.
quelle
Moderne Anwendungen sind komplexer als vor 20 bis 30 Jahren, da ihre Umgebung vielfältiger und vielseitiger ist.
Es war typisch für ein DOS-Programm, in einer engen Schleife zu sitzen und auf den nächsten Tastendruck des Benutzers zu warten, dann den entsprechenden Code aufzurufen und wieder auf den nächsten Tastendruck zu warten.
Jede moderne Anwendung, bei der Sie die Maus überhaupt nicht verwenden können, hat ein ernstes Erklärungsproblem. Und die Dinge können in beliebiger Reihenfolge geschehen, da der Benutzer tippen, mit der Maus klicken und weiter tippen kann, während die RSS-Feeds in der Anwendung aktualisiert werden und die neuesten Einträge für den Benutzer während der Eingabe angezeigt werden.
All diese Multitasking-Dinge sind wesentlich komplexer als wenn man nur an die Schlüssel des Benutzers denken musste. Das macht es schwieriger, wirklich guten Code zu schreiben.
Wenn die Forscher herausgefunden haben, wie wir Multitasking-Programme aus Entwicklersicht benutzerfreundlicher machen können, kann dies hoffentlich nachlassen, aber im Moment stecken wir fest, wenn alle versuchen, es gut zu machen, aber nicht genau wissen, wie sie es machen sollen es.
quelle
Es scheint mir, dass die Software erweitert wurde, um die verfügbare Prozessorgeschwindigkeit, Speicher, Festplatte und Programmierzeit zu füllen. Man könnte behaupten, dass das daran liegt, dass die Software viel mehr leistet. Nun, ich bin sicher, dass es viel mehr bewirkt, aber nicht genug, um das Aufblähen zu rechtfertigen.
Ich denke, es gibt ein altes Gesetz der Wissenschaft, an das man sich erinnern sollte:
Francois Rabelas (französischer Mönch und Satiriker 1494-1553)
quelle
Tatsächlich denke ich, dass es im letzten Jahrzehnt einfacher geworden ist, guten Code zu schreiben, dh Programme, die wie erwartet funktionieren und wartbar sind. Die verfügbaren Tools sind jetzt besser, die Bibliotheken sind ausgereifter und umfassender, die Hardware ist viel schneller geworden, sodass wir keine Optimierungstricks anwenden müssen.
Warum also nicht wir?
IMO ist der Hauptgrund, dass wir ständig nach Wegen und Entschuldigungen suchen, um Dinge zu missbrauchen. Anstatt den altmodischen, einfachen, wahrscheinlich langweiligen Weg zu gehen, wie das Erstellen einer ausführbaren Windows-Datei, gehen wir an die Grenzen des Möglichen und suchen nach Möglichkeiten, um z. B. etwas wie PhotoShop als Webanwendung neu zu erstellen. Warum? Weil wir können. Zumindest glauben wir das.
quelle
Wann hat das letzte Mal JEMAND keinen Exploit geschrieben oder studiert, um dies mit Assembly zu tun (ohne Kernel-Hacker und ASIC-Leute)? Wie viele Bugs wurden in C-Core-Bibliotheken entdeckt? Fast keine und ein paar. Ich sage nur, dass die Leute in der Lage sind, exzellenten Code zu schreiben. Bessere Tools und Sprachen machen es weniger "erforderlich" und mehr "optional". Nicht, dass ich denke, wir sollten alle wirklich schrecklichen Code schreiben, aber wenn ich an komplizierte logische Konstrukte denke ... hätte niemand davon geträumt, etwas mit Hash-Arrays in Assembler zu schreiben. Es musste einen besseren Weg geben, mit der Logik umzugehen, anstatt ein kompliziertes Konstrukt zu verwenden. Auch wenn der Code schön ist, ist der Ansatz manchmal nicht so elegant. Ich denke, es geht irgendwie um das Problem, das Sie angesprochen haben. Guter Code ist nicht immer nur organisiert,
quelle
Ich denke, das liegt daran, dass bessere Tools und schnellere, reaktionsfreudigere Computer dazu führen, dass wir voraussichtlich viel mehr Zeit für die endgültige Komplexität des Produkts haben als vor einigen Jahren (oder Jahrzehnten). Die Komplexität der Apps nimmt also weiter zu, und unsere Annahmen darüber, wie hoch ein angemessenes Maß an Produktivität ist, nehmen weiter zu.
Wo ich arbeite, haben Entwickler es immer eilig (weil es immer mehr Dinge gibt, die Kunden wünschen, als sie Zeit haben). So werden viele Codeblöcke mit minimalem Bearbeitungsaufwand und ohne großen Aufwand kopiert. Und natürlich werden Fehler gemacht. Ich habe gerade gesehen, wie ein Fehler behoben wurde, bei dem ein Entwickler einen von mir optimierten Code kopiert hatte, ohne zu bemerken, dass die Annahmen, die die Optimierung gültig machten, nicht wahr waren, wo er sie platziert hatte.
Dies alles hängt von den internen (unseren eigenen) Erwartungen und von unseren Organisationen ab. Wir versuchen so schnell wie möglich so viel wie möglich zu tun. Und es kommt unweigerlich zu Fehlern.
Auch die Reaktionsfähigkeit des Computers fördert ein schnelles Bearbeiten, Kompilieren und Testen. In den alten Tagen (wie vor 35 Jahren) war der Turnaround so langsam, dass ich den Code ausdrucken (Quelle waren damals Lochkarten) und den Code manuell durcharbeiten konnte, bevor ich mein Deck einreichte. Jetzt bearbeiten wir einfach das Kompilieren und führen es aus. So viele Fehler, die wir durch methodisches Code-Walkthrough entdeckt hätten, können wir jetzt auf den Compiler und / oder die Unit-Testsuite zählen, die stattdessen abgefangen werden sollen.
quelle
Wie sind die Leute schlechter darin geworden, guten Code zu produzieren?
Wenn Sie .NET und eine Sprache wie C # nehmen, zum Beispiel (und ich weiß , es ist nicht die einzige Plattform / Sprache), würde ich argumentieren , dass die Codierung auch weit worden ist, viel leichter durch die Automatisierung vieler Dinge innerhalb des Visual Studios Umgebung.
Wenn überhaupt, erleichtert die Tatsache, dass wir jetzt über sehr ausgefeilte IDEs verfügen, die uns durch den Kodierungs- und Entwicklungsprozess führen, das Erreichen von "gutem Code".
Programmierer können sich jetzt darauf konzentrieren, eine gute Struktur zu erzeugen, anstatt so viel Zeit damit zu verbringen, Klammern und neue Zeilen einzugeben und sich Methodenaufrufe und Klassennamen zu merken.
Meine zwei Cent.
quelle
Ja, wir als Industrie praktizieren keine guten Methoden. Referenz: Steve McConnell's Construx Software Software-Entwicklung ist Low Hanging Fruit .
quelle
Tolle logische Tautologie.
Code wird nicht besser, weil die Leute die Definition von "gut" in Bewegung halten.
Wenn Sie "guten Code" diskutieren können, können Sie ihn nicht vergleichen und Sie können sich wirklich nicht entscheiden, ob es sich um eine "Herausforderung" handelt oder nicht.
quelle