<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-11485756</id><updated>2009-10-23T01:53:55.750+02:00</updated><title type="text">Thomas Ferris Nicolaisen's blog</title><subtitle type="html">My thoughts on software development. For average agilists.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tfnico.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default?start-index=26&amp;max-results=25" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>143</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/tfnico" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-11485756.post-5113956724922159182</id><published>2009-09-05T18:41:00.005+02:00</published><updated>2009-09-24T20:09:20.807+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><title type="text">Metrics</title><content type="html">The last couple of weeks I've been spending a little effort on getting some code metrics up and running. I've &lt;a href="http://tfnico.blogspot.com/2008/03/wrapping-scrum-in-evolutionary-methods.html"&gt;blogged about measuring in software development before&lt;/a&gt;, and I think code is definitely one of the easiest and most important things to measure.&lt;br /&gt;&lt;p&gt;The most important thing about metrics is that &lt;span style="font-style: italic;"&gt;you monitor them&lt;/span&gt;. I am of the firm belief that if you run a static code-analysis report manually, it will give you very little. Your team will say "wow, we have 3000 FindBugs warnings", fix a couple of them, and then forget about it. Then the next time you run the report, you'll find new bugs that have crept in, with no idea of when or who did it.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are two ways to track these kind of metrics:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;IDE warnings&lt;/li&gt;&lt;li&gt;Continuous integration reports&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;IDE warnings&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Most of you have probably enabled the built-in warning system inside Eclipse (unused method, potential null-pointer, etc). Some of you strive to minimize these numbers of warnings, some of you have perhaps even turned on more than the default warnings in Eclipse. The key practice which I recommend you all adopt is the &lt;em&gt;zero-warning-policy&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;(I couldn't find a good place to quote, so I'll come up with my own definition:)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The zero-warning-policy is a programming practice which states that at any time, the number of &lt;span style="font-weight: bold;"&gt;warnings in a code base should be zero&lt;/span&gt;. With this in place, it is easy to discover and take care of any violations immediately, before commit. Gradually, new warning rules are introduced to the developer's team, and the existing violations are promptly removed, making sure &lt;span style="font-weight: bold;"&gt;the level is back to zero before every commit&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;After some time, you may find that your team has exhausted the IDE's warning policies. At this point you have to introduce plugins to the IDE to facilitate more warnings. Now it gets a bit tricky, cause every team member needs to have the same IDE configuration.&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;Continuous integration reports&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This approach works fine in coalition with the IDE warnings. The clue is to implement the warning policies into your CI-server. Some teams practice zero-warning-policies also here, the strictest variety would be that any violation will actually break the build. This is a good way to enforce zero warnings, but can be a bit too strict for most teams.&lt;br /&gt;&lt;br /&gt;There are two strengths of CI reports: Firstly, they are centralized, so there's no need for the team members to set up any configuration or plugins. Secondly, they can track metrics &lt;span style="font-style: italic;"&gt;historically&lt;/span&gt;, so you can see from day to day whether the number of violations are decreasing or increasing.&lt;br /&gt;&lt;br /&gt;Historical data is a good substitute for the zero-warning policy. You may have 1000 violations in your code-base, but the key is to discover &lt;span style="font-style: italic;"&gt;when new ones are introduced&lt;/span&gt;, and catch the violating developer in the act of producing bad code.&lt;br /&gt;&lt;br /&gt;It is also interesting to track metrics over time to see whether coding practices have any effect on the quality of the code. Did introducing pair-programming/commit-mails/TDD lead to fewer violations? Now you have proof.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:180%;"&gt;The landscape of metrics&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now that we have some motivation for putting code metrics into play, which tools should we use? There is a number of alternatives, both commercial and open source. Googling around will probably set you in the right direction, but here are my experiences:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Which reporting tools?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I like to divide into a families of metrics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Test coverage: &lt;a href="http://www.crap4j.org/"&gt;Crap4J&lt;/a&gt;, &lt;a href="http://www.atlassian.com/software/clover/"&gt;Clover&lt;/a&gt; (commercial), &lt;a href="http://cobertura.sourceforge.net/"&gt;Cobertura&lt;/a&gt; and &lt;a href="http://emma.sourceforge.net/"&gt;Emma&lt;/a&gt;. These tools also usually include some notion of complexity (execution paths), as coverage is a product of complexity.&lt;/li&gt;&lt;li&gt;Code style: &lt;a href="http://checkstyle.sourceforge.net/"&gt;CheckStyle&lt;/a&gt;, &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Duplication: &lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;Simian&lt;/a&gt; (commercial), &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Static code analysis: &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt;, &lt;a href="http://www.kclee.de/clemens/java/javancss/"&gt;JavaNCSS&lt;/a&gt;, &lt;a href="http://clarkware.com/software/JDepend.html"&gt;JDepend&lt;/a&gt;, &lt;a href="http://martyandrews.net/resources/complexian.html"&gt;Complexian&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;We played around with these tools, and found that the best combination for us now was JavaNCSS, FindBugs and PMD. We still haven't got enough test coverage to even bother measuring how low it is, unfortunately.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Which IDE?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both Eclipse and IDEA have a good number of built-in warning policies, and most of the tools above come as plugins for both.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ant or Maven?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most of the tools above come as either Maven-reports or Ant tasks. Even though I'm a big Maven fan, I found it to be quite easy to set up all the tools with Ant. The &lt;a href="http://www.panopticode.org/"&gt;Panopticode&lt;/a&gt; project, which aims to provide a number of metrics into one easy setup helped me a lot with finding the way to structure this into our existing Ant project. If you've got a Maven project, introducing a report should be as easy as five lines of XML in your pom.xml.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;Which CI-server?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I've been using &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; for so long now that I didn't bother with trying out anything else, but I'm guessing that none of the other products come close to Hudson in the number of tools supported by &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Plugins#Plugins-Buildreports"&gt;plugins&lt;/a&gt;. If I did have the money for &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Atlassian's Bamboo&lt;/a&gt;, I would definitely give the Bamboo + Clover mix a run.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Run it nightly&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finally, I found it best to not run these metrics after every commit. They take too long, and nobody inspects the changes in number of warnings from build to build. Instead, we run metrics nightly, so every morning we can see that there are X more/fewer violations in the code base. I'm really happy with how well it ended up working, and I hope this lends some inspiration for you to try the same.&lt;br /&gt;&lt;br /&gt;Happy measuring!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5113956724922159182?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=D3AopAeJ7AU:pZh1pHrTZK8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=D3AopAeJ7AU:pZh1pHrTZK8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/D3AopAeJ7AU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/5113956724922159182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=5113956724922159182" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5113956724922159182" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5113956724922159182" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/D3AopAeJ7AU/metrics.html" title="Metrics" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/09/metrics.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-8396768362251922095</id><published>2009-04-26T19:24:00.005+02:00</published><updated>2009-05-15T23:55:27.090+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title type="text">Reason 3: Don't build everything all the time</title><content type="html">&lt;span style="font-style: italic;"&gt;This post is a part of a tiny series I'm doing on why we use Maven, and you should too.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Previous posts:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/maven-infrastructure-part-1.html"&gt;Introduction: Why you should use Maven&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/reason-1-get-your-libs-folder-out-of.html"&gt;Reason 1: Get your libs-folder out of SVN&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/reason-2-clean-up-your-jar-files.html"&gt;Reason 2: Clean up your JAR-files&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Huge projects are hard to work with&lt;/span&gt;&lt;br /&gt;Many projects that have grown over time will become too large to easily work with. The workspace gets too many classes, the IDE slows down and the build takes too long. If the developers focus on separating the concerns of the classes into packages of functionality, these packages can be organized into modules. As the contract and concern of a module becomes more defined, its rate of change will fall to a lower frequency than the rest of the project.&lt;br /&gt;&lt;br /&gt;Once a module's activity has slowed down sufficiently, you can retire it into an external project, build a JAR-file from it and use this ready-built artifact as a classpath element for building and running the software instead. If changes occur later on, you can re-build the JAR-file.&lt;br /&gt;&lt;br /&gt;Examples on where this might be appropriate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Low level libraries and utilities, much like Java's own java.util package only changes every other year or so.&lt;/li&gt;&lt;li&gt;Contracts or adapters around external services, because integration with 3rd parties require stable data-formats.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;What Maven does&lt;/span&gt;&lt;br /&gt;Maven eases the work of maintaining such dependencies. As projects "subscribe" to their dependencies, they pull in the latest appropriate JAR-files automatically (snapshots) or by choice of versioned artifact. In an environment with a continuous integration server and a maven repository, the library developers need only commit their changes, and the artifact will be automatically built, deployed, and pulled into the depending project. A good term to describe this setup is &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Enterprise+Maven+Infrastructure"&gt;Enterprise Maven Infrastructure (see this link for more information on how to actually implement this)&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Again, understand that it is better to &lt;span style="font-weight: bold;"&gt;subscribe &lt;/span&gt;to your dependencies than to &lt;span style="font-weight: bold;"&gt;push &lt;/span&gt;them in&lt;/span&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Library developers do not have to deploy their artifacts to all clients&lt;/li&gt;&lt;li&gt;Clients keep the control of which libraries they use, in which version&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Easier to maintain transitive dependencies (&lt;a href="http://tfnico.blogspot.com/2009/04/reason-2-clean-up-your-jar-files.html"&gt;see my previous post&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Getting newer versions is easy&lt;/li&gt;&lt;/ul&gt;Just to clarify the last point: When you want a new version of a library, you change the version number in the &lt;span style="font-weight: bold;"&gt;pom.xml&lt;/span&gt;. If you want the latest/greatest build (handy for an adjacent project, or a library under heavy development), you make it a snapshot version number, and suck in the latest JAR file from your maven repository on every build.&lt;br /&gt;&lt;br /&gt;I could go on on how bad it is to work on a project with a single huge build, but I imagine most developers out there are either struggling with it right now, or have done so some time in the past. There are many reasons why you want to break out modules of your project for architectural and code-design/quality reasons, but in this post I chose just to focus on the basic reasons. I came across one video from SonaType that illustrates this situation very well, so if you didn't &lt;span style="font-style: italic;"&gt;get it&lt;/span&gt; from reading this post, please &lt;a href="http://www.vimeo.com/2985451"&gt;take a look at it&lt;/a&gt; (although the fancy staging functionality of Nexus is not that important, nor the point of this post).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8396768362251922095?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=BGo3q_QGQ30:K2uhIVS_Q8o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=BGo3q_QGQ30:K2uhIVS_Q8o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/BGo3q_QGQ30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/8396768362251922095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=8396768362251922095" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8396768362251922095" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8396768362251922095" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/BGo3q_QGQ30/reason-3-dont-build-everything-all-time.html" title="Reason 3: Don't build everything all the time" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/04/reason-3-dont-build-everything-all-time.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-5825761848650663119</id><published>2009-04-13T01:50:00.002+02:00</published><updated>2009-04-13T21:05:00.202+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title type="text">Reason 2: Clean up your JAR-files</title><content type="html">&lt;span style="font-style: italic;"&gt;Update: Added a summary section at the end of this post.&lt;br /&gt;&lt;br /&gt;This post is a part of a tiny series I'm doing on why we use Maven, and you should too.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Previous posts:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/maven-infrastructure-part-1.html"&gt;Introduction: Why you should use Maven&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/reason-1-get-your-libs-folder-out-of.html"&gt;Reason 1: Get your libs-folder out of SVN&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Some background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Back a couple of months, I got the rewarding task of cleaning up our project's lib folder. You know the one: Crammed with JAR-files of various versions of the various dependencies your project has..&lt;br /&gt;&lt;pre&gt;fizz-project&lt;br /&gt;\&lt;br /&gt;fizz-core&lt;br /&gt;fizz-web&lt;br /&gt;fizz-libs&lt;br /&gt; \&lt;br /&gt;   junit.jar&lt;br /&gt;   spring.jar&lt;br /&gt;   common.jar&lt;br /&gt;   lots and lots of others...&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yup, good old &lt;span style="font-style: italic;"&gt;fizz-libs&lt;/span&gt;. It needs to be regularly cleaned up &lt;a href="http://techdistrict.kirkk.com/2009/04/06/software-rot-manage-those-dependencies/"&gt;to reduce software rot&lt;/a&gt;. Over time, the developers try out new open source libraries and remove the use of old ones, but they seldom take care to clean out the libs-folder, because they don't know if there could be any hidden effects from removing JAR files.&lt;br /&gt;&lt;br /&gt;Now, at our place we use Eclipse's .&lt;span style="font-style: italic;"&gt;classpath &lt;/span&gt;file for specifying each module's dependencies. &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Each module is explicitly configured with which JAR-files (within fizz-libs) it depends on.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Unfortunately, Eclipse's .classpath file does not support any automatic reporting for analyzing and discovery of unused JAR-files.  So I grabbed &lt;a href="http://www.kirkk.com/main/Main/JarAnalyzer"&gt;Jar Analyzer&lt;/a&gt; and set it loose on our libs folder (by the way, the author of the tool, Kirk, has a &lt;a href="http://techdistrict.kirkk.com/"&gt;blog&lt;/a&gt; full of good thoughts on &lt;a href="http://techdistrict.kirkk.com/2009/01/07/jar-design-over-class-design/"&gt;JAR-design&lt;/a&gt;, lately taking a humanly readable take on OSGi, recommended).&lt;br /&gt;&lt;br /&gt;Jar Analyzer scans for compile dependencies, meaning that it can create a tree of which JAR-files are needed to compile which JAR-files that are needed to compile these JAR-files, and so on. You get a very nice report/graph which shows you all the JAR-files and why they are in there.&lt;br /&gt;&lt;br /&gt;You can also see the JAR-files that don't have any connection to your code, remove them and their children. What I found in our libs folder was that about 20% of the 150 JAR files in our libs folder were unused at compile time, and these were potential JARs to be removed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The big &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;aber &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;is that you don't get any hint on which JAR-files are used only at runtime by means of discovery and reflection. And this is where the real work begins.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The only way to find out whether a JAR file is used at runtime is basically to take it out, start up your application and test every functionality. If you have an application of moderate size, performing a 100% regression test takes many hours. So in practice, I ended up doing alot of guessing, quick and dirty testing, and asking around to find out which of the runtime dependencies were actually in use.&lt;br /&gt;&lt;br /&gt;In the end, after two days of researching and testing, I ended up removing half of the compile-time-unused dependencies, crossing my fingers I didn't break anything in the process (which I did anyway).&lt;br /&gt;&lt;br /&gt;The experience left something to be desired in the way we define dependencies: Eclipse's .classpath file simply does not allow you to express how and why which dependencies are in your project. You need something else: A tool that can &lt;span style="font-weight: bold;"&gt;define &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;scope, version and transitivity&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; of dependencies&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;Scope&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The total classpath for our running application is expressed in a &lt;span style="font-style: italic;"&gt;dependencies&lt;/span&gt; module, which is an Eclipse project that solely exists to be used by Ant to build up which JAR-files should be part of our deployable WAR-file.&lt;br /&gt;&lt;br /&gt;This &lt;span style="font-style: italic;"&gt;dependencies &lt;/span&gt;module is alot like our &lt;span style="font-style: italic;"&gt;web&lt;/span&gt; module, but it excludes references to JAR-files which are already available in the runtime of our application server. You could say that these JAR-files belong to a certain &lt;span style="font-style: italic;"&gt;scope&lt;/span&gt;: they are not needed at compile time, and they're not needed at testing-time. &lt;span style="font-weight: bold;"&gt;Their scope is limited to runtime&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Another scope we often talk about is &lt;span style="font-style: italic;"&gt;testing. &lt;/span&gt;These JAR-files are only needed for running and compiling tests. JUnit and mocking toolkits are typical examples. A good reason for keeping JAR-files with this scope seperate is that you do not want these JAR-files deployed along with the rest of your application.&lt;br /&gt;&lt;br /&gt;So,  let's take another look at our libs folder:&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;   fizz-libs&lt;br /&gt; \&lt;br /&gt;   junit.jar  (test scope)&lt;br /&gt;   mock.jar   (test scope)&lt;br /&gt;   spring.jar (compile scope)&lt;br /&gt;   common.jar (compile scope)&lt;br /&gt;   jboss.jar  (runtime dependency)&lt;/pre&gt; So of these, only spring.jar and common.jar need to be brought along when we are deploying.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instead of hacking together a special deploy-classpath configuration for Ant, Maven does exactly this when building WAR-files out of the box&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Transitive dependencies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let us take a look at a couple of our modules (mea:&lt;br /&gt;&lt;pre&gt;fizz-project&lt;br /&gt;\&lt;br /&gt;fizz-core&lt;br /&gt;fizz-web&lt;br /&gt;&lt;/pre&gt;If &lt;span style="font-style: italic;"&gt;fizz-web &lt;/span&gt;depends on &lt;span style="font-style: italic;"&gt;fizz-core&lt;/span&gt;, and &lt;span style="font-style: italic;"&gt;fizz-core &lt;/span&gt;depends on spring.jar for compilation, you can be pretty sure that &lt;span style="font-style: italic;"&gt;fizz-web &lt;/span&gt;also depends on spring.jar indirectly. We say that &lt;span style="font-style: italic;"&gt;fizz-web &lt;/span&gt;has a &lt;span style="font-weight: bold;"&gt;transitive dependence &lt;/span&gt;to spring.jar, or spring.jar is &lt;span style="font-weight: bold;"&gt;a transitive dependency&lt;/span&gt; of fizz-web.&lt;br /&gt;&lt;br /&gt;In these terms, all dependencies in Eclipse are non-transitive until they are configured as being exported. This is the nearest thing Eclipse gets to having scoping on its dependencies.&lt;br /&gt;&lt;br /&gt;Naturally, keeping track of transitive dependencies is imperative. Lack of control on this leads to missing class definitions at runtime, as well as unneeded JAR-files in your lib-folder that need to be cleaned up periodically (like I did).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Versions on dependencies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, add into this mix that spring.jar also depends on other JAR-files again, perhaps apache-commons or something else. And then you have to remember that you need to know which versions of these 3rd party library depends on which versions of their transitive deps, and&lt;br /&gt;so on. This problem is expressed pretty well by Jason Van Zyl in his blog post &lt;a href="http://blogs.codehaus.org/projects/maven/archives/001052_why_maven_uses_jar_names_with_versions.html"&gt;Why Maven uses JAR names with versions&lt;/a&gt;, so I'm not going to write more on it right here. Basically, having an explicit notion of which version is an important part of controlling your dependencies.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Summary: Keeping order in your dependencies is easier with Maven&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Since Maven makes us express the dependencies, their versions and their scope in the POM, an XML file dedicated to this purpose, we have a much easier task of maintaining our JAR-files. The easiest way to show this is to demonstrate the &lt;a href="http://maven.apache.org/plugins/maven-dependency-plugin/"&gt;maven-dependency-plugin&lt;/a&gt; on a tiny example application I had lying around:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[INFO] [dependency:analyze]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING] Used undeclared dependencies found:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING]    com.opensymphony:xwork:jar:2.0.4:compile&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING] Unused declared dependencies found:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING]    org.springframework:spring-mock:jar:2.0.5:test&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING]    org.springframework:spring-core:jar:2.0.5:test&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING]    javax.servlet:servlet-api:jar:2.4:provided&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[WARNING]    javax.servlet:jsp-api:jar:2.0:provided&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The result of running mvn dependency:analyze is a report saying:&lt;br /&gt;&lt;br /&gt; (a) which dependencies this project has that are unused (and can be removed),&lt;br /&gt; (b) which dependencies this project has that are used at runtime, and&lt;br /&gt; (c) which undeclared transitive dependencies are sucked in, but not declared in the pom.xml as it should be.&lt;br /&gt;&lt;br /&gt;This is all the information I need to do the cleanup I spent two days on (given that all dependencies are &lt;span style="font-weight: bold;"&gt;correctly&lt;/span&gt; configured in our project).&lt;br /&gt;&lt;br /&gt;I hope next time I'll be able to express why it's a good thing to publish/subscribe dependencies instead of pushing them into projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5825761848650663119?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=-PnJzyTx9cI:xKfABi7TbCc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=-PnJzyTx9cI:xKfABi7TbCc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/-PnJzyTx9cI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/5825761848650663119/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=5825761848650663119" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5825761848650663119" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5825761848650663119" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/-PnJzyTx9cI/reason-2-clean-up-your-jar-files.html" title="Reason 2: Clean up your JAR-files" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/04/reason-2-clean-up-your-jar-files.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-150077858105099432</id><published>2009-04-13T00:09:00.004+02:00</published><updated>2009-08-10T18:46:30.810+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title type="text">Reason 1: Get your libs-folder out of SVN</title><content type="html">&lt;span style="font-style: italic;"&gt;This post is a part of a tiny series I'm doing on why we use Maven, and you should too.&lt;br /&gt;&lt;br /&gt;Previous posts:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;&lt;a href="http://tfnico.blogspot.com/2009/04/maven-infrastructure-part-1.html"&gt;Introduction: Why you should use Maven&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-size:130%;"&gt;&lt;br /&gt;The libs folder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have a &lt;span style="font-weight: bold;"&gt;libs-module &lt;/span&gt;in Subversion. When you check out the source code for our main product, this is one of the modules you get. It contains a hundred-and-some JAR-files. These are the dependencies for the sum of our modules:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fizz-project&lt;br /&gt;\&lt;br /&gt; fizz-core&lt;br /&gt; fizz-web&lt;br /&gt; fizz-libs&lt;br /&gt;   \&lt;br /&gt;     junit.jar&lt;br /&gt;     spring.jar&lt;br /&gt;     common.jar&lt;br /&gt;&lt;/pre&gt;Downloading all these MB's of JAR files is something you'll have to do no matter which build system you use, so bandwith cost isn't an argument. Subversion also uses binary diffs, so copying or changing a JAR file doesn't increase repository size significantly.&lt;br /&gt;&lt;br /&gt;The problem arises when you want more than one product. As soon as you want to split your product into two applications (or services), each project needs &lt;span style="font-weight: bold;"&gt;its own libs-folder&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fizz-project&lt;br /&gt;\&lt;br /&gt; fizz-core&lt;br /&gt; fizz-web&lt;br /&gt; fizz-libs&lt;br /&gt;   \&lt;br /&gt;     junit.jar&lt;br /&gt;     spring.jar&lt;br /&gt;     common.jar&lt;br /&gt;woop-project&lt;br /&gt;\&lt;br /&gt; woop-core&lt;br /&gt; woop-web&lt;br /&gt; woop-libs&lt;br /&gt;   \&lt;br /&gt;     junit.jar&lt;br /&gt;     spring.jar&lt;br /&gt;     common.jar&lt;br /&gt;&lt;/pre&gt; By doing this, we almost efficiently duplicate our dependencies. While each project can manage its own dependencies without fearing for breaking functionality in the other project, efforts to maintain the libs is duplicated. All upgrading, figuring out bugs, transitive dependencies will have to be done in two places.&lt;br /&gt;&lt;br /&gt;The alternative is to introduce &lt;span style="font-weight: bold;"&gt;a global libs&lt;/span&gt; folder:&lt;br /&gt;&lt;pre&gt;fizz-project&lt;br /&gt;\&lt;br /&gt; fizz-core&lt;br /&gt; fizz-web&lt;br /&gt;woop-project&lt;br /&gt;\&lt;br /&gt; woop-core&lt;br /&gt; woop-web&lt;br /&gt;global-libs&lt;br /&gt;\&lt;br /&gt; junit.jar&lt;br /&gt; spring.jar&lt;br /&gt; common.jar&lt;br /&gt;&lt;/pre&gt;... but unfortunately this would over time become a giant heap of libs of different JAR files in different versions, and for even the tiniest project you would need to check out the entire global-libs folder. Because you have no hard linking to which project a lib belongs, you can not actively do cleanups and get rid of unused JARs. Over time, it would grow to be hundreds of MB, perhaps even GB, containing every JAR file of very version all the products of the company ever used.&lt;br /&gt;&lt;br /&gt;So neither of these approaches are particularly tasty for an organization with a large codebase and number of projects. The first approach enforces all-source-code-in-one-build with &lt;span style="font-weight: bold;"&gt;one gigantic sluggish workspace&lt;/span&gt; in your Eclipse, while the second enforces &lt;span style="font-weight: bold;"&gt;one gigantic global-libs &lt;/span&gt;JAR folder that everyone hates to download and deal with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Maven's solution to this&lt;/span&gt;: There is one global &lt;a href="http://maven.apache.org/repository-management.html"&gt;JAR-repository&lt;/a&gt; like in the second approach, but download is done &lt;span style="font-weight: bold;"&gt;lazily&lt;/span&gt;. Each project has meta-data for which JAR-files it needs, and only upon building a particular project are the needed JAR-files downloaded from the company JAR-repository. Also, JAR-files are cached and referenced in a local Maven repository on each machine, so if you are working on three projects that use junit3.jar, you only have one junit3.jar in your ~/.m2/repository directory.&lt;br /&gt;&lt;br /&gt;Additionally, Maven support inheriting dependency management. You can define parent projects that define dependencies, and have different projects inherit these.&lt;br /&gt;&lt;br /&gt;This post is already long enough for publishing, so I'll continue next week with &lt;a href="http://tfnico.blogspot.com/2009/04/reason-2-clean-up-your-jar-files.html"&gt;Reason 2: Clean up your &lt;span style="font-style: italic;"&gt;JAR-files&lt;/span&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-150077858105099432?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=92La6bup4JY:W936od1pHTg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=92La6bup4JY:W936od1pHTg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/92La6bup4JY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/150077858105099432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=150077858105099432" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/150077858105099432" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/150077858105099432" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/92La6bup4JY/reason-1-get-your-libs-folder-out-of.html" title="Reason 1: Get your libs-folder out of SVN" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/04/reason-1-get-your-libs-folder-out-of.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-8918197232480051406</id><published>2009-04-05T22:39:00.005+02:00</published><updated>2009-04-13T01:53:11.610+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title type="text">Why you should use Maven</title><content type="html">&lt;span style="font-style: italic;"&gt;Update: I'm doing some work to split this blog post into some more fine grained posts in a series. Please, bear with me if these changes are giving you lots of noise in your feed-reader.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I used to work as a consultant. My job was to improve our clients' ways of software development. Among the most important things I tried to teach them were:&lt;br /&gt;&lt;br /&gt;o Good code style and object orientation&lt;br /&gt;o Practical use of good open source tools (don't re-invent the wheel)&lt;br /&gt;o Automating tests of their software, and continuous integration&lt;br /&gt;o Splitting code into modules, dependency-relationships and versions&lt;br /&gt;&lt;br /&gt;The last point is perhaps the trickiest. It's hard to understand why it's needed in an isolated project, it is hard to explain how it should be done, and most importantly, &lt;span style="font-style: italic;"&gt;there is no de-facto way or standard for managing modules, their relationships, versions and scope&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This is why me and my consultant buddies embraced &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; many years ago. After years of pushing and evangelizing at our clients', presentations at &lt;a href="http://java.no/"&gt;javaBin&lt;/a&gt; and &lt;a href="http://www.java.no/javazone/"&gt;JavaZone&lt;/a&gt;, Maven has at least become the way for managing and building Norwegian Java projects. There are still old Ant projects around, but I haven't heard of any new ones being started without Maven, or any old projects where a Ant/Maven migration path hasn't been thought of.&lt;br /&gt;&lt;br /&gt;Here at IP Labs we still have an Ant build for our main project, and &lt;span style="font-weight: bold;"&gt;it &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;works&lt;/span&gt;. (We have also started using Maven for a bunch of ad-hoc projects). There is a small, co-located and tightly communicating Java team that all use Eclipse with identical setup. In order to build our product, you check it out of Subversion and run "ant build-all", and that runs pretty similar to your average "mvn install": compiling, running tests and building binaries.&lt;br /&gt;&lt;br /&gt;So here's the million dollar question: &lt;span style="font-style: italic;"&gt;When our build system works perfectly fine, why should we go to the trouble of converting to Maven?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And instead of answering with some fluffy modular design theory, let me get hands-on, and give some real practical reasons in these following blog-posts. The first one is &lt;a href="http://tfnico.blogspot.com/2009/04/reason-1-get-your-libs-folder-out-of.html"&gt;Reason 1: Get your libs-folder out of SVN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8918197232480051406?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=wNdc0PLIlhY:lOTkitGSDFo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=wNdc0PLIlhY:lOTkitGSDFo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/wNdc0PLIlhY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/8918197232480051406/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=8918197232480051406" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8918197232480051406" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8918197232480051406" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/wNdc0PLIlhY/maven-infrastructure-part-1.html" title="Why you should use Maven" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/04/maven-infrastructure-part-1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-2519773764572065274</id><published>2009-03-15T17:05:00.003+01:00</published><updated>2009-03-15T17:49:20.255+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><category scheme="http://www.blogger.com/atom/ns#" term="iplabs" /><title type="text">Initializing Scrum</title><content type="html">&lt;div style="text-align: left;"&gt;After I began working at my new workplace, I've been gently pushing Agile here and there. We've been brainstorming how we can get agile working for our people, and so far we've adopted a few patterns and practices, but putting those plans into action has taken some time. Originally I hoped that things would go very quickly, but agile is about people, and people are hard to change.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Getting better, always.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have a product that works really well, and pretty much all of the developers are happy. (Generally speaking, this state can be dangerous for a business. There is a danger of falling asleep, one day waking up to see that your competitors have gotten a good hold of your customers, with a better product and better marketing.) Having an environment that strives for improvement is a critical part of persisting success. And striving for improvement, well, that's what agile is.&lt;br /&gt;&lt;br /&gt;Luckily, our team of developers do a lot of activities in the hunt for technological improvement. There is &lt;span style="font-weight: bold;"&gt;a team of architects&lt;/span&gt; (and by that I mean hands-on hard-core, coding Java gurus) that work across the other developers, singling out targets for refactoring and other improvements. Another practice I really dig is &lt;span style="font-weight: bold;"&gt;the weekly Java-team meeting&lt;/span&gt;, where one of the developer present a subject either on good programming practice, new tool/feature, or explaining a certain part of our domain model.&lt;br /&gt;&lt;br /&gt;As well as pushing for technical excellence, we also want to &lt;span style="font-style: italic;"&gt;push for process excellence&lt;/span&gt;. We want to give accurate estimates, we want to deliver fast, and we want to deliver the stuff that is most important first. This is where I (and the people who hired me) figured that Scrum would be a good try, but before I explain how the first week of scrumming has gone, I need to explain a little more about our team.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Who does what?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We've got nearly twenty developers working on our product (there are other teams in the company, but we're an independent gang for the most part). In this product there are many families of functionality, and there is no clear designation of which developer does which functionality. There is a lot of &lt;span style="font-style: italic;"&gt;tacit knowledge&lt;/span&gt; on who does what: "Bob did a lot of work on the fizzerburpilator", or "Bill wrote the shackalock-editor, and occasionally does some maintenance on it" (features are given fantasy names for non-disclosure reasons).&lt;br /&gt;&lt;br /&gt;Understandably, it is a bit fustrating for our customer-contacts to ask for new features, because often &lt;span style="font-weight: bold;"&gt;(a)&lt;/span&gt; they don't know which developer can do it, &lt;span style="font-weight: bold;"&gt;(b)&lt;/span&gt; the chief architect is too busy to spend time managing the tasks of every single developer, and &lt;span style="font-weight: bold;"&gt;(c)&lt;/span&gt; the developer who knows how to make the new feature is busy doing other critical stuff.&lt;br /&gt;&lt;br /&gt;The solution to this frustration seems pretty clear: Organize into sub-teams, preferably &lt;a href="http://www.infoq.com/articles/scaling-lean-agile-feature-teams"&gt;by feature&lt;/a&gt;. However, we can't just jump right in and do a full-blown re-organization, we have to be careful about it, and we have been waiting for a fitting opportunity to try this out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Taking Scrum for a spin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, recently we had a big customer come to us with a feature request, let's call it "&lt;span style="font-weight: bold;"&gt;fizzburp hickup&lt;/span&gt;". It is a bit too big for one developer to do by himself, and there are some architectural challenges which would probably require a weighed consensus of developer opinions rather than the brilliant idea of a single programmer. The scope and definition of "fizzburp hickup" are pretty well described, and we have an ample time-frame, so we figured that this would be the perfect opportunity to try out Scrum with a small team of developers, called Team Espresso. If the experiment goes well, Team Espresso can continue existing after their feature has been developed, keep on maintaining it and adopting some other features as well.&lt;br /&gt;&lt;br /&gt;The first sprint got scheduled to start this Monday. I knew that boiling up the &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Backlog"&gt;backlog&lt;/a&gt; for the team would eat up alot of time, so I started the week before by chipping the requirement spec into &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/User+Stories"&gt;user stories&lt;/a&gt;, using the customer-contact for verifying that I had gotten a good understanding of the domain, and also tried out &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/User+Story+Mapping"&gt;User Story Mapping&lt;/a&gt; for the first time. I ran through the story cards with our chief architect and got a first-impression of estimates. Getting him to put estimates on user-features instead of architectural components was &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; hard, but in the end we came through with a rough estimate of the backlog-effort. We used 'tricky points' as our &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Gummy+Bears"&gt;unit of estimation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We then had half-a-day "kick-off" with the customer-contact and architects. First we went through the requirement spec and had the customer-contact (who unfortunately went on vacation and was represented by the, erm, chief architect) communicate the motivation for the new features. Naturally, the focus went technical early on, but I've been assured that there has already been so much communication with the customer on the "fizzburp hickup" already, that we shouldn't need any more input from them for the time being. Hmmm!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Sprint planning&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After the kick-off, we gathered the team around the story map to do estimation and commitment to the first sprint (one week!). Naturally, the team zoomed down into technical discussion on every other story card (which is a good thing!). We discovered a good few open technical and functional questions that we would have to take back to the architects and customer-contacts. I thought this process was very fruitful, because we were finding challenges early that we would have to face sooner or later.&lt;br /&gt;&lt;br /&gt;However, in the rest of the team there was a feeling of "let's just go and get started it", while I was forcing them to put tricky points on the user stories, and again it proved difficult to get them estimating features instead of technical components. Their point (as I understood it) was that in the end, we would have to deliver the same functionality anyway, and thinking in user-stories instead of components would only disturb our estimation thinking and architecture plans. That actually was a good point. My reply was "do all the architectural consideration you want to, but leave the story cards", in other words: bear with me on this. Finally, we committed to our first sprint, choosing three stories summing up to 30 tricky points.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;And off we go!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On the first day of the sprint, I tried to get the team breaking the three stories down into tasks with hourly estimates. This proved even more difficult. I was inflicting even more Scrum overhead on a team which wanted to get to work. The point of breaking backlog items into tasks is to get a picture of remaining hours for sprint burndown, as well as assigning tasks to point person. Does this need to be explicitly done in such a small team for such a small project? I think so, because for a practiced team this overhead is virtually nothing. For my team in this sprint, however, we let it go.&lt;br /&gt;&lt;br /&gt;Halfway through the sprint, the team got a bit nervous about delivering/presenting the result to the customer. Showing off that little progress would only anger and confuse the customer, making them come up with a burdening set of detailed requirements to "speed us up". So we extended our sprint to last two weeks instead of one.&lt;br /&gt;&lt;br /&gt;We also changed around the planned story items. The architects found the time to do some smart fixes that allowed us to grab and do some of the more important user stories off the backlog.&lt;br /&gt;&lt;br /&gt;At the end of the sprint now on friday, we had completed only one of the three committed stories, plus one extra because of the architecture fix. We had made alot of progress on the other items, but not completed them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Retrospective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, in order to help us reflect on how we should continue in the next sprint, let us sum up what practices we have tried and given up:&lt;br /&gt;&lt;br /&gt;* &lt;a style="font-weight: bold;" href="http://wiki.community.objectware.no/display/smidigtonull/Daily+Standup+meeting"&gt;Daily standup&lt;/a&gt; - stopped this, because we are already doing daily standup with the rest of the developers (I might write a post about how it was to get people adopting daily standup later).&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Story planning&lt;/span&gt;, we will continue this, although we are aware that it doesn't give us &lt;span style="font-style: italic;"&gt;that much&lt;/span&gt; value without an on-site customer.&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Task tracking&lt;/span&gt; - stop this, too much overhead for such a small scope.&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;One week sprints&lt;/span&gt; - go over to two week sprints instead.&lt;br /&gt;&lt;br /&gt;I hope that we will be able to resume some of these, the 1-week-sprint in particular. There is a big organizational challenge which is making it difficult for us, and that is a quite common one in organizations adopting Scrum: &lt;span style="font-style: italic;"&gt;We are part of two teams&lt;/span&gt;: On the one hand, we are Team Espresso, an agile group dedicated to deliver the "fizzburp hickup" functionality. On the other hand, we are part of the larger developer team, supporting and maintaining all the bits and pieces of our software, getting ready for our coming release ("fizzburp" is scheduled to be released in the next one after this one). Juggling these two on an hourly basis is proving quite difficult for the team.&lt;br /&gt;&lt;br /&gt;I'll try to post back with an update after the next sprint. It could be that my expectations for how smoothly this would go were a bit too high, but hopefully I will be able to post back with a bit more uplifting results by then.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-2519773764572065274?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=49Tv0KSaaZ0:r9kVogK3dBI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=49Tv0KSaaZ0:r9kVogK3dBI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/49Tv0KSaaZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/2519773764572065274/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=2519773764572065274" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2519773764572065274" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2519773764572065274" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/49Tv0KSaaZ0/initializing-scrum.html" title="Initializing Scrum" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/03/initializing-scrum.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-45273094584253248</id><published>2009-01-31T17:07:00.006+01:00</published><updated>2009-02-01T00:33:40.705+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><category scheme="http://www.blogger.com/atom/ns#" term="iplabs" /><title type="text">First month of work done!</title><content type="html">So! As I &lt;a href="http://tfnico.blogspot.com/2009/01/not-consulting-any-more-or-am-i.html"&gt;blogged about previously&lt;/a&gt;, I've begun working at a new company right after New Year's. I figured I'd get some thoughts out on how the first month has been.&lt;br /&gt;&lt;br /&gt;Usually, when someone begins in a new job they're excited, nervous and above all very humble towards the existing practices that exist in the new workplace. Of course, I had these feelings, but being &lt;span style="font-style: italic;"&gt;an agile&lt;/span&gt; fanatic, I was pretty sure that I would be able to find some improvement points. Here are some of the specific steps I took during my first weeks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 0: Start writing a diary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't think an honest worker was ever harmed by being transparent in his work. A practice I've been doing ever since I started working is &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/The+Diary"&gt;&lt;span style="font-style: italic;"&gt;The Diary&lt;/span&gt;&lt;/a&gt;. Basically, just a personal wiki-page where you note down a few lines each day on what you're working on. Apart from being a good way to keep focus throughout the day and being a nice place to paste notes and code, it sends out a message: that you're interested in letting others know what you are working on. I'm going to be asking people what they're doing a lot, so being transparent in my own activities is a good start.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 1: Get Continuous Integration set up&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of my first reactions when I went to work on the code was a certain sense of claustrophobia. Here there were about twenty developers working on the same code base, and I really didn't have any feeling of who was committing what when.  I first tried to get commit-mails set up, but due to some issues with commit-hooks in their Subversion setup, we couldn't get that working right away. So I turned to set up continuous integration with &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;. My hope was that the CI changeset pages could work as a temporary commit-mail replacement, and since there already was a ViewSVN installation running, this worked out quite nicely.&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/geVr6BRyivYJOFeOA4RUgg?authkey=ylSJ1S70sr0&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_ZBn5rO9Auoo/SYTXzcaLwLI/AAAAAAAAAlk/Ira74zGSeWM/s400/hudson.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/tfnico/DropBox?authkey=ylSJ1S70sr0&amp;amp;feat=embedwebsite"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Note that the screen shot is not from our place, but from &lt;a href="https://grid.sonatype.org/ci/"&gt;Sonatype's CI farm&lt;/a&gt; (tip o' the hat to Alf!).&lt;br /&gt;&lt;br /&gt;Not long after that we were able to also get a nightly deployment of the build to the testing server, so now testers and designers can always experience the latest running on some local servers.&lt;br /&gt;&lt;br /&gt;Note that getting this far in a couple of weeks would never had been possible in a traditional company (in my experience). The credit of this smooth setup belongs to some of their developers and admins, who put together the necessary scripts and server setup in record time. They actually had a continuous integration already, running the build each night as a cron-job. All I did was drop in the idea of using Hudson, and running the build on every commit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 2: Do some agile preaching&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wanted to give the other developers some &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Agile"&gt;agile 101&lt;/a&gt; very early, and luckily a slot opened up in our second weekly team meeting. I did this &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Scrum"&gt;somewhat critical presentation on Scrum&lt;/a&gt;,  so now when I accidentally throw terms like &lt;span style="font-style: italic;"&gt;velocity &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;backlog &lt;/span&gt;around, they will have an idea of what I'm talking about.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Step 3: Whiteboards, whiteboards, whiteboards!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the things I did the first week was to get some large whiteboards ordered. I am of the opinion that you can never get enough whiteboards, and management agreed to spend a small fortune on this (again, something that wouldn't be easy in a traditional company). They finally arrived last week, and on Friday we finally got our team-lounge set up:&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/vGKbUXasBOvEZ276QNepUw?authkey=i3e0lUQWcr0&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_ZBn5rO9Auoo/SYR282cRWJI/AAAAAAAAAko/PgocJGh4yWY/s800/SDC10047.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/tfnico/BloggerBilder03?authkey=i3e0lUQWcr0&amp;amp;feat=embedwebsite"&gt;Blogger-bilder&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;It's quite neat, I think. My plan so far is to use the far-left one for backlog stuff, the two horizontals for Sprint-charts, and the one on the right for anything else people would like to draw, be it architecture or obscenities ;)&lt;br /&gt;&lt;br /&gt;It will be quite interesting to see how this works out. Some of the developers were speculating that the setup will be working for the first few weeks, and then fade away and people won't bother any more. Well, if people don't need this amount of communication in order to work efficiently, we will of course not force people to participate. I think everyone is better off if they spend 10 minutes of their day with the rest of their team on &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Daily+Standup+meeting"&gt;a daily standup&lt;/a&gt; in front of these whiteboards, but if people still don't like it after giving it an honest try, we'll remove the practice. After all, that's what being agile is all about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-45273094584253248?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=7Xxrz4JuHj0:Oz5vYdPFz0o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=7Xxrz4JuHj0:Oz5vYdPFz0o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/7Xxrz4JuHj0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/45273094584253248/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=45273094584253248" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/45273094584253248" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/45273094584253248" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/7Xxrz4JuHj0/first-month-of-work-done.html" title="First month of work done!" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_ZBn5rO9Auoo/SYTXzcaLwLI/AAAAAAAAAlk/Ira74zGSeWM/s72-c/hudson.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/01/first-month-of-work-done.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-8257783104851208668</id><published>2009-01-04T19:54:00.004+01:00</published><updated>2009-01-11T20:02:42.470+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><category scheme="http://www.blogger.com/atom/ns#" term="iplabs" /><title type="text">Not consulting any more. Or am I?</title><content type="html">As I've hinted in some earlier blog-posts, I have now moved to Bonn, Germany, and as of last Monday, I'm working as a developer for &lt;a href="http://iplabs.de/"&gt;IP Labs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This means I won't be a consultant anymore, as I have been for the last 2,5 years. I am now a "fast ansatt", or steady employee. It's a bit interesting to ask myself:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does this mean my rocketeer knowledge increasing career has come to an end?&lt;/li&gt;&lt;li&gt;Will I go to work with a much more relaxed attitude, getting used to stable work environments and fewer changes?&lt;/li&gt;&lt;li&gt;Will I spend less time overall doing stuff related to my profession?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I hope the answer is to all three question a ringing 'no!'. I really enjoyed being a consultant because it allowed me to do stuff I'm really good at. I'm not a super-programmer, in fact I know lots of programmers who are better than me (well, even more that are worse than me), but I hope I still will be able to contribute lots to the company by doing what I always do: pushing for more agility and sound practices.&lt;br /&gt;&lt;br /&gt;So far in my career, I've worked closely with about 5 different teams, from 1 to 10 in size. My role in these projects have either been enforcing soft values (typical agile stuff, like planning, estimation and practices), enforcing hard values (code style, tool-use), or both. This effort has been spent mostly on the &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Agile+Individuals"&gt;individual level&lt;/a&gt;, some on the &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Agile+Organizations"&gt;organizational level&lt;/a&gt;, and then some on the &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Agile+Communities"&gt;community level&lt;/a&gt; (although not as much as I would've liked).&lt;br /&gt;&lt;br /&gt;At IP Labs, I've found that the individual/hard values are already at quite a high level. They (or we, as I should say) are already well-endowed with &lt;span style="font-style: italic;"&gt;pride, professionalism and quality,&lt;/span&gt; as well as excellent Java coding skills&lt;span style="font-style: italic;"&gt;.&lt;/span&gt; There are some practices that can easily be introduced to make things a little better, but things &lt;span style="font-weight: bold;"&gt;are working&lt;/span&gt;, and the developers are delivering lots of functionality with steady velocity.&lt;br /&gt;&lt;br /&gt;Also on the organizational level, they are focused on developer-satisfaction as well as customer-satisfaction. Already from day one, you feel that your developer needs are being taken care of, getting free choice of laptop and equipment (I'm now the proud owner of a MacBook, which I so far utterly despise, but hope I will learn to love in time). The infrastructure is very developer oriented, and Windows is frowned upon.&lt;br /&gt;&lt;br /&gt;There is no crappy Exchange mail server here that forces everyone to use Outlook: It's simply IMAP - use the client you prefer. They don't use Messenger or SameTime with proprietary protocols, they use Jabber instead. Again  - use the client you prefer. All in all, one kick-ass place to work :)&lt;br /&gt;&lt;br /&gt;Well, back to the ranting. ..&lt;br /&gt;&lt;br /&gt;The luxury of not being a consultant is that my voice can be &lt;span style="font-style: italic;"&gt;a little louder&lt;/span&gt;. No more tip-toeing around, packaging plans into sweet little convincing ideas and planting them in other people, being sure not to make it sound like you're not selling anything, even if you're not selling anything but common sense.The idea is that if you're a steady employee, you can criticize, argue and be taken seriously without too much beating around the bush, subterfuge and convincing.&lt;br /&gt;&lt;br /&gt;Or maybe it really isn't that different. As a consultant, you have to be careful not to be to rash, try not to insult anyone, be fair, objective, honest and overall being &lt;span style="font-style: italic;"&gt;very very patient&lt;/span&gt;. Shouldn't the same rules apply to all software workers? Just a thought...&lt;br /&gt;&lt;br /&gt;I think after all my job won't be that different. Maybe I'll get some more elbow-room, but all in all,  consulting is perhaps nothing else than being an understanding, careful and humble colleague.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8257783104851208668?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=OLVYUqu0Zxw:WwpuBlSryLw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=OLVYUqu0Zxw:WwpuBlSryLw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/OLVYUqu0Zxw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/8257783104851208668/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=8257783104851208668" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8257783104851208668" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8257783104851208668" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/OLVYUqu0Zxw/not-consulting-any-more-or-am-i.html" title="Not consulting any more. Or am I?" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2009/01/not-consulting-any-more-or-am-i.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-708155791018586087</id><published>2008-12-06T19:36:00.005+01:00</published><updated>2008-12-07T23:16:17.376+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><title type="text">Projects are bad for software.</title><content type="html">This post is mildly inspired by &lt;a title="the discussions" href="http://forum.smidig.no/forums/11/topics/398" id="an-z"&gt;the discussions&lt;/a&gt; from this &lt;a title="year's Smidig conference" href="http://smidig.no/smidig2008" id="d7-i"&gt;year's Smidig conference&lt;/a&gt; (Oslo's agile conference) inspired by &lt;a title="Marcus Ahnve's talk about &amp;quot;totality outside the project&amp;quot;" href="http://smidig2008.confreaks.com/10-oct-2008-09-24-b-se-helheten-utanfor-projektet-marcus-ahnve.html" id="hfii"&gt;Marcus Ahnve's talk about "totality outside the project"&lt;/a&gt;, roughly translated. I didn't see the talk myself (looking at it right now though), but when I heard the announcement of the title of the open space, I immediately recognized the idea as something that I've been lingering around for years, without being able to identify properly.&lt;br /&gt;&lt;br /&gt;In &lt;a title="my last post" href="http://tfnico.blogspot.com/2008/11/what-i-learned-about-project-management.html" id="b:2z"&gt;my last post&lt;/a&gt;, I wrote about how I learned about project management in uni, and how it is &lt;b&gt;the way &lt;/b&gt;for building software. In my own opinion, that is not true at all.&lt;br /&gt;&lt;br /&gt;Over the handful of years I've been working with software, both in project and maintenance mode, I can just about sum it up in one sentence:&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Projects are bad for software.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is one exception (discussed below), but in all practical cases, I find this to be the reality, and if you think about it a little bit, I'm sure you'll agree. Here are some points that come to mind:&lt;br /&gt;&lt;br /&gt; &lt;b&gt;Projects create irregularities in software&lt;br /&gt;&lt;/b&gt;Two times I've worked on larger projects that involved improving the functionality on existing software. Basically, the process involves boosting the maintenance team (0-2 people) with an additional team of 5-10 (typically consultants like myself). The super-team introduces lots of fancy new technologies and methods and grows new functionality into the codebase over some months. Unfortunately, the rushed nature of the project doesn't give the fresh team time to understand the existing domain model, and instead of morphing the code into doing the new stuff, they add and pack stuff on top of existing code that does things differently. Now we might have two different technologies that do the same thing, or two domain objects that are similar, but have no notion of re-use. Broken windows, if you will.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Projects push people in, and afterwards yank them out&lt;/b&gt;&lt;br /&gt;For some reason, after project delivery the team is cut down to the minimum required to keep the software operational. The super-team are pretty happy with the work they did, because they understand the new stuff perfectly. Unfortunately, the ones stuck maintaining the project probably weren't able to absorb the new domain bits and techonologies in time, and are stuck maintaining something they don't understand. This is bad knowledge management.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Projects are meant to be temporary, but software is long-lasting&lt;br /&gt;&lt;/b&gt;The majority of work on software is done after the initial development. It is maintained, monitored, bug-fix-patched, upgraded, expanded and extended. Throughout this phase, we spend a lot of time fighting bad stuff that was forced into the code-base during intensive project development. All the developers that contributed during the project who would be great aid in cleaning up the mess are long-gone, and besides the maintaners are too busy with bug-fixes and small functionality changes from the business side, so there's no resouces left to get quality back to a respectable level.&lt;br /&gt;&lt;br /&gt;Projects are based on the notion that software go into production and live happily ever after. This is not the case! Start measuring how many change requests come in from your IT-department or business side in just a month.&lt;br /&gt;&lt;br /&gt;Yet, &lt;b&gt;we have created an artificial boundary&lt;/b&gt; between the software development and software maintenance because of some twisted desire that maintaining software should be cheaper than developing it. Does anyone seriously believe that performing change on software that is running in production is cheaper than changing software in development? If so, they probably have never worked with a database, or software at all.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; So when is project the right thing?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is only one scenario that justifies the use of project as an organisation form: Termination of a system. You are migrating data away from a legacy database, shutting down a server, quitting the use of a service provider, etc. There is a clear deadline and date in sight for when the development will be finished, and after that, &lt;b&gt;all the code that was written can be thrown out and forgotten&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;(Oh, a second case: Cancelled projects.)&lt;br /&gt;&lt;br /&gt;There are some scenarios like these taking place, but often they are part of something larger, like building the new system, or using a new service provider, and these larger invests are meant for a longer life, and do not (or should not) use project as a form of organization.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So how come we ended up doing projects?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think it was a sort of panic reaction from leaders to try to control quickly escelating IT costs. Time-boxing, money-boxing (budgeting). There's nothing wrong with budgets or time-boxes. They are perfect planning tools that ask the team the right questions.&lt;br /&gt;&lt;br /&gt;But business side wanted to be more efficient, so they put cheap labour doing maintenance (because they think it is easy), and smart expensive labour doing development (because it is hard). Truth is, development and maintenance is equally hard. In fact, they are the same thing, and by seperating them we are only doing these people a favour: consultants. It's an entire industry that feeds on the fact that their customers are unable to manage projects and maintenance on their own.&lt;br /&gt;&lt;br /&gt;I could go on about how some large organizations I know of control and drive development projects by intensive consultant development, and afterwards dump them over to the maintenance team in the IT-department. You've probably seen this yourself, and how much fustration and problems it creates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now let us do this instead..&lt;/b&gt;&lt;br /&gt;Instead of hiring ten project developers and one maintainer, hire three developer/maintainers instead. Believe me, they will deliver just as much functionality, maybe not in the first three months, but over time. The team of three developers through a whole year will give you a much higher velocity over one year than boosting the team to ten developers the first three months.&lt;br /&gt;&lt;br /&gt;It's cheaper too. Here's the math:&lt;br /&gt;&lt;br /&gt;10 devs for three months + 9 months of 1 maintainer = 39 work months. And alot of these are probably expensive consultants as well.&lt;br /&gt;&lt;br /&gt;3 devs for twelve months = 36 work months.&lt;br /&gt;&lt;br /&gt;Besides, a stable team of three developers will give you a stable code base with better quality that grows in rythm and improves with the skills of the developers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It's time we start making consultants their money worth&lt;br /&gt;&lt;/b&gt;Don't use them as developers. Use them as advisors, teachers, coaches. Have them assist those three developers, not code for them. And when the consultants seem to run out of new stuff they can learn your developers, chuff them out.&lt;br /&gt;&lt;br /&gt;I'm afraid this post cranked a bit too many thoughts into one, but it's still a field where I only have my own limited experience to base the ideas on. I'm sure there are many other smarter people who have some thoughts on this, and I would appreciate if you could give me some pointers in their direction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-708155791018586087?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=IAPl6AUFrw4:0Ixb6VZqKY4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=IAPl6AUFrw4:0Ixb6VZqKY4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/IAPl6AUFrw4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/708155791018586087/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=708155791018586087" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/708155791018586087" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/708155791018586087" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/IAPl6AUFrw4/projects-are-bad-for-software.html" title="Projects are bad for software." /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/12/projects-are-bad-for-software.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-1455979681153925098</id><published>2008-11-11T21:19:00.007+01:00</published><updated>2008-11-11T23:27:46.237+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><title type="text">What I learned about Project Management in school</title><content type="html">Back when I started studying at uni, I took a course called "Organization and management of technical projects" (&lt;a href="http://www.uio.no/studier/emner/matnat/ifi/INF2000/"&gt;Norwegian course page link&lt;/a&gt;). The course was structured in a very interesting way, and dealt with a measure of topics which are still very relevant for me today (team psychology and leadership, project planning, estimating, etc). It was also held in parallell with a practical software development project (&lt;a href="http://www.uio.no/studier/emner/matnat/ifi/INF2010/"&gt;Norwegian link&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I won't write too much about the course itself, but I want to write about the final "exam". We were asked to write a ~15 page essay reflecting on the subject based on our experiences from the practical project combined with the curricular theory.&lt;br /&gt;&lt;br /&gt;I handed in my copy in June 2004, just about as I started earning money as a software developer. Some times recently I've wondered if there are any nuggets in that essay (entitled &lt;span style="font-style: italic;"&gt;Project management for the Nintendo generation) &lt;/span&gt;that I can still reason about today.&lt;br /&gt;&lt;br /&gt;(Skip to the bottom of this post if you would rather read the whole original essay in Norwegian).&lt;br /&gt;&lt;br /&gt;The essay is primarily about Projects, clearly apparent from the oozy introduction:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;blockquote&gt;Software is no longer only a tool. It is a product in its own right, and project work is what produces it.&lt;/blockquote&gt;&lt;/span&gt;Very flash. There are also plenty of footnotes, like:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Svada (Norwegian word a bit like &lt;a href="http://www.google.no/search?q=define%3Aclaptrap"&gt;claptrap&lt;/a&gt;): A field of knowledge that consists of obivous'ites and only exists for the purpose of its own consultants.&lt;/blockquote&gt;Hello satire! There are also some interesting psychological aspects of project heroism, showing some self-insight:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;There were times [in the project] where I saw lack of management, and again I hungered to take control of the project to get the work going. I wonder whether this need was rooted in my task-oriented, or self-oriented self. The task-oriented part wanted control to get the job done, wile the self-oriented part wanted to put me in the hero-role so others could see my skill.&lt;/blockquote&gt;There is also some skimming of the nature of legacy systems:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;It is a well known fact that extensive requirement specifications and customer interaction is necessary for a successful product. We have [with our project] confirmed this yet again. Even though it can be useful to re-use existing resources and design, it is healthy to engage upgrades of IT-systems as entire new projects.&lt;/blockquote&gt;Hmm, notice at this point that I might not fully agree today with what I wrote 4 years ago. This notion continues in the next section:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;It is within the complex nature of project work that a comprehensive and documented plan is necessary. The project plan should be the project group's bible. It should be a reference guide and framework for all things regarding control, activities and mangement in the project.&lt;br /&gt;&lt;/blockquote&gt;Quite. But hey, later on I reframe the view somewhat:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;It is easy to speculate on what a project plan should contain, and one often ends up with a project plan containing a lot [of stuff]. There is a trend of plans growing so heavy that they are ignored as soon as they are complete. The project team believes that the plan contains a series of obvious facts that are only relevant for management and customer, and feel no ownership in the document.&lt;/blockquote&gt;Hear, hear. Now, later on I described the project implementation in some detail, and this is where I'm particularly proud of my younger self:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;The implementation phase is often experienced to be the biggest part of the project. It is then one actually makes the product. While being a concrete and actual task, it is still very unclear in the beginning. By the completion of the product, it is odd how clear the approach was when one looks back to the start.&lt;br /&gt;&lt;br /&gt;Implementation never goes as expected. It is like finding the easiest way out of a circle drawn up by the analysis [earlier project phase], and naturally one follows the radian directly outwards.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SRn5mK7SMdI/AAAAAAAAAX4/ArZAUNR_E_U/s1600-h/circle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 210px; height: 196px;" src="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SRn5mK7SMdI/AAAAAAAAAX4/ArZAUNR_E_U/s320/circle.png" alt="" id="BLOGGER_PHOTO_ID_5267515673349861842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The larger reqirements and analysis, the larger the circle becomes. Throughout the implementation, the developers analyze deeper and extend the requirements on their own. The analysis [circle] will grow and move depending on how thorough the original analysis was. Often it will become appearant that another angle out of the circle (meaning different technology or architecture) will be shorter, and in the worst case, especially early on in the implementation, one has to turn around entirely to follow another direction [out of the circle].&lt;/blockquote&gt;Today that looks to me as a strike for agile development :)&lt;br /&gt;&lt;br /&gt;I also complained about my fellow students unwillingness to embrace English as language used in code, noting "It would be interesting to quantify what effect this has on Norwegian system development". This very day I'm working with projects that are suffering from having large masses of Norwegian code, while external consultants are struggling to figure out what's going on. Oh, and it's still a "company rule" that all code must be in Norwegian. Get a grip, you nitwits! Your Norwegian code won't protect you when outsourcing threatens. Rather it will be an good reason for throwing your code out, and you along with it! Learn English, or learn a different profession! [sorry for ranting]&lt;br /&gt;&lt;br /&gt;The essay contains some glorification of the project as a working structure, and the project manager her/himself. I drew a prallell from the project manager to ancient human traditions of tribal leaders, and how a project manager appeals to our natural order. A practical assignment demonstrated that the team was actually less efficient when all had insight into the orchestration of a task. Today I'm not so certain we should prominate the project manager as the leader role it is set out to be. Scrum trainers have on several occasions claimed that there is no place for project managers in agile projects.. but that is all thought for another blog post.&lt;br /&gt;&lt;br /&gt;Finishing off the essay, I gave a brief summary on each of the seven sections:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Expectations &lt;/span&gt;&lt;span style="font-style: italic;"&gt;should not be built too high, but the team should be made aware that the project will demand full attention, so they anchor their devotion to a high level.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Humans &lt;/span&gt;&lt;span style="font-style: italic;"&gt;have different motivations. Their true roles should be discovered so they can receieve proper motivation and fitting tasks in the project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;The mission &lt;/span&gt;&lt;span style="font-style: italic;"&gt;must be well studied/understood. Stable customer contacts and project management must be used in the customers best interest to achieve the best product.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;The plan &lt;/span&gt;&lt;span style="font-style: italic;"&gt;requires quality over quantity. A good plan is used continously by management from start till finish.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Implementation &lt;/span&gt;&lt;span style="font-style: italic;"&gt;is the goal of the project and can quickly become the hardest part. The team will find themselves within valleys of shadow [dødsskyggedaler], and it is important for the project manager to involve her/himself, maintain motivation and synchronize development with the requirements of the customer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;The end &lt;/span&gt;&lt;span style="font-style: italic;"&gt;of the project should be emphasized. Before the team is disbanded, they should analyze their experiences and document what knowledge they have acquired throughout the project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Leadership &lt;/span&gt;&lt;span style="font-style: italic;"&gt;demands a person with a multitude of talents. She/he must be fully focused on the project. Both the team and external actors must be duly stimulated for the project to succeed.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;.. and then I finished very dramatically:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;It is important to remember that we do not use this form of management [meaning project] for its own sake, but because it brings out the most productive in humans. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Projects are our generation's way of organization for system development. It is important that we prepare ourselves for the real world by doing projects in a realistic atmosphere so we may experience that &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;leadership &lt;/span&gt;&lt;span style="font-style: italic;"&gt;is important, and not just another chapter in a textbook.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;It would be fitting to end this arcticle in the same manner as it began; by the wise words of David Hume:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;"Teaching has suffered greatly from having being locked up in Universities and expelled from the World and good Company."&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Very fitting end to an essay I handed over to a professor, don't you think? Mind that the Hume quote is doubly translated back from Norwegian because I couldn't find the original source right now.&lt;br /&gt;&lt;br /&gt;For those who wish to read the essay in Norwegian, &lt;a href="http://www.scribd.com/doc/7889125/Eksamensessay-i-Inf2000"&gt;it's available on Scribd&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-1455979681153925098?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=4_ET_t49TtY:P4bzczr9gWw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=4_ET_t49TtY:P4bzczr9gWw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/4_ET_t49TtY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/1455979681153925098/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=1455979681153925098" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1455979681153925098" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1455979681153925098" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/4_ET_t49TtY/what-i-learned-about-project-management.html" title="What I learned about Project Management in school" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SRn5mK7SMdI/AAAAAAAAAX4/ArZAUNR_E_U/s72-c/circle.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/11/what-i-learned-about-project-management.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-3838662184553845208</id><published>2008-10-25T15:26:00.004+02:00</published><updated>2008-11-11T00:29:50.154+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">Looking for work in Bonn (update: fixed)</title><content type="html">&lt;span style="font-weight: bold; font-style: italic;"&gt;Update: I was in Bonn doing an interview on Friday, and the outcome is more or less decided: I've found my new employer. Thanks for all the input and pointers! Note that I've removed links to some documents with some sensitive information.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those of you who don't already know: In about two months I'm moving from Oslo, Norway to Bonn, Germany. I am currently looking for work down there, and that's what this post is about.&lt;br /&gt;&lt;br /&gt;Here is the information any potential employer should be interested in:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Elevator pitch:&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);font-family:Times New Roman;" &gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:Times New Roman;" &gt;&lt;span style="font-size:100%;"&gt;Norwegian MSc graduate from the University of Oslo, Department of Informatics. Four years of working experience with Java, consulting, agile methods, product development and open-source&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Times New Roman;"&gt;.&lt;/span&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;I'll be ready to begin working on the 5th of January, 2009. I will be staying indefinitely.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.google.com/View?docid=ah7s7jp277fz_70g9jfzqdf"&gt;My résumé&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I will be visiting Bonn a couple of times in the following months, and it will be possible to meet me for interviews in Bonn on these dates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;7-10th of November&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;27th of November - 2nd of December&lt;/li&gt;&lt;/ul&gt;I would appreciate any advice anyone has on working in Germany, or can recommend any particular employer. I wold also appreciate if you will forward this post or application to any potential employer you could think of (I have already sent an application to some positions I've found on monster.de or stepstone.de).&lt;br /&gt;&lt;br /&gt;Please contact me if you have any questions. My Gmail account is &lt;span style="font-style: italic;"&gt;tfnico&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-3838662184553845208?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=RahGFT47brQ:v90jFh7IazM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=RahGFT47brQ:v90jFh7IazM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/RahGFT47brQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/3838662184553845208/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=3838662184553845208" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3838662184553845208" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3838662184553845208" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/RahGFT47brQ/looking-for-work-in-bonn.html" title="Looking for work in Bonn (update: fixed)" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/10/looking-for-work-in-bonn.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-3150897236067166889</id><published>2008-10-23T22:51:00.004+02:00</published><updated>2008-10-23T23:09:22.596+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="objectware" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">What I'm doing these days</title><content type="html">I'm quite busy these days doing preperations for *a big change in my life* that will be the subject of my &lt;span style="font-style: italic;"&gt;next blog-post&lt;/span&gt;, but I figured I'd give a quick status update that's a bit too big for &lt;a href="http://twitter.com/tfnico"&gt;my twitter stream&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was recently appointed to lead Objectware's Java-department's focus group on &lt;span style="font-style: italic;"&gt;Agile&lt;/span&gt;. We've been doing agile for a long while on the company level, but it's first now that our department has its own group on it. My goal is to nurture it to being a very active micro-community that will produce knowledge both internally and externally. Much like we already did, but now with more, well, budget :)&lt;br /&gt;&lt;br /&gt;Our first accomplishment was to attend the &lt;a href="http://smidig.no/smidig2008"&gt;Smidig 2008 conference&lt;/a&gt; with a &lt;a href="http://smidig.no/smidig2008/lyntaler-p-programmet/smidig-vs-itil/"&gt;respectable&lt;/a&gt; &lt;a href="http://smidig.no/smidig2008/lyntaler-p-programmet/smidig-kaos/"&gt;amount&lt;/a&gt; of &lt;a href="http://smidig.no/smidig2008/lyntaler-p-programmet/kode-skal-forbedres-ikke-kastes/"&gt;Objectware&lt;/a&gt; &lt;a href="http://smidig.no/smidig2008/lyntaler-p-programmet/smidig-brukerorientert-design/"&gt;speakers&lt;/a&gt;.  There were alot of interesting discussions going on in the succeeding open spaces, my favourite topics incuded some hard-core &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Web+testing"&gt;web-testing&lt;/a&gt; (of course), &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Cost+of+reuse"&gt;when (not to) re-use &lt;/a&gt;and some others I can't remember right now.&lt;br /&gt;&lt;br /&gt;As part of my new responsibilities, I'm also trying to seed some content into the &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Mindset+and+methodology"&gt;methodology part of our community wiki&lt;/a&gt;.  Oh, and we also just had our first internal meeting with the interesting title of "&lt;span style="font-style: italic;"&gt;Code monsters. How are they created and what can we do about them&lt;/span&gt;". I will be adding snips of the conclusions to the wiki as we go along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-3150897236067166889?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=RbTj9NureIA:GC5fVS9OYuw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=RbTj9NureIA:GC5fVS9OYuw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/RbTj9NureIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/3150897236067166889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=3150897236067166889" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3150897236067166889" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3150897236067166889" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/RbTj9NureIA/what-im-doing-these-days.html" title="What I'm doing these days" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/10/what-im-doing-these-days.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-2369125192275990287</id><published>2008-10-23T00:31:00.005+02:00</published><updated>2008-10-23T00:49:54.464+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">Debate about Open Source in Oslo next wednesday</title><content type="html">Just a quick note. The alumni organization from my old university is arranging a meetup/debate about open source, and I'd promise I'd help communicate the event. The tine-up looks very promising:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Heidi Arnesen Austlid, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:100%;"&gt;Friprogsenteret&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Per Hove, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:100%;"&gt;Oracle Norge&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Shahzad Rana, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:100%;"&gt;Questpoint&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Johannes Brodwall, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:100%;"&gt;Steria&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The event will be held in The Scotsman, where they sell beer! And there will be free pizza! Doesn't get any better than that :)&lt;br /&gt;&lt;br /&gt;I took the opportunity of uploading the &lt;a href="http://docs.google.com/Doc?id=ah7s7jp277fz_76w378hvpr"&gt;full invitation here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, set aside next wednesday evening and I'll see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-2369125192275990287?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=LLlxorgpLgM:9KWKKwTwm3s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=LLlxorgpLgM:9KWKKwTwm3s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/LLlxorgpLgM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/2369125192275990287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=2369125192275990287" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2369125192275990287" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2369125192275990287" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/LLlxorgpLgM/debate-about-open-source-in-oslo-next.html" title="Debate about Open Source in Oslo next wednesday" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/10/debate-about-open-source-in-oslo-next.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-4959686972251283506</id><published>2008-10-15T20:47:00.004+02:00</published><updated>2008-10-15T21:07:19.477+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javazone" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">My JavaZone video is out</title><content type="html">I was very happy when my JavaZone talk about "&lt;a href="http://javazone.no/incogito/session/How+I+learned+to+love+and+hate+web-testing.html"&gt;How I learned to love and hate web-testing&lt;/a&gt;" managed to fill up a whole room. For those of you you who didn't get in, or didn't manage to get a hold of one of the very rare overflow-headsets, or were busy at one of the other talks, here's the recorded video for your viewing pleasure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://javazone.no/incogito/session/How+I+learned+to+love+and+hate+web-testing.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_ZBn5rO9Auoo/SPY9R_KvcJI/AAAAAAAAAWU/GRqspQyFlrs/s320/hail.jpg" alt="" id="BLOGGER_PHOTO_ID_5257456994225189010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;All hail web-testing! Click the image to get to the talk, hit the little &lt;span style="font-style: italic;"&gt;Presentation &lt;/span&gt;link at the top and off you go.&lt;br /&gt;&lt;br /&gt;For the best viewing please, and this goes for all the JavaZone videos, I recommend the following:&lt;br /&gt;&lt;br /&gt;1) Click the Max Slide button to get the slides in a seperate window&lt;br /&gt;2) Right click the video for the flash menu&lt;br /&gt;3) Click Zoom in, so you get a bigger video (click and drag if the focus is wrong)&lt;br /&gt;&lt;br /&gt;On a cool note, after &lt;a href="http://heim.java.no/%7Etrygvis/video-popularity.txt"&gt;the first count&lt;/a&gt; (yesterday), my video was the 7-most viewed video (of a total of 86 videos). Woohoo! But I'm likely to drop once people start realizing that &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;All the videos from JavaZone 2008 are available online! &lt;/span&gt;&lt;/span&gt;Now, go watch!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4959686972251283506?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=2cjveNf1O-s:XVDNJNKgdSQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=2cjveNf1O-s:XVDNJNKgdSQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/2cjveNf1O-s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/4959686972251283506/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=4959686972251283506" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4959686972251283506" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4959686972251283506" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/2cjveNf1O-s/my-javazone-video-is-out.html" title="My JavaZone video is out" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZBn5rO9Auoo/SPY9R_KvcJI/AAAAAAAAAWU/GRqspQyFlrs/s72-c/hail.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/10/my-javazone-video-is-out.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-8460053157288904950</id><published>2008-09-27T21:17:00.001+02:00</published><updated>2008-09-27T21:21:01.074+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">Some books for agile programmers</title><content type="html">I'm giving docs.google.com another try. I &lt;a id="it1q" href="http://tfnico.blogspot.com/2006/01/testing-writely.html" title="tried it over two years ago"&gt;tried it over two years ago&lt;/a&gt; (wow, time flies) when Google Docs was still Writely. Oh, my prediction did come through (they got bought by Google), wuhu! So if this post gets doubly published it's because it got screwed up.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;Update: docs.google.com didn't manage to publish the title properly. I also have to apply some tags manually. All the pictures and headings came through allright, though.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;New books&lt;/h2&gt;&lt;div&gt;I just got these books:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;&lt;img src="http://docs.google.com/File?id=ah7s7jp277fz_65gvcn4wdp_b" style="width: 114px; height: 144px" /&gt;&lt;img src="http://docs.google.com/File?id=ah7s7jp277fz_66gdqdxm24_b" style="width: 120px; height: 144px" /&gt;&lt;img src="http://docs.google.com/File?id=ah7s7jp277fz_67dnvqk3kg_b" style="width: 120px; height: 144px" /&gt;&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;They're all from &lt;a id="ea9x" href="http://www.pragprog.com/categories" title="The Pragmatic Bookshelf"&gt;The Pragmatic Bookshelf&lt;/a&gt;, although I got them from Amazon (who sent them from New-Zealand, which gave me sort of a bad eco-concience for a while..) cause they were alot cheaper there.&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;The first title, The Pragmatic Programmer. Well, I'm sort of ashamed that I haven't read it before, being as famous as it is. However, I'm looking through the TOC, and I sort of get the feeling I've touched most of the points, either by hard realization and experience, or by advice from friends and colleagues. The book still provides me with a sturdy, well sorted and well formulated set of &lt;i&gt;practices&lt;/i&gt;, which will help me communicate &lt;a id="cw4k" href="http://jamesshore.com/Articles/Quality-With-a-Name.html" title="the QWAN"&gt;the QWAN&lt;/a&gt; to my consulted clients.&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;Practices of an Agile Developer looks like a follow-up to TPP. It's published in 2007, 7 years after. It seems to have more of a focus on collaboration and project management than on effective tool use (although the subjects do overlap). &lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;The last book is written by two guys working for SAS, neither are part of the original PP pair. I got it because it's been a long while since I read any modern works on agile development, and agile stuff is quickly turning into my pressure point for some reasons yet to be announced publically :)  The book also has a very nice looking section on &lt;i&gt;Common problems and how to fix them&lt;/i&gt;. My team at work just shrunk down to 1,5 people, and we recently suffered almost a two month long sprint stumble (long story, and I'm still having trouble figuring out how I could've gotten it right). Hopefully the book has some advice I can apply to my own project.&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;All three books make up for three areas I care, and I think every IT-professional should care deeply about: &lt;i&gt;Tools&lt;/i&gt;, &lt;i&gt;languages &lt;/i&gt;and &lt;i&gt;practices&lt;/i&gt;. &lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;I &lt;a id="w:3t" href="http://search.twitter.com/search?q=&amp;amp;ands=tfnico&amp;amp;phrase=&amp;amp;ors=&amp;amp;nots=&amp;amp;tag=&amp;amp;lang=all&amp;amp;from=&amp;amp;to=&amp;amp;ref=&amp;amp;near=&amp;amp;within=15&amp;amp;units=mi&amp;amp;since=2008-09-27&amp;amp;until=2008-09-27&amp;amp;rpp=15" title="just asked on twitter"&gt;just asked on twitter&lt;/a&gt; which book I should read first. I think I'll do Ship it! first, but might follow the advice of Olve and do TPP first. To be honest, after I finished studying I've been horrible at reading books. I have several books now that I started but never finished. &lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;Oh, here's a &lt;a id="li_o" href="http://wordle.net/" title="wordle"&gt;wordle&lt;/a&gt; of my blog:&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="n6g2"&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="r2tk"&gt;&lt;img src="http://docs.google.com/File?id=ah7s7jp277fz_68cw66k5fx_b" style="width: 788px; height: 484px" /&gt;&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="r2tk"&gt;Very flash. I can't for the life of me remember who's blog I just read who pointed me at it. Sorry. There are a bit too many normal English words in the cloud, but some of the words are nice: pretty, people, good, stuff :)&lt;/div&gt;&lt;div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="r2tk"&gt;Ok, let's push this thing to Blogger and see how it goes..&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8460053157288904950?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=ZrgVY6MFMxc:jHwQns1b5cA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=ZrgVY6MFMxc:jHwQns1b5cA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/ZrgVY6MFMxc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/8460053157288904950/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=8460053157288904950" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8460053157288904950" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8460053157288904950" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/ZrgVY6MFMxc/im-giving-docs.html" title="Some books for agile programmers" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/09/im-giving-docs.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-5916668329762751380</id><published>2008-09-24T22:23:00.002+02:00</published><updated>2008-09-24T23:37:23.346+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javazone" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">JavaZone 2008 and GeekCruise</title><content type="html">So, JavaZone is done. I did my presentation, tada (please view full screen to get rid of the chippy graphics):&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_616392"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/tfnico/how-i-learned-to-love-and-hate-webtesting-presentation?type=powerpoint" title="How I Learned to Love and Hate Web-Testing"&gt;How I Learned to Love and Hate Web-Testing&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=howilearned-1222287642731047-9&amp;amp;stripped_title=how-i-learned-to-love-and-hate-webtesting-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=howilearned-1222287642731047-9&amp;amp;stripped_title=how-i-learned-to-love-and-hate-webtesting-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/tfnico/how-i-learned-to-love-and-hate-webtesting-presentation?type=powerpoint" title="View How I Learned to Love and Hate Web-Testing on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/jz08"&gt;jz08&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/javazone"&gt;javazone&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I got good feedback. In short: The slides are funny and original, my presentation moves were allright (good voice, good gestures, movement around the stage), the content was pretty good and interesting. The talk was at an introductory level, and I feel I hit the audience pretty well. Will be very interesting to see the video, as well as getting the feedback.&lt;br /&gt;&lt;br /&gt;I was also in the JavaZone arranging committee. You might've seen me scurrying around, commanding the guys in the orange T-shirts (they were the volunteers). It was alot of work, but it was alot of fun as well. Tomorrow evening we're throwing a party in their honour at the University, so if you're in the neighborhood, give me a ping and drop by.&lt;br /&gt;&lt;br /&gt;But anyways, I didn't get too see many talks. Only one (excluding my own), to be honest, although I'm sure I could've squeezed into a couple of more. But you crowd could've gone a bit easier on the headsets! Jeez, it's called overflow because they're for when the rooms flow over.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If the room is full, go to another talk&lt;/li&gt;&lt;li&gt;If you can't find any place, get an overflow headset&lt;/li&gt;&lt;li&gt;Don't sit or walk around with a headset all day, you ¤%&amp;amp;/(&lt;/li&gt;&lt;/ol&gt;We only had like 450 headsets, which should be plenty thinking the rooms fit over 1700 people. So people, no sitting around. It's a conference. If you want to look at video, stay at home and look on youtube, or Parleys.com, or TED or something.&lt;br /&gt;&lt;br /&gt;Well, enough ranting. On friday we had a Objectware-VIP presentation from Sun, more specifically from &lt;a href="http://blogs.sun.com/alexismp/"&gt;Alexis Moussine-Pouchkine&lt;/a&gt; on GlassFish. It looks as sexy as ever, v2 and v3 for its respective uses. I figured my next little fiddling will be trying to replace our JettyLauncher with a GlassFishV3Launcher, but I doubt I'll be able to convince my customer into converting from WebSphere to GlassFish V2 just yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Geek Cruise&lt;/span&gt;&lt;br /&gt;Saturday morning I was looking forward to a nice weekend of doing nothing else than relaxing, and I was lying in my bed when somebody called and dragged me along to the infamous &lt;a href="http://wiki.community.objectware.no/display/EA/Emerging+Technologies+-+the+future+of+enterprise+POJOS+Geek+Cruise+WorkArea"&gt;GeekCruise&lt;/a&gt;! I had previously turned down the available slot because I hadn't had time to prepare myself (because of JavaZone), but &lt;a href="http://andersnoras.com/blogs/anoras/default.aspx"&gt;Anders Norås &lt;/a&gt;backed out, so I had no excuse anymore.  Thanks Anders :)&lt;br /&gt;&lt;br /&gt;We were only 16 participants, among them some pretty respected people like, &lt;a href="http://www.jroller.com/rickard/"&gt;Rickard Öberg&lt;/a&gt;, &lt;a href="http://www.brodwall.com/johannes/blog/"&gt;Johannes Brodwall&lt;/a&gt; and &lt;a href="http://wiki.community.objectware.no/display/%7Etotto/Home"&gt;Totto&lt;/a&gt;. Some new to me, but obviously very bright people: &lt;a href="http://www.jroller.com/emileifrem/"&gt;Emil Eifrem&lt;/a&gt;, &lt;a href="http://www.jexp.de/blog/"&gt;Michael Hunger&lt;/a&gt; and &lt;a href="http://wiki.community.objectware.no/display/%7Eteigen@jpro.no"&gt;Jon-Anders Teigen&lt;/a&gt;. A big part of the group were Objectware people, but hey, we paid for the stuff! And I'd better mention &lt;a href="http://kaare-nilsen.com"&gt;Kaare Nilsen&lt;/a&gt; since he saved my ass on saturday evening. Your site is not responding, btw, Kaare.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.no/lh/photo/EwZXmZ_thfmHWGkdgO4EPQ"&gt;&lt;img src="http://lh5.ggpht.com/tfnico/SNqyNM_G9EI/AAAAAAAAAVU/5IUTePBk6qs/s800/SANY0010.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alot of the discussions and content have been documented in &lt;a href="http://wiki.community.objectware.no/dashboard.action"&gt;our community wiki&lt;/a&gt;, but the real value I think was the insight some of us gained, and the input some others got to their respectful projects. Communicating all the knowledge that flowed on that cruise.. well, it's pretty hard to do in written form (and maybe that's exactly why such events are a *good thing*). And most importantly, I got some new friends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5916668329762751380?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=JpoJHcF8NHw:t4EZCSHGzNc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=JpoJHcF8NHw:t4EZCSHGzNc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/JpoJHcF8NHw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/5916668329762751380/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=5916668329762751380" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5916668329762751380" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5916668329762751380" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/JpoJHcF8NHw/javazone-2008-and-geekcruise.html" title="JavaZone 2008 and GeekCruise" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/tfnico/SNqyNM_G9EI/AAAAAAAAAVU/5IUTePBk6qs/s72-c/SANY0010.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/09/javazone-2008-and-geekcruise.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-8821521409942938539</id><published>2008-08-10T22:30:00.005+02:00</published><updated>2008-08-11T00:16:42.645+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javazone" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">JavaZone'08 coming up</title><content type="html">I'm still going through my post-summer awakening, so I still haven't gotten the wheels of this blog running again. But current events are sort of relevant to the people I'm guessing are part of this blog's readership.&lt;br /&gt;&lt;br /&gt;The biggest happening coming along is &lt;a href="http://www.javazone.no"&gt;JavaZone 2008&lt;/a&gt;. Now this is especially important for me for two reasons. First reason:&lt;br /&gt;&lt;br /&gt;I've been a part of the crew preparing the conference. My role has been gathering a crew of volunteers to help out with all the practical work during the conference. Hooray, very rewarding work, getting 40 people to work two days for virtually nothing!&lt;br /&gt;&lt;br /&gt;Luckily there's a great crowd of Java-interested &lt;span style="font-weight: bold;"&gt;students&lt;/span&gt; in Oslo, and they can't afford a conference-ticket! So our evil schemes of acquiring a cheap workforce are proceeding as planned. Actually, there is a win-win relationship going on here. Student-organizations like to profile themselves in front of companies, cause companies have a tendency to give away &lt;span style="font-weight: bold;"&gt;free stuff&lt;/span&gt; when they do presentations at universities in order to recruit more newly educated computer scientists. Never underestimate the value of free food for a student.&lt;br /&gt;&lt;br /&gt;Companies, however, are wondering "So how do we get to these students?" - when it comes to the University of Oslo, Institute of Informatics (the biggest contributor of volunteers to JavaZone), the answer is through events like &lt;a href="http://dagen.at.ifi.uio.no/"&gt;dagen@ifi&lt;/a&gt;, and student organizations like &lt;a href="http://prosit.ifi.uio.no/"&gt;ProsIT&lt;/a&gt; and &lt;a href="http://navet.cyb.no/"&gt;Navet&lt;/a&gt;. You (recruiters) can meet members of these organizations at JavaZone. But try not to bother them while they're busy with the crucial tasks of keeping the conference running smoothly :)&lt;br /&gt;&lt;br /&gt;We still need more volunteers, though, so if you know anyone who'll chip in some hours of work in exchange for some freebies and free attendance to the conference, send them over to &lt;a href="http://www.javazone.no/funk"&gt;the JavaZone volunteer sign-up page&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.javazone.no/funk"&gt;www.javazone.no/funk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second reason: My proposal for JavaZone'08 talk got accepted! The title of it is "How I Learned to Love and Hate Web Testing", and that's pretty much what's it about as well. If you want more details you can read &lt;a href="http://tfnico.blogspot.com/2008/04/why-i-keep-badgering-on-about-web.html"&gt;my last blog post on the subject&lt;/a&gt;. I haven't gotten to prepare the talk half as much as I've wanted, but I've got most of the content pretty clear up in my head.&lt;br /&gt;&lt;br /&gt;I've started writing a manuscript for the entire talk. Now before you think "Stop it!" I won't print it and read it out loud when I do the talk. It's more like a movie script. I know too well that Norwegian audiences beyond a certain size are very hard to read, and therefore hard to adjust to, so I'm going to perform the talk exactly has I have planned it in advance. What I loose in adaptability I'll gain in stability and content. Or that's what I hope anyway. Comments on how to prepare for talks in front of big JavaZone audiences are appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8821521409942938539?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=el7asOtxHoc:gPRVa4G_nLM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=el7asOtxHoc:gPRVa4G_nLM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/el7asOtxHoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/8821521409942938539/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=8821521409942938539" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8821521409942938539" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8821521409942938539" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/el7asOtxHoc/javazone08-coming-up.html" title="JavaZone'08 coming up" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/08/javazone08-coming-up.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-4722714320108004777</id><published>2008-06-06T22:44:00.003+02:00</published><updated>2008-06-07T01:22:55.881+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="objectware" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><title type="text">Sharing the knowledge</title><content type="html">This post is going to a bit about what I've been doing lately. Well, like any other developer I've been mostly busy with getting the projects released before the big July. But I've also been past-timing a bit on setting up a new wiki.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Yay, I don't have to be the wiki techie any more!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's been well over a year since &lt;a href="http://tfnico.blogspot.com/2007/03/im-gonna-be-wiki-techie-oh-no.html"&gt;I started managing Objectware's Confluence installation&lt;/a&gt;. As expected, it was very little work. Confluence basically runs itself once it's set up. Mostly it was upgrading, administering content (deleting and cleaning), doing the odd restart or log-watching. Eventually, after a year or so, the hosting of the wiki was outsourced to a nearby hosting company, cause our instance's database was starting to run a bit slow, and my billing rates were a bit high (hey, I'm a consultant, after all)  :)&lt;br /&gt;&lt;br /&gt;So good riddance, finally no more booring IT-support work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Or do I...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, not until two months later, anyway. I was asked by a colleague, who's a core driver of our internal Solaris-group (I'll let him remain nameless right now, but he desevers all credit for this stuff), to participate in our latest  venture, which I'll get back to, but first..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;About two years ago..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; I was discussing the still immature wiki with the boss. Already we were seeing effects of decay and staleness in the quickly growing content. He asked me what we should do about it, and I said "I honestly think we should just open it up.". He gave a small laugh and said that was not very realistic. And it wasn't. Too much confidential customer stuff was mixed in with the pure knowledge about various open source projects and tools.&lt;br /&gt;&lt;br /&gt;Well, since then our wiki has grown and matured. It is better structured and filled with a lot of good content (much to the credit of the nameless guy mentioned earlier).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some stats..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's a meager 3.418 pages. You could be worried that it's a bunch of useless pages, but these pages count 29.555 edits, or nearly 9 edits per page, which I'm guessing is a good number for an internal wiki. 159 different authors have contributed to the content, and there are over 2.000 attachments.&lt;br /&gt;&lt;br /&gt;Now, finally due to a lot of internal efforts (not many of which were my own, to be frank), the political descision has been made to open up *some* of the content.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enter &lt;a href="http://wiki.community.objectware.no"&gt;wiki.community.objectware.no&lt;/a&gt;&lt;/span&gt;&lt;a href="http://wiki.community.objectware.no"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;So we took an evening and set it up on our new fancy Sun/Solaris box. Did I mention how easy/great it was to set up a Solaris with a database and Confluence? Well, I did get someone else to do the dirty work of setting up and configuring the zone, but after that it was real easy :)&lt;br /&gt;&lt;br /&gt;But why, you ask? Why take our hard-earned intellectual property worth hundreds of hours of consultant hours and just share them with everyone?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Open source, open knowledge&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, first thing is that the knowledge in those pages isn't worth more than how much they are used. If more people use them, the (especially Java) community can benefit as a whole, and make our work easier/more fun. We have to work with our competitors on many projects, so if we can help them for example understand &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Enterprise+Maven+infrastructure"&gt;how to set up a Maven enterprise infrastructure&lt;/a&gt;, then we will benefit as well in the long run.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Good PR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, obvious argument isn't it :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;We needed a good wiki for these open source projects&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;We wished to host a Confluence for the &lt;span id="spaceFullNameLink"&gt;&lt;/span&gt;&lt;a href="http://wiki.community.objectware.no/display/BCT"&gt;Backward Compatibility Tester&lt;/a&gt; and the &lt;a href="http://edr.dev.java.net/"&gt;EDR project&lt;/a&gt;. More will probably follow soon. Sorry CollabNet, but your wiki sucks.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;We need help!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;We want input from other people who have experiences with the tools we use. We're hoping that people will contribute back with either their knowledge, or link to places where it exists on the net.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why it might be a bad idea..&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;My main concern is that we'll get some negative reactions claiming we are duplicating/harnessing documentation which should reside other places. Well, we're too impatient to wait for these other places to update their FAQs and wiki pages with our stuff. If they wish they can just copy the content back to their sites whenever they feel like it.&lt;br /&gt;&lt;br /&gt;There are some other concerns, like what license should we use, spam-prevention, and cross-wiki search (well, atleast now we can search the wiki with Google).&lt;br /&gt;&lt;br /&gt;And finally, it might just not take off because people might be too shy to write stuff on the public wiki. Well, we'll see how it goes. No matter what, it will be my (and some others) way of sharing stuff with partners and other people in the community when we want to get some content *out there* quickly. Feel free to use it for the same.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;It's not more than 81 pages out there yet, but take a look at &lt;a href="http://wiki.community.objectware.no/display/smidigtonull/Home"&gt;the Smidig 2.0 stuff&lt;/a&gt;. It has a lot of good stuff about Maven and testing strategies, among other things.  We've tried to keep all of it in English but some of it is still Norwegian, unfortunately. Smidig 2.0 roughly translates into "Agile 2.0" and is our pet-name for practices that have evolved after the first wave of agile bubbles.  If you know Norwegian you can take a look at &lt;a href="http://smidig.no/smidig2007/talks/61"&gt;Totto's presentation from the Smidig 2007 conference&lt;/a&gt; for some more thoughts on that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4722714320108004777?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=detYA-rZkUg:WKm9aopyUK4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=detYA-rZkUg:WKm9aopyUK4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/detYA-rZkUg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/4722714320108004777/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=4722714320108004777" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4722714320108004777" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4722714320108004777" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/detYA-rZkUg/sharing-knowledge.html" title="Sharing the knowledge" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/06/sharing-knowledge.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-7556171847689715972</id><published>2008-04-27T00:34:00.004+02:00</published><updated>2008-12-11T09:27:36.758+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">Here's a nice way of taking notes</title><content type="html">Inspired by &lt;a href="http://www.brodwall.com/johannes/blog/2008/03/13/post-it-fetish/"&gt;Johannes' post-its&lt;/a&gt; and &lt;a href="http://andersnoras.com/blogs/anoras/archive/2008/03/10/notebook-fetish.aspx"&gt;Anders' moleskin&lt;/a&gt;, I'd like to share my tip'o'the day for taking notes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Step 1&lt;/span&gt;: Find a stack of A3 sheets, big ones!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Step 2:&lt;/span&gt; Get a good thick nice pen (mine could've been thicker)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Step 3:&lt;/span&gt; Lay the sheets on your desk between yourself and your keyboard (warning, not sure this is ergonomically wise thing to do).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Step 4: &lt;/span&gt;Whenever you show off stuff, especially code and stuff you've got on yer computer, support your presentations with drawings and notes on the sheet.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZBn5rO9Auoo/SBOxMJkOxrI/AAAAAAAAAOo/R78ZDZt3peg/s1600-h/24042008018.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_ZBn5rO9Auoo/SBOxMJkOxrI/AAAAAAAAAOo/R78ZDZt3peg/s320/24042008018.jpg" alt="" id="BLOGGER_PHOTO_ID_5193689617572742834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Step 5:&lt;/span&gt; When you're done, hand the sheet off to the person you drew it for, or whenever the drawing ends up particularly pretty, smack it up on the wall behind you. Or throw it out if it's all squabbly wabbly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZBn5rO9Auoo/SBOxZJkOxsI/AAAAAAAAAOw/Z0Er55gJ374/s1600-h/24042008020.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_ZBn5rO9Auoo/SBOxZJkOxsI/AAAAAAAAAOw/Z0Er55gJ374/s320/24042008020.jpg" alt="" id="BLOGGER_PHOTO_ID_5193689840911042242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This way, I don't have to get up to use a flip-over, I don't have to take useless digital pics of the white-board, and I get to show off my l33t UML-skills without having to use some crappy software. Sweet!&lt;br /&gt;&lt;br /&gt;Diclaimer: I didn't come up with this myself! Credit is due to our architect, who will be revealed if he so wishes :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-7556171847689715972?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=v_Uf-ZujEo0:FrWtYsPyEDc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=v_Uf-ZujEo0:FrWtYsPyEDc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/v_Uf-ZujEo0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/7556171847689715972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=7556171847689715972" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/7556171847689715972" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/7556171847689715972" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/v_Uf-ZujEo0/heres-nice-way-of-taking-notes.html" title="Here's a nice way of taking notes" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZBn5rO9Auoo/SBOxMJkOxrI/AAAAAAAAAOo/R78ZDZt3peg/s72-c/24042008018.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/04/heres-nice-way-of-taking-notes.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-5519272854109436551</id><published>2008-04-27T00:03:00.006+02:00</published><updated>2008-12-11T09:27:36.967+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><title type="text">Why I keep badgering on about Web Testing..</title><content type="html">Lately I've become somewhat obsessed with &lt;span style="font-weight: bold;"&gt;testing&lt;/span&gt;. A specific kind of testing. I'm not quite sure about the term right now, but it's close to system testing, or maybe user testing. Ye know, that kind of black-box testing that makes sure your stuff works from the user's perspective. In web applications (of which I probably do about 90% of the time) they happen to blend in with &lt;span style="font-weight: bold;"&gt;web tests&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I suppose it started off with last autumn when I put some thoughts on this into &lt;a href="http://smidig.no/smidig2007/talks/9"&gt;my lightning talk at the Smidig 2007 conference&lt;/a&gt;. Well, it actually started all the way back in 2006 when &lt;a href="http://xp.meetup.com/13/calendar/5375800/"&gt;I did a lightning talk about Selenium in XP-meetup&lt;/a&gt; based on my experiences with &lt;a href="http://selenium.openqa.org/"&gt;Selenium&lt;/a&gt; vs. gargantuan use-case descriptions in a project (&lt;a href="http://thomafni.at.ifi.uio.no/temp/usecase_vs_selenium.ppt"&gt;see slides&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://thomafni.at.ifi.uio.no/temp/usecases.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://thomafni.at.ifi.uio.no/temp/usecases.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A few months ago I was down visiting a friend in Bonn, Germany. He works for this CMS-vendor/host called &lt;a href="http://www.webfactory.de/"&gt;WebFactory&lt;/a&gt;. I offered him to drop by their workplace and do a quick demo on Selenium, as I figured they're &lt;span style="font-style: italic;"&gt;(a)&lt;/span&gt; probably doing web applications, and &lt;span style="font-style: italic;"&gt;(b)&lt;/span&gt; they're probably not doing web testing (in the automated figure o' speech).&lt;br /&gt;&lt;br /&gt;Strictly speaking, &lt;span style="font-weight: bold; font-style: italic;"&gt;I&lt;/span&gt; didn't actually do the demo; I had my friend do the demo instead. I took some time in advance to teach him how, and naturally he made a much better point of how to use the tool in their shop than I could. Neat sales trick, eh?&lt;br /&gt;&lt;br /&gt;Anyhow, one of the guys' impression was "&lt;span style="font-style: italic;"&gt;We had no idea it was that easy!&lt;/span&gt;", which is the usual response triggered by showing off Selenium. The 10 minute demo eloped into hours of interesting discussion on all things web, testing, JavaScript, Comet, etc, and the whole thing sort of re-invigorated my feeling of that people still do not know enough about web testing, and the world would be a bit better off if more people knew about it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SBOrepkOxqI/AAAAAAAAAOg/xd9OTyioM_g/s1600-h/selenium.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SBOrepkOxqI/AAAAAAAAAOg/xd9OTyioM_g/s320/selenium.jpg" alt="" id="BLOGGER_PHOTO_ID_5193683338330556066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you don't know what it is, there it is (in its simplest sense). A Firefox plugin that records your browsing instructions and can replay them later on a lot faster than you can with mouse and keyboard.&lt;br /&gt;&lt;br /&gt;A few weeks later I went on to do a 30-minute session on web testing for my current customer's Java developers. Some days later on I held &lt;a href="http://www.uio.no/studier/emner/matnat/ifi/INF5750/h07/undervisningsmateriale/web_testing.pdf."&gt;a 2 hour guest lecture in the University of Oslo's open source course&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I figured, hey, I'm starting to get quite good at presenting this web testing stuff. So I piggy-backed my own effort when writing an abstract submitted to &lt;a href="http://www.javazone.no/"&gt;this year's JavaZone conference&lt;/a&gt;. I have to admit it's not the most academical subject I would've liked to talk about. But I still see people &lt;span style="font-style: italic;"&gt;(a)&lt;/span&gt; doing web applications, and &lt;span style="font-style: italic;"&gt;(b) &lt;/span&gt;not automating their tests. I think it's good talk material because it is:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple and easy to convey&lt;/li&gt;&lt;li&gt;Really useful&lt;/li&gt;&lt;li&gt;(and I'm not trying to push any proprietary stuff here, I'm not even a Selenium committer)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So that's why I keep badgering on about Selenium and web testing. I could write page after page on web testing, but for now, if you're interested, take a look at the links in this post and take Selenium for a spin if you haven't already (the &lt;a href="http://selenium-ide.openqa.org/download.jsp"&gt;new 1.0 beta version&lt;/a&gt; is pretty sweet). And give me a shout on what you would have me write about next time. For instance:&lt;br /&gt;&lt;br /&gt;* How web tests fit into the bigger picture (testing strategies and all that)&lt;br /&gt;* Why I exaggerated when I once said Selenium tests can replace use-cases&lt;br /&gt;* Why manual testing is still important&lt;br /&gt;* Putting Selenium tests into a Continous Integration server (i.e. expanding &lt;a href="http://tfnico.blogspot.com/2007/09/continous-web-testing-with-selenium_16.html"&gt;my last post on the subject&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5519272854109436551?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=cXkoThNdihE:VM6e-M7r-Sg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=cXkoThNdihE:VM6e-M7r-Sg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/cXkoThNdihE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/5519272854109436551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=5519272854109436551" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5519272854109436551" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5519272854109436551" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/cXkoThNdihE/why-i-keep-badgering-on-about-web.html" title="Why I keep badgering on about Web Testing.." /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZBn5rO9Auoo/SBOrepkOxqI/AAAAAAAAAOg/xd9OTyioM_g/s72-c/selenium.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/04/why-i-keep-badgering-on-about-web.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-4041615302256757224</id><published>2008-03-04T20:39:00.003+01:00</published><updated>2008-03-04T23:08:12.662+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><title type="text">Wrapping Scrum in Evolutionary method(s)</title><content type="html">The best grade I ever achieved in college (apart from English) was of all things in the subject of &lt;span style="font-style: italic;"&gt;statistics&lt;/span&gt;. It wasn't particularly fun or fascinating for me. It was just easy, the rules were straight and the formulas were logical (well, I kinda dropped off when we reached quantum statistics, but luckily that wasn't within the curriculum).&lt;br /&gt;&lt;br /&gt;The reason I mention it it that I just came back from this 3-hour presentation about &lt;a href="http://www.gilb.com/community/tiki-page.php?pageName=Evolutionary-Project-Management"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Evo&lt;/span&gt; Project Management&lt;/a&gt;, signed &lt;a href="http://www.gilb.com/community/tiki-view_blog.php?blogId=2"&gt;Tom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Gilb&lt;/span&gt; and Junior (Kai &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Gilb&lt;/span&gt;)&lt;/a&gt;. In short, &lt;span style="font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Evo&lt;/span&gt;&lt;/span&gt; is an agile method focused on measurements.  They have a lot of other sound agile practices in there, but that's the main thing ringing in my head after the presentation: &lt;span style="font-style: italic;"&gt;They use measurements to aid them in prioritizing the backlog.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now Tom's been around the Oslo agile scene for quite a while, he did &lt;a href="http://xp.meetup.com/13/calendar/5306750/?from=list&amp;amp;offset=10"&gt;a presentation in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;XP&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;meetup&lt;/span&gt;&lt;/a&gt; a year ago. I also saw him around on the &lt;a href="http://smidig.no/smidig2007/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Smidig&lt;/span&gt; 2007 conference&lt;/a&gt;, doing an open-space on agile estimation or something.. Didn't attend it myself unfortunately (well, I even managed to miss my own open-space for that matter). Anyhow, this stuff isn't new to me, but it's good to get some &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;freshup&lt;/span&gt; on it, cause each time I hear about it I think "this is good stuff that makes sense!".&lt;br /&gt;&lt;br /&gt;And sense it makes. For instance, Kai started off by presenting the problems with requirement specs today: &lt;span style="font-weight: bold;"&gt;Requirements are expressed through describing the solution.&lt;/span&gt; By example: "Requirement 12a: The solution must be password protected.".&lt;br /&gt;&lt;br /&gt;What's the problem with requirement 12a above? It describes the solution instead of stating the real requirement: &lt;span style="font-style: italic;"&gt;Security&lt;/span&gt;. First state your requirements as &lt;span style="font-style: italic;"&gt;qualities&lt;/span&gt;, then state the level of quality: &lt;span style="font-style: italic;"&gt;The solution should be so secure that it takes a professional security-team more than 4 hours to break in.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;Maybe your solution is better off using a fingerprint-scanner or smart-card solution for security.&lt;br /&gt;&lt;br /&gt;State your requirements, make measurable goals, then let the developers decide on what solutions best serve the requirements.&lt;br /&gt;&lt;br /&gt;This makes sense because it gives you a better way of saying &lt;span style="font-style: italic;"&gt;when you're done&lt;/span&gt; with a task (big problem in agile methods).&lt;br /&gt;&lt;br /&gt;In the long run, the method becomes a self-fulfilling prophecy. If you measure the implementations by their rate of measured of success, it means your discovering which developer efforts are making you money. Supposedly, the method has a track-record of zero failures recorded by the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Gilbs&lt;/span&gt;. If one follows the method strictly, I'm not surprised. You will only do stuff that proves to reward yourself or your customers.&lt;br /&gt;&lt;br /&gt;There is plenty of free documentation around on the subject, so I suggest you take a read, starting off with the &lt;a href="http://www.gilb.com/community/tiki-view_blog.php?blogId=2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Gilbs&lt;/span&gt;' blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now onwards to the problems of the methodology. One of the last things that were said in the course was that it is a &lt;span style="font-style: italic;"&gt;top-down &lt;/span&gt;method only. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Errmmright&lt;/span&gt;. That will be a problem, being the floor-mopping, monkey-coder low level consultant with no &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;political&lt;/span&gt; power that I am (I have to &lt;a href="http://tfnico.blogspot.com/2007/04/how-to-sneak-agile-into-project.html"&gt;sneak stuff in&lt;/a&gt;) :)&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;&lt;br /&gt;So here we are: It's not a how-to, but more of a &lt;span style="font-style: italic;"&gt;10 ideas to get you started measuring success bottom-up for average &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;agilists&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Learn statistics!&lt;/span&gt; Or &lt;a href="http://www.zedshaw.com/rants/programmer_stats.html"&gt;Zed will kill you&lt;/a&gt;.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;2. Managers love numbers, statistics and proof.&lt;/span&gt; Show them concrete figures and they will love you for it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Try to avoid absolute requirements&lt;/span&gt; (meaning political requirements, or solution constraints).  If you do get them, try to connect to a quality requirement  - "Why do you want &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;XHTML&lt;/span&gt;-compliance? Oh, usability, well there are plenty of other things we can do for usability that will be much cheaper and more effective than trying to be &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;XHTML&lt;/span&gt;-compliant.."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Put some numbers on your backlog. &lt;/span&gt;If you've already got an agile method in use in your project, you've probably got a backlog shoved full of requirements (we've got more than we could ever hope to achieve in 2 years). Apply measurable goals to those tasks that you can do so for. "Fixing that bug will probably increase up-time to &lt;a href="http://www.jiploo.com/blog/99999-or-five-nines-uptime/"&gt;5 nines&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Other things you could perhaps measure&lt;/span&gt;: Traffic in your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;webapp&lt;/span&gt;, number of error-lines in your log-files, number of sales. You're probably already measuring velocity on the function points you are delivering each sprint, but be sure to measure the tasks in something else than hours (measure them in difficulty/complexity and/or business value points).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Measure time-to-fix period.&lt;/span&gt; This could come in handy when convincing management to buy into larger rewrites/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;refactoring&lt;/span&gt; efforts. Right now, our mean time to get a larger functionality fix into production is 2-3 sprints. Given &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;refactoring&lt;/span&gt; module X, the time will be reduced to 1 sprint.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Don't kill yourself measuring.&lt;/span&gt; Like in any other practice, be reasonable and use common sense. If it's gonna take you 2 weeks to get a web-traffic analyzing Apache instance up and running in front of your website, drop it (and put Google Analytics in or something). Use subsets, subjective input (you don't have to use empirical research data to measure), &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;quick'n'dirty&lt;/span&gt; measurements.&lt;br /&gt;&lt;br /&gt;Well, I'll try applying the list above when I get into work tomorrow. If I achieve anything remarkable with it I'll post back on the subject later. My biggest worry is that the backlog is choked with &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;political&lt;/span&gt; requirements that are not based on measurable factors. Priorities are partly based on which stakeholder has got the biggest mouth or the biggest money-bag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4041615302256757224?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=PXb9kIzUtMY:clERTx3hB2A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=PXb9kIzUtMY:clERTx3hB2A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/PXb9kIzUtMY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/4041615302256757224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=4041615302256757224" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4041615302256757224" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4041615302256757224" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/PXb9kIzUtMY/wrapping-scrum-in-evolutionary-methods.html" title="Wrapping Scrum in Evolutionary method(s)" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/03/wrapping-scrum-in-evolutionary-methods.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-6929558730640992276</id><published>2008-02-04T22:19:00.000+01:00</published><updated>2008-02-05T00:03:59.582+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">Legacy Code, Broken Windows and Code Quality</title><content type="html">Long time since last post. It's not that I have been particularly busy, just haven't had anything *that* interesting to write about.  Well, this might be interesting:&lt;br /&gt;&lt;br /&gt;I know this legacy system. Well, it's not that much of a legacy system, it's barely a couple of years old. But it sure didn't take it too long to become difficult to maintain. Maybe you've seen similar scenarios... A big team of developers and consultants with lots of funding creates a big-bang super solution. Struggling to reach a deadline, at some point &lt;span style="font-weight: bold;"&gt;quality &lt;/span&gt;was left behind (or post-poned). We're talking compiler warnings, copy/paste code, hacks, quick'n'dirty (&lt;a href="http://blog.objectmentor.com/articles/2007/12/13/business-software-is-messy-and-mgly"&gt;quoting Uncle Bob&lt;/a&gt;: &lt;span style="font-style: italic;"&gt;There is no quick'n'dirty. Dirty means slow.&lt;/span&gt;), bad object-oriented design, the lot.&lt;br /&gt;&lt;br /&gt;Well, I have to say that 80% of the code was golden: agile method, top of the line modern open source lightweight technologies, test-driven development, code reviews, continous integration, etc. But that last &lt;span style="font-weight: bold;"&gt;20% of patchwork really was the start of things getting worse&lt;/span&gt;. We did have this great plan prepared for how we would get things right as soon as we reached the deadline, oh yes, we were going to make everything right again.&lt;br /&gt;&lt;br /&gt;So we made the deadline and the project was a huge success. And what happened? Business people were happy and choffed all the consultants out. One maintainer was left behind to do "critical bug fixes". The &lt;a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows"&gt;broken windows&lt;/a&gt; remained and the make-things-right-again-plan was buried.&lt;br /&gt;&lt;br /&gt;So a year went by. Business decided the solution needed &lt;span style="font-weight: bold;"&gt;new features&lt;/span&gt;. The maintainers desperately tried to keep up with business demands, again consultants were hired to satisfy the need for new functionality. This time, with developers unfamiliar with the existing code-base, more patch-work was done. The coding standards, patterns and technologies were unknown, unclear or inconsistent.&lt;br /&gt;&lt;br /&gt;The existing broken window code had a devestating effect on the work that was done by the new consultants, and of course they were under the same pressure from the business-people, if not more. At the same time the maintainers were trying to do bug fixes in parallell, so the code was branched for several months. Upon merging again, the codebase suffered from alot of conflicts, but still the team didn't dare roll back to the stable code-base. The merge &lt;span style="font-weight: bold;"&gt;had &lt;/span&gt;to be used. It took several months of heroic effort from the maintainers (again, the consultant were choffed out prematurely) to get the codebase stable again, adding up to a total of 6 months without releases in a business critical system. That's &lt;span style="font-weight: bold;"&gt;12 sprints &lt;/span&gt;the way we counted them.&lt;br /&gt;&lt;br /&gt;I suppose scenarios like these end up with the system slowly decaying into the awful legacy system everyone loves to hate until finally its decided to be replaced with an all new big-bang system. And so the circle continues..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;But not this time!&lt;/span&gt; The business has for some mind-perplexing reason actually realised that there is money to be saved from restoring the quality of this system! There will be a series of iterations were the focus is to rid the system of its &lt;a href="http://www.martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt; (man, I love that term). Of course some business value will be delivered in each iteration, but hopefully this time quality tasks will be top priority.&lt;br /&gt;&lt;br /&gt;The moral of the story comes two-fold:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1) Business-people can be taught the value of software quality. They can understand broken windows, it just takes alot of time to get it into their heads. Keep trying. Use good arguments, references and your experience (if you have any), and convince them that quality is the most pragmatic and profit-bound way. And if the project manager won't listen, go to the one above him and tell so. If they won't listen, find another place to work.&lt;br /&gt;&lt;br /&gt;2) As a professional programmer, it is your duty to follow a respectful amount of common sense of ethichs and &lt;a href="http://www.amazon.com/Software-Craftsmanship-Imperative-Pete-McBreen/dp/0201733862"&gt;software craftmanship&lt;/a&gt;. Listen to the tiny voice inside your head saying "this code stinks" and never leave it behind before the little voice says "this code is good enough".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I've had it with people who write lousy code, calling themselves "pragmatic". From now on, I want to be an idealist :)&lt;br /&gt;&lt;br /&gt;I'll finish off with another Uncle Bob quote (or maybe it was &lt;a href="http://www.codinghorror.com/blog/archives/001004.html"&gt;Jeff Atwood&lt;/a&gt;, good blog btw): &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Always leave the code better than when you found it.&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;PS: This post was actually going be about how I wriggled around with &lt;a href="http://www.google.no/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.scala-lang.org%2F&amp;amp;ei=rpenR9fFNqWwwQGa_MTZAg&amp;amp;usg=AFQjCNGYBCTSNmB7f0MMI09DwW_uK_f65w&amp;amp;sig2=T_VKhyhHW73gr-3aZVie2w"&gt;Scala&lt;/a&gt; yesterday, getting my project to build Scala with Maven and still work on it from Eclipse (got it working somewhat but not 100%). Appearantly I have forgotten everything I learned about functional languages in Uni (&lt;a href="http://www.smlnj.org/"&gt;ML&lt;/a&gt;), but I have a feeling this approach *might* be the easiest path down the concurrency landscape to come for us Java devs.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-6929558730640992276?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=xr7FuAR1uX4:X4kGtsxzwu8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=xr7FuAR1uX4:X4kGtsxzwu8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/xr7FuAR1uX4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/6929558730640992276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=6929558730640992276" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6929558730640992276" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6929558730640992276" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/xr7FuAR1uX4/legacy-code-broken-windows-and-code.html" title="Legacy Code, Broken Windows and Code Quality" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2008/02/legacy-code-broken-windows-and-code.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-1632945346466875648</id><published>2007-12-01T17:15:00.000+01:00</published><updated>2008-12-11T09:27:37.214+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="objectware" /><category scheme="http://www.blogger.com/atom/ns#" term="methodology" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title type="text">My excuse for not blogging the last month</title><content type="html">Recent activities eating away blog-activity include mostly JAFS - our annual internal weekend getaway. JAFS essentially means hauling our ~40 Java-programming colleagues off to a desolate hotel for a weekend, doing not so much else than having fun programming (and shooting some paintball).&lt;br /&gt;&lt;br /&gt;The concept of the weekend's tasks are based on the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Divide the gang into 5 groups&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Present some technologies that are &lt;span style="font-weight: bold;"&gt;core&lt;/span&gt;, meaning everyone of us should know by heart (for instance Spring and Maven)&lt;/li&gt;&lt;li&gt;Present some new technologies that are &lt;span style="font-weight: bold;"&gt;hot&lt;/span&gt;, and might come in handy in the near future (for instance JRuby and OpenESB)&lt;/li&gt;&lt;li&gt;Do some cool programming competition that makes use of above technologies&lt;/li&gt;&lt;/ol&gt;These points demand a mass of preperations. We've been 5 people spending evenings and weekends planning the event for the last month.&lt;br /&gt;&lt;br /&gt;First we spent a whole load of time settling on which tehcnologies to focus on. See we've got four different camps of technology groups in Objectware, each of which are tugging in different directions, mainly core, web, integration and enterprise design &amp;amp; architecture. I like to believe we achieved doing a fair divide between the different camps, since these four camps are paying for the whole ordeal ;)&lt;br /&gt;&lt;br /&gt;We also spent alot of time agreeing on the programming competition. Well, we actually settled on not doing a programming &lt;span style="font-style: italic;"&gt;competition&lt;/span&gt;, instead focusing on cooperation between the 5 teams. Instead of having different teams compete over who could do the best implementation using different technologies (like we did last year), each team were to implement parts of a larger system which would cooperate using services across an ESB.&lt;br /&gt;&lt;br /&gt;The system itself was sort of a collaboration suite framework, based on Subversion commits, Continous Integration and a robot. The ultimate functionality of the system: If you break the build, lil' Timmy here will come driving into your cubicle and steal your beer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZBn5rO9Auoo/R1GPysvYNhI/AAAAAAAAANM/0Z-6pAJjIM8/s1600-R/robot.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZBn5rO9Auoo/R1GPysvYNhI/AAAAAAAAANM/zD_zb8216dU/s320/robot.jpg" alt="" id="BLOGGER_PHOTO_ID_5139046750972556818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To be honest the solution will not be used directly, but the codebase does contain alot of good reference implementation of the various technologies we involved. We also got a good heap of discussions regarding among other things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Shared domain model among the teams&lt;/li&gt;&lt;li&gt;Contract-driven development&lt;/li&gt;&lt;li&gt;A bunch of problems using JRuby (hint: it's too early)&lt;/li&gt;&lt;li&gt;The &lt;a href="https://edr.dev.java.net/"&gt;Enterprise Domain Repository pattern&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Struts2 Best Practices&lt;/li&gt;&lt;/ul&gt;Oh, another thing we had to do in advance: we spent a whole lot of time implementing Proof-of-Concepts on each tecnhology to help the teams get started once they got up there. Now there was a learning experience :)&lt;br /&gt;&lt;br /&gt;Aaand, the number one rule of bringing 40 programmers to a hotel: DO NOT TRUST THE NETWORK! Excactly. Even if the hotel has promised you full wireless, it ain't gonna work with 30 people who are trying to connect to the Maven repository, Subversion, etc etc.&lt;br /&gt;&lt;br /&gt;So, we set up a mighty fine Ubuntu box with the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DHCP-service for allocating all the teams an address on our subnet (jafs.objectware.no)&lt;/li&gt;&lt;li&gt;DNS/bind for all the interal addresses on the domain&lt;/li&gt;&lt;li&gt;Subversion repo on svn.jafs.objectware.no&lt;/li&gt;&lt;li&gt;Continous Integration server on ci.jafs.objectware.no&lt;/li&gt;&lt;li&gt;Maven repositories on repo.jafs.objectware.no (snapshot-repo, release-repo and site-repo)&lt;/li&gt;&lt;li&gt;IRC server (of course!) on irc.jafs.objectware.no&lt;/li&gt;&lt;/ul&gt;And of course we brought along 40 TP-cables and a handful of switches to provide each contender with wired network.&lt;br /&gt;&lt;br /&gt;Now it might seem like a bunch of uneccesary mumbo to setup all these wires, aliases and services, but believe me we all appreciated being able to just hook into a 100/1000-MBit network and be up and running. Zero network problems, I tell ye :)&lt;br /&gt;&lt;br /&gt;So that was JAFS... Right after we were done I had to get ready for delivering &lt;a href="http://smidig.no/smidig2007/talks/9"&gt;my 10 minute lightning talk&lt;/a&gt; on &lt;a href="http://smidig.no"&gt;Smidig 2007&lt;/a&gt; (the Norwegian Agile-community's first conference). The conference was as impressive in implementation as was its lack of up-front planning (taking about two months to prepare, was it?).&lt;br /&gt;&lt;br /&gt;The conference left me inspired and hungry for more. If I remember, the next post will be about &lt;span style="font-style: italic;"&gt;distributed continous integration&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-1632945346466875648?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=KaJ9yKFPo8c:nPtqQLL9kkM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=KaJ9yKFPo8c:nPtqQLL9kkM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/KaJ9yKFPo8c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/1632945346466875648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=1632945346466875648" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1632945346466875648" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1632945346466875648" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/KaJ9yKFPo8c/my-excuse-for-not-blogging-last-month.html" title="My excuse for not blogging the last month" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZBn5rO9Auoo/R1GPysvYNhI/AAAAAAAAANM/zD_zb8216dU/s72-c/robot.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2007/12/my-excuse-for-not-blogging-last-month.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-7494733609490786523</id><published>2007-10-22T22:29:00.000+02:00</published><updated>2007-10-22T23:35:29.667+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title type="text">So you thought Spring's autowiring was a no-no?</title><content type="html">Think again.&lt;br /&gt;&lt;br /&gt;Yet another Spring 2.5 feature, the &lt;span style="font-family: courier new;"&gt;@Autowired&lt;/span&gt; annotation gives you back the control of autowiring, by-type mind. Back in Spring 2.0, autowiring was considered by many to be an anti-pattern due to the lack of control and overview of which beans would actually be injected at runtime. With annotation driven injection (meaning you've got &lt;span style="font-family: courier new;"&gt;&lt;context:annotation-config/&gt;&lt;/span&gt; in some Spring XML file), objects are only injected when you explicitly state so.&lt;br /&gt;&lt;br /&gt;This allows you to reduce the amount of dependency mapping in your Spring XML config files and replace them with annotations in your Java files. If you've got multiple implementations that are possible autowiring candiates, you segment them by using the &lt;span style="font-family: courier new;"&gt;@Qualifier&lt;/span&gt; annotation.&lt;br /&gt;&lt;br /&gt;Rather than riddle this blog post with snippets of Java and XML, I want you to get &lt;a href="http://sourceforge.net/cvs/?group_id=73357"&gt;the Spring source&lt;/a&gt; (you can import it into Eclipse easily) and check out this test:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/spring/tiger/test/org/springframework/beans/factory/xml/QualifierAnnotationTests.java&lt;/span&gt;&lt;a href="file:///C:/projects/spring/tiger/test/org/springframework/beans/factory/xml/QualifierAnnotationTests.java"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been playing around with these features lately and must say they are working nicely. Beware of how/whether you decide to use the &lt;span style="font-family: courier new;"&gt;&lt;context:component-scan/&gt;&lt;/span&gt; instead of explicitly stating your beans in XML files. Yup, this means you can pretty much avoid XML completely in your Spring configuration.&lt;br /&gt;&lt;br /&gt;It's a matter of taste really, but be consistent in the way you declare your components (either by XML or annotation). Make sure your whole team are aware of what is going on, as it can still feel quite auto-magical to the non-initiated.&lt;br /&gt;&lt;br /&gt;If you're not interested in fiddling with the Spring source (which you should be - it does after all provide quite a few examples on how the Spring devs are eating their own dogfood), you can click some of the links below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.interface21.com/main/2007/05/14/annotation-driven-dependency-injection-in-spring-21/"&gt;Mark Fisher blogged about these features&lt;/a&gt; a while back, and Rod Johnson recently posted &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25"&gt;an extensive article on TheServerSide about Spring 2.5&lt;/a&gt;. The tutorial gives a good introduction to the entire set of 2.5 features, including the annotation driven injection I've mentioned in this post and the &lt;a href="http://tfnico.blogspot.com/2007/09/spring-textcontext-framework.html"&gt;Spring TestContext Framework I blogged about earlier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll take this opportunity to remind any Oslo developers that we're doing &lt;a href="http://objectware.no/no/Om_objectware/Nyheter/Core-Spring-kurs-i-Oslo/"&gt;a Spring course together with Interface21 in November&lt;/a&gt;, an excellent opportunity to jump on the Spring wagon and get a kick-start on lightweight system development and architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-7494733609490786523?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=W9RZkyjtuU4:c7zEMCxMTCg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=W9RZkyjtuU4:c7zEMCxMTCg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/W9RZkyjtuU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/7494733609490786523/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=7494733609490786523" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/7494733609490786523" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/7494733609490786523" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/W9RZkyjtuU4/so-you-thought-springs-autowiring-was.html" title="So you thought Spring's autowiring was a no-no?" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2007/10/so-you-thought-springs-autowiring-was.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-11485756.post-3310170789729584745</id><published>2007-09-30T21:07:00.000+02:00</published><updated>2007-09-30T22:16:45.486+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title type="text">Spring TestContext Framework</title><content type="html">I'm somewhat surprised that there hasn't been more noise around in the blogosphere about &lt;a href="http://www.springframework.org/node/525"&gt;Spring 2.1&lt;/a&gt;'s &lt;span style="font-style: italic;"&gt;TestContext Framework&lt;/span&gt;. I had the pleasure of working with Juergen Hoeller for a day after JavaZone. Among other things, I learned about the fancy &lt;a href="http://static.springframework.org/spring/docs/2.1.x/api/org/springframework/beans/factory/annotation/Autowired.html"&gt;@Autowired annotation&lt;/a&gt; that you can use to make your autowiring much safer. Normally autowiring is considered bad practice, but it was Juergen's advice that now it is okay to use. This means in practice that all your service beans will still be declared in an applicationContext.xml file, but the dependencies and object graphs will be annotated in the Java files (or atleast where you see fit).&lt;br /&gt;&lt;br /&gt;After this I had a deeper look into the features of Spring 2.1. Note the point about "our next-generation &lt;a href="http://static.springframework.org/spring/docs/2.1.x/reference/testing.html#testcontext-framework"&gt;Spring TestContext Framework&lt;/a&gt; with support for JUnit4". Now this is cool.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Why we need it (or something like it)&lt;/span&gt;&lt;br /&gt;For a long while I (and many of my colleagues and peers) have been annoyed by the disability to manage tests as the amount grows. There hasn't been any good framework around for doing any kind of categorization of tests. Each project would have to invent their own set of hacks in order to control their test suites, be it a TestFactory picking up system variables, or using different Maven profiles and source folders for different categories of tests. In short, inventing some sort of convention for seperating tests: put them in different folders, use name conventions like *Test.java, and *IntegrationTest.java.&lt;br /&gt;&lt;br /&gt;Have you ever been in a project where you and your team dropped automated testing because you couldn't manage the mass of tests? Well, tools are starting to appear now that can save your hiney.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;TestNG solves this. Why don't you just use that&lt;span style="font-style: italic;"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;span class="emphasis"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;The first solution that many have become aware of is &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt;. I really like the feauteres, but as of Alex presentation on &lt;a href="http://tfnico.blogspot.com/2007/09/post-javazone-2007.html"&gt;JavaZone&lt;/a&gt;, Maven's surefire plugin still has issues running TestNG. Also, Eclipse (our standard IDE) has built in support for JUnit4. And finally, Spring comes with a bunch of &lt;a href="http://www.springframework.org/docs/api/org/springframework/test/AbstractDependencyInjectionSpringContextTests.html"&gt;lovely standard testbase&lt;/a&gt; classes that make your integration tests nicer. Oh, wait. &lt;span style="font-style: italic;"&gt;You don't want your test to inherit from a Spring class&lt;/span&gt;? Read on to find out. Final reason: everyone knows JUnit and not too many know TestNG (sorry Alex..). &lt;span class="emphasis"&gt;&lt;em&gt;&lt;tt class="interfacename"&gt;&lt;/tt&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;There's a new kid in town&lt;/span&gt;&lt;br /&gt;Spring TestContext Framework introduces a wide range of new annotations for doing tests, my absolute favourite being the &lt;span style="font-style: italic;"&gt;@IfProfileValue &lt;/span&gt;that you can use to specify testing environment (in other words implement the test categorization I spoke of above). There is only one implemented ProfileValueSource (being the logic that decides which profile it is) that checks for system variables, but it is easy to extend with your own ProfileValueSource class that contains the logic for deciding which tests to run.&lt;br /&gt;&lt;br /&gt;As promised: avoid extending Spring's testbase classes: Use the &lt;a href="http://static.springframework.org/spring/docs/2.1.x/api/index.html?org/springframework/beans/factory/annotation/Autowired.html"&gt;@RunWith(SpringJUnit4ClassRunner.class&lt;/a&gt; annotation instead.&lt;br /&gt;&lt;br /&gt;You got the regular nifty annotations like &lt;span style="font-style: italic;"&gt;@Repeat &lt;/span&gt;(guess what it does) &lt;span style="font-style: italic;"&gt;@Timed&lt;/span&gt; (fails if the tests exceeds a time limit, different from JUnit 4's timeout attribute), plus a bunch of Spring environment controlling transactions and Spring contexts. You don't need to use the &lt;span style="font-style: italic;"&gt;@ExpectedException&lt;/span&gt; any more because JUnit4 supplied us with the &lt;span style="font-style: italic;"&gt;@Test(expected=RuntimeException.class&lt;/span&gt;) functionality. Spring people recommend that you use JUnit's way of doing it.&lt;br /&gt;&lt;br /&gt;"Caching between testing", and "injection of test fixtures". Sounds lovely, doesn't it? Sounds alot like the presentation of TestNG, but hey, it's JUnit :)&lt;br /&gt;&lt;br /&gt;There is also a pretty cool &lt;span style="font-style: italic;"&gt;@ContextConfiguration&lt;/span&gt; annotation for declaring which Spring bean XML files you want to use for a particular test.&lt;br /&gt;&lt;br /&gt;Actually, instead of me repeating the whole documentation, why don't you take a look for yourself. Note that I haven't actually played around with this properly yet (well, we got as far as getting the M4 build into our maven repository) cause I left my laptop in work. I'm gonna try setting up the machine here tonight and see if I can get something done before bedtime.&lt;span class="bold"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By the way, some shameless company promotion: My employer is doing &lt;a href="http://objectware.no/no/Om_objectware/Nyheter/Core-Spring-kurs-i-Oslo/"&gt;a course on Spring 2 with Interface21 in Oslo in the beginning of November&lt;/a&gt;. Per is a really friendly guy, so don't hesitate to give him a call and ask about it if you're curious :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-3310170789729584745?l=tfnico.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=wfrwU2ppGWA:ZQRRtugJDgs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=wfrwU2ppGWA:ZQRRtugJDgs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/wfrwU2ppGWA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tfnico.blogspot.com/feeds/3310170789729584745/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11485756&amp;postID=3310170789729584745" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3310170789729584745" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3310170789729584745" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/wfrwU2ppGWA/spring-textcontext-framework.html" title="Spring TestContext Framework" /><author><name>Thomas Ferris Nicolaisen</name><uri>http://www.blogger.com/profile/17464665832399025601</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="11536302075262044655" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tfnico.blogspot.com/2007/09/spring-textcontext-framework.html</feedburner:origLink></entry></feed>
