Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Continuous Delivery für Legacy Systeme

Richard
February 21, 2019

Continuous Delivery für Legacy Systeme

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. Continuous Delivery
    für Legacy Code
    Richard Gross
    @arghrich

    View full-size slide

  2. Grundlage
    09.11.18 Richard Gross @arghrich 2
    Richard
    Software Archäologe
    Audits
    Sanierungsprojekte
    Der schlimmste
    Legacy Code den
    ich je gesehen habe

    View full-size slide

  3. 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

    View full-size slide

  4. 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

    View full-size slide

  5. 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

    View full-size slide

  6. 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

    View full-size slide

  7. 09.11.18 Richard Gross @arghrich 8
    Legacy
    Code
    1
    Delivery
    für
    2
    Continuous
    3

    View full-size slide

  8. 09.11.18 Richard Gross @arghrich 9
    Legacy
    Code
    1
    Delivery
    für
    2
    Continuous
    3

    View full-size slide

  9. 09.11.18 Richard Gross @arghrich 10
    Legacy
    Code
    1

    View full-size slide

  10. 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

    View full-size slide

  11. 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

    View full-size slide

  12. 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

    View full-size slide

  13. 10 Kundeninstallationen
    09.11.18 Richard Gross @arghrich 14
    Frobozz
    Co.
    Oceanic
    Airlines

    Umbrella
    Corp
    Soylent
    Corp

    View full-size slide


  14. 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

    View full-size slide

  15. 10x
    Softwarestände
    10x
    DbSchemata
    09.11.18 Richard Gross @arghrich 16
    Gleich Gleich

    View full-size slide

  16. Oh Boy
    09.11.18 Richard Gross @arghrich 17

    View full-size slide

  17. Burn It!!!
    09.11.18 Richard Gross @arghrich 18

    View full-size slide

  18. 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

    View full-size slide

  19. 09.11.18 Richard Gross @arghrich 20
    Legacy
    Code
    1
    Delivery
    für
    2
    Empfehlungen für
    Team & Vorgehen

    View full-size slide

  20. Signifikante
    Veränderung
    im Team und in der
    Kultur notwendig
    09.11.18 21
    Richard Gross @arghrich

    View full-size slide

  21. 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.

    View full-size slide

  22. Neues Co-located
    Cross-functional
    Team mit
    gemeinsamen Ziel
    09.11.18 23
    DEV TEST OPS
    Endkunde

    View full-size slide

  23. 09.11.18 24
    DEV TEST OPS
    Endkunde
    Collective
    Legacy, Test, Product
    Ownership

    View full-size slide

  24. 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

    View full-size slide

  25. 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

    View full-size slide

  26. Anti-Pattern: Folder Version
    09.11.18 Richard Gross @arghrich 27

    View full-size slide

  27. Anti-Pattern: File Version
    09.11.18 Richard Gross @arghrich 28

    View full-size slide

  28. 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

    View full-size slide

  29. (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

    View full-size slide

  30. (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

    View full-size slide

  31. Anti-Pattern:
    Branch by Obscurity
    • Branch by (Un) Comment
    • Branch by Entity-Id
    09.11.18 Richard Gross @arghrich 32

    View full-size slide

  32. (D) Archäologie
    https://fs.blog/2013/07/the-difference-between-science-and-engineering/
    Archeological Inquiry

    View full-size slide

  33. 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

    View full-size slide

  34. 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

    View full-size slide

  35. (E) Sanierung
    Prio
    1Technisch und/oder
    fachlich obsoleten
    Code entfernen
    09.11.18 Richard Gross @arghrich 36

    View full-size slide

  36. 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

    View full-size slide

  37. 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

    View full-size slide

  38. 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

    View full-size slide

  39. Golden Master für Refactoring
    09.11.18 Richard Gross @arghrich 40
    Saniertes System
    Legacy System
    Input for UI/API/DB
    Output
    Output
    Compare

    View full-size slide

  40. 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

    View full-size slide

  41. 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

    View full-size slide

  42. 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

    View full-size slide

  43. 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

    View full-size slide

  44. 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

    View full-size slide

  45. Use Strangler Application
    for big & new features
    https://paulhammant.com/2013/07/14/legacy-application-strangulation-case-studies/

    View full-size slide

  46. 09.11.18 Richard Gross @arghrich 47
    Legacy
    Code
    1
    Delivery
    für
    2
    Continuous
    3

    View full-size slide

  47. 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

    View full-size slide

  48. 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

    View full-size slide

  49. 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

    View full-size slide

  50. Ken Mugrage
    @kmugrage
    It‘s not CD if you can‘t deploy to
    production right now
    09.11.18 Richard Gross @arghrich 51

    View full-size slide

  51. Done
    Fragen, Anmerkungen, Mitleid? J
    30 Mio
    410
    Mitarbeiter*innen
    9. Jahr
    23
    Nationen
    300
    Wochen
    München, Augsburg,
    Berlin, Frankfurt

    View full-size slide

  52. 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

    View full-size slide

  53. 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

    View full-size slide