Dienstag, 29. September 2009

Der Nummer 1 Faktor für Software-Qualität

Software wird von Menschen gemacht. Die Qualität steht und fällt mit der Qualität der Arbeitsweise der Entwickler. Eine Spezifikation - gleich auf welcher Ebene - ist immer nur ein Zwischenschritt. Selbst ein geschriebenes Stück Code ist ein Zwischenschritt, solange die Entwicklung eines Softwaresystems nicht beendet wurde. Als Entwickler baut man anhand dieser Zwischenschritte etwas neues - doch wie gut das Produkt wird, hängt von der bestehenden Qualität, sowie von der Qualität des neu geschaffenen ab.

Warum ist es nicht möglich, Software völlig ohne Zwischenschritte zu entwickeln? Der Grund liegt meiner Meinung nach in der Beschränktheit unseres Konzentrationsvermögens auf einige wenige Dinge. Oft wird gesagt, dass unser Kurzzeitgedächtnis ca. 7+-2 Dinge ("chunks") gleichzeitig aufnehmen kann. Ob das nun genau so stimmt, oder nicht - nehmen wir es einfach mal als Arbeitshypothese (man könnte genau so gut z. B. auch die Kurzspeicherkapazität heranziehen).

Je näher die Zwischenschritte zusammenliegen, und je weniger Zwischenschritte man zusammenfügen muss, desto weniger muss das Kurzzeitgedächtnis belastet werden. Das sind zwei konkurrierende Ziele, denn:
  • Liegen die Schritte weit auseinander, braucht man viel Kapazität, um Neues zu schaffen.
  • Liegen die Schritte nah beieinander, ist es hingegen leider oft nötig, viele der bestehenden Schritte gleichzeitig zu kombinieren - und zwar in der richtigen Art und Weise. Auch das braucht viel Kapazität.
Versucht man hingegen, nur wenige nahe beieinander liegende Schritte zu kombinieren (um Kurzzeitgedächtnis zu sparen), ist es meist nicht möglich, daraus die gewünschte Funktionalität zu schaffen.

Beispiel: Web-Interface, Suche in einer Datenbank

Benutzer sendet Suchanfrage über ein Textfeld auf der Seite, Anfrage wird überprüft, geht an Datenbank (wird dabei gefiltert für den Benutzer), Ergebnis kommt zurück und soll seitenweise dargestellt werden.

Besteht der beschriebene Weg aus vielen kleinen Schritten, müssen diese alle kombiniert werden. Besteht er aus wenigen großen Schritten, muss normalerweise jeder Schritt stark konfiguriert werden (z. B. bei Nutzung eines relativ generischen Moduls für Datenbankabfragen etc.).

In beiden Fällen muss unterm Strich viel koordiniert werden, denn wenige kleine Schritte reichen nicht aus. Nun kann man selbstverständlich den Weg durch divide-and-conquer aufspalten, und ich bin ein großer Fan dieser Methode. Doch gerät dieser Ansatz dort an seine Grenzen, wo man eben doch wieder eine gewisse kleine Menge an Hintergrundwissen über den abgespaltenen Teil benötigt. Das sollte zwar wenig sein, reicht aber oft leicht, um die 7+-2 zu erreichen. Wenn der gesamte Weg fehlerfrei beschritten werden soll, ergibt sich eine Konsequenz: Je besser man in der Lage ist, das Kurzzeitgedächtnis fehlerfrei einzusetzen, und den Überblick zu behalten, desto besser wird das Ergebnis sein.

Nun ist es zum Glück so, dass wir Menschen mit einem relativ ähnlichen Kurzzeitgedächtnis ausgestattet sind - einige Prozent hin oder her bedeuten keinen allzu großen Unterschied. Das bedeutet auch, dass man sich auf diese Weise nicht herausreden kann. Es kommt in erster Linie auf den Einsatz dieser Fähigkeit an - und ich bin überzeugt, dass dieser Einsatz optimierungsfähig ist.

  1. Die Arbeitsumgebung. Wichtig ist hier, alles so einzurichten, dass man sich um nichts mehr kümmern muss, sobald man an einem Problem arbeitet. Da man bei der Lösung von schwierigen Problemen 100% seines Kurzzeitgedächtnisses (und volle Konzentration) braucht, wird man es in dieser Situtation nicht mal mehr schaffen, in der Taskleiste nach dem richtigen Programm zu suchen, ohne dass etwas, das man sich eben gemerkt hat, zwangsläufig (nicht etwa durch Konzentrationsschwäche!) aus dem Gedächtnis entfernt werden muss. Dadurch wird ein Fehler geradezu herbeigeführt. Alles muss bereits an seinem Platz sein (Tip: zwei oder mehr Monitore verwenden, Fenster sinnvoll anordnen, Multiple Desktops verwenden). Wenn das nicht möglich ist, muss man die Zahl der gleichzeitig gemerkten Dinge reduzieren. Hier kann ein Refactoring hin zu sinnvolleren Zwischenschritten helfen, bevor das eigentliche Problem gelöst wird.
  2. Die persönliche Konzentration. Bei der Erledigung von schwierigen Aufgaben muss man den Rest der Welt vergessen, so lange bis die Aufgabe erledigt ist. Tief durchatmen, genau festlegen, was zur Aufgabe gehört oder nicht, und dann die Sache durchziehen wie bei einem Marathonlauf (wer würde während solch eines Laufs tatsächlich schnell mal Facebook checken?) Klingt hart? Ja, ist es. Aber als Belohnung muss man sehr viel weniger Bugs fixen. Und man erhält meist eine Lösung, die besser mit dem Rest des Systems harmoniert.
Fazit: Die effiziente Nutzung des Kurzzeitgedächtnisses unter maximaler Konzentration ist für mich der Nummer Eins Faktor für Software-Qualität. Ich wünsche mir, dass Entwicklungsumgebungen, sowie auch Betriebssysteme den Entwickler hier in Zukunft noch stärker unterstützen werden. Ebenso muss es möglich sein, die ansonsten hoffentlich sehr lockere, soziale und kommunikative Arbeitsumgebung für diese Zeiten anzuhalten, ohne dabei ein schlechtes Gewissen haben zu müssen. Selbst wenn's mal einen ganzen Tag oder zwei dauert.

Keine Kommentare:

Kommentar veröffentlichen