Qualitätsgetriebene Softwareentwicklung

Toller Name nicht war - aber was soll das? Alles spricht von der Softwarekrise und den Möglichkeiten diese zu beseitigen. War es vor einiger Zeit noch die Objektorientierung von der sich viele die Lösung versprachen so ist es demnächst vielleicht die Aspektorientierte Softwareentwicklung. Unabhängig hiervon gibt es jedoch einige Möglichkeiten die jetzt bereits Abhilfe schaffen, wenn Sie es nur wollen. Diese Artikel hier stellen einige sinnvolle Ansätze dar um dies zu erreichen. Dabei sind die Ansätze - auch wenn teilweise auf die Plattform Java bezogen - losgelöst vom Softwareentwicklungsmodell oder Programmiersprache, unabhängig von dem Entwickler zu Hause oder in einer Firma, ...
Ich werde hierbei weniger die Theorie als die Praxis betrachten, da die schönste Theorie nichts nützt wenn Sie an der Praxis vorbeigeht.

Was ist Qualität?

Qualität ist die subjektive und objektive Beschaffenheit einer Software in Hinblick auf die gestellten Anforderungen an das Softwareprodukt. Qualität steht dabei durchaus in direkter Konkurenz zur Geschwindigkeit mit der ein Produkt entwickelt wird. Ziel eines Qualitätsmanagments sollte es daher sein die geforderte Qualität mit möglichst geringer Beinträchtigung der Produktion zu erreichen.
Ein Beispiel: In einem Projekt in dem ich u.a. tätig war wurde sehr viel Wert auf die Qualitätssicherung gelegt - sehr lobenswert. Dies ging schließlich soweit, das in den Qualitätssicherungsprotokollen inkorrekte Kommasetzung in der Dokumentation von Klassendiagrammen bemängelt wurde. Wer sich hier noch nicht an den Kopf faßt der höre / lese folgendes. Nun wurde nicht allgemein darauf hingewiesen, dass bitte auf die Kommasetzung zu achten sei sondern wie erwähnt dies in die Protokolle der Qualitätssicherung [QS] aufgenommen. Dabei wurden Textpassagen in das Protokoll kopiert, das Komma an der richtigen Stelle eingesetzt und farblich hervorgehoben. In der Dokumentation der eigentlichen Klassendiagramme wurde eine Änderung jedoch nicht vorgenommen. Dies hatte nun zur Folge das die Softwareentwickler zur Abarbeitung der QS Protokolle die Kommasetzung (wie vorgemacht) im Klassendiagramm gesetzt haben. (Haken an das Protokoll, wieder was erledigt, 5 Minuten Arbeitszeit abzurechnen...)

Die große Linie

In jedem Projekt müssen gewisse Grundvoraussetzungen erfüllt sein, um einen erfolgreichen Projektabschluß zu ermöglichen. Hierzu gehören eine Regelung zur Zuständigkeit, Verschaffung eines Überblicks, eine Leitung und nicht zuletzt die Ausbildung der Projektmitarbeiter. Daneben muss der Projektauftrag definiert sein.

Zuständigkeiten

Ohne Zuständigkeiten zu verteilen und abzugrenzen geht nichts. Dabei ist die Zuständigkeit nicht für den gesamten Entwicklungzyklus star zu sehen. Ohne eine Regelung werden Sie jedoch sehen, dass entweder Teilbereiche von mehreren Personen bearbeitet werden oder aber ganz außen vor bleiben.

Überblick

Jeder an der Entwicklung Beteiligte muss das Ziel kennen. Nur so lassen sich Fehlentwicklungen vermeiden.
In einem Projekt wurde zum Start alle Betroffenen zusammengerufen und in einer mehrstündigen Veranstaltung die Ziele vorgestellt. Dabei waren Diskussionsbeiträge genauso erwünscht wie kurze Statements soweit das Ziel des Projektes nicht in Frage gestellt wurde. Hier wurden selbst Beteiligte informiert, die absehbar in den nächsten Monaten noch nicht im Projekt mitarbeiten würden.

Leitung

Die (An)Leitung bzw. Projektleitung kann aufgrund Ihrer Vorgaben erheblichen Einfluß auf die Qualität der Entwicklung nehmen. Ziel muss es sein das richtige Mittelmaß zu finden - zwischen ausreichend Tests der Komponenten und Vorantreiben des Projektes/der Entwicklung. Dabei können zu hoch gesteckte Ziele genauso schädlich sein wie zu viel Spielraum (von "Das schaffen wir sowieso nicht." bis "Da haben wir noch so viel Zeit, da bleibt uns auch noch etwas zum...").

Ausbildung

Die Ausbildung der (internen) Mitarbeiter ist eine wesentliche Grundkomponente. Aber insbesondere bei großen Projekten ist auch die "Ausbildung" der externen Mitarbeiter notwendig.
In einem Projekt an dem ich teilnehmen durfte wurde mit einer Ausbildung von ca. 12 Monaten für interne Mitarbeiter gerechnet. Externe Mitarbeiter wurden zumindest hinsichtlich Projektstruktur und deren Vorgaben eingewiesen.
In einem anderen Projekt wurden gestandene Programmierer nach ein paar Java Grundkursen in die Entwicklung einer komplexen Swinganwendung "gesteckt" - die Anlaufschwierigkeiten waren entsprechend hoch...

Der Projektauftrag

Der Projektauftrag muss definiert sein und vorallem in seinen groben Zielrichtungen festgelegt werden. Es bringt wenig, wenn sich der Projektauftrag elementar verändert. Was Elementar ist kann in jedem Projekt unterschiedlich sein.
In einem Projekt zur Betriebssystemumstellung einer Software ist die Änderung der Zielplattform eine elementare Veränderung. Selbst die Änderung hinsichtlich einer Betriebssystem Version kann hierbei gewichtige Auswirkungen haben.
Ein anderes Beispiel ist die Vorgabe der Anwendungsplattform: ob ich eine Stand-Alone-Client Anwendung aufsetze oder eine serverbasierte mehrschichtige Anwendung haben möchte hat gravierende Auswirkungen auf die Softwarearchitektur.
Eine Änderung des Projektauftrages während des Projektes hat eine entscheidene Auswirkung auf die Qualität des abgelieferten Produktes und/oder den Zeitpunkt des Projektendes.

Softwareentwicklungsumgebung

Softwareentwicklungsumgebung [SEU] als maßgebender Faktor zur Qualitätssicherung? Ja! Dies scheint vielleicht nicht auf den ersten Blick so zu sein doch es gibt einiges zu bedenken. Kleine Projekte können Sie problemlos mit einem Texteditor und einem Kommandozeilenorientierten Compiler durchführen.

Die SEU soll die Entwickler unterstützen. Dies bedeutet der Softwareentwickler bekommt die SEU bereitgestellt in einer Form das dieser mit der SEU sofort arbeiten kann. Weiterhin soll der Entwickler alle notwendigen Funktionalitäten in seiner SEU haben. Hierzu gehören heut zu Tage u.a. integriertes Refactoring ebenso wie Debugging (auch Animieren genannt).
Zwei Beispiele: In einem weiteren Projekt konnte ich mich am ersten Tag an meinen Schreibtisch setzen, hatte Stifte, Papier, Locher etc. Ich schaltete meinen Entwickler PC ein, meldete mich mit dem Passwort an (auch dies hatte ich unaufgefordert benannt bekommen) und konnte sofort die Entwicklungswerkzeuge benutzen. So muss es sein. Es geht jedoch auch anders... so gibt es die Auffassung ein Entwickler ist selbst für seinen PC verantwortlich. D.h. der Entwickler "verschwendet" seine wertvolle Zeit damit den PC ersteimal mit der notwendigen SEU zu installieren - um genau zu sein nicht der Entwickler sondern JEDER Entwickler. Auch dies ist leider ein Praxisbeispiel.

Vorgehensmodelle zur Softwareentwicklung

Es gibt zahlreiche Vorgehensmodelle zur Softwareentwicklung.

Extreme Programming

Extreme Programming [XP] auch als eine Lösung gerühmt propagiert einige Konzepte, welche einer hohen Qualität Ihres Softwareproduktes zu Gute kommen kann. Dabei werden u.a. das Pair Programming (zwei Entwickler codieren gleichzeitig) den selben Quellcode, Testgesteuerte Programmierung (erst den Test für die Funktionalität dann die Funktionalität selbst kodieren), ständiges Refactoring und globales Eigentum am entstehenden Quellcode (jeder Entwickler des Teams kann zu jeder Zeit jeden beliebigen Quellcode ändern) sowie ein Minimum an Überstunden gefordert.
XP wird für große Projekte meist abgelehnt, da es keine genauen Termine festlegt. Nun ja XP ist nichts neues. Fast jeder Entwickler hat schon mal einen Kollegen gerufen, um ein Stück problematischen Quellcode anzupacken. Tests zu schreiben bevor man programmiert würde ich eher als heres Ziel ansehen, da die Zeit der Entwickler meist dagegen spricht. Andere Punkte sollten Sie in Hinblick auf die Qualität IMHO sogar ersthaft hinterfragen. So ist es in Projekten wichtig klare Schnittstellen zu haben die durch das oben angesprochene globale Eigentum eher gefährdet sind. In den Projekten an denen ich mitarbeiten durfte wurde XP auf Teamebene meist in mehr oder weniger Umfang erfolgreich eingesetzt. Es ist aber kein Allheilmittel!

Testen der Software

Softwaretest - ja das braucht man um qualitativ hochwertige Software zu erstellen! Aber was ist eigentlich Softwaretest? Das Testen von Software nimmt häufig einen zu geringen Stellenwert ein. Den Satz "Das Programm wird verteilt [...] aber OHNE IRGENDEINE GARANTIE, nicht einmal die Garantie auf Funktionsfähigkeit. Für mögliche durch das Programm verursachte Fehler und Schäden an Soft- und Hardware übernimmt der Autor keine Haftung!" kennen Sie sicher in der einen oder anderen Ausprägung. Diesen habe ich übrigens aus der Hilfe des Werkzeugs entnommen, mit dem ich gerade diese Seiten erstelle - IMHO ein sehr gutes Produkt. Eingentlich ist diese Aussage ein Armutszeugnis aber wahrscheilich lesen Sie genau deshalb diesen Artikel hier. Das Testen selbst umfaßt mehrere Teile, wobei wir und den Bereich der Kodierung später anschauen werden.

Testsystem

Ein Testsystem ist ein System bei welchem dem Entwickler weitestgehende Rechte eingeräumt werden. Ziel des Testsystem ist es funktionsfähige Software in eine definierte Umgebung zu bringen und auf Fehlerfreiheit zu prüfen. In ein Testsystem kommt hierbei Software, welche noch nicht an den Kunden ausgeliefert worden ist. IMHO sollte stets ein Testsystem betrieben werden.
Mal wieder ein Beispiel wie es nicht sein sollte: Bei einer Software, welche in der ganzen Bundesrepublik Deutschland im Einsatz ist wurde auf ein Testsystem verzichtet. Warum ist mir nicht bekannt. Das Produkt war in den ersten drei Versionen derart mit Fehlern gespickt, dass einzelne Kunden nicht bereit waren das Produkt einzusetzen bzw. andere Produkte eingesetzt haben.

Referenzsystem

Ein Referenzsystem stellt ein System dar wie es beim Kunden im Einsatz ist. Es dient insbesondere der Problemlösung bei auftretenen Störungen. Diese sollen durch eine möglichst getreue Wiedergabe des System beim Kunden [Produktionssystem] nachvollzogen werden. Standardmäßig hat ein Entwickler keine besonderen Rechte. Software, welche ein Problem beheben sollen können temporär in ein Referenzsystem eingespielt werden. Ein wesentliches Merkmal eines Referenzsystem ist, dass es jederzeit möglich ist den Zustand wie im Bereich der Produktion (wieder) herzustellen.
Mal wieder ein Beispiel gefällig? In einer größeren Firma die die Software nur für Ihre Kunden mit genau definierten Zielsystem herstellt ist man der Meinung Test- und Referenzsystem in einem abbilden zu können. Dummerweise treten immer wieder Fehler in dem Produktionsbereich auf, welche in diesem System nicht vorhanden sind - woran dies wohl liegen mag???

Anwendertest / Akzeptanztests

Diese Art von Test durchzuführen ist mehr verbreitet als man glauben möchte. Teilweise entspricht dies der sogenannten Beta-Version. Lasse einen Teilbereich deiner Kunden meckern bevor du dir alle Kunden verprellst. Ziel ist es bei einer Konzeption der neuen Software (Stufe 1) oder kurz vor der Freigabe (Beta) Probleme zu finden und diese möglichst vor Auslieferung zu beseitigen. Während bei dem Test einer Konzeption speziell der Akzeptanztest im Vordergrund steht um frühzeitig Fehlentwicklungen zu vermeiden, ist es Ziel des Betatest die letzten Bugfixes vorzunehmen.
Ein positives Beispiel aus einem Projekt in das ich mehr zufällig hereingerutscht bin: Aufgrund geänderter Rahmenbedingungen wird in der Firma ein neues Oberflächendesign mit geänderte Handhabung angestrebt. Aus diesem Grund wurde bereits vorab ein Team gebildet welches auch mit späteren Anwendern besetzt ist. Parallel zu den Bestrebungen dieses Teams wird ein Oberflächenprototyp entwickelt der die Anforderungen der Anwender des Teams wiederspiegelt. In einem weiteren Schritt werden "unbedarfte" weitere Anwender auf diesen Prototyp losgelassen um die Anforderungen des Teams weiter zu verifizieren.

Qualitätsgetriebene Kodierung

Test der Software- / Komponentenfunktionaliät

Schnittstellenentwicklung

Schnittstellen sind in jedem Projekt, welches die einfachen Hausmannskost übersteigt, ein wichtiges Instrument. Legen Sie klare Schnittstellen fest, legen Sie Zuständigkeiten fest, legen Sie den Umfang fest. Vermeiden Sie in der Kodierung alles gleich Programmieren zu wollen. So schön dies ist Produkte wie MS Word sind auch nicht gleich in Version 2003 herausgekommen und die Zeit wird Ihnen sonst an anderer Stelle fehlen. Mal wieder ein Praxisbespiel: In einem Projekt an dem ich arbeite wurde der Zugriffschutz für die Java Anwendungen portiert. Die Teile die implementiert sind (geschätzte 70 %) sind gut getestet die verbliebenen 30% werden auf Java Seite noch nicht benötigt. Zudem ist das Zugriffschutzpaket klar gekapselt. Alle Klassen sind mit der Sichtbarkeit package visible oder protected ausgestattet. Um Zugriff zu bekommen wurde eine Klassenfactory genutzt, welche Schnittstellentypen zurückliefert. Dies hatte den klaren Vorteil, dass die Fachprogrammierer ohne fertige Implementation des Zugriffschutzes bereits loslegen konnten.

Muster (Design Pattern)

Die Nutzung von Mustern ermöglicht Ihnen positive Erfahrungen aus "vergangenen Zeite" sprich früheren Projekten mitzunehmen. Nutzen Sie Muster wo es sinnvoll ist! Dies ermöglicht auch Quereinsteigern in Ihr Projekt schnell einen Überblick zu bekommen. Muster können vielfach auch helfen Probleme z.B. hinsichtlich Performance zu lösen (Stichwort Fliegengewicht).

Funktionalitätstest

Die Funktionaliät der Softwarekomponenten sollte frühzeitig fest stehen. Die "eierlegende Wollmilchsau" ist eher ein Problem für qualitativ hochwertige Software (vgl. Schnittstellen). Eine gute Möglichkeit die Funktionalität zu testen sind sogenannte Unittests. Ein gutes Beispiel ist die für Java entwickelte JUnit API, welche inzwischen für andere Programmiersprachen portiert wird.

Dokumentation

Projekte ohne Dokumentation brauchen sich um die Qualität keine Sorgen machen - sie wird irgendwann nicht mahr vorhanden sein. Dokumentation muss nicht Prosa sein und oft sagen ein paar Beispiele Ihren Entwicklern mehr als tausend Worte.
Ich schreibe häufig einige Beispiele zu einem kleinen Teilaspekt in einem gesonderten Projekt. Dies hat den Vorteil schnell die Funktionalität testen zu können und anderen Entwicklern mit ein paar Zeilen Code zu zeigen wie sie an die gewünschte Information kommen.

Performancetest

Wenn Sie ein Performanceproblem haben dann nutzen Sie die Werkzeuge dafür. Natürlich geht es auch ohne diese z.B. indem Sie Ausgaben in Ihr Programm einbauen, diese müssen jedoch später wieder entfernt werden was zusätzlichen Aufwand bedeutet. Zahlreiche Entwicklungsumgebungen bieten entsprechende Werkzeuge zumindest in den "High-End"-Versionen an. Eine andere Möglichkeit ist das Loggen der Anwendung. Die Anweisungen können hierbei im Quelltext bleiben und auch für die Fehlersuche verwendet werden.

Lasttest

Sofern möglich nutzen Sie Werkzeuge. Eine Lasttest selbst zu entwickeln ist schwer aber möglich.
Ich habe vor einiger Zeit einen Lasttest geschrieben, welcher fachliche Transaktionen an ein J2EE System abgesetzt hat. Dies diente lediglich die Realisierungsmöglichkeit eines Systems zu zeigen und hat aufgrund der Multithreaded-Anwendung bereits einige Entwicklungszeit benötigt.

Loggen der Software

Sun hat mit der 1.4er Version von Java es endlich geschafft eine ordentliche Logging-API auf die Beine zu stellen. Ganz klar sollte allen im Projekt beteiligten sein: Logging bedeutet nicht einfach ein paar Displays auf die Kommandozeile abzusetzen. Für viele Programmiersprachen gibt es Ableger von Log4J. Hierbei handelt es sich um ein Framework welches ein Logging für Java vor Version 1.4 unterstützte. Andere Programmiersprachen wie MF Cobol unterstützen das Logging von Hause aus (D Schalter in Spalte 7).
Persönlich neige ich dazu nicht unnötig viele Fremd-APIs in ein Projekt einzubringen. Daher verwende ich am liebsten die Logging API von Sun für meine Java Projekte. Sollten Sie ein gestandenes Softwareprodukt mit eigener Logging-API haben denken Sie auf jeden Fall darüber nach hier ein Umsatteln in Kauf zu nehmen. U.a. dieser Punkt führte zu einem Nichteinsatz eines Produktes, da auch hierfür der Einarbeitungsaufwand zu groß wurde.
Ich nutze inzwischen fast nur noch das Logging für die Ausgaben auf die Console. Mit ein wenig Aufwand ist dies und der Umfang von Außensteuerbar.

Die richtige Programmiersprache

Nutzen Sie die Programmiersprache, die am besten für Ihre Aufgaben geeignet ist. Wollen Sie z.B. Textanalyse betreiben so ist Cobol sicher nicht die beste Wahl, Echtzeitanwendungen müssen nicht unbedingt mit Java und grafische Oberflächen auch nicht mit Perl programmiert werden. Klar können Sie es jeweils machen aber Aufwand und Nutzen sollten Sie unbedingt vorab prüfen.