Montag, Juli 09, 2007

Oho Zoho

Ich hatte gejammert, dass Google zwar Word- und Excel-Clones für das Web anbietet, aber nichts für Power-Point. Ich wollte auch gar keine Präsentation im klassischen Sinne erstellen. Wir mussten aber kooperativ an einer Abbildung arbeiten. Und das mit Hin- und Herschicken von Power-Point-Dateien zu machen, ist einigermaßen umständlich.

Mein Bruder Arne wusste aber Rat: Zoho bietet eine kostenlose Präsentationssoftware als Web-Anwendung, mit der man kooperativ auch Abbildungen erstellen kann. Und ich konnte sogar unsere bereits mit Power-Point begonnene Abbildung importieren.

Interessanterweise hat Zoho nicht nur einen Power-Point-Clone im Angebot, sondern auch noch einen Word-Clone, einen Excel-Clone, eine Planungssoftware mit ToDo-Listen und Kalender, ein Wiki, ein CRM-System etc (siehe http://www.zoho.com). Also deutlich mehr als z.B. Google zu bieten hat. Nach kurzem Draufgucken sah das ganze auch sehr passabel aus.

Aber es gibt leider einen Pferdefuß: Die Performance ist nicht ausreichend für professionellen Einsatz. Für den Power-Point-Clone kann ich damit leben, weil ich keine Alternative kenne. Aber bei den anderen Services nehme ich dann doch lieber andere Anbieter.

Aber vielleicht kriegen die Zoho-Leute die Performance-Probleme ja noch in den Griff.

Post bewerten

Dienstag, Juli 03, 2007

Technorati

Jetzt bin ich auch bei Technorati.

Technorati Profile

Post bewerten

Freitag, Juni 29, 2007

Java zu komplex?

Die Komplexität von Java habe ich in diesem Blog schon mehrfach angesprochen. Jetzt hält mein Ex-Kollege Niko Wulff dazu einen Vortrag auf der W-JAX 2007: Die Grenzen der Komplexität.

Und dann berichtet die Computerzeitung über einen Programmierwettbewerb namens Platforms, an dem unter anderem Teams in Java und PHP programmiert haben. Das Beste Team war ein Java-Team, aber die anderen beiden Java-Teams sind anscheinend an der Komplexität gescheitert. Die drei PHP-Teams hatten wohl durchweg gute Ergebnisse.

Das erinnert mich sehr an einen frühen Performancevergleich zwischen C++ und Java. Dort war das beste C++-Programm um Größenordnungen schneller als das beste Java-Programm. Allerdings waren die Java-Programme im Durchschnitt leicht schneller als die C++-Programme. Die Begründung ist einfach: Mit C++ konnte man viel performantere Programme schreiben als in Java. Allerdings muss man dafür soviel an Komplexität beherrschen, dass die meisten Entwickler mit C++ sehr langsame Programme geschrieben haben.

So hört es sich jetzt auch mit Java und PHP an: Mit Java kann man bessere Systeme schreiben als mit PHP. Allerdings können nur wenige Entwickler die Komplexität von Java so gut beherrschen, dass das auch gelingt.

Jetzt haben wir wahrscheinlich nur das Problem, dass alle Entwickler glauben, sie würden zu den wenigen gehören, die die Komplexität beherrschen. Die Statistik sagt aber was anderes. Die sagt: "Was auch immer Du denkst. Wahrscheinlich bist Du nicht in der Lage, die Komplexität zu beherrschen."

Daher mache ich hier mal den Anfang: Mich überfordert das ganze Zeugs rund um EJB, WSDL, SOAP, WS-*, JTA, JAAS, extends und super bei den Generics, geheimnisvolle Compilefehler rund ums Autoboxing, Abhängigkeitswirren bei Classloadern, etc. Natürlich kriege ich es letztlich dann doch ans Laufen. Aber die Zeit dafür würde ich lieber in die Entwicklung kundennützlicher Features investieren.

Post bewerten

WOMM Certification



Muss man haben!

Post bewerten

Dämlicher Desktop

Als die ersten grafischen Benutzungsoberflächen auf der Bildfläche erschienen, war auch bereits der Desktop mit dabei. Auf ihm sollte man sich die Dinge anordnen, mit und an denen man gerade arbeitete. Das hat im großen und ganzen nicht funktioniert. Ich kenne niemanden, der das so macht. Eigentlich wird das Ding nur als überdimensionale Startleiste verwendet, in die man sich die Programme legt, die man häufig benötigt - und vielleicht noch Verknüpfungen zu Ordnern, die man oft braucht. Mache ich auch so. Ist ja auch nützlich.
Interessanterweise hat Windows eine Eigenart, die mir das Arbeiten mit dem Desktop verleidet. Wenn man die Bildschirmauflösung verändert, schiebt Windows die Icons auf dem Desktop so zusammen, dass sie noch alle angezeigt werden können. Das ist vernünftig. Richtig dämlich ist aber, dass die Originalanordnung nicht wieder hergestellt wird, wenn man die Originalauflösung wieder herstellt. Die Anordnung der Icons müsste abhängig von der Bildschirmauflösung gespeichert werden. Wird sie aber anscheinend nicht. Und leider hat sich das auch mit Windows Vista nicht verbessert.
Wenn man einen Desktop-Rechner hat, ist das wahrscheinlich nicht so schlimm. Aber wenn man sein Notebook auch für Präsentationen nutzt, schaltet man ständig die Auflösungen um und hat dann den Ärger.
Auf dem Mac ist das bestimmt besser gelöst, oder?

Post bewerten

Dienstag, Juni 26, 2007

Lastenheft vs. User Stories

Im Lastenheft beschreibt der Kunde, welche Aufgaben ein zu erstellendes Softwaresystem unterstützen muss. Anscheinend gewinnt es zur Zeit eine stärkere Bedeutung, insbesondere im Verhältnis zum Pflichtenheft - im Pflichtenheft beschreibt der Softwarehersteller, wie er die Software gestalten wird.

Diese höhere Bedeutung des Lastenheftes liegt vor allem an Kommunikationsproblemen zwischen Fachabteilungen und Softwareentwicklern. Die von den Softwareentwicklern geschriebenen Pflichtenhefte sind für Fachabteilungen größtenteils unverständlich und daher keine geeignete Basis für die Vereinbarung des zu entwickelnden Systems.

Genau dieses Kommunikationsproblem adressieren auch die agilen Methoden, aber mit anderen Mitteln als dem Lastenheft. Bei den agilen Methoden wird das statische Lastenheft quasi durch
einen Lastenheft-Generator ersetzt. Dieser Lastenhaft-Generator ist ein Mitarbeiter des Kundenund heißt ja nach gewählter Nomenklatur mal Kunde (XP) und mal Produktverantwortlicher (Scrum).
Dieser Produktverantwortliche hat die Aufgabe, jeweils soviele Anforderungen zu generieren, wie zur Zeit realisiert werden können. Er generiert das Lastenheft quasi während der Projektarbeit. Dabei wird auf persönliche Kommunikation zwischen Produktverantwortlichem und Entwicklern gesetzt, um Kommunikationsprobleme zu vermeiden.

Damit übertragen agile Vorgehensweisen die Prinzipien der Just-In-Time-Production auf die
Softwareentwicklung: Die Anforderungen sind genau in dem Moment definiert, in dem sie benötigt werden.

Die Vorteile dieser Vorgehensweise liegen auf der Hand: Es wird keine lange Vorlaufphase für
die Definition des Lastenhaftes benötigt. Man kann sofort mit der Softwareentwicklung beginnen, sobald der Bedarf entdeckt wurde. Der Produktverantwortliche kann auf veränderte Rahmenbedingungen sofort reagieren - er muss ja nicht massenhaft bereits definierte Anforderungen ändern. Die Kosten auf Kundenseite sinken, weil der Produktverantwortliche immer nur genau die Anforderungen definiert, die auch realisiert werden. Es wird kein Aufwand in die Definition von Anforderungen gesteckt, die dann doch nicht realisiert werden. Erste Versionen der Software kann der Produktverantwortliche begutachten, daraus lernen und die Generierung weiterer Anforderungen mit dem Gelernten abgleichen.

Allerdings ist diese agile Vorgehenweise nicht für alle Kunden sofort umsetzbar - genau so wenig, wie es der westlichen Industrie gelungen ist, Just-In-Time-Production vom einen Tag auf den nächsten umzusetzen. Die Problematik bei der agilen Softwareentwicklung liegt in der Rolle des Produktverantwortlichen. Es ist durchaus eine Herausforderung, die Anforderungen genau zeitgerecht (eben Just-In-Time) zu definieren. Generiert der Produktverantwortliche die Anforderungen zu langsam, hat das Entwicklerteam kostenpflichtigen Leerlauf oder muss mit undurchdachten Anforderungen arbeiten. Generiert der Produktverantwortliche die Anforderungen zu schnell, liegen sie auf Halde.
Je mehr Anforderungen auf Halde liegen, desto größer die Gefahr, dass ein Teil der Anforderungen gar nicht realisiert wird. In diesem Fall hat der Produktverantwortliche seine wertvolle Arbeitszeit umsonst investiert. Anforderungen auf Halde wären in der Nomenklatur der Just-In-Time-Production Verschwendung.

Die Definition und die Realisierung von Anforderungen im Fluss zu halten entspricht genau dem Flow-Gedanken aus dem Just-In-Time-Production. Die einzelnen Produktionseinheiten in eine Fabrik entsprechend einzustellen, heißt Production Leveling. Und genau diese Herausforderung besteht auch bei agilen Softwareprojekten.

Eine große Hürde ist dabei häufig die Organisationsstruktur des Kunden. Muss der Produktverantwortliche sehr viele Parteien einbeziehen, ohne dass es sehr klare Strukturen gibt, gleicht seine Aufgabe dem sprichwörtlichen Hüten von Flöhen. Es besteht ein hohes Risiko, dass ein ziemlich inkonsistentes System entsteht.

Tatsächlich mag in solchen Fällen das Lastenheft doch die bessere Variante sein. Das gilt
allerdings nur, wenn der Lastenheft-Autor auch ausreichend Zeit für all die Abstimmungen
zur Verfügung hat. Unter Zeitdruck erstellte Lastenhefte neigen zu undurchdachten Anforderungen. Da sie statisch festgeschrieben sind, ist der Kunde dann mit dem Lastenheft wiederum schlechter bedient als mit dem agilen Produktverantwortlichen.

Zwischen dem Produktverantwortlichen im Sinne von Scrum oder XP und dem klassischen Lastenheft gibt es aber auch Zwischenstufen. FDD liefert mit der vorgeschalteten gemeinsamen Modellierungsphase einen guten Ansatzpunkt. Das Projekt wird dabei in Abschnitte von maximal 6 Monaten unterteilt. Für jeweils einen solchen Abschnitt findet eine Upfront-Analyse/-Modellierung statt. Dadurch wird die Gefahr von Inkonsistenzen reduziert. Natürlich bezahlt man das, indem man nicht mehr so schnell auf neue Erkenntnisse reagieren kann, wie mit XP oder Scrum. Man ist aber immer noch schneller und leichtgewichtiger unterwegs als mit dem klassischen Lastenheft.

Post bewerten

Samstag, Juni 23, 2007

Spargelzeit


Sauce Hollandaise
Posted by Picasa

Post bewerten

Donnerstag, Juni 21, 2007

XP-Day 2007

Die XP-Days 2007 finden dieses Jahr wieder in Karlsruhe statt und die Vorbereitungen laufen. Der Call-For-Sessions ist raus und es tut sich auch schon was auf dem Konferenz-Blog.

Post bewerten

Mittwoch, Juni 20, 2007

Thinkpad T60

Während immer mehr meiner Bekannten mit Apple-Notebooks durch die Gegend rennen, hat sich meine Firma erstmal weiter auf Windows festgelegt. Also ist mein neues Notebook kein Apple, sondern ein Lenovo Thinkpad T60 mit Wide-Screen. Auf dem Papier schien er etwas breiter zu sein, als mein alter DELL. In echt wirkt er aber viel breiter. Naja, was soll's.

Ich habe den größeren Akku und die kleinere, aber schneller Festplatte einbauen lassen. Im Sparsam-Betrieb reicht der Akku knapp 5 Stunden - so lange wie beide Akkus beim DELL zusammen.

Die Tastatur fühlt sich beim Thinkpad etwas besser an als beim DELL. An Hardwarefeatures fällt zunächst mal der Fingerabdrucksensor ein, mit dem man sich anmelden kann, nachdem man etwas trainiert hat, wie man den Finger richtig über den Sensor zieht. Nettes Feature. Es dauert aber Ewigkeiten, bis ich mich mit dem Ding auch anmelden kann - ich habe bis heute nicht verstanden, wie ich das gemacht habe. Schneller als die Eingabe des Passworts ist die Anmeldung mit dem Sensor allerdings nicht - dazu ist die Fingerabdruck-Erkennung zu langsam.

Auf dem Thinkpad ist Windows Vista installiert. Es braucht leider eine Weile zum Hochfahren (mehrere Minuten, 25 Sekunden aus dem Sleep-Mode). Von der Bedienbarkeit zeigt Vista aber dann einen deutlichen Fortschritt gegenüber Windows XP. Es sieht besser aus (wahrscheinlich ist das alles bei Apple angeguckt - immer noch besser also schlecht selbst ausgedacht).
Besonders nützlich ist, dass man überall Suchfelder hat, um nach Programmen, Dateien und Verzeichnissen zu suchen. Wenn man ungefähr weiß, was man sucht, tippt man das ein und muss sich nicht mehr durch Verzeichnisse oder Menüs klicken.

Etwas verwirrt war ich am Anfang, weil das System die fest eingebauten Verzeichnisse mal englisch und mal deutsch anzeigt. Im Dateisystem heißt es z.B. "Programme". Wenn man Software installiert, sagt die, sie würde sich nach "Program Files" installieren, sie landet aber unter "Programme".
Wenn man einen Verzeichnispfad ins Clipboard keopiert und in ein Textfeld einfügt, erscheint auch der englische Name. Anscheinend heißt alles englisch und der Explorer übersetzt.

Die Software, die ich bisher verwendet habe, läuft auch auf Vista. Nur bei Eclipse muss man tricksen. Bei Vista darf man nicht mehr ohne Bestätigung ins Programme-Verzeichnis schreiben. Daher muss man Eclipse beim Start explizit sagen, dass die Config-Dateien an einem anderen Ort abgelegt werden müssen und neue Plugins muss man auch an einen anderen Ort installieren. Oder man installiert Eclipse nicht im Programme-Verzeichnis. Muss man halt nur wissen.

Zusätzlich zu den automatischen Windows-Updates ist auf dme Gerät das "Lenovo Produktivitätscenter" installiert. Das lädt z.B. automatisch Aktualisierungen des BIOS etc. Das ist doch auch mal nett.

Dummerweise ist das Lenovo-Produktivitätscenter nicht ganz kompatibel mit Windows Vista. Daher erscheinen seine Benachrichtigungsfenter nicht auf dem Desktop, sondern in einem Extra-Modus, auf den Vista ständig hinweist, wenn sich im Hintergrund das Produktivitätscenter geöffnet hat. Nach kurzem Notebookbetrieb schlägt das Produktivitätscenter vor, ein dutzend Aktualisierungen nachzuladen. OK. Die ganze Geschichte bleibt nach ein paar Stunden bei 77% Fertigstellung stehen. Also boote ich den Rechner neu. Danach zeigt das Notebook beim Login nicht mehr die Option für den Fingerabdrucksensor an. Es dauert eine Weile bis ich bemerke, dass man sich immer noch per Fingerabdruck anmelden kann. Hin und wieder kommt auch noch der alte Anmeldebildschirm. Und hin und wieder gibt die Fingerabdruck-Software einen "internal error" und stürzt ganz am Anfang ab. So richtig ausgereift wirkt das noch nicht. Mit der Zeit ist das Problem aber immer seltener aufgetreten.

Ich installiere die Software für die UMTS-PC-Karte. Im Internet bei Vodafone gibt es extra eine Version für Vista. Nach der Installation klappt mit der Karte auch alles super. Dafür gehen LAN und WLAN nicht mehr. Vista zeigt mit abwechselnd "lokaler Zugriff" und "eingechränkte Konnektivität für die beiden Netzwerk-Adapter an. Die Ursache scheint zu sein, dass ich jetzt mit "Nicht identifiziertes Netzwerk"
verbunden bin. Ich probiere der Reihe nach alle Problemlösungen aus, die Vista mir vorschlägt. Alles ohne Erfolg. Jetzt schlängt Vista mir vor, ONLINE nach einer Lösung zu suchen. Pfiffig...
Also deinstalliere ich das Vodafone-Zeug. Jetzt habe ich einen absolut sicheren Rechner. Ich kann mich mit gar nichts mehr verbinden :-(

Nach stundenlangem rumprobieren und mehrfachen Neustart meines Routers geht alles wieder. Ich installiere die Software für die UMTS-Karte. Es scheint immer noch alles zu funktionieren.

Ich fahre auf die JAX und bin wahrscheinlich der einzige Teilnehmer, der nicht ins dortige WLAN kommt. Woran es liegt, kann ich mit Windows Vista nicht herauskriegen. Der Rechner verbindet sich zwar mit dem WLAN, vom Internet kann ich aber nichts sehen. Also benutze ich halt die UMTS-Karte. Das WLAN im Hotel hingegen funktioniert.

Als ich wieder zu Hause ankomme, geht weder WLAN noch LAN - auch nicht nach mehrfachem Neustart von Rechner und Router. Ich bin echt genervt. Windows meint, dass wahrscheinlich LAN- und WLAN-Netzwerkadapter kaputt sind.
Ich suche bei Lenovo im Internet. Man soll beim Systemstart F11 drücken. Dann kommt ein Diagnose-Programm. Dort soll man "Hardwarediagnoe" auswählen. Den Punkt gibt es aber nicht, auch sonst nichts, was mir weiterhilft.
Also ermittle ich die Telefonnummer für den Support und stelle fest, dass der
in Deutschland nur Mo.-Fr. 8-16 Uhr besetzt ist. Die Franzosen haben es besser
mit 24*7-Support. Aber ich spreche kein französisch. Naja, man kann auch in
den USA anrufen. Da ist auch immer jemand da. Da habe ich aber keinen Nerv drauf. Also deinstalliere ich nochmal die Vodafone-Software und schon funktioniert es wieder. Scheint also doch an der Vodafone-Software zu liegen. Ich werde mal deren Support anrufen.

Auch ohne Vodafone-Software schaltet sich ab und an das WLAN des Notebooks ab. Keine Ahnung warum.

Fazit: Das Thinkpad ist leicht besser als mein alter Dell. Vista ist leicht besser als Windows XP. Richtig begeistern kann ich mich aber für beides nicht.

Post bewerten

Freitag, Juni 15, 2007

FDD-Reisebericht: Features beschreiben und organisieren

Im Feature-Driven-Development werden feingranulare Features für Planung, Realisierung und Tracking verwendet. Dabei gilt, dass ein Feature maximal 2 Wochen Realisierungszeit benötigen darf. Meistens sind die Features aber viel kleiner (z.B. 1 Tag).

Interessant ist, dass FDD ein festes Beschreibungsschema für Features hat:

<Aktion> <Ergebnis> <Objekt>


So entsteht ein einfacher Satz wie "Berechne Summe der Auftragspositionen".

Damit man in großen Projekten die Übersicht nicht verliert, werden Features zu Feature-Sets zusammengestellt. Dabei empfiehlt sich eine feste Richtlinie, wie Feature-Sets gebildet werden. FDD schlägt für Geschäftsanwendungen vor, Feature-Sets nach Geschäftstätigkeiten zu bilden, z.B. "Auftragsannahme".

Hat man es mit sehr vielen Feature-Sets zu tun, werden diese wiederum in Major Feature-Sets gruppiert, wieder nach einer festen Richtlinie. FDD schlägt für Geschäftsanwendungen vor, Major Feature-Sets nach Geschäftsbereichen zu organisieren, z.B. "Einkauf".

In meinem aktuellen Projekt haben wir die Anforderungen auf das FDD-Schema umgestellt und damit einige positive Erfahrungen gemacht:

  • Wir verwalten unsere Anforderungen in einem Issue-Tracker (Mantis). Der FDD-Satz bildet die Zusammenfassung der Anforderung. Dadurch sind i.d.R. die Zusammenfassungen in einer Übersichtsliste so aussagekräftig, dass man in Diskussionen die Details gar nicht mehr braucht. Früher sind wir mit der Übersichtsliste der Anforderungen und dem Ausdruck der Details zu jeder Anforderung in Abstimmungsmeetings gegangen. Heute haben wir nur noch die Übersichtsliste dabei. Es ist alles viel übersichtlicher geworden.

  • Durch die Feature-Beschreibungsform fällt leicht auf, wenn man versehentlich mehere Dinge in einer Anforderung zusammengeworfen hat. Man trennt Anforderungen eher auf und das Risiko sinkt, dass man was Wichtiges übersieht (versteckte Features).

  • Durch das Feature-Beschreibungsschema sind unsere Features kleiner geworden. Insbesondere haben wir keine Features mehr, die sehr groß sind. Das ist besonders wichtig, weil wir gerade die großen Anforderungen immer wieder gnadenlos unterschätzt haben.

  • Wenn Anwender / Kunden Anforderungen beschreiben, passen die Beschreibungen in der Regel nicht ins FDD-Schema und in den Details finden sich häufig auch mehrere Anforderungen. Wir formen die Anforderungen dann in die FDD-Form um.

  • Die Gruppierung in Feature-Sets ist für das Tracking mit Parking-Log-Diagrammen sehr nützlich. In Mantis setzen wir die Kategorien als Feature-Sets ein und verwenden als Richtlinie Feature-Set=Geschäftstätigkeit.

  • Major-Feature-Sets bilden wir in Mantis als eigene Projekte an.

Post bewerten

Mittwoch, Juni 13, 2007

FDD-Reisebericht: Parking-Lot-Diagramme

FDD hat eine bestimmte Art der Fortschrittsvisualisierung: Parking-Lot-Diagramme.

In einem Parking-Lot-Diagramm bekommt jeder Anforderungsbereich (Feature-Set) ein Rechteck, das Auskunft über die Verantwortlichkeit, die Menge der zugehörigen Features, den Fortschritt und den geplanten Fertigstellungstermin enthält.

Parking Lot Diagram
Abb. nach Leading Answers


Über die aus Scrum stammenden Feature-Burndown-Diagramme hinaus sind Parking-Lot-Diagramme gut geeignet, um den Status großer Projekte zu visualisieren.

Feature Burndown
Feature-Burndown nach VersionOne


Ein interessanter Aspekt in FDD ist, dass für die Parking-Lot-Diagramme nur die Anzahl der Features gezählt wird ohne Gewichtung. Man geht davon aus, dass die Unterschiede in den einzelnen Featureaufwänden nicht so riesig sind und sich im Mittel ausgleichen.

Ich setze in meinem aktuellen Projekt Parking-Lot-Diagramme zusätzlich zu Feature-Burndowns ein und habe damit gute Resultate erzielt.

Post bewerten

Dienstag, Juni 12, 2007

SEE 2007: eine andere Welt

Letzte Woche war ich auf der SEE 2007-Konferenz in München. Die Konferenz sagt das zwar nicht offen im Namen, aber sehr deutlich durch das Programm: Es geht um klassische Vorgehensmodelle a la V-Modell.

Irgendwie war ich selbst als Vortragender zur Geschichte der agilen Methoden auf die Konferenz geraten. Der Vortrag war gut besucht und meine kleine Umfrage am Anfang ergab, dass ca. 95% der Teilnehmer xUnit benutzt, ca. 90% XP kennen und ca. 70% Scrum. Am Ende des Vortrags hatten wir eine angeregte, aber keine kontroverse Diskussion - ich hatte das anders erwartet.

Am Ende gab es dann noch eine Podiumsdiskussion über reichhaltige (cooler Marketinggag das Wording, Respekt) vs. agile Vorgehensweisen. Das Podium war mit 5 Klassikern und Christian Weiss von oose als Agilisten besetzt. Christian Weiss hat darüber im Blog von Bernd Oesterreich berichtet.

Dort schreibt er:

Mir fiel es jedenfalls schwer, Sinn und Zweck von Agilität überzeugend zu verdeutlichen. Vielleicht liegt hier aber auch das eigentliche Problem: Mein Eindruck war, dass beide Fraktionen im Grunde ihres Herzens dieselben Ziele verfolgen.


Letzteres glaube ich nicht so recht, denn: Auf der Podiumsdiskussion gab es eine kurze Phase, in der sich reichhaltig und agil anzunähernd drohten. Das hat der Moderator glücklicherweise unterbunden. Glücklicherweise, weil es nicht darum geht, ob man alle 3 Monate ein Stück Software ausliefert oder ob man auch in agilen Projekten Dokumentation schreibt (wenn es einen Sponsor dafür gibt). Es geht um die Geisteshaltung bei der Softwareentwicklung und um die Perspektive auf Kundenwert, Verschwendung (Lean, Kaizen), Verantwortung, Ehrlichkeit, Menschen und Teams. Und diese Sichtweisen scheinen mir mind. bei den Podiumsteilnehmern (ausgenommen Christian Weiss) gänzlich anders zu sein, als sie in agilen Projekten gelebt werden.

Ich kann mir aber durchaus vorstellen, dass ein Teil der Konferenzzeilnehmer wirklich gerne agil vorgehen würde und nur nicht so recht weiß, wie. Das habe ich jedenfalls aus einigen Diskussionen mitgenommen.

In diesem Sinne arbeiten wir weiterhin daran, Möglichkeiten zu finden, wie man agil vorgehen kann, auch wenn man nach außen nach V-Modell aussehen muss - V-Modell XS.

Post bewerten

Mittwoch, Mai 30, 2007

Verschlüsselung für GMail und Konsorten...

...bietet Freenigma. Natürlich kann man dazu auch irgendeine PGP-Software verwenden, aber Freenigma ist dann doch ein Stück eleganter in der Handhabung und Einbindung in den Webmailer.
Mal sehen, was aus dem Service noch so wird. Natürlich sind noch eine Reihe von Fragen ungeklärt, aber der Service steckt noch in den Kinderschuhen und kann die fehlenden Antworten noch liefern.

Post bewerten

Dienstag, Mai 22, 2007

Flashfilm zum Build-Prozess

Mein Kollege Andreas Havenstein hat einen sehr originellen Flashfilm zum Build-Prozess erstellt: http://www.it-agile.de/build-prozess.html

Post bewerten

positive Kritik zu unserem Hibernate-Buch...

...findet sich hier: http://literadix.blogspot.com/2007/05/buchempfehlung-hibernate-von-robert-f.html

Post bewerten

Mopore-Togo

Auf der JAX habe ich bei einem Vortrag über ein Tool gestaunt, mit dem die Vortragenden auf dem Windows-Desktop rumgemalt haben - um z.B. Code in Eclipse hervorzuheben.
Ich habe nachgefragt und das verwendete Tool heißt Mopore-Togo und ist Open-Source.
Interessant ist noch, dass das Tool in Java 6 geschrieben ist. Es zeigt sehr schön, dass es mit Java nach ca. 10 Jahren doch noch möglich wird, Software zu schreiben, die sich native anfühlt.

Post bewerten

Sonntag, Mai 06, 2007

Feature-Driven-Development: Reiseberichte

Ich habe mich in letzter Zeit intensiv mit Feature-Driven-Development (FDD) auseinandergesetzt. Dabei habe ich eine Menge neuer Dinge gelernt und interessante neue Einsichten gewonnen - gerade weil FDD eine agile Methode ist, aber z.T. deutlich von Scrum und XP abweicht.
Ich werde meine Erkenntnisse und Einsichten, die ich bei meiner Reise ins FDD-Land gewonnen habe, hier in loser Abfolge veröffentlichen. Stay tuned!

Wer sich nicht gedulden kann, dem kann ich das Buch A Practical Guide to the Feature-Driven Development von Stephen R. Palmer und John M. Felsing uneingeschränkt empfehlen.

Post bewerten

Freitag, Mai 04, 2007

Buchkritik zu "Refactoring in Large Software Projects"

Schon vor einiger Zeit ist die englische Übersetzung des Buches Refactorings in großen Softwareprojekten von Martin Lippert und mir erschienen: Refactoring in Large Software Projects.
Dazu gibt es jetzt auch Kritiken: hier und hier.

Post bewerten

Dienstag, Mai 01, 2007

Grails-Buch schon da: auf dem Poster -)

 

Ja, es ist wahr: Bernd Schiffer und ich schreiben zusammen an einem Buch über Grails, dass bei Addison-Wesley erscheinen wird. Nicht ganz richtig ist, dass man in Kürze mit dem Erscheinen des Buches rechnen kann - obwohl Amazon den Mai als Erscheinungsdatum nennt und auf der JAX letzte Woche das abgebildete Poster aushing.
Tatsächlich soll der Buch mit Grails 1.0 fertig werden. Es ist also noch etwas Zeit.
Posted by Picasa

Post bewerten

Montag, April 23, 2007

Live-Blogging von der JAX

Ein paar Kollegen und ich sind auf der JAX und schreiben direkt von der Konferenz aus Blog-Einträge. Die finden sich hier.

Post bewerten

Dienstag, April 17, 2007

Javas Argumente für dynamische Programmiersprachen

In Java 5 ist mind. ein Feature eingebaut, dass ein deutliches Argument für dynamische Programmiersprachen ist, nämlich die Generics. Zuerst sieht die Geschichte ganz einfach aus:

List<vertrag> vertraege = ...

Aber dann wird es ganz schnell kompliziert, weil Generics mit Subtypen inkompatibel sind:

List<Vertrag> vertraege = new List<Bausparvertrag>(); // Compile-Fehler


Und Ruckzuck ist man bei Wildcards:

List <? extends Vertrag> ...
List <? super Bausparvertrag> ...
void <T> foo(List<T extends Vertrag> x) ...


Das scheint mir in der Praxis sehr schwer beherrschbar zu sein. Es sind einfach zuwenig Entwickler fundiert in Typtheorie ausgebildet :-)

Interessant dabei ist, dass dieser ganze komplizierte Overhead nur dazu ist, den Compiler zufrieden zu stellen. Mit dynamischen Programmiersprachen kann man das alles viel einfacher haben.

Wer sich mit Generics in Java befassen will oder muss, findet hier eine gute Einführung.

Post bewerten

Montag, März 19, 2007

Scrum ist nicht Agil?

Es ist ein interessanter Blog-Artikel mit dem Titel "Scrum is not Agile" aufgetaucht. In dem Artikel wird nicht argumentiert, dass Scrum unagil sein. Es wird stattdessen argumentiert, dass die Gleichsetzung Scrum==Agil nicht stimmt, weil agil eben mehr ist als Scrum.
Scrum biete agiles Management. Man bräuchte aber auch aktive Kundeneinbindung, iteratives Vorgehen (inkl. Incremental Design) und selbstorganisierende Teams. Das ist alles auch mit Scrum möglich, aber Scrum gibt keine konkreten Hinweise, was jeweils zu tun ist.
XP deckt immerhin noch das iterative Vorgehen / inkrementelles Design ab.
Für die aktive Kundeneinbindung und die selbstorganisierenden Teams scheint aber noch was zu fehlen.

Post bewerten

Transaktionslose Anwendungsentwicklung

Ich selbst bin kein großer Freund verteilter Transaktionen. Sie bergen meiner Meinung nach eine Komplexität, die nur die wenigsten Entwickler beherrschen.
Daher halte ich es auch für sehr schade, dass sich in breiten Kreisen die Ansicht durchgesetzt hat, dass man auf jeden Fall verteilte Transaktionen braucht, wenn man mehrere Datenbanken oder zu integrierende Systeme hat.
Dass das keineswegs so ist, beschreibt Martin Fowler am Beispiel eBay.

Post bewerten

Montag, März 12, 2007

Die Mächtigkeit der Gleichförmigkeit

An verschiedenen Stellen (z.B. erst vor ein paar Tagen hier) habe ich immer mal wieder behauptet, das Cobol-System, an dem ich als Student mitgearbeitet habe, sei besser strukturiert gewesen als viele der C++- und Java-Systeme, denen ich danach begegnet bin. Diese Aussage hat bei einigen Lesern zu Unverständnis bis Entsetzen geführt. Grund genug, der Sache einmal auf den Grund zu gehen.

Gilt diese Aussage generell für Cobol-Systeme?
Nein, definitiv nicht. Ich habe auch einige Cobol-Systeme gesehen, die deutlich schlechter strukturiert waren als viele Java-Systeme.

Liegt es daran, dass an die Java-Systeme viel höhere Anforderungen gestellt wurden also an die Cobol-Systeme?
Nein. Viele der Java-Systeme unterschieden sich nur dadurch von den Cobol-Systemen, dass sie eine grafische Benutzungsoberfläche mit Swing hatten. Und die ist in Java eher leichter zu programmieren als in Cobol alles von Hand für zeichenbasierte Oberflächen zu codieren. Und selbst wenn Swing die Sache erschwert hätte, hätte das nur Auswirkungen auf die oberflächennahen Teile des Systems haben dürfen und nicht auf die Gesamtstruktur.

Liegt es daran, dass das Cobol-System besonders klein und übersichtlich war?
Nein. Es handelte sich um eine komplette Warenwirtschaft mit Lagerverwaltung und Produktion. Das System ist von ca. 10 Leuten über 10 Jahre lang weiterentwickelt worden.

Liegt es daran, dass am Cobol-System besonders gut ausgebildete Entwickler gearbeitet haben?
Nein. Es gab kaum ausgebildete Informatiker im Team. Einer der Entwickler war vorher Koch und ein anderer Steuerfachgehilfe.

Woran lag es denn dann?
Das System hatte eine einfache Musterarchitektur, die sich durch das ganze System zog. Stammdatenprogramme, Dialog-Programme, Auswahl-Dialoge, Batch-Programme, Druck-Jobs wurden nach dem immer gleichen Schema entwickelt, dass über die Jahre entstanden ist.

Damit war jedem Entwickler bei einer neuen Anforderung sofort klar, wo welche Änderungen notwendig waren und auch, wie teuer diese werden würden. Schätzungen, die stark von den tatsächlichen Aufwänden abwichen, habe ich im Projekt nie erlebt.

Dabei sind natürlich unglaublich viele Redundanzen entstanden. Wenn man ein neues Stammdatenprogramm schreiben wollte, hat man sich ein existierendes Stammdatenprogramm geschnappt und dieses angepasst. Das war Wiederverwendung durch Copy&Paste in Reinkultur.
Und trotzdem hat es funktioniert. Dabei sind sich alle einig, dass das eigentlich unmöglich ist.

Ich glaube, der Grund ist in der Gleichförmigkeit zu suchen, die das System hatte. Redundanzen sind gar nicht so schlimm, wenn sie jedem klar sind. Wenn ich für das Hinzufügen eines Feldes 100 Stellen anpassen muss, ist das halb so wild, wenn mir
  1. klar ist, wo ich die 100 Stellen im Code finde und
  2. jede Änderung mechanisch durchführbar ist, gerade wg. der Gleichförmigkeit des Codes.
Steht so eine Änderung an, ist diese zwar langweilig, aber nicht aufwändig. 100 gleichförmige Änderungen in bekanntem Code macht man in 2-4 Stunden.

Für diese Änderungen ist neben der Gleichförmigkeit eine andere Eigenschaft wichtig: Minimale Abhängigkeiten. Wenn niemand von den geänderten Code-Stellen abhängt, besteht nur geringe Gefahr, durch die Änderungen etwas kaputt zu machen. Außerdem gibt es das Risiko des Ripple-Effekts nichts: Die Änderung bringt weitere Änderungen in abhängigen Code nach sich, die wieder Änderungen in abhängigem Code nach sich ziehen...

Das führt mich zu der These, dass die bessere Cobol-Struktur sich an nur einer Eigenschaft festmacht: Es gab in dem Cobol-System weniger und klarer definierte Abhängigkeiten als in vielen Java-Systemen.

Diese Eigenschaft hat man sich erkauft durch Redundanzen (geht in Cobol auch nicht wirklich anders). Offensichtlich konnte man mit den Redundanzen aufgrund der Gleichförmigkeit besser umgehen als mit Java-Strukturen, die weniger Redundanzen aber dafür größere Abhängigkeiten aufweisen.

Sollten wir also zu Cobol zurück? Auf gar keinen Fall!

Wir sollten uns aber bewusster werden, wie gefährlich Abhängigkeiten zwischen Systemteilen werden können und wie leicht man sich in OO-Programmiersprachen unentwirrbare Abhängigkeitsgeflechte schafft. Vielleicht sollten wir eher einmal gleichförmige Redundanzen zulassen, um damit Abhängigkeiten zu reduzieren?

Post bewerten

Sonntag, März 11, 2007

Zweite Auflage des Hibernate-Buches erschienen

Vor kurzem haben Robert Beeger, Arno Haase, Sebastian Sanitz und meine Wenigkeit die zweite Auflage unserer Hibernate-Buches fertig gestellt. Es ist jetzt im dpunkt-Verlag erschienen und man kann es kaufen.


Neben ein paar kleineren Verbesserungen haben wir das Buch auf Hibernate 3.2 aktualisiert, das Java Persistence API (EJB 3) ergänzt und die Integration von Hibernate in Spring beschrieben.

Post bewerten

Dienstag, März 06, 2007

Buchtipp: Practical Common Lisp

Peter Seibel führt mit Practical Common Lisp anhand praktischer Beispiele (Unit-Testing, MP3-Dateiparsing, Web-Anwendungen etc.) in Common Lisp ein und zeigt damit eindrucksvoll, dass Common Lisp keineswegs auf künstliche Intelligenz oder funktionale Programmierung beschränkt ist.
Das Buch gehört zu den sehr wenigen IT-Büchern, bei denen das Lesen Spaß macht.

Auch wenn man selbst nicht mit Common Lisp arbeiten wird, öffnet das Buch ganz neue Perspektiven. Es ist schon erstaunlich, wie weit Common Lisp seiner Zeit voraus war und noch ist. Ich kenne keine andere Programmiersprache, die so mächtige Features hat wie Common Lisp.

Das Macro-System (nicht zu vergleichen mit dem C-Macros) erlaubt die Definition eigener Sprachen in Common Lisp - ein Ansatz, der heute als DSL (Domain Specific Language) bekannt ist und mit vergleichsweise wahnsinnig hohem Aufwand und Code-Generierung betrieben wird.

So kann man eigentlich bei jedem Feature anderer Programmiersprachen sagen: "Das hat Common Lisp auch, nur mächtiger und flexibler." Da stimmt es mich schon etwas traurig, dass sich Common Lisp nicht in der Breite durchgesetzt hat und man heute noch mit vergleichsweisen Krücken unterwegs ist.

Da drängt sich natürlich die Frage auf, warum wir dann nicht einfach alle in Common Lisp programmieren. Eine Antwort gibt Paul Graham.

Dem habe ich noch hinzuzufügen, dass Common Lisp zwar unbestreitbar sehr mächtig ist, aber auf eigenartige Weise etwas schief zusammengesetzt wirkt. Das ist aber kein wirklich starkes Argument, weil mit Scheme und NewLisp weitere Lisp-Dialekte zur Verfügung stehen.

Post bewerten

Freitag, Februar 23, 2007

Groovy: Wie aus Skripten Programme werden

Mein Kollege Bernd Schiffer hat in seinem Blog einen sehr schönen Eintrag zu Groovy geschrieben. Anhand eines einfachen Problems zeigt Bernd, wie man sich Groovy zuerst eine Skripting-Lösung baut und die dann schrittweise zu einer echten Anwendung wird.
Dabei werden auch einige Highlights von Groovy angesprochen wir Groovy-Beans, Categories, Swing-Builder etc. Besonders schön finde ich, dass durch das Beispiel sehr deutlich wird, wo in Praxis der Nutzen dieser Features liegt.

Post bewerten

Mittwoch, Februar 21, 2007

Lieber bewährt als Leading-Edge

Stanford-Professors Robert Sutton sagt: „In dem ganzen Jubel um neue Produkte und neu gegründete Unternehmen vergisst man leicht, dass die meisten neuen Ideen schlecht sind und die meisten alten Ideen gut."

Diesen Ausspruch finde ich wirklich super. Insbesondere in der IT sind wir allzu schnell dabei, jedem Hype und jeder neuen Technologie hinterher zu rennen. Meine persönliche Schlüsselerfahrung dazu ist: Das uralte Cobol-System, an dem ich als Student gearbeitet habe, war deutlich besser strukturiert als die meisten C++- und Java-Systeme, die mir in den 12 Jahren danach über den Weg gelaufen sind.

Post bewerten

Sonntag, Februar 18, 2007

Quasar: gute Sache

Quasar ist ein Architekturkonzept für die Strukturierung von Softwaresystemen in Komponenten. Das Ding gibt es schon sehr lange. Da es von sd&m kommt, hatte ich mich aber lange Zeit um das Thema herumgedrückt. Dann habe ich mich doch rangewagt und inzwischen haben wir auch erste Projekterfahrungen, die ganz klar sagen: Quasar ist eine sehr nützliche Geschichte. Es ist einfach zu vermitteln und zu erlernen und befördert das Nachdenken über eine saubere Strukturierung des Systems in Komponenten. Die Projektbeteiligten waren bei der Retrospektive zum Thema "Quasar" einhellig der Meinung, dass es sehr positive Effekte gehabt hätte.
Quasar funktioniert damit auch, wenn man agil vorgeht und inkrementellen Entwurf praktiziert - was eher nicht im Sinne der Quasar-Macher war :-)

Ein gutes Buch zum Thema ist "Moderne Software-Architektur. Umsichtig planen, robust bauen mit Quasar." von Johannes Siedersleben.

Post bewerten

REST für Geschäftsanwendungen

Der REST-Architekturstil funktioniert offensichtlich sehr gut für das Internet. Eine Einführung in REST findet sich z.B. hier.
Eine interessante Frage ist jetzt natürlich, ob REST genausogut für nichttriviale Geschäftsanwendungen funktioniert. Dazu ist im Internet bisher nicht allzu viel zu finden.
Hier gibt es immerhin ein Gedankenexperiment mit klarem Ausgang dazu.

Wenn irgendjemand selbst Erfahrungen mit REST für Geschäftsanwendungen hat oder Referenzen kennt, würde ich mich über Rückmeldungen dazu freuen.

Post bewerten

Samstag, Februar 17, 2007

Die Wahrheit über SOA...

...findet sich hier: http://www.soafacts.com/

Am schönsten finde ich: "SOA is not complex. You are just dumb."

Und außerdem ist die Aussage so schön universell. Die funktioniert auch für EJB, verteilte Transaktionen, Web-Services (WS-*) etc.

Post bewerten

Mittwoch, Februar 14, 2007

Die agile Chance

Wir veranstalten am 20.02.07 um 14 Uhr einen Vortragsblock in Hamburg mit dem Thema "Die agile Chance". Dort geht es um die Frage, welche Vorteile die agile Softwareentwicklung für den Auftraggeber hat.
Neben drei Vorträgen zum Thema gibt es Raum für Diskussionen zum Thema. Mehr Informationen gibt es hier.

Post bewerten

Freitag, Februar 09, 2007

Behindern Unittests inkrementellen Entwurf?

Vor kurzem bekam ich per E-Mail eine Anfrage zum Thema testen. Die lautete inhaltlich sinngemäß:
"Wenn ich mich bei Unittests sehr stark am Softwaredesign orientiere, was nach meinem Verständnis die klassischen xUnit-Tests machen, dann habe ich das Problem bei Strukturänderungen den Test nachziehen zu müssen.
Wenn ich mich im Unittest an der übergeordneten Funktion orientiere, bekomme ich Schwierigkeiten mit der geforderten Testüberdeckung.
Die XP-Welt propagiert gleichzeitig den Einsatz von Unit-Tests und einer laufenden Weiterentwicklung im Design. Wie passt das zusammen?"

Diese Frage fand ich so interessant, dass ich meine Gedanken dazu mal in einem Whitepaper zusammengeschrieben habe.

Post bewerten

Dienstag, Februar 06, 2007

Training zu Feature-Driven-Development in Hamburg

Die akquinet veranstaltet über ihre Beratungsmarke it-agile im Mai ein FDD-Training mit Jeff DeLuca. Das finde ich sehr interessant, weil
  1. Feature-Driven-Development eine ganz andere Perspektive einnimmt als die anderen agilen Methoden wie XP oder Scrum.
  2. Trainings zu FDD in Deutschland eine echte Rarität sind.
  3. Jeff FDD (mit)erfunden hat.
Details zum Training.

Post bewerten

Samstag, Februar 03, 2007

Lean Fast Food

Ich bin viel auf Reisen unterwegs und gehe abends zum Essen der Einfachheit halber häufig in Fast-Food-Läden. Dabei trifft man auf zwei prinzipiell unterschiedliche Bedienungskonzepte:
  1. Produktion des Essens auf Vorrat (Push-Prinzip).
  2. Produktion des Essens bei Bedarf (Pull-Prinzip).
Vertreter der ersten Kategorie sind z.B. McDonalds und Burger King. Vertreter der zweiten Kategorie sind z.B. Pizzerien. Dabei bekommt man bei Läden der Kategorie 2 i.d.R. frischeres Essen, muss dafür aber länger warten.


Seit einigen Jahren gibt es eine Verbesserung bei Kategorie 2: Man muss nicht mehr lange warten. Ein typischer Vertreter ist Subway. Während McDonalds und Konsorten mehrere Kassen nebeneinander am Tresen haben, schleust Subway die Kunden in einer Schlange am Tresen vorbei. Das Subway-Prinzip läuft darauf hinaus, dass man sein Sandwich während des ganzen Entstehungsprozesses begleitet und mit ihm der Kasse immer näher kommt. Dieses Vorgehen hat zwei positive Effekte:
  1. Man kann mehrfach zwischendurch noch Einfluss nehmen auf sein Sandwich (z.B. welches Brot, welche Salatanteile, welche Soße).
  2. Man kommt sehr schnell dran und ist dann beschäftigt. Möglicherweise wartet man länger auf sein Essen als bei McDonalds. Es fühlt sich aber kürzer an.

Die Produktionsweise bei McDonalds könnte man als klassisch bezeichnen, die von Subway als Lean. Und man kann eine wichtige Konsequenz für die Kunden agiler (lean) Softwareentwicklung ableiten: Man muss sich den ganzen Entwicklungsprozess über engagieren. Dadurch hat man mehr Einflussmöglichkeiten, muss sich aber eben auch einbringen.

Post bewerten

Dienstag, Januar 30, 2007

Lisp vs. XML

Ein ebenso beliebtes wie altes Argument gegen Lisp sind die Klammerungen: "Durch die vielen Klammernist der Code unleserlich."

Interessanterweise stören sich dieselben Leute aber nicht an XML. Oder wollen die allen Ernstes behaupten, dieser XML-Code


<html>
<body>
<h1>Eine Überschrift</h1>
<p>Findest Du mich zwischen all dem XML?</p>
</body>
</html>


sei besser lesbar als seine Entsprechung in Lisp


(html
(body
(h1 "Eine Überschrift")
(p "Ich bin ganz leicht zu finden!")))


?


(Für die Erbsenzähler: Der XML-Code benötigt 50% mehr Zeilen und 30% mehr Tastenanschläge - ohne Einrückungen).

Tse, tse...

Post bewerten

Montag, Januar 29, 2007

Warum ich integrierten Lösungen misstraue

Ich habe mich in letzter Zeit immer wieder dabei ertappt, dass ich bestimmten Lösungen pauschal misstraue. Dabei spielt es keine Rolle, ob es sich um eine Bibiothek, eine Framework, eine Entwicklungsumgebung oder ein anderes Werkzeug handelt.

Ich fragte mich:
  1. Was ist allen diesen Lösungen gemeinsam?
  2. Ist dieses gemeinsame Merkmal der Grund für mein Misstrauen?
  3. Ist mein pauschales Misstrauen wirklich gerechtfertigt oder bin ich meinen eigenen diffusen Vorurteilen erlegen?

zu 1) Die Gemeinsamkeit der Lösungen liegt in der Integration. Die Lösungen werden damit, besonders gut oder weitgehend integriert zu sein. Das trifft z.B. auf EJBs zu, die verteilte Methodenaufrufe,Transaktionshandling und Security integrieren. Es trifft auf immer mehr Application-Server zu, die sichnicht auf die reine JEE-Technologie beschränken, sondern zusätzlich ESBs (Enterprise-Service-Bus), BPEL, SOAPetc. unterstützen und mit JEE integrieren. Und es trifft auf fast alle kommerziellen Tools zu, die z.B. direkteinen bestimmten Application-Server integrieren.

zu 2) Ja, ich gestehe: Das was die Hersteller als großen Vorteil ihrer Lösung herausstellen, bereitet mirein diffuses Unbehagen.

zu 3) Was also könnte ich - unterbewusst - gegen Integration haben? Integrierte Lösungen nehmen mir dochArbeit ab. Integration hat je nach Geschmacksrichtung unabdingbare die alles andere als wünschenswert sind:Die erste Geschmacksrichtung gibt den monolithischen Lösungen einfach einen neuen Namen, nämlich "integrierteLösung". Bei der zweiten Geschmacksrichtung besteht die Gesamtlösung aus verschiedenen Teilen, die integriertsind. "integriert" bedeutet, dass es mind. eine Abhängigkeit zwischen den Einzelteilen geben muss.
Integrierte Lösungen beider Geschmacksrichtungen führen dazu, dass man die Lösung mehr oder weniger komplett verwenden muss. Auf jeden Fall ist es schwierig, für einen Aspekt der Gesamtlösung eine alternative Einzellösungeinzusetzen. Das ist für kleine Projekte vielleicht noch akzeptabel, für große Projekte ist es eine Katastrophe:Man bindet sich im Grunde für alle Zeit an die Gesamtlösung und hat keine Chance, von neue Entwicklungen am Marktzu profitieren.
Darf man also keine Lösungen einsetzen, die sich "integriert" nennen? Doch, indem man sie deintegriert! Dazu teiltman ein großes Projekt in einzelne Subsysteme auf, die technologisch lose gekoppelt sind. Lose Kopplung bedeutet hier, dass sich die verwendeten Technologien innerhalb eines Subsystems austauschen lassen, ohne dass Änderungenan anderen Subsystemen notwendig werden.

Konkret kann man eine solche technologisch lose Kopplung leicht durch gängige Kopplungstechnologien wie REST,XML-RPC, JSON-RPC oder SOAP erreichen. Dann spielt es für die Kopplung keine Rolle, ob die einzelnen Subsystemeintern EJBs, Hibernate oder Spring verwenden und ob als Programmiersprache Java, Ruby, Cobol oder sonstwas eingesetzt wird.

Post bewerten

Für Groovy stimmen!

http://www.java.net/pub/pq/143

Post bewerten

Dienstag, Januar 02, 2007

3 Dinge über mich

Martin reichte das Staffelholz an mich weiter. Jetzt muss ich also drei Dinge von mir erzählen, die (fast) keiner weiß:

  1. Als Schüler habe ich 2 Wochen lang in der Tischlerei meines Vaters gearbeitet (Kunststoff-Fenster zusammenbauen). Wahrscheinlich hat diese Erfahrung den Ausschlag dafür gegeben, dass ich mein Abi doch noch geschafft habe und studieren konnte. Denn: Nach den 2 Wochen war für mich vollkommen klar, dass ich ich nicht einen Tag länger Kunststoff-Fenster zusammenbauen will. Natürlich ist die Arbeit eines ausgebildeten Tischlers abwechslungsreicher, aber das war mir damals nicht klar.

  2. Ich habe als Schüler zusammen mit Henning angefangen, einen Oberon-Compiler zu programmieren - in Modula-2. Wir haben immerhin den Parser hinbekommen, aber dann waren die Schulferien zu Ende. Interessant, wie man dazu neigt, unsinnges Zeug zu bauen. Gerade der Parser ist der einfache Teil, den man sich schon damals eigentlich aus der Grammatik-Beschreibung generieren ließ.

  3. Als wir vor 5 Jahren unser Haus bauten, mussten wir beim Urlaub sparen. Daher haben Silke und ich uns gegenseitig mit einem preisgünstigen Ein-Wochen-Urlaub in Deutschland überrascht. Sie führte mich nach Usedom, ich sie nach Fehmarn. Auf Fehmarn gehörte ein Surfkurs zum Urlaub dazu. Anfänglich stand unsere junge Ehe etwas auf der Kippe, weil es - trotz August - bei 13 Grad stürmte und Silke auf gar keinen Fall in die "algige" Ostsee wollte. Trotzdem haben wir den Kurs gemacht und sind seitdem Windsurf-addicted. Schon skurril, dass ein Spar-Versuch dazu führt, dass man bei einem so teuren Hobby landet.



Und jetzt muss ich drei neue Opfer benennen, die etwas über sich veröffentlichen, was keiner weiß: Kai, Bernd und Arne.

Post bewerten

Donnerstag, Dezember 28, 2006

Ruby goes Lisp

Mit ParseTree kann man zur Laufzeit die Struktur eines Ruby-Programms analysieren. Das was da rauskommt sieht sehr nach Lisp-S-Expressions aus, was Grahams These stützt, die Programmiersprachen würden sich mit der Zeit immer mehr Lisp annähern. Dass mit ParseTree bei weitem nicht die Flexibilität von Lisp erreicht ist, kann man auf der ParseTree-Homepage lesen: Es funktioniert nicht für die Ruby-Core-Klassen und verändern bzw. generieren kann man so einen ParseTree wohl auch nicht. Dennoch wahrscheinlich eine sehr nützliche Geschichte.

Post bewerten

Toyota

Hier gibt es einen ganz interessanten Artikel darüber, dass die Ideen des Toyota-Production-System noch heute funktionieren und Wettbewerbsvorteile bringen - insbesondere wenn man es so radikal durchzieht wie Toyota.
Während die meisten Autohersteller Autos herstellen, macht Toyota vier Dinge:

  1. Autos herstellen

  2. Autos besser herstellen

  3. Jedem Mitarbeiter beibringen, wie man Autos besser herstellt

  4. Immer nach Möglichkeiten suchen, den Prozess zur Prozessverbesserung zu verbessern


Dazu gehört, dass man nie zufrieden ist mit dem, was man erreicht hat. Stattdessen sucht man immer noch Möglichkeiten, in kleinen Schritten Verbesserungen zu schaffen.

Post bewerten

Marktorientierte Innovation

Es ist jetzt schon ein wenig her, dass ich das Buch "Marktorientierte Innovation" gelesen habe. Seitdem habe ich immer mal wieder versucht, die beschriebenen Konzepte in der Praxis anzuwenden und bin mit den Ergebnissen sehr zufrieden.
Das Buch befasst sich mit der Frage, warum sich bestimmte Innovationen durchsetzen und andere nicht. Welche Innovationen haben überhaupt eine Chance auf dem Markt? Was müssen Unternehmen tun, um mit Innovationen neue Marktpotenziale zu erschließen? Sollten sie sich gegen Konkurrenz wehren, die neue Innovationen auf den Markt bringt und wenn ja, wie? Und warum ist das alles so?
Für all diese Fragen bietet das Buch ein nützliches Denkmodell an, mit dem man sich z.B. auch die Frage beantworten kann, ob sich neue Programmiersprachen durchsetzen können oder nicht.

Post bewerten

Freitag, Dezember 08, 2006

eXtreme Programmer gesucht

Wir (www.it-agile.de, www.akquinet.de) suchen gerade wieder neue Mitarbeiter. Dabei interessieren wir uns explizit für Entwickler, die Ihr Studium mind. 1,5 Jahre hinter sich haben, mind. 2 Jahre Java-Projekterfahrung haben und mind. privat TDD und inkrementellen Entwurf praktiziert haben.

Aufgabenbereich ist die Entwicklung in XP-Teams, inkrementelle Architektur und bei entsprechender Erfahrung das Coaching unserer Beratungskunden.

Wer Interesse hat, sieht sich das mal an: http://it-agile.de/jobs.html

Post bewerten

XP auf japanisch

Wahrscheinlich bin ich wieder der letzte im Internet, der das entdeckt hat: XP-Song-Video auf japanisch. Auf deutsch gibt es das bisher nicht. Da sind uns die Japaner mal wieder eine um eine Naselänge voraus.

Post bewerten

Sonntag, Dezember 03, 2006

Nutzen von Dokumentation

Auf der ix-Konferenz "Bessere Software" war ich auch noch im Vortrag "Toleranz gegenüber Inkonsistenzen in der Konzeptdokumentation - eine unbedingte Notwendigkeit" (was für ein Titel :-) von Prof. Dr.-Ing. Siegfried Wendt. Dabei ging es um die Frage, wieviel Dokumentation von welcher Art man braucht. Sehr nützlich fand ich die Feststellung, dass die Nützlichkeit von Dokumentation mit ihrer Detaillierung abnimmt. So kann z.B. eine Architekturübersicht mind. für alle Entwickler des Systems nützlich sein. Die Dokumentation einer einzelnen Klasse ist höchstens für den Entwickler der Klasse relevant. Und selbst für den ist sie selten nützlich. Er hat die Klasse ja geschrieben und kann sich i.d.R. auch ohne Dokumentation ausreichend orientieren. Zitat Wendt (sinngemäß): "Wer Dokumentation auf dieser Detailierungsebene schreibt, verbrennt Geld."

Post bewerten

Martin Fowler: Introduction to Domain Specific Languages

Bei InfoQ gibt es die Präsentation "Introduction to Domain Specific Languages" von Martin Fowler. Hier erläutert Martin Fowler nicht nur, was eine Domain Specific Language (DSL) ist, sondern auch, wie man schrittweise zu seiner eigenen DSL kommt.
Er beginnt dabei mit XML zur Darstellung der DSL, kommt dann aber zu dem Schluss, dass XML häufig nicht die beste Darstellungsart ist. Es i.d.R. gibt deutlich kompaktere Schreibweisen, die den Umgang mit der DSL erheblich vereinfachen können. Ähnliche Gedanken scheinen auch die Spring-Macher umzutreiben.

Post bewerten

Freitag, Dezember 01, 2006

Unser Hibernate-Buch...

...ist das vierte von oben :-)

Post bewerten

Dienstag, November 28, 2006

Die Fehler von Microsoft

Auf der ix-Konferenz war ich heute morgen in der Session "Die Fehler von Microsoft" von Andreas Zeller (Universität des Saarlandes). Dabei ging es um die Frage, ob und wie man Fehlerhäufigkeit bestimmter Module vorhersagen kann, um diese besonders intensiv zu testen. Andreas Zeller hat dazu Untersuchungen an Microsoft- und Eclipse-Modeulen durchgeführt. Der Vortrag war nicht nur gut vorgetragen, sondern transportierte auch ein paar interessante Erkenntnisse:

  1. Wenn ein Modul in der Vergangenheit sehr fehlerträchtig war, wird es auch in Zukunft fehlerträchtig sein.

  2. Mit Metriken kann man nicht universell vorhersagen, welche Module besonders fehlerträchtig sein werden. Zitat Zeller: "Das ist ein herber Schlag für die Metrik-Community. Ein Glück, dass ich nicht dazu gehöre."

  3. Man kann je Produkt (z.B. Microsoft Internet Explorer) Metriken definieren, die ganz gut funktionieren. Dazu braucht man aber Zahlen aus der Vergangenheit. Damit ist das Verfahren nur sinnvoll für neue Module in einem bestehenden Produkt. Für die existierenden Module in einem bestehenden Produkt haben wir ja Erkenntnis Nummer 1.

  4. Die erfahrensten Entwickler machen die meisten Fehler. So hat angeblich Erich Gamma eine der höchsten Fehlerraten im Eclipse-Projekt. Und Module, die sehr viele Unittests haben, sind sehr fehleranfällig. Das liegt daran, dass die erfahrenen Entwickler immer nach vorne geschickt werden, wenn es brenzlig wird. Und die Entwickler schreiben dort viele Unittests, wo sie viele Probleme vermuten. Das bedeutet, dass die Entwickler unabhängig von Metriken eigentlich ganz gut wissen, wo die fehlerträchtigen Module rumlungern. Dann kann man sich doch auch einfach an deren Einschätzung orientieren.

Weitere Informationen zu dem Thema finden sich unter www.softevo.org.

Post bewerten

Sonntag, November 26, 2006

Gute Entwickler

Bei den XP-Days war es bei der Fishbowl-Session zu Agile 2.0 explizit ein Thema, bei anderen Vorträgen stand die Frage implizit im Raum: Wie wird man eigentlich ein guter Entwickler?
Es rief keinen Widerspruch hervor, als ich behauptet habe, die Unis würden keine nennenswerten Programmierfähigkeiten vermitteln. Ich finde das absurd: Wenn etwas im Kern aller Einzeldisziplinen der Informatik steht, dann doch wohl Programme und die muss doch auch jemand programmieren. Aber im Moment sind die Unis wohl nicht der Ort, um ein guter Programmierer zu werden. Also muss man das Programmieren wohl außerhalb der Uni lernen. Da gibt es zwei Möglichkeiten: Neben dem Studium oder nach dem Studium. Im Autismus-Mode wird das nur begrenzt gehen: Man braucht Partner, von und mit denen man lernen kann.
Da finde ich es sehr schön, dass vermehrt Lernformen auftreten, die genau das ermöglichen: Programmieren lernen.

  • Im Coding-Dojo lernt man durch Beobachten anderer Entwickler das Programmieren. Das kann mit oder ohne Pair-Programming und mit oder ohne testgetriebener Entwicklung (TDD-Dojo) geschehen.

  • Im Coding-Tournament treten Programmierpaare gegeneinander an, um Bots zu programmieren, die dann gegeneinander spielen - im Fall der XP-Days Indian Poker.


Ich habe jetzt ein paar solcher Veranstaltungen selbst mitgemacht/veranstaltet und habe erlebt, wieviel man dort in sehr kurzer Zeit lernen kann - und das mit jeder Menge Spaß. Ich halte Coding-Dojos und Coding Tournaments auch für eine Klasse Idee, um sie innerhalb von Firmen zur internen "Weiterbildung" durchzuführen.
Ein TDD-Dojo bieten übrigens Henning Wolf und ich gemeinsam auf der ix-Konferenz in Frankfurt am 30.11.06 an.

Post bewerten

NEZIAK als neue Methode der Softwareentwicklung?

Gestern haben wir bei Hennings Geburtstagsparty in ausgelassener Stimmung unsere Gedanken schweifen lassen und sind dabei auf NEZIAK gestoßen. Zu NEZIAK kommt man, wenn man KAIZEN (kontinuierliche Verbesserung in kleinen Schritten) umgedreht aufschreibt. Inhaltlich bedeutet NEZIAK entsprechend die kontinuierliche Verschlechterung in kleinen Schritten :-)
Ist natürlich offensichtlicher Blödsinn... Allerdings habe ich den Eindruck, dass viele Projekte konsequent NEZIAK einsetzen. Nanu? Wer macht denn etwas offensichtlich Blödsinniges und warum?

Post bewerten

XP-Days 2006 in Hamburg sind vorbei

Die XP-Days 2006 in Hamburg sind vorbei. Sie haben mir gut gefallen. Die Vorträge waren im wesentlichen gut bis sehr gut und ich habe alte Bekannte wieder getroffen. Schon während der Konferenz konnten die Teilnehmer bloggen. Inzwischen trudeln auf dem Konferenzblog auch die Folien zu den Vorträgen ein.

Post bewerten

Dienstag, November 21, 2006

Wie schwer kann es sein, ein PDF mit Java zu drucken?

Eigentlich ist es ganz einfach, haben wir uns gedacht. Aber nichts da. Man kann zwar mit allen möglichen Programmen PDFs erzeugen, aber die PDFs dann automatisch an einen Windows-Drucker zu schicken, scheint noch ein offenes Forschungsthema zu sein.
Unser erster Anlauf ging über die Java Printing Services. Laut API-Doku ist es ganz einfach. Man sagt mit dem PDF-Flavor, dass man ein PDF drucken will und fertig. Dummerweise hat Sun den PDF-Flavor nicht implementiert. Man hofft wohl, dass das jemand anderes tut. Wir konnten aber niemanden finden, der es auch getan hat.
Zwischenzeitlich hatten wir dann ein BAT-Programm gefunden, dass schwindelerregende Dinge mit der Registry tut. Das haben wir aber nicht zum Laufen bekommen, außerdem braucht es Admin-Zugang auf dem PC der Anwender und das ist bei Unternehmenssoftware eher nicht angesagt.
Schließlich hat uns das kommerzielle JNIWrapper aus der Klemme geholfen.
Aus dem gleichen Stall stammt übrigens auch JExplorer, mit dem man den MS-Internet-Explorer nahtlos in Swing-Anwendungen einbetten kann.

Post bewerten

Samstag, November 18, 2006

Java-Script auf dem Server

Bei aktuelllen Web-Anwendungen hat man immer Java-Script auf dem Client. Die AJAX-Frameworks versuchen, diese Tatsache zu verstecken, so dass man nur mit der einen serverseitigen Programmiersprachen arbeiten muss.
Wenn es anspruchsvoll wird, reichen die Frameworks aber nicht mehr aus und man muss doch wieder Java-Script für den Browser programmieren. Wäre es da nicht viel eleganter Java-Script auch auf dem Server einzusetzen und damit nur eine Programmiersprache benutzen zu müssen? Schließlich braucht sich Java-Script bzgl. der Sprachkonstrukte eigentlich nicht verstecken hinter anderen Script-Sprachen.
Siehe dazu Phobos.

Post bewerten

Dienstag, November 14, 2006

Unit-Testing in Multi-Projekt-Settings mit JUnit 4

Die von mir zitierte Lösung für Unit-Testing in Multi-Projekt-Settings funktioniert nur für JUnit 3.8, aber nicht für JUnit 4. Johannes Link hat die Lösung für JUnit 4 adaptiert.

Post bewerten

Dienstag, November 07, 2006

Newsfeed zieht um

Der Newsfeed zu diesem Blog wird umziehen nach: http://stefanroock.blogspot.com/rss.xml

Post bewerten

Mittwoch, November 01, 2006

Unit-Testing in Multi-Projekt-Settings

Die Eclipse-IDE bietet sich an, um ein Gesamtprojekt in mehrere Subprojekte/Komponenten zu unterteilen. Die Abhängigkeitsverwaltung in Eclipse sichert dabei, dass man keine ungewollten Abhängigkeiten in sein System einbaut.
Unverständlicherweise kann man in Eclipse aber nicht Unit-Tests über mehrere Projekte auf einmal ausführen. Wenn man sehr viele Projekte in Eclipse hat, wird das Ausführen der Unit-Tests zur echten Qual.

Aber es gibt eine ganz einfache Lösung über eine generische Test-Suite, die einfach alle Tests im Classpath ausführt. Den Code (< 100 Zeilen) dazu findet man bei Björn Martensson.

Post bewerten

Mittwoch, Oktober 11, 2006

DROP COLUMN

Wenn man agil Software entwickelt, gehören häufige Produktivreleases zum Handwerkszeug. Daraus resultieren zwangsläufig Datenmigrationen, die mehr oder weniger umfangreich bei jedem Release anfallen.

Refactorings am Code verursachen entsprechende Refactorings an den Datenbankstrukturen. Besonders häufig findet man Umbenennungen von Spalten, Typänderungen von Spalten sowie das Löschen von Spalten.

Viele Datenbanken unterstützen das Umbenennen von Spalten direkt. Dort wo es nicht geht, fügt man eine neue Spalte mit dem Zielnamen ein, kopiert die Daten von der Quell- in die Zielspalte und löscht schließlich die Quellspalte. Mit ALTER TABLE und UPDATE ist das alles auch kein Problem. Bei Typänderungen von Spalten geht man genauso vor, nur dass man zwischendurch eine temporäre Spalte einführt (sonst bekommt man einen Namenskonflikt zwischen Quell- und Zielspalte).

Das Schreiben dieser Migrationsskripte scheint erstmal sehr aufwändig und unangenehm. In unseren Projekten haben wir allerdings festgestellt, dass es dann doch nicht so schlimm ist. Auf jeden Fall ziehen wir das Schreiben der Migrationsskripte dem Hinauszögern oder Weglassen von Releases vor.

Es gibt nur ein wiederkehrendes Problem und das heißt DB2: DB2 ist anscheinend die einzige Datenbank, die Tabellenspalten nicht löschen kann.

Wir behelfen uns in diesem Fall mit temporären Tabellen: Wir legen zuerst eine Kopie der Quelltabelle an und kopieren die Daten von der Quelltabelle in die temporäre Tabelle. Dann löschen wir die Quelltabelle und legen sie mit der Zielstruktur neu an. Dann migrieren wir die Daten von der temporären Tabelle in die neue Zieltabelle (mit INSERT) und löschen schließlich die Temporärtabelle. Das ist leider aufwändig und auch fehleranfällig, weil schnell mal Indices und Fremdschlüssel-Constraints verloren gehen.

Es gibt sicher gute Gründe dafür, warum DB2 DROP COLUMN nicht unterstützt - entsprechende Argumentationen findet man beim Googlen relativ schnell. Trotzdem erschwert DB2 leider agile Softwareentwicklung deutlich mehr als die anderen relationalen Datenbanksysteme.

Post bewerten

Samstag, September 23, 2006

Video: Closures in Java

Es gibt ein ganz lustiges und informatives Video, wie Closures in Java aussehen könnten und wie sie intern auf Inner Classes abgebildet werden können.

Post bewerten

Freitag, September 22, 2006

Terminplaner in Lisp

Ich habe das Terminplaner-Beispiel zuerst in Java programmiert und dann nach Groovy (Skriptsprache für die Java-Plattform) programmiert. Das Beispiel ist in Groovy als eine der jüngsten Programmiersprachen doch erheblich kürzer und einfacher als in Java. Da hat es mich dann doch gereizt, das Beispiel auch einmal in einer der ältesten Programmiersprachen zu programmieren: Lisp. Dabei habe ich Common Lisp verwendet mit CLOS (Common Lisp Object System) und Lisp-Unit von Chris Riesbeck.

Die quantitativen Ergebnisse aller drei Implementationen zuerst einmal im Vergleich:

Java

  • 5 Fachklassen, 1 Exception-Klasse, 1 Testklasse

  • 37 Methoden inkl. Konstruktoren + 10 Methoden in Testklasse

  • 246 LOC operativ + 144 LOC für Testklasse (inkl. Leerzeilen)

  • 4 For-Schleifen, 4 If-Abfragen


Groovy

  • 4 Fachklassen, 1 Exception-Klasse, 1 Testklasse

  • 30 Methoden inkl. Konstruktoren + 9 Methoden in Testklasse

  • 203 LOC operativ + 123 LOC für Testklasse (inkl. Leerzeilen)

  • Alle 4 For-Schleifen der Java-Lösung wurden durch Closures ersetzt, die 4 If-Abfragen blieben bestehen.


Common Lisp

  • 4 Fachklassen, 1 Testklasse - Exceptions werden mit Hilfe von Conditions modelliert (nur eine Zeile notwendig)

  • 17 Methoden, 1 Condition-Funktion, 10 Testmethoden

  • 76 LoC operativ, 100 LoC Test (inkl. Leerzeilen)

  • Alle 4 Schleifen der Java-Lösung wurden durch Closures ersetzt, die 4 If-Abfragen blieben bestehen, allerdings in den spezialisierten Varianten when und unless.


Wow! Die Common-Lisp-Variante hat erheblich weniger Code als die Java- oder die Groovy-Variante. Woran liegt das?
Naheliegend wäre es, die Ursache bei dem Lisp-Feature zu suchen, dass keine andere Programmiersprache anbietet: Macros (Vorsicht: Lisp-Makros sind ganz anders als die berüchtigten C-Makros). Dem ist aber nicht so. Tatsächlich habe ich in dem Lisp-Code kein eigenes Makro selbst definiert und nur an einer Stelle von der Mächtigkeit der
Lisp-Makros profitiert. Mit assert-error aus Lisp-Unit kann man sehr einfach prüfen, ob eine Exception (im Lisp-Jargon Condition) geworfen wird:


(define-test benutzer-nicht-eingeladen-exception
(setup)
(let ((termin (make-termin stefans-kalender ein-datum 180 "TDD-Dojo")))
(assert-error 'benutzer-nicht-eingeladen (lehne-termin-ab termin "Henning"))))


Zum Vergleich der entsprechende Java-Code:


public void testBenutzerNichtEingeladenException() {
Termin termin = _stefansKalender.newTermin(_jetzt, 180, "TDD-Dojo");
try {
termin.lehneTerminAb(HENNING);
fail("BenutzerNichtVorhandenException erwartet");
} catch (BenutzerNichtEingeladenException e) {
assertTrue("Exception erwartet", true);
}
}


Das erklärt aber nicht, warum der operative Code in Lisp so viel kürzer ist als in Java oder Groovy. Eine nähere Analyse fördert folgende Gründe zu Tage:
  • In Java und Groovy werden eigene Zeilen spendiert, für schließende geschweifte Klammern. Für das Lisp-Äquivalent (schließende runde Klammern) werden keine eigenen Zeilen spendiert. Dierk König schlägt in seinem kommenden Groovy-Buch diese Art der Formatierung für Groovy für bestimmte Situationen auch vor (bei den Buildern).

    • In Java und Groovy ist es üblich, Leerzeilen in Methoden einzufügen, teilweise auch zwischen Attributen. Beides macht man in Lisp eher nicht.

    • Das aufschreiben von Attributen einer Klasse ist in Common-Lisp schlanker als in Groovy oder Java. Insbesondere gibt es prägnante Abkürzungen, um Setter und Getter und Defaultwerte zu definieren.

    • Einige Implementierungen lassen sich nicht sinnvoll 1:1 nach Common-Lisp transferieren. Daher vergleicht man ein Stück weit dann doch Apfelsinen mit Orangen (so groß wie zwischen Äpfel und Birnen sind die Unterschiede dann doch nicht :-)


    Der gewaltige Unterschied in den LoC findet sich bei der Menge der Syntaxelemente in deutlich reduzierter Form. So spart man sich in Common-Lisp zwar Einiges an Zeilen für die Attributdefinitionen in Klassen, es gibt aber die gleiche Anzahl von Attributdeklarationen. In diesem Sinne ist die Lisp-Lösung zwar kürzer als die Lösungen in Java und Groovy. Sie ist bzgl. der Komplexität aber äquivalent zur Groovy-Lösung und diese beiden Lösungen sind weniger komplex als die Java-Lösung.

    Wieviel wirkt der große Unterschied in den LoC? Quelltext wird viel häufiger gelesen als geschrieben. Daher ist die Einsparung der Tastenanschläge bei der Code-Erstellung nicht wirklich von Interesse. Wenn man allerdings beim Lesen von Quelltext weder vertikal noch horizontal scrollen muss, erleichtert dies das Lesen: Im Lisp-Terminplaner passt jede operative Klasse problemlos auf eine Bildschirmseite, so dass man jede Klasse auf einen Blick erfassen kann. Das kann man als (leichten) Vorteil von Lisp werten. Allerdings muss ich zugeben, dass man den Groovy-Code an der einen oder anderen Stelle noch etwas eleganter Formulieren kann und dann auch noch etwas an LoC einsparen kann.

    Quelltext des Terminplaners in Common-Lisp.

    Post bewerten

  • Dienstag, September 19, 2006

    Refactoring und Closures

    Refactoring-schwaches Java
    Vor wenigen Tagen schrieb ich zusammen mit Henning Wolf Beispielcode für einen Sudoku-Solver. Wir wollten damit bestimmte Aspekte testgetriebener Entwicklung (TDD) sowie von Refactoring zeigen. Dabei haben wir unter anderem folgenden Code geschrieben:


    public class Sudoku {

    final static int groesse = 9;
    private Zelle[][] _sudokuArray = new Zelle[groesse][groesse];

    public Sudoku(int[][] array) {
    for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
    _sudokuArray[i][j] = new Zelle(array[i][j]);
    }
    }
    }

    public String[][] gibAusgefuellt() {
    String[][] result = new String[groesse][groesse];
    for (int i = 0; i < result.length; i++) {
    for (int j = 0; j < result[i].length; j++) {
    result[i][j] = _sudokuArray[i][j].toString();
    }
    }
    return result;
    }

    ...
    }



    Hier hat man offensichtlich das DRY-Prinzip verletzt (DRY = Don't Repeat Yourself): Die zwei ineinander geschachtelten FOR-Schleifen existieren zweimal (wenn man sich den kompletten Quellcode des Sudoku-Solvers ansieht, kommt das Konstrukt sogar noch häufiger vor). Ähnliche Duplizierungen in Zusammenhang mit If-Abfragen, For- und While-Schleifen finden sich in jedem größeren Java-Programm, dass ich bisher gesehen habe.

    Prinzipiell kann man diese Code-Duplizierungen auf verschiedene Arten beseitigen. Die naheliegendste Lösung besteht im Einführen eines Interfaces MatrixBesucher:


    interfaces MatrixBesucher {
    void besucheZelle (Object[][] matrix, int i, int j)
    }



    Ein Objekt dieses Interfaces reicht man als Parameter in eine Hilfemethode iteriereMatrix:


    private static void iteriereMatrix (ZellenBesucher besucher) {
    for (int i = 0; i < groesse; i++) {
    for (int j = 0; j < groesse; j++) {
    besucher.besucheZelle(i, j);
    }
    }
    }



    Dann wird aus dem Anfangs gezeigten Code:


    public class Sudoku {

    final static int groesse = 9;
    private Zelle[][] _sudokuArray = new Zelle[groesse][groesse];

    public Sudoku(final int[][] array) {
    iteriereMatrix(new ZellenBesucher() {
    public void besucheZelle (int i, int j) {
    _sudokuArray[i][j] = new Zelle(array[i][j]);
    }
    }
    }

    public String[][] gibAusgefuellt() {
    String[][] result = new String[groesse][groesse];
    iteriereMatrix(new ZellenBesucher() {
    public void besucheZelle (int i, int j) {
    result[i][j] = _sudokuArray[i][j].toString();
    }
    }
    return result;
    }

    ...
    }



    Damit ist DRY wieder hergestellt. Das Problem daran ist nur, dass sowas kein Mensch macht. Schließlich ist die Lösung länger (mit Hilfsmethode und Interface 26 statt 16 Codezeilen) und besser lesbar ist sie leider auch nicht wirklich.

    Möglicherweise schwerer wiegt, dass man für das Refactoring in Richtung DRY die Ebene wechseln musste. Das DRY-Prinzip war innerhalb einer Klasse auf Algorithmus-Ebene verletzt und wir mussten ein neues Interface einführen, also auf die Entwurfsebene wechseln. Das bedeutet, dass der Refactoringprozess an dieser Stelle nicht-linear verlaufen ist (linear: kleines Problem, kleine Lösung; nicht-linear: kleines Problem, umständliche Lösung).

    Anmerkung: Man kann sich andere Lösungen des Problems vorstellen, die ohne die umständlichen und schwer lesbaren anonymen Inner-Classes auskommen. Solche Lösungen erfordern aber deutlich mehr Entwurfsarbeit, mitunter sogar Vererbung oder den Einsatz von Entwurfsmustern. Damit würde der Refactoring-Prozess sogar noch nicht-linearer.

    Refactoring mit Closures
    Mit Closures hingegen ließe sich das DRY-Prinzip mit wenig Aufwand umsetzen und man kann beim Refactoring auf der Algorithmus-Ebene bleiben. Zu allem Überfluss ist die Lösung auch noch leicht lesbar. Hätte Java Closures, könnte die Lösung in etwa so aussehen (die Syntax für Closures ist hier an Groovy angelehnt):


    public class Sudoku {

    final static int groesse = 9;
    private Zelle[][] _sudokuArray = new Zelle[groesse][groesse];

    public Sudoku(final int[][] array) {
    iteriereMatrix({i, j -> _sudokuArray[i][j] = new Zelle(array[i][j])};
    }

    public String[][] gibAusgefuellt() {
    String[][] result = new String[groesse][groesse];
    iteriereMatrix({i, j -> result[i][j] = _sudokuArray[i][j].toString()};
    return result;
    }

    private static void iteriereMatrix (Closure closure) {
    for (int i = 0; i < groesse; i++) {
    for (int j = 0; j < groesse; j++) {
    closure.execute(i, j);
    }
    }
    }

    ...
    }



    Und schon ist die Lösung nur noch 15 Codezeilen lang (im Gegensatz zu 16 Codezeilen beim Original-Quelltext).

    Nun kann man natürlich einwenden, dass die Closures prinzipiell auch nicht mächtiger sind als anonyme Inner-Classes, es sich hier also lediglich um Syntactic-Sugar handelt. Das ist richtig und zeigt, wie wichtig eine prägnante Syntax ist. Denn die Inner-Class-Lösung wird in der Praxis so gut wie nicht eingesetzt, während die Closure-Lösung überaus üblich ist in Programmiersprachen, die Closures unterstützen wie z.B. Lisp, Python der Groovy.

    Closures in Java
    Wenn Closures so nützlich sind und konzeptionell eigentlich nur Syntactic-Sugar für anonyme Inner-Classes darstellen, dann sollte es ja eigentlich auch kein Problem sein, Closures auch in Java zu unterstützen. Und tatsächlich gibt es Anzeichen dafür, dass wir irgendwann Closures auch in Java haben werden:

    http://article.gmane.org/gmane.comp.lang.lightweight/2274

    Interessant ist hier die Argumentation: Es ist ein grundlegendes Design-Prinzip von Java, dass nur dann Objekte auf dem Heap allokiert werden, wenn der Programmierer dies explizit anfordert (typischerweise durch new). Bei Closures muss man aber implizit Speicher auf dem Heap allokieren und daher passen Closures nicht zum Design von Java.
    Nun bricht aber seit Java 5 das Auto-Boxing dieses Prinzip und daher sei es jetzt sowieso egal und man könnte dann auch noch Closures einführen :-)

    Prinzipiell bin ich persönlich der Meinung, dass Closures mir das Leben als Java-Entwickler erleichtern würden. Gleichzeitig müsste man aber große Teile des JDKs komplett umbauen. Sonst startet der ganze Ansatz als Tiger und landet als Bettvorleger. Wenn man schon Closures hat, wird man auch erwarten, dass mind. die Collections massiv davon Gebrauch machen (z.B. für das Iterieren über die Elemente). Wo man sich sonst noch die Verwendung von Closures wünschen würde, kann man gut am GDK (Groovy Development Kit) sehen.

    Und wenn man soweit geht, dann sollte man vielleicht lieber Java als Sprache auf Deprecated setzen und die Migration nach Groovy pushen. Denn da werden Closures von Beginn an unterstützt und auch entsprechende Libraries im GDK sind verfügbar.

    Post bewerten

    Montag, September 18, 2006

    Groovy und Grails auf Konferenzen

    Eindrücke aus erster Hand zu Groovy und Grails kann man sich auf verschiedenen Konferenzen in den nächsten Monaten besorgen:

    Post bewerten

    Grails: Schnell mal eine Web-Anwendung mit Groovy für die Java-Plattform

    An anderer Stelle habe ich bereits Groovy kurz beleuchtet, die standardisierte Skriptsprache für die Java-Plattform.

    Jetzt, wo man eine so mächtige und flexible Skriptsprache hat, lag es natürlich nahe, den Rails-Ansatz auch für Groovy nutzbar zu machen. Herausgekommen ist Grails.

    Grails existiert erst in der Version 0.2.2, hat aber bereits einen erstaunlichen Entwicklungsstand. Mit wenigen Clicks ist eine erste Version der Webanwendung zusammengebaut, die man dann explorativ weiterentwickeln kann.

    Die existierende Dokumentation reicht für erste Schritte aus, vieles kann man sich durch nachdenken erschließen.

    Grails ist sicherlich eine sehr interessante Technologie für die Web-Projekte, die für die Java-Plattform entwickeln müssen/wollen. Die Java-ähnliche Syntax von Groovy erleichtert Java-Entwicklern den schnellen Einstieg.

    Post bewerten

    Sonntag, September 03, 2006

    Kommentarfunktion in diesem Blog jetzt für alle

    jedenfalls für alle mit einem Blogger-Account. Bisher musste man zusätzlich Geheimwissen mitbringen: Man musste auf das # am Ende eines Eintrages klicken, um den Eintrag einzeln zu öffnen und dort konnte man dann einen Kommentar hinterlassen. Ich habe jetzt das Template für diesen Blog so geändert, dann man die Kommentarfunktion jetzt direkt am Eintrag aufrufen kann. Außerdem habe ich das kryptische # durch "Permanent Link" ersetzt.

    Dass man zum Kommentar hinterlassen einen Blogger-Account haben muss, ist ärgerlich, aber wg. der Spam-Problematik zur leider wohl unvermeidlich.

    Post bewerten

    Donnerstag, August 24, 2006

    IDEs und der K(r)ampf zwischen Statik und Dynamik

    Für Java existieren heute mit Eclipse, IntelliJ IDEA und Konsorten sehr mächtige Entwicklungsumgebungen. Cross-Referencing, Refactoring und Auto-Completion sind Features, die man nicht mehr missen möchte.
    Dass diese Features für die aktuellen Skriptsprachen a la Python, Ruby oder Groovy nicht oder nur eingeschränkt existieren, wird häufig als Argument gegen diese Skriptsprachen verwendet.

    Aber wird über diese Features wirklich reflektiert?

    Cross-Referencing
    Mit den Cross-Referencing-Möglichkeiten der IDE kann man auf Tastendruck oder Mausclick von einer Codestelle zum referenzierten Element gelangen (z.B. von einer Variablendeklaration zur Klasse, von deren Typ die Variable ist).

    Natürlich sind die Cross-Referencing-Möglichkeiten in den IDEs deutlich mächtiger als eine Textsuche über Dateien. Aber ist der Unterschied wirklich so groß? Und ist die Textsuche häufig nicht sogar schneller?

    Refactoring
    Refactoring ist eine der großen Errungenschaften in der Neuzeit der Softwareentwicklung und ihr Automatisierungsgrad ist wirklich erstaunlich hoch. Aber welche automatisierten Refactorings nutzen wir überhaupt bei der täglichen Arbeit und wie häufig? Viele Entwickler verzichten sogar absichtlich auf bestimmte einfache Automatisierungen (z.B. "Introduce Variable"), weil sie von Hand schneller sind - die Mächtigkeit der IDEs führt bei großen Projekten leider dazu, dass die Arbeit mit ihnen mitunter doch etwas zäh wird.
    Viele Refactorings kann man in der Tat mit vertretbarem Aufwand und Risiko auch von Hand durchführen. Einige andere (z.B. "Rename Class") lassen sich auch auf anderem Wege automatisieren (Find&Replace über Dateien). Natürlich kann man sich dann oft nicht 100%ig sicher sein, dass alles korrekt geändert wurde. Man muss anschließend die Tests ausführen. Dass muss man in Java aber auch, weil es immer mehr untypisierte Referenzen in XML-Dateien (Struts, Spring, EJB etc.) gibt, die den IDEs auch mal durch die Lappen gehen.

    Auto-Completion
    Bei der automatischen Vervollständigung tippt man nur den Beginn eines Wortes ein und die IDE ergänzt die fehlenden Zeichen. Dadurch spart man Tippzeit, reduziert die Wahrscheinlichkeit von Tippfehlern und muss sich nur an den Anfang von Methodennamen erinnern.
    Interessanterweise gibt es auch in programmiersprachen-unabhängigen Editoren wie Emacs oder JEdit Auto-Completion. Dabei werden viel einfachere Verfahren eingesetzt als in den Java-IDEs, die aber erstaunlich gute Ergebnisse liefern. Ein ganz einfacher Ansatz besteht z.B. darin, bei der Auto-Completion nur die Wörter zu berücksichtigen, die in der aktuellen Datei schon mal verwendet wurden. Etwas umfangreicher ist der Ansatz, die Wörter aller Dateien eines Projektes zu verwenden.
    Ähnlich wie beim Cross-Referencing sind diese Auto-Completion-Features der Editoren qualitativ denen der IDEs unterlegen. Aber wie beim Refactoring sie sind schneller.

    Und das ist ein Faktor, den man nicht unterschätzen sollte. Ich ertappe mich beim Java-Programmieren jedenfalls immer wieder dabei, dass ich Namen komplett manuell eintippe, weil ich damit schneller bin als die zäh reagierende Entwicklungsumgebung. Und wenn ich in einem einfachen Editor eine Skriptsprache programmiere, genieße ich es, dass der Editor immer sofort reagiert. Die IDEs sind nur Bruchteile von Sekunden langsamer, aber das reicht schon aus, um den Flow beim Programmieren zu beeinträchtigen.

    Post bewerten

    Samstag, August 19, 2006

    Closures in Common Lisp

    Martin Fowler published an online article about closures. He used the Ruby programming language for the examples. There are translations of the examples to Python and a language called Boo.

    As a programming task for myself I did the examples in Common Lisp, which supported Closured already decades ago. A real lisper might be able to write the code in a more elegant way but I think the principle should become clear.

    I didn't use the Common Lisp Object System (CLOS) since for this simple example an ad-hoc modeling with hashes is simpler.


    ;; Ruby
    ; def managers(emps)
    ; return emps.select {|e| e.isManager}
    ; end

    ;; Common Lisp
    (defun is-manager (emp) (getf emp :is-manager))

    (defun managers (emps)
    (remove-if-not (lambda (emp)
    (when (is-manager emp) emp))
    emps))


    ;; Ruby
    ; def highPaid(emps)
    ; threshold = 150
    ; return emps.select {|e| e.salary > threshold}
    ; end

    ;; Common Lisp
    (defun high-paid (emps)
    (let ((threshold 150))
    (remove-if-not (lambda (emp)
    (when (> (getf emp :salary) threshold) emp))
    emps)))


    ;; Ruby
    ; def paidMore(amount)
    ; return Proc.new {|e| e.salary > amount}
    ; end

    ;; Common Lisp
    (defun paid-more (amount)
    (lambda (emp) (when (> (getf emp :salary) amount) emp)))

    ;; Ruby
    ; highPaid = paidMore(150)
    ; john = Employee.new
    ; john.salary = 200
    ; print highPaid.call(john)

    ;; Common Lisp
    (let ((high-paid (paid-more 150))
    (john '(:name John :is-manager nil :salary 200)))
    (princ (funcall high-paid john)))


    ;; Tests
    (defparameter manager-list
    '((:name Stefan :is-manager nil :salary 150)
    (:name Henning :is-manager t :salary 151)
    (:name Martin :is-manager nil :salary 120)
    (:name Christian :is-manager t :salary 200)))

    (princ #\newline)
    (princ "Test function managers")
    (princ #\newline)
    (princ (managers manager-list))
    (princ #\newline)

    (princ #\newline)
    (princ "Test function high-paid")
    (princ #\newline)
    (princ (high-paid manager-list))
    (princ #\newline)

    Post bewerten

    Freitag, August 04, 2006

    Sensing Variables for Refactorings

    Michael Feathers hat ein Konzept namens Sensing Variables beschrieben, mit dem sich Refactorings an Methoden sicherer durchführen lassen. Ein häufiges Problem mit dem Refactoring "Extract Method" besteht darin, dass der selektierte Code-Block sich nicht automatisch in eine Methode verschieben lässt (z.B. weil die neue Methode dann mehrere Rückgabewerte haben müsste). Also muss man erstmal manuell die Methode manipulieren, bevor man "Extract Method" ausführen kann. Dazu muss man häufig die Reihenfolge von Anweisungen in der Methode ändern, kann aber nur schwer feststellen, ob sich durch das Verschieben die Semantik der Methode ändert. Sensing Variables helfen, an dieser Stelle mehr Sicherheit zu bekommen.

    Post bewerten

    DSL: Domain Specific Languages

    Martin Fowler hat einen kurzen Artikel über DSLs in seinem Blog veröffentlicht. In dem Artikel erklärt er den Unterschied zwischen General Purpose Languages (GPL) und DSLs. Außerdem argumentiert Fowler, dass der Übergang zwischen APIs und DSLs fließend ist. Das API einer Bibiothek könne durchaus vergleichbar sein mit einer DSL.

    Das finde ich sehr überzeugend, vor allem wenn man sich die dynamischen Skriptsprachen a la Ruby, Groovy oder Lisp ansieht. Dort wo in Java eigene DSLs für Build-Skripte (ANT), Datenbankabfragen (Hibernate Query Language, HQL) oder Oberflächenbeschreibung (HTML, JSP) verwendet werden, haben Ruby und Konsorten einfach nur Bibiotheken, die innerhalb der Programmiersprache verwendet werden.

    Interessant finde ich, dass alle Artikel zum Thema DSL, die ich kenne (ich gebe zu, dass das nicht allzu viele sind), sich ausschließlich um Technologie-Domänen kümmern. Es kommen immer wieder dieselben technischen Beispiele für DSLs: SQL, ANT, etc. Das finde ich schade. Schließlich sind die technischen Aspekte in einem Softwareprojekt eher uninteressant im Gegensatz zu den fachlichen. DSLs nur für technische Aufgaben zu verwenden, riecht nach einer Optimierung an der falschen Stelle (wenn ich in einem Bereich 50% Aufwände spare, der nur wenige Prozent meiner Gesamtaufwände ausmacht, ist der Gesamtgewinn marginal).

    Eigentlich müssten wir nach fachlichen DSLs suchen. Interessiert das Niemanden, ist das so schwer oder lese ich einfach nur die falschen Quellen?

    Post bewerten

    Freitag, Juli 28, 2006

    Flow - Softwareentwicklung im Fluss

    Wenn ich heutige Java-Projekte sehe, dann ertappe ich mich immer wieder bei derselben Frage: "Muss das alles so schwerfällig sein?" Um dieser Frage nachzugehen, habe ich mich selbst gefragt, wie ich mir Softwareentwicklung vorstelle. Dazu fällt mir zuerst ein Wort ein: Flow

    Meine Gedanken dazu habe ich in einem Online-Artikel niedergeschrieben.

    Post bewerten

    Sonntag, Juli 23, 2006

    YouOS: Bye, bye Betriebssystem?

    YouOS ist ein webbasiertes Betriebssystem mit allerhand Anwendungen. Das ganze Ding ist noch im Alpha-Stadium, aber die Richtung ist schon mal interessant:

    • Keine Installation von Software auf dem eigenen Rechner.
    • Zugang zu den eigenen Programmen und Daten von jedem Rechner der Welt aus.
    • Automatische Datensicherung
    • Zentrale Sicherheitsmechanismen gegen Viren und andere Angriffe

    Eigentlich ist das Ganze eine naheliegende Idee. Mit Writeboards, Writely, GMail, NumSum, Flickr und anderen sind längst mehr Funktionen im Internet verfügbar, als der durchschnittliche Anwender benötigt. Was bisher fehlte, war die Integration. Man musste mehrere Accounts verwalten, sich URLs merken und konnte schlecht übergreifend über die Systeme arbeiten.

    YouOS leistet das noch nicht vollständig, aber das Potenzial ist da.

    Post bewerten

    Dienstag, Juli 18, 2006

    Buch: Hackers and Painters

    Ich habe gerade das Buch "Hackers and Painters" von Paul Graham durchgelesen. In dem Buch ist eine Reihe von Essays veröffentlicht, die (fast?) alle auch online auf auf der Web-Site von Paul Graham verfügbar sind. Trotzdem lohnt sich das Buch, um es in der Bahn oder im Urlaub zu lesen.

    Die Essays decken verschiedene Themenbereiche ab begonnen vom typischen Hacker-Charakter über Innovationen und Startups in der IT bis hin zum Programmiersprachenentwurf. Dabei vertritt Paul Graham häufig ungewöhnliche Ansichten und Ideen und regt damit zum Denken außerhalb der gängigen Bahnen an (warum die nächste Webanwendung nicht in Lisp schreiben?).

    Mir hat das Buch jedenfalls sehr gut gefallen.

    Post bewerten

    Dienstag, Juli 11, 2006

    Verantwortung in der Softwareentwicklung

    Ich habe zusammen mit Henning Wolf einen Artikel über Berufsethos und Verantwortung in der Softwareentwicklung im Java-Magazin veröffentlicht. Der Artikel ist online verfügbar.

    Der Artikel ist kontroverser als der Titel vielleicht vermuten lässt. Die drei Hauptthesen des Artikels sind:
    1. Jeder ist verantwortlich für alles, was er tut.
    2. Jeder ist verantwortlich für alles, was er denkt.
    3. Jeder ist verantwortlich für alles, was mit ihm geschieht.

    Wer würde das schon einfach so unterschreiben? Wer nicht, sollte den Artikel lesen.

    Post bewerten

    Mittwoch, Juli 05, 2006

    Regeln vs. Eigenverantwortlichkeit in agilen Projekten

    Bei den agilen Methoden gibt es deutliche Unterschiede in den Vorgaben und Regeln, die sie definieren. So ist z.B. Feature-Driven-Development sehr strikt bzgl. Rollen und Verantwortlichkeiten und eXtreme Programming definiert den Entwicklungsprozess sehr detailliert. Auf der anderen Seiten steht Scrum, dass nur grob regelt, wie die Anforderungen in das Projekt eingebracht werden. Die restliche Ausgestaltung des Projektes obliegt den Entwicklern.

    Was ist das bessere Modell? Wieviel Freiheit brauchen die Entwickler, um höchste Produktivität zu erreichen und wieviel Regeln muss man definieren, damit das Projekt nicht im Chaos versinkt?

    Vielleicht hilft bei der Beantwortung dieser Frage das Dreifus-Modell der Qualifikationsaneignung (Skill Acquisition). Demnach brauchen Anfänger Regeln und Vorgaben. Bei der Arbeit in dem so vorgegebenen Rahmen entwickelt sich Erfahrung und Intuition, so dass die Regeln und Vorgaben immer weniger wichtig werden und sogar behindern können. Also wären Feature-Driven-Development und eXtreme Programming eher für Neulinge geeignet und Scrum für erfahrene Entwickler?

    Post bewerten