<?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>Xebia Blog &#187; Erik Rozendaal</title>
	<atom:link href="http://blog.xebia.com/author/erozendaal/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.com</link>
	<description>Software development done right!</description>
	<lastBuildDate>Wed, 01 Feb 2012 00:30:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CQRS: Designing the Event Store</title>
		<link>http://blog.xebia.com/2009/12/05/cqrs-designing-the-event-store/</link>
		<comments>http://blog.xebia.com/2009/12/05/cqrs-designing-the-event-store/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 14:32:30 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Java]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3796</guid>
		<description><![CDATA[One of the things I like about CQRS is that many of the infrastructure components become simpler, at least compared to the classical ORM approach. However, some of these components have not seen widespread use in existing enterprise applications and will be new to most people. One such component is the Event Store that is [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I like about CQRS is that many of the infrastructure components become simpler, at least compared to the classical ORM approach. However, some of these components have not seen widespread use in existing enterprise applications and will be new to most people. One such component is the Event Store that is used for persistence of the (transactional) domain in CQRS.<br />
<span id="more-3796"></span></p>
<p>Conceptually, an event store is very simple. For persisting an aggregate, all new state change events need to be stored. When loading an aggregate back into memory, each event is replayed against your domain so that the aggregate is put back into the right state. The original interface of the <tt>EventStore</tt> reflected this in a very straightforward manner:</p>
<pre class="brush: java; title: ; notranslate">
public interface EventStore&lt;EventType&gt; {
    void storeEvents(UUID aggregateId, List&lt;EventType&gt; events);
    List&lt;EventType&gt; loadEvents(UUID aggregateId);
}
</pre>
<p>The <tt>storeEvents</tt> method handles both storing the first events for a newly persisted aggregate as well as adding additional events after further transactions. The <tt>loadEvents</tt> method simply returns all events stored for the aggregate.</p>
<p>This interface works pretty well as a starting point, but is hard to extend to support some features you will likely need in a real system:</p>
<ul>
<li>Polymorphism</li>
<li>Snapshots</li>
<li>Versioning and conflict resolution</li>
</ul>
<p>So for the <a href="http://github.com/erikrozendaal/cqrs-lottery/tree/exercise">training example</a> the interface was modified to support polymorphism and versioning:</p>
<pre class="brush: java; title: ; notranslate">
public interface EventStore&lt;EventType&gt; {
    void storeEventSource(EventSource&lt;EventType&gt; source);
    T loadEventSource(Class&lt;T&gt; expectedType, UUID eventSourceId);
    T loadEventSource(Class&lt;T&gt; expectedType, VersionedId eventSourceId);
}
</pre>
<p>The <tt>EventSource</tt> is a new interface that must be implemented by your aggregate root:</p>
<pre class="brush: java; title: ; notranslate">
public interface EventSource&lt;EventType&gt; {
    VersionedId getVersionedId();
    List&lt;EventType&gt; getUnsavedEvents();
    void loadFromHistory(List&lt;EventType&gt; history);
}
</pre>
<p>The <tt>getVersionedId</tt> and <tt>getUnsavedEvents</tt> methods are called when persisting an aggregate. When loading the aggregate the event store instantiates your aggregate with its current id and version and invokes <tt>loadFromHistory</tt>.</p>
<p>Although this change added support for polymorphism and versioning it is not a very clean interface:</p>
<ul>
<li>The aggregate root must implement the <tt>EventSource</tt> interface, coupling it to the event store</li>
<li>The <tt>EventSource</tt> interface is used both as a <em>source</em> and a <em>sink</em></li>
<li>The event store instantiates your aggregate, passing in the <tt>VersionedId</tt>. So your aggregate root must also have a one-argument constructor</li>
</ul>
<p>Finally, the implementation of the event store was not very clean either, mixing JDBC, reflection code, and version management.</p>
<p>So last weekend I decided to start with a clean slate and re-implement the event store. Now one of my favorite ways to design and implement an API is to start with unit tests and a plain Java implementation, without trying to tackle the actual JDBC code at the same time. Maps and Lists are great for storing data while doing exploring the various designs. Furthermore, the tests are completely reusable when it is time to write the actual JDBC implementation.</p>
<p>Here&#8217;s one of the first test cases:</p>
<pre class="brush: java; title: ; notranslate">
@Test
public void should_create_event_stream_with_initial_version_and_events() {
    FakeEventSource source = new FakeEventSource(&quot;type&quot;, 0, T1, EVENTS);
    subject.createEventStream(ID_1, source);

    FakeEventSink sink = new FakeEventSink(&quot;type&quot;, 0, T1, EVENTS);
    subject.loadEventsFromLatestStreamVersion(ID_1, sink);

    sink.verify();
}
</pre>
<p>As you can see from the test case the roles of <em>event source</em> and <em>event sink</em> have been made explicit. Creation of an event stream is now also separate from storing additional events into an existing event stream. Furthermore, the aggregate no longer needs to implement these interfaces. The Repository implementation will need to do the mapping between your domain classes and the event store. Here are the new event store interfaces with various methods added to support loading historical data:</p>
<pre class="brush: java; title: ; notranslate">
public interface EventSource&lt;EventType&gt; {
    String getType();
    long getVersion();
    long getTimestamp();
    List&lt;EventType&gt; getEvents();
}

public interface EventSink&lt;EventType&gt; {
    void setType(String type);
    void setVersion(long version);
    void setTimestamp(long timestamp);
    void setEvents(List&lt;EventType&gt; events);
}

public interface EventStore&lt;EventType&gt; {
    void createEventStream(UUID streamId, EventSource&lt;EventType&gt; source);
    void storeEventsIntoStream(UUID streamId, long expectedVersion, EventSource&lt;EventType&gt; source);

    void loadEventsFromLatestStreamVersion(UUID streamId, EventSink&lt;EventType&gt; sink);
    void loadEventsFromExpectedStreamVersion(UUID streamId, long expectedVersion, EventSink&lt;EventType&gt; sink);

    void loadEventsFromStreamUptoVersion(UUID streamId, long version, EventSink&lt;EventType&gt; sink);
    void loadEventsFromStreamUptoTimestamp(UUID streamId, long timestamp, EventSink&lt;EventType&gt; sink);
}
</pre>
<p>As you can see the <tt>EventSink</tt> and <tt>EventSource</tt> interfaces are very much opposites and easily extensible with supporting new features like loading from a snapshot or supporting conflict resolution.</p>
<p>Finally, after having a full test suite and an in-memory implementation of the new event store (which took most of the day) adding a new JDBC based implementation was just a couple of hours of work, requiring only minimal changes to the tests and interfaces, mostly related to exception handling. The current JDBC event store implementation is about 250 lines of Java, very modest for a domain persistence mechanism.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/12/05/cqrs-designing-the-event-store/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F12%2F05%2Fcqrs-designing-the-event-store%2F&amp;title=CQRS%3A%20Designing%20the%20Event%20Store" id="wpa2a_2"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/12/05/cqrs-designing-the-event-store/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Domain-Driven Design and Command-Query Separation example application</title>
		<link>http://blog.xebia.com/2009/12/03/domain-driven-design-and-command-query-separation-example-application/</link>
		<comments>http://blog.xebia.com/2009/12/03/domain-driven-design-and-command-query-separation-example-application/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 07:33:53 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3761</guid>
		<description><![CDATA[Ever since attending Greg Young&#8217;s Unshackle Your Domain talk at QCon &#8217;08 in San Francisco and a later two-day training course given by Greg Young I&#8217;ve wanted to build a sample application that made use of the principles of Command-Query Responsibility Separation (CQRS). However, other interesting things intervened and I never got around to doing [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since attending <a href="http://codebetter.com/blogs/gregyoung/">Greg Young&#8217;s</a> <a href="http://www.infoq.com/presentations/greg-young-unshackle-qcon08">Unshackle Your Domain</a> talk at QCon &#8217;08 in San Francisco and a later two-day training course given by Greg Young I&#8217;ve wanted to build a sample application that made use of the principles of Command-Query Responsibility Separation (CQRS).</p>
<p>However, <a href="http://hadoop.apache.org/mapreduce/">other</a> interesting <a href="http://hadoop.apache.org/hbase/">things</a> intervened and I never got around to doing this.</p>
<p>But every few months we have a one day internal training course at Xebia Software Development and after Sjors Grijpink and I proposed to give a training on DDD and CQRS we got some time to actually prepare and implement a CQRS example application.<br />
<span id="more-3761"></span></p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2009/12/Screen-shot-2009-12-02-at-19.22.02.png"><img src="http://blog.xebia.com/wp-content/uploads/2009/12/Screen-shot-2009-12-02-at-19.22.02.png" alt="The Xebia Lottery" title="The Xebia Lottery" width="655" height="268" class="aligncenter size-full wp-image-3766" /></a></p>
<p>The application is fairly simple (as it should be for a one day training course) but touches on all the major components needed for a full-blown CQRS implementation.</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2009/12/CQRS-components.0151.png"><img src="http://blog.xebia.com/wp-content/uploads/2009/12/CQRS-components.0151-300x225.png" alt="CQRS components" title="CQRS components" width="300" height="225" class="aligncenter size-medium wp-image-3771" /></a></p>
<p>The source code for the training exercises can be found at <a href="http://github.com/erikrozendaal/cqrs-lottery">github</a>. There are three branches:</p>
<ol>
<li>exercise &#8211; the code used for doing the training exercises.</li>
<li>solution &#8211; the same code as above but with the solutions added.</li>
<li>master &#8211; the main development branch, currently used to implement more advanced features like snapshotters, command-event conflict resolution, historical tracing, etc.</li>
</ol>
<p>The <a href="http://blog.xebia.com/wp-content/uploads/2009/12/Xebia-ITR-CQRS-presentation.pdf">Xebia ITR CQRS presentation</a> is also available.</p>
<p>All-in-all the training was a success and I think that the basic CQRS principles are the way forward when you need to build enterprise applications with a complicated domain logic or strong auditing or historical tracing requirements.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/12/03/domain-driven-design-and-command-query-separation-example-application/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F12%2F03%2Fdomain-driven-design-and-command-query-separation-example-application%2F&amp;title=Domain-Driven%20Design%20and%20Command-Query%20Separation%20example%20application" id="wpa2a_4"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/12/03/domain-driven-design-and-command-query-separation-example-application/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Poster Presentations at the Dutch Java Users Group J-Fall meeting</title>
		<link>http://blog.xebia.com/2009/11/18/poster-presentations-at-the-dutch-java-users-group-j-fall-meeting/</link>
		<comments>http://blog.xebia.com/2009/11/18/poster-presentations-at-the-dutch-java-users-group-j-fall-meeting/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:16:51 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[Scala]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3454</guid>
		<description><![CDATA[Besides organizing a Scala workshop at the J-Fall meeting we also presented five technical posters to serve as discussion points for anyone interested (or just walking by). Unlike traditional meeting sessions we could interact directly, somewhat similar to open space sessions. The five posters we presented were: Scala by Arjan Blokzijl &#8211; a quick overview [...]]]></description>
			<content:encoded><![CDATA[<p>Besides organizing a <a href="http://www.scala-labs.org/">Scala workshop</a> at the J-Fall meeting we also presented five technical posters to serve as discussion points for anyone interested (or just walking by). Unlike traditional meeting sessions we could interact directly, somewhat similar to open space sessions.<br />
<span id="more-3454"></span></p>
<p>The five posters we presented were:</p>
<ul>
<li><a href='http://blog.xebia.com/wp-content/uploads/2009/11/SCALA-Arjan-Blokzijl.pdf'>Scala by Arjan Blokzijl</a> &#8211; a quick overview of the main features and characteristics of the <a href="http://www.scala-lang.org/">Scala</a> programming language</li>
<li><a href='http://blog.xebia.com/wp-content/uploads/2009/11/Composite-Andrew-Phillips.pdf'>@Composite by Andrew Phillips</a> &#8211; <a href='http://blog.xebia.com/2009/06/23/composite-macro-annotations-for-java/'>making Java annotations more reusable</a></li>
<li><a href='http://blog.xebia.com/wp-content/uploads/2009/11/FitNesse-and-VMWare-Robert-van-Loghem.pdf'>FitNesse and VMWare by Robert van Loghem</a> &#8211; combining <a href="http://fitnesse.org/">FitNesse</a> and <a href="http://www.vmware.com/">VMware</a> to decrease installation and configuration of the system under test</li>
<li><a href='http://blog.xebia.com/wp-content/uploads/2009/11/DDD-Erik-Rozendaal.pdf'>Domain-Driven Design and Command-Query Separation by Erik Rozendaal</a> &#8211; separating the domain model from query and reporting concerns</li>
<li><a href='http://blog.xebia.com/wp-content/uploads/2009/11/GIT-Arjan-Molenaar.pdf'>GIT by Arjan Molenaar</a> &#8211; an overview of <a href="http://git-scm.com/">git</a> &#8211; a fast version control system created by Linus Torvalds</li>
</ul>
<p>All-in-all these poster presentations were successful and a lot of fun to do. The discussions were much more interactive than regular meeting sessions. This allowed the participants to quickly gain an understanding of the presented topics as well as allowing them to go into specific details, pros, and cons. Another big plus is that we received immediate feedback on the applicability of the presented topics.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/11/18/poster-presentations-at-the-dutch-java-users-group-j-fall-meeting/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F11%2F18%2Fposter-presentations-at-the-dutch-java-users-group-j-fall-meeting%2F&amp;title=Poster%20Presentations%20at%20the%20Dutch%20Java%20Users%20Group%20J-Fall%20meeting" id="wpa2a_6"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/11/18/poster-presentations-at-the-dutch-java-users-group-j-fall-meeting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>QCon San Francisco 2008 &#8211; Unleash Your Domain</title>
		<link>http://blog.xebia.com/2008/11/22/qcon-san-francisco-2008-unleash-your-domain/</link>
		<comments>http://blog.xebia.com/2008/11/22/qcon-san-francisco-2008-unleash-your-domain/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 15:35:41 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[qcon]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=819</guid>
		<description><![CDATA[The talk &#8220;Unshackle Your Domain&#8221; given by Greg Young was the highlight of QCon for me. An architectural approach that is relatively easy to understand, incredibly scalable, and supports a rich domain model. At his presentation, Greg quickly pointed out some of the problems with traditional enterprise application architecture, such as JEE. This architecture usually [...]]]></description>
			<content:encoded><![CDATA[<p>The talk <a href="http://qconsf.com/sf2008/presentation/Unshackle+Your+Domain">&#8220;Unshackle Your Domain&#8221;</a> given by <a href="http://codebetter.com/blogs/gregyoung/default.aspx">Greg Young</a> was the highlight of <a href="http://qconsf.com/">QCon</a> for me. An architectural approach that is relatively easy to understand, incredibly scalable, and supports a rich domain model.<span id="more-819"></span> </p>
<p>At his presentation, Greg quickly pointed out some of the problems with traditional enterprise application architecture, such as <a href="http://java.sun.com/reference/blueprints/">JEE</a>. This architecture usually consists of an &#8220;object-oriented&#8221; domain model encapsulated inside a procedural service layer, persisted in a relational database, flattened out on a data entry screen by the UI layer, and crunched daily into management reports by some reporting tool. With so many masters, it&#8217;s no wonder that the domain model becomes <a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html">anemic</a> and the application is hard to scale.</p>
<p>Greg needed something better. Something that is able to sustain 10,000 transactions per second, supports bullet-proof auditing, and has a rich domain model to implement complicated financial business logic.</p>
<p>His key insight is that the application should explicitly model state transition <em>commands</em> as classes and strictly split these commands from <em>queries</em> on the application interface level. So any kind of client UI or report will use the query interface of the application to get its needed data using a thin <a href="http://en.wikipedia.org/wiki/Data_Transfer_Object">DTO</a> layer while updates uses the command interface. These command objects also support the audit requirements and drive the domain model.</p>
<p>Now the domain model only supports a single concern: validating and executing commands. No longer does the domain model need to support querying, so your objects no longer need lots of getters and setters: <a href="http://www.pragprog.com/articles/tell-dont-ask">Tell, don&#8217;t ask!</a> In addition to this, the domain model can now be stored using a data store optimized for updates, such as <a href="http://hypertable.org/">Hypertable</a> or <a href="http://incubator.apache.org/couchdb/">CouchDB</a>.</p>
<p>For the query interface a read-optimized database can be used, updated by events from the domain model. You can easily denormalize this database without reducing the efficiency of writes on your domain model. Furthermore, it is now possible to easily replicate this read-only store for extremely high scalability.</p>
<p>In the next few weeks I&#8217;ll investigate the practical implications of this approach, the needed infrastructure to get this working, and the possible applications that could benefit.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/22/qcon-san-francisco-2008-unleash-your-domain/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F22%2Fqcon-san-francisco-2008-unleash-your-domain%2F&amp;title=QCon%20San%20Francisco%202008%20%26%238211%3B%20Unleash%20Your%20Domain" id="wpa2a_8"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/22/qcon-san-francisco-2008-unleash-your-domain/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>QCon San Francisco 2008 &#8211; Calling Java</title>
		<link>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-calling-java/</link>
		<comments>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-calling-java/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 18:30:29 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Closures]]></category>
		<category><![CDATA[qcon]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=818</guid>
		<description><![CDATA[After two days of QCon you get the feeling that no one is talking about Java anymore. C#, Erlang, F#, Groovy, Ruby, and Scala seem to have taken over. The only new Java stuff being talked about are libraries, application servers, or just IDE improvements. No one is talking about the Java language. Looking back, [...]]]></description>
			<content:encoded><![CDATA[<p>After two days of <a href="http://qconsf.com/">QCon</a> you get the feeling that no one is talking about Java anymore. C#, Erlang, F#, Groovy, Ruby, and Scala seem to have taken over. The only new Java stuff being talked about are libraries, application servers, or just IDE improvements. No one is talking about the Java language.<br />
<span id="more-818"></span></p>
<p>Looking back, the last major change of Java language was with the release of Java 5 in 2004. Java 7 will bring changes, but is late. The advantage is stability, but the price to pay is that the brightest minds in the industry start to leave Java behind. </p>
<p>A prime example is closures. A lot of Java code is simple boilerplate code, like managing your JDBC resources just to execute a simple query, iterating over a collections just for some transformation or filtering, implementing builders to ensure complicated classes are initialized correctly, implementing GUI event handlers, operations inside parallel processing frameworks, etc. Closures allow you to easily reuse control flow patterns, reducing or eliminating this kind of error prone code.</p>
<p>A language cannot remain static and still have a thriving community. The effects can already be seen on a conference like QCon, where Java has been left behind for greener pastures by many speakers and attendants.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-calling-java/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F21%2Fqcon-san-francisco-2008-calling-java%2F&amp;title=QCon%20San%20Francisco%202008%20%26%238211%3B%20Calling%20Java" id="wpa2a_10"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-calling-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>QCon San Francisco 2008 &#8211; Architects &amp; Agilists</title>
		<link>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-architects-agilists/</link>
		<comments>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-architects-agilists/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 00:38:43 +0000</pubDate>
		<dc:creator>Erik Rozendaal</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[qcon]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=813</guid>
		<description><![CDATA[The QCon San Francisco 2008 conference was opened with an interesting keynote by Rebecca Parsons and Martin Fowler. In their talks they addressed the often strained relationship between traditional architects and agile development and how to improve this relationship to the benefit of both the agile development team and architects. These benefits include cross-project and [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://qconsf.com/">QCon San Francisco 2008 conference</a> was opened with an interesting keynote by <a href="http://www.thoughtworks.com/who-we-are/leadership-profiles/rebecca-parsons.html">Rebecca Parsons</a> and <a href="http://martinfowler.com/">Martin Fowler</a>. In their talks they addressed the often strained relationship between traditional architects and agile development and how to improve this relationship to the benefit of both the agile development team and architects. These benefits include cross-project and cross-department  knowledge exchange, sharing of the architects many years of experience with the developers, and only working on the architecture that is actually needed.<span id="more-813"></span></p>
<p>The first part discussed the threat of agile development to the role of traditional architects and the distrust between developers and architects. Although many of the Ivory Tower Architect stereotypes may contain a grain of truth, the cause is often not the architects themselves. Many organizations put architects in a position that makes it hard or impossible to be successful:</p>
<ul>
<li>Goals like achieving 30% reuse &#8211; how to measure and promote this?</li>
<li>Architects are not allowed to write code &#8211; so how can the architects keep up with the latest technology?</li>
<li>Architects are often outnumbered by developers 30 to 1 or more &#8211; this leaves no time for being involved with projects or mentoring of the developers.</li>
</ul>
<p>Traditionally this leaves the architects with very few options, like specifying a reference architecture and requiring all projects to adhere to it, even when the architecture is not a good fit for the specific project. Not only does this clash with agile development, but agile development may even threaten this model. It is not surprising that this causes distrust between architects and agile teams.</p>
<p>But this adversarial relationship is not necessary. The second part of the presentation addressed how agile development allows the architects to be successful:</p>
<ul>
<li>Visibility in progress by delivering working software every iteration, allowing the architect to be involved and react.</li>
<li>Up-to-date specifications of functionality through automated tests.</li>
<li>Extracting reusable components from working code, instead of trying to build reusable components up-front that may never be used. &#8220;After the fact&#8221; instead of &#8220;design up front&#8221; reuse.</li>
</ul>
<p>So how can you involve the architects into the agile development process? By treating the architects as another stakeholder, just like the regular customer. The architectural requirements will need to be prioritized just like any other requirement. And requirements like &#8220;the system must be maintainable&#8221; will have to become specific and implementable, making the work of the architects more concrete and valuable.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-architects-agilists/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F21%2Fqcon-san-francisco-2008-architects-agilists%2F&amp;title=QCon%20San%20Francisco%202008%20%26%238211%3B%20Architects%20%26%23038%3B%20Agilists" id="wpa2a_12"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/21/qcon-san-francisco-2008-architects-agilists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.xebia.com/author/erozendaal/feed/ ) in 0.64540 seconds, on Feb 9th, 2012 at 4:51 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 9th, 2012 at 5:51 pm UTC -->
