Anwendungen mit schwerer Vererbung. UnterstĂŒtzung oder Restaurierung?

Bild



Hallo Habr! Auf dem Luxoft TechFest am 28. Januar sprach Mikhail Zankovich, Senior Team Lead bei Luxoft , ĂŒber Anwendungen mit schwerer Vererbung. Heute teilt er zusĂ€tzliche Gedanken mit, die in den Inhalt dieses Berichts verwickelt sind und wĂ€hrend des Treffens eine ziemlich hitzige Diskussion ausgelöst haben.



Welche Emotionen und Assoziationen ruft der Satz "Wir haben ein Legacy-Projekt" in Ihnen hervor? Meistens - mangelnde Struktur, Chaos, jede Menge Code ohne Papiere, Horror, architektonische Anarchie, Ekel, ein Meer von KrĂŒcken, muss man rennen! Meine GefĂŒhle: „Oh! Endlich etwas Interessantes. Lass es funktionieren! " Ich vermute, dass dies eine sehr ungewöhnliche Reaktion ist.

In diesem Artikel werde ich versuchen, eine andere Ideologie der Arbeit mit dem Erbe aufzudecken. Lassen Sie es uns als "Software-Wiederherstellung" bezeichnen. Ich habe nicht vor, Ihre Einstellung zu Legacy zu Àndern, aber wenn Sie es schaffen, zumindest einen Anflug von Zweifel daran zu sÀen, dass Legacy interessant sein könnte, werde ich mich freuen.



Typisches Erbe



Was ist VermĂ€chtnis? Nach meiner Erfahrung können Sie die folgende Checkliste fĂŒr die Einhaltung Ă€lterer Produkte erstellen:



  • .

    .. , , .


  • .

    , black-box. . .
  • .

    , .
  • .

    . / ..


All dies fĂŒhrt dazu, dass es mit jeder Version immer schwieriger wird, ein solches Projekt zu pflegen, genau wie das Ausarbeiten neuer Funktionen / neuer Anforderungen. Jede Änderung wird zu einem Reverse Engineering mit obligatorischen Regressionstests usw. Infolgedessen wird die Wartung des Projekts teuer und in seiner aktuellen Form „eingefroren“, wobei Änderungen minimiert werden.



Aber warum erscheinen Àltere Produkte?



Selten schafft ein Team bewusst und zielgerichtet ein Produkt von geringer QualitÀt. Meistens ist dies das Ergebnis von Möglichkeiten, die durch die aktuelle Situation im Projekt begrenzt sind.



Es gibt keine klaren Anforderungen - es gibt keine Möglichkeit eines ausgewogenen Designs der AnwendungsfunktionalitÀt.



StĂ€ndig wechselnde Anforderungen, unklare Formulierungen, enge Implementierungsfristen und eine stĂ€ndig wachsende technische Verschuldung sind deutliche Anzeichen fĂŒr agile Entwicklungsprozesse in einem Team, das sich nicht vollstĂ€ndig an diese „agilen“ AnsĂ€tze anpassen konnte. Und von "flexibel" funktionieren nur "sich schnell Ă€ndernde Anfragen aus dem GeschĂ€ft".



Dies fĂŒhrt hĂ€ufig zu einer erhöhten Rotation innerhalb des Teams, was sich wiederum nicht positiv auf die QualitĂ€t auswirkt. Stellen Sie sich vor, ein neuer Spezialist tritt dem Team bei, zwei oder drei Monate lang vertieft er sich nur in den Prozess, dann implementiert er anderthalb oder zwei Monate lang eine Art von FunktionalitĂ€t und bereitet sich darauf vor, das Projekt zu verlassen. Er interessiert sich nicht fĂŒr ein QualitĂ€tsprodukt, eine vollstĂ€ndige Dokumentation seines Teils, den Wissenstransfer an Kollegen usw. Fachwissen ist verschwommen.



Irgendwann wird eine fatale Entscheidung getroffen: Es ist einfacher zu ersetzen / auszuschalten als zu begleiten. Und das Projekt tritt in die Phase „geringer Wartungsaufwand“ ein, wenn es auf der Basis von Resten unterstĂŒtzt wird, um Änderungen zu minimieren und zusĂ€tzliche „KrĂŒcken“ zu erstellen, die neue Anforderungen schnell, aber schlecht implementieren. Warum hohe QualitĂ€t? Das Produkt wird sich Ă€ndern. In diesem Modus kann das Produkt viele Jahre ĂŒberleben, mit "KrĂŒcken" ĂŒberwachsen und monströser werden.



Zusammenfassend lassen sich die folgenden HauptgrĂŒnde fĂŒr die Entstehung von Legacy-Produkten identifizieren:



  • enge Fristen fĂŒr die Implementierung der FunktionalitĂ€t;
  • Fehlen klarer Anforderungen / sich stark Ă€ndernde Anforderungen;
  • erhöhte Rotation innerhalb des Teams;
  • unsachgemĂ€ĂŸe Planung des Lebenszyklus.


Wir fĂŒgen hier den Grad der beruflichen Entwicklung von Spezialisten in diesem Moment hinzu. Öffnen Sie Ihr Projekt vor fĂŒnf oder zehn Jahren. Ich bin sicher, Sie können leicht Elemente finden, die Sie jetzt anders implementieren wĂŒrden.



Wir nehmen also als Axiom: "Der Code wird nicht von Natur aus schlecht erstellt". Dies bedeutet, dass jedes Produkt eine Idee hatte. Und wenn der Code in Produktion ging, funktionierte er und befriedigte die damaligen Anforderungen des Unternehmens.



Escort Ansatz



Die Aufgaben der Kunden sind recht einfach: das Erbe funktionsfĂ€hig zu halten, ohne die aktuellen GeschĂ€ftsprozesse zu stören (von denen einige im Allgemeinen niemandem bekannt sind), wĂ€hrend die FunktionalitĂ€t gemĂ€ĂŸ den neuen Anforderungen entsprechend dem Budget entwickelt wird ist höchstwahrscheinlich begrenzt.



Der typische Ansatz eines Teams, das ein Projekt startet, besteht darin, die Situation langsam, aber sicher weiter zu verschlimmern. BerĂŒhren Sie nicht zu viel, Ă€ndern Sie nur das, was gefragt wird, und nur, wenn Sie gefragt werden. Wenn das Modul funktioniert, aber eine Änderung der Logik erfordert - lassen Sie es und berĂŒhren Sie es nicht - ist es besser, ein anderes zu erstellen, aber mit der erforderlichen Logik. Das Chaos wĂ€chst, die App wird komplizierter.



Der Ansatz des Restaurators



Der Ansatz eines Software-Restaurators besteht darin, herauszufinden, welche Art von Mechanismus sich davor befindet. Was war die Hauptidee hinter seinen Schöpfern. Versuchen Sie, alles Unnötige abzuschneiden und das Beste zu behalten. Wenn Sie die vorhandene Struktur Ă€ndern, ist sie Ă€ußerst vorsichtig und achtet auf die Details. Kein einziges Detail, das sich auf das System auswirkt, sollte aus der Sicht des Restaurators ausgeblendet werden. Die eingefĂŒhrten Änderungen werden zuerst gemĂ€ĂŸ der Wartungslogik ausgearbeitet, und dann wird eine Analyse durchgefĂŒhrt, um die Möglichkeit der Implementierung einer vollwertigen Lösung zu bestimmen.



Dies ist eine schwierige und zeitaufwĂ€ndige Aufgabe. Nicht jeder Entwickler ist bereit und vor allem wirklich in der Lage, Wiederherstellungen durchzufĂŒhren. Die Anforderungen an das Niveau des Restaurators sind um eine GrĂ¶ĂŸenordnung höher als fĂŒr einen normalen Entwickler. Ohne Erfahrung in realen Projekten, ohne zu verstehen, wie sich Systeme entwickeln können, ohne Kollision nicht nur mit den besten AnsĂ€tzen in der Praxis, sondern auch mit eindeutig erfolglosen Implementierungen, macht eine Wiederherstellung keinen Sinn.

Anstelle des typischen ersten Drangs „Ja, das sind KrĂŒcken! Hier muss alles neu geschrieben werden! " - Ein echter Restaurator wird die Frage stellen: „Warum wurde das so gemacht? Wie genau war geplant, es zu benutzen? " Und erst nachdem sichergestellt wurde, dass es keine offensichtlichen Voraussetzungen fĂŒr die Erstellung eines solchen Codes gab, kann der Restaurator ausrufen: „Ja, das sind KrĂŒcken! Hier muss alles neu geschrieben werden! “Und mit einem GefĂŒhl der Leistung kann er unnötiges Wachstum auf dem verknöcherten Framework der Software wirklich abbrechen und das Objekt der Wiederherstellung besser und von höherer QualitĂ€t machen.



Dies kommt jedoch selten vor, obwohl es dem Restaurator unbeschreibliche Freude bereitet. Meistens mĂŒssen Sie das Gewirr von AbhĂ€ngigkeiten zwischen verschiedenen Modulen entwirren. Es ist nicht ungewöhnlich, dass sich die Gewinde weit ĂŒber den Verantwortungsbereich der zu zerlegenden Komponente (und manchmal des Systems) hinaus erstrecken. Und all diese Feinheiten der Modulbeziehungen mĂŒssen bei der Wiederherstellung berĂŒcksichtigt werden.



Bild



Somit arbeitet der Software-Restaurator an der Schnittstelle von Entwicklung, Architektur, GeschĂ€ftsanalyse, Test und Medizin. Und es ist schwer zu sagen, welche FĂ€higkeiten aus den ausgewiesenen Bereichen die höchste PrioritĂ€t haben. Es muss ein gewisses Gleichgewicht zwischen ihnen bestehen, gewĂŒrzt mit dem ehrlichen Wunsch, sich auf die Wiederherstellung einzulassen. Was hat Medizin damit zu tun? Das Hauptprinzip des Restaurators ist also „primum non nocere“ - erstens keinen Schaden anrichten.



TatsĂ€chlich wird dieser Ansatz anhand spezifischer Beispiele weiter betrachtet, wobei das typische Erbe, das von den frĂŒheren technischen EigentĂŒmern von Systemen geerbt wurde, schrittweise zerlegt und wiederhergestellt wird. Lassen Sie uns anhand konkreter Beispiele sehen, warum alle oben genannten FĂ€higkeiten wichtig sind.



Wiederherstellung des Data Warehouse



Was speichert das System?



Bei der Landung in einem neuen Projekt achtet der Restaurator auf die vom System verarbeiteten Objekte. Es dauert mindestens einige Monate, bis Sie vollstÀndig in GeschÀftsablÀufe und Quellcode eingetaucht sind, insbesondere wenn keine normale Dokumentation vorhanden ist.



Eine der ersten Aufgaben eines Restaurators besteht darin, die Wirksamkeit des Tresors zu beurteilen. Können Sie etwas verbessern, ohne sich auf ein VerstĂ€ndnis der GeschĂ€ftsprozesse verlassen zu mĂŒssen? Ein typischer Schmerzpunkt eines Data Warehouse hĂ€ngt hauptsĂ€chlich mit dem Volumen dieser Daten zusammen. Je grĂ¶ĂŸer das Volumen ist, desto höher sind die Betriebskosten des Systems.



Der zweite Schmerzpunkt ist das Wachstum dieses Volumens, was sich in erster Linie negativ auf die Leistung des Systems auswirkt. Höchstwahrscheinlich gibt es bereits einige Methoden, um Informationen im System zu speichern, aber wie effektiv sind sie?



Alle hier betrachteten Praktiken sind eher auf klassisches RDBMS anwendbar, aber der Ansatz ist fĂŒr No-SQL-Lösungen nicht sehr unterschiedlich.



Eine der Haupttaktiken des Restaurators in dieser Richtung ist die Erstellung einer Überwachung von Informationsspeicherobjekten. Bei klassischem DBMS TabellenĂŒberwachung.



Es wird ein Framework benötigt, mit dem die Systemmetadaten regelmĂ€ĂŸig Daten zu zwei trivialen Parametern erfassen können - der Datenmenge und der Anzahl der Elemente in jeder Tabelle. Die Frequenz muss manuell ausgewĂ€hlt werden (mehr dazu weiter unten), basierend auf den Eigenschaften des Systems. Eine typische Anlaufzeit von 24 Stunden reicht fĂŒr die Basisanalyse aus.



Daten analysieren



Was tun mit den Daten? Wonach schauen? Der erste Moment besteht darin, die "schwersten Objekte" zu identifizieren. In der Praxis funktioniert die Standardregel 20/80 - nicht mehr als 20 Prozent der Objekte belegen mehr als 80 Prozent des Speicherplatzes. Auf diese Weise können Sie den Analysebereich in der ersten Phase erheblich einschrÀnken.



Je lĂ€nger und detaillierter solche Statistiken gesammelt werden, desto deutlicher spiegelt sich das Verhalten des Systems wider. Die Erfahrung hat gezeigt, dass der empfohlene Zeitraum mindestens zwei Wochen betrĂ€gt. Die Hauptidee besteht darin, arbeitsfreie Tage / ZeitrĂ€ume zu "verknĂŒpfen", innerhalb derer Mechanismen zum Bereinigen und Archivieren von Informationen am hĂ€ufigsten implementiert werden.



Das Framework ist also geschrieben und der Restaurator wartet zwei Wochen auf die Ergebnisse? NatĂŒrlich nicht. Es kĂ€mpft nicht gegen die Ideologie des Restaurators. Mit dem ersten Datenblock in der Hand können Sie einige grundlegende Analysen durchfĂŒhren. NĂ€mlich - um das VerhĂ€ltnis des belegten Raums zur Anzahl der gespeicherten Objekte (Zeilen) zu sehen. Je grĂ¶ĂŸer dieser Wert ist, desto wahrscheinlicher ist es, dass hier BLOB-Felder gespeichert werden. Und genau diese Tabellen und Felder werden fĂŒr den Restaurator zum Gegenstand von Forschung und Analyse.



SchlĂŒsselfragen: Wie oft greifen GeschĂ€ftsprozesse tatsĂ€chlich auf diese Objekte zu? Der EigentĂŒmer des Systems, das vorhandene Team, kann solche Punkte beleuchten. Und plötzlich (und in der Praxis sehr oft) stellt sich heraus, dass solche Felder Informationen speichern, die fĂŒr das Unternehmen nicht wichtig sind: SpeicherauszĂŒge von Objekten / Nachrichten zur Analyse durch das Entwicklungsteam, Benutzerkommentare, die nur beim Erstellen eines Auftrags angezeigt werden usw.



Der nĂ€chste Schritt: Wenn die Daten nicht hĂ€ufig verwendet werden oder keinen eindeutigen GeschĂ€ftswert haben, können Sie sie in das Archiv verschieben. Gleichzeitig ein grundlegender Ansatz, bei dem ein monolithischer Tisch in Teile geteilt wird, Blobs auf ein billigeres / langsameres Medium verschoben werden, wĂ€hrend gleichzeitig die ursprĂŒngliche Schnittstelle des Tisches erhalten bleibt (der Hauptpunkt ist, dass es keine verlĂ€sslichen Informationen ĂŒber alle gibt Prozesse, die auf diese Informationen zugreifen, was bedeutet, dass Änderungen ihnen nicht schaden sollten) - können ein interessantes und komplexes technisches Problem sein.



Eine weniger interessante, aber ebenso nĂŒtzliche Aufgabe besteht darin, das integrierte Datenspeichersystem zu verwenden, um die Werte bestimmter Felder zu archivieren. Beispielsweise verfĂŒgt Sybase ASE ĂŒber die Funktion ASE_Compression. Mit Mongo DB können Sie Komprimierungsoptionen fĂŒr Sammlungen usw. festlegen. Nahezu jedes Datenspeichersystem bietet die Möglichkeit einer zusĂ€tzlichen Datenkomprimierung „unter der Haube“. Die FunktionalitĂ€t funktioniert fĂŒr externe Systeme transparent und erfordert keine drastischen Änderungen. In der Praxis (insbesondere auf Legacy-Systemen) werden solche Datenkomprimierungsoptionen standardmĂ€ĂŸig nicht verwendet.



NatĂŒrlich muss der Restaurator bei der Anwendung der Komprimierung zunĂ€chst die Auswirkungen des Ansatzes auf die Leistung bewerten. Dazu mĂŒssen wichtige Leistungsindikatoren des Systems erarbeitet werden, oder im Extremfall mĂŒssen Elemente von Regressionstests vorhanden sein.



Im Allgemeinen gibt es einige Wochen lang etwas zu tun, wÀhrend vollstÀndige Statistiken zu Objekten gesammelt werden.



Große Statistiken: worauf zu achten ist



Nachdem der Restaurator ĂŒber einen langen Zeitraum Statistiken erhalten hat, versucht er herauszufinden, was mit der Dynamik des genutzten Raums passiert. Alle Werte fĂŒr eine Tabelle / ein Objekt werden auf den ursprĂŒnglichen Wert normiert. Dies ermöglicht es, die relative Zunahme der Daten genau abzuschĂ€tzen und die sich am intensivsten Ă€ndernden Objekte zu identifizieren.



Das generierte Profil entspricht höchstwahrscheinlich einem der folgenden Typen:



Bild



Profil 1 - konstanter Wert. Dies sind höchstwahrscheinlich statische Verzeichnisse, und es ist nicht so interessant, mit ihnen zu arbeiten. Der oben beschriebene Archivierungsansatz kann basierend auf der NutzungsintensitÀt des Verzeichnisses angewendet werden.



Kleine Volumenschwankungen - Profil 2- Sie können sowohl ĂŒber ein Nachschlagewerk als auch ĂŒber eine Operationstabelle sprechen, in der das Lesen / Schreiben von Daten intensiv ist. Dies sind aus Sicht des Restaurators die schwierigsten Objekte, weil Es ist notwendig, ihr Verhalten so detailliert wie möglich zu analysieren. FĂŒr diese Objekte ist es sinnvoll, die HĂ€ufigkeit der Informationserfassung zu erhöhen: nicht einmal am Tag, sondern einmal pro Stunde, einmal pro Minute. Das Hauptziel besteht darin, die ProfilĂ€nderung detaillierter zu verfolgen und die VerhaltensabhĂ€ngigkeiten zu verstehen.



Die Profile 3 und 4 sind von grĂ¶ĂŸerem Interesse. Profil 3(„SĂ€ge“) gibt eindeutig an, dass diese Tabelle regelmĂ€ĂŸig gelöscht wird. Der wachsende Trend - jedes Mal nach der Reinigung ist das Endvolumen etwas grĂ¶ĂŸer als zuvor - spricht jedoch fĂŒr die Ineffizienz der vorhandenen Reinigungsmechanismen. Jene. Über einen bestimmten Zeitraum werden mehr Daten im System angezeigt, als am Ende des Zeitraums gelöscht werden. Dies kann ein völlig normaler GeschĂ€ftsprozess sein, eine klassische Erhöhung der Systemlast.



FĂŒr den Restaurator ist dies jedoch vor allem ein Signal: Gibt es Bedingungen fĂŒr das Löschen von Informationen? Aufgrund der Praxis bleiben höchstwahrscheinlich einige EntitĂ€ten aufgrund der komplexen Bedingungen der Datenaufbewahrung im System unverdient fĂŒr immer im Speicher. Das Ziel des Restaurators ist es, solche EntitĂ€ten zu identifizieren und sie auch in regelmĂ€ĂŸige AktivitĂ€ten einzubeziehen.

Wenn Profil 3 zu konstantem Wachstum degeneriert, ist dies der erste AnwÀrter auf einen Engpass im System. Erstens gibt es keine expliziten Hinweise auf den Archivierungsprozess, und zweitens wird mit dem Datenwachstum ein Leistungsabfall erwartet.



Profil 4- Ein typisches Beispiel fĂŒr eine Archivtabelle mit periodischer DatenfĂŒllung. Bitte beachten Sie, dass das Tabellenwachstum nur an bestimmten Tagen auftritt. Es ist durchaus möglich, dass Korrelationen mit Tabellen des dritten Profils erkennbar sind. FĂŒr Archivtabellen ist es auch wichtig, das Prinzip ihrer Verwendung zu verstehen. Werden sie von Benutzern angerufen? Oder ist es eine Geschichte zu analysieren? Oder sind es Daten fĂŒr Berichtssysteme? AbhĂ€ngig von den Antworten auf diese Fragen ist es durchaus möglich, dass eine Entscheidung getroffen wird, die Archivtabellen in einen separaten Schaltkreis, eine separate Basis, einen separaten Abschnitt zu unterteilen. Dadurch wird der Betriebsraum frei.



Wie funktioniert es in der Praxis?



In einem der Projekte wurde eine Ă€hnliche Übung in den ersten anderthalb Monaten nach dem Beitritt zum Projekt durchgefĂŒhrt. Es waren die Objekte von Profil Nr. 3, die das Ziel waren, und sie wurden gefunden. Anwenden der beschriebenen Vorgehensweisen (Verbessern der Reinigungsbedingungen), Löschen von Daten, die nicht im System verwendet wurden usw. erlaubt, das Volumen des belegten Raums um mehr als 25% zu reduzieren und das intensive Wachstum des Speichers zu stoppen.



Infolgedessen konnten wir die ersten technischen Änderungen am Projekt vornehmen und PlĂ€ne zur Verbesserung der FunktionalitĂ€t einreichen. Der Kunde war mit dem Ergebnis des Teams zufrieden und es wurde von 3 auf 9 Entwickler erweitert. WĂ€hrend des gesamten Jahres haben wir die Untersuchungen fortgesetzt. Die Punkte zur Verbesserung der FunktionalitĂ€t wurden verwendet, um das System und seine Eigenschaften zu unterstĂŒtzen.



Da uns zwei Analysten hinzugefĂŒgt wurden, begann das Team, sich auf seine eigene Entwicklung einzulassen - nicht auf Support, sondern auf die Implementierung neuer GeschĂ€ftsfunktionen. Wir entwickeln jetzt ein neues System.



WofĂŒr ist das alles?



Wenn Sie so weit gelesen haben, suchen Sie höchstwahrscheinlich nach einer Antwort auf die Frage: "Warum ist das alles?" Zuallererst ist die Wiederherstellung ein separater Prozess, nicht wie Entwicklung, nicht wie UnterstĂŒtzung, sondern wie Kombination.



Dies ist ein separater Antrieb fĂŒr einen technischen Spezialisten - sich mit der Logik der Person zu befassen, die dieses Produkt erstellt hat, seine Bedeutung zu verstehen, das Produkt von unnötigen Dingen zu reinigen und es noch besser zu machen als es war. Die App sieht aus wie eine Quest mit vielen RĂ€tseln und unbekannten Wendungen.

Nein, Sie erstellen nicht von Grund auf neu, Sie stellen ein vorhandenes Produkt wieder her, werden aber möglicherweise durch die Zeit zerstört. Unter anderem hat der Restaurator die einmalige Gelegenheit, in eine der sechs Richtungen zu pumpen (siehe Abbildung oben), wĂ€hrend er ein echtes Produkt als Testbasis zur Hand hat. Ein GefĂŒhl der Selbstkontrolle wird ebenfalls gefördert - nicht um in technischen Perfektionismus zu verfallen, sondern um nur die Änderungen zu ĂŒberdenken und vorzunehmen, die fĂŒr das System zur Verbesserung von Prozessen erforderlich sind.



All dies macht die Arbeit mit Legacy-Systemen aufregend und ungewöhnlich. Die endgĂŒltige Entscheidung fĂŒr die Wiederherstellung oder Wartung liegt jedoch bei Ihnen.



Der Bericht von Mikhail Zankovich auf dem Luxoft TechFest kann hier eingesehen werden .



Der Autor des Artikels ist Mikhail ZankovichMikhailZankovich



All Articles