Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

06 October 2016

Bauen versus Basteln

Vorsicht: Nestbeschmutzung

Tut mir ja wirklich leid, aber ich möchte an dieser Stelle mal ein wenig IT-Bashing betreiben - und mich über die teilweise grotesken Zustände der Softwareentwicklung beklagen.

TL;DR (aka Zusammenfassung)

Wir basteln oft, statt (systematisch) zu bauen. Das liegt manchmal weniger an uns Techies (Entwicklern, Architekten etc), sondern an negativen Wechselwirkungen vieler Parameter, die häufig miserabel gemanaged werden - und auf Dauer dann zu unwartbaren, unflexiblen und unverhältnismäßig teuren IT-Landschaften führen. Ziemlich drastisch hat das renommierte "Handelsblatt" es zuletzt unter dem Titel "Ramponierte IT" auf den Punkt gebracht:
"Die schlechten Computersysteme werden für viele Effizienzprobleme verantwortlich gemacht" (Handelsblatt)

Software "entwickeln" klingt systematisch...

Wir sagen fast alle "Softwareentwicklung" zu unseren Jobs - das klingt systematisch, fast so wie "Engineering". Wir erfreuen uns an Entwurfsprinzipien, verwenden etablierte Architekturmuster und arbeiten iterativ-agil. Stets streben wir nach Innovation und Verbesserung, und dauernd kommunizieren uns Blogs, Zeitschriften und Konferenzredner coole "Success Stories": Systeme in denen (scheinbar) alles richtig entschieden und ordentlich implementiert wurde.

"basteln" trifft es oft besser

In Wirklichkeit hat das so genannte "Entwickeln" von Software meiner Erfahrung nach in vielen Fällen deutlich mehr mit "Basteln" als mit systematischem Vorgehen zu tun. Die oben genannten "Erfolgsgeschichten" passieren oftmals "woanders", in ganz speziellen Situationen oder halten einer näheren Überprüfung nicht stand. Viele unserer mittleren bis großen Systeme sind "hysterisch gewachsen", man könnte auch "gewuchert" dazu sagen. Viele meiner aktuellen und ehemaligen KollegInnen können in ihren eigenen Systemen mehr Antipatterns aufzeigen, als Stellen, auf die Teams auch nach längerer Zeit noch stolz sind. Diese Probleme treten völlig unabhängig von (oder sogar trotz der...) so genannten Vorgehens- oder Reifegradmodellen auf.

Same Stupid Mistakes

Dabei wissen wir (SoftwerkerInnen) doch ziemlich genau, welche typischen Fehler auf lange Sicht zu übermässig komplexen Systemen führen - die wir im Team nicht mehr effizient weiter bearbeiten können... Aus meiner Sicht sind dabei folgende Themen besonders schlimm:
  • Mangelhafte Anforderungen: Garbage in, garbage out. Wenn uns Product-Owner oder Fachbereiche unscharfe oder schwammige Anforderungen geben, werden wir möglicherweise stark konfigurierbare Systeme liefern, damit alle möglichen Interpretationen dieser Anforderungen noch erfüllbar sind. Uns allen ist aber klar, dass Konfigurierbarkeit mit hoher Komplexität einhergeht - und zu mehr Code führt, als wenn wir stärker abgrenzen und uns in Systemen stärker fokussieren.
  • Unklare Qualitätsanforderungen:Teams haben immer "implizite" Vorstellungen, welche Qualitätsanforderungen ein System denn erfüllen müsste. Leider unterscheiden sich diese impliziten Annahmen manchmal gravierend von denen der Fachabteilungen, Auftraggeber oder sonstigen Systemverantwortlichen.
  • Arbeit unter Zeitdruck: Es gibt im Durchschnitt immer mehr Arbeit als Zeit dafür. Daher gehen wir während der Arbeit an Systemen lauter kleine Kompromisse ein, die einzeln kaum auffallen, in ihrer Summe dann aber zu fatalen Mängeln der inneren Qualität führen - ein anderer Begriff dafür sind "technische Schulden".
  • Kein Abbau technischer Schulden: Zu viele Abhängigkeiten, schlechte Modularisierung, geringe Konsistenz, übertriebene Inhomogenität, Nutzung veralteter Frameworks oder Technologie, unzureichende automatische Tests (um nur einige aufzuzählen) - das könnten wir ja alles bereinigen oder zumindest drastisch verbessern - sofern wir dafür etwas Zeit zugestanden bekämen. Aber: Der Abbau dieser technischen Schulden hat für unser Management kaum Priorität, ist mancherorts sogar als "nutzlose Zeitverschwendung" verschrien, die, so wörtlich, "ja keine neuen Features liefere".
  • Mangelhafte Entwicklungsprozesse: Auch heute, im Jahre 2016, weigern sich Organisationen noch beharrlich, auf flexiblere und schnellere Entwicklungsprozesse zu setzen. DevOps und Continous-Integration werden als "funktioniert hier sowieso nicht" abgetan. Klar, das funktioniert ja wirklich nur, wenn Organisationen bereit sind, an ihren Prozessen als Ganzes zu arbeiten - also auch Anforderungen, Test, Deployment/Release und Betrieb zu optimieren. Einer meiner Kunden aus der Finanzbranche hat das letztens mal prägnant formuliert: "Da müsste mal von ganz oben jemand durchregieren - um den Silo-Fürsten die Macht über ihre Teilprozesse zu beschneiden."
  • Lokale statt globale Optimierung: Entwickler besitzen einen fast unbändigen Drang zur Verbesserung, den sie gerne in Form von Refactorings oder kleinen lokalen Veränderungen ausleben. Solange umfassende und komplett automatisierte Tests diese Veränderungen auf mögliche Nebenwirkungen überprüfen, ist das gut. Manchmal verlieren Entwicklern jedoch den Überblick über die negativen Konsequenzen ihrer lokalen Änderungen auf andere Teile des Systems... Wir sollten Verbesserungen stets in etwas größerem Kontext betrachten - also über den Tellerrand einzelner Personen hinweg schauen. Das ist meiner Ansicht nach eine klassische Aufgabe für die Rolle "Softwarearchitektur".
  • Wenig Verständnis für Zusammenhänge im Großen: Ich bekomme in realen Projekten oftmals zu hören: "Wir können ja die Wechselwirkungen auf andere Systemteile gar nicht mehr genau beurteilen".... Solange Projekte das Thema "Übersichtsdokumentation" weiter vernachlässigen, wird mangelnde Übersicht auch ein Problem bleiben.

Bin ich zu pessimistisch?

Klar, wir können auch "gut": Homogene Teams, ohne Fluktuation, über viele Sprints hinweg mit ausreichend Zeit und Budget ausgestattet, denen verständige und kundige Managerinnen den Rücken freihalten, und denen exzellente Product-Owner ordentliche und konsistente Anforderungen geben. Ich arbeite seit fast 30 Jahren in der Softwareentwicklung, habe praktisch alle Branchen von innen erlebt. Meine Teams reichten von 3 bis zu mehr als 200 Personen, Informationssysteme, Embedded-Systeme, Business-Intelligence, moderne und ziemlich alte Technologie, große und kleine, arme und reiche Auftraggeber... und die stets wiederkehrende Konstante all dieser Situationen ist die massive Unordnung. Nein - ich selbst glaube nicht, dass ich hier zu pessimistisch schreibe.

Abhilfe: Systematische Verbesserung

Unsere Grundthese bei der Verbesserung lautet:
"Reduktion technischer Schulden führt zu Kostensenkung in der Entwicklung neuer Features."
Sie müssen mit Ihrem Management über systematische Verbesserung sprechen, über zielgerichtete und gesteuerte Modernisierung und Evolution. Dabei müssen Sie zwischen "Features-liefern" und "Schulden abbauen" abwägen, denn Sie können einerseits niemals für längere Zeit auf neue Fachlichkeit verzichten, und müssen andererseits garantiert mit beschränktem Budget zurecht kommen. Als zentral erweisen sich dabei zwei Parameter:
  • Innere Qualität der Systeme, die sich in Themen wir niedriger Kopplung, hoher fachlicher Kohäsion, hoher Codequalität, Konsistenz (Homogenität) der Implementierung und Verständlichkeit äussern.
  • Äußere Qualität der Systeme. Anders ausgedrückt: Business-Wert, die Menge fachlicher Features, fachliche Leistung, Performance, Benutzerfreundlichkeit, Skalierbarkeit, Menge der erfüllten Kundenwünsche.
Argumentieren Sie gegenüber Ihrem Management, dass bei systematischer Verbesserung (d.h. Steigerung der inneren Qualität) die fachlichen Features wirtschaftlich günstiger ("preiswerter") werden - und wir zukünftig damit bessere time-to-market erreichen! Ihr Management kennt sicherlich den traurigen Normalfall: Über die Zeit werden bei (vielen) Systemen Features immer teurer, bzw. die Entwicklung immer langsamer (in der folgenden Abbildung die rote Linie). Ihr Management benötigt einen Überblick, welche Probleme es bei Systemen gibt- und wie "schlimm" diese wirklich sind, am besten in Geldeinheiten ausgedrückt. Damit werden verschiedene Probleme miteinander vergleichbar. Wenn Sie unsicher sind, geben Sie diese Problemkosten in Intervallen an, oder beschränken Sie sich auf die Angabe von Größenordnungen. Dazu stellen Sie Ihrem Management vor, welche Abhilfen es für welche Probleme gibt - am besten jeweils mehrere Alternativen. Hüten Sie sich davor, von der "einzigen Möglichkeit" zu sprechen, die angeblich ein Problem löst: Normalerweise gibt es zu jedem (!!) Problem nämlich eine Vielzahl möglicher Abhilfen. Velocity mit/ohne Verbesserung Erklären Sie, dass systematische Verbesserung längerfristig angelegt ist, und durchschnittlich sowohl den "business value" der Systeme verbessert (also für die Anforderungs-/Fachseite den Wert der Systeme steigert), gleichzeitig (!) aber auch die technischen Schulden reduziert. Das (Open-Source) Projekt aim42 (architecture improvememt method) stellt für die systematische Verbesserung fast 100 "good practices" zusammen, etablierte und bewährte Vorgehensmuster.

Fazit: Das klappt wirklich!

Vorsicht - Eigenwerbung: Sie können systematische Verbesserung lernen - wir bieten dazu den dreitägigen Workshop "IMPROVE" an.
An dieser Stelle möchte ich Ihnen Mut zusprechen: Hartnäckigkeit und Systematik lohnt sich: Ich habe in unterschiedlichen Branchen IT-Systeme verschiedener Größe und Komplexität "systematisch verbessert". Mit Teams zusammen habe ich time-to-market deutlich verkürzt, Test- und Entwicklungsaufwände gesenkt, Performance verbessert und in praktisch allen Fällen die Zufriedenheit der Teams signifikant erhöht. Ich habe (skeptische) Manager überzeugen können, dass Verbesserung sich wirtschaftlich lohnt. In diesem Sinne - bleiben Sie "am Ball". Erklären Sie, wie schlimm ihre Probleme sind, und welche direkten und indirekten Kosten sie verursachen. Update 9. Oktober 2016: Fixed typos.

06 November 2015

Langlebigkeit und Wartbarkeit

 

In diesem Post möchte ich das alte Dilemma der steigenden Wartungskosten von Software ansprechen - und auf ein dazu passendes Buch (von Carola Lilienthal) hinweisen. Ich habe ihn für dieses Buch als Geleitwort geschrieben (bin damit sozusagen parteiisch).

Eigentlich...

... wissen Softwareentwickler(innen) und –architekt(innen) ganz genau, worauf sie bei Entwicklung und Änderung von Software achten sollten: Einsatz etablierter Architektur- und Entwurfsmuster, saubere Modularisierung, lose Kopplung, hohe Kohäsion und Durchgängigkeit (Konsistenz und innere Ordnung), dazu eine große Portion sinnvoller weiterer Entwurfsprinzipien. Haben wir alle gelernt, geübt und erfolgreich genutzt.

 

Dennoch...

... geht in den Tücken der Praxis so einiges schief: Viele Softwaresysteme erkranken über kurz oder lang an der IT-Seuche Nr. 1 – der „generellen Verrottung“: Folgen dieser Malaise: 

  • Wartungs- und Änderungskosten steigen unaufhaltsam auf ein schier unerträgliches Maß an. 
  • Intransparenz wohin man nur schaut. Kaum jemand überblickt noch die Konsequenzen von Änderungen. Selbst kleine Erweiterungen werden zum technischen Vabanquespiel.
  • Arbeit an solchen Systemen wird zur Qual – obwohl Softwareentwicklung an sich zu den interessantesten Tätigkeiten überhaupt gehört. ☹

Der folgenden Abbildung liegt kein reales System zugrunde, spiegelt aber meine Erfahrung in Dutzenden mittlerer und großer Systeme aus unterschiedlichen Branchen und Technologien wider:

 

rotting software

 

Endlich...

... bricht Carola Lilienthal mal explizit die Lanze für die beiden (in der Praxis allzu oft vergessenen) Qualitätsmerkmale Langlebigkeit und Wartbarkeit. Diese beiden bilden eine wesentliche Grundlage der inneren Qualität von Software. Niemand kann sie einer Software von außen ansehen – aber alle Stakeholder von Systemen möchten sie haben:

  • Auftraggeber von Systemen freuen sich, weil sich die hohen Investitionen in Erstellung und Wartung lohnen und weitere Änderungen kostengünstig sind.
  • Anwender und Fachabteilungen freuen sich, weil Änderungen am System schnell und mit hoher Zuverlässigkeit erfolgen können. 
  • Entwickler und Softwarearchitekten freuen sich, weil Arbeit an sauberen Systemen viel produktiver ist. Niemand braucht mehr Angst vor bösen Nebenwirkungen einer kleinen Änderung zu haben.

 

Prima

... dass Carola dieses Buch geschrieben hat: Ihre langjährigen Erfahrungen auf dem Gebiet der Architekturanalyse von Systemen unterschiedlicher Technologien sind einzigartig. Dadurch stellt sie in jedem Winkel dieses Buches den nötigen Praxisbezug her.Ich durfte als einer der Ersten das Manuskript lesen – und habe sehr davon profitiert!

 

Mehr dazu im Buch selbst (die Website zum Buch ist noch in Arbeit…)

 

History:

Nov.07: fixed typos (thx, @stilkov)

18 March 2015

IT-Systeme systematisch verbessern...

Software neu erstellen - das lernen wir alle in Ausbildung und Studium.

Die Evolution, Weiterentwicklung oder Verbesserung von Softwaresystemen systematisch zu betreiben, müssen wir uns mühevoll in "Training on the Job" selbst beibringen - bisher zumindest...

Neuer Lehrplan zum Thema


Seit kurzem hat der iSAQB e.V. einen entsprechenden Lehrplan namens IMPRVOVE aufgenommen (Disclaimer: Ich habe den entworfen und eingereicht).

Dessen Name ist Programm: Sie können ab sofort lernen, wie Verbesserung, Evolution oder Weiterentwicklung systematisch funktioniert, mit balancierten betriebswirtschaftlichen, fachlichen und technischen Zielen.

IMPROVE hilft Ihnen, kurzfristige Budgetvorgaben und langfristige Architektur- und Produktqualität in Einklang zu bringen. Sie vermeiden Verletzungen der konzeptionellen Integrität und kurzfristige Behelfslösungen. Es zeigt systematische Auswege aus inkonsistenter Implementierung und riskanter Technologiediversifizierung.


Was Sie zum systematischen Verbessern brauchen

aim42 verrät Ihnen schon ziemlich viel, aber ganz praktisch sollten Sie folgende Fähigkeiten mitbringen, wenn Sie Systeme verbessern möchten:

  • Systematische Problemanalyse betreiben, sowohl auf Makro- (z.B. bei Querschnittsthemen, externen Schnittstellen, Entwicklungsprozessen) wie auch auf Mikroebene (z.B. im Code)
  • systematisch Verbesserungsvorschläge für die gefundenen Probleme entwerfen.
  • sowohl Probleme wie auch Lösungsoptionen aus betriebswirtschaftlicher Sicht bewerten (d.h. in Geldeinheiten!). Dieser Punkt fällt Softwareentwicklern erfahrungsgemäß besonders schwer.
  • Langfristiges Vorgehen bei Verbesserung planen, ihre "Evolutionsstrategie" festlegen.
  • Kurzfristige Verbesserungen planen und durchführen, beispielsweise Refactorings, Einführung interner Schnittstellen, Verbesserung von Modularisierung, Kohäsion und/oder Kopplung.
  • Sich durch betriebswirtschaftlich fundierte Argumentation gegen kurzfristige Widerstände durchsetzen.


In diesem Sinne - viel Spaß beim Verbessern Ihrer Systeme.

13 May 2014

Open-Close-Principle considered (practically) useless

Underlying Goal Considered Valuable

In a recent blogpost, the honorable Uncle Bob once again discussed the merits of the famous Open-Close-Principle. Quote:
You should be able to extend the behavior of a system without having to modify that system.
I like and strongly support that idea. It's realization by plugin-architectures is useful in some cases, it's foundation in object-orientation is one of the few useful applications of inheritance. I teach the OCP in classes and advice people inhale it like oxygen in their daily life. It's a beautiful theoretical concept. In practice, it's mostly useless - sigh.

The Nature of Changes in Practice

Since more than 20 years I work with teams changing, enhancing or optimizing software systems. I've seen code in financial industry, insurance and banking systems, logistics, telecommunications, embedded systems and, of course, the web. Changes were often corrections to previous requirements: (I quote real customers and product-managers in the following lines)
  • "aargh - we didn't mean it THAT way, please correct it to THIS way".
  • "Make it faster, whatever it takes."
  • )
  • "We need some new attributes in the view"
  • "You have to integrate the XYZ system urgently into our processing" (replace XYZ by SAP(c), Oracle(c) or any huge commercial software suite that you cannot integrate by just calling a simple API)
Too bad those requirements cannot be met by simply creating a new plugin to a nice-and-beautiful plugin architecture. Too bad those requirements often invalidate yesterdays' assumptions and code. The open-close-principle does not help me in those cases. Those cases are the rule, the standard, normal. Even if I (or other software engineers) had implemented plugin architectures - those wouldn't help with new attributes in some strange old-school UI or some backend insurance database.

Is Open-Close Applied in Real Systems?

Most productive systems I met (and I met many many dozens of them) don't have the notion of clear extension points. Many have been implemented by teams under severe cost or time restrictions without freedom to apply design principles - sigh again. That's one reason we founded aim42 - to systematically improve (and hopefully help spread OCP application..). @Uncle Bob: Thanx for your design principles - they make this (software) world a better place...

09 September 2013

Emacs on Mac-OS: Configuration for Alt- and Meta-Key

Oh what a nuisance, having to configure key-bindings so that Emacs becomes usable on Mac-OS...

The Problem

  • You need a proper META-key to use Emacs.
  • With non-US keyboards, you need the ALT-key to type characters like [, ], { or }. 

 

Command-as-Meta? No way...

People discuss wether to configure the COMMAND-key (aka "apple-key" or CMD) as META. 

Imho impossible, as in *all* other Mac applications, CMD plays a central role (new, open, duplicate, quit, minimize etc.). No way I can unlearn these key combinations.

 

Escape-as-Meta? Your Fingers Run Marathon...

Some people use ESC as Meta. For every of the numerous Meta-commands in Emacs, send your little pinky finger all the way up north-east to Escape-country… no, that feels like an unhealthy amount of movement to me.

 

Left-ALT-as-Meta, Right-Alt-for-Special-Characters

Whow - that's clever: Using the left-Alt key for something different than the right-Alt key...

Simple put the following line in your emacs configuration file (~/emacs.d/user.el or similar):

(setq ns-right-alternate-modifier nil)

That works fine for me...

 

Of course, I have CAPS-Lock mapped to CTRL (in Mac-OS system settings under keyboard)

 

Some more Emacs Links

@pschirmacher pointed me to  http://www.braveclojure.com/basic-emacs/, which contains both a nice setup and pragmatic introduction.

I use the "vanilla Emacs" - of course the key config from above also works in terminal-Emacs. 

30 May 2013

Patterns-kompakt, die Vierte...

Gerade frisch aus der Druckerpresse kommt die vierte Auflage von Patterns-kompakt, der kurzen und hoffentlich kurzweiligen Einführung in Entwurfsmuster.


Das Buch fasst die wichtigsten Entwurfsmuster zusammen, die Sie für Software-Entwicklung benötigen. Software-Entwickler, -Architekten und -Designer finden darin effektiv anwendbare Lösungen für tägliche Entwurfsprobleme. 

Neu zur vierten Auflage sind jede Menge Codebeispiele, die zum Experimentieren mit den Mustern einladen… siehe hier.

Mehr zum Inhalt, viele Extrakte und jede Menge zugehörigen Sourcecode finden Sie auf der Website zum Buch… (danke an Karl Eilebrecht, dem PK-Helden!)

PK4-Cover-XL

 

Rein aus historischen Gründen hier mal die Evolution der Cover (links mit der ersten Auflage beginnend) - wobei wir uns für das Aussehen der ersten Auflage ja fast bei unseren Lesern entschuldigen müssen :-)

pk1-cover pk2-cover PK3-Cover

 

Übrigens hat auch der Verlag eine Evolution hinter sich - von Spektrum über Spektrum-Elsevier zu Springer zu Springer-Vieweg…. 

09 April 2013

arc42 now has open source repositories

At Bitbucket you now find our arc42.org open source code repositories. They are independent of the arc42 architecture template (will someday maybe serve as examples for the latter).
I just comitted two small utilities for Pdf manipulation (PdfStamper and PdfUtil) - both are not "finished" but working...
Pdfstamper logo
Issue trackers are live and actively monitored.

The third project, DupeDetect, handles duplicate entries in your geocaching logs… In case you don't know what that is, don't mind. Geocachers *will* know. Hopefully we make this available as a cloud-based service soon, parallel to the source code.
(did I ever mention that I absolutely *love* the Atlassian guys…)

20 March 2013

how simple things can go awfully wrong

You know programming languages? At least one or two?

A two-liner, without any regular expression, should not be a too-great adventure...

Try the following in your favorite language:

i = 1
i += ++i + ++i

A simple assignment to an integer variable, some forms of add-operators.

They're evil - believe me. Things go wrong from here:

Let's analyse the expression in a functional way:

  • With i set to 1, the first ++i should yield 2.
  • Calculate the two of them one-after-the other, the second one yields 3.
  • Calculate the two of them in parallel, both yield 2.

So - the result should be something between 5 and 6.

Let's try Ruby first:

ruby-fails

Slightly off any sensible calculation. Consider it "failed".

Move on with Java:

java funny expression

Believe me, C# and JavaScript and some other JVM languages come to the same conclusion.

But we're not finished here. Fire up your command line and type:

awk 'BEGIN {i=1; i+= ++i + ++i; printf i}'

Puuh - yields 8. Eight. Seems a bit off for me, but awk might have reasons.

We'll check that with php in a second:

 

NewImage

 

Eight again. So many commercial websites are build with php - and they all calculate like that? re-consider your e-commerce behaviour...

Now, if you happen to have one of those wonderful GNU-C compilers installed - try out the objective-C variant of this expression: You will see eight again. Two more than with Java.

 

Finally, the mother of all programming languages, the common ground of all platforms, the C programming language:

#include <stdio.h>
int main(int argc, const char* argv[]) {
int i = 1;
i += ++i + ++i;
printf("i+= ++i + ++i liefert %i\n", i);
return 0;
}
==> 9

I have to declare it the winner of this informal competition. At least numerically the winner: Nine. 9. Three times three.

Three times what Ruby calculates. 30% more than Java and C#. Btw, compiled with the same GNU compiler that found 8 to be the answer for Objective-C. 

 If you check that with Perl, fine: Nine again:

#!/usr/bin/perl
$i=1;
$i += ++$i + ++$i;
print "i = ".$i."\n";
print "\n\n";
==> 9

I personally stopped laughing here: If we stumble upon two-liners, what about real programs, with memory, sync/async, concurrency and UI issues? With changing requirements?

 

Eventually, thinking (!) about your software might help, so instead of "test driven" or "behavior driven" or "nerd driven", what about "thought driven development" (as Rich Hickey pointed out in his famous speech "Hammmock Driven Development"

 

As a sidenote: Cobol outputs 6. I did not find any solution less than 3, nor one greater than 9.

PS: Thanx to Franz Antesberger for this nice riddle!

25 October 2012

VirtualBox: Cannot register (hdd/dvd ..) because UUID already exists

just in case you're using VirtualBox for virtualisation and you run into this issue
(might happen if you copy or clone your vm's):

Strategy is quite simple:


  1. Write down the problematic uuid!

  2. generate new uuid for the problematic device

  3. manually replace old uuid by new in vbox file



Now for the details:

1.) copy the problematic uuid from virtualbox error message

2.) Bradley Schacht published the first steps of a solution on his blog:

He wrote the solution for windows, in MacOS you have to cd into the Contents of the Virtualbox.app directory:

/Applications/VirtualBox.app/Contents/MacOS


Now issue the magic command:

VBoxManage internalcommands sethduuid PathOfYourHD



  • On MacOS, watch for lower- and uppercase.

  • The PathOfYourHD should be your existing VDI-file.



Output of the vboxmanage tool should be:
UUID changed to: 3518e10a-64f2-405a-afa7-437643af08f4


3.) Open the corresponding vbox-file (which contains the xml-definition of your vm) in any decent text editor and search for the problematic uuid (for example HardDisk uuid="{3518e10a-64f2-405a-afa7-437643af08f4})

Manually change ALL occurances of the OLD uid to the newly generated one.

That's it.





07 February 2012

Major Update von "Patterns kompakt"

Karl Eilebrecht hat mit heldenhaftem Einsatz unsere Website von "Patterns-kompakt" erweitert und grundsätzlich überarbeitet - sie lohnt einen Blick!



06 November 2010

again, Lisp...

Although I'm currently not actively involved in anything close to Lisp, I try to follow every pair of round parenthesis I can find...

A very cool clip (and book)...

(I've not yet read the book, sigh, way too much {work} to do...)

17 May 2010

Feindbild Realität: Was Entwickler nicht gerne hören...

In diesem Vortrag habe ich einiges Material von Wolfgang Keller verarbeitet und um freche Thesen zur aktuellen und zukünftigen Tätigkeit von Software-Entwicklern ergänzt... Wolfgang hat netterweise eine pdf-Version davon online gestellt, danke!

24 March 2010

ANTLR plugin on IntelliJ abandoned

too bad - one more plugin that doesn't work properly with my beloved IntelliJ: ANTLR works grammar development.

I inquired with Terence Parr, the definitive source for all ANTLR infos - and he admitted that the ANTLR plugin for IntelliJ has been abandoned, as it was "too difficult to get it to run properly".

Rescue is on its way - ANTLRv3IDE for Eclipse (3.5 onwards). Great plugin, great docu.

02 September 2009

I stopped using Eclipse...

Ever had hassle with your numerous Eclipse plugins? With update-manager complaining about missing dependencies, which nobody ever could resolve?

With re-installing your (free) development environment every now and then?

After giving the latest Eclipse ("Galileo") a try, I just dumped it: After configuring Spring, Scala, webservice, subversion and a few other plugins, the whole app did not even bother to start...

Having been Eclipse user for several years, I am really grateful for their contribution to (Java) software development. But it has become an overly complex monster in my (humble) opinion.

I lighthearted moved over to IntelliJ-IDEA - their slogan "develop with pleasure" became true within the first hour of using IDEA (I tried both 8.1.3 and their early-access version 9). Grails and Groovy support is excellent, Scala plugin working fine, subversion support the best I ever had, even Clojure working (ok - that one can definitely be improved, but true lisp programmers should stick to Emacs)

Proud user ofThe best Java IDE

24 March 2009

Linus Thorvalds on GIT

It's already beyond hype: GIT, distributed version control system.

Linus talks (at Google) about his source-code-management history,
his aversion (hatred...) of CVS and subversion,
on distribution and other interesting stuff.

Not too good for subversion-lovers :-)

23 February 2008

Article on Domain-Driven Development published...

The German OBJECTspektrum just published my latest article on "Domänenzentrierte Entwicklung" -
supported by this blog entry.

22 December 2007

Highly regarded Rickard Öberg creates "New Energy for Java"...

Only a few people combine creativity and the ability to deliver solutions... one of them is Rickard Öberg. His brain- and codechildren range from XDoclet to the JBoss application server, cool stuff.

Now he's back with the idea (and framework) he calls new energy for java in a lengthy blog entry.

He names it "QI4J" (pronounced "chee for jay") - a framework in the area of domain-driven development (I blogged about it here). Well, just in case you're architecting software systems, you should check it out...

14 December 2007

Links on Domain-Driven-Design (and Development)

For an upcoming article I researched a few things on domain-driven design. Find some of the links below:


(last updated Feb. 24th 2008, for Grails)



Note: This entry will be updated in the near future - stay tuned if you're interested in DDD!!




  • Eric Evans' domaindriven website, link to his awesome book on domain-driven design:


  • InfoQ published a minibook on DDD: Domain-Driven Design quickly (authored by Abel Avram and Floyd Marinescu)

  • Jimmy Nilson on Applying Domain-Driven Design and Patterns - a printed book...Of course, he maintains his own blog.




  • The Groovy-/Java based Grails adopted the convention-over-configuration ideas from RoR, but included several of the DDD patterns. It's really easy to describe entities and their associations, both static and dynamic scaffolding care for (some of the) rest. Just recently the Grails-team published their 1.0.1 version (too bad they introduced a number of issues, so the samples from the docu currently don't work properly - but stay tuned.





    IMHO this is one of the most promising approaches to DDD - I'm really curious wether their Apache-Wicket plugin turns out to be enterprise-ready :-) Well done, guys!!



  • NakedObjects Framework, a proven implementation of many DDD-patterns. Hosted here on sourceforge, includes an excellent (!!) programming manual with loads of samples.

  • InfoQ article on the 3.x release of NakedObjects


  • Some very clever people (Larry Constantine and Lucy Lockwood) badly complained the strange user interface of NakedObjects and published their very clear dislike here. What else to be expected from UI-gurus? It's their turf where NO and similar frameworks.




  • JMatter framework. Re-used some ideas from NakedObjects. Contains many sample applications, extensive docu. Have a look at the myTunes sample, where Eitan Suez implements a crude iTunes clone in approx 190 lines of java code. Quite cool. As in NakedObjects, the UI takes some time to get used to... Just recently (Feb-04-2008) updated the framework.


  • Introduction to JMatter on InfoQ - with interesting comments.

  • A discussion of JMatters wizards - with Groovy to the rescue...

  • A few articles on JMatter (from their website, but difficult to find).



  • Roma Framework. Another productive development framework which claims DDD, but does not provide any of the typical DDD patterns.

  • Presentation on the Roma Framework (on Slideshare)



  • Trails framework. More a productivity enhancer than a DDD-framework, but nevertheless...



  • CSLA Business Framework (Homepage), created by Rocky Lhotka.

  • Blog-Entry on CSLA-Business Framework, some critique



  • Of course, Ruby-on-Rails might be used as DDD framework. It's really productive for web applications, but does not implement any of the DDD patterns verbatim (and convention over configuration is not in the DDD list of favorite patterns...



  • Rickard Öberg started with QI4J - well worth checking out, just because it's him...




  • A german company (Freiheit.com) started their own UI-generation-DDD-framework, named SansSouci. Seems to be dead since 2005...

07 November 2007

Dynamic Language Shootout...

You want a new notebook? You know Ruby, Smalltalk, Scheme, Lisp or Python (or Prolog...)?

There's a dynamic language shootout (in German) with some nice prices (a notebook, an iPod etc).

You gotta release your solution under GPL... and fill in a form, seems pretty harmless. And: The task
is brilliant, a little AI, a little UI, loads of fun.

Go, participate. If I find the time, I'll submit a Prolog solution :-)

29 October 2007

Heard of JBoss-Seam? Want to know what it's all about?

Manning has posted a (free) well-written chapter of a forthcoming book on Seam on their site...

I wonder wether critique and suggestions will be incorporated into the final version... maybe somebody from the JBoss-Seam-Team should try...