Vor einigen Tagen haben wir eine neue Version einer Software beim Kunden in die Verteilung gegeben. An dem Projekt entwickeln wir zu zweit und jeder von uns ist dafür verantwortlich, dass seine Änderungen auch funktionieren bzw. das tun, was sie sollen.

Schon kurz nach dem Einstellen unserer Erweiterung in das System beim Kunden bekam ich eine Meldung, dass es bei einer bestimmten Verarbeitung zu einer Fehlermeldung kommt und tatsächlich konnte ich den Fehler schnell nachvollziehen. Genauso schnell war eine Änderung von meinem Kollegen als Ursache ausgemacht. Mit einem kurzen Test, nämlich genau einem Buttonklick, hätte der Kollege den Fehler ebenfalls bekommen müssen. Meine Nachfrage, ob er seine Änderungen eigentlich testen würde beantwortete er mit einem: „Ja, natürlich“. Nicht nur, dass er seine rudimentären Aufgaben nicht erfüllt, angelogen wird man auch noch, denn es war eindeutig, dass der von ihm entwickelte  Code nie funktionieren konnte.

Zugegeben macht es vermutlich kein Entwickler gerne, aber das Testen einer Softwareänderung, zumindest mit einem Entwicklertest gehört zu jeder Änderung dazu. Genauso wie eine saubere Benennung von Variablen und Methoden und einer aussagekräftigen Dokumentation und Kommentaren im Quellcode. Da kann sich auch aus meiner Sicht niemand mit mangelnder Erfahrung rausreden. Vergleichbar ist es etwa mit einem Autohaus, dass nach dem Einbau neuer Bremsscheiben das Auto einfach für den Kunden zur Abholung bereitstellt und auf einen Test verzichtet. Schließlich ist es ja nicht die erste Scheibe, die sie austauschen und es hat ja bisher immer funktioniert.

Wenn man bei Datenbanken komplexere Verarbeitungen durchführen muss, kommt man meist um die Verwendung eines cursors nicht herum. Doch jeder, der schon mal einen cursor verwendet hat kennt bestimmt das Problem: Das Statement zum Sammeln der Daten ist geschrieben und funktioniert, die Ausführung dauert nur wenige Sekunden. Jetzt noch den cursor aufsetzen und den Durchlauf testen. Und merkwürdigerweise dauert dasselbe Statement mit einem Cursor wesentlich länger – der Faktor 100 ist hier keine Seltenheit.

declare @custid t_d_id
declare @name varchar(255)
declare @firstname varchar (255)

declare c cursor for 
	select cu.r_customerid, t_lastname, t_firstname
	from [sql-uptime-sht].uptimedata.dbo.customer cu
open c
fetch next from c into @custid, @name, @firstname
while @@fetch_status = 0 begin
	print @custid
	fetch next from c into @custid, @name, @firstname
end
close c
deallocate c

 Langsame Verarbeitung des cursors

Das liegt daran, dass der Standardcursortyp ein dynamischer cursor ist. D.h. der SQL-Server prüft die Bedingungen bei jedem fetch-Aufruf und das zieht die Performance so deutlich nach unten.

Bei uns im Projekt ist es zu einem geflügelten Ausspruch geworden, wenn sich jemand über einen anderen ärgert und seinem Ärger Luft macht: „Gib mir Tiernamen“. Da wir uns jetzt schon seit 16 Jahren kennen entspannt das die Lage meistens schnell.

Ob der Spamversender davon etwas weiß kann ich nicht sagen, aber die Anrede ist ja auch kein Tiername. In Zeiten immer schwerer zu erkennenden Spammails ragt diese Mail aus meinem Postfach schon ziemlich heraus. Schon die Anrede disqualifiziert die Mail als ernstzunehmende Nachricht.

Namen

Da ist James Kross schon eine gutes Stück weiter.

Von einem Kunden erreicht mich ein Hilferuf. Er will einen Report anzeigen und bekommt einen Fehler. Wie üblich sind die Rahmenbedingungen nicht genauer genannt und ich versuche erstmal den Fehler nachzustellen. Fehlanzeige. Der Report wird angezeigt, ohne Fehlermeldung und ohne Murren seitens der Software. Eine telefonische Nachfrage beim Kunden bestätigt auch dort ist das so, außer bei einem speziellen Report bzw. bei der Auswahl eines bestimmten Produkts.

Mit dieser Information komme ich weiter und kann den Fehler nachstellen. Alles deutet auf einen Stapelüberlauf wegen einer Endlosschleife hin. Daran kann eigentlich nur der Inhalt der Felder verantwortlich sein und als ich mir die Beschreibungen, die in HTML gespeichert wird, ansehe kann ich schnell ein strukturelles Problem erkennen. Hier scheint etwas mit der HTML-Struktur durcheinander geraten zu sein. Nach der Bereinigung der Daten kann dann auch der Report wieder angezeigt werden.

HTML

Die eigentliche Ursache bleibt unklar, ich vermute aber einen Zusammenhang mit einer nicht ganz unbekannten Bürosoftware bei der die HTML-Struktur hin und wieder ebenfalls etwas merkwürdig gestaltet wird.

Gestern hatte ich großes Betriebszugehörigkeitsjubiläum. Vermutlich hätte ich gar nicht daran gedacht, wenn ein Kollege mich nicht angesprochen hätte. Irgendjemand aus der Administration muss es in unserem Urlaubskalender vermerkt haben. Doch bis auf den Eintrag in dem Onlinekalender hatte mein Jubiläum keinerlei Auswirkungen. Es gab keinen Händedruck, keine persönliche Ansprache und auch kein Geschenk – muss ja auch nicht.

Ich bin jetzt schon unglaubliche 16 Jahre hier im Unternehmen. Seit 16 Jahren pendele ich, mit Ausnahme  von einigen Homeofficetagen, Urlaub, Feiertagen oder Kundenbesuchen also täglich nach Kassel. Wo ich wohl inzwischen wäre, wenn ich mich die Kilometeranzahl von der Erde weg bewegt hätte? Vermutlich immer noch recht nach an Mutter Erde.

Blicke ich auf die 16 Jahre zurück,