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

<channel>
	<title>Unmaintainable</title>
	<atom:link href="http://unmaintainable.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://unmaintainable.wordpress.com</link>
	<description>Scripting, Software Engineering and Stuff in Between</description>
	<lastBuildDate>Fri, 12 Jun 2009 13:20:32 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/6f90ae5619dfc90140df401ac60575d2?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Unmaintainable</title>
		<link>http://unmaintainable.wordpress.com</link>
	</image>
			<item>
		<title>A Case for Guard Clauses</title>
		<link>http://unmaintainable.wordpress.com/2009/06/12/a-case-for-guard-clauses/</link>
		<comments>http://unmaintainable.wordpress.com/2009/06/12/a-case-for-guard-clauses/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 13:20:32 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[best practices]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[quality]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=283</guid>
		<description><![CDATA[One of my pet peeves in programming is that few people use guard clauses. A guard clause is an almost trivial concept that greatly improves readability. Inside a method, handle your special cases right away and return immediately.

Have a look at the following example:

private int doSomething() {
    if (everythingIsGood()) {

   [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=283&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>One of my pet peeves in programming is that few people use guard clauses. A guard clause is an almost trivial concept that greatly improves readability. Inside a method, handle your special cases right away and return immediately.</p>
<p><span id="more-283"></span></p>
<p>Have a look at the following example:</p>
<pre>
private int doSomething() {
    if (everythingIsGood()) {

        /*
         * Lots and lots of code here, but that's a different story.
         */

        return SOME_VALUE;
    } else {
        return ANOTHER_VALUE;  // a special case
    }
}
</pre>
<p>You can easily rewrite it using the <a href="http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html">Replace Nested Conditional with Guard Clauses</a> refactoring from Martin Fowler&#8217;s <a href="http://martinfowler.com/books.html#refactoring">Refactoring</a>:</p>
<pre>
private int doSomething() {
    if (! everythingIsGood()) // &lt;-- this is your guard clause
        return ANOTHER_VALUE;

    /*
     * Lots and lots of code here, but that's a different story.
     */

    return SOME_VALUE;
}
</pre>
<p>Once you&#8217;ve read past the conditional(s) at the beginning of the method, you know that your world is in order and you don&#8217;t have to worry about special cases anymore.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/283/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=283&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/06/12/a-case-for-guard-clauses/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>New Project: JSysTest</title>
		<link>http://unmaintainable.wordpress.com/2009/05/23/jsystest/</link>
		<comments>http://unmaintainable.wordpress.com/2009/05/23/jsystest/#comments</comments>
		<pubDate>Sat, 23 May 2009 10:39:57 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[distributed systems]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=271</guid>
		<description><![CDATA[I love unit tests and use them whenever possible. But in the end, there&#8217;s no substitute for a full scale system test. Only after system testing, you can be sure that everything works as intended. When I was looking for a way to test a REST-style JSON web service, I decided to create a small [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=271&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I love unit tests and use them whenever possible. But in the end, there&#8217;s no substitute for a full scale system test. Only after system testing, you can be sure that everything works as intended. When I was looking for a way to test a REST-style JSON web service, I decided to create a small testing framework to simplify the task.</p>
<p><span id="more-271"></span></p>
<p>The result is the <a href="http://code.google.com/p/jsystest">JSysTest</a> framework written in Java. Using JSysTest, you can create functional web service tests based on JUnit 4 and its Hamcrest-based assertion DSL. With the help of some custom matchers, a test can look as concise as this:</p>
<pre>
  assertThat(get("/some-resource"), has(status(404)));
</pre>
<p>Have a look at the <a href="http://code.google.com/p/jsystest/">Documentation</a> for a few more examples.</p>
<p>The framework is still in its early stages of development and is likely to change. I still don&#8217;t know how to make HTTP POST and PUT methods as elegant as the GET case, but I&#8217;m sure a pattern will emerge at some point.</p>
<p>I think the most important lesson to take away from this little experiment is that you can simplify your tests significantly if you invest a bit of time for building a highly specialized DSL.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/271/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/271/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/271/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/271/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/271/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=271&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/05/23/jsystest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Google Collections Reaching 1.0</title>
		<link>http://unmaintainable.wordpress.com/2009/04/13/google-collections-reaching-10/</link>
		<comments>http://unmaintainable.wordpress.com/2009/04/13/google-collections-reaching-10/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 20:53:04 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=228</guid>
		<description><![CDATA[Exciting news for Java developers: The first 1.0 release candidate of Google Collections has been released. For almost a year I&#8217;ve been waiting for this, and now it seems the waiting will soon be over.

Basically, Google Collections is a better, more consistent version of commons-collections with generics and a few cool things that let you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=228&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Exciting news for Java developers: The first 1.0 release candidate of <a href="http://code.google.com/p/google-collections/">Google Collections</a> has been released. For almost a year I&#8217;ve been waiting for this, and now it seems the waiting will soon be over.</p>
<p><span id="more-228"></span></p>
<p>Basically, Google Collections is a better, more consistent version of <a href="http://commons.apache.org/collections/">commons-collections</a> with generics and a few cool things that let you almost use a functional style in Java (at least as far as this is possible). I think this library will quickly become a standard dependency in my Java projects.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/228/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/228/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/228/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/228/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/228/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=228&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/04/13/google-collections-reaching-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Simplifying Server Deployment</title>
		<link>http://unmaintainable.wordpress.com/2009/04/12/simplifying-server-deployment/</link>
		<comments>http://unmaintainable.wordpress.com/2009/04/12/simplifying-server-deployment/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 08:43:20 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=194</guid>
		<description><![CDATA[Configuring servers is tedious work if you operate a cluster of more than a few machines (if you&#8217;re a regular reader, you&#8217;ve heard about it). I&#8217;ve created a simple deployment framework that helps with building deployment packages based on central configuration templates. It is ant-based, so people from the Java world should have no problem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=194&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Configuring servers is tedious work if you operate a cluster of more than a few machines (if you&#8217;re a regular reader, you&#8217;ve <a href="/2008/09/07/webapp-deployment/">heard about it</a>). I&#8217;ve created <a href="http://users.musicbrainz.org/~matt/misc/sdf-0.1.tar.gz">a simple deployment framework</a> that helps with building deployment packages based on central configuration templates. It is ant-based, so people from the Java world should have no problem to adjust it to their needs. Read on to find out how it works.</p>
<p><span id="more-194"></span></p>
<h4>The Server Deployment Framework (SDF)</h4>
<p>Based on a server template, a bit of configuration and your application, this little framework creates a self-contained deployment package ready for installation. The package contains both the server itself and the application, so you always start from a clean slate. There&#8217;s no cruft left between installations.</p>
<p>With SDF, there&#8217;s a separation of responsibilities between developers and admins. Developers provide the application in a <cite>.war</cite> file. The <cite>.war</cite> file has no environment-specific configuration. Admins are responsible for configuring the application for the target environment. The general ideas is that the same application artifact that is handed to the QA department is also installed on the production systems.</p>
<p>This is how it works:</p>
<ol>
<li>Create a server template in the <cite>src</cite> directory. Replace important configuration values with wildcards. Rename all files containing wildcards to filename.in (think autoconf).</li>
<li>Place your web applications in the base directory&#8217;s <cite>webapps</cite> directory.</li>
<li>Create/edit the environment configuration in the <cite>conf</cite> directory, ie. <cite>ENV-NAME.properties</cite>.</li>
<li>Run <cite>ant package -Dapp.environment=ENV-NAME</cite>.</li>
<li>You&#8217;ll find your pre-configured deployment package in the target directory.</li>
</ol>
<p>Repeat steps 2-5 any time you want to make a new release.</p>
<h4>The Bundled Tomcat</h4>
<p>A few words on the bundled Tomcat instance: It is for illustration only and hasn&#8217;t been configured for production use. There are a couple of interesting ideas though.</p>
<p>All ports settings have a &#64;PORT_PREFIX&#64; wildcard. That way you can run multiple Tomcat instances on one host by changing the prefix parameter. This is useful for rollouts: You can start up and check the new revision while the old one is still running. Using loadbalancer settings, you can switch over to the new application and later shut down the old revision.</p>
<p>In <cite>conf/context.xml</cite>, an example context parameter has been set. This is a simple way of passing environment-specific parameters to your application without having to change anything inside the <cite>.war</cite> file.</p>
<p>As a general rule, it&#8217;s a good idea to run just one web application per Tomcat instance. This way, it&#8217;s easier to figure out which application is misbehaving. In large operations with high performance requirements, this is the normal case anyway. When you follow the single application rule, you can as well turn off hot deployment.</p>
<p>Since applications tend to crash sometimes (OutOfMemory exceptions happen to the best of us), it makes sense to restart the server automatically without admin intervention. One easy solution to do this is to run Tomcat inside a JavaServiceWrapper that makes sure your JVM is in a healthy state. Remote restarts and easy JMX access are helpful additional features.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/194/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=194&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/04/12/simplifying-server-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>CAP, Consistent Hashing, etc.</title>
		<link>http://unmaintainable.wordpress.com/2009/03/22/cap-consistent-hashing/</link>
		<comments>http://unmaintainable.wordpress.com/2009/03/22/cap-consistent-hashing/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 09:18:15 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[computer science]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[distributed systems]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=182</guid>
		<description><![CDATA[I&#8217;ve been reading up on distributed systems again. For quite a while, my monthly copy of CACM has been my only connection to computer science topics. This time, I followed a few references and came across interesting concepts (most of them familiar from back in university).

Amazon doesn&#8217;t just sell books over the internet, they&#8217;re building [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=182&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been reading up on distributed systems again. For quite a while, my monthly copy of <a href="http://cacm.acm.org/">CACM</a> has been my only connection to computer science topics. This time, I followed a few references and came across interesting concepts (most of them familiar from back in university).</p>
<p><span id="more-182"></span></p>
<p>Amazon doesn&#8217;t just sell books over the internet, they&#8217;re building fascinating systems, too. And sometimes they write articles and papers about it, like in January&#8217;s edition of CACM (see <a href="http://portal.acm.org/citation.cfm?id=1435417.1435432&amp;coll=portal&amp;dl=ACM&amp;idx=J79&amp;part=magazine&amp;WantType=Magazines&amp;title=Communications%20of%20the%20ACM&amp;CFID=://cacm.acm.org/&amp;CFTOKEN=cacm.acm.org/">Eventually consistent</a>). If you&#8217;re familiar with Eric Brewer&#8217;s CAP theorem, you know that in a distributed system, you can decide for only two design goals out of consistency, availability and partition resilience. In traditional systems, consistency is highly valued, but if you&#8217;re willing to trade in consistency for availability, you can build high-performance systems.</p>
<p>One of these systems is <a href="http://portal.acm.org/citation.cfm?id=1294261.1294281&amp;coll=portal&amp;dl=ACM&amp;CFID=27053033&amp;CFTOKEN=80198954">Dynamo</a>, a highly available, distributed key-value store that is part of Amazon&#8217;s internal infrastructure. Dynamo is write-optimized, writes are almost always possible, even if some replicas aren&#8217;t updated. Inconsistencies are resolved during read, typically by business logic inside the application itself.</p>
<p>Dynamo uses <a href="http://portal.acm.org/citation.cfm?id=258533.258660&amp;coll=portal&amp;dl=ACM&amp;CFID=27053033&amp;CFTOKEN=80198954">Consistent Hashing</a>, which is used in distributed hash tables (DHTs) like <a href="http://en.wikipedia.org/wiki/Chord_(DHT)">Chord</a>. This way, nodes can join and leave the network without having to remap the whole key space. As a friend succinctly put it &#8220;Yes, in a non-hostile environment, DHTs really work. They&#8217;re not only useful for distributing cam-rips on the Internet&#8221;. If you&#8217;re ever going to build a cache consisting of more than one caching server, Consistent Hashing is definitely something to check out.</p>
<p>Damn, I miss building stuff like this! It&#8217;s a shame that only large operations really need this kind of infrastructure.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=182&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/03/22/cap-consistent-hashing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Development Done Right</title>
		<link>http://unmaintainable.wordpress.com/2009/03/01/development-done-right/</link>
		<comments>http://unmaintainable.wordpress.com/2009/03/01/development-done-right/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 09:53:56 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[best practices]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[rcs]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=174</guid>
		<description><![CDATA[In my projects, I&#8217;ve always been the one who took care of infrastructure, standardization and quality assurance from the development perspective. The funny thing is that I&#8217;m no admin and no QA guy, so most of it wasn&#8217;t even my job. In this article, I&#8217;m going to list a few things that in my opinion [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=174&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In my projects, I&#8217;ve always been the one who took care of infrastructure, standardization and quality assurance from the development perspective. The funny thing is that I&#8217;m no admin and no QA guy, so most of it wasn&#8217;t even my job. In this article, I&#8217;m going to list a few things that in my opinion as a software developer are essential to a professional software project.</p>
<p><span id="more-174"></span></p>
<p>What you need is no secret: If you read a few books and follow some technology blogs you know the bits and pieces. I&#8217;ll list a few things from a Java/Maven perspective, so some of this may or may not apply to other platforms.</p>
<p>First of all define a common <strong>coding style</strong>. I shouldn&#8217;t even have to mention this, but there will be chaos and conflict among developers if you don&#8217;t have it. Just use <a href="http://java.sun.com/docs/codeconv/">Sun&#8217;s Code Conventions</a>, make some exceptions like &#8220;maximum line length is 120 characters&#8221; or &#8220;no tabs allowed&#8221; and you&#8217;re halfway done. Provide a bit of example code (one class, one page of paper) and put it up on a wall. This style guide should include rules for things like logging and exception handling strategies as well. Too few developers are even aware that you need a strategy here, so write it down! Don&#8217;t forget to define package namespaces for your project.</p>
<p>For Java projects provide organization-wide <strong>Maven archetypes</strong> that give you a solid basis for your project. Use existing open source ones to get you started! The effort for this pays off with each new project in reduced setup costs. But wait, each of your projects is different? Oh please, then adjust your build scripts. That&#8217;s no excuse to start from zero each time!</p>
<p>On a related note, invest in a proper internal <strong>Maven repository setup</strong>. Maybe use a stripped down version of <a href="http://blogs.atlassian.com/developer/2008/02/maven_in_our_development_proce_2.html">Atlassian&#8217;s setup</a>. You don&#8217;t want your builds to break just because some external repository isn&#8217;t available. Define rules who may deploy what to your repository. I&#8217;ve seen a lot of chaos here, so remind people to actually <em>think</em> before deploying stuff and breaking builds.</p>
<p>Get yourself a proper <strong>bug tracker</strong> and define how you&#8217;re going to use it. It doesn&#8217;t have to be fancy, a <a href="http://trac.edgewall.com">Trac</a> installation will do in most cases and it will give you a wiki for your technical documentation, too. Do you just track issues or also tasks for developers? What&#8217;s the workflow? Who may open a ticket, who may close it? What amount of testing is required?</p>
<p>For god&#8217;s sake, define rules for working with your <strong>revision control system</strong>. How often should developers check in? How should a commit message look? How does your release process look like? When do you create a branch, how are releases tagged etc. Read up on the features of your system, branching may no longer hurt. Move on if you&#8217;re still using CVS.</p>
<p>A professional software project needs <strong>continuous integration</strong>. Period. Set it up (I recommend <a href="https://hudson.dev.java.net/">Hudson</a>), define the proper reports and actually read them. It&#8217;s crucial to check test coverage and other metrics right from the beginning. If you add reports later, you will typically get warnings for every other line of source code. Nobody will read those reports anymore and it&#8217;s too much work to clean up the code.</p>
<p>Provide developers with a proper <strong>workstation setup</strong> that corresponds to the platform you&#8217;re targeting. Yes, it&#8217;s a good idea if everyone on the project used the same JVM and application server versions. If that&#8217;s what your production environment uses, even better! It might improve the chance that things actually <em>work</em>. Just saying.</p>
<p>I&#8217;m barely scratching the surface here, but it&#8217;s enough for one article already. For many of the points above you can find articles on the web (check my blog&#8217;s best practices category, for example). And still, it&#8217;s frustrating how little many software companies invest in those bare essentials.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=174&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/03/01/development-done-right/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Django on Google App Engine</title>
		<link>http://unmaintainable.wordpress.com/2009/02/22/django-on-google-app-engine/</link>
		<comments>http://unmaintainable.wordpress.com/2009/02/22/django-on-google-app-engine/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 19:35:51 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[scalability]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=162</guid>
		<description><![CDATA[I&#8217;m back to playing with the Django web development framework again. Since I&#8217;m close to putting something online (it&#8217;s only a matter of years, actually), I&#8217;m also looking into hosting options. Due to the framework choice, Google App Engine appeared on my radar and I had a quick look at it.

Running your web application on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=162&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;m back to playing with the <a href="http://www.djangoproject.com/">Django web development framework</a> again. Since I&#8217;m close to putting something online (it&#8217;s only a matter of years, actually), I&#8217;m also looking into hosting options. Due to the framework choice, <a href="http://code.google.com/appengine/">Google App Engine</a> appeared on my radar and I had a quick look at it.</p>
<p><span id="more-162"></span></p>
<p>Running your web application on Google&#8217;s infrastructure is certainly an intriguing idea. The official into video didn&#8217;t tell me too much, so I watched Guido van Rossum&#8217;s talk <a href="http://www.youtube.com/watch?v=v1gTI4BOPUw">Rapid Development with Python, Django and Google App Engine</a> on YouTube. Based on the information given there I decided against App Engine.</p>
<p>App Engine uses Google&#8217;s high performance distributed database system <a href="http://labs.google.com/papers/bigtable.html">Bigtable</a>. That&#8217;s pretty cool, but of course it works a lot different than a relational database. I&#8217;d have to port my application to Google&#8217;s persistence layer (not <em>that</em> much work yet) but I&#8217;d later be tied to a single hosting provider.</p>
<p>With the Django ORM framework out of the way, Django&#8217;s built-in generic admin site no longer works. This means, one of the framework&#8217;s biggest assets is lost and that&#8217;s the real show stopper for me. </p>
<p>If I were to create a highly scalable web application, the advantages would probably outweigh the disadvantages. But in my case, it means going back to comparing classic web hosters.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/162/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=162&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/02/22/django-on-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Keeping Wikis Useful</title>
		<link>http://unmaintainable.wordpress.com/2009/02/15/keeping-wikis-useful/</link>
		<comments>http://unmaintainable.wordpress.com/2009/02/15/keeping-wikis-useful/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 15:03:37 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[productivity]]></category>
		<category><![CDATA[documentation]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=158</guid>
		<description><![CDATA[Most wiki-based documentation I have worked with has sooner or later turned into a tangled mess of outdated information. Some pages are maintained actively while others aren&#8217;t updated anymore and you never know how reliable the information still is. For a while I&#8217;ve been thinking about a simple technical solution to this problem. Here it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=158&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Most wiki-based documentation I have worked with has sooner or later turned into a tangled mess of outdated information. Some pages are maintained actively while others aren&#8217;t updated anymore and you never know how reliable the information still is. For a while I&#8217;ve been thinking about a simple technical solution to this problem. Here it is.</p>
<p><span id="more-158"></span></p>
<p>My general assumption is that new information is more reliable than old information. That means, a page that has been changed yesterday has a higher chance of being relevant than a page last changed five years ago. The idea isn&#8217;t particularly new: It&#8217;s a bit similar to what <a href="http://www.eclipse.org/mylyn/">Eclipse Mylyn</a> does for Java developers.</p>
<p>A wiki is a graph consisting of pages connected via links. Using age information, you could highlight the subgraph that is most active in respect to changes. Links that lead to newer pages are displayed in a lighter color while links to older pages are displayed in darker colors. Page titles could be color-coded in the same way. Users always know if they&#8217;re in the active center of a wiki or in a rarely updated, possibly outdated area. You can always push pages into the center by making a trivial edit.</p>
<p>Taking the idea one step further, with a little bit more effort a rating system could be implemented. The system could take implicit parameters like age information or page impressions and explicit parameters like user ratings into account. For each page, a score could be calculated that is used for color-coding of links and page titles.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=158&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/02/15/keeping-wikis-useful/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Saving Session Data in Web Applications</title>
		<link>http://unmaintainable.wordpress.com/2009/01/04/session-data-in-webapps/</link>
		<comments>http://unmaintainable.wordpress.com/2009/01/04/session-data-in-webapps/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 12:09:37 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[best practices]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=141</guid>
		<description><![CDATA[There are many ways to store session data in web applications. They all differ in scalability, failover capabilities, and complexity. I&#8217;ll give you a quick rundown on the major themes.

Session Data on the Client
You can often implement simple personalization features or workflows by storing state on the client. From a scalability point of view, it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=141&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>There are many ways to store session data in web applications. They all differ in scalability, failover capabilities, and complexity. I&#8217;ll give you a quick rundown on the major themes.</p>
<p><span id="more-141"></span></p>
<h4>Session Data on the Client</h4>
<p>You can often implement simple personalization features or workflows by storing state on the client. From a scalability point of view, it doesn&#8217;t get any better than that. Not having to keep state on your servers saves you from a lot of trouble.</p>
<p><em>Cookies</em> are a well-understood mechanism that can even be used in a client-only manner using JavaScript. They are useful for small portions of data that aren&#8217;t security relevant. Informal polls or simple preferences like language selections are often implemented via cookies. Cookies also play a major supporting role in user tracking and identification, but that&#8217;s a different story.</p>
<p>Some frameworks save workflow state in <em>hidden form fields</em> (see <a href="http://myfaces.apache.org/">Apache MyFaces</a>). That data can be encrypted by the server to prevent tampering.</p>
<h4>Session Data on Your (Web-)Servers</h4>
<p>For many developers, saving sessions on the front server (which is often a web server) is the most natural choice. That&#8217;s what Java Servlet implementations usually do.</p>
<p>As soon as you need more than one front server, things can become quite tricky. Your environment may support some kind of <em>clustering</em> that provides <em>session replication</em> and <em>failover</em>. No matter which front server gets a request, the session data is already there or will be requested on demand. Depending on the implementation, a failing front server doesn&#8217;t necessarily mean a loss of session data. Apache Tomcat has this feature, as do commercial products. As powerful as this may sound, the approach comes with a rather large price in complexity.</p>
<p>Fortunately, there&#8217;s an easier way: <em>sticky sessions</em>. Your loadbalancer (a HTTP reverse proxy) assigns a cookie to each client on its first request. The cookie determines which front server subsequent client requests are directed to. That means, each client is always directed to the same front server, so session data for a client is only needed on <em>one</em> front server. As a result, you don&#8217;t need replication anymore.</p>
<p>The sticky sessions approach is easy to use but it has two disadvantages: First, if one server crashes, you will lose part of your session data. And second, load balancing may no longer be optimal because it is done on a session basis and no longer on a request basis.</p>
<p>In the Java EE world, session state could also be stored inside the application server (as opposed to the Servlet container). For example, the Seam framework stored conversational data using stateful session beans at some point. I don&#8217;t know if this is still common practice.</p>
<h4>Session Data Inside Your Database</h4>
<p>Saving session state inside the <em>database</em> is common in lightweight web frameworks like <a href="http://www.djangoproject.com">Django</a>. That way you can add as many front servers as you like without having to worry about session replication and other difficult stuff. You don&#8217;t tie yourself to a certain web server and you get persistence and all other features databases provide for free. As far as I can tell, this works rather nicely for small to medium size websites.</p>
<p>The problem is the usual: The database server may become your bottleneck. In that case your best bet may be to take a suitcase full of money to Oracle or IBM and buy yourself a database cluster.</p>
<h4>Using a Dedicated Session Store</h4>
<p>Sometimes, especially for high traffic web sites, it makes sense to store session data on a <em>dedicated server</em> or cluster. This takes complexity out of your web servers at the cost of an increased overall system complexity. No matter what the SOA guys say, distributing your data usually won&#8217;t make things any easier.</p>
<p>If, for example, you&#8217;re currently storing sessions inside your application&#8217;s database, you could move the session store part to its own database. That&#8217;s about as simple as it gets.</p>
<p>I&#8217;m not aware of any off the shelf products, but since storing session data is typically not the most difficult problem, you could try to roll your own based on a caching product (<a href="http://www.danga.com/memcached/">memcached</a> comes to mind, as do at least a dozen Java caching solutions).</p>
<p>If you&#8217;re particularly ambitious (traffic-wise), using a <em>data grid</em> like <a href="http://www.oracle.com/technology/products/coherence/index.html">Oracle Coherence</a> is a solution to consider. They come with everything you need to implement a high-performance distributed session store. And then some.</p>
<h4>Conclusion</h4>
<p>Use cookies for small pieces of possibly long-term data where security is not an issue. Cookies can also complement other approaches.</p>
<p>Otherwise, use whatever your web development framework offers. Sticky sessions are a powerful but simple solution when you&#8217;re starting to scale out your system. I wouldn&#8217;t turn to session replication if I could get away without it.</p>
<p>If things get rough, a dedicated session server or cluster may be your last chance. But then you shouldn&#8217;t be needing my advice anyway.</p>
<p>For further information see Martin Fowler&#8217;s <a href="http://martinfowler.com/books.html#eaa">Patterns of Enterprise Application Architecture</a>. It has a short section on session state patterns that covers client, server, and database session state.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/141/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=141&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/01/04/session-data-in-webapps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Top Articles in 2008</title>
		<link>http://unmaintainable.wordpress.com/2009/01/01/top-articles-in-2008/</link>
		<comments>http://unmaintainable.wordpress.com/2009/01/01/top-articles-in-2008/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 09:09:33 +0000</pubDate>
		<dc:creator>mafr</dc:creator>
				<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://unmaintainable.wordpress.com/?p=129</guid>
		<description><![CDATA[2008 is done and over with. Before moving on I&#8217;ll follow David&#8217;s example and post my most popular articles in terms of page views.

Here they are:

The State of Java Build Systems
Generating DDL Scripts with Maven
Generating DDL Scripts from JPA Annotations
Parsing Command Line Options in Shell Scripts
Controlling Rhythmbox using D-Bus

What&#8217;s interesting here is that most of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=129&subd=unmaintainable&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>2008 is done and over with. Before moving on I&#8217;ll follow <a href="http://dlinsin.blogspot.com/2009/01/top-2008-content.html">David&#8217;s example</a> and post my most popular articles in terms of page views.</p>
<p><span id="more-129"></span></p>
<p>Here they are:</p>
<ol>
<li><a href="http://unmaintainable.wordpress.com/2008/08/02/java-build-systems/">The State of Java Build Systems</a></li>
<li><a href="http://unmaintainable.wordpress.com/2007/06/30/generating-ddl-scripts-with-maven/">Generating DDL Scripts with Maven</a></li>
<li><a href="http://unmaintainable.wordpress.com/2008/04/12/hibernate3-schema-creation/">Generating DDL Scripts from JPA Annotations</a></li>
<li><a href="http://unmaintainable.wordpress.com/2007/08/05/cmdline-options-in-shell-scripts/">Parsing Command Line Options in Shell Scripts</a></li>
<li><a href="http://unmaintainable.wordpress.com/2006/12/10/controlling-rhythmbox-using-dbus/">Controlling Rhythmbox using D-Bus</a></li>
</ol>
<p>What&#8217;s interesting here is that most of them are HOWTO style articles that got their traffic via search engines and from a few high profile referring sites. The top article is an exception: it&#8217;s a rant about build systems for Java that obviously struck a nerve. People submitted it to Reddit and DZone multiple times. It&#8217;s a bit sad though that none of my own favorites made it into top 5.</p>
<p>Anyway, this concludes my second year as a blogger. It&#8217;s been fun and there&#8217;s still a lot of topics I&#8217;d like to cover. Thank you for reading and have a happy new year!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unmaintainable.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unmaintainable.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unmaintainable.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unmaintainable.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unmaintainable.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unmaintainable.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unmaintainable.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unmaintainable.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unmaintainable.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unmaintainable.wordpress.com/129/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unmaintainable.wordpress.com&blog=586265&post=129&subd=unmaintainable&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://unmaintainable.wordpress.com/2009/01/01/top-articles-in-2008/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/59c9677a3b9569af44561adab6c2a980?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mafr</media:title>
		</media:content>
	</item>
	</channel>
</rss>