<?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>blog.codecentric.de</title>
	<atom:link href="http://blog.codecentric.de/en/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.codecentric.de</link>
	<description>Ein Blog von und über die codecentric GmbH</description>
	<lastBuildDate>Sat, 13 Mar 2010 16:50:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java Specialist Master Course Field Report</title>
		<link>http://blog.codecentric.de/en/2010/03/erfahrungsbericht-java-specialist-master-course/</link>
		<comments>http://blog.codecentric.de/en/2010/03/erfahrungsbericht-java-specialist-master-course/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 09:11:19 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[codecentric]]></category>
		<category><![CDATA[meet the experts]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3169</guid>
		<description><![CDATA[Last week I had the pleasure attended Heinz Kabutz Java Specialists Master course to sharpen my Java skills. Java Champion Heinz, is a great trainer who manages to combine anecdotes, hard facts and deep Java knowledge with engaging exercises to a well done course. The scope was the whole spectrum of Java, but focusing on [...]]]></description>
			<content:encoded><![CDATA[<p><p>Last week I had the pleasure attended Heinz Kabutz <a href="http://www.javaspecialists.eu/courses/master.jsp">Java Specialists Master course</a> to sharpen my Java skills. <a href="https://java-champions.dev.java.net/content/corechampions.html">Java Champion Heinz</a>, is a great trainer who manages to combine anecdotes, hard facts and deep Java knowledge with engaging exercises to a well done course. The scope was the whole spectrum of Java, but focusing on the details you normally do not use, or know how to use. Some of the material he already published as part of <a href="http://www.javaspecialists.eu/archive/archive.jsp">his newsletters</a>, which are read all around the world.</p>
<p>Let me share my impressions on the course with you in this day by day review&#8230;<span id="more-3169"></span></p>
<p><strong>Day 1</strong></p>
<p>The course started with discussing Threads, and how we should use them. Quite a complex topic for early morning. We played with a ThreadGroup that became a custom Thread pool. <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadGroup.html">ThreadGroup</a> is not the best designed class. Heinz called it a child&#8217;s drawing from the early years of Java. I found using the <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/package-summary.html">java.util.concurrent Locks</a> really easy. Finally gone are the days of <em>synchronized()</em>. Before the lunch break, Heinz showed us his laws on concurrency, which he also presented in an abbreviated form at our <a href="http://www.meettheexperts.de/static/pdf/praesentationen/2009-06-26-performance/meet-the-experts-the-secrets-of-concurrency.pdf">meet the experts &#8211; performance event</a>. We came across this code:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">boolean</span> running = <span style="color: #006600; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> dojob<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000;  font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>running<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// do something useful</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  running = <span style="color: #006600; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>When running in a Server VM (with java -server), this might never stop, due to optimizing running would be inlined by HotSpot with being true all the time. To avoid this you would have to make it <em>volatile</em>. Because I asked about debugging, we tried stopping there and the debugger showed us: <em>running = false</em>. Still the code continued to executed, because the debugger sees the correct field value, but the running code doesn&#8217;t. It gets more interesting with this code:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doJob<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-weight: bold;">boolean</span> myRunning = running<span style="color: #339933;">;</span>
  <span style="color: #000000;  font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>running<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// do something useful</span>
    myRunning = running<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>When looking with the debugger we saw this:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">running = <span style="color: #006600; font-weight: bold;">false</span><span style="color: #339933;">;</span> myrunning = <span style="color: #006600; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></div></div>

<p>however the loop still looped. But when forcing the line to execute via F7, code terminated. This can be a nightmare to debug, so it is good to know what you should take care of when writing multithreaded programs.</p>
<p>Also something to remember is to check</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Thread</span>.<span style="color: #006633;">interrupted</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InterruptedException</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>as first code in all methods declaring an <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/InterruptedException.html">InterruptedException</a>.</p>
<p>We learned about <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CompletionService.html">CompletionService</a> looks like an interesting interface for mass processing of asynchronous work. So, who needs closures? <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Day 2</strong></p>
<p>We started with <a href="http://java.sun.com/j2se/1.4.2/docs/guide/nio/">Java new (yet another new?) IO</a>, which brings quite a lot of new features, but somehow is not as widely used as it should be. One reason might be that it can easily get much more complicated to use. Perhaps one should try easy examples before writing an Async nonblocking server (which you can after attending the course <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #003399; font-weight: bold;">FileChannel</span> fc = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">RandomAccessFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test.txt&quot;</span>, <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getChannel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399; font-weight: bold;">MappedByteBuffer</span> buffer = fc.<span style="color: #006633;">map</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">FileChannel.<span style="color: #006633;">MapMode</span></span>.<span style="color: #006633;">READ_ONLY</span>, <span style="color: #cc66cc;">0</span>, fc.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Second half was on understanding Java memory management. This of course is less often really applicable, but understanding it is quite critical to solving problems. We had a look at stuff like caching and pooling, and why this creates leaks or loitering objects. This reminds me of my older <a href="http://blog.codecentric.de/2009/08/jsp-tag-pooling-memory-leaks/">post about tag pooling</a> in servlet containers. I never understood really why tags are pooled, and even worse, do not have proper lifecycle methods to detect this when using an IDE. We used <a href="https://visualvm.dev.java.net/">jVisualVm</a> and <a href="http://www.javaperformancetuning.com/tools/hpjmeter/index.shtml">HPjMeter</a> to watch the GC at work.</p>
<p><strong>Day 3</strong></p>
<p>On day 3, I learned some interesting inner mechanics of Collection classes I did not use before (like <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html">PriorityQueue</a>), as well as some nasty tricks on classloading. Heinz explained<a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Proxy.html"> java.lang.reflect.Proxies</a> really well, and once understood, using them was not that difficult. Actually the best instruction is in the JavaDoc, but you must know how to read it:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">Foo f = <span style="color: #009900;">&#40;</span>Foo<span style="color: #009900;">&#41;</span> <span style="color: #003399; font-weight: bold;">Proxy</span>.<span style="color: #006633;">newProxyInstance</span><span style="color: #009900;">&#40;</span>
		Foo.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getClassLoader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> Foo.<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #009900;">&#125;</span>,
		<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InvocationHandler</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">Object</span> invoke<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Object</span> foo, <span style="color: #003399; font-weight: bold;">Method</span> method, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> arguments<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Throwable</span> <span style="color: #009900;">&#123;</span>
		    <span style="color: #000000; font-weight: bold;">return</span> method.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>foo, arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		  <span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In the afternoon we discussed about Exceptions, and I made up my mind on checked vs unchecked exceptions. Personally I will use unchecked exceptions for developer/programming errors. Catching them is not required, app may crash &#8211; Developers should fix this. However everything which is related to the Environment the app runs ins should work with checked exceptions. Ideally they provide sensible information, not just a message. Also quite important: Just rethrow Exceptions! Found yourself not able to decide what to do with an InterruptedException? Well just rethrow it <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  And handle it in the Thread code (calling interrupted() and exiting a loop). I never did that often, because I don&#8217;t like polluting my method signature, but it should be considered. Do not be afraid of retrowing Exceptions.</p>
<p><strong>Day 4</strong></p>
<p>The last day of the course started with a tough performance optimization exercise. The tough part was that we were not allowed to improve the code until we had all the numbers written down and eliminated any overhead of testing code. I especially liked this, because it thought me how eager I am sometimes fixing issues that I forget proving them first. As kind of side note, we discussed the various modes the JVM can run in and found out how slow java -Xint is.  After having sped up the code down to 10% of its initial runtime, we moved on to Date and Time, which was a bit short chapter. I can recommend using <a href="http://joda-time.sourceforge.net/">jodatime</a> and <a href="http://site.icu-project.org/">icu4j</a>, and try to stay away from java.util.Date. Before the end of the course we covered logging including some nifty tricks. The most important lesson about logging is that you need to use code guards (which was not new to me, but I like the term, I never heard before):</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>log.<span style="color: #006633;">isDebugEnabled</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span>complexObject.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> + expensive.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Wrap-Up</strong></p>
<p>I can wholeheartedly recommend this course. 4 days packed with lots of information and exercises that are well done so that they are a challenge for every participant. You should have worked with Java already some time. This is definitely not a beginners course. You will rush past topics which you can only grasp when you have experienced the problem before. I can also recommend taking this training in German, because Heinz has a really funny accent <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/03/erfahrungsbericht-java-specialist-master-course/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Agile Developer</title>
		<link>http://blog.codecentric.de/en/2010/03/der-agile-entwickler/</link>
		<comments>http://blog.codecentric.de/en/2010/03/der-agile-entwickler/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 22:36:03 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3219</guid>
		<description><![CDATA[Software projects that are developed based on agile processes like Scrum or eXtreme Programming are very demanding concerning the skills of the developers in an agile team.
In 2001 Andrew Hunt and David Thomas introduced a benchmark for modern developers with their book  „The Pragmatic Programmer“. The focus of their work is on practises, tools and [...]]]></description>
			<content:encoded><![CDATA[<p>Software projects that are developed based on agile processes like <a href="http://www.scrum.org/scrumguides/" target="_blank">Scrum</a> or <a href="http://c2.com/cgi/wiki?ExtremeProgramming" target="_blank">eXtreme Programming</a> are very demanding concerning the skills of the developers in an agile team.</p>
<p>In 2001 Andrew Hunt and David Thomas introduced a benchmark for modern developers with their book  „<a href="http://www.pragprog.com/the-pragmatic-programmer" target="_blank">The Pragmatic Programmer</a>“. The focus of their work is on practises, tools and design-paradigms to help programmers produce better code.<span id="more-3219"></span>In my point of view being a &#8220;Pragmatic Programmer&#8221; is not enough for the challenges of agile projects. This blog entry takes a closer look at the developer in the team of a Scrum project. I explicitly distinguish between &#8220;programmer&#8221; and developer&#8221; because the word programmer tends to focus more on coding and less on all the other activities needed for implementing an application. (e.g. testing)</p>
<p>According to <a href="http://www.controlchaos.com/" target="_blank">Ken Schwaber</a> (who formulated the inital version of Scrum together with Jeff Sutherland), Scrum was mainly inspired by an article of the Harvard Business Journal that was published in January 1986: „<a href="http://www.iei.liu.se/fek/frist/723g18/articles_and_papers/1.107457/TakeuchiNonaka1986HBR.pdf" target="_blank">The New New Product Development Game</a>“. The article analyzed the criterias of successful new product developments of companies like Honda and IBM. One of the main assumptions of this article for successful product development is:</p>
<blockquote><p>„Stop playing the relay race – play rugby“.</p></blockquote>
<p>For software development this would mean that the old sequential approach (aka: waterfall) doesn&#8217;t work anymore and we should start using a holistic approach.</p>
<p>Scrum has taken the basic characteristics of successful product development teams like <em>self-organizing project team</em>, <em>overlapping development phases</em> and <em>subtle control</em> and integrated them into the Scrum process. Scrum combines them with ideas of iterative, incremental development and lean principles.The  <a title="Scrum Alliance" href="http://www.scrumalliance.org/" target="_blank">Scrum Alliance</a> provides training and certification for <a href="http://www.scrumalliance.org/pages/certified_scrummaster_csm" target="_blank">Scrum Master</a> and <a href="http://www.scrumalliance.org/pages/certified_scrum_product_owner" target="_blank">Product Owner</a> – but why not for the developer? Does&#8217;t the success of a project mainly depend on the team? Are there any implications on the skills of a developer by changing the work model to self-organization with overlapping development phases or by delivering high-quality software every 2-4 weeks?</p>
<p>My personal opinion is that agile methodologies like Scrum fundamentally change the way developers work. Therefore new skills and attitudes are required.</p>
<p>Let&#8217;s start by looking at one of the most important changes in agile projects: self-organizing project teams. Self-organizing means that there is no &#8220;command-and-control&#8221; paradigm anymore, where (project) managers tell the developers which work in which time sequence should be implemented. Self-organizing often sounds like stress-less freedom for the team &#8211; but often turns out to be a very tough job.</p>
<p>The team takes the responsibility for delivering high quality software in time by committing to the Sprint goals. This implies that team members have to discuss, solve conflicts, organize work, estimate effort, pull needed information and commit to team goals. In &#8220;classic&#8221; projects this is done by defined roles like project managers and in many cases developers have no experience how to deal with these challenges. The success of agile projects depends on good self-organization teams &#8211; I&#8217;ve seen managers quickly return to &#8220;command-and-control&#8221; if this doesn&#8217;t work out as expected. So in my point of view organizations have to provide developers with training and coaching to get the needed social skills. Today I see that these kind of trainings and coaching are only provided to management and leadership positions. By inverting &#8220;command and control&#8221; we also have to rethink the training strategy for skills like team building, coaching, training, negotiating, decision making, problem solving, active listening and discussing/debating &#8211; our developers will need them to organize themselves in an agile team.</p>
<p>It could be also useful to provide trainings to help team members understand the strengths and weaknesses of their colleagues to support the team building &#8211; methodologies like  <a href="http://www.tms.com.au/" target="_blank">Team Management System</a> and <a href="http://en.wikipedia.org/wiki/DISC_assessment" target="_blank">DISC</a> can help teams to improve.</p>
<p>When we started with agility at codecentric we quickly found out that we had to train not only technologies and tools but also these kind of social skills, if we want to improve our customer satisfaction even more. So we hired an external trainer and coach to develop a social skill program for our developers to sustainable improve their skills in that area &#8211; the feedback of the participants is great and we see a lot of improvement in the teams.</p>
<p>The second new paradigm you get with Scrum is: overlapping development phases &#8211; like self-organizing this requires new ways of thinking for developers. In the classical, sequential process models, all the requirements are documented by writing detailed specs, filling out use-case templates and provide UML diagrams which exactly describe the whole system (ok, I am a little polemic). With these specs in place the developer could start coding and if he was a good developer, he tested his code. But he shouldn&#8217;t bother too much with testing as the next team in the process would do this for him: quality assurance.</p>
<p>In agile projects these strict constraints are disposed and the responsibilities of a developer are widened. In my point of view developers will have to deal a lot with defining and talking about the requirements (function and non-functional) and testing if the code fullfills these requirements. This means that Unit-Tests are not enough and functional integration and acceptance tests will be needed &#8211; normally these test will be defined and implemented together with the domain experts and experienced testers in the team. But especially for automated testing a developer should be involved from the beginning to code and design for automation &#8211; e.g. to provide data-setup and deal with <a href="http://www.infoq.com/news/2009/11/Testing-time-dates" target="_blank">time and dates</a> in the tests. For me, automated regression tests are a must-have if you are developing in short iterations &#8211; otherwise the test effort can explode. Especially when <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test-Driven Development</a> is introduced, the developers will need training and coaching to get their tasks done. Today test-driven unit tests can be found in some projects but test-driven integration- and acceptance tests are really rare.</p>
<p>The developer will have to communicate a lot with the domain experts to transfer the elements of the <a href="http://www.agilemodeling.com/artifacts/userStory.htm" target="_blank">user stories</a> into good tests. Good knowledge of the domain will be also more important as the detail level of user stories are much lower than of classical use cases.  This means that developers will need very good communication skills and a toolset of practises like <a href="http://domaindrivendesign.org/" target="_blank">Domain Driven Design</a>. Today developers concern more about frameworks like <a href="http://www.springsource.org/" target="_blank">Spring</a> and <a href="https://www.hibernate.org/" target="_blank">Hibernate</a> than with the business domain; generators  that transfer an Entity-Relationship-Model into a Domain-/Object model are a nice gimmick but more or less useless! The generator will not help to get a good structured domain that can be used as a communication bridge between development and the domain experts. DDD calls a good domain model UBIQUITOUS LANGUAGE &#8211; One team, one language! In agile teams, where domain experts, testers and developers are working in one team on the same tasks and stories, it is essential to have one language. So in my opinion we need to sharpen the domain and design skills of the developers, so that they can communicate with the domain experts in a clear and simple manner.</p>
<p>To deliver software every 2-4 weeks a developer should also have good knowledge of common agile practises and tools.  Continuous Integration (e.g. <a href="http://hudson-ci.org/" target="_blank">Hudson</a>, <a href="http://cruisecontrol.sourceforge.net/" target="_blank">CruiseControl</a>), automated build tools (e.g.. <a href="http://maven.apache.org/" target="_blank">Maven</a>, <a href="http://ant.apache.org/" target="_blank">Ant</a>), code quality analyzers (e.g. <a href="http://findbugs.sourceforge.net/" target="_blank">Findbugs</a>, <a href="http://pmd.sourceforge.net/" target="_blank">PMD</a>, <a href="http://checkstyle.sourceforge.net/" target="_blank">Checkstyle</a>),  test automation frameworks (e.g. <a href="http://www.junit.org/" target="_blank">JUnit</a>, <a href="http://www.robotframework.org" target="_blank">Robotframework</a>, <a href="http://easymock.org/" target="_blank">easyMock</a>, <a href="http://www.dbunit.org/" target="_blank">DBUnit</a>, <a href="http://jakarta.apache.org/jmeter/" target="_blank">JMeter</a>), version control systems (e.g. <a href="http://git-scm.com/" target="_blank">git</a>, <a href="http://subversion.tigris.org/" target="_blank">Subversion</a>), bug tracking (e.g. <a href="http://www.atlassian.com/software/jira/" target="_blank">Jira</a>, <a href="http://trac.edgewall.org/" target="_blank">Trac</a>), documentation tools (Wiki, UML, Javadoc) are just examples of the modern, agile software developers portfolio. These practises and tools have to be trained, adopted and optimized so that they can be used for higher productivity and high quality results. Dave Thomas, Co-Autor of „The Pragmatic Programmer“, defined so called „<a href="http://codekata.pragprog.com/" target="_blank">Code Katas</a>“ to practise what is needed to be a professional developer.</p>
<blockquote><p>In software we do our practicing on the job, and that’s why we make mistakes on the job. We need to find ways of splitting the practice from the profession. We need practice sessions.</p></blockquote>
<p>So despite the training, we also have to give our developers time to practise &#8211; for example to learn TDD as seen in this Kata by <a href="http://stefanroock.wordpress.com/2010/01/07/code-kata-bunkai-prime-factors/" target="_blank">Arne Roock</a>.</p>
<p>In addition to all these skills, the developers have to be trained to understand the overall process and concepts. Today the focus of Scrum trainings is on Scrum Master and Product Owner (Ken Schwaber is changing this with the <a href="http://www.scrum.org/scrumdeveloper/" target="_blank">Scrum Developer</a>) &#8211; as most of the meetings and artifacts are mainly for the &#8220;team&#8221;, we should sharpen their understanding of Scrum (which is also part of the ScrumMasters job). For example the team should learn that the main idea behind Daily Scrum is not to report to the Scrum Master (who does not even need to attend the Daily Scrum) but to synchronize with the other team members and make impediments transparent. I&#8217;ve seen a lot of Daily Scrums where the ScrumMaster moderates and asks each team member the three questions and updates the Scrum board for them! Also the Burndown Chart is an instrument for the team to track the progress of the team &#8211; it is not used as a control-instrument for the Scrum Master or Product Owener (or even managers). Anyway: Team members have to be trained and coached to understand Scrum and the agile concepts.</p>
<p>This all shows that organizations that are moving to agile methods like Scrum will have to change. The skill-set of the team and especially developers is changing and the spectrum of required skills will demand for more training, practise and knowledge transfer. „The New New Product Development Game“ claimed that: „Multilearning“ and „Organizational Transfer of Learning“ are two of six critical success factors for good product development teams. Agile organizations will have to accept that training is not an incentive but a duty for all team members of agile projects. The invest in the employees will pay off for sure!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/03/der-agile-entwickler/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Meet The Experts 2010</title>
		<link>http://blog.codecentric.de/en/2010/03/meet-the-experts-2010/</link>
		<comments>http://blog.codecentric.de/en/2010/03/meet-the-experts-2010/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 14:47:47 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[meet the experts]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3240</guid>
		<description><![CDATA[Only available in German.
]]></description>
			<content:encoded><![CDATA[<p>Only available in German.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/03/meet-the-experts-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Robot Framework Acceptance Tests: Develop With Eclipse, Run With Maven</title>
		<link>http://blog.codecentric.de/en/2010/03/robot-framework-fachtests-in-eclipse-entwickeln-und-mit-maven-ausfuhren/</link>
		<comments>http://blog.codecentric.de/en/2010/03/robot-framework-fachtests-in-eclipse-entwickeln-und-mit-maven-ausfuhren/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 12:25:14 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agile Testing]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Robot Framework]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3175</guid>
		<description><![CDATA[The Robot Framework is a very versatile tool and never confronted us with unsolvable problems so far. In some regards it still feels a little rough and needs some polishing, to make development and maintenance of automated tests more efficient. One of those areas is the integration into the well known development environment. There is [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://code.google.com/p/robotframework/">Robot Framework</a> is a very versatile tool and never confronted us with unsolvable problems so far. In some regards it still feels a little rough and needs some polishing, to make development and maintenance of automated tests more efficient. One of those areas is the integration into the well known development environment. There is the <a href="http://code.google.com/p/robotframework-ride">Robot IDE</a>, but this only covers a fraction of my requirements. The following will show, how easily the Robot Framework and your own Java Keywords can be integrated in Maven and Eclipse.<br />
<span id="more-3175"></span><br />
Robot is started with a script, depending on your operating system this is jybot.sh or jybot.bat (when you don&#8217;t use Java Keywords, pybot is enough). With <a href="http://robotframework.googlecode.com/svn/tags/robotframework-2.1.2/doc/userguide/RobotFrameworkUserGuide.html#all-command-line-options">many command line parameters</a> you can control, which tests shall be executed. Before doing so, you want to compile your own keywords and include them into the classpath. Since development is often enough happening on windows, but the continuous integration server is running on Linux, you have two non-trivial scripts to maintain to invoke the robot tests. This can be done much easier:</p>
<h2>1. Maven</h2>
<p>Instead of maintaining a plethora of start scripts manually, you can execute jybot directly from within maven. The following pom.xml shows the details:</p>
<ul>
<li>The <a href="http://maven.apache.org/plugins/maven-dependency-plugin/">maven-dependency-plugin</a> copies all dependant libraries into a folder, which is later included into the classpath. Now you can easily use any third party library.</li>
<li>With the <a href="exec-maven-plugin">exec-maven-plugin</a> you can invoke &#8216;jybot&#8217; in the integration-test lifecycle phase. This requires that jybot is in your PATH of your environment. Luckily, the .sh or .bat can be omitted.</li>
<li>The classpath is configured to<br />
<blockquote><p>${project.build.directory}${file.separator}classes${path.separator}<br />
${project.build.directory}${file.separator}dependency${file.separator}*</p>
</blockquote>
<p>This ensures that it will include</p>
<ol>
<li>The compiled classes of your own Java keywords</li>
<li>All jar libraries that the pom.xml lists as dependency. (The <a href="http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html">wildcard notation</a> is only available with Java 6!)</li>
</ol>
</li>
<li>Afterwards, the jybot script is parametrized:
<ul>
<li><strong>-C off</strong> turns off the colored output</li>
<li><strong>&#8211;variable &#8230;</strong> sets some variables. Developerfriedly defaults are set in the pom.xml&#8217;s properties section. Is the environment variable &#8216;env&#8217; set to &#8216;ci&#8217;, the ci profile will be activated, which changes those variables to make use of the real test system.</li>
<li><strong>&#8211;variable RESOURCES:${project.basedir}/src/main/robot/resource</strong> Setting a RESOURCES variable makes it possible to refer to resources from your testcases simply with ${RESOURCES}/keyword-file.txt.</li>
<li><strong>&#8211;exclude inprogress</strong> Excludes test cases, that are currently in progress. A developer can work on a test case until it is fully working, and can commit parts of his work, without having the test case executed by default. Of course, once the testcase is fully automated and functional, that tag must be deleted..</li>
<li><strong>&#8211;include author-*</strong> In my opinion, all tests should me tagged with an author. This includes all tests that are existing, but also offers an easy way for the developer to limit the test execution to a set of test, that he is currently working on. This could be further improved with maven properties and profiles. There&#8217;s currently a bug in Jython that expands any parameter to matching filenames. (<a href="http://bugs.jython.org/issue1567">Jython Issue 1567</a>) &#8211; so there should be no file that matches author-*!</li>
<li><strong>${ROBOT_TESTS}</strong> This tells robot which tests to execute. By default this refers to all tests in ${project.basedir}/src/main/robot/suite. By using tags and folders you have two independant ways to structure and manage your test cases and select a set for execution. This should be enough flexibility for everybody.</li>
</ul>
</li>
</ul>
<p>On the long term, it would be nicer to have a full-blown maven plugin for the robot framework, in order to save the awkward script parameterization. Until this is done, the presented solution should be sufficient.</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;project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
...
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-dependency-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>get dependencies<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>pre-integration-test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>copy-dependencies<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.codehaus.mojo<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>exec-maven-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.1.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>robot<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>integration-test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>exec<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executable<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>jybot<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executable<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;environmentVariables<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CLASSPATH<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.build.directory}${file.separator}classes${path.separator}${project.build.directory}${file.separator}dependency${file.separator}*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CLASSPATH<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/environmentVariables<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arguments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>-C<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>off<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--variable<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SYSTEM_UNDER_TEST:${system-under-test}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--variable<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>DB_PORT:${db.port}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--variable<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>RESOURCES:${project.basedir}/src/main/robot/resource<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--outputdir<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.build.directory}/robot<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--output<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.groupId}-${project.artifactId}-${project.version}-output.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--log<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.groupId}-${project.artifactId}-${project.version}-log.html<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--report<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.groupId}-${project.artifactId}-${project.version}-report.html<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--exclude<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>inprogress<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>--include<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>author-*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${ROBOT_TESTS}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argument<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/arguments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;profiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;profile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ci-common<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;activation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>env<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ci<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/activation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;db.port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1234<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/db.port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system-under-test<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>testservername<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system-under-test<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/profile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/profiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ROBOT_TESTS<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.basedir}/src/main/robot/suite<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ROBOT_TESTS<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;db.port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4711<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/db.port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system-under-test<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>localhost<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system-under-test<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h2>2. Project Structure</h2>
<p>The above quoted pom.xml results in Eclipse in the depicted project structure below &#8211; either with the <a href="http://m2eclipse.sonatype.org/">m2eclipse</a>-Plugin or by running the eclipse:eclipse goal of the <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">maven-eclipse-plugin</a>.</p>
<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/03/RobotMavenDirectories.png" rel="lightbox"><img src="http://blog.codecentric.de/wp-content/uploads/2010/03/RobotMavenDirectories.png" alt="" title="RobotMavenDirectories" width="297" height="409" class="alignnone size-full wp-image-3177" /></a></p>
<h2>3. Starting Robot</h2>
<p>Executing the automated tests is now just a matter of executing the appropriate maven lifecycle phase:</p>
<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/03/RunConfiguration.png" rel="lightbox"><img src="http://blog.codecentric.de/wp-content/uploads/2010/03/RunConfiguration-300x240.png" alt="" title="RunConfiguration" width="300" height="240" class="alignnone size-medium wp-image-3182" /></a></p>
<h2>4. Selenium Server</h2>
<p>If you test Web UIs with robot, it is nice to integrate also the selenium server as external tool into Eclipse:</p>
<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/03/ExternalTool-SeleniumServer-1.png" rel="lightbox"><img src="http://blog.codecentric.de/wp-content/uploads/2010/03/ExternalTool-SeleniumServer-1-300x240.png" alt="" title="ExternalTool-SeleniumServer-1" width="300" height="240" class="alignnone size-medium wp-image-3181" /></a></p>
<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/03/ExternalTool-SeleniumServer-2.png" rel="lightbox"><img src="http://blog.codecentric.de/wp-content/uploads/2010/03/ExternalTool-SeleniumServer-2-300x240.png" alt="" title="ExternalTool-SeleniumServer-2" width="300" height="240" class="alignnone size-medium wp-image-3180" /></a></p>
<h2>5. Full Workflow</h2>
<p>By means of a concrete Example, a short screen cast should give you an impression, how to develop test cases in eclipse and how to execute them. Since details are hardly seen in the embedded video, there also a <a href='http://blog.codecentric.de/wp-content/uploads/2010/03/Robot_Framework_in_Eclipse_with_Maven.swf'>fullscreen version</a> of it.</p>
<p><object id="scPlayer" width="600" height="364><param name="movie" value="http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/jingswfplayer.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/FirstFrame.jpg&#038;containerwidth=1680&#038;containerheight=1020&#038;content=http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/Robot_Framework_in_Eclipse_with_Maven.swf"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/"></param>  <embed src="http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/jingswfplayer.swf" quality="high" bgcolor="#FFFFFF" width="600" height="364" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/FirstFrame.jpg&#038;containerwidth=1680&#038;containerheight=1020&#038;content=http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/Robot_Framework_in_Eclipse_with_Maven.swf" allowFullScreen="true" base="http://content.screencast.com/users/AndreasEK/folders/Jing/media/411f2e49-c6f3-44ba-b8e7-b6beb312312e/" scale="showall"></embed></object></p></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/03/robot-framework-fachtests-in-eclipse-entwickeln-und-mit-maven-ausfuhren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>codecentric playing at german board game championship</title>
		<link>http://blog.codecentric.de/en/2010/02/codecentric-bei-der-deutschen-brettspielemeisterschaft/</link>
		<comments>http://blog.codecentric.de/en/2010/02/codecentric-bei-der-deutschen-brettspielemeisterschaft/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 21:17:56 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3119</guid>
		<description><![CDATA[&#8220;Dr. codecentric und seine kranken Pfleger&#8221;, (codecentric, M.D. and his sick attendants) the codecentric board game team, Andreas Ebbert-Karroum, Torsten Rodemann, Marc Clemens and Fabian Lange (left to right) competed in Dinslakenhighly motivated for the qualification for the national board game championship this Saturday. After having been quite successful last year at our first attempt, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/02/Dr_codecentric_und_seine_kranken_Pfleger.png" rel="lightbox"><img class="alignright size-full wp-image-3147" style="padding: 10px;" title="Dr_codecentric_und_seine_kranken_Pfleger" src="http://blog.codecentric.de/wp-content/uploads/2010/02/Dr_codecentric_und_seine_kranken_Pfleger.png" alt="" width="297" height="183" /></a>&#8220;Dr. codecentric und seine kranken Pfleger&#8221;, (codecentric, M.D. and his sick attendants) the codecentric board game team, Andreas Ebbert-Karroum, Torsten Rodemann, Marc Clemens and Fabian Lange (left to right) competed in Dinslakenhighly motivated for the qualification for the national board game championship this Saturday. After having been quite successful last year at our first attempt, our expectations were high, despite the lack of proper training.</p>
<p>Every player had to play one round of each of the games: <a href="http://www.amazon.de/gp/product/B0010B5472?ie=UTF8&amp;tag=exfuror&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B0010B5472">Agricola</a>, a pretty complex strategy game, <a href="http://www.amazon.de/gp/product/B0014LETVU?ie=UTF8&amp;tag=exfuror&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B0014LETVU">Stoneage</a>, a round based resource gathering game, <a href="http://www.amazon.de/gp/product/B001EWE4EG?ie=UTF8&amp;tag=exfuror&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B001EWE4EG">Dominion</a>, an interesting card game, in which players compile a custom card deck according to the available cards and their strategy, and <a href="http://www.amazon.de/gp/product/B0007M18XY?ie=UTF8&amp;tag=exfuror&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B0007M18XY">Heckmeck am Bratwurmeck</a>, a pretty simple dice-rolling game, which trains you calculating probabilities.<br />
<span id="more-3119"></span></p>
<ul>
<li> First round of the Tournament, sporting Dominion went really well for our Team. 2 first places and a second one were great. Only one game was lost due to the high amount of curses played by witches.</li>
<li>Agricola strained our nerves for over two hours. It was pretty intense, and we were unable to oppose our co-players, who were well prepared. We tried both, the farmer and rancher strategy, but only achieved a second, 2 third and a fourth place.</li>
<li>After a short snack-break, we had some relaxing dice rolling activities with Heckmeck am Bratwurmeck. But it seems gambling is not our profession. 3 times a fourth place was really sub-par. The other third place could not compensate those losses.</li>
<li>Last game of the day was Stoneage. 3 of us tried the &#8220;starvation&#8221; strategy, which was working fairly well, but only brought us 2 third and a fourth place. The one victory was done with some more mainstream farming and building strategy. Overheard discussions tought us that most players already have overcome &#8220;starvation&#8221; and came up with something better.</li>
</ul>
<p>Despite the not very successful results, we had a fun day! And lots of motivation for the coming year. Perhaps we should then run a board game training bootcamp? <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/codecentric-bei-der-deutschen-brettspielemeisterschaft/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Database Library for the Robot Framework</title>
		<link>http://blog.codecentric.de/en/2010/02/datenbank-testbibliothek-fur-das-robot-framework/</link>
		<comments>http://blog.codecentric.de/en/2010/02/datenbank-testbibliothek-fur-das-robot-framework/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 11:22:20 +0000</pubDate>
		<dc:creator>Thomas Jaspers</dc:creator>
				<category><![CDATA[Agile Testing]]></category>
		<category><![CDATA[Robot Framework]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3117</guid>
		<description><![CDATA[We are using the Robot Framework for quite some time now for our automated acceptance tests with very good results. Personally I am using the Robot Framework already for a bit longer time and I find its fundametal concepts really extremely convincing. The generic test libraries (for example related to testing Selenium or SSH) that [...]]]></description>
			<content:encoded><![CDATA[<p>We are using the <a href="http://code.google.com/p/robotframework/">Robot Framework</a> for quite some time now for our automated acceptance tests with very good results. Personally I am using the Robot Framework already for a bit longer time and I find its fundametal concepts really extremely convincing. The generic test libraries (for example related to testing Selenium or SSH) that are freely available are another strength of the tool. But up to now a generic keyword library for testing databases was <a href="http://code.google.com/p/robotframework/issues/detail?id=82">missing</a>. I think I have written such a library already three times for two different companies, because at the end of the day almost every application is using a database. This means that automated tests should &#8211; at least random &#8211; check if data is properly written to the database. This way an application can be really tested <em>end-to-end</em> .<br />
<span id="more-3117"></span><br />
This was leading to the idea to implement such a generic Database Library as part of the Robot Framework project. I had already collected enough experience <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  and thus the main problem was to find a start with this. Luckily <a href="http://code.google.com">Google Code</a> makes it really easy to start development. And after Pekka encouraging me that it is fine to write such a library using Java, well,  I just started.  </p>
<p>Yesterday evening now the release 1.0 of the <a href="http://code.google.com/p/robotframework-dblibrary/">Database Library</a> was finished and it is of course really great that it is already listed on the <a href="http://code.google.com/p/robotframework/">Robot Framework</a> homepage. As with every project the interesting part starts when people start using it and I am looking forward to feedback for additional features. And with Fabian one of my colleagues joined the project as an additional <em>committer</em>. This way we are well prepared for further development and potential bugfixing.</p>
<p>The implementation of the database-access is based on JDBC, which really feels like an anachronism nowadays as we are used to <a href="https://www.hibernate.org/">Hibernate</a> and <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">JPA</a>. But for this library it fits perfectly fine and the possibility to support different databases by their (class)names makes is very easy to support various different databases. And thanks to <a href="http://hsqldb.org/">HyperSql</a> everything can be perfectly tested using JUnit.</p>
<p>Of course there are already ideas for <a href="http://code.google.com/p/robotframework-dblibrary/issues/list">further development</a>. Here especially the support for the <a href="http://code.google.com/p/robotframework/wiki/RemoteLibrary">Robot Framework Remote Library</a> is very interesting as it allows to distribute the execution of test libraries on different servers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/datenbank-testbibliothek-fur-das-robot-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>(Deutsch) Mitarbeitermotivation einmal anders &#8211; Audi Basis- &amp; Drifttraining</title>
		<link>http://blog.codecentric.de/en/2010/02/mitarbeitermotivation-einmal-anders-audi-basis-drifttraining/</link>
		<comments>http://blog.codecentric.de/en/2010/02/mitarbeitermotivation-einmal-anders-audi-basis-drifttraining/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 15:53:44 +0000</pubDate>
		<dc:creator>Christian Urban</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3091</guid>
		<description><![CDATA[Sorry, this entry is only available in Deutsch .
]]></description>
			<content:encoded><![CDATA[<p>Sorry, this entry is only available in <a href="http://blog.codecentric.de/feed/">Deutsch</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/mitarbeitermotivation-einmal-anders-audi-basis-drifttraining/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Looking forward to the Java Specialist Master Course</title>
		<link>http://blog.codecentric.de/en/2010/02/vorschau-auf-den-java-specialist-master-kurs/</link>
		<comments>http://blog.codecentric.de/en/2010/02/vorschau-auf-den-java-specialist-master-kurs/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 15:25:28 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[specialist master course]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3089</guid>
		<description><![CDATA[I will be attending the course by Dr. Heinz Kabutz next week from 2nd-5th of March in Düsseldorf.
I have pretty high expectations, as I already read his newsletter since quite some time and also my impressions of Heinz, when he gave his talk at our meet the experts, were very positive. He really knows all [...]]]></description>
			<content:encoded><![CDATA[<p>I will be attending the <a href="http://meettheexperts.de/jsp/schulungen/schulungen.jsp">course by Dr. Heinz Kabutz</a> next week from 2nd-5th of March in Düsseldorf.</p>
<p>I have pretty high expectations, as I already read his newsletter since quite some time and also my impressions of Heinz, when he gave his talk at our meet the experts, were very positive. He really knows all the nasty details about Java, and I hope I can get some of those out of his and into my brain. <a href="http://www.javaspecialists.eu/courses/master.jsp">The course promises &#8220;Extreme Java&#8221;</a>. I am looking forward to very esotheric subtleties without any practical value. And of course to many caveates that you indeed would find in everyday work.</p>
<p>I am also looking forward to meeting other Java geeks to exchange knowledge and have a good week. Will you be there?</p>
<p>(note that the course is in German)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/vorschau-auf-den-java-specialist-master-kurs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is there a difference between architecture and design?</title>
		<link>http://blog.codecentric.de/en/2010/02/was-ist-der-unterschied-zwischen-architektur-und-design/</link>
		<comments>http://blog.codecentric.de/en/2010/02/was-ist-der-unterschied-zwischen-architektur-und-design/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 16:05:39 +0000</pubDate>
		<dc:creator>Uwe Friedrichsen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3077</guid>
		<description><![CDATA[Meanwhile, there is a debate for a long time whether architecture and design are the same thing or not. The advocates of the &#8220;both are the same&#8221; thesis say that architecture is basically the first stage of design, while the opponents of this thesis claim that architecture and design are completely different tasks that just [...]]]></description>
			<content:encoded><![CDATA[<p>Meanwhile, there is a debate for a long time whether architecture and design are the same thing or not. The advocates of the &#8220;both are the same&#8221; thesis say that architecture is basically the first stage of design, while the opponents of this thesis claim that architecture and design are completely different tasks that just share some more or less fuzzy line of contact. So, who the heck is right?<span id="more-3077"></span></p>
<p>I think it is really hard to find out who is right or wrong &#8230; actually I think it is sort of impossible. Even within our small company we are not able to get a common agreement about what exactly architecture is and what design is. And if it is not possible to get to an agreement within a few people (even if some of them are strong characters &#8230; <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ), how should we come to an agreement within the whole IT community? It is probably impossible.</p>
<p>Thus, I will not try to find a precise answer for that question. Instead I will try to approach the topic from a different angle. First, why is it so hard to answer the question? I think a big part of the problem is that there is no satisfying definition for both terms available, neither for architecture nor for design. So, whenever you talk with another person about architecture or design you can almost be sure that he or she will talk about something different than you do.</p>
<p>I mean there are *lots* of definitions available but most of them are so specific that they do not capture the topic sufficiently or they are so vague that they do not help at all. Just for instance, Robert Martin (who said and wrote a lot of very smart things, btw) once stated &#8220;Architecture is about the important stuff. Whatever that is.&#8221;. Now, this means everything and nothing. Does it mean that design is about the unimpotant stuff? Probably not. And, if coffee is really important for the developers (which it usually is), does it mean, that architecture is about coffee? Probably not. As you can see this definition does not really help.</p>
<p>I will not go into detail for other definitions because I think it will not lead anywhere. It won&#8217;t be possible to find a definition for architecture and design that everybody will agree upon *and* that will help us to figure out the difference between architecture and design. Especially I think it won&#8217;t be possible to find a clear separating line between architecture and design, where the one thing ends and the other thing starts. Everybody draws his line somewhere else and many people probably rather have some kind of fuzzy cloud in mind instead of a sharp line. &#8220;Somewhere within that cloud architecture stops and design starts&#8221; they will say.</p>
<p>Okay, but there must be something that might help us. At least there should be something &#8230;</p>
<p>Maybe it does help to step away from that question for a moment. From my experience I figured out that there are two basic tasks that make up that whole architecture and design thing (without trying to find the separating line). The whole thing is about transforming all the requirements that are around into a result. (Btw: If you would ask where the coding is in there, I think I would leave it up to you to find the separating line between design and coding; I think it is a similar question &#8230; <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )</p>
<p>The first part of that transformation task is to understand all the requirements (not just the business and user requirements, but also the requirements of the mangement, the project management, the development team, operations, system planning, the security department, the testers, and so on), really understand them, to balance them (there are always conflicting and inconsistent requirements across the different domains and stakeholders to deal with) and to find an appropriate solution idea for all those balanced requirements. I usually call this part of the work &#8220;alignment&#8221;.</p>
<p>The second part of the transformation into a working solution consists of turning the solution idea into an appropriate structure that supports maintainability and changeability, and refine the structure over and over again until you are down at the code level without losing the properties described before. I usually call this part of the work &#8220;structuring&#8221;.</p>
<p>Now, is it important to distinguish those two tasks? I think, yes! The reason for this is that I figured out that those two tasks require very different skills. While alignment has much to do with communication and conflict management skills, structuring requires more formal strengths. Also alignment requires kind of a broad knowledge about all the different requirement domains while structuring requires more of a deep knowledge about the solution domain. As a consequence, you will find quite few persons who are capable (or willing) of doing both tasks with the same strength, and if you neglect one of the two tasks you will most likely get an unsatisfying result.</p>
<p>Okay, getting back to the initial question. Will alignment and structuring help us to find a separating line. I think, sort of &#8230;</p>
<p>From my perspective, alignment is definitely part of any good architecture while structuring is definitely part of any good design. You cannot be a good architect without doing a lot of alignment and you also cannot be a good designer without doing a lot of structuring. How much of structuring is required in architecture and how much of alignment is required in design, I think that is mostly a matter of taste and there won&#8217;t be a definite answer to this.</p>
<p>So, I also cannot provide you with &#8220;the&#8221; answer to the initial question. But I know, if somebody talks about architecture without talking about alignment he does something wrong and if somebody talks about design without talking about structuring he also does something wrong. And that is the most important thing from my point of view &#8230;</p>
<p>PS: My apologies to Robert Martin for picking on his definition of architecture. As I wrote before he said and wrote a lot of really smart things, even though I do not agree with all of them. So, if you have the opportunity to read some of his stuff or listen to a presentation of him, just do it! Now, that should be enough of indemnification &#8230; <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/was-ist-der-unterschied-zwischen-architektur-und-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>OOP 2010 – short travelogue</title>
		<link>http://blog.codecentric.de/en/2010/02/oop-2010-%e2%80%93-ein-kurzer-reisebericht/</link>
		<comments>http://blog.codecentric.de/en/2010/02/oop-2010-%e2%80%93-ein-kurzer-reisebericht/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 15:52:08 +0000</pubDate>
		<dc:creator>Ansgar Fitz</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Konferenz]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=3029</guid>
		<description><![CDATA[(Deutsch) Mit nun ein paar Tagen Abstand möchte kurz über meine Reise zur Konferenz „OOP 2010“ berichten. Die diesjährige Konferenz hat vom 25. - 29. Januar 2010 im International Congress Center (ICM) in München stattgefunden. Ich habe der OOP in diesem Jahr meine erste Aufwartung gemacht. Angelehnt an die IT-Landkarte und den damit verbundenen Reisezielen von Gernot Starke (vergleiche Dr. Gernot Starke - Publikationen) kann ich festhalten, dass meine Tagesausflüge nach Architektionien oder Analytistan sehr viele positive Erfahrungen und Eindrücke hinterlassen haben. Zu den Themen Architektur oder der Beziehung von IT zur (Fach) Domänen, habe ich eine Menge Ideen sowie Erfahrungsberichte  von den dortigen Bewohnern und anderen Reisenden  mitgenommen.]]></description>
			<content:encoded><![CDATA[<p>Englisch version coming soon …</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/en/2010/02/oop-2010-%e2%80%93-ein-kurzer-reisebericht/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
