PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufwandsabschätzung "Codetransformer"


Ganon
2009-12-10, 12:38:37
Hiho.

Die Firma in der ich arbeite hat momentan eine Anwendung, die auf einer alten Access-ähnlichen Datenbankumgebung aufsetzt und zu 99% Funktionen und die mitgelieferte Programmiersprache dieser nutzt.

Das Problem ist nun, dass diese schon seit Jahren nicht mehr weiterentwickelt wird und auch immer mehr Fehler mit neueren Windows-Versionen auftreten. Und irgendwann "krachts" und nichts geht mehr.

Nun fehlen aber absolut die Mitarbeiter, um das ganze Programm neu zu schreiben, da das Programm eine recht beachtliche Größe erreicht hat und man die Weiterentwicklung dieser Anwendung auch nicht einfach anhalten kann.

Nun ist die verwendete Skriptsprache recht "einfach". Es gibt in dem Sinne keine Klassen, keine Vererbung, keine mehrdimensionalen Arrays (nur einfache und sowas wie eine Map / Key-Value), keine besonderen Typen außer die bekannten primitiven Typen und ein paar Spezialtypen für den Datenbankugriff/Oberflächenzugriff.

Nun dachte ich mir, es wäre vllt. weniger aufwändig, wenn man dann die verwendeten Typen mit ihren Funktionen und die Oberflächenabläufe in gewisser Weise in Java oder .NET nachprogrammiert und dann den Code "umtransformiert" in das neue System.
Der Source wird leider in einem nicht näher bekannten Binärformat gespeichert, aber man kann ihn per Befehl auslesen und in eine Tabelle schreiben (auch den Aufbau der Oberfläche). Darum die Idee mit dem "umtransformieren".

Ich weiß, dass das Resultat dann wohl alles andere als optimal werden würde, aber momentan sehe ich keine andere Möglichkeit.

Nun wäre meine Frage, wie aufwändig das Code-Parsen ist. Ich weiß, dass es da bestimmte Bibliotheken gibt, die den Code in Teile zerlegen. Frage ist, wie komplex die Sprachdefinition ist (Pascal-ähnliche Syntax) und das auswerten dieser.

Mir scheint es auf den ersten Blick halt "leichter", da der Umfang der Runtime recht begrenzt ist. Verrenne ich mich da, oder was meint ihr dazu?

Frucht-Tiger
2009-12-10, 12:54:04
Hmm, das Problem ist doch: Wie stellst du nach dem parsen sicher das alles noch korrekt funktioniert? Ich denke mal Tests wurden für den Legacy Code keine erstellt.

Kannst du den Code vielleicht mit einer dünnen Schicht Wrappen? Quasi Java -> Legacy -> Java -> DB?

Ganon
2009-12-10, 13:03:48
Hmm, das Problem ist doch: Wie stellst du nach dem parsen sicher das alles noch korrekt funktioniert? Ich denke mal Tests wurden für den Legacy Code keine erstellt.

Ist damit gar nicht möglich, automatisiert zu testen ;) Naja, der Code ist hauptsächlich Daten hin und herschieben und etwas umwandeln. Sicherstellen können das im Endeffekt nur manuelle Tests (*hust* Kunde *hust* :D)

Kannst du den Code vielleicht mit einer dünnen Schicht Wrappen? Quasi Java -> Legacy -> Java -> DB?

Ich weiß gerade nicht was du meinst. Du musst dir es halt so vorstellen, das Oberfläche und Code ein "Modul" sind, das die Runtime dann halt startet. Das heißt Oberfläche und Code sind ziemlich verbundelt. Den Datenzugriff macht die Runtime (über die BDE btw.). Und das Datenformat des Moduls ist unbekannt, auch in der Source-Version.

Frucht-Tiger
2009-12-10, 16:22:58
Oh, okay. Kenne solche Integrationsgeschichten nur von "mein altes Cobol Programm xy".

Zurück zu deiner Frage mit dem Transformer:
Im Moment ist ja diese ganze Sache mit den DSLs groß in Mode, dafür gibt es einiges an Tooling das du sicher auch nutzen kannst für deine Aufgabe. Mein Ansatz wäre: Versuchen mit z.B. Eclipse Modeling* die Sprache "nachzubauen", denke mal so kommst du am schnellsten zu einem gescheiten Parser.


*Gemacht hab ich selbst damit noch nichts, aber schau dich mal auf www.voelter.de um, da findest du bestimmt einige Sachen zum Thema DSL Tools.

Coda
2009-12-10, 16:39:27
Wenn du eine Programmiersprache in eine andere umwandeln willst begibst du dich zwangsläufig ins Thema Compilerbau.

Ich würde dir empfehlen eine Grammatik für die Sprache in ANTLR zu schreiben. Das spuckt dir einen AST aus. Den kannst du dann in der anderen Sprache wieder ausspucken.

Aber einfach ist das nicht.

Gast
2009-12-10, 22:01:36
Klingt aber recht kompliziert/aufwendig, was du vor hast. Und selbst, wenn du so einen Konverter hinbekommst, dann ist es unwahrscheinlich, dass alles gleich auf Anhieb funktioniert. Ob das im Endeffekt in der Praxis weniger Aufwand ist als die Anwendung umzuschreiben, musst du erst einmal durch eine genauere Analys abschätzen. Es klingt zumindest nicht trivial. Nicht, dass dann dieser Konverter die höllische Kopfschmerzen bereitet, weil irgendwelche Sachen dann doch nicht funktionieren.

Und wenn das alles recht alt ist, gibt es vielleicht sehr viele Dinge, die redundant sind und das man vielleicht deutlich besser implementieren könnte. Vielleicht sparst du ja schon durch geschicktes Neuimplementieren einen großen Codeteil?!

Auf der anderen Seite wäre vielleicht eine Schrittweise Migration hilfreich. Vielleicht kannst du ja erst einmal Schnittstellen (zu den Daten) bauen und für neue Funktionen eine neue Anwendung erstellen, die dann über die Schnittstellen sich die Daten holt etc. Und die ganzan alten Funktionen kann man ja dann Schrittweise migrieren.

Ganon
2009-12-10, 22:22:00
@Frucht-Tiger und Coda

Danke, ich werde mir die Sachen mal anschauen. Mir geht es ja erst mal auch um die Aufwandsabschätzung. Ich will ja nicht direkt anfangen ;)

@Gast
Das es nicht leicht ist, ist mir klar. Aber die Anwendung ist mittlerweile ziemlich gewaltig und ich als Person würde es nicht in einer vertretbaren Zeit schaffen, alles nachzuprogrammieren. Ich sagte ja, die Mannstärke der Firma fehlt.

Aber da sind über 400 Programmmodule mit sehr vielen grafischen Oberflächen. Das ich es deutlich besser implementieren könnte, wenn ich alles neu mache, ist mir natürlich klar, aber dazu fehlt einfach die Zeit. Weil dabei steht ja nicht nur die "Neuentwicklung", sondern da besteht erst mal ein ziemlich großer Bedarf an Ablaufanalysen. Von den Originalentwicklern von 1993 ist keiner mehr da und hier müsste man erst mal ein gutes halbes Jahr damit verbringen zu gucken was die Anwendung überhaupt noch macht, da auch noch viele Verzweigungen für Sonderkunden mit drinnen sind.

Schrittweise Migration hatte ich auch zuerst im Kopf, leider komme ich nicht an die Daten ran, wenn die Anwendung läuft. ODBC streikt, wenn die Anwendung gestartet ist und kommerzielle JDBC-Treiber ignorieren leider sämtliche Locks in den Daten und zerstören so u.U. die Tabelle. Der einzige Weg wäre CSV-Export und dann reimport (was stellenweise sogar von mir bereits gemacht wird), aber das dauert für großflächigen Einsatz einfach zu lange.

Und noch mal allgemein:
Ich habe mir heute ein paar Programmiersprachen angesehen. Dabei ist mir aufgefallen, dass VB.NET SEHR nahe an der verwendeten Sprache ist (if then else endif, while, foreach und keine Semikolons).

Vllt. kann man hier auch mit "Suchen und Ersetzen" schon kleinere Erfolge erzielen, sofern man die Grundfunktionen nachgebaut hat. Ich werde das mal weiter analysieren.

Danke schon mal bis hierher.

maximAL
2009-12-10, 23:26:23
Danke, ich werde mir die Sachen mal anschauen. Mir geht es ja erst mal auch um die Aufwandsabschätzung. Ich will ja nicht direkt anfangen ;)
Nunja, kommt auch drauf an, wie komplex die Sprache wirklich ist. Und welche Vorkenntnisse du hast. Wenn du natürlich noch nie eine BNF gesehen hast, dürfte das ganze etwas langwieriger werden.
Als Grundlagenbuch evtl. das (http://www.amazon.de/Grundlagen-Techniken-Compilerbaus-Niklaus-Wirth/dp/3486585819/ref=sr_1_1?ie=UTF8&s=books&qid=1259849424&sr=8-1), ist das kürzeste Compilerbau-Buch, das ich bis jetzt in der Hand hatte und sollte das Nötigste abdecken, zumal Tools wie ANTLR dir eh die meiste Arbeit abnehmen.

catamaran
2009-12-10, 23:45:21
Um welche Datenbankumgebung handelt es sich denn genau?

Ganon
2009-12-11, 08:38:19
Möchte ich hier nicht erwähnen (Rückverfolgung, etc.) ;)

Aquaschaf
2009-12-11, 08:54:59
Wenn du eine Grammatik für die Sprache aufstellen kannst und sie wirklich 1:1 in VB.NET übertragbar ist, dann könnte der Weg über ANTLR eine gute Lösung sein. Du kannst ja wahrscheinlich davon ausgehen dass die Programme korrekt sind, und brauchst immerhin keine semantische Analyse mehr. Vielleicht läßt sich der Kram dann in einem Durchlauf des Syntaxbaums den z.B. ANTLR ausspuckt mit VB.NET-Konstrukten ersetzen.

_Gast
2009-12-11, 09:32:10
Möchte ich hier nicht erwähnen (Rückverfolgung, etc.) ;)Das hört sich für mich sehr paradox an. ;)

Wie hoch sind die Kosten, wenn das System eines Tages komplett ausfällt (und das wird es tun!)? Was kostet ein Softwareentwickler, der das in 2 Jahren auf ein aktuelles Standardsystem umsetzt?

Ganon
2009-12-11, 09:42:39
Was kostet ein Softwareentwickler, der das in 2 Jahren auf ein aktuelles Standardsystem umsetzt?

Naja, das Problem ist, dass der Entwickler erst mal locker 1 Jahr braucht, um ins aktuelle System einzusteigen.

Und finde mal jemanden der:
a) In dem Wirtschafts-Bereich Erfahrung hat (ergo weiß was Kunden wollen)
b) Eine andere Programmiersprache (Java, C#, etc.) entsprechend beherrscht
c) eine schnelle Auffassungsgabe hat, um sich ins bestehende System einzuarbeiten (sich quasi in das aktuelle Programmiersystem und in die Anwendung einarbeiten)

Das in 2 Jahren zu schaffen halte ich für extrem unwahrscheinlich. Zumal die Anwendung ja nicht still steht. Sie muss ja zwangsläufig weiterentwickelt werden. Und jetzt arbeiten 3 Leute an einer Anwendung und ein anderer an der Neuentwicklung und der muss aufholen und einholen...

Wie gesagt, ich weiß es noch nicht...