Es ist eine schwierige Zeit heutzutage. Besonders für Software-Entwickler. Denn heutzutage gibt es für einen Software-Entwickler viele Dinge, die er lernen, können und beachten muss. Da gibt es die Tools, die Programmiersprachen, die Methoden, die Anforderungen, die Domäne, die Kollegen und noch vieles mehr. Da gibt es schon einmal Momente, in denen man sich unsicher ist. „Mache ich das richtig?“, „gibt es bessere Lösungen?“ oder „hoffentlich passt das…“. Zumindest geht es mir manchmal so, z.B. bei neuen Dingen oder besonders komplexen Problemstellungen. Ich bin dann froh, wenn ich um mich herum jemanden habe oder finde, der mich und mein Problem versteht und mir helfen kann. Helfen mit seiner Einschätzung, seiner Meinung und seinen Erfahrungen.
Helfen ist schön, geholfen werden ist schöner!
Ich weiß es nicht genau, aber ich vermute es ein wenig, dass Thomas auch froh ist, wenn er durch Meinungsaustausch seine eigenen Herausforderungen besser einzuschätzen vermag. Ich persönlich empfinde diese „Kalibrierung“ als wichtigen Baustein zur Festigung der eigenen Meinung.
Thomas hat mit Null Verständnis gefragt, wie die Handhabung von NULL als Rückgabe von Methoden bei anderen Entwicklern umgesetzt und eingeschätzt wird. Viele haben kommentiert, einige haben auch Blog-Post-Antworten geschrieben. Ich habe das mit Kommentaren und dem Null Toleranz-Beitrag auch getan, der unermüdliche Ralf hat auch kräftig in die Tasten gehauen. Überraschenderweise mit mehreren Aussagen.
Ralf geht in seinem „Plädoyer für Regeln“ auch auf einige Punkte ein, die ich über die Handhabung von NULL in Anwendungsszenarien bemerkt hatte. Ralf hat so vieles geschrieben, dass es mir schwer fällt, wirklich alle Themen in einem oder mehreren Blog-Posts zu erwidern. Einen Überblick über meine Perspektive möchte ich dennoch geben.
Mind the Null!
Ralf stellt im Namen der Community die erste Null-Regel auf:
“Man darf Null benutzen und auch als Wert zurückgeben – aber Vorsicht! Erst prüfen, ob es nicht auch anders geht”
D’accord! Das hatte ich ja auch schon in Kommentaren und per Twitter erwähnt. Doch wann kann man Null verwenden, wann nicht? Gibt es dafür eine „kontextarme“ Regel? Kann man pauschal sagen: „Verwende es nicht!“. Meiner Meinung nach ist das nicht so einfach. Klar kann ich auch sagen, dass man Null einfach nicht anwenden soll, aber ich mache es mir nicht so einfach.
Wenn ich nämlich obige Regel einem Embedded-Entwickler entgegenbringe, dann lacht der mich mal gepflegt vor seinen Kollegen aus. In der Embedded-Entwicklung, wie auch bei sehr ressourcenintensiven Geschäftsanwendungen ist es nämlich durchaus erstrebenswert, oft NULL zurückzugeben, um damit z.B. eine leere Liste oder leere Suche zu signalisieren. Es mögen sich wenige daran erinnern, aber NIL (als Synonym für NULL) ist die Abkürzung für „Not-In-List“.
Null für Hacker
Ich selbst durfte schon mehrere serverseitige Komponenten von „Exception-Flut“ befreien, in dem ich sie in einigen Stellen durch NULL ersetzt habe. Danach lief der Service doppelt so schnell bei 25% weniger Ressourcenverbrauch. Bin ich jetzt ein Aussetziger, weil ich die Regel nicht befolgt habe?
Ich denke nein. Denn: In einigen Anwendungsszenarien ist es gang und gäbe NULL als Mittel einzusetzen. Mehr noch, es ist „normal“, soz. “die Regel”. Deswegen sage ich nach wie vor: Die Regel ist richtig, man sollte vorsichtig mit NULL umgehen und es mit bedacht einsetzen. Doch eine „Faustregel“ ist es für mich noch nicht, denn man kann es (noch) in bestimmten Anwendungsfällen vorteilhaft und stringent einsetzen.
CatastrophicFailureException ?? Null
Ralf schreibt:
„Null-Regel #2 (von Ilker; noch zu diskutieren): In Katastophenfällen darf Null zurükgegeben werden.“
Das ist keine Regel. Den Regelbedarf und die Kreativität zum Design eines Regelwerks wie Ralf habe ich (noch) nicht. Ich habe dafür aber Programme, die Probleme lösen. Bei einigen, wenigen Programmen habe ich NULL als Rückgabe für „katastrophale Fehler“ zurückgegeben.
Das hat mir bei der defensiven Programmierung geholfen, denn es ging um eine etwas kritischere Komponente, die an Schnittstellen sog. „Guards“ hatte, die alle möglichen Exceptions abgefangen haben. Im Nachhinein betrachtet hätte ich es wohl auch mit einer „CatastrophicFailureException“ oder mehreren, spezifischeren Exceptions lösen können. C’est ca!
Null nur bei „gleicher Kategorie“
Die dritte Regel von Ralf:
“Null darf nur Rückgabewert sein, wenn Null zur selben Kategorie gehört wie ein Nicht-Null Rückgabewert”.
Naja, streng genommen ist NULL ja nichts, und damit kann man es auch nicht kategorisieren. Antizipieren kann ich da nur, dass es um das Beispiel von Thomas mit der Liste gehen kann. Dem kann ich nur zustimmen. Hier ist ein Ausnahmefall zwar auch möglich, aber doch eher selten.
Dein Pflock ist mein Maibaum!
Ralf hatte mir zu viel “Rumgeeiere” in meinen Aussagen über NULL attestiert. Das will ich doch gerne versuchen besser zu machen und Ralf‘s „Pflock in Boden“ in meine triviale niederbayrische Welt übertragen und damit mal den „Maibaum ins Dorf“ stellen. Also, auf geht’s, Maderl & Buam – mein Maibaum im Dorf „Nullinger“!
Ilker’s Statement zu Null als Rückgabe von Methoden:
NULL ist gefährlich, meide NULL, außer es gibt triftige Gründe. Triftige Gründe können Performance, Speicher oder dynamische Datenstrukturen sein. Solltest Du NULL als „Indikator“ für etwas verwenden (z.B. „Nicht gefundener Benutzer“), ziehe eine Vermeidungsstrategie mit Exceptions oder ReturnCodes in Erwägung. Sei auf der Hut, NULL ist überall. Prüfe, ob deine Parameter oder deine Methoden NULL zurückgeben. Prüfe besonders, wenn Du parallelisierst oder wichtige Schnittstellen bedienst. Solltest Du ein NULL finden, versuche zunächst damit umzugehen. Geht das nicht mehr, signalisiere die Ausnahme. Achte darauf, dass ein NULL die Methode nicht verlässt.
So, ich hoffe das war konkret krass korrekt genug!
Immer diese Abhängigkeiten
Nachdem nun der Maibaum in Django Asül-Manier aufgestellt ist, möchte ich neben dem Ausgangsthema mich noch ein wenig den neuen Themen widmen, die Ralf in seinem Rules of Null-Post erwähnt hat. Ralf regt sich dabei ganz besonders über die „It depends“-Phrase auf. Ja, „It depends“, die allmächtige und einzige Antwort auf alles, was so im Leben an Fragen auf einen zukommen kann. Die Antwort „It depends“ ist kurz, erfüllt die Aufgabe und ist hochgradig flexibel bei gleichzeitig maximaler Wiederverwendbarkeit. Geradezu traumhafte Eigenschaften aus der „Nerd-Software-Entwickler“-Perspektive, oder nicht? Vielleicht ist es deshalb auch so beliebt in unserer Banche?
Spaß beiseite. „It depends“ ist eine Phrase, die mehr oder minder Inhalt liefern kann. Ich stimme Ralf zu, wenn er sagt, dass dieses „Es kommt drauf an“-Getue mit der Zeit nicht mehr auszuhalten ist. Deswegen kann ich die Reaktion von Ralf auch gut verstehen. Ich selbst finde es teilweise immer wieder erschreckend, wie oft auf diese Floskel zurückgegriffen wird, ohne darüber nachzudenken. Dennoch verwende ich es – ab und an zumindest, wenn ich es für erwähnenswert erachte.
Niemals ist niemals niemals
Fakt ist auch, dass „It depends“ nicht nur eine Bierdeckelweisheit ist, sondern auch als Abkürzung verwendet wird. Im Stile „ich erspare mir und Dir jetzt nähere Details“. Das kann gut und schlecht interpretiert werden. So oder so, es kommt darauf an
Genauer gesagt, auf den, der es interpretiert.
Womit wir bei der Quadratur des Kreises angelangt wären: Es ist nunmal so, dass wir Systeme vereinfachen und Abstraktionen schaffen, um es zu verstehen. Dabei geht auch Genauigkeit und Wahrheit verloren. Manchmal sogar so sehr, dass die aus der Vereinfachung abgeleitete Erkenntnis nicht mehr adequat bzw. erwartungsgerecht ist. Insofern ist „It depends“ nicht nur eine Fassade oder Ausrede, sondern eine zuweilen notwendige Mahnung, den Kontext und die Erkenntnis zu hinterfragen, sich bewußt mit der Lösung und Problemstellung auseinanderzusetzen. Für die Agilisten unter uns: „It depends“ ist ein auch ein Aufruf zum „Inspect & Adapt“.
Ich kann mich guten Gewissens Ralf anschließen, wenn es darum geht, Leitfäden und Empfehlungen über die Anwendung von NULL mit der Community zu erarbeiten. Meinungsaustausch ist Katalysator für Lernen, Entdecken, Erfahren und Bestätigen. Doch ein Regelwerk will ich nicht erstellen. Ich gebe meine Meinung und meinen Standpunkt gerne wieder. So wie ich es erfahren habe und so, wie ich es für gut empfinde.
Regeln habe ich auch. Ich habe meine eigenen Regeln, ich habe Teamregeln und ich habe noch eine Reihe weiterer Regeln, die ich für mich beachte und schätze. Regeln sind für mich wichtig. Ich möchte damit sagen, dass ich durchaus Ralfs Motivation nachvollziehen kann. Doch ich habe meine Beiträge nicht mit dieser Motivation mit der Community geteilt. Mein Ziel ist die Kommunikation und der Erfahrungsaustausch. Das wird auch so bleiben.
by.NET Stories: Digitale Erfahrungen » Blog Archive » Über das Ziel von Coding Dojos IIonMay 31st 2010[...] interessante Blogposts, bevor es losgeht. Ich hätte z.B. erwartet, dass einer in die Runde „Null oder nicht null, Hauptsache Ergebnis!“ wirft und so ein wenig die Runde auflockert. Doch Nein. Es liegt Konferenzduft in der Luft. Alle [...]
byJürgen Gutsch : Katastrophenfall ‘NULL’?onMay 3rd 2010[...] zu der Null-Katastrophe habe ich gestern auch gebloggt: http://www.gmbsg.com/kein-yin-ohne-yang-kein-null-ohne-pointer/ [...]
byRalf WestphalonMay 3rd 2010Eigentlich sind wir uns wohl ziemlich einig. Eigentlich und im Großen Ganzen
Im Detail jedoch… Da drängt es mich zur Antwort. Wäre ja auch zu schade, wenn dieser Diskurs abrisse, oder?
Also:
1. Thema Stil: Handwerk und Kunst haben viele Regeln. Und doch sieht deren Anwendung bei jedem Handwerker und Künstler immer wieder anders aus. Das ist ganz natürlich. Denn Regeln geben nur einen Rahmen vor, innerhalb dessen jeder sich entfaltet. Das würde ich dann Stil nennen. Der betrifft die Anwendung von Regeln, also die Ausführung, aber auch durchaus ihre Auslegung. Sobald eine Regel keine Allaussage ist, muss sie ja interpretiert werden. Da gibt es Spielräume.
Wenn du also davon sprichst, dass du deine eigenen Regeln hast, dann hoffe ist, dass du eher von einem eigenen Stil sprichst. Denn wenn ich deine Aussage sonst extrapoliere, erhalte ich ein Bild von Babylonischer Regelverwirrung.
Hm… Oder haben wir die schon? Ja, ich glaube, die haben wir durchaus.
Verständlich ist es, wenn Teams in Isolation – denn über Unternehmensgrenzen hinweg gibt es kaum Austausch und gelesen wird ja bekanntlich vergleichsweise wenig – ihre eigenen Regeln schmieden. Aber ist das auch gut? Zum Teil ist es notwendig, aber zu einem großen Teil halte ich das für Ballast, Müll, oder lean: waste.
Personaler haben die Illusion, einen “C# Entwickler(in)” suchen zu können, dem man dann noch grad die Problemdomäne erklären muss und dann ist er in ein paar Wochen produktiv. Die Wahrheit ist, dass wir sowenige Regeln haben, sowenige Konventionen (falls jmd der Begriff besser schmeckt), dass viel mehr Lernaufwand zu betreiben ist, weil ja Ilker seine Teamregeln für die Codierung (!) hat und Thomas hat andere und “der Albert”
hat wieder andere usw. Wir sehen es doch hier an der Diskussion über “Null oder nicht Null”. Dass (!) wir diskutieren, ist ein Symptom von “Unterregelung” in der Branche.
Die Ursachen dafür… Darüber können wir beim Bier mal reden
2. Kontext: Eine Ursache mag allerdings sein, dass “alle” glauben, sie seien etwas Besonderes. Kein Projekt ist mit dem anderen vergleichbar. Jeder ist sein eigener Kontext.
Aber das ist Quatsch.
Wir müssen den Gedanken an diese Besonderheit, Unvergleichbarkeit aufgeben. Und andererseits müssen wir ganz bewusst mit Kontexten umgehen lernen.
Du nennst ja schon einen: embedded systems sind etwas anderes als Web-Server oder Desktop WinForms-Anwendungen. Sie bieten unterschiedliche Ressourcen und haben vor allem unterschiedliche nicht funktionale Anforderungen.
Darauf müssen Regeln natürlich Rücksicht nehmen. Regeln sind immer – da sind wir uns einig – kontextspezifisch. Deshalb behaupte ich auch nicht, Null/0 Regeln für C Programmierer von embedded systems zu kennen.
Für C# Software in vielen Domänen bin ich mir jedoch sicher, einige 90% Regeln aufstellen zu können. Und du kannst das auch. Oder besser: du und ich und der Rest der Community, wir können das zusammen.
Solange wir eingedenk des Kontexts sind, gibt es kein Problem. Da können und sollten wir um Regeln/Konventionen ringen. Warum? Weil sie es uns erlauben, uns auf das Wesentliche zu konzentrieren. Für die Entscheidung “Null oder Exception” bezahlt kein Kunde wirklich Geld. Also muss die Entscheidung so schnell wir möglich getroffen werden. Besser noch: keine Entscheidung treffen müssen, weil der Kontext vorgibt, wie “man es tut”.
Und was, wenn sich am Ende herausstellt, dass der falsche Weg eingeschlagen wurde? Das kann ja eigentlich nur sein, wenn erkannt wird, dass der Kontext falsch eingeschätzt ist.
Na, dann korrigiert man so gut es geht.
Wir können auch nie wirklich sicher sein, dass wir den Kontext korrekt bestimmen oder alle Regeln schon optimal für einen Kontext sind.
Macht das aber Regeln überflüssig? Nein.
Regeln sind Ausdruck von Bewusstheit. Sonst könnte man sie nicht formulieren.
Regeln sind Ansatzpunkte für Verbesserungen. Nur wenn ich Regeln formuliere und sie später anpasse, kann ich wirklich sehen, dass ich einen Erkenntnisgewinn hatte.
Regeln sind ein Kommunikationsmittel, denn wir sollte ich sonst jmd beibringen “wie man es in einem Kontext tut”?
Und wenn das so ist, dann verstehe ich nicht, dass irgendjmd kein Interesse daran haben sollte, Regeln möglichst allgemeingültig zu formulieren. Warum ist das nicht unser aller Ziel? Das begreife ich nicht. Wer eine Regel meint zu erkennen, der sollte doch Heureka! rufen und sie sovielen mitteilen, wie er kann. Der mögliche Nutzen ist unvorstellbar.
Dass man dabei dann auf andere Meinungen stößt… Tja, so ist das halt. Von denen können wir nur lernen.
Ich bleibe also dabei: Jede Regel, die wir finden, ist eine gute Regel. Und ich werde mich weiter bemühen, Regeln zu finden, um es mir und anderen leichter zu machen.
-Ralf