92
Hallo zusammen! Hallo, guten morgen Hamburg! Ich bin Johann, und nicht ganz echter CTO.

Rewrites überleben

Embed Size (px)

DESCRIPTION

Viele PHP-Applikationen sind über Jahre erfolgreich, haben jede Änderung mitgemacht und sind inzwischen weder wartbar noch entsprechen sie aktuellen Standards. Doch um am Markt zu bestehen braucht man neue Features, und damit einen Rewrite auf ein modernes Framework wie Zend Framework 2, Laravel 4 oder Symfony 2. Aber Rewrites schlagen häufig durch jede Deadline oder ganz fehl, und währenddessen übernimmt die Konkurrenz den Markt. Wie man aus der Rewrite-Falle kommt und verlässlich eine wartbare Version der Software herstellt – das erklärt dieser Talk mit Methoden, Beispielen und Praxiswissen.

Citation preview

Page 1: Rewrites überleben

Hallo zusammen!

Hallo, guten morgen Hamburg! Ich bin Johann, und nicht ganz echter CTO.

Page 2: Rewrites überleben

Ein Vortrag _ohne_ Microsoft-Bashing

Neu!

Willkommen zu einer Premiere - ich habe mal einen Vortrag ohne Microsoft-Bashing.

Page 3: Rewrites überleben

Wer von Euch macht gerade einen

Rewrite?

Es gibt ja einen Grund, warum ihr hier seid. Also mal direkt gefragt - wer von Euch macht gerade einen Rewrite?

Page 4: Rewrites überleben

Wer von Euch plant gerade einen

Rewrite?

Wer plant einen in Zukunft? Genau die Leute möchte ich in meinem Vortrag sehen.

Page 5: Rewrites überleben

Wer von Euch würde gerne einen

Rewrite machen?

Und nicht zuletzt: Wer von Euch würde gerne einen Rewrite machen? Jemand mit einer Legacy-Applikation da, der keinen Rewrite möchte?

Page 6: Rewrites überleben

Ich bin hier um Euch das

auszureden.

Ich bin heute hier um Euch das auszureden.

Page 7: Rewrites überleben

Wir haben das schon ganz schlimm falsch gemacht.

Ihr müsst das alsonicht mehr falsch zu machen.

Wir haben die Fehler alle schon gemacht. Ihr braucht jetzt nicht auch noch.

Page 8: Rewrites überleben

Wer von Euch macht gerade eine

Modernisierung?

Und wer macht gerade eine Modernisierung? :-)

Page 9: Rewrites überleben

Ein Bild von damals, als die Pixel noch nen halben Meter gross waren. Kennt das noch jemand von Euch? Ok, doch ein paar alte Leute hier. Welcher Jahrgang?

Page 10: Rewrites überleben

http://home.mcom.com/people/jwz/

Es gab mal eine Zeit, da hat sich das Icon des Browser beim Ansurfen der URL unten auf den drehenden Kompass geändert. Das wurde von einer Person extra eingebaut, damit seine Homepages etwas besonderes hatte.

Page 11: Rewrites überleben

Das ist sein Cubicle zu der Zeit gewesen. Konkret handelt es sich um Jamie Zawinski, der damals bei Netscape Communications arbeitete. Von ihm kommen weiterhin so Tools wie XEmacs - noch Emacs-Nutzer anwesend? XScreensaver, die DaliClock und ähnliches. Er kennt sich also mit Software aus.

Page 12: Rewrites überleben

Das ist sein Nightclub, die DNA Lounge, den er sich vom Netscape-Geld gekauft hat.

Page 13: Rewrites überleben

CADTAber zurück zum Thema. Und er hat folgendes Entwicklungsmodell gefunden. CADT. Kann sich jemand vorstellen, was das heisst?

Page 14: Rewrites überleben

Cascade of Attention-Deficit Teenagers

„Poah, die Software ist so eine Grütze, da mache ich lieber einen Rewrite.“

Auf den Rewriteversuchfolgt der Rewriteversuch.

Das ist die Kaskade von Aufmerksamkeits-Defizit-Syndrom-Teenagern.

Page 15: Rewrites überleben

Cascade of Attention-Deficit Teenagers

„That's what happens when there is no incentive for people to do the parts of programming that aren't fun. Fixing bugs isn't fun; going through the bug list isn't fun; but rewriting everything from scratch is fun ...“

Jamie Zawinski Er nennt das so: Das ist das was passiert wenn es keinen Incentive gibt die Teile vom Programmieren zu machen die nicht Spass machen. Bugfixes machen keinen Spass, die Bugliste durchzugehen macht keinen Spass, aber alles noch einmal neu Programmieren: das macht Spass.

Page 16: Rewrites überleben

Cascade of Attention-Deficit Teenagers

That's what happens when there is no incentive for people to do the parts of programming that aren't fun. Fixing bugs isn't fun; going through the bug list isn't fun; but rewriting everything from scratch is fun... ?

Wer von Euch ist der Meinung dass das stimmt mit dem Spass? Genau, ich auch.

Page 17: Rewrites überleben

Ich bleibe noch in einem kurzen Opa-erzählt-vom-Krieg-Modus.Das hier ist der erste Browser, geschrieben vom Team von Marc Andreessen.

Page 18: Rewrites überleben

Marc Andreessen machte sich dann mit etwas Venture-Capital selbstständig und gründete Netscape Communications, und macht den Browser zu einem richtigen Produkt. Dieses war der - richtig - Netscape Navigator. Und genau an dem hatte Jamie Zawinski mitgewirkt.

Page 19: Rewrites überleben

1995

80% Market Share

Und tatsächlich ging das Geschäft auf - 1995 hatten sie einen Markanteil von 80%. In diesem Jahr kam auch die erste Version vom Internet Explorer von Microsoft heraus. Microsoft hatte die Rechte am Mosaic-Browser gekauft und ihn schlicht für Windows kompiliert. Veröffentlich wurde er mit Microsoft Plus für Windows 95.

Page 20: Rewrites überleben

1998

52% Market Share

Während der erste Browser von Microsoft noch nichts taugte, wurden die folgende besser. Schliesslich wurde er mit dem Betriebssystem gebundelt, so dass der Markanteil stiegt. Nichtsdestotrotz hatte Netscape immer noch einen Markanteil von 52%.

Page 21: Rewrites überleben

1998

Let‘s rewrite the Browser from Scratch.

Im gleichen Jahr entschloss sich Netscape, den Browser komplett neu zu schreiben. Der aktuelle Browser, Netscape 4, wurde eingefroren.

Page 22: Rewrites überleben

2001

10% Market Share

Aber der Code ist jetzt super!

2001, drei Jahre später, waren sie endlich fertig. Mit sehr viel Verspätung. Der Marktanteil lag bei nur noch 10%.

Page 23: Rewrites überleben

1998 war der Netscape Navigator 4 noch der Standard. Dann ging es in den REwrite, und es ga lange Zeit keine neuen Features. Auf der Netscape-Seite. Microsoft wiederum konnte mit den Upgrades bishin zum IE6 auf die Code-Basis vom Mosaic zugreifen und kontinuierlich neue Features liefern.

Page 24: Rewrites überleben

Microsoft: Check

Klarer Sieg für Microsoft - die haben keinen Rewrite gemacht, sondern einfach auf der Codebase vom ersten Browser überhaupt - dem NCSA Mosaic - weitergearbeitet.

Page 25: Rewrites überleben

Noch ein Microsoft-Konkurrent. Borland war mal der Standard bei Entwicklungstools für die Microsoft-Plattformen DOS und Windows ...

Page 26: Rewrites überleben

Borland hatte zu Dos-Zeiten ein absolut massgebliches Produkt für Datenbanken. Aber dann kam Windows, und sie wollte ein neues Produkt haben - und haben tatsächlich ein neues Produkt gemacht, mit Hilfe eines Firmenzukaufs von Arago. Die neue Version war aber nicht kompatibel zur alten - und Microsoft übernahm mit Access den Markt. Weil wenn ich eh migrieren muss, dann kann ich es auch zu einer anderen Lösung.

Page 27: Rewrites überleben

Microsoft: Check

Klarer Sieg für Microsoft - die haben keinen Rewrite gemacht,

Page 28: Rewrites überleben

Noch ein Produkt von den Herren. Auch bei Quattro pro wurde die Software komplett neu geschrieben. Hier war man zwar weitgehend kompatibel, hatte aber viele Features nicht mehr. Seitdem nutzen wir alle Excel.

Page 29: Rewrites überleben

Microsoft: Check

Klarer Sieg für Microsoft - die haben keinen Rewrite gemacht,

Page 30: Rewrites überleben

Microsoft selbst wiederum entschloss sich 1991 zu einem kompletten Rewrite von Word for Windows, mit dem internen Namen „Pyramid“.

Page 31: Rewrites überleben

?Hat jemand eine Idee, warum Word trotzdem noch Marktführer ist? Was haben die gemacht, um den Rewrite zu überleben? Genau, weil sie das Projekt nach einer Weile gestoppt haben. Und lieber auf dem bestehenden Code weiterentwickelten.

Page 32: Rewrites überleben

Microsoft: Check

Klarer Sieg für Microsoft - die haben keinen Rewrite gemacht,

Page 33: Rewrites überleben

Standish Group:

nur 41% aller agilen Projekte sind in Time & Budget

Jetzt kann man natürlich sagen, das ist anecdotal Evidence, und Borland ist nicht umsonst nicht mehr da, und Microsoft ... ja, halt Microsoft. Die Standish Group kennt sich neben QSM mit sowas immer am besten aus. Und sie weiss: nur 41% aller agilen Projekte sind in Time & Budget. Das klingt zwar fies, aber ist ok.

Page 34: Rewrites überleben

Standish Group:

nur 14% aller konventionellen

Projekte sind in Time & Budget

Immerhin, bei konventioneller, also wasserfalliger oder Rational-Unified-Process oder ähnlicher Entwicklung sieht es noch schlechter aus.

Page 35: Rewrites überleben

Standish Group:

nur 4% aller Rewrites sind in

Time & Budget

Und kommen wir zu den Rewrites. Nur 4% aller Rewrites sind in Time & Budget. Und nach Hofstadters Law gilt: auch wenn ich das berücksichtige und mehr Buffer einbaue. Und fast die Hälfte aller Rewrites schlägt komplett fehl und wird eingestellt.

Page 36: Rewrites überleben

WTF?Gerade da, wo wir die

Software schon kennen, scheitern wir?

Das ist schon beeindruckend - genau da, wo wir die Software eigentlich schon haben und sie schon live ist scheitern wir am häufigsten?

Page 37: Rewrites überleben

Also lieberdoch kein

Rewrite?Hmm, wenn man sich die ganzen Zahlen ansieht - also lieber doch kein Rewrite?

Page 38: Rewrites überleben

Hmm, warum wollten wir noch mal einen

Rewrite?

Aber zurück zu uns - warum wollen wir noch mal einen Rewrite machen? Von denen, die sich vorhin gemeldet haben - was ist der Grund? Weil sich jemand aus dem Business beschwert, im Regelfall. Oder aus dem Development.

Page 39: Rewrites überleben

•neue Features dauern zu lange

•es gibt viele Bugs

•die Software wird nicht stabil

•die Architektur skaliert nicht (Cloud)

•Einarbeitung dauert zu lange

•Rahmenbedingungen haben sich geändert

So, warum wollten wir noch mal einen

Rewrite?

Der Haupttreiber ist meistens die Verlangsamung der Entwicklung und die fehlende Verlässlichkeit. Es dauert zu lange bis Features kommen, und da Team wird durch Bugfixes blockiert. Und in Wahrheit haben wir Developer einfach keinen Bock mehr. Und würden jede Begründung dafür nehmen, Hauptsache, wir müssen nicht weiter mit dem Code arbeiten.

Page 40: Rewrites überleben

1999-2005

„Gewachsene Codebase“

Und warum ist das so? Weil wir damals Software anders geschrieben haben.Gerne spricht man da über Software aus der Pre-Framework-Ära. Gerne mit PHPLib, Pear, Smarty und _vielen_ eigenen Libraries realisiert.

Page 41: Rewrites überleben

Objektorientiert zum Teil

Design Patterns fast nicht vorhanden

SOLID Wer ist „SOLID?“

1999-2005

Wenn man Glück hat, ist der Code wenigstens zum Teil Objektorientiert. Design Patterns spielen eine kleine Rolle. Saubere Objektorientierung, sei es SOLID oder GRASP, findet noch nicht statt. Bei wem ist das so?

Page 42: Rewrites überleben

http://www.flickr.com/photos/theclyde

Big Ball of Mud

„Ein Big Ball of Mud ist ein planlos strukturierter, weitläufiger, schlampiger, mit Klebeband fixierter und Ballenpressdraht zusammengeschnürter Spaghetti-Code-Dschungel. Derartige Systeme tendieren zu ungehemmtem Wachstum und benötigen laufende Betreuung. Die in diesen Systemen enthaltenen Informationen sind wahllos über die entferntesten Elemente verteilt, oft bis zu dem Punkt, wo fast alle wichtigen Informationen global oder dupliziert sind. Die Architektur derartiger Systeme wurde vielleicht nie richtig definiert, und wenn doch ist sie bis zur Unkenntlichkeit erodiert. Programmierer mit einem Fetzen architektonischer Sensibilität meiden derartige Sümpfe. Nur diejenigen, die sich nicht um Architektur scheren und vielleicht sogar gerne Tag für Tag mühsam Löcher in undichten Deichen stopfen, arbeiten gerne mit solchen Systemen.“ Wer kennt solche Systeme? Wer hat schon selbst welche gebaut?

Page 43: Rewrites überleben

Schlechte Code-Qualität:

• lange Funktionen/Methoden• grosse, allmächtige Klassen• Komplexität jenseits von Gut und Böse• Low Cohesion• Strong Coupling•„Spaghetti SQL in Spaghetti PHP in Spaghetti HTML“

Da findet man vor allem die klassischen Dinge, die einem heute auch die CI anmahnen würde - schlechter Coding Style, schwer zu lesender Code, schwer zu lesende Methoden und schlechte, unvorhersehbare Struktur.

Page 44: Rewrites überleben

Aus dieser Zeit stammt auch noch unser fantastischer Ruf. Sind hier im Raum Ruby- oder Java-Entwickler? Ihr wisst, was ich meine.

Page 45: Rewrites überleben

2005-2011

„Framework-Ära“

Die nächste Zeit der PHP-Entwicklung war etwas besser. Da haben wir mit dem Zend-Framework, mit Symfony, mit Cake-PHP, Code-Igniter und vielen anderen sowohl brauchbare OO als auch Design Patterns bekommen. Also kein Big Ball of Mud, trotzdem macht sie Probleme.

Page 46: Rewrites überleben

2005-2011

„Framework-Ära“

• Framework ist nicht mehr zeitgemäß• Migration ist sehr aufwändig

Aber auch bei den Frameworks gibt es Probleme - denn auch diese Frameworks sind nicht mehr zeitgemäß, und man möchte eigentlich nicht mehr mit ihnen Entwicklen. Die Migration ist aber sehr mühsam, weil sich nicht nur bei den PHP-Versionen, sondern vor allem auch bei der Art zu Arbeiten viel geändert hat - Dependency Injection war zum Beispiel noch kein so grosses Thema wie heute.

Page 47: Rewrites überleben

Was macht der Code da?

Viel spannender sind aber meist die Fragen: Was macht der Code da? Warum gibt es das überhaupt?

Page 48: Rewrites überleben

Code is easier to write than to read.

Und das gemeine dabei ist: Code ist ohnehin schneller zu schreiben als zu lesen. Und gerade alter Code ist schlecht zu lesen, sprich: da braucht es schnell deutlich länger, den Code zu lesen als neu zu schreiben.

Page 49: Rewrites überleben

Unser Gehirn will auch mitspielen: Illusory SuperiorityPlanning FallacyOptimism Bias

Unser Gehirn spielt auch mit: 80% der Leute glauben, dass sie über dem Durchschnitt liegen. Es will mir also weissmachen, ich wäre etwas fähiger als der ursprüngliche Autor.Daneben gibt es die Planning Fallacy - ich unterschätze Aufgaben, die ich selbst erledigt, und der Optimism Bias, der mir erzählen will, wieviel besser die Welt wird, wenn erst einmal meine Lösung online ist.

Page 50: Rewrites überleben

<?php...auth_check();error_log(“ich bin hier“);...return $user_dates;...

auskommentiert

Aber wie sieht das konkret aus? Bei einer unserer Legacy-Lösungen, konkret PHProjekt, hatten wir zum Beispiel in der SOAP-API diesen Code. Ein Kollege sollte da einen Bug fixen, und irgendwie kam er nie in die error_log-Zeile, dabei sollten doch die Termine des Nutzers zurückgegeben werden. Also hat er die Zeile schlicht auskommentiert. Und ab diesem Moment konnte man über SOAP alle Daten von allen Nutzern ohne jeglichen Authentifizierung abfragen. Und wieder ging eine Security-Issue über die Ticker.

Page 51: Rewrites überleben

First Order Ignorance:

Ich weiß, dass ich etwas nicht weiß.

Technisch ist das First Order Ignorance. Ich weiss, dass es das gibt, ich weiss bloss nicht, was es macht. Mein Kollege hätte einfach in den Code reinschauen müssen, und schon hätte er gewusst, was dort passiert. Denn diese Stelle war ihm bekannt.

Page 52: Rewrites überleben

johann$ find . -name "*.php" -exec cat {} \; |wc -l 49129

PHProjekt 4 ist eine echt kleine Software. Weniger als 50.000 Zeilen Code in der gesamten Lösung. Trotzdem ist das echt viel zu lesen. Und deshalb lese ich das nicht. Und mache auch kein dickes UML mit dem ich die Wände plakatiere.

Page 53: Rewrites überleben

Second Order Ignorance:

Ich weiß nicht, was ich nicht weiß.Aber ich weiß wie ich es herausfinde.

Das ist Second Order Ignorance, die unknown Unknowns. Ich weiss gar nicht, welche Dinge ich alles nicht weiss in der Software. Da steckt so viel Kram drin, den ich nicht kenne, und wo ich auch keine Ahnung habe, wofür er gebraucht wird. Ich wüsste zwar, wie ich das herausfinde, aber ich investiere die Zeit nicht sondern fange lieber gleich an, mit was auch immer.

Page 54: Rewrites überleben

<?php...// important Bugfix, jph 2.5.2004...// on customer request, 5.5.2005 ...Und es gibt noch die Klasse von Verhalten, bei dem wir nicht wissen, was wir nicht wissen, aber auch keine Idee haben, wie wir das herausfinden. Der Bugfix von vor 7 Jahren?! Warum gab es den, wer wollte das?

Page 55: Rewrites überleben

Third Order Ignorance:

Ich weiß nicht, was ich nicht weiß, und ich weiß auch nicht wie ich es herausfinde.

Das ist Third Order Ignorance. Ich weiss nicht, was ich nicht weiss, und ich habe auch keinen Weg auf dem ich das erfahre.

Page 56: Rewrites überleben

Jede Änderung im alten Legacy-Codebrauchte 2 mal Zeit:

1. um herauszufinden, dass es geändert werden muss

2. um herauszufinden, wie es geändert werden muss

Und ich soll das jetzt spontan verstehen?

Und das gemeine ist: bei allen diesen Unklarheiten muss ich bedenken, dass sie schon zwei mal Zeit zum Verstehen gebraucht haben. Und jemand darüber nachgedacht hat. Und jetzt soll ich das, ohne den damaligen Kontext, spontan verstehen?

Page 57: Rewrites überleben

Regardless of what we discover, we understand and truly believe that everyone did the best job they could, given what they knew at the time, their skills and abilities, the resources available, and the situation at hand.

Kennt jemand diese Formulierung? Das ist die Prime Directive der Scrum-Retrospektiven. Und die gilt natürlich auch für alte Software. Jetzt kann man sagen: Ja, die hatten halt nicht die Zeit, die wir jetzt haben. Aber auch sie dachten damals, dass sie die Zeit haben würden, wie wir heute.

Page 58: Rewrites überleben

Schlechten Code wegwerfen und neu anfangen, diesmal sauber!

Uh, das ist aber viel Arbeit.

Poah, das werden wir nicht schaffen. Lieber auf Funktionalität fokussieren.

Hmpf, Deadline schon wieder verpasst, jetzt sind Überstunden angesagt.

Ok, Qualität ist fies, aber immerhin sind wir endlich released. Wenn auch mit

echt schlechtem Code.Am Ende hat man dann den Rewrite Cycle of Death ... :-) - mit wieder schlechtem Code.

Page 59: Rewrites überleben

Während des Rewrites wenig bis keine neuen Features.

Der Rewrite dauert deutlich länger.

Die Konkurrenz überholt.

Und nicht nur das passiert. Weil ich im Rewrite bin, sind die Leute, die sich mit der Software auskennen, für die neue Software gebunden, und in der bestehenden Applikation bewegt sich nur wenig. Zeitgleich dauert der Rewrite deutlich länger als erwartet. In Folge: die Konkurrenz überholt.

Page 60: Rewrites überleben

Die neuen Kollegen ohne Knowhow:

Wartung der Live-Applikation oder lieber in den strategisch

wichtigen Rewrite?

Doppelte Kosten pro Feature

Lösung: 2 Teams?

Die naheliegenste Lösung ist das doppelte Team. Das hat aber auch seine Probleme - denn ich brauche für die Weiterentwicklung das Knowhow der bestehenden Software - denn es ist komplex und tief - auf der anderen Seite will ich aber für die neue Software auch das Domainwissen aus der alten nutzen... eigentlich brauche ich doppelt so viele alte Leute. Und für die Rewrite-Phase selbst habe ich das Problem der doppelten Kosten - denn jedes neue Feature muss in der alten Software wie auch in der neuen bereitstehen.

Page 61: Rewrites überleben

?Die Frage ist also: wie komme ich aus der Nummer raus? Wie kann ich die Software so neu machen, dass ich das überlebe?

Page 62: Rewrites überleben

•Das Wissen in der Software

zu eigenem Wissen machen

•kontinuierlicher Feature-Flow

•keine doppelte Entwicklung

•am Ende eine wartbare Codebase

•in Zukunft preiswerte, schnelle Features

AufgabenstellungDas ist meine Aufgabenstellung:

Page 63: Rewrites überleben

Kontinuierliche Modernisierung/

Rewrite

•alles ist immer produktiv•kleine Inkremente•kontinuierlicher Featurestream

Und so komme ich dahin - indem ich kontinuierlich modernisiere, rewrite oder refaktoriere.

Page 64: Rewrites überleben

1.

Absichern der ApplikationCI Infrastruktur einführen

CD Infrastruktur einführen

Core-Workflows über Akzeptanztests sichern

Monitoring

Produktionsnahe Entwicklung

Etablieren einer CI- und CD-InfrastrukturWenn der alte Code testbar ist: Absicherung der Basisfeatures durch Akzeptanztests Monitoring etablieren (Responsivität, Logfiles, etc) Produktionsnahe Entwicklung über Vagrant etc - das gilt natürlich auch für Test.

Page 65: Rewrites überleben

2.

Größter gemeinsamer Nenner

Ist ein gemeinsames PHP möglich?

•bei Bedarf Alt-Applikation anheben

Symfony 5.3.3

Zend Framework 5.3.3

Laravel 4 5.3.7

Kann man ein gemeinsames PHP betreiben? Es gibt für den PHP CodeSniffer Checks, wo die alte Applikation den neuen PHP-Versionen widerspricht.

Page 66: Rewrites überleben

2.

Proxy-Lösung

Die neue Applikation ist ein Proxy vor der alten.

Nach und nach werden Teile aus dem Proxy in die neue Applikation gezogen

Wenn es nicht möglich ist, muss ich andere Wege gehen - und zum Beispiel die neue Applikation als Proxy zur alten Applikation betreiben. Oft muss ich mit regulären Ausdrücken Teile der Seite herausholen.

Page 67: Rewrites überleben

3.

Gemeinsames Frontend

Fallthrough-Router:

Alles, was die neue Applikation noch nicht selbst macht fällt zur alten Applikation durch.

Egal, ob ich die Applikationen direkt integrieren kann oder einen Proxy implementiere - ich habe in der neuen Applikation einen Falltrough-Router, der alle Themen, die die neue Applikation noch nicht selbst behandeln kann, einfach zur alten Applikation durchfallen lässt.

Page 68: Rewrites überleben

4.

Gemeinsame Infrastruktur: Sessions

Session-Bagging/Container:

Die neue Sessions finden in einem Namespace innerhalb der alten statt

Damit ich den Zustand der Applikation - wie zum Beispiel die Authentifizierung - gemeinsame verwalten kann, brauche ich auch einen gemeinsamen Zustand. Bei Symfony2 kann man das mit den Session-Bags lösen, bei Zend Framework mit den Session Containern. Beim Proxy braucht man ein Interface, das diese Daten über eine Schnittstelle steuern kann. Laravel bietet keine Namespaced Sessions, hier muss man selbst über eine Session-Facade und einen Hashkey Hand anlegen.

Page 69: Rewrites überleben

4.

Gemeinsame Infrastruktur: Datenzugriff

Gemeinsame Datenbank wenn möglich

Alternative: Migration mit Synchronisation für die Übergangszeit

Page 70: Rewrites überleben

5.

Featureflags

Features können per Flag aktiviert/deaktiviert werden

Switch zwischen alter/neuer Variante

Um die Lösung tatsächlich immer und für alle Stabil zu halten migriere ich hinter Featureflags. Sprich: es ist immer möglich, wahlweise den alten oder den neuen Code zu nutzen.

Page 71: Rewrites überleben

6.

Workflow

Test

Abstraction

Featureflag

Reengineering

Produktion

Aufräumen

pro Feature

Wenn ich die Infrastruktur soweit fertig habe, kann ich in die konkrete Entwicklung gehen. Ich beginne jeweils mit einer Testabsicherung des zu migrierenden Features. Sobald die Da ist, abstrahiere ich das Feature so, dass es für die alte und die neue Variante genutzt werden kann. Dann führe ich einen Umschalter ein, der wahlweise den alten oder den neuen Code nutzt, so dass die Kollegen immer Zugriff auf eine stabile Variante haben. Danach reengineere ich den Code und stelle ihn in Produktion, sobald er fertig ist. Wenn die neue Variante damit funktioniert lösche ich den alten Zweig aus den Featureflags. Was steht konkret hinter den Schritten?

Page 72: Rewrites überleben

6.1

Test

Ich etabliere Akzeptanz-Tests (zB Jasmine, Selenium, Behat) für das zu migrierende Feature

Akzeptanz-Tests, Service oder Unit-Test, je nach Möglichkeit

Page 73: Rewrites überleben

Branch by Abstraction

6.2Wenn ich beide Applikationen gemeinsam verwenden kann, nutze ich Branch by Abstraction. Ich führe eine Facade in der Mitte ein, greife auf Sie zu. Bei Symfony2 und Zend Framework bieten Services als Sammlung dieser Fassaden. Damit lässt sich die Serviceinfrastruktur der Applikation gut migrieren.

Page 74: Rewrites überleben

Abstraction: SOA

6.3

Ich führe einen REST-Layer ein.

Beide Seiten nutzen das REST-Layer für den Zugriff auf die Funktionalität.

Das ist eine der am weitesten verbreiteten Modernisierungs-Strategien - die Modernisierung zugunsten von Services. Bei uns ist das schon lange nicht mehr Soap, sondern im Regelfall REST. In diesem Fall führe ich einen REST-Layer ein.

Page 75: Rewrites überleben

Reengineering

6.4

Ich schreibe die neue Version hinter der Abstraction und hinter dem Featureflag. Alt und neu existieren parallel.

Branch By Abstraction oder Rest-Service

Page 76: Rewrites überleben

Produktion

6.5

Das neue Feature geht live und wird per Featureflag auch in der Produktion aktiviert.

Branch By Abstraction oder Rest-Service

Page 77: Rewrites überleben

Aufräumen

6.6

Wenn nach hinreichender Zeit keine Probleme (mehr) auftreten,wird sowohl der alte Code als auch das Featureflag entfernt.

Alte Routen löschen

Page 78: Rewrites überleben

7.

Bei Bedarf: Datenmigration

Wenn sich Schema oder Datenbanksystem ändern:

Synchronisierung für die Migrationsphase

Alte Routen löschen

Page 79: Rewrites überleben

8.

Organisation

Modernization Burn-Down

Modernization-BurnDown

Page 80: Rewrites überleben

Unsere Wins & FailsPHProjekt: OpenSource-Groupware

ca 150.000 Zeilen Code

Rewrite von Big Ball of Mud nach Zend Framework & Qualität

Nach 4 Jahren: guter Code, weniger Features, keine Nutzer

Medialösung

Page 81: Rewrites überleben

MediaCloud

ca 600.000 Zeilen Code

Rewrite nach SOA, sehr nah am Original

Time & Budget nicht gehalten

Problematische One-Time-Datenmigration

Unsere Wins & Fails

Medialösung

Page 82: Rewrites überleben

Grosses Dokumentationsystem

ca 1.000.000 Zeilen Legacy-Code in einem proprietären Framework

2012 nach Symfony 2 modernisiertin der Proxy-Variante

kontinuierliche Datenmigration

Unsere Wins & Fails

Dokumentenlösung

Page 83: Rewrites überleben

Infrastruktur kostet weniger Zeit als erwartet

Learnings

Wenn man eine langsame Modernisierung macht: die Infrastruktur kostet nicht so viel Zeit - und es macht sogar Spass. Und ein guter Nebeneffekt: die Einführung von Tests verzinst sich schnell, es wird frühzeitig spürbar, dass weniger Bugs auftreten.

Page 84: Rewrites überleben

Raus aus der

Black Box!

Learnings

Erste und wichtigste Lehre: Raus aus der Black Box. Immer möglichst viel echte Nutzer kontinuierlich auf der Software.

Page 85: Rewrites überleben

Learnings

Die ersten Features kosten deutlich mehr Zeit als erwartet

Am Anfang dauert es sehr lange, weil jedes Feature seine Grundlagen mitzieht. Hier passieren grössere Reengineerings, die in Abhängigkeit voneinander stattfinden.

Page 86: Rewrites überleben

Man wird mit der Zeit deutlich schneller

Learnings

Am Anfang migriert man mit jedem Feature einen grossen Teil der Infrastruktur, und diese Phase ist wirklich zäh. Aber zum Ende hin, wenn viele abhängige Komponenten häufig schon migriert sind, beschleunigt sich die Migration sehr.

Page 87: Rewrites überleben

Never do a Rewrite!

Page 88: Rewrites überleben

Ok, almost never.

Page 89: Rewrites überleben

Wann mache ich trotzdem einen Rewrite?

Die Software wird in Wahrheit gar nicht genutzt

Es wird nur ein kleiner Teil der Software genutzt

Die Software ist klein.

Ich gehöre zu den 4%. It‘s magic!

Page 90: Rewrites überleben

Modernisierung FTW!

Kontinuierlich, immer in Produktion

Es geht auch mit inkompatiblen PHP-Versionen

Programmieren um wegzuwerfen spart Zeit und Geld.

Page 91: Rewrites überleben

Qualität ist die Übereinstimmung von Produktleistung und Kundenwunsch.

Reminder

Lüönd, 2004 - Qualität ist nicht der SourceCode.

Page 92: Rewrites überleben

Danke!