Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Continuous Delivery für Legacy Systeme (v1) 🇩🇪 ...

Richard
February 21, 2019

Continuous Delivery für Legacy Systeme (v1) 🇩🇪 @Entwicklertag 2019

Gehalten auf dem Entwicklertag Frankfurt 2019: https://entwicklertag.de/frankfurt/2019/continuous-delivery-für-legacy-systeme

Basierend auf einer wahren Begebenheit.

Ich bin Softwarearchäologe. Ich habe wirklich Spaß daran alten Code auszugraben und wieder fit zu machen. Gleichzeitig freue ich mich auch über Neuentwicklungen, bei denen die Software auf Continuous Delivery ausgelegt werden kann. Doch ist Continuous Delivery wirklich nur für Projekte auf der grünen Wiese geeignet? In meinem vorigen Projekt konnte ich das untersuchen anhand der schlimmsten Codebasis die ich je gesehen habe.

Ein Monolith aus 5 Millionen Zeilen Code in verschiedenen Sprachen (Java, Classic ASP, VBA, JavaScript, T- und PL-SQL). Die Fachlichkeit erstreckte sich vom UI (Scripting, SQL Queries) bis zur Datenbank (Stored Procedures). Keine Versionskontrolle, keine Testabdeckung und keine Testumgebung. Die Mandantenfähigkeit erhielt man in dem man Code ein oder auskommentierte. Dieses System war eine große Herausforderung.

Ein Neubau war keine Option. Etwa 20 Menschen hatten gut 15 Jahre Entwicklungszeit investiert. In 9 Monaten musste das System für 10 Mandanten live sein. Es sollte in der Cloud betrieben werden und die Infrastruktur war nicht spezifiziert. Es gab viele Probleme zu lösen.

Richard

February 21, 2019
Tweet

More Decks by Richard

Other Decks in Technology

Transcript

  1. Grundlage 09.11.18 Richard Gross @arghrich 2 Richard Software Archäologe Audits

    Sanierungsprojekte Der schlimmste Legacy Code den ich je gesehen habe
  2. Dylan Beattie @dylanbeattie Legacy Code is code that’s too scary

    to update and too profitable to delete. Michael Feathers @mfeathers Legacy Code is code without tests. 09.11.18 Richard Gross @arghrich 3
  3. Legacy Code is code that’s too scary to update and

    too profitable to delete. Continuous Delivery If somebody thinks of a good idea, how do we [make it feasable to] deliver it to users as quickly as possibly? 09.11.18 Richard Gross @arghrich 4 Dylan Beattie @dylanbeattie
  4. Local Env Source Repository Artifact Repository Commit Stage Acceptance Manual

    Test Env … Staging Env Prod Env Self-Service Automatic Dave Farley - Optimising Continuous Delivery CD Pipeline
  5. CD Principles Four Principles of Low-Risk Software Releases by Jez

    Humble • Low-Risk Releases Are Incremental • Decouple Deployment and Release • Focus on Reducing Batch Size • Optimize for Resilience
  6. Ambitionierte Ziele 09.11.18 Richard Gross @arghrich 11 Alter Dienstleister (40

    Personen) Delayed, Buggy releases 15y Development Neuer Dienstleister (10 Personen) =unser Kunde Quality Releases New Features … 10x On-Premise … 10x Azure Cloud
  7. 5M 4M LoC Lieferung 09.11.18 Richard Gross @arghrich 12 T-SQL

    JavaScript VBA C# Asp.NET + C# Classic Asp + VBScript Excel WinForms + C# Fat Client Webservice Database Kein Code geliefert MIA Jobs Website
  8. Unsichtbare Aufrufe 09.11.18 Richard Gross @arghrich 13 Excel Webservice Website

    Fat Client Jobs C C C Database C C C C C (BL in) UI / API C BL DB T P T
  9. … Oceanic Airlines Soylent Corp 10x Softwarestände 09.11.18 Richard Gross

    @arghrich 15 Frobozz Co. Umbrella Corp Gleich C/P Copy/ Paste Feature Copy/Paste
  10. Burn It!!! Stop Big Bang Rewrites The True Cost of

    Rewrites Features Releases over time Catch Up Missing Features Sub-Par Parity Enhancements Planned Rewrite Actual Features Undiscovered Scope Old App Adoption
  11. 09.11.18 Richard Gross @arghrich 22 Henrik Kniberg @henrikkniberg Culture is

    the sum of everyone's attitude and actions, so model the behaviour you want to see! Also Verhalten beobachten: • Existiert Angst vor Fehlern? • Wie wird deployed? • Gibt es ein Qualitätsverständnis? • Will das Team dazulernen? • Wie handelt das Management? • uvm.
  12. Version Everything Sollte man nicht sagen müssen, aber leider gilt:

    • Code – oft nicht versioniert • Config – sehr selten • Deploymentscripte – Fast nie • Infrastruktur - Nie 09.11.18 Richard Gross @arghrich 25
  13. Anti-Pattern: Append-only Coding Wo muss das Feature rein: • Mein

    Code? if(…){ // old code } else { // new code } • Anderer Code? Copy File Planner.asp & Modify MyPlanner.asp 09.11.18 Richard Gross @arghrich 26
  14. Delivery: 6 Team Tätigkeiten 09.11.18 Richard Gross @arghrich 29 (A)

    Vollständige Lieferung Verifizieren (C) Konfigurier- barkeit herstellen (D) Archäologie (E) Sanierung (F) Weiter- entwicklung (B) Infrastruktur aufbauen
  15. (B) Infrastruktur • Dev/Prod-Parity • Phoenix Server • Jeder Build

    ist potentielles Release • Unternehmen vom Mehrwert von Infrastructure Automation überzeugen • Standard IA-Tools nutzen • Nicht: Ansible nachbauen mit Powershell Scripten 09.11.18 Richard Gross @arghrich 30
  16. (C) Konfigurierbarkeit •Eine konfigurierbare Software, nicht 10 fest-verdrahtete •z.B.: msdeploy.exe,

    sqlpackage.exe • (String) replacement bei publish • Umgebungsvariablen 09.11.18 Richard Gross @arghrich 31
  17. Anti-Pattern: Branch by Obscurity • Branch by (Un) Comment •

    Branch by Entity-Id 09.11.18 Richard Gross @arghrich 32
  18. Lernen mit Inverse Object Mother • Anwendung Starten mit leerer

    Datenbank und ohne Domain Modell • UseCase klicken • Fehler analysieren • Domain Modell erweitern um Erkenntnis • Benötigten Zustand in DB mit Modell herstellen • Dokumentieren als Test • Repeat 09.11.18 Richard Gross @arghrich 34
  19. Inverse BDD ist schwierig • „Gegeben keine Ahnung“ • „Wenn

    ich hier drücke“ • „Dann kommt da hinten ein Maulwurf raus“ • Super, dass automatisieren wir jetzt … • Gherkin wird für Data-Scripting missbraucht • BDD braucht: Was will wollte der Anwender? 09.11.18 Richard Gross @arghrich 35
  20. Obsoleten Code finden • Anwenderumfragen • IDE gibt Vorschläge •

    grep auf FROM, JOIN, INSERT, UPDATE, DELETE und rein in Excel • Analytics / Activity-Log für Seiten einbauen • Legacy Toggles • Vergessen Teile zu deployen 09.11.18 Richard Gross @arghrich 37
  21. Startpunkt festlegen • Linter • Profiler • CodeMaat https://github.com/ adamtornhill/code-maat

    • Structure101 http://structure101.com/ • SonarQube https://www.sonarqube.org/ • CodeCharta https://github.com/ MaibornWolff/codecharta Art by Zaufishan
  22. Startpunkt festlegen • Linter • Profiler • CodeMaat https://github.com/ adamtornhill/code-maat

    • Structure101 http://structure101.com/ • SonarQube https://www.sonarqube.org/ • CodeCharta https://github.com/ MaibornWolff/codecharta 09.11.18 Richard Gross @arghrich 39
  23. Golden Master für Refactoring 09.11.18 Richard Gross @arghrich 40 Saniertes

    System Legacy System Input for UI/API/DB Output Output Compare
  24. Branching Strategy for Refactoring • Don‘t Branch • Don‘t Branch

    • Don‘t Branch •That‘s Ci =Continuous Isolation Strategy by Dave Farley 09.11.18 Richard Gross @arghrich 41
  25. Connascence als Refactoringhilfe 2 elements A,B are connascent if there

    is at least 1 possible change to A requires a change to B in order to maintain overall correctness Jim Weirich‘s “Grand Unified Theory of Software Development” J Meilir Page-Jones
  26. Connascence of Meilir Page-Jones | Jim Weirich‘s “Grand Unified Theory

    of Software Development” J • Identity • Value • Timing • Execution order • Algorithm • Position • Meaning • Type • Name Strong Weak Refactor this way
  27. 3-axes of Connascence Strength Level How explicit Locality How close

    Degree Number of Impacts Meilir Page-Jones | Jim Weirich‘s “Grand Unified Theory of Software Development” J
  28. Refactoring Big Ball of Mud Isolate • Stable von Unstable

    • R/W mit Fassaden trennen • Interfaces • Dependency Injection • Table Views Small • Baby Steps • Feathers Techniken • Mob Programming 09.11.18 Richard Gross @arghrich 45 • Branch by abstraction • Parallel Change • Strangler Application Big
  29. Legacy Delivery 09.11.18 Richard Gross @arghrich 48 • Minimum Time

    to UAT/Prod 10min 10 minutes for Build • Regular Time to UAT 50min 10: Build | 20: DB Migrate INT | 20: DB Migrate STAGE • Nightly Infrastructure Updates 2h 30: Powershell | 60: DB Create + Init | 20: DB Migrate • Canary Builds & Releases wären besser • Alle 2 Wochen 1 Tag manuelle Testphase • Perspektivisch durch mehr E2E ersetzen
  30. Lohnt sich das? • Anwender hatten aufgegeben à wir gehen

    Bugs auch nach • Stabiler als jemals zuvor • Niemand weiß was „so wie bisher“ bedeutet à wie soll man das neu bauen? • Hätte man auch mit Anforderungen nicht in einem Jahr neu bauen können • Fließender (Dienstleister-)Übergang à min. Feature Freeze 09.11.18 Richard Gross @arghrich 49
  31. CD für Legacy Tätigkeiten • (A) Lieferung • (B) Infrastruktur

    • (C) Konfigurierbarkeit • (D) Archäologie • (E) Sanierung • (F) Weiterentwicklung Erfolgsfaktoren • Mut • Team • Mut zum Mob • Infra.-Automation • Pipeline • Connascence • Strangler Application 09.11.18 Richard Gross @arghrich 50
  32. Ken Mugrage @kmugrage It‘s not CD if you can‘t deploy

    to production right now 09.11.18 Richard Gross @arghrich 51
  33. Done Fragen, Anmerkungen, Mitleid? J 30 Mio 410 Mitarbeiter*innen 9.

    Jahr 23 Nationen 300 Wochen München, Augsburg, Berlin, Frankfurt
  34. Reading • https://trello.com/b/Fdd876S8/continuous- delivery-checklist-template • Uvm. • Ich hätte nicht

    gedacht, dass ich diese Folie zeigen werde 09.11.18 Richard Gross @arghrich 53
  35. Connascence of Meilir Page-Jones | Jim Weirich‘s “Grand Unified Theory

    of Software Development” J • Name: variable, method, SQL Table • Type: int, String, Money, Person • Meaning: what is true,‘YES‘,null,love • Position: order of value • Algorithm: encoding, SPA vs Server • Execution (order): one before other • Timing: doFoo() in 500ms | doBar() in 400ms • Value: constraints on value, invariants • Identity: reference same entity Weak Strong Static Dynamic