[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