Gibt es aktuelle Fallstudien zum Umschreiben von Software-Erfolgs- / Fehlerraten?


36

Ich habe mehrere Posts gesehen, in denen es darum ging, Anwendungen schlecht umzuschreiben , die Erfahrungen der Leute hier bei Programmierern und einen Artikel, den Joel Spolsky zu diesem Thema verfasst hat, aber keine konkreten Beweise oder Fallstudien. Abgesehen von den beiden Beispielen, die Joel gegeben hat, und einigen anderen Posts hier, was machen Sie mit einer schlechten Codebasis und wie entscheiden Sie, was Sie damit machen, basierend auf echten Studien?

Im vorliegenden Fall gibt es zwei mir bekannte Clients, die beide über alten Legacy-Code verfügen. Sie humpeln mit, weil, wie einer von ihnen herausfand, ein Umschreiben eine Katastrophe war, es teuer war und nicht wirklich daran arbeitete, den Code zu verbessern. Dieser Kunde hat eine sehr komplizierte Geschäftslogik, wie die Redakteure schnell herausfanden.

In beiden Fällen handelt es sich um geschäftskritische Anwendungen, die dem Unternehmen viel Umsatz bringen. Derjenige, der das Umschreiben versuchte, hatte das Gefühl, dass er gegen eine Mauer stoßen würde, wenn die alte Software nicht irgendwann in der Zukunft aktualisiert würde. Für mich erfordert diese Art von Risiko Forschung und Analyse, um einen erfolgreichen Weg zu gewährleisten.

Gab es konkrete Fallstudien, die dies untersucht haben? Ich möchte nicht versuchen, ein umfassendes Umschreiben durchzuführen, ohne einige bewährte Methoden, Fallstricke und Erfolge zu kennen, die auf tatsächlichen Studien basieren.

Nachwirkungen: Okay, nach mehr Suche habe ich drei interessante Artikel zu Fallstudien gefunden:

  1. Umschreiben oder wiederverwenden . Sie haben eine Studie über eine Cobol-App durchgeführt, die nach Java konvertiert wurde.
  2. Der andere befasste sich mit der Wiederverwendung von Software: Entwicklererfahrungen und -wahrnehmungen .
  3. Wiederverwendung oder Umschreiben Eine weitere Studie zu den Wartungskosten im Vergleich zu einem Umschreiben.

Ich habe kürzlich einen weiteren Artikel zu diesem Thema gefunden: The Great Rewrite . Dort scheint der Autor auf einige der Hauptprobleme zu stoßen. Dazu kam die Idee, mit dem vorgeschlagenen neuen Technologiestapel Prototypen zu erstellen und zu messen, wie schnell die Entwickler darauf zugegriffen haben. Dies alles war der Auftakt zu einem Umschreiben, was ich für eine großartige Idee hielt!


10
Ich kenne keine Fallstudien, aber ich denke, die Standardantwort für einen Ansatz ist wahrscheinlich "Unit-Tests und Refactor hinzufügen".
Jerry Coffin

2
Ich halte dies für den wahrscheinlich risikoärmsten Ansatz. Natürlich kenne ich nicht genug Details, um sicherzugehen, dass es der richtige Ansatz ist, aber auf der Grundlage meiner bisherigen Kenntnisse weiß ich nicht viel, was besonders wahrscheinlich viel besser ist.
Jerry Coffin

2
Wenn sie Komponententests durchführen (richtig - alle Anforderungen wirklich erfassen), ist es schwierig, einen Weg zu finden, wie Refactoring zu einer echten Katastrophe führen kann. Das Schlimmste, was passieren kann, ist, dass Sie nicht so schnell Fortschritte machen, wie Sie möchten. Wenn ihre Codebasis so schlecht ist, wie es die Frage impliziert, stehen die Chancen gut, dass ernsthafte Anstrengungen erforderlich sind, um unabhängig von der eingeschlagenen Route Fortschritte zu erzielen.
Jerry Coffin

2
So viele Projekte sind privat, dass es für eine Studie schwierig wäre, ein wirklich gutes Sample-Set zu haben. Möglicherweise sind Sie auf einzelne Beweise beschränkt.
mike30

1
Das Problem besteht nicht darin, die gesamte Codebasis neu zu schreiben. Das Problem ist , will das ganze verdammte Ding auf einmal neu zu schreiben und dann eine Taste drücken und PLONG alle Ihre Kopfschmerzen weg gegangen sind. In den meisten Fällen können Sie es sich nicht leisten, Ihren Konkurrenten Zeit zu nehmen, indem Sie neue Funktionen hinzufügen, Fehler festigen und Kunden stornieren. So katastrophal eine Codebasis auch sein mag, es sollte möglich sein, die Schwachstellen zu identifizieren und die richtigen Teile der Spaghetti nach Belieben zu modularisieren.
Erik Reppen

Antworten:


6

Ich kann diese großartigen Kommentare nicht würdigen, aber sie wurden vom Originalautor nie beantwortet, daher markiere ich sie als Community-Wiki.

Ich kenne keine Fallstudien, aber ich denke, die Standardantwort für einen Ansatz ist wahrscheinlich "Unit-Tests und Refactor hinzufügen".

Ich halte dies für den wahrscheinlich risikoärmsten Ansatz. Natürlich kenne ich nicht genug Details, um sicherzugehen, dass es der richtige Ansatz ist, aber basierend auf dem, was ich bisher weiß, weiß ich nicht viel, was besonders wahrscheinlich viel besser ist.

Wenn sie Unit-Tests durchführen (richtig - alle Anforderungen wirklich erfassen), ist es schwierig, eine Möglichkeit zu finden, mit der das Refactoring zu einer echten Katastrophe führen kann. Das Schlimmste, was passieren kann, ist, dass Sie nicht so schnell Fortschritte machen, wie Sie möchten. Wenn ihre Codebasis so schlecht ist, wie es die Frage impliziert, stehen die Chancen gut, dass ernsthafte Anstrengungen erforderlich sind, um unabhängig von der eingeschlagenen Route Fortschritte zu erzielen.

Ich würde davon ausgehen, dass sich die Fehlerquoten beim Umschreiben von Projekten nicht wesentlich von denen im Allgemeinen unterscheiden. Die besten Informationen finden Sie im aktuellen CHAOS-Bericht.


8
Code, der in der Regel neu geschrieben werden muss, ist nicht testbar (enge Kopplung, Klassen, die zu viel leisten usw.), was Sie in die seltsame Situation versetzt, dass Sie umgestalten müssen, bevor Sie einen Komponententest durchführen können.
Kevin

Ja, aus diesem Grund war der Kommentar zum Buch: "Effektiv mit Legacy-Code arbeiten" sehr angebracht. Ich musste letztes Jahr so ​​etwas tun, und ein methodischerer Ansatz, wie er in diesem Buch erklärt wird, hätte mir viel Zeit gespart und eine Dokumentation / einen Testpfad hinterlassen, der nützlich gewesen wäre. Ich habe das Gefühl, es einfach zum Laufen zu bringen, war großartig, aber nicht genug. Die Objekte hatten so viele Abhängigkeiten, dass ich der Meinung war, dass meine Tests eine bessere Abdeckung hätten haben können.

6

Vor einiger Zeit überflog ich Working Effectively with Legacy Code von Michael Feathers und fand heraus, dass es einige gute Einblicke in die Praxis der Verwaltung von Legacy-Code bietet, einschließlich des Schreibens von Tests (auch wenn Sie nicht wissen, wofür der Code gedacht ist) und von Kurs Refactoring / Umschreiben. Es ist ein bisschen altmodisch, aber bei Amazon sehr beliebt.


3

Wenn ich aus Erfahrung spreche und in einem Unternehmen lebe, das von Anfang an eine schlecht konzipierte Unternehmensarchitektur hat, kann ich ehrlich sagen, dass das größte Problem darin besteht, ein umfassendes Verständnis zu entwickeln.

Diese Vorstellung, dass ein System in Teile zerlegt und individuell verstanden werden kann, ist mangelhaft. Irgendwann musste ein einzelnes Individuum oder mehrere Individuen in der Lage sein, das gesamte Problem in seiner Gesamtheit zu erfassen. Wenn es sich bei diesem Problem um eine Reihe von geschäftlichen Problemen handelt und um die Technologien, die sie auslösen. Es kann mehrere Jahre dauern, bis eine Person im Unternehmen alle Systeme so weit verstanden hat, dass sie ersetzt werden können, ohne dass es zu einer Katastrophe oder einer verpassten Anforderung kommt. Dies war in meinem Unternehmen sicherlich der Fall, als ich die Leitung der Technologie übernahm. Ohne die Tatsache, dass ich selbst ein Programmierer bin, wäre ich nicht in der Lage gewesen, langsam alle Details der schlecht organisierten, eng gekoppelten, eng verbundenen Architektur und Integration von Technologie zu verstehen. Wenn kleine versteckte, undokumentierte Details mögen"We put the eBay order number in the "SYSOENT.PO_NUMBER" field in the ERP system because that's what Wendell the VB coder from Florida decided to do" übersehen werden, können die Ergebnisse katastrophal sein, und der einzige Weg, dies zu wissen, besteht darin, alles langsam zu entdecken.

Wenn jemand gebeten wird, den Motor während des Flugs in einem Flugzeug auszutauschen oder einem sicheren Tod zu drohen - vorausgesetzt, die erforderliche Menge an Werkzeugen und Ressourcen muss der Benutzer wissen, wie er die Sensoren, das Hydrauliksystem und die Umleitung des Kraftstoffstroms außer Kraft setzt , manipulieren Systeme, die niemals dazu bestimmt waren, von außen oder vom Cockpit aus geändert oder manipuliert zu werden. Dies ist oft die Aussicht, eine Geschäftsanwendung neu zu schreiben. Die Anwendung wird normalerweise in das Geschäft zwischen vielen verschiedenen anderen Technologien gestoßen.

Ich denke, mein wichtigster Punkt ist, dass das System nahezu in seiner gesamten Komplexität verstanden werden muss und dass es zu einem bestimmten Zeitpunkt in seiner Vollständigkeit verstanden werden muss, damit das neue System ordnungsgemäß "konstruiert" und nicht nur "hergestellt" wird.

Cookies werden gemacht, Software (sollte) entwickelt.


2
+1 für die Notwendigkeit, so viel über das Geschäftssystem im Vorfeld zu verstehen. Wie Sie jedoch wissen, sind hier die Zeit und die Ressourcen (aus dem Geschäft) sowie die Änderungsfaktoren die Herausforderung. Für mittlere und große Systeme ist es manchmal nicht immer möglich, die gesamte Komplexität von vornherein zu verstehen.
NoChance

2

Es gibt viele Beispiele für Unternehmen, die an einem Umschreiben gestorben sind, wie Netscape . Es gibt auch Unternehmen wie Twitter , die eine Umschreibung ohne große Probleme überstanden haben .

Es gibt keine quantifizierten Fallstudien, da es nicht machbar ist, ein Kontrollexperiment durchzuführen, bei dem der Geschäftserfolg des Nicht-Umschreibens mit dem Geschäftserfolg des Umschreibens verglichen wird. Jede Anwendung ist anders.

Es gibt einige offensichtliche Fälle, in denen ein Umschreiben sinnvoll ist, und viele Fälle, in denen dies nicht der Fall ist. Ich habe mir ein kleines Rezept ausgedacht, um herauszufinden, ob ein Umschreiben in Ihrem Fall Sinn macht .

Ich denke, dass das Umschreiben heutzutage sinnvoller ist, da wir schnell auf den Schultern der Verbesserung invasiver Frameworks wie Rails, Grails und AngularJS programmieren. Wenn Sie von normalem js zu Angular wechseln möchten, können Sie fast alles neu schreiben. Es könnte immer noch viel Sinn machen. Wenn Sie eine DIY-Implementierung durch eine andere ersetzen (wie alle Beispiele in Joel Spolskys Artikel ), sind Sie wahrscheinlich verrückt.


1

Sie werden nicht viele voreingenommene Fallstudien finden, die nichts anderes sind als nach Aktionsberichten - die meisten Leute werden nicht dafür bezahlen, dass dieselbe Arbeit mindestens zweimal ausgeführt wird (einmal als Umschreibung, einmal als Upgrade, am besten Fall wären mehrere Umschreibungen / Upgrades durch verschiedene Teams).

Die von Ihnen gefundene Fallstudie scheint von Fujitsu erstellt worden zu sein, und es überrascht nicht, dass es besser war, Fujitsus Tools zu verwenden.

Aus organisatorischer Sicht ist ein Umschreiben nur dann eindeutig ein Fehler, wenn entweder die umgeschriebene Anwendung nicht funktioniert oder das Projekt abgebrochen wird, bevor es fertig ist - ansonsten ist es unmöglich zu wissen, ob die Verzögerung bei der Freigabe der umgeschriebenen Version die war Ursache für den erlittenen oder nur zufälligen Verlust. Wenn die Buchung vorzeitig storniert wird, werden im Allgemeinen Zeit und Ressourcen verschwendet. Ein Upgrade kann möglicherweise dasselbe Problem haben, aber es ist unwahrscheinlich, dass es sich um ein inkrementelles Upgrade handelt (Sie erhalten etwas für Ihr Geld).

Aus Programmiersicht ist es am besten, beides zu tun - inkrementelle Upgrades während des Umschreibens, die sich gegenseitig unterstützen und inspirieren. Sofern Sie keine anderen Teams haben, dauert dies natürlich länger.

Beachten Sie, dass dies eine grobe Richtlinie für die Überlegung ist, ob Sie ein vollständiges Umschreiben in Betracht ziehen sollten - das Projekt ist klein genug, um dies problemlos zu tun, oder die Organisation ist groß genug, um beides leisten zu können, abzüglich des Aufwands oder der Lernkosten lohnend. Beachten Sie auch, dass, wenn das Umschreiben die Überarbeitung nie aufholt, dies mehrere Dinge bedeuten kann, aber alle anderen gleich sind, es wahrscheinlich bedeutet, dass ein Umschreiben unnötig war.


1
Das Neuschreiben kann ein Fehler sein, wenn das Budget massiv überschritten wird und der Vorgang abgebrochen wird, bevor der Abschluss erreicht ist. Geld den Bach runter. Die Möglichkeit dieser Möglichkeit ist, warum das Umschreiben als riskanter als das Umgestalten angesehen wird.
MarkJ

@MarkJ: Ich dachte, dass das unter "Funktioniert nicht" behandelt wurde, aber ich werde es bearbeiten, um das klarer zu machen.
Jmoreno
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.