<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Matthias Bohlen</title>
	<atom:link href="http://www.mbohlen.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mbohlen.de/blog</link>
	<description>Coach für produktive Software-Teams</description>
	<lastBuildDate>Thu, 04 Mar 2010 06:46:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Premierminister, werde agil!</title>
		<link>http://www.mbohlen.de/blog/2010/03/03/premierminister-werde-agil/</link>
		<comments>http://www.mbohlen.de/blog/2010/03/03/premierminister-werde-agil/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 22:34:18 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Gefunden]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=1075</guid>
		<description><![CDATA[Es gibt eine britische Website, auf der man online eine Petition an den Premierminister schreiben und unterzeichnen kann. Auf dieser Site findet sich eine neue Petition, die der Regierung empfiehlt, die Art und Weise, wie öffentliche Projekte eingekauft und abgewickelt werden, zu überdenken &#8211; in Richtung von inkrementellen und agilen Vorgehensweisen. Der Petitionstext (Übersetzung von [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt eine britische Website, auf der man online eine Petition an den Premierminister schreiben und unterzeichnen kann. Auf dieser Site findet sich <a href="http://petitions.number10.gov.uk/ITProcessReview">eine neue Petition</a>, die der Regierung empfiehlt, die Art und Weise, wie öffentliche Projekte eingekauft und abgewickelt werden, zu überdenken &#8211; in Richtung von inkrementellen und agilen Vorgehensweisen. Der Petitionstext (Übersetzung von mir):</p>
<blockquote><p>Wir, die Unterzeichner, haben keine Lust mehr, zu hören, wie viel von unserem Geld für fehlgeschlagene IT-Projekte der Regierung verpulvert wird.</p>
<p>Wir glauben, dass dies im Wesentlichen an der Art und Weise liegt, mit der diese Projekte ausgeschrieben und geliefert werden &#8211; nämlich, alle Anforderungen eines enormen Projektes im Vorhinein zu verlangen und sich darauf zu verpflichten. Das verurteilt Projekte dazu, fehlzuschlagen noch ehe sie begonnen haben.</p>
<p>Im privaten Sektor hat man sich bereits weitgehend von diesem falschen Modell zu einem inkrementellen Ansatz bewegt, der Änderungen im Verständnis und den Anforderungen erlaubt und die Wahrscheinlichkeit für einen Misserfolg enorm reduziert. Es ist an der Zeit, dass unsere Regierung das auch tut.</p>
<p>Wir bitten den Premierminister, den aktuellen Ansatz auf den Prüfstand zu stellen und für IT-Projekte der Regierung einen mehr inkrementellen und agilen Ansatz in Betracht zu ziehen.</p></blockquote>
<p>Wow, das sollte hier in Deutschland auch gelten! Wo kann man hier eine ebensolche Petition abgeben? Ich wäre sofort dabei!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/03/03/premierminister-werde-agil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projektverträge: Schlanke Regelungen ersparen Tauziehen</title>
		<link>http://www.mbohlen.de/blog/2010/02/26/projektvertrage-schlanke-regelungen-ersparen-tauziehen/</link>
		<comments>http://www.mbohlen.de/blog/2010/02/26/projektvertrage-schlanke-regelungen-ersparen-tauziehen/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 07:20:53 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Lesenswert]]></category>
		<category><![CDATA[Produktivität]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=1072</guid>
		<description><![CDATA[Heute erscheint die neue Ausgabe der Fachzeitschrift OBJEKTspektrum, diesmal mit dem Schwerpunktthema &#8220;Lean Development und Kanban&#8221;. Darin finden Sie auch einen Artikel von mir über agile Projektverträge. Hier die Zusammenfassung:
Umfragen unter Benutzern von IT-Systemen ergeben: Nur zwanzig Prozent der Funktionen eines IT-Systems werden &#8220;immer&#8221; oder &#8220;oft&#8221; benutzt, fast zwei Drittel hingegen &#8220;selten&#8221; oder &#8220;nie&#8221;. Diese Zahlen haben [...]]]></description>
			<content:encoded><![CDATA[<p>Heute erscheint die neue Ausgabe der Fachzeitschrift <a href="http://www.objektspektrum.de">OBJEKTspektrum</a>, diesmal mit dem Schwerpunktthema &#8220;Lean Development und Kanban&#8221;. Darin finden Sie auch einen Artikel von mir über agile Projektverträge. Hier die Zusammenfassung:</p>
<blockquote><p>Umfragen unter Benutzern von IT-Systemen ergeben: Nur zwanzig Prozent der Funktionen eines IT-Systems werden &#8220;immer&#8221; oder &#8220;oft&#8221; benutzt, fast zwei Drittel hingegen &#8220;selten&#8221; oder &#8220;nie&#8221;. Diese Zahlen haben den Umgang mit Anforderungen in IT-Projekten verändert: Lernen im Projekt ist ausdrücklich erlaubt, Änderungen sind willkommen. Diese Situation stellt neue &#8220;Anforderungen an die Anforderungen&#8221;. Der Artikel zeigt, wie Anforderungen heute aussehen können, damit man mit ihnen sehr schlanke Projektverträge gestalten kann. &#8220;Money for nothing, changes for free&#8221; sind hier die zunächst unglaublich klingenden Stichworte. Auftrag geber und Entwicklungsorganisation ziehen am selben Strang, Änderungsanforderungen kosten ab jetzt kein zusätzliches Geld mehr und brauchen deshalb nicht mehr verhandelt zu werden.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/02/26/projektvertrage-schlanke-regelungen-ersparen-tauziehen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Im Flow arbeiten! Der Kunde wird es danken!</title>
		<link>http://www.mbohlen.de/blog/2010/01/23/im-flow-arbeiten-der-kunde-wird-es-danken/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/23/im-flow-arbeiten-der-kunde-wird-es-danken/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 09:00:54 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Produktivität]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=1022</guid>
		<description><![CDATA[Das folgende kleine Flash-Video habe ich erstellt, um Ihnen zu zeigen, wie es sich auswirkt, wenn Ihr Team traditionell im Stapel arbeitet (z.B. 5 Sachen spezifiziert, dann 5 Sachen entwickelt) oder wenn es im Flow arbeitet und nur 1 Sache spezifiziert, dann 1 Sache entwickelt, usw.
Der rund eine Minute lange Film zeigt anschaulich, wodurch der [...]]]></description>
			<content:encoded><![CDATA[<p>Das folgende kleine Flash-Video habe ich erstellt, um Ihnen zu zeigen, wie es sich auswirkt, wenn Ihr Team traditionell im Stapel arbeitet (z.B. 5 Sachen spezifiziert, dann 5 Sachen entwickelt) oder wenn es im Flow arbeitet und nur 1 Sache spezifiziert, dann 1 Sache entwickelt, usw.</p>
<p>Der rund eine Minute lange Film zeigt anschaulich, wodurch der Unterschied für den Kunden zu Stande kommt. Mehr über Flow gibt es <a href="/blog/kanban/flow/">hier</a>.</p>
<div style="text-align: left;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="399" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="file=http://www.mbohlen.de/blog/wp-content/uploads/2010/01/BatchVersusFlow.mp4&amp;autostart=false" /><param name="src" value="/mediaplayer/player.swf" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="500" height="399" src="/mediaplayer/player.swf" allowfullscreen="true" flashvars="file=http://www.mbohlen.de/blog/wp-content/uploads/2010/01/BatchVersusFlow.mp4&amp;autostart=false"></embed></object></div>
<div style="text-align: left;"></div>
<div style="text-align: left;"></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/23/im-flow-arbeiten-der-kunde-wird-es-danken/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aus welcher Mischung entsteht Software? [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2010/01/17/aus-welcher-mischung-entsteht-software-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/17/aus-welcher-mischung-entsteht-software-oop-2010/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 10:19:32 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=920</guid>
		<description><![CDATA[In Italien ist jeder ein Experte für Espresso &#8211; alle wissen: &#8220;Per un buon caffè, ci vogliono cinque &#8216;M&#8217;: miscela, macinatura, macchina, mano e mente.&#8221; (Für einen guten Espresso braucht man die fünf &#8216;M&#8217;: Mischung, Mahlung, Maschine, Hand und Geist).
Ist das in der Software-Entwicklung genauso? Die OOP hat sich ja in diesem Jahr auch so [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both;">In Italien ist jeder ein Experte für Espresso &#8211; alle wissen: &#8220;<strong>Per un buon caffè, ci vogliono cinque &#8216;M&#8217;: miscela, macinatura, macchina, mano e mente.</strong>&#8221; (Für einen guten Espresso braucht man die fünf &#8216;M&#8217;: Mischung, Mahlung, Maschine, Hand und Geist).</p>
<p style="clear: both;">Ist das in der Software-Entwicklung genauso? Die OOP hat sich ja in diesem Jahr auch so ein Motto auf die Fahne geschrieben: people, process, technology. Prüfen wir doch mal: people = mano e mente, process = macinatura, technology = macchina &#8211; nanu, wo bleibt <em>miscela</em>, die Mischung, der Rohstoff, aus dem die Software entstehen kann?</p>
<p style="clear: both;"><img class="alignleft" style="text-align: center; display: block; margin-top: 0px; margin-bottom: 10px; margin-left: 0px; margin-right: 5px;" src="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/miscela1-thumb.jpg" alt="" width="210" height="175" /><img class="alignleft" style="display: inline; margin-top: 0px; margin-bottom: 10px; margin-left: 0px; margin-right: 5px;" src="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/macchina1-thumb.jpg" alt="" width="210" height="175" align="left" /><img class="alignleft" style="display: inline; margin-top: 0px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px;" src="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/mano1-thumb.jpg" alt="" width="210" height="175" align="left" /></p>
<p style="clear: both;">Alistair Cockburn hat diese Frage 2006 in <a title="What engineering has in common with manufacturing" href="http://alistair.cockburn.us/What+engineering+has+in+common+with+manufacturing+and+why+it+matters" target="_blank">einem Artikel</a> beantwortet: &#8220;Software engineering &#8230; is remarkably like manufacturing, once we shift to view the <em>unvalidated decision</em> as the unit of internal inventory.&#8221; Die Mischung besteht also aus den bisher unvalidierten Entscheidungen, die in der Mühle und der Maschine immer weiter verarbeitet werden, bis der Benutzer seine neue Software in Händen hält.</p>
<p>Beispiele für solche unvalidierten Entscheidungen sind:</p>
<ul>
<li>Jede <strong>Anforderung</strong> ist eine Entscheidung, die auf einem bestimmten Geschäftsklima basiert. Wenn sich das Klima ändert, könnte die Entscheidung falsch werden.</li>
<li>Eine <strong>Architektur</strong> ist eine Entscheidung, die auf Technologie und Business basiert. Wenn sich die Technologie verändert bevor die Software genügend Wert für das Business eingespielt hat, ist die Entscheidung verschwendet.</li>
<li>Jede Zeile <strong>Code</strong> ist eine Entscheidung, basierend auf Anforderungen, Technologie und Ästhetik. Sollte eines davon obsolet werden bevor die Software genügend Geld für die Firma verdient hat, dann war auch das Verschwendung.</li>
</ul>
<p>Halten wir also am besten die Zyklen <a href="schulungen/kanban-training/">kurz und schlank</a> und erzeugen nur so wenig unvalidierte Entscheidungen wie möglich. Über Anforderungen rasch entscheiden, Entwurf und Programmierung zeitnah durchführen, dem Benutzer lauffähige Systeme in die Hand geben, die er sofort validieren kann. So bleibt der Kaffee frisch, weil die Bohnen nicht lange liegen.</p>
<p>Ich lade Sie ein, mit mir auf der OOP einen Kaffee zu trinken!</p>
<p><br class="final-break" style="clear: both;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/17/aus-welcher-mischung-entsteht-software-oop-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Features priorisieren in der Gruppe [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2010/01/15/features-priorisieren-in-der-gruppe-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/15/features-priorisieren-in-der-gruppe-oop-2010/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 13:54:15 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Produktivität]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=852</guid>
		<description><![CDATA[Mein aktueller Kunde hat ein Stakeholder-Gremium, das sich regelmäßig trifft, um neue Anforderungen zu priorisieren, die das Entwicklungsteam baldmöglichst umsetzen soll. Es besteht aus Vertretern der relevanten Geschäftsbereiche, die jeweils mit einem Teil der Anforderungen im selben lauffähigen System zu unterschiedlichen Zeitpunkten &#8220;live&#8221; gehen wollen. Die Stakeholder müssen sich also (trotz unterschiedlicher Interessen) auf einheitliche [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both;">Mein aktueller Kunde hat ein Stakeholder-Gremium, das sich regelmäßig trifft, um neue Anforderungen zu priorisieren, die das Entwicklungsteam baldmöglichst umsetzen soll. Es besteht aus Vertretern der relevanten Geschäftsbereiche, die jeweils mit einem Teil der Anforderungen im selben lauffähigen System zu unterschiedlichen Zeitpunkten &#8220;live&#8221; gehen wollen. Die Stakeholder müssen sich also (trotz unterschiedlicher Interessen) auf einheitliche Priorität einigen, die der Product Owner dann dem Entwicklungsteam gegenüber vertritt.</p>
<h3>Ausgangssituation: Priorität gemeinsam festlegen</h3>
<p>Sich zu einigen ist nicht ganz einfach. Man muss dabei folgende Fragen gleichzeitig beantworten:</p>
<ul style="clear: both;">
<li>Wie viel geschäftlichen Vorteil bringt mir ein bestimmtes Feature?</li>
<li>Bin ich bereit, den geschätzten Entwicklungsaufwand zu genehmigen?</li>
<li>Was meinen die anderen Stakeholder dazu?</li>
<li>Kriegen wir einen Konsens hin, so dass wir besser zwei ganze anstelle von vier halben Features beauftragen können?</li>
</ul>
<p style="clear: both;">Gestern war ich beim ersten Treffen dieses Gremiums, eingeladen als Coach für agile Methoden und Produktivität. Um möglichst einfach auf einen Konsens über die Prioritäten zu kommen, spielten wir das Innovationsspiel <a title="Innovation Games" href="http://innovationgames.com/the-games/Buy+a+Feature" target="_blank">Buy a feature</a>. (Danke an <a title="Michaels Website" href="http://www.michaelmahlberg.de/" target="_blank">Michael Mahlberg</a>, der die Idee hatte, dieses Spiel zu nehmen!)</p>
<p style="clear: both;">Der Product Owner stellte die Stories (Features) aus dem Product Backlog mit Hilfe von User Story Karten vor. Die Entwickler hatten den Aufwand für diese Stories vorher in Story Points abgeschätzt, der Product Owner hatte den Aufwand auf den Karten vermerkt.</p>
<h3>Spielregeln</h3>
<p>Die Spielregeln für &#8220;Buy a feature&#8221; sind sehr einfach und wirkungsvoll:</p>
<ul style="clear: both;">
<li>Jeder Stakeholder bekommt eine bestimmte Anzahl Münzen.</li>
<li>Jedes Feature hat einen &#8220;Preis&#8221;, der durch den Entwicklungsaufwand bestimmt wird.</li>
<li>Stakeholder &#8220;kaufen&#8221; nun die Features, die sie für wichtig halten, indem sie die Münzen auf die Story-Karten legen. Da sie nicht alles kaufen können, müssen sie priorisieren.</li>
<li>Wenn eine Karte so viele Münzen bekommen hat wie ihr Preis angibt, gilt sie als gekauft und kommt ans obere Ende des Product Backlogs.</li>
</ul>
<p style="clear: both;"><img class="alignleft" style="display: inline; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px;" src="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/flohspiel3-thumb1.jpg" alt="" width="146" height="121" align="left" />Als Münzen eignen sich <strong>farbige Plättchen</strong>, wie sie im <a title="Wikipedia" href="http://de.wikipedia.org/wiki/Flohspiel" target="_blank">Flohspiel</a> verwendet werden. Die gibt es im Spielzeuggeschäft auch einzeln zu kaufen, ca. 5 Cent pro Stück. Eine separate Farbe pro Geschäftsbereich ist günstig, dann können Spieler ihre Münzen auch wiederfinden und auf andere Features legen, um z.B. einen Konsens zu bekommen.</p>
<p style="clear: both;">Die Randbedingungen hatte ich wie folgt gesetzt:</p>
<ul style="clear: both;">
<li>Ich gab nur so viele Münzen aus wie Story-Points in den ersten Sprint passen, orientiert an der Velocity des Teams.</li>
<li>Der Product Owner stellte ungefähr doppelt so viele Features vor wie in den Sprint passen, damit die Stakeholder genügend Auswahl hatten.</li>
<li>Die Stakeholder aus einem Geschäftsbereich bekamen mehr Münzen als die anderen, weil der erste &#8220;Launch&#8221; des neuen Systems im Wesentlichen die Belange dieses Geschäftsbereiches abdecken wird.</li>
</ul>
<h3>Der Ablauf des Spiels</h3>
<p style="clear: both;">Der Product Owner stellte die Features vor, jeweils als kurze Zusammenfassung der darin enthaltenen Funktionalität. Die Stakeholder stellten Fragen nach dem Inhalt, den Abhängigkeiten und der Abgrenzung der Features.</p>
<p style="clear: both;">Danach bildeten die Geschäftsbereiche kleine Gruppen und diskutierten, welche Features für ihren Bereich Priorität bekommen sollten. Es bildete sich schnell eine diskutierende Traube von Leuten um die Karten, die auf dem Tisch lagen.</p>
<p style="clear: both;">Nach ca. 10-15 Minuten begann der Sprecher des einen Geschäftsbereichs, seine Münzen auf die Features zu platzieren und argumentierte, warum er sich so entschieden hatte. Die anderen schlossen sich an und platzierten ebenfalls ihre Münzen. Da der Preis für manche Features zu hoch war, um durch einen einzelnen Bereich bezahlt zu werden, bildeten sich Allianzen um die Features, die als teuer und trotzdem wichtig erachtet wurden.</p>
<p style="clear: both;">Eines der Features war besonders teuer, es handelte sich um die Entwicklung eines Grundkonzeptes, das für fast alle weiteren Sprints wichtig sein würde. Der Product Owner warb dafür, es trotz des hohen Preises zu kaufen. Einige Stakeholder argumentierten dagegen, mit der Begründung, je länger sie die lauffähigen Features testen könnten, die im ersten Sprint entstehen, umso besser. Ein Geschäftsbereich, dessen Launch-Datum noch weit in der Zukunft lag, sagte dann: &#8220;Für uns wäre dieses Feature extrem wichtig, doch ob das Konzept nun jetzt oder erst im nächsten Sprint kommt, ist uns egal. Wir stellen unser Geld deshalb den anderen zur Verfügung.&#8221; Wer hätte das für möglich gehalten?</p>
<p style="clear: both;"><a class="image-link" href="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/stories_mit_geld1-full.jpg"><img class="linked-to-original" style="display: inline; margin-top: 0px; margin-right: 30px; margin-bottom: 10px; margin-left: 0px;" src="http://www.mbohlen.de/blog/wp-content/uploads/2010/01/stories_mit_geld1-thumb2.jpg" alt="" width="222" height="566" align="left" /></a>Zum Schluss blieben einige nur teilweise finanzierte Features übrig. Die Gruppe verteilte deren Münzen so, dass ganze Features gekauft werden konnten. Alle Münzen waren ausgegeben, zehn Features für den ersten Sprint standen damit fest.</p>
<p>Ich fragte noch nach der Priorität dieser Features untereinander, da das Spiel ja nur eine reine Ja/Nein-Aussage liefert. Diese Reihenfolge ergab sich sehr schnell aus den Feature-Abhängigkeiten und aus der Frage: &#8220;Wenn die Entwickler in Stress kommen sollten, welches Feature darf dann am ehesten aus dem Sprint fallen?&#8221;. Wir sortierten die Karten nach dieser Reihenfolge, das Ergebnis sah aus wie auf dem <strong>Foto links</strong>.</p>
<h3>Feedback vor und nach dem Spiel</h3>
<p>Für die Gruppe der Stakeholder war es neu, Entscheidungen in wichtigen Dingen mittels spielerischer Verfahren zu finden. Zwei meldeten vor Beginn des Spiels Bedenken an: &#8220;Sonst haben wir solche Entscheidungen immer durch Diskussion gefunden. Ich glaube nicht, dass wir so ein Spiel brauchen.&#8221; Der Product Owner schlug vor, es erst einmal zu versuchen und falls es sich nicht bewährt, es wieder bleiben zu lassen. Ich erklärte, dass Diskussionen explizit erwünscht seien und niemand sofort kaufen müsse.</p>
<p>Nach dem Spiel fragte ich die Beteiligten nach ihrem Feedback. Es war einhellig positiv:</p>
<ul>
<li>&#8220;Die Visualisierung der Entscheidungen ist sehr gut.&#8221;</li>
<li>&#8220;Man kommt sehr schnell zu einer Einigung.&#8221;</li>
<li>&#8220;Es lockert diese Meetings auf und macht Spaß.&#8221;</li>
</ul>
<p>Tja, da bleibt mir nur ein &#8220;Danke&#8221; an die <a title="Luke Hohmann" href="http://innovationgames.com/about/The+Book" target="_blank">Erfinder dieses Spiels</a>. Ich kann es wirklich empfehlen!</p>
<p><br class="final-break" style="clear: both;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/15/features-priorisieren-in-der-gruppe-oop-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wann sollte man nicht agil arbeiten? [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2010/01/09/wann-sollte-man-nicht-agil-arbeiten-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/09/wann-sollte-man-nicht-agil-arbeiten-oop-2010/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 15:09:21 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=842</guid>
		<description><![CDATA[Gestern war ich in einem Gebäude mit Erdgeschoss und 8 anderen Stockwerken. Der Aufzug brachte mich in den 7. Stock, dann konnte ich mir aussuchen, auf einer Treppe oder mit einem anderen(!) Aufzug in den 8. Stock zu kommen, wo ich den Besprechungsraum, mein eigentliches Ziel, finden würde.
Einer der Teilnehmer am Workshop in diesem Raum [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern war ich in einem Gebäude mit Erdgeschoss und 8 anderen Stockwerken. Der Aufzug brachte mich in den 7. Stock, dann konnte ich mir aussuchen, auf einer Treppe oder mit einem anderen(!) Aufzug in den 8. Stock zu kommen, wo ich den Besprechungsraum, mein eigentliches Ziel, finden würde.</p>
<p>Einer der Teilnehmer am Workshop in diesem Raum sagte: &#8220;Vielleicht ist das Gebäude agil entwickelt worden, die Anforderung für den 8. Stock kam erst später. Oder vielleicht wurden die Tests eingespart?&#8221;</p>
<p>Allgemeines Gelächter in der Gruppe.</p>
<p>Das bringt mich auf die Frage: Wann ist es eigentlich sinnvoll, agil zu entwickeln und bei unvollständigen Informationen trotzdem weiterzumachen? Eigentlich ganz einfach: <strong>Agil zu entwickeln ist angebracht, wenn die Kosten für nachträgliche Änderungen geringer sind als die Verschwendung (waste, muda), die durch das Streben nach initialer Perfektion der Anforderungen ausgelöst werden würde.</strong></p>
<p>Wann gilt diese Bedingung? Wahrscheinlich für fast alle &#8220;normalen&#8221; Softwareprojekte &#8211; für nur ganz wenige gilt sie nicht. In diesen Fällen sollte man dann besser nicht agil entwickeln.</p>
<p>Was meinen Sie &#8211; wann sollte man besser zuerst perfekt planen, dann umsetzen?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/09/wann-sollte-man-nicht-agil-arbeiten-oop-2010/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Prozess-Schutzmechanismen und Skipisten</title>
		<link>http://www.mbohlen.de/blog/2010/01/09/prozess-schutzmechanismen-und-skipisten/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/09/prozess-schutzmechanismen-und-skipisten/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 10:51:20 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Produktivität]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=840</guid>
		<description><![CDATA[Karl Scotland hat einen sehr interessanten Blog-Post über Sicherheitsmechanismen in Prozessen geschrieben. Seine wesentliche These: Prozesse hängen stark vom Können der Ausführenden ab &#8211; so wie es unterschiedlich schwierige Skipisten (schwarze, blaue, &#8230;) gibt, so gibt es unterschiedlich stark geschützte Prozesse. Je stärker die im Prozess eingebauen Schutzmechanismen, desto geringer sind unter Umständen Produktivität und [...]]]></description>
			<content:encoded><![CDATA[<p>Karl Scotland hat einen <a href="http://availagility.co.uk/2010/01/08/process-safeguards-and-ski-slopes/">sehr interessanten Blog-Post </a>über Sicherheitsmechanismen in Prozessen geschrieben. Seine wesentliche These: Prozesse hängen stark vom Können der Ausführenden ab &#8211; so wie es unterschiedlich schwierige Skipisten (schwarze, blaue, &#8230;) gibt, so gibt es unterschiedlich stark geschützte Prozesse. Je stärker die im Prozess eingebauen Schutzmechanismen, desto geringer sind unter Umständen Produktivität und die Reaktionsbereitschaft (Agilität). Mehr Risiko ermöglicht höhere Belohnung, bei entsprechendem Können der Skifahrer.</p>
<p>Lesenswert!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/09/prozess-schutzmechanismen-und-skipisten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Führung, Motivation, Produktivität [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2010/01/02/fuhrung-motivation-produktivitat-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2010/01/02/fuhrung-motivation-produktivitat-oop-2010/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 15:14:39 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Produktivität]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=834</guid>
		<description><![CDATA[Thesen zum Einstieg
These 1: Menschen leisten am meisten, wenn sie motiviert sind. Zumindest, wenn das Rennen über eine längere Strecke gehen wird. Kurze Strecken hoher Leistung sind auch rein aus Anstrengung machbar, bei längeren Strecken kommt die Energie am besten aus der Begeisterung. Softwareentwicklung gehört zu den längeren Rennen.
These 2: Softwareentwicklung ist ein Spezialfall von [...]]]></description>
			<content:encoded><![CDATA[<h3>Thesen zum Einstieg</h3>
<p>These 1: <strong>Menschen leisten am meisten, wenn sie motiviert sind.</strong> Zumindest, wenn das Rennen über eine längere Strecke gehen wird. Kurze Strecken hoher Leistung sind auch rein aus Anstrengung machbar, bei längeren Strecken kommt die Energie am besten aus der Begeisterung. Softwareentwicklung gehört zu den längeren Rennen.</p>
<p>These 2: <strong>Softwareentwicklung ist ein Spezialfall von Arbeit mit Wissen</strong>, und zwar mit einem Wissen, das nicht von Anfang an komplett vorhanden ist, sondern eines, das wie ein stetiger Strom während der gesamten Projektlaufzeit ins Team fließt.</p>
<p>These 3: <strong>Wissensarbeit ist wie ein kooperatives Spiel</strong> &#8211; es gibt dabei keinen, der vernünftigerweise allein bestimmen könnte, was als Nächstes der beste Spielzug ist. Das gilt insbesondere sogar für den Projektleiter &#8211; er muss die Entscheidung über den besten nächsten Zug seinen Mitarbeitern überlassen.</p>
<h3>Formen der Führung</h3>
<p>Je nach der Komplexität der Arbeit, die die Teams leisten, muss der Führungsstil angepasst werden, damit die Sache ein Erfolg wird. Sehr einfache Arbeit kann man mittels <strong>Kommando und Kontrolle</strong> managen. Für etwas komplexere Aufgaben sind <strong>Zielvorgaben und Belohnung</strong> bei Zielerreichung das Richtige. Noch komplexere managt man durch <strong>charismatische Führung</strong>. Für höchst komplexe Tätigkeiten wie die Softwareentwicklung erreicht man die besten Ergebnisse, wenn man <strong>Selbstorganisation</strong> zum Prinzip macht. Niemand anderes als das Team weiß am besten, was in der aktuellen Situation zu tun ist. Als Manager nutzt man dieses Wissen und stellt dem Team lediglich eine Dienstleistung namens Führung zur Verfügung.</p>
<p>Robert K. Greenleaf hat vor einigen Jahrzehnten schon Essays dazu verfasst, das gemeinsame Thema hieß <em>Servant Leadership</em>, im Prinzip &#8220;Führung als Dienstleistung&#8221;. James A. Autry hat Greenleafs Erkenntnisse weiter konkretisiert, in seinem Buch von 2001: <em>The Servant Leader: How to Build a Creative Team, Develop Great Morale, and Improve Bottom-Line Performance</em>. Darin finden sich einige interessante Kernaussagen:</p>
<ol>
<li>Bei Führung geht es nicht um das Steuern von Leuten; es geht darum, für Leute zu sorgen und eine nützliche Ressource für die Leute zu sein.</li>
<li>Führung bedeutet nicht, der Boss zu sein; es geht darum, für Leute präsent zu sein und eine Gemeinschaft am Arbeitsplatz aufzubauen.</li>
<li>Bei Führung geht es nicht um die Verteidigung von Territorium; es geht darum, Ihr Ego loszulassen, Ihren Geist mit zur Arbeit zu bringen und Ihr bestes und möglichst authentisches Selbst zu sein.</li>
<li>Führung befasst sich nicht so sehr damit, Anfeuerungsreden zu halten, sondern damit, wie man einen Platz schafft, an dem Leute gute Arbeit machen können, darin einen Sinn finden und ihren Geist zur Arbeit mitbringen.</li>
<li>Führung ist, wie das Leben, größtenteils eine Frage der Aufmerksamkeit.</li>
<li>Führung erfordert Liebe.</li>
</ol>
<h3>Motivation und Produktivität</h3>
<p>Wenn ich die obigen Kernaussagen von Autry lese, denke ich &#8220;Wow, so möchte ich als Teammitglied geführt werden!&#8221; Ein Manager ist in der Lage, eine Umgebung für Motivation und gute Arbeit zu schaffen, wenn er diese Sätze tief verinnerlicht und danach handelt. Nebenbei: Dann wird ihm sein Job auch richtig Spaß machen, weil er mit dem, was sein Team braucht, in Resonanz kommt.</p>
<p>Produktivität stellt sich dann durch Selbstorganisation des Teams ein, bei der der Manager lediglich Unterstützung leistet. Soziale Systeme entwickeln Verhalten, sie organisieren sich selbt aufgrund von Regeln, Feedback und Diskurs. Es beginnt mit einfachen Regeln, z.B. &#8220;Wir wollen nur Code einchecken, der den Build übersteht und fehlerfrei durch alle Unit-Tests geht.&#8221; Wenn jemand eine solche, gemeinsam anerkannte Regel verletzt, indem er schlechten Code eincheckt, bekommt er von den Teamkollegen (und vom CI-Server) Feedback. Er wird sich vermutlich wundern, mit seinen Kollegen ins Gespräch kommen. Zuletzt wird er die Ursache herausfinden und beheben, indem er vor dem Einchecken zunächst seine Arbeitsumgebung aktualisiert, alle Unit-Tests laufenlässt und Fehler lokal behebt, bevor er nochmals eincheckt. Das ist eine Verhaltensveränderung, Selbstorganisation durch Feedback und Diskurs. Die Produktivität des Teams wird ansteigen, weil wieder einer weniger &#8220;im Weg steht&#8221;.</p>
<h3>Der Manager als Mentor</h3>
<p>Als Manager oder Coach kann ich diesen Prozess der Selbstorganisation fördern, indem ich genug Quellen für Feedback schaffe, Menschen ermutige, Feedback zu geben und in den Diskurs zu gehen. Ich kann das Team fragen, welche anerkannten Regeln für das gemeinsame Handeln gelten müssen und die Verabschiedung dieser Regeln fördern. Ich kann Regeln auch hinterfragen (lassen), wenn mehrfach gegen sie verstoßen wird oder wenn das Team so reif wird, dass sie weniger Regeln brauchen.</p>
<p>Das alles ist, wie das Leben, größtenteils eine Frage der Aufmerksamkeit. <img src='http://www.mbohlen.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2010/01/02/fuhrung-motivation-produktivitat-oop-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schlanke Zeiten [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2009/12/29/schlanke-zeiten-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2009/12/29/schlanke-zeiten-oop-2010/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 13:54:59 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=748</guid>
		<description><![CDATA[Ein paar Gedanken zum Zeitbegriff in agilen Verfahren.
In allen agilen Methoden versucht das Entwicklungsteam, dem Kunden ein gewünschtes Feature möglichst schnell zur Verfügung zu stellen. Das ist ein wichtiger Bestandteil des Entwicklungsprozesses: zeitnahe Lieferung löst zeitnahes Feedback aus und hilft, das Projekt auf der Spur zu halten.
Die agilen Methoden können dabei von den jahrzehntelangen Erfahrungen [...]]]></description>
			<content:encoded><![CDATA[<p><em>Ein paar Gedanken zum Zeitbegriff in agilen Verfahren.</em></p>
<p>In allen agilen Methoden versucht das Entwicklungsteam, dem Kunden ein gewünschtes Feature möglichst schnell zur Verfügung zu stellen. Das ist ein wichtiger Bestandteil des Entwicklungsprozesses: zeitnahe Lieferung löst zeitnahes Feedback aus und hilft, das Projekt auf der Spur zu halten.</p>
<p>Die agilen Methoden können dabei von den jahrzehntelangen Erfahrungen aus der Lean Production profitieren. Kanban tut das explizit, XP und Scrum tun das implizit. Die Frage ist nur : Was heißt eigentlich &#8220;schnell&#8221; oder &#8220;zeitnah&#8221;? Über welche Zeit reden wir da eigentlich?</p>
<h3>Lead time</h3>
<p>Die für den Kunden interessante Zeit ist eigentlich diese: &#8220;Wenn ich heute ein Feature in die Entwicklung gebe, wann kann ich es in der lauffähigen Software erkennen und testen?&#8221;. Diese Zeit nennt man in der Lean-Welt <strong>lead time</strong>. Ihre Einheit ist tatsächliche, abgelaufene Zeit (elapsed time). Sie enthält sowohl die Zeit für den Fertigungs-Workflow (also Analyse, Design, Unit-Test, Implementierung, Integration, etc.) als auch eventuelle Wartezeiten vor der Fertigung, weil das Team gerade noch andere Features zu entwickeln hatte.</p>
<h3>Cycle time</h3>
<p>Eine andere Zeit, die weniger für den Kunden und mehr für die Entwickler und deren Manager interessant ist, nennt man in der Lean-Welt <strong>cycle time</strong>. Ihre Einheit ist nicht tatsächlich abgelaufene Zeit (elapsed time), sondern der Rhythmus (engl. <em>cadence</em>), wie oft der Entwicklungsprozess ein Feature fertigstellt. Um den Unterschied zu verstehen, ein <strong>Beispiel</strong>: Ein GUI-Designer wird beauftragt, eine größere Anzahl bereits fertig entwickelter HTML-Seiten (z.B. 100 Stück) graphisch schön aufzubereiten. Sagen wir, er liefert jede Woche (5 Arbeitstage) 20 Stück, dann beträgt die cycle time pro HTML-Seite 2 Stunden (5 Tage mal 8 Stunden = 40 Stunden, dividiert durch 20 Stück, also 2 Stunden pro Stück).</p>
<h3>Littles Gesetz und Work in Process</h3>
<p>Wie stehen nun diese beiden Zeiten in Beziehung? Das fand <strong>John D.C. Little</strong> schon 1961 heraus. Damals formulierte er es so: In einem stabilen Wartesystem (Beispiel: Supermarkt) ist die durchschnittliche Anzahl von Kunden gleich dem Produkt aus Ankunftsrate und der durchschnittlichen Verweildauer im System.</p>
<p>Was heißt das, übertragen auf <em>lead time</em> und <em>cycle time</em>? Nun, die Ankunftsrate ist der Kehrwert der cycle time, die Verweildauer ist gleich der lead time und die durchschnittliche Kundenanzahl entspricht der Anzahl der Features, an denen das Team im Durchschnitt gleichzeitig arbeitet. In der Lean-Welt nennt man das <strong>work in process</strong>.</p>
<p>Also können wir Littles Gesetz so umstellen: <strong>lead time = work in process * cycle time</strong>.</p>
<p>Wenn der oben erwähnte GUI-Designer zu viele Aufträge hat, weil er für zu viele Kunden gleichzeitig arbeitet, ist seine <em>work in process</em> sehr hoch, z.B. befinden sich 100 HTML-Seiten bei ihm in Arbeit. Wenn ein Kunde nun eine neue Seite zum &#8220;Schönmachen&#8221; beauftragt, bekommt er sie erst nach einer <em>lead time</em> von durchschnittlich 5 Wochen zurück (100 Seiten x 2 Stunden/Seite, geteilt durch 40 Stunden pro Woche). Der Kunde wird unzufrieden sein, und der GUI-Designer sollte sich überlegen, ob er nicht mehr Aufträge ablehnen oder seinen Kollegen weitergeben sollte.</p>
<h3>Handlungempfehlung</h3>
<p>Was lernen wir daraus, wenn wir zu einem Software-Entwicklungsteam gehören oder ein solches managen? Um den Kunden zufrieden zu machen, sollte das Team die <em>lead time</em> optimieren. Das Einfachste ist, die <em>work in process</em> zu reduzieren, also einfach nicht an so vielen Sachen gleichzeitig zu arbeiten. Das Schwierigere ist, die <em>cycle time</em> zu reduzieren, also effizienter zu arbeiten. Dazu braucht es Methode. Wenn Sie Lust haben, zeige ich Ihnen , wie auch das geht. Rufen Sie mich an.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/12/29/schlanke-zeiten-oop-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kanban-Training im Februar 2010</title>
		<link>http://www.mbohlen.de/blog/2009/12/21/kanban-training-im-februar-2010/</link>
		<comments>http://www.mbohlen.de/blog/2009/12/21/kanban-training-im-februar-2010/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 23:12:22 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Aktuelle Aktivitäten]]></category>
		<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=648</guid>
		<description><![CDATA[Im Februar gebe ich ein zweitägiges Kanban-Training in deutscher Sprache. Kanban ist ein leichtgewichtiges Prozess-Framework für die Entwicklung von Software. Es überträgt die Kanban-Prinzipien, die ursprünglich im Umfeld von Lean Production entstanden sind, auf die Softwareentwicklung.
Anmeldung und Organisation übernimmt SIGS-DATACOM, auf deren Website Sie weitere Informationen über dieses Training finden können.
Ich freue mich, Sie in [...]]]></description>
			<content:encoded><![CDATA[<p>Im Februar gebe ich ein zweitägiges Kanban-Training in deutscher Sprache. <a href="http://de.wikipedia.org/wiki/Kanban_in_der_IT">Kanban</a> ist ein leichtgewichtiges Prozess-Framework für die Entwicklung von Software. Es überträgt die Kanban-Prinzipien, die <a href="http://de.wikipedia.org/wiki/Kanban">ursprünglich im Umfeld von Lean Production</a> entstanden sind, auf die Softwareentwicklung.</p>
<p>Anmeldung und Organisation übernimmt SIGS-DATACOM, auf deren Website Sie <a href="http://www.sigs-datacom.de/nc/seminare/seminardetails.html?tx_mwworkshops_pi1%5BshowUid%5D=1442&amp;tx_mwworkshops_pi1%5BdateID%5D=394">weitere Informationen</a> über dieses Training finden können.</p>
<p>Ich freue mich, Sie in Köln zu sehen &#8211; das Training wird sehr spannend werden!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/12/21/kanban-training-im-februar-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This blog is now iPhone-ready!</title>
		<link>http://www.mbohlen.de/blog/2009/12/20/this-blog-is-now-iphone-ready/</link>
		<comments>http://www.mbohlen.de/blog/2009/12/20/this-blog-is-now-iphone-ready/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 15:03:15 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Aktuelle Aktivitäten]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=646</guid>
		<description><![CDATA[Today, I upgraded to Wordpress 2.9 and the WPtouch plugin. Now, the users of Apple&#8217;s iPhone and other mobile clients can browse this blog more easily. Have fun!
]]></description>
			<content:encoded><![CDATA[<p>Today, I upgraded to Wordpress 2.9 and the <a href="http://www.bravenewcode.com/wptouch/">WPtouch</a> plugin. Now, the users of Apple&#8217;s iPhone and other mobile clients can browse this blog more easily. Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/12/20/this-blog-is-now-iphone-ready/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Welcome back, Uncle Bob!  [OOP 2010]</title>
		<link>http://www.mbohlen.de/blog/2009/11/09/welcome-back-uncle-bob-oop-2010/</link>
		<comments>http://www.mbohlen.de/blog/2009/11/09/welcome-back-uncle-bob-oop-2010/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 20:32:21 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Aktuelle Aktivitäten]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=639</guid>
		<description><![CDATA[At the OOP 2010 conference, Robert C. Martin will give a keynote about polyglot programming, called &#8220;The Polyglot Craftsman&#8221;.
Hey, Uncle Bob is back at OOP,! For me this is very special because it was him who brought me to object oriented design/programming and to my first OOP conference, ever. And this was back in 1992 [...]]]></description>
			<content:encoded><![CDATA[<p>At the <a href="http://www.oopconference.com">OOP 2010</a> conference, <a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin">Robert C. Martin</a> will give a keynote about polyglot programming, called &#8220;The Polyglot Craftsman&#8221;.</p>
<p>Hey, Uncle Bob is back at OOP,! For me this is very special because it was him who brought me to object oriented design/programming and to my first OOP conference, ever. And this was back in 1992 when I was a enthusiastic software developer, coding in C. Java did not exist in those days, design patterns were not published, there was no TDD &#8211; well, it was just the old days of poorly maintainable code!</p>
<p>Bob, when I came into your workshop about object oriented design at OOP, you started with a very simple example in C++ (at least, I thought it was): a car with an engine. You said something like this:</p>
<p>Bob: &#8220;OK, guys, lets define an accelerate() method on the car &#8211; what would be inside the body of this method?&#8221;. And my head started thinking. Somebody else: &#8220;The car should tell the carburator to increase the fuel to air ratio. And it should also tell the automatic transmission to shift one gear up!&#8221;</p>
<p>Bob: &#8220;OK, so Car::accelerate() calls Carburator::increaseFuelToAirRatio(), followed by Transmission::shiftUp(). Question to all of you: Is this a good design or a bad design?&#8221;</p>
<p>And poor me, inexperienced in OOD, could say neither yes nor no: &#8220;In fact, I don&#8217;t know!&#8221;.</p>
<p>Bob, you suddenly shouted &#8220;Of course, it is a BAD design, very bad design!&#8221;</p>
<p>Me: &#8220;Oh, why this?&#8221;</p>
<p>Bob: &#8220;What if you have a Diesel engine, without carburator? And: What if your car has an electric engine, without transmission?&#8221;</p>
<p>Me: &#8220;Hmmm&#8230; well, I guess, I would have to change the design significantly. Something like Thyristor::increaseElectricCurrent().&#8221;</p>
<p>Bob: &#8220;Exactly! So, how about introducing a neutral abstraction above all this? How about Engine::increasePower()? And with an intelligent Engine class that knows how to increase the power purely by itself? With nobody telling it how to do that?&#8221;</p>
<p>Me: &#8220;Aha!&#8221;</p>
<p>And so 1992 was the year when I became enthusiastic about object oriented design. Thanks a lot, Bob &#8211; I am really looking forward to see you again at this OOP. I guess, you won&#8217;t remember me but this is not a problem. <img src='http://www.mbohlen.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/11/09/welcome-back-uncle-bob-oop-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Grails support for the Semantic Web</title>
		<link>http://www.mbohlen.de/blog/2009/10/04/grails-support-for-the-semantic-web/</link>
		<comments>http://www.mbohlen.de/blog/2009/10/04/grails-support-for-the-semantic-web/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 20:01:36 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=637</guid>
		<description><![CDATA[The Semantic Web is gaining attention these days. No wonder that the Grails web framework will offer support for the resource description format RDF, or RDFa to be more precise. A new plugin can generate this format for you. A quote from the developers:
The RDFa plug-in allows you to expose relevant parts of the structure [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://semanticweb.org">Semantic Web</a> is gaining attention these days. No wonder that the Grails web framework will offer support for the resource description format <a href="http://www.w3.org/RDF/">RDF</a>, or <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a> to be more precise. A new plugin can generate this format for you. A quote from the developers:</p>
<blockquote><p>The RDFa plug-in allows you to expose relevant parts of the structure of your application as <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a> annotations in your views. Both domain model (non-information resources) and controller actions (information resources) can be described.</p></blockquote>
<p>The plugin is still in its early stages, check out its interesting features which are described on <a href="http://grails.org/plugin/rdfa">the plugin page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/10/04/grails-support-for-the-semantic-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum-Jobs wachsen stark</title>
		<link>http://www.mbohlen.de/blog/2009/09/26/scrum-jobs-wachsen-stark/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/26/scrum-jobs-wachsen-stark/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 10:45:14 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Agile Entwicklung]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=633</guid>
		<description><![CDATA[Job-Portale verfolgen Job Trends, also den Anstieg der Anfragen in bestimmten Aufgabengebieten, z.B. Projektmanagement mit Scrum, Agile und PMI. In den letzten drei Jahren zeigt sich ein eindeutiger Trend zu Scrum und anderen Agilen Methoden.
Ein Beispiel des Portals Indeed.com:
 




SCRUM and project management, AGILE and project management, PMI and project management Job Trends
SCRUM and project [...]]]></description>
			<content:encoded><![CDATA[<p>Job-Portale verfolgen Job Trends, also den Anstieg der Anfragen in bestimmten Aufgabengebieten, z.B. Projektmanagement mit Scrum, Agile und PMI. In den letzten drei Jahren zeigt sich ein eindeutiger Trend zu Scrum und anderen Agilen Methoden.</p>
<p>Ein Beispiel des Portals Indeed.com:</p>
<div style="width: 540px;"><a title="SCRUM and project management, AGILE and project management, PMI and project management Job Trends" href="http://www.indeed.com/jobtrends?q=SCRUM+and+project+management%2C+AGILE+and+project+management%2C+PMI+and+project+management"> <img src="http://www.indeed.com/trendgraph/jobgraph.png?q=SCRUM+and+project+management%2C+AGILE+and+project+management%2C+PMI+and+project+management" border="0" alt="SCRUM and project management, AGILE and project management, PMI and project management Job Trends graph" width="540" height="300" /><br />
</a></p>
<table style="font-size:80%" border="0" cellspacing="0" cellpadding="6" width="100%">
<tbody>
<tr>
<td><a href="http://www.indeed.com/jobtrends?q=SCRUM+and+project+management%2C+AGILE+and+project+management%2C+PMI+and+project+management">SCRUM and project management, AGILE and project management, PMI and project management Job Trends</a></td>
<td align="right"><a href="http://www.indeed.com/q-SCRUM-and-project-management-jobs.html">SCRUM and project management jobs</a> &#8211; <a href="http://www.indeed.com/q-AGILE-and-project-management-jobs.html">AGILE and project management jobs</a> &#8211; <a href="http://www.indeed.com/q-PMI-and-project-management-jobs.html">PMI and project management jobs</a></td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/26/scrum-jobs-wachsen-stark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taxonomies for Grails domain classes</title>
		<link>http://www.mbohlen.de/blog/2009/09/25/taxonomies-for-grails-domain-classes/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/25/taxonomies-for-grails-domain-classes/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 19:08:32 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=628</guid>
		<description><![CDATA[Did you ever want to put the instances of your domain classes into user-defined categories? Something like tags but more structured and maybe hierarchical?
Good news today: Grails has a plug-in for this purpose &#8211; it is called the taxonomy plug-in. The developers of this plug-in say that it allows you to apply arbitrary hierarchical categorisation (Taxons) [...]]]></description>
			<content:encoded><![CDATA[<p>Did you ever want to put the instances of your domain classes into user-defined categories? Something like tags but more structured and maybe hierarchical?</p>
<p>Good news today: Grails has a plug-in for this purpose &#8211; it is called <a href="http://grails.org/plugin/taxonomy">the taxonomy plug-in</a>. The developers of this plug-in say that it allows you to apply arbitrary hierarchical categorisation (Taxons) to domain objects. Here is an example of the basic usage:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">def</span> book <span style="color: #66cc66;">=</span> <span style="color: #aaaadd; font-weight: bold;">Book</span>.<span style="color: #663399;">get</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">// Add the book to the Non-fiction &gt; Autobiography category</span>
book.<span style="color: #006600;">addToTaxonomy</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'Non-fiction'</span>, <span style="color: #ff0000;">'Autobiography'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">def</span> autobiographies <span style="color: #66cc66;">=</span> <span style="color: #aaaadd; font-weight: bold;">Book</span>.<span style="color: #006600;">findAllByTaxonomyFamily</span><span style="color: #66cc66;">&#40;</span>
    <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'Non-fiction'</span>, <span style="color: #ff0000;">'Autobiography'</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>There is support for arbitrary nesting of Taxons (categories) within unlimited taxonomies, and taxonomies are domain class independent.</p>
<p>So the category &#8220;Local&#8221; on Author can also be used on Book.</p>
<p>However, you can have different taxonomy graphs aside from the default one, so you might have a taxonomy graph &#8220;Location&#8221; storing the names of states and cities, and another taxonomy graph &#8220;Company type&#8221; &#8211; and objects having categories in both graphs.</p>
<p>Release 0.1 of the taxonomy plug-in is &#8220;alpha&#8221; grade. It does not support polymorphism. So querying objects by taxonomy requires you to query the specific class type. This will be resolved in the next release. Also, it does not do caching so it isn&#8217;t going to be blazingly fast. Developers say that this will come soon.</p>
<p>Have fun and visit <a href="http://grails.org/plugin/taxonomy">the plug-in page on grails.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/25/taxonomies-for-grails-domain-classes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test data for Grails integration tests</title>
		<link>http://www.mbohlen.de/blog/2009/09/22/test-data-for-grails-integration-tests/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/22/test-data-for-grails-integration-tests/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 16:25:42 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=621</guid>
		<description><![CDATA[When you write an integration test for a Grails app, you will likely want to have a clean situation with reproducible test data in your database before the test actually starts. Enter the Fixtures Plugin for Grails.
This plugin helps you to define a fixture, that is a defined set of data used for testing. The [...]]]></description>
			<content:encoded><![CDATA[<p>When you write an integration test for a Grails app, you will likely want to have a clean situation with reproducible test data in your database before the test actually starts. Enter the <a href="http://grails.org/plugin/fixtures">Fixtures Plugin</a> for Grails.</p>
<p>This plugin helps you to define a fixture, that is a defined set of data used for testing. The plugin defines a DSL in which you can express your need for data. Example:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">fixture <span style="color: #66cc66;">&#123;</span>
    guillaume<span style="color: #66cc66;">&#40;</span>Author<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        name <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Guillaume Laforge&quot;</span>
    <span style="color: #66cc66;">&#125;</span>
    dierk<span style="color: #66cc66;">&#40;</span>Author<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        name <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Dierk Koenig&quot;</span>
    <span style="color: #66cc66;">&#125;</span>
    gina<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">Book</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        title <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Groovy In Action&quot;</span>
        authors <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>guillaume, dierk<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Or a little shorter:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">fixture <span style="color: #66cc66;">&#123;</span>
    guillaume<span style="color: #66cc66;">&#40;</span>Author, name: <span style="color: #ff0000;">&quot;Guillaume Laforge&quot;</span><span style="color: #66cc66;">&#41;</span>
    dierk<span style="color: #66cc66;">&#40;</span>Author, name: <span style="color: #ff0000;">&quot;Dierk Koenig&quot;</span><span style="color: #66cc66;">&#41;</span>
    gina<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">Book</span>, title: <span style="color: #ff0000;">&quot;Groovy In Action&quot;</span>, authors: <span style="color: #66cc66;">&#91;</span>guillaume, dierk<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Then, in your test case, you will want to load that fixture, like this:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> GinaTests <span style="color: #000000; font-weight: bold;">extends</span> GroovyTestCase <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> fixtureLoader
&nbsp;
    <span style="color: #993333;">void</span> testFinderMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        fixtureLoader.<span style="color: #006600;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;gina&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">def</span> gina <span style="color: #66cc66;">=</span> <span style="color: #aaaadd; font-weight: bold;">Book</span>.<span style="color: #006600;">findByTitle</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Groovy In Action&quot;</span><span style="color: #66cc66;">&#41;</span>
        assertNotNull<span style="color: #66cc66;">&#40;</span>gina<span style="color: #66cc66;">&#41;</span>
        assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>, gina.<span style="color: #006600;">authors</span>.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Pretty simple, isn&#8217;t it? Find out more about how to install and use the Fixtures plugin on<a href="http://grails.org/plugin/fixtures"> its plugin page at grails.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/22/test-data-for-grails-integration-tests/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Monsters in Grails?</title>
		<link>http://www.mbohlen.de/blog/2009/09/19/monsters-in-grails/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/19/monsters-in-grails/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 09:19:12 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=614</guid>
		<description><![CDATA[The monsters enter the Grails web framework! Jonas Nordstrand has written a plugin that opens the door to them. This is what he says about it:
A grails implementation of MonsterID: a method to generate a unique monster image based upon a certain identifier (user id, email address, whatever). It can be used to automatically provide [...]]]></description>
			<content:encoded><![CDATA[<p>The monsters enter the Grails web framework! Jonas Nordstrand has written a plugin that opens the door to them. This is what he says about it:</p>
<blockquote><p>A grails implementation of MonsterID: a method to generate a unique monster image based upon a certain identifier (user id, email address, whatever). It can be used to automatically provide personal avatar images in blog comments or other community services.</p></blockquote>
<p>You can find this plugin (as usual) <a href="http://grails.org/plugin/monster">on grails.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/19/monsters-in-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Fields for Grails renders form fields easily</title>
		<link>http://www.mbohlen.de/blog/2009/09/18/608/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/18/608/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 13:14:30 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=608</guid>
		<description><![CDATA[Bean Fields, a new plugin for Grails, provides a suite of tags for rendering form fields for domain and command objects. As the developers claim, it takes the pain, boredom and scope for error away.
Out of the box it:

renders a field using a UI element appropriate for the property type. Constraints are used to set [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://grails.org/plugin/bean-fields">Bean Fields</a>, a new plugin for Grails, provides a suite of tags for rendering form fields for domain and command objects. As the developers claim, it takes the pain, boredom and scope for error away.</p>
<p>Out of the box it:</p>
<ul>
<li>renders a field using a UI element appropriate for the property type. Constraints are used to set maximum lengths etc.</li>
<li>automatically renders <label> tags for fields, from i18n message bundles</label></li>
<li>renders &#8220;required&#8221; indicators if the field is nullable:false and/or blank:false</li>
<li>renders errors adjacent to the field that had the error</li>
<li>renders the current value as appropriate</li>
</ul>
<p><label> This is all done by building on top of Grails existing tags, so all the regular tag attributes are supported where possible.<br />
</label></p>
<p>Here&#8217;s an example of how you can render all this for a bunch of bean properties:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean:withBean</span> <span style="color: #000066;">beanName</span>=<span style="color: #ff0000;">&quot;form&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean:field</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;firstName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean:field</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;lastName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean:field</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;company&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean:field</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;email&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean:withBean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>You can find more elaborate examples as well as instructions for use on <a href="http://grails.org/plugin/bean-fields">the plugin page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/18/608/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paypal plugin 0.5 for Grails released today</title>
		<link>http://www.mbohlen.de/blog/2009/09/13/paypal-plugin-0-5-for-grails-released-today/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/13/paypal-plugin-0-5-for-grails-released-today/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 20:32:53 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=604</guid>
		<description><![CDATA[David Russell notified me about a bug in the Paypal plugin. Thank you, David!
Bug description: When a user makes a payment, Paypal notifies the site with a so-called instant payment notification. The code in PaypalController.notify() was wrong so that an error code 404 was returned to Paypal. Paypal retried the notification several times and finally [...]]]></description>
			<content:encoded><![CDATA[<p>David Russell notified me about a bug in the Paypal plugin. Thank you, David!</p>
<p><strong>Bug description: </strong>When a user makes a payment, Paypal notifies the site with a so-called instant payment notification. The code in PaypalController.notify() was wrong so that an error code 404 was returned to Paypal. Paypal retried the notification several times and finally gave up. The plugin processed the notification properly, though.</p>
<p><strong>I fixed this bug today and released the corrected Paypal plugin as version 0.5.</strong></p>
<p>You can find more info about the plugin on <a href="http://www.grails.org/paypal+plugin">the plugin page at grails.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/13/paypal-plugin-0-5-for-grails-released-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understanding social media</title>
		<link>http://www.mbohlen.de/blog/2009/09/13/understanding-social-media/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/13/understanding-social-media/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 16:45:14 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Aktuelle Aktivitäten]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=602</guid>
		<description><![CDATA[At the moment, there is a lot of buzz around social media like Twitter. Keyword is &#8220;democratizing information&#8221;. Social media users are forming new communities with their own rules and &#8220;social speak&#8221;. There are even web sites like Klout that calculate how much influence you have in social media (when I test my Twitter user [...]]]></description>
			<content:encoded><![CDATA[<p>At the moment, there is a lot of buzz around social media like Twitter. Keyword is &#8220;democratizing information&#8221;. Social media users are forming new communities with their own rules and &#8220;social speak&#8221;. There are even web sites like <a href="http://www.klout.net/">Klout</a> that calculate how much influence you have in social media (when I test my Twitter user account, it says that it has not indexed my tweets, yet).</p>
<p>This is an interesting phenomenon that I am trying to study and understand. Maybe, it is possible to generate something entirely new.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/13/understanding-social-media/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scaffolding in Grails: More than a one-night stand?</title>
		<link>http://www.mbohlen.de/blog/2009/09/07/scaffolding-in-grails-more-than-a-one-night-stand/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/07/scaffolding-in-grails-more-than-a-one-night-stand/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 21:43:52 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=593</guid>
		<description><![CDATA[Scaffolding in Grails (from my point of view) is like scaffolding in construction: After the walls have been built, you remove the scaffold.
However, at least one plug-in developer for Grails seems to think differently. See for yourself:
This plugin provides an &#8216;automatic&#8217; component-like rendering infrastructure to Grails. It combines the ease of use of scaffolding with [...]]]></description>
			<content:encoded><![CDATA[<p>Scaffolding in Grails (from my point of view) is like scaffolding in construction: After the walls have been built, you remove the scaffold.</p>
<p>However, at least one plug-in developer for Grails seems to think differently. See for yourself:</p>
<blockquote><p>This plugin provides an &#8216;automatic&#8217; component-like rendering infrastructure to Grails. It combines the ease of use of scaffolding with the flexibility to change the resulting views via custom renderers. This also allows you to change what tags you use to render an object without having to worry about consistency across views. Write it once, and be done with it!</p></blockquote>
<p>What do you think &#8211; is <a href="http://grails.org/plugin/scaffold-tags">this plug-in</a> worth a try?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/07/scaffolding-in-grails-more-than-a-one-night-stand/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Camel plug-in for Grails</title>
		<link>http://www.mbohlen.de/blog/2009/09/07/apache-camel-plug-in-for-grails/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/07/apache-camel-plug-in-for-grails/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 21:36:34 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=590</guid>
		<description><![CDATA[The Apache Camel Grails plug-in allows you to send and route messages to a wide variety of destination endpoints directly from your controllers and services. It also provides a new Grails artifact, Routes, to configure your routes using known Enterprise Integration Patterns via the Apache Camel Java DSL.
It is quite easy to route messages. For example, write [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://camel.apache.org/">Apache Camel</a> Grails plug-in allows you to send and route messages to a wide variety of destination endpoints directly from your controllers and services. It also provides a new Grails artifact, Routes, to configure your routes using known Enterprise Integration Patterns via the <a href="http://camel.apache.org/dsl.html">Apache Camel Java DSL</a>.</p>
<p>It is quite easy to route messages. For example, write a Grails service like this:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MyService <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> myMethod<span style="color: #66cc66;">&#40;</span>fooBarText<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        log.<span style="color: #006600;">info</span> “Got text: $<span style="color: #66cc66;">&#123;</span> fooBarText <span style="color: #66cc66;">&#125;</span>”
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Then, using Camel’s bean integration, you can deliver messages from an in-memory queue directly to that Grails service:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">from<span style="color: #66cc66;">&#40;</span>“seda:my.<span style="color: #006600;">queue</span>”<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">filter</span> <span style="color: #66cc66;">&#123;</span>
    it.<span style="color: #b1b100;">in</span>.<span style="color: #006600;">body</span>.<span style="color: #CC0099;">contains</span><span style="color: #66cc66;">&#40;</span>“FooBar”<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>.<span style="color: #006600;">to</span><span style="color: #66cc66;">&#40;</span>“bean:myService<span style="color: #66cc66;">?</span>methodName<span style="color: #66cc66;">=</span>myMethod”<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Cool, isn&#8217;t it? As usual, you can find more info on <a href="http://grails.org/plugin/camel">the plugin page on grails.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/07/apache-camel-plug-in-for-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acegi tutorial for Grails updated</title>
		<link>http://www.mbohlen.de/blog/2009/09/06/acegi-tutorial-for-grails/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/06/acegi-tutorial-for-grails/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 17:30:26 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=587</guid>
		<description><![CDATA[The tutorial that describes how to use the AcegiSecurity Plugin for Grails has been updated:
There are three ways to define security mappings &#8211; see Securing URLs for more details. This tutorial uses the Requestmap approach. To use Controller annotations, use this tutorial and to specify security mappings using the standard Spring Security approach use this [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://grails.org/AcegiSecurity+Plugin+-+Basic+Tutorial">tutorial that describes how to use the AcegiSecurity Plugin for Grails</a> has been updated:</p>
<blockquote><p>There are three ways to define security mappings &#8211; see <a href="http://www.grails.org/AcegiSecurity%20Plugin%20-%20Securing%20URLs">Securing URLs</a> for more details. This tutorial uses the Requestmap approach. To use Controller annotations, use <a href="x-msg://590/AcegiSecurity+Plugin+-+Basic+Tutorial+with+Annotations">this tutorial</a> and to specify security mappings using the standard Spring Security approach use <a href="x-msg://590/AcegiSecurity+Plugin+-+Basic+Tutorial+with+standard+string+mapping">this tutorial</a>.</p></blockquote>
<p>Good Luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/06/acegi-tutorial-for-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Viele externe Entwickler = schneller alternde Software?</title>
		<link>http://www.mbohlen.de/blog/2009/09/02/viele-externe-entwickler-schneller-alternde-software/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/02/viele-externe-entwickler-schneller-alternde-software/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 19:15:29 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Aktuelle Aktivitäten]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=580</guid>
		<description><![CDATA[Sowas passiert Ihnen in Ihrem Projekt hoffentlich nie:
Kunde: &#8220;Wir verstehen unser Framework nicht mehr. Es ist total verstrickt!&#8221;
Berater: &#8220;Aber Ihr habt doch gesagt, es sei erst zwei Jahre jung.&#8221;
Kunde: &#8220;Ja, und?&#8221;
Berater: &#8220;Sowas passiert doch sonst nur mit viel älterer Software!&#8221;
Kunde: &#8220;Nein, hier waren viele Externe vom Dienstleister XY dabei, da altert das Framework schneller!&#8221;
Berater: &#8220;Oh!???&#8221;
]]></description>
			<content:encoded><![CDATA[<p>Sowas passiert Ihnen in Ihrem Projekt hoffentlich nie:</p>
<p><strong>Kunde</strong>: &#8220;Wir verstehen unser Framework nicht mehr. Es ist total verstrickt!&#8221;</p>
<p><strong>Berater</strong>: &#8220;Aber Ihr habt doch gesagt, es sei erst zwei Jahre jung.&#8221;</p>
<p><strong>Kunde</strong>: &#8220;Ja, und?&#8221;</p>
<p><strong>Berater</strong>: &#8220;Sowas passiert doch sonst nur mit viel älterer Software!&#8221;</p>
<p><strong>Kunde</strong>: &#8220;Nein, hier waren viele Externe vom Dienstleister XY dabei, da altert das Framework schneller!&#8221;</p>
<p><strong>Berater</strong>: &#8220;Oh!???&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/02/viele-externe-entwickler-schneller-alternde-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Prettify&#8221; your Grails app</title>
		<link>http://www.mbohlen.de/blog/2009/09/02/prettify-your-grails-app/</link>
		<comments>http://www.mbohlen.de/blog/2009/09/02/prettify-your-grails-app/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 18:47:01 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=572</guid>
		<description><![CDATA[There are two nice small plug-ins for Grails that make your webapp a little prettier: Pretty Size and Pretty Time. The first one, Pretty Size, does this:

&#60;prettysize:display size=&#34;${someSize}&#34; /&#62;

generates outputs like:

&#34;one kilobyte&#34;, &#34;2 megabytes&#34;, or &#34;3 GB&#34;

The second one, Pretty Time, does this:

&#60;prettytime:display date=&#34;${someDate}&#34; /&#62;

generates timestamps like:

&#34;right now&#34;, &#34;2 days ago&#34;, or &#34;3 months from [...]]]></description>
			<content:encoded><![CDATA[<p>There are two nice small plug-ins for Grails that make your webapp a little prettier: <a href="http://grails.org/plugin/pretty-size">Pretty Size</a> and <a href="http://grails.org/plugin/pretty-time">Pretty Time</a>. The first one, Pretty Size, does this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;prettysize:display</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;${someSize}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>generates outputs like:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #ff0000;">&quot;one kilobyte&quot;</span>, <span style="color: #ff0000;">&quot;2 megabytes&quot;</span>, or <span style="color: #ff0000;">&quot;3 GB&quot;</span></pre></div></div>

<p>The second one, Pretty Time, does this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;prettytime:display</span> <span style="color: #000066;">date</span>=<span style="color: #ff0000;">&quot;${someDate}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>generates timestamps like:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #ff0000;">&quot;right now&quot;</span>, <span style="color: #ff0000;">&quot;2 days ago&quot;</span>, or <span style="color: #ff0000;">&quot;3 months from now&quot;</span></pre></div></div>

<p>For i18n, check the &#8220;message.properties&#8221; file from the plugin directory.</p>
<p>Thanks to the creative developers in the Grails community! Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/09/02/prettify-your-grails-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Null-Constraint bei MySQL entfernen</title>
		<link>http://www.mbohlen.de/blog/2009/08/30/null-constraint-bei-mysql-entfernen/</link>
		<comments>http://www.mbohlen.de/blog/2009/08/30/null-constraint-bei-mysql-entfernen/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 20:27:21 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Aktuelle Aktivitäten]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/2009/08/30/null-constraint-bei-mysql-entfernen/</guid>
		<description><![CDATA[Bevor ich die Syntax vergesse:

ALTER TABLE my_table MODIFY some_column varchar&#40;255&#41; NULL;

]]></description>
			<content:encoded><![CDATA[<p>Bevor ich die Syntax vergesse:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> my_table <span style="color: #993333; font-weight: bold;">MODIFY</span> some_column varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NULL</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/08/30/null-constraint-bei-mysql-entfernen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Make your Grails app show content</title>
		<link>http://www.mbohlen.de/blog/2009/08/29/make-your-grails-app-show-content/</link>
		<comments>http://www.mbohlen.de/blog/2009/08/29/make-your-grails-app-show-content/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 21:53:13 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=560</guid>
		<description><![CDATA[There is a great way to show content from inside your Grails app: Write the content in Wordpress and let the Wordpress plugin for Grails pull the content into the app:
The Wordpress plugin provides tags for pulling content from wordpress for display in grails. ehcache is used to cache wordpress content for a 5 minute period.
Configuration [...]]]></description>
			<content:encoded><![CDATA[<p>There is a great way to show content from inside your Grails app: Write the content in Wordpress and let the Wordpress plugin for Grails pull the content into the app:</p>
<blockquote><p>The Wordpress plugin provides tags for pulling content from wordpress for display in grails. ehcache is used to cache wordpress content for a 5 minute period.</p></blockquote>
<p>Configuration is a piece of cake:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">wordpress.<span style="color: #006600;">url</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'http://myblog.wordpress.org/xmlrpc.php'</span>
wordpress.<span style="color: #006600;">blogId</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span>
wordpress.<span style="color: #006600;">username</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'myapp'</span>
wordpress.<span style="color: #006600;">password</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'grailsrocks'</span></pre></div></div>

<p>Then, display a list of your Wordpress categories:</p>

<div class="wp_syntax"><div class="code"><pre class="gsp" style="font-family:monospace;">&lt;wordpress:getCategories /&gt;</pre></div></div>

<p>or display the latest posts by saying:</p>

<div class="wp_syntax"><div class="code"><pre class="gsp" style="font-family:monospace;">&lt;wordpress:getRecentPosts count=&quot;5&quot; /&gt;</pre></div></div>

<p>And so on&#8230; Read <a href="http://grails.org/plugin/wordpress">the full story on the plugin page</a> at grails.org.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/08/29/make-your-grails-app-show-content/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perf4J plugin for Grails logs the time</title>
		<link>http://www.mbohlen.de/blog/2009/08/29/per4j-plugin-for-grails-logs-the-time/</link>
		<comments>http://www.mbohlen.de/blog/2009/08/29/per4j-plugin-for-grails-logs-the-time/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 21:36:07 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=554</guid>
		<description><![CDATA[A new plugin for Grails is in the oven and is still baking. However, the first rumours got out of the bakery.  
Perf4J is to System.currentTimeMillis() as log4j is to System.out.println().
Using Perf4J, you will be able to stop the time for a Grails code block, like this:

withStopwatch&#40;&#34;myCriticalCodeBlock&#34;&#41; &#123;
    // code to [...]]]></description>
			<content:encoded><![CDATA[<p>A new plugin for Grails is in the oven and is still baking. However, the first rumours got out of the bakery. <img src='http://www.mbohlen.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<blockquote><p>Perf4J is to System.currentTimeMillis() as log4j is to System.out.println().</p></blockquote>
<p>Using Perf4J, you will be able to stop the time for a Grails code block, like this:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">withStopwatch<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;myCriticalCodeBlock&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// code to be profiled with tag &quot;myCriticalCodeBlock&quot;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>You can also log the time for a service method, automatically, choose one or more of these alternatives:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">static</span> profiled <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">static</span> profiled <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'testMethod1'</span>, <span style="color: #ff0000;">'testMethod3'</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #000000; font-weight: bold;">static</span> profiled <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
    testMethod1<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    testMethod2<span style="color: #66cc66;">&#40;</span>tag: <span style="color: #ff0000;">&quot;tm2&quot;</span><span style="color: #66cc66;">&#41;</span>
    testMethod3<span style="color: #66cc66;">&#40;</span>message: <span style="color: #ff0000;">&quot;only message&quot;</span><span style="color: #66cc66;">&#41;</span>
    testMethod4<span style="color: #66cc66;">&#40;</span>tag: <span style="color: #ff0000;">&quot;tm4&quot;</span>, message: <span style="color: #ff0000;">&quot;this is testMethod4()&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Got the taste of it? Read <a href="http://grails.org/Perf4j+Plugin">the full story</a> about the upcoming plugin and enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/08/29/per4j-plugin-for-grails-logs-the-time/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Powerful asserts in Groovy 1.7-beta</title>
		<link>http://www.mbohlen.de/blog/2009/08/25/powerful-asserts-in-groovy-1-7-beta/</link>
		<comments>http://www.mbohlen.de/blog/2009/08/25/powerful-asserts-in-groovy-1-7-beta/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 21:03:35 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=547</guid>
		<description><![CDATA[This will make every TDD/Groovy enthusiast happy: Groovy 1.7 will contain powerful assertions. This assertion here

assert new File&#40;'foo.bar'&#41; == new File&#40;'example.txt'&#41;

will yield this output:

Caught: Assertion failed:
&#160;
assert new File&#40;'foo.bar'&#41; == new File&#40;'example.txt'&#41;
       &#124;                  [...]]]></description>
			<content:encoded><![CDATA[<p>This will make every TDD/Groovy enthusiast happy: Groovy 1.7 will contain powerful assertions. This assertion here</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">assert</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">File</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo.bar'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">File</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'example.txt'</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>will yield this output:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">Caught: Assertion failed:
&nbsp;
<span style="color: #000000; font-weight: bold;">assert</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">File</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo.bar'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">File</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'example.txt'</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">|</span>                   <span style="color: #66cc66;">|</span>  <span style="color: #66cc66;">|</span>
       foo.<span style="color: #006600;">bar</span>             <span style="color: #66cc66;">|</span>  example.<span style="color: #006600;">txt</span>
                           <span style="color: #000000; font-weight: bold;">false</span></pre></div></div>

<p>Isn&#8217;t that cool?<br />
Read <a href="http://groovy.codehaus.org/(draft)+Groovy+1.7+release">more about the new Features in Groovy 1.7</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/08/25/powerful-asserts-in-groovy-1-7-beta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GAE: Datenbank ohne Aggregatfunktionen</title>
		<link>http://www.mbohlen.de/blog/2009/08/23/gae-datenbank-ohne-aggregatfunktionen/</link>
		<comments>http://www.mbohlen.de/blog/2009/08/23/gae-datenbank-ohne-aggregatfunktionen/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 06:59:37 +0000</pubDate>
		<dc:creator>Matthias Bohlen</dc:creator>
				<category><![CDATA[Lesenswert]]></category>

		<guid isPermaLink="false">http://www.mbohlen.de/blog/?p=482</guid>
		<description><![CDATA[Google App Engine ist eine massiv skalierbare Umgebung &#8211; schön, doch Google hat dafür einige Designentscheidungen getroffen (treffen müssen?), die das Leben für Applikationen u.U. etwas schwer machen können. Z.B. fehlen in GAE&#8217;s Persistenzschicht die Aggregatfunktionen (sum, avg, min, max, &#8230;), die jede übliche relationale Datenbank mitbringt.
In Marcel Overdijks Blog gibt es dazu eine interessante [...]]]></description>
			<content:encoded><![CDATA[<p>Google App Engine ist eine massiv skalierbare Umgebung &#8211; schön, doch Google hat dafür einige Designentscheidungen getroffen (treffen müssen?), die das Leben für Applikationen u.U. etwas schwer machen können. Z.B. fehlen in GAE&#8217;s Persistenzschicht die Aggregatfunktionen (sum, avg, min, max, &#8230;), die jede übliche relationale Datenbank mitbringt.</p>
<p>In Marcel Overdijks Blog gibt es dazu eine <a href="http://marceloverdijk.blogspot.com/2009/06/google-app-engine-datastore-doubts.html">interessante Diskussion</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mbohlen.de/blog/2009/08/23/gae-datenbank-ohne-aggregatfunktionen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
