[deepamehta-devel] DeepaMehta Entwicklungsrichtlinien
Jörg Richter
jri at deepamehta.de
So Jan 20 21:03:12 CET 2008
Liebe Entwickler,
beim letzten Dev-Treffen am 21.12. hatte ich auf einen schwerwiegenden
Bug hingewiesen, der seit vielen Jahren behoben war, seit einigen
Monaten aber erneut auftrat: Inhalte, die in das Property Panel
eingegeben wurden und die ein einfaches Anführungszeichen (')
enthielten, wurden nicht gespeichert und gingen verloren! Ursache waren
fehlerhafte SQL Queries, da die Ersetzung von ' durch \', die in
RelationalCorporateMemory.quote() vorgenommen wird, nicht mehr
funktionierte. Dieser Fehler ist jetzt behoben und ich habe
rekonstruiert, warum der Fehler erneut auftrat. Mit dem Ziel, unsere
Effektivität bei der DeepaMehta Entwicklung zu steigern, möchte ich
diese Gelegenheit nutzen, um Entwicklungsrichtlinien für alle
DeepaMehta Entwickler auszusprechen.
Rekonstruktion der Fehlerursache: Spätestens seit Revision 228, die
etwa 3 Monate zurückliegt, hat Entwickler X die 15-zeilige
Implementierung von DeepaMehtaUtils.replace() durch eine 1-zeilige
Implementierung ersetzt, unter Verwendung von String.replaceAll(). Die
Absicht war offenbar eine Code-Optimierung. Durch die Verwendung von
String.replaceAll(), die mit regulären Ausdrücken arbeitet, ist
DeepaMehtaUtils.replace() aber nicht mehr 100%ig aufrufkompatibel zur
vorherigen Implementierung, die mit einfachen Java Strings und
Charachtern arbeitete. Da der Code in den meisten Fällen funktionierte,
fiel der Fehler zunächst nicht auf. Der Fehler tritt erst zutage, wenn
der Ersatzstring ein Backslash (\) enthält. In einem Java String muß ja
ein Backslash, wiederum durch Backslash gequotet werden: "\\".
Innerhalb eines reguläreren Ausdruck nun aber, muß jeder Backslash
wiederum gequotet werden: "\\\\".
Folge: Bei den 2 wichtigsten DeepaMehta-Kunden sind im Moment
Anwendungen deployt, die einen schwerwiegenden Fehler enthalten.
Fehlerbehebung: Ich hätte den Fehler beheben können, indem ich in
RelationalCorporateMemory.quote()
DeepaMehtaUtils.replace(str, '\'', "\\'");
durch
DeepaMehtaUtils.replace(str, '\'', "\\\\'");
ersetzt hätte. Außerdem hätten alle weiteren Aufrufe von
DeepaMehtaUtils.replace() -- im DeepaMehta-Framework UND in allen
DeepaMehta-Anwendungen -- auf diese Aufrufinkompatibilität hin
untersucht, und ggf. angepasst werden müssen. Ich habe mich daher
entschlossen, die alte Aufrufsemantik beizubehalten, und habe die alte
Implementierung von DeepaMehtaUtils.replace() wiederhergestellt.
Entwickler X hatte vorgeschlagen, der ganzen Quoting-Thematik aus dem
Weg zu gehen, indem DeepaMehta nur mit SQL Prepared Statements
arbeitet. Technisch gesehen ist das natürlich ein guter Vorschlag,
nicht zuletzt um besser gegen SQL Injection-Angriffe geschützt zu sein,
aber organisatorisch gesehen scheint mir das kein gutes Vorgehen zu
sein. Wer bei der Erfüllung einer Aufagbe unnötige Nebenbaustellen
eröffnet, und während der Arbeit auf der Nebenbaustelle weitere
Nebenbaustellen eröffnet, der verleiert möglicherweise sein
ursprüngliches Ziel aus dem Blick und fällt früher oder später in die
selbstgegrabenen Löcher. Das ist uns hier passiert. In dem Film
"Brazil" beschreibt Sam Lowry's 80-jährige Mutter, die sich einer
Schönheitsoperation nach der anderen unterzieht, diese bodenlose
Situation mit den Worten:
"Der Arzt sagt: Die Komplikation hatte eine Komplikation"
Mit dem Ziel, die Koordination des DeepaMehta-Entwicklungsprozeß zu
verbessern und die Qualität des Codes zu sichern, spreche ich folgende
Richtlinien aus:
=> Committe nur Code deren Auswirkungen auf den DeepaMehta-Kern UND
auf die DeepaMehta-Anwendungen Du verstehst.
=> Mache keine "Optimierungen" am DeepaMehta-Kern, die für die
Erfüllung der aktuellen Aufgabe nicht notwendig sind.
=> Mache keine Versuche, einen Fehler durch Einführung neuer Methoden
zu beheben, bevor Du nicht die Fehlerursache verstanden hast.
=> Konzentriere Dich auf das Ziel Deiner Aufgabe und nehme keine neuen
Aufgaben in Angriff, bevor die alte Aufgabe abgeschlossen ist.
Andererseits ist es gerade Entwickler X's Dynamik zu verdanken -- er
hat in letzter Zeit viel für DeepaMehta gearbeitet und wesentliche
Verbesserungen beigetragen --, daß wir immer stärker gezwungen werden
uns mit den organisatorischen Fragen zu beschäftigen, denen sich jedes
Open Source Projekt, das erfolgreich wachsen möchte, stellen muß: Wie
kann freiwilliges Engagement gefördert und gleichzeitig die Qualität
der Ergebnisse sichergestellt werden?
Grüße
Jörg
Mehr Informationen über die Mailingliste devel