Unterstützende Tools und Standards in Softwareprojekten

Um es vorweg direkt zu erwähnen, es ist sicherlich nicht der erste Artikel rund um das Thema Tools und Standards in Softwareprojekten bzw. in der Softwareentwicklung, aber dies muss auch aus gegebenem Anlass niedergeschrieben werden.

Warum braucht man Standards und Unterstützende Werkzeuge in der Softwareentwicklung?

Die Frage ist einfach! Warum nicht?

Konstruktiver: Die Idee dahinter ist eigentlich die, dass der Entwicklungsprozess früher ein rein manueller war. Man hat die Projekte händisch angelegt und gepflegt, Quellcode manuell geprüft (mal gut, mal schlecht), hat viele Dinge in Kleinstarbeit selbst erledigt und noch viel schlimmer, jeder im Team hat es irgendwie anders gemacht.

Früher war dies jedoch kein Problem, als die Anwendungen noch auf eine Diskette passten, dies ist jedoch längst obsolet. Verteilte Anwendungen mit Client-Server Architektur können Heute schon mehrere Gigabyte füllen. Größen von mehr als 500.000 Lines of Code (Zeilen Code) mit komplexen Abhängigkeiten und verteilte Teams in Größen jenseits von 10 Leuten, da ist jeder Minute Geld Wert!

Google ist auch hier ein Pionier, wie Ashish Kumar in seinem Vortrag “Development at the Speed and Scale of Google” auf InfoQ.com beeindruckend präsentiert.

Gerade Google produziert täglich mehrere tausende Zeilen Code, da es deren Kerngeschäft ist. Da zählt jede Minute. Google verfolgt nicht umsonst die Philosophie, dass der Entwickler so wenig Zeit wie möglich auf Tools oder Vorgänge warten muss, da dies verlorene Zeit ist. Dafür investiert Google viel Zeit und Geld, damit dies klappt. Dies schafft Google mit einem raffinierten Zusammenspiel diverser Komponenten (Continuous Integration, Analyse & Reporting, Skalierbarkeit etc.).

Ziel ist es, nach dem Check-In des eigenen Codes binnen weniger Minuten ein Ergebnis zu haben, sprich gebauten Code, der Analysiert wurde und direkten Feedback gibt (Unit-Tests). Dafür gibt es ein Team, das ständig am Prozess und der Hardware und Software arbeitet, damit die Entwickler effektiv arbeiten können. Nichts ist so lästig wie das Warten auf den CI-Server (Continuous Integration Server), der mal wieder eine halbe Stunde für den Bau des gesamten Codestrangs benötigt.

Neben der Standardisierung und Geschwindigkeit, ist auch die Wartbarkeit des Quellcodes ein wichtiger Aspekt. Ein CI-Server ist nichts Wert ohne eine Versionskontrolle wie Subversion oder GiT, in der die Anwendung vom ganzen Team bearbeitet und gepflegt wird.

Ein Ansatz, der Ausbaufähig ist

Für Unternehmen bereits ab kleiner Größe ist bereits die Anschaffung von Hardware für einen CI-Server (Continuous Integration Server) sinnvoll. Mit Build Tools wie Maven oder Ant und einem CI-Server lassen sich Projekte bereits von der Struktur und “From Scratch” standardisieren, in dem man eine einheitliche Konfiguration und Paketierung schnürrt. Mit einer entsprechenden Versionskontrolle (SVN, GiT etc.) lässt sich die Software in einem gemeinsamen “Repository” zusammenlegen, die Teammitglieder arbeiten dann mit der Versionskontrolle. Die Softwareänderungen lassen sich dann nachvollziehen, zurücknehmen oder für Parallelentwicklung auch einzelne Stränge abspalten bzw. auch zusammenführen. Der CI-Server ist dann mit der Versionskontrolle “integriert” und baut darauf auf, in dem er bspw. in so genannten “Nightly Builds” (täglicher CI-Job, der Abends den Quellcode aus der Versionskontrolle “auscheckt und kompiliert). So lässt sich relativ früh erkennen, ob die vorher programmierte Software oder deren Teilbereiche mit dem Rest der Software zusammenarbeitet (Early Integration).

Für einen CI-Server muss man nicht mal viel investieren, die Hardware ist schnell aufgebaut und die meiste CI-Software ist als OpenSource Projekt verfügbar. Hier ein kleiner Auszug:

CI-Server Jenkins

CI-Server Jenkins

Eine sehr starke Community und viel Bewegung ist nach wie vor bei Jenkins zu sehen, das eine sehr lebendige Community hat. Dementsprechend ist auch die Plugin Dichte sehr hoch. In der Vergangenheit sind mir vor allem Hudson bzw. Jenkins CI-Server untergekommen, die sehr flexibel zu konfigurieren sind. Hier lassen sich auch viel mit Pre- bzw. Post-Processing arbeiten, bspw. das ausführen bestimmter Dienste oder Shell-Skripte vor bzw. nach dem kompilieren des Quellcodes.

Für kleine Unternehmen empfehle ich die Diplomarbeit von Martin Rödig: Erhöhung der Softwarequalität in kleinenUnternehmen durch einen Continuous Integration-Prozess.

Dieser hat in der Diplomarbeit CI-Software evaluiert und diese im konkreten Einsatz in einem kleineren Unternehmen beschrieben und geht hier auch auf die Ergänzung um weitere Plugins ein.

Weitere Schritte – Der Ausbau des CI-Servers

Nach der Wahl der Versionskontrolle (bspw. SVN oder GiT) und des CI-Servers (Jenkins, Bamboo etc.) ist ein Frühwarnsystem nötig. Damit der Entwickler nicht jedes mal langwierig seinen Quellcode manuell prüfen muss, sollte dieser Prozess auch automatisiert durch den CI-Server übernommen werden. Arbeitet man intern mit Unit-Tests (Bspw. JUnit Klassen), so kann man auch dies automatisiert in einem CI-Job abbilden.

Für die gängigsten CI-Server wie Jenkins, Bamboo oder CruiseControl gibt es Plugins die das für einen erledigen. Die Integration ist relativ einfach.

Für den Anfang reichen da schon Plugins für

  • FindBugs Analyse
  • PMD Analyse
  • JUnit Durchführung
  • eventuell auch Dependency Analyzer

Gerade FindBugs und PMD sind schon unschlagbar für die Qualität des Codes und noch besser, für die Sensibilisierung der Entwickler für das Thema.  Man sollte die Plugins als Jobs konfigurieren und diese in das Post-Processing des CI-Buildjobs einbinden, so dass diese dann automatisch den Quellcode analysieren (bei jedem kompilieren).

In ausführlichen Statistiken weisen diese dann auf Fehler oder Probleme hin und geben direkt Auskunft über das Paket, Methode und Codestelle.

FindBugs Statistik

FindBugs Statistik

Findbugs mit Angabe der Codezeile und des Problems

Findbugs mit Angabe der Codezeile und des Problems

Das JUnit-Plugin führt alle Testmethoden automatisch aus und weist diese in einem Report separat aus. Die Entwickler bekommen direkt mit, ob alle Unit-Tests durchgelaufen sind oder ob es irgendwo noch Probleme gibt. Die Codequalität erhöht sich dadurch fast im Alleingang. Gut, Fehler beheben muss man dann doch alleine ;).

Überhaupt ist es zu empfehlen, sich genauer mit den Standards, die in statischen Metriken in FindBugs und PMD hinterlegt sind, auseinanderzusetzen. Die Metriken basieren auf “Best Practice” Ansätzen aus langjähriger Entwicklungserfahrung und sollte in einem Unternehmensweitem Standard für die Entwicklung genutzt werden, dabei empfehle ich mit dem Gesamten Team ein Ganzheitliches Bild zu schaffen, da die Philosophien bei der Entwicklung von Software doch recht unterschiedlich sind und auch FindBugs und PMD nur ein Rahmenwerk darstellen.

Wie geht es weiter?

Nun, Grundsätzlich hat man schon viel gewonnen, wenn man in seinem Unternehmen einen einheitlichen Rahmen für Softwareprojekte schafft, in dem man standardisiert die Projekte mittels Versionskontrolle, Continuous Integration sowie unterstützenden Plugins unterstützt. Die Automatisierung und Frühwarnsystem durch Plugins spart viel Zeit und Nerven und somit auch bares Geld.

Automatisierter Entwicklungsprozess mittels Repository, Jenkins und Plugins

Automatisierter Entwicklungsprozess mittels Repository, Jenkins und Plugins

In einem weiteren Artikel werde ich auch noch auf weiterreichende Ideen eingehen, die sich nicht nur auf die Entwicklungsumgebung bezieht.

Quellen:

 

Moleskine bzw. Notizbuchhacks

Gerade durch einen Beitrag bei Blatternet bin ich über die Moleskine GTD Hacks gestoßen und da fiel mir ein, dass ich erst kürzlich diverse Artikel und Beiträge sortiert habe, darunter waren auch Moleskine Hacks dabei, die ich mir unbedingt speichern musste.

Wer also Tipps und Ideen für sein Moleskine oder Notizbuch benötigt, der sollte sich auf diesen Seiten umschauen:

Von klassischer GTD (Getting Things Done) Implementierung bis hin zu Tagebüchern, Fotobücher und vieles mehr, ist dort für jeden Notizbuchliebhaber was dabei.

Weitere Themen für die nächsten Wochen…

In den letzten Tagen sind wieder einige Dinge zusammengekommen, die bei mich prompt viel zum nachdenken brachten. Einige dieser Themen werde ich u.a. hier ansprechen, da diese aus dem alltäglichen Projektleben kommen.

Dies werden u.a. folgende Themen sein, die ich aber noch mal gedanklich durchgehen muss:

Ich hoffe, dass ich in den nächsten Tagen Zeit finde, um die Themen zu beschreiben, um sie hier zu veröffentlichen.

Bis dahin werden aber sicher noch neu Themen dazukommen.

Lessons Learned: Erwartungshaltung im Projekt

Ein Punkt, der mir beim aufsetzen der Seite wichtig war, ist die Selbstreflektion und Review auf meinen eigenen Projektalltag (dies natürlich ohne Personen oder Firmen zu nennen).

Ein wichtiger Punkt dabei ist, aus Fehlern zu lernen – die so genannten “Lessons Learned“.

Erwartungshaltung im Projekt

Die Symptome

Das Projekt mit dem Kunden ist klar, die Anforderungen und der Umfang (Lieferungen der Software, Dokumentation etc.) sind soweit bekannt und das Projektteam arbeitet eine Spezifikation mit dem Kunden aus. Das Team stellt die erste Version der Spezifikation (in Word mit Tabellen, Grafiken und Screenshots) fertig und übergibt es dem Kunden zum Review.

Ergebnis: Kunde ist überrascht über den Inhalt und hat mit etwas anderem gerechnet

Ein weiteres Beispiel: Das Team arbeitet vor sich hin und entwickelt nach der Spezifikation die Funktionen aus, ein anderes Team arbeitet bereits an der Dokumentation. Nach einem Monat wird der erste Teil der Software sowie der Dokumentation geliefert.

Ergebnis: Auch hier klafft die Erwartungshaltung an das Ergebnis mit dem gelieferten auseinander.

In beiden Fällen ist der Kunde “enttäuscht” oder überrascht und erzeugt auf beiden Seiten Ernüchterung und Mehraufwand, im schlimmsten Fall sogar Verzug im Projektplan!

Die Ursache

Ist ganz klar! Der Mensch!

Die ist nicht mal negativ zu bewerten, sondern es liegt in der Natur des Menschen, dass die Erwartungshaltung oder Wertesystem von Person zu Person unterschiedlich ist. Selbst bei Projekten im Deutschsprachigen Raum, gar wenn es nur in einem Bundesland ist, führt zwangsläufig zu diversen Wertesystemen.

Auf Grund des heutigen demografischen Wandels sind wir mit Diversität (siehe auch Diversity Management) im Unternehmen und in Projekt konfrontiert. Dies führt angesichts der Unterschiede in Kultur, Religion, Alter und Soziales Umfeld zu verschiedenen Wertesystemen und in Folge Dessen zu verschiedenen Meinungen, Einschätzungen und Ergebnissen!

Die Lösung

Sicherlich keine Ultimative Lösung für alle Probleme, jedoch sollte man im Vorfeld eines Projektes sicherstellen, dass man zwischen den Projektteams (Auftraggeber und -nehmer) ein einheitliches Verständnis für die Ergebnisse erzielt. Im Vorfeld sollte klar sein, wie das Projekt gehandhabt wird und was in welcher Form geliefert wird.

Speziell wenn es um Themen wie

  • Spezifikation
  • Projektberichte
  • Dokumentation
  • Lieferung

geht, sollte man im Vorfeld ein klares “commitment” erzielen und festhalten.

Dem Kunden und Auftragnehmer sollte klar sein, wie die Dokumente in Form und Inhalt geliefert werden und wie die Kommunikation stattfindet (Zeitlich, Form etc.).

Wenn es um die Umsetzung von Softwareprojekten geht, dann sollte man im Rahmen der Entwicklung bereits in frühen Phasen bereits abgeschlossene Funktionialitäten dem Kunden präsentieren und nicht erst nach Abschluss des Releases. Hier hat sich der Termin vor Ort beim Kunden bewährt um das geleistete direkt im Testsystem oder Prototypen zu zeigen. Alternativ kann man für sowas auch Webkonferenztools nutzen wie WebEx oder GoToMeeting (beides Kostenpflichtig). Im OpenSource Bereich hat sich Mikogo bewährt.

Mit diesen Mitteln lässt sich eine Online-Konferenz planen und durchführen und das System über Screensharing präsentieren. Vor allem nützlich, wenn der Weg zum Kunden weiter ist und Kosten sparen möchte.

Fazit

Mit einer klaren Kommunikation und Klärung der Erwartungshaltung und damit Schaffung einer einheitlichen Sicht lassen sich viele Probleme, Stress und Kosten mindern.

 

Buchempfehlung: Management 3.0 – Leading Agile Developers

Da ich gerade bei Buchempfehlungen bin, bewerbe ich doch das letzte Buch was ich gelesen habe. Dies habe ich bereits in meinem letzten Beitrag erwähnt, da ich gewisse parallelen gesehen habe zum Buch von Prof. Dr. Kruse.

Agile Methoden sind ja nun seit einigen Jahren stark gefragte Themenkomplexe im Projektmanagement, speziell der Softwareentwicklung. Ich kenne keinen, der in irgendeiner Weise nicht bereits damit konfrontiert wurde und sei es nur durch Kollegen oder Artikel im Internet. Scrum, Extreme Programming oder RUP, Hauptsache Agil. Das scheint aktuell in jedem Softwareentwicklungsunternehmen ein Schlagwort zu sein, dabei schreibt sich fast jeder “Scrum” als Leitbild in sein Portfolio, wenn es um die Projektmanagement Methode in der Softwareentwicklung geht (Auch wenn aus meiner Sicht dies nie zu 100% stimmt).

Jurgen Appelo, der Autor des Buchs “Management 3.0: Leading Agile Developers, Developing Agile Leaders“, geht einen Schritt… wenn nicht sogar zwei oder drei weiter. In seinem Buch geht er weniger darauf ein, wie man in Softwareprojekten Agile Vorgehensweisen anwendet, sondern vielmehr wie sich das Gesamte Unternehmen an die Gegebenheiten einer Gesamtheitlichen Agilen Vorgehensweise und Agilen Management anpasst und entwickelt.

In seinen sechs Sichtweisen des Management 3.0 geht er jeweils aus Theoretischer und Praktischer Sicht auf die einzelnen Themenkomplexe ein, die auch weit über den Tellerrand hinausgehen. Dies merkt man vor allem daran, dass er bei Themen wie Soziale Netzwerke, Eigendynamik und -regelung und rund um den Faktor Mensch in einem Unternehmen vom Theoretischen Aspekt auf Chaostheorie, Psychologie und viele andere Wissenschaften eingeht, die das ganze gut veranschaulichen und vertiefen.

Mir hat vor allem der Fokus auf den “Faktor Mensch” und Bildung von Sozialen Netzwerken in einem Unternehmen sehr gut gefallen. Jurgen Appelo hat es verstanden, dass der Mitarbeiter viel mehr ist als eine Ressource in einer Excel Tabelle, die zwischen den Projekte “gestaffed” werden.

Das Buch empfehle ich in Englisch, mit der deutschen Lokalisierung habe ich keinen Kontakt gehabt. Für alle interessierten empfehle ich auch folgende Seiten bzw. Profile:

Buchempfehlung: Management von Instabilität

In den vergangenen Monaten habe ich fasziniert die Videos auf Youtube von Prof.  Dr. Peter Kruse verfolgt. Ein Pionier im Bereich Management, Change-Management, Unternehmensberatung und Psychologie (weitere Infos auf Wikipedia). Dieser ist u.a. als Geschäftsführer in seinem Beratungsunternehmen nextpractice tätig und berät und begleitet Unternehmen bei Prozessstrukturwandel bzw. Change-Prozessen. Mit seinem fundierten Wissen zu Unternehmensorganisation sowie Systemische Theorien sowie Psychologie und Neurophysiologie ist er auch auf vielen Tagungen sehr gefragt.

Aktuell lese ich sein Buch next practice. Erfolgreiches Management von Instabilität, was sich genau um das Thema Change-Prozesse und Unternehmensstrukturwandel bzw. Management im allgemeinen befasst. Dabei geht er von der Theoretischen Perspektive auch auf Themen wie Chaostheorie ein und bindet auch seine Erfahrung auf dem Gebiet der Organisationspsychologie in einer fesselnden Schreibweise ein.

Dabei sind mir auch direkt Parallelen zum Buch von Jurgen Appelo Management 3.0: Leading Agile Developers, Developing Agile Leaders aufgefallen, wenn es um Komplexität in Unternehmensstrukturen geht.

Des Weiteren geht er auch auf praktisch Anwendbare Fälle ein, die er selbst in seiner früheren Zeit angewendet hat.

Wer die Videos von Prof. Dr. Kruse bereits kennt und das Buch noch nicht gelesen hat, dem kann ich das Buch nur empfehlen.

Zuletzt noch ein Video zum Thema Change-Management:


YouTube Prof. Dr. Kruse zu Change-Mangement

Lessons Learned: Datenmodell in Softwareprojekten

Aus frischer Erfahrung kann ich nur bestätigen: unterschätze nie das Datenmodell in IT- bzw. Softwareprojekten.

Zu häufig habe ich bereits Softwareprojekte gesehen, die nach einer kurzen Konzeptions- bzw. Spezifikationsphase in die Entwicklung gegangen sind, ohne das man sich allzu viele Gedanken um das eigentliche Datenmodell gemacht hat. Dabei ist es relativ egal, ob es Softwareprojekte “from Scratch” sind, sprich komplett neu und in Eigenregie entwickelt oder auf Basis von bestehenden Produkten erweitert und “customized”.

Speziell wenn man als Implementierungspartner eine bereits bestehende Software erweitert und beim Kunden implementiert hört man oft die Floskel:

Aber das Datenmodell ist doch schon da?

Mag sein, aber ist es für den Kunden das richtige? In 95% der Fälle mit Sicherheit: Nein!

Das Datenmodell ist für das Gesamtsystem ein essenzieller Punkt, der genau ausgearbeitet sein muss, damit im späteren Projektverlauf keine Ungereimtheiten auftreten und viel Nachgearbeitet werden muss, oder gar schlimmer, bereits abgenommene Funktionen noch mal neu aufgemacht werden müssen.

Zwischen dem Projektteam und dem Kunden muss es ein nahezu 100%-iges “Commitment” zum Datenmodell geben, was zunächst mehr Arbeit erzeugt, sich aber im späteren Verlauf auszahlt, da auch eventuelle Schnittstellen zu Drittsystem (ERP, CMS, Webbasierte Dienste etc.) ein klares Bild für die Spezifizierung benötigen.

Helfen kann man sich sehr leicht, in dem man für das Projekt eine einfache Excel Tabelle “strikt” in dem alle relevanten Inhalte des Datenmodells aufgelistet sind (siehe Screenshot). Gegebenenfalls erweitert man die Excel Tabelle durch die Abbildung von Relationen mittels Microsoft Visio oder OpenSource UML-Tools wie bspw. StarUML, ArgoUML oder Astah Community, die sich im Funktionsumfang kaum unterscheiden und sehr empfehlenswert sind.

Beispiel eines Datenmodells in einer Excel Tabelle

Datenmodell Softwareprojekte

Der erste Beitrag…

nun,  nach langer Zeit habe ich mich doch dazu entschieden, wieder zu bloggen, weniger des bloggens willen, sondern mehr um den Inhalt aus meinem Kopf zu bekommen, das sich so langsam anstaut.

Der Inhalt dieser Seite wird sich zunächst auf Softwareprojekte, E-Commerce (das Umfeld in dem ich arbeite), Projektmanagements, lessons learned, Webdesign und Web-nerdiges beschränken.

Ich bin schon selbst gespannt, welcher Inhalt dabei rumkommt.