Jürgen Schwarzit ^ softwaretechnik

0100 1001 0010
0011 0101 0111
1000 0001 0110

Themen und Ideen

    Continuous Integration

    Der zeitnahe Build nach Code Änderungen und die Durchführung von Komponenten-Tests lassen die Ursache von Fehlern und die Auswirkungen der Änderungen auf das funktionale Verhalten einer Anwendung schnell erkennen und rechtzeitig beheben. Wird dies automatisiert, so ist Continuous Integration gegeben:

    Jenkins / Hudson ist ein Java Open Source Projekt mit einer Web-basierten Plattform für Continuous Integration. Jenkins kann mit einem einzeiligen Aufruf auf der Kommandozeile gestartet werden. Benutzt das Projekt bereits Maven und SVN, kann die weitere Konfiguration in wenigen Minuten abgeschlossen werden. Da Builds auch über beliebige Batch Skripts gestartet werden können, lassen sich auch andere Projekte - und eben auch nicht Java-basierte Projekte - problemlos einbinden. Über Plugins wird die Funktionalität erweitert, und es lassen sich auch andere Versionskontrollsysteme als SVN anbinden.

    Als Build Server genügt ein einfacher Entwicklungsrechner mit installiertem JDK. Der Rechner sollte allerdings dediziert nur für diesen Zweck eingesetzt werden, da das Compilieren sehr Prozessor-lastig ist. Eine Installation in einer virtualisierten Umgebung (VirtualBox, VMWare) ist ebenfalls möglich. Sollte ein Build viel mehr Ressourcen benötigen, so läßt Jenkins sich auch als Cluster betreiben.

    Agile Entwicklungsmethoden

    In den Vorgehensweisen nach dem klassischen Wasserfallmodell durchlaufen die Projekte nacheinander die jeweiligen Phasen. Insbesondere beginnt die Software-Entwicklung auch erst, wenn die vollständige Spezifikation erstellt ist. Integrations- und Systemtests erfolgen erst zum Projektende.

    Dabei treten oft typische Schwierigkeiten auf, die zu Zeitverzug und Akzeptanzproblemen führen können. Agile Entwicklungsmethoden versuchen, diesen Schwierigkeiten zu begegnen:

    Ob und welche agile Methode geeignet ist, muß abhängig von Projektsituation, Erfahrungsstand des Projektteams und der verfügbaren Ressourcen entschieden werden. Scrum eignet sich zum Beispiel, sofern Projekt- und Funktionsumfang schon relativ gut bekannt sind. XP ist bei viel unbestimmterer Ausgangslage möglicherweise besser. Sind Ressourcen eng begrenzt oder wird ein vorhandenes System im Rahmen der Wartung erweitert, so kann Kanban ein guter Ansatz sein.

    So ist also für jedes Projektumfeld und je nach Kontext eine agile Methode auszuwählen und im jeweilig angebrachtem Umfang umzusetzen. Gerade auch die schrittweise Einführung von Teilaspekten kann dabei Vorteile gegenüber einem radikalen Paradigma-Wechsel haben.

    Code und Architektur Reviews

    Softwarequalität läßt sich durch manuelle Reviews und Software-basierte Verfahren (den Code Metriken) prüfen und verbessern. Damit kann Fehleranfälligkeit und Wartungsaufwand bereits während der Entwicklung reduziert werden. Dieses gilt nicht allein für den Programmcode, sondern auch schon für die gewählte Architektur.

    Architektur Reviews

    Ist die gewählte Architektur dem Zweck angemessen? Ist ein einfacherer Ansatz gegenüber unnötig komplexen Ansätzen möglich? Kann eine Aufteilung in kleinere, unabhängig von einander zu testenden und zu wartenden Komponenten vorgenommen werden? Wie sieht es mit einem REST (Representational State Transfer) Ansatz aus? Sind Microservices mit jeweils dedizierter Infrastruktur ein Konzept zur Modularisierung einer komplexen Anwendung?

    Reviews von Datenbank-Modellierungen

    Werden die Daten so modelliert, wie sie später von der Anwendung gelesen und geschrieben werden? Werden einheitliche Datentypen verwendet? Können sinnvolle Views definiert werden? Z. B. ist der Zugriff auf eine View mit komplexen Joins performanter als die Joins per SQL direkt auszuführen.

    Code Reviews

    Code Metriken können nicht alles abprüfen, ein manueller Blick in den Sourcecode ist zusätzlich sinnvoll - und nebenbei können so auch Erfahrungen weitergegeben.

    Code Metriken

    Mit Code Metriken kann Softwarequalität definiert und gemessen werden. Der Umfang und die genaue Ausprägung sind dabei jeweils von Fall zu Fall festzulegen. Bei Einführung dieser Qualitätsmaßnahmen sollte erst nur mit wenigen Punkten begonnen werden.

    Ein derartiges Vorgehen folgt der Goal-Question-Metric Methode: Was ist das Ziel der Maßnahme? Was soll damit gemessen werden? Welche Metrik ist dazu geeignet?.

    Einige wichtige Kriterien sind dabei:

    Lesbarkeit des Sourcecodes:

    Hiermit kann vor allem die Wartbarkeit der Software verbessert werden. Welche Werte dabei akzeptabel sind, wird im Einzelfall festgelegt - Metriken hierzu:

    Komplexität der Software:

    Mit der Komplexität nimmt die Fehleranfälligkeit einer Software zu. Gleichzeitig sinken Wartbarkeit und auch Testbarkeit - Metriken hierzu:

    Fehlerfreiheit der Software:

    Dieses Maß gibt Auskunft über die tatsächliche Funktionalität der Software - Messung über:

    Dokumenterstellung mit XML/XSL und Apache FOP

    Liegen Daten strukturiert als XML Dokument vor, kann diese Quelle in unterschiedliche Formate zur Weitergabe an verschiedene Empfänger umgewandelt werden. Da es nur eine Quelle gibt, ist dabei auch sichergestellt, dass die Datenbasis immer exakt gleich ist.

    Die Umwandlungen können mit XML Stylesheets (XSL) vorgenommen werden, das nur einmal festgelegt werden muß. Die Ausgabe in ein Maschinen-lesbares Format - XML ist das natürlich selbst schon - ebenso wie in ein HTML Dokument zur Anzeige im Webbrowser oder für den Mailversand ist möglich. Das XSL definiert das Layout und enthält Platzhalter für die konkreten Daten aus dem XML Dokumemt.

    Mit Hilfe des Java-basierte Open Source Projekt Apache FOP kann insbesondere mittels XSL-Transformation auch PDF erzeugt werden.

    Technische Dokumentation mit Javadoc

    Zur Dokumentation von Anwendungen und APIs bietet Java seit Beginn Javadoc. Hier werden direkt im Source Code Klassen, Methoden und Attribute mit der Besschreibung annotiert. Der Javadoc Prozessor generiert daraus eine HTML-basierte Dokumentation. Javadoc richtet sich als Dokumentation nicht nur an die Entwicklung (Weiterentwicklung und Wartung), sondern kann auch die technische Dokumentation bilden.

    Obwohl Javadoc schon Jahrzehnte vorhanden ist, wird diese Dokumentationsmöglichkeit selten oder falsch genutzt:

    Javadoc ist zunächst spezifisch für Java. Aber nach diesem Beispiel haben sich entsprechende Kommentierungen entwickelt für PHP, C++, C# ... Hier kann der Ersatz für den Javadoc Prozessor nicht so leistungsfähig sein. Aber ein derartiger Prozessor läßt sich einfach einmalig erstellen.

    Wiki zur Erstellung & Generierung von Dokumenten

    Vorbemerkung: Nachfolgend kann sich Dokumentation hier sowohl auf die Dokumentation einer Anwendung als auch einer fachlichen Spezifikation beziehen oder auch auf sonstige andere Inhalte, die das Erstellen eines umfangreichen Dokuments erforderlich machen.

    Fachliche und technisches Spezifikationen können auch in einem Wiki, also als Webseiten, geschrieben werden. Doch warum sollte man das tun?

    Typischerweise werden Dokumentaionen mit MS Word estellt. Die Gründe sind klar:

    Doch in der Praxis ergibt sich eine Vielzahl von Problemen, die nur mit der Raison des ersten Punktes akzeptiert werden - und die das Management nicht zu sehen bekommt. Welche Schwierigkeiten treten konkret auf?

    Lösungsidee:

    Die Dokumentation erfolgt in einem Wiki.

    Hierfür wird eine Wiki Software benötigt mit eigener Versionskontrolle oder der Anbindung an ein vorhandenes System wie z. B. Subversion, Textvergleich und Benutzerverwaltung. Dies bieten die meisten Wikis an, beispielsweise MediaWiki (das Wiki der Wikipedia), DokuWiki, JSPWiki, Confluence (Atlassian) (mit kommerziellen Support).

    Aber wie wird hieraus jetzt ein Dokument?

    Der Wiki Crawler:

    Ähnlich wie eine Suchmaschine das Web indiziert, wird hier eine spezielle Software auf die Startseite der Dokumentation im Wiki angesetzt. Dieser Crawler generiert dann das vollständige Dokument.

    Der Start des Crawler kann manuell oder auch zeitgesteuert automatisiert erfolgen.

    Die Vorgehensweise des Crawler ist wie folgt:

    Der Crawler erstellt zunächst eine XML Datei, die alle für das zu generierende Dokument erforderliche Informationen enthält. Dieses XML wird dann mit einem XSL Stylesheet in das endgültige Ausgabeformat transformiert, z. B. HTML oder PDF. Die auf diese Weise generierte Dokumentdatei kann dann - auch automatisiert - in einem Versionskontrollsystem abgelegt werden.

    Insbsondere kann auch die XML Datei versioniert werden, bei der Änderungen leicht mit einem Textvergleich erkennbar sind. Eine erstellte und versionierte PDF Datei bildet einen definierten Stand, der so dokumentiert auch an den Kunden gegeben werden kann.

    Dieser Lösungsansatz erfolgt bewußt nicht auf Basis eines Plugin, um unabhängig von dem jeweilig eingesetztem Wiki zu sein.

    FIT - das Framework for Integrated Testing

    FIT ist das Framework for Integrated Testing. Dieses Testframework bietet Komponenten- und Integrationstests. Das Framework ist eine Java Anwendung. Testcode ist ebenfalls in Java - ähnlich wie JUnit Klassen - zu implementieren.

    Bei FIT werden Testdaten und Testaufrufe in der Testdokumentation (auf Basis von Word, Excel, Wiki/HTML) tabellarisch eingebunden. Insbesondere sind hier auch die erwarteten Testergebnisse enthalten. Dieses Dokument dient dem Testframework als Eingabe. Nach manuellen - oder auch z. B. per Ant Skript automatisierten - Start werden die Testfälle mit den zugehörigen Eingabedaten programmatisch extrahiert und die korrespondierenden Testklassen aufgerufen. Die Testergebnisse werden in dem Eingabedokument - oder auch einer Kopie - eingetragen. Insbesondere wird dabei der Erfolg (Übereinstimmung mit dem erwarteten Ergebnis) oder Fehlschlag festgehalten.

    Auf diese Weise kann mit FIT der Fachbereich Testszenarien und sinnvolle Testdaten erfassen. Gleichzeitig wird jeder Testlauf und dessen Ergebnis dokumentiert (und archiviert).

    Außerdem ist es insbesondere auch nicht-technischen Mitarbeitern möglich, Funktionalität einer Anwendung bereits zu testen, ohne dass eine Benutzeroberfläche vorhanden ist.

    Beispiel:

    Ein Testszenario besteht aus dem Laden von Testdaten (Klasse test.LoadTestData mit Aufruf der Methode load()) und der anschließenden Verarbeitung (Aufruf der Methoden checkResult() und checkOtherResult() der Klasse test.ProcessTestData). Das Testdokumemt enthält im beschreibenden Text dazu die Tabellen:

    test.LoadTestData
    attribute 1attribute 2...load()
    value 1value 3...
    value 2value 4...
    .........
    fit.ActionFixture
    processtest.ProcessTestdata
    checkcheck resultexpected result value 1
    checkcheck other resultexpected result value 2
    .........

    Nach dem Testlauf sind im Erfolgsfall die Tabellenzellen grün hinterlegt oder bei Fehlern rot, also zum Beispiel:

    test.LoadTestData
    attribute 1attribute 2...load()
    value 1value 3...true
    value 2value 4...true
    ............
    fit.ActionFixture
    processtest.ProcessTestdata
    checkcheck resultexpected result value 1
    checkcheck other resultexpected result value 2 (expected)
    some value (actual)
    .........

    IBM Rational Application Developer vs. Eclipse

    Gibt es eine Alternative zum Eclipse-basierten Rational Application Developer von IBM mit dem darin integrierten Websphere Application Server?

    Der Umstieg auf die Open Source-Version von Eclipse ist problemlos möglich. Statt des integrierten Webspheres kann der separat zu installierende Websphere Standalone verwendet werden, der für die Entwicklung frei von Lizenzkosten ist. Es sind lediglich die folgenden Punkte umzustellen:

    Mit einem solchen Umstieg lassen sich Lizenzkosten einsparen. Außerdem sind die Hardware Anforderungen nicht mehr so hoch. Die Entwicklungsumgebung mit dem reinen Eclipse reagiert zügiger, der Websphere Standalone startet bzw. aktualisiert die Anwendungen schneller.

    Virtualisierung der Entwicklungsumgebung

    Oft wird vorgeschlagen, die Entwicklungsumgebung zu virtualisieren z. B. mit VirtualBox. Als Argumente werden genannt:

    Doch ist das wirklich so? Meine Erfahrungen aus einem Projekt mit etwa 150 Mitarbeitern:

    Die beiden ersten Punkte lassen sich natürlich durch Disziplin und guten Willen in den Griff bekommen. Aber ein technisches Hilfsmittel wie Virtualisierung allein hilft nicht.

    Geht es nur darum, Installations- und Konfigurationsaufwand einzusparen, so kann auch auf "portable" Software und gezippte Installationen zugegriffen werden. Konfigurationen können in einem Versionskontrollsystem eingestellt werden, und alles wird in der richtigen Reihenfolge mit einem Skriptaufruf installiert.

    REST

    Representational State Transfer (REST) ist ein Ansatz, die benutzte Technologie einer Anwendung und die Art des Aufrufs der zur Verfügung gestellten Services zu trennen.

    Anfragen an ein RESTful System, also Interaktionen eines Anwenders oder Systemschnittstellen, werden über definierte URLs vorgenommen. Der Request-Type unterscheidet dabei lesende Zugriffe (GET für reine Abfrage von Daten) und schreibende (POST für neue oder geänderte Daten, DELETE für Löschungen). Unterschiedliche Ausgabeformate bei gleichem Aufruf werden über den akzeptierten Content-Type gesteuert (z. B. html für menschliche Benutzer, pdf für Reports, text (Flatfile) und xml (strukturierte Daten) für Maschinen-Schnittstellen).

    Die Architektur eines Systems kann auf diese Weise wenig komplex und überschaubarer werden. Damit kann Entwicklungszeit reduziert und die Wartbarkeit verbessert werden, insbesondere bei wechselnden Entwicklerteams.

    Doch ist dieser Ansatz gefährlich, wie an dieser Stelle - "restful considered harmful" - geschrieben wird? Die hervorgebrachten Argumente sind wenig überzeugend:

    Warum soll bei REST auf die Dokumentation des Systems verzichtet werden?

    Warum müssen Daten immer nur per JSON ausgetauscht werden?

    Ist es wirklich besser bei Verwendung von Message Queues, statt ein System per URL zu exponieren, gegenüber Drittsystemen den Queue Manager erreichbar zu machen?

    Eingabe-Validierung erfolge nicht automatisch, aber dies ist doch immer so? Auch wenn ein XSD definiert ist, muß die Validierung dagegen aufgerufen werden ...

    Selfpublishing

    Bei aller Leichtigkeit, mit der man heute das eigene Buch – in gedruckter oder elektronischer Form – veröffentlichen kann, sind dennoch einige Punkte zu bedenken, die vielleicht zu ein wenig Ernüchterung führen.

    Hier möchte ich ein paar Gedanken zu meinen eigenen Erfahrungen in diesem Bereich vorstellen.

    Textsatz

    Die Vorlagen zur Herstellung eines gedruckten Buchs sind bei den meisten Anbietern PDF Dokumente. Dies gilt sowohl für den Buchblock, also den Textseiten des Buchinhalts selbst, als auch dem Cover. Die Gestaltung des Satzspiegels, also des Seitenlayouts, unterliegt dabei einer ganzen Reihe von Konventionen. Diesen liegt die Jahrhunderte lange Erfahrung zugrunde, was das Lesen eines Buchs tatsächlich angenehm macht. Sie haben durchaus ihre Berechtigung. Neben den Inhalten und den Gedanken, die ein Buch weitergeben möchte, ist somit auch der Textsatz eines Buchs von einiger Bedeutung. So leicht, wie ein Dokument zum Beispiel mit MS Word geschrieben werden kann, kommt dabei dennoch nicht immer auch ein vom Layout her anspruchsvolles Buch heraus. Und es ist wie überall: ein hässliches, aber funktional – oder bei Büchern: inhaltlich – hervorragendes Produkt bleibt trotzdem in den Läden liegen.

    Textsatz spielt auch bei elektronischen Büchern eine Rolle. Hier kommt es aber nicht so sehr auf die ästhetische Gestaltung an – das übernehmen die Lesegeräte und Anwendungen selbst – als vielmehr auf eine durchgehend korrekte Strukturierung. Nur so kann ein Leseprogramm auch das Dokument optimal den Lesenden anzeigen.

    Druckkosten

    Die Kosten für die Herstellung eines gedruckten Buchs sind relativ hoch. Bei einem realistischen Verkaufspreis bleiben da eher weniger als 15% Gewinnanteil als mehr. Amazons CreateSpace ist dabei der mit Abstand günstigste Hersteller.

    Elektronische Bücher

    Die Grundlage für die Einstellung eines Buchs in einem elektronischen Format ist – unabhängig von Verkaufsplattform oder Zielformat – weitgehend das standardisierte Format ePub. Hier liegt das Buch letztendlich als Webseiten vor, die in eine Archivdatei verpackt werden. Gegenüber PDF als Ausgangsformat ist nur im ePub die Kapitelstruktur eindeutig festgelegt – und ein direkter Kapitelzugriff ist für elektronische Bücher eine erwartete Komfortfunktion.

    Ein typisches Problem:
    Inhaltsverzeichnis ist erstellt, liegt klickbar im Dokument vor, ist korrekt in das ePub eingebunden – und dennoch funktioniert das Menu zur schnellen Navigation im Kindle nicht: der Link zur Seite mit dem Inhaltsverzeichnis ist ausgegraut.
    Abhilfe bringt der folgende Eintrag in der opf-Datei der ePub Struktur:
       <guide>
         <reference href="(relativer Pfad zur Datei mit dem Inhaltsverzeichnis)" title="Inhaltsverzeichnis" type="toc"/>
       </guide>

    Entscheidend ist dabei die Angabe des type="toc".

    Das amerikanische Finanzamt

    Damit haben Sie nichts zu tun? Wenn ihr Partner Amazon (Verkauf dort als Kindle-Buch) oder CreateSpace (Amazons Sparte zur Herstellung gedruckter Bücher) heißt, wird mit einem US Unternehmen zusammengearbeitet. Einnahmen werden dann pauschal mit 30% besteuert – und das entlastet nicht vor einer Steuerpflicht der 100% beim eigenen Finanzamt. Um diese pauschale Besteuerung zu umgehen, wird eine amerikanische Steuernummer benötigt. Deren Beantragung geht nicht über das Internet, sondern telefonisch. Da mag Amazon als Partner vielleicht etwas abschreckend sein.

    ISBN

    Die ISBN wird für den Verkauf von Büchern benötigt. Mit der "kostenlosen" ISBN, mit der von den verschiedenen Anbietern gerne geworben wird, ist allerdings tatsächlich nicht unbedingt ein großes Geschenk zu erwarten. Die von Amazons CreateSpace vergebene ISBN ist eine amerikanische; damit lassen sich die Bücher über Amazon verkaufen und natürlich im amerikanischen Buchhandel – aber im lokalen Buchhandel kommt so ein Buch dann nicht. Die anderen Anbieter wie epubli oder BoD oder andere vergeben durchaus eine deutsche ISBN. Damit erfolgt dann auch der Eintrag im Verzeichnis lieferbarer Bücher – aber das garantiert noch nicht, dass die Bücher auch in die Kataloge der Buchhandlungen übernommen werden. Der Erwerb einer eigenen ISBN ist dabei auch keine Lösung – es sei denn, dass man sich sicher ist, die ca. 100 Euro dafür auch zügig zu verdienen.