<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>My Not So Private Tech Life &#187; Uncategorized</title>
	<atom:link href="http://blog.johanneslink.net/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.johanneslink.net</link>
	<description>Johannes Link's Travels through Software Devlopment Space</description>
	<lastBuildDate>Wed, 17 Mar 2010 08:22:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.johanneslink.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/2fb161c6219f0a6b76df76109ed88e5b?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>My Not So Private Tech Life &#187; Uncategorized</title>
		<link>http://blog.johanneslink.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.johanneslink.net/osd.xml" title="My Not So Private Tech Life" />
	<atom:link rel='hub' href='http://blog.johanneslink.net/?pushpress=hub'/>
		<item>
		<title>Should I renew my wordpress personal CSS?</title>
		<link>http://blog.johanneslink.net/2010/03/17/should-i-renew-my-wordpress-personal-css/</link>
		<comments>http://blog.johanneslink.net/2010/03/17/should-i-renew-my-wordpress-personal-css/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 08:22:19 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=225</guid>
		<description><![CDATA[Compare the following two screenshots. This one shows how code samples are currently being displayed in my blog: The second shows how code would be displayed if I wasn&#8217;t to renew my custom css option: Is the difference worth 15 USD per year?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=225&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Compare the following two screenshots.</p>
<p>This one shows how code samples are currently being displayed in my blog:</p>
<p><a href="http://johanneslink.files.wordpress.com/2010/03/withcss.png"><img class="alignnone size-large wp-image-235" title="Blog excerpt with css enabled" src="http://johanneslink.files.wordpress.com/2010/03/withcss.png?w=300&#038;h=289" alt="" width="300" height="289" /></a></p>
<p>The second shows how code would be displayed if I wasn&#8217;t to renew my custom css option:</p>
<p><a href="http://johanneslink.files.wordpress.com/2010/03/withoutcss.png"><img class="alignnone size-medium wp-image-236" title="withoutcss" src="http://johanneslink.files.wordpress.com/2010/03/withoutcss.png?w=285&#038;h=300" alt="" width="285" height="300" /></a></p>
<p>Is the difference worth 15 USD per year?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/225/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=225&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2010/03/17/should-i-renew-my-wordpress-personal-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>

		<media:content url="http://johanneslink.files.wordpress.com/2010/03/withcss.png?w=300" medium="image">
			<media:title type="html">Blog excerpt with css enabled</media:title>
		</media:content>

		<media:content url="http://johanneslink.files.wordpress.com/2010/03/withoutcss.png?w=285" medium="image">
			<media:title type="html">withoutcss</media:title>
		</media:content>
	</item>
		<item>
		<title>Teaching in Impatient Times</title>
		<link>http://blog.johanneslink.net/2010/02/15/teaching-in-impatient-times/</link>
		<comments>http://blog.johanneslink.net/2010/02/15/teaching-in-impatient-times/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 12:26:35 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teaching]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=217</guid>
		<description><![CDATA[Recently I held an in-house, two-day-workshop on pair programming and test-driven development. After having done similar workshops for almost a decade now, reading the feedback sheets rarely provides me with new topics or new types of criticism. This time it was different: Two of the participants wrote something along the lines: &#8220;sometimes I got bored&#8221;. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=217&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I held an in-house, two-day-workshop on pair programming and test-driven development. After having done similar workshops for almost a decade now, reading the feedback sheets rarely provides me with new topics or new types of criticism. This time it was different: Two of the participants wrote something along the lines: &#8220;sometimes I got bored&#8221;. This had never ever happened before and I had thought it never would. Granted, my presentation style might have become boring, some of the topics might have been already known and some exercise or the other might not have been as challenging as expected. But there is also something else that I notice more and more during workshops: Impatience. And lots thereof.</p>
<p>The exercises you are supposed to work on in my workshops are not very complicated but they stress one or two essential points. If you just rush over them, you can solve the task, but most of the effect lies in thinking about and discussing the subtleties of different solutions and approaches. That&#8217;s why I make participants work in pairs, especially in Pair-Programming workshop! Watching people work reveals that nowadays many &#8211; if not most &#8211; don&#8217;t do this carefull pondering and discussing anymore. They just hurry to a solution, going back to their email-reader or smart phone as soon as a solution to the task at hand seems to be found. When doing it this way most of the benefits of Pair-Programming, Test-Code-Refactor &amp; Specifiaction by Example are lost. It&#8217;s all about thinking, discussing, experimenting, rethinking, rediscussing and improving.</p>
<p>During my first years of giving talks and presenting tutorials I always stopped on ringing cell phones, and I made sure the workshop computers had no internet access. I asked people to either switch their phones off or to leave. In short: I required attendants to be attentive! I guess I&#8217;ll have to reestablish these rules in workshops to come. Not in order to patronize people, just to become effective again.</p>
<br /> Tagged: <a href='http://blog.johanneslink.net/tag/tdd/'>tdd</a>, <a href='http://blog.johanneslink.net/tag/teaching/'>teaching</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/217/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=217&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2010/02/15/teaching-in-impatient-times/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>Building Grammars (and Parsers) on the Fly</title>
		<link>http://blog.johanneslink.net/2009/08/09/building-grammars-and-parsers-on-the-fly/</link>
		<comments>http://blog.johanneslink.net/2009/08/09/building-grammars-and-parsers-on-the-fly/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 12:36:11 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pars4sjm]]></category>
		<category><![CDATA[parsing]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=200</guid>
		<description><![CDATA[I&#8217;ve always felt that code generation is mostly a means to optimize performance of stuff (e.g. DSL execution) that could as well be done during runtime. I might be &#8211; and probably are &#8211; wrong about that, but, c&#8217;mon, you don&#8217;t want to argue about feelings, do you. Keep this prejudice of mine in mind [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=200&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always <em>felt</em> that code generation is mostly a means to optimize performance of stuff (e.g. DSL execution) that could as well be done during runtime. I might be &#8211; and probably are &#8211; wrong about that, but, c&#8217;mon, you don&#8217;t want to argue about feelings, do you. Keep this prejudice of mine in mind when asking yourself why I am doing this and writing about it in the first place.</p>
<p>Recently, on my ongoing quest for the wholly grail of acceptance testing, I examined and reconsidered the available AT frameworks such as <a href="http://fitnesse.org/" target="_blank">FitNesse</a>, <a title="Concordion" href="http://www.concordion.org/" target="_blank">Concordion</a>, <a title="Cucumber" href="http://cukes.info/" target="_blank">Cucumber</a> and some of their siblings. At some point or other all of them have to solve the task of parsing text snippets from the application domain in order to extract some information which will then be used to execute <em>the real code</em>, aka the system under test. Consider for example the following step definition from Cucumber&#8217;s introductory tutorial:</p>
<pre>
Given /I have entered (.*) into the calculator/ do |n|
     calculator = new Calculator()
     calculator.push(n.to_i)
end</pre>
<p>What this code does is  straightforward: It checks if the line in the test scenarios, ehm sorry, in the behaviour specification matches &#8220;I have entered&#8230;&#8221;, extracts the value of the number and tries to feed a calculator object with it. This allows for nearly natural language specifications of requirements, if &#8211; and only if &#8211; you stick exactly to the given pattern. Slight variations, like using &#8220;put in&#8221; instead of &#8220;entered into&#8221; will either break the spec execution or require you to write more and more complex (and unreadable) regular expressions. What if &#8211; so my line of thoughts &#8211; if we could use parsing technology to make text snippet interpretation in testing tools more robust and thus more liable to be used by people from the application domain?</p>
<p>No sooner said than done. Being mostly located in the JVM world of Java &amp; Groovy, I figured that <a title="Antlr" href="http://www.antlr.org/" target="_blank">ANTLR</a> would be a safe bet to use. Since buying (and sometimes reading) books has been one of my favourite coping strategies for a couple of years, I ordered &#8220;The definitive ANTLR Reference&#8221;, installed the <a title="Eclipse Antlr plugin" href="http://antlreclipse.sourceforge.net/" target="_blank">Eclipse Antlr plugin</a> and dived in. Well, to tell you the truth, it was a short &#8211; and cold &#8211; swim since I couldn&#8217;t find any really simple examples, had to use special editors, go through a code generation step, look for where the generated classed had been placed and so on and so on.</p>
<p>This meant it was time for thinking <em>yet again</em>: If I really wanted parsing technology to be an intergrated part of a testing framework this technology would have to be lighter, meaning at least: no code generation required, no extra tooling required except what the language requires anyway. As a consequence, the ANTLR Reference has joined the fate (the shelf that is) of a dozen other unread books, but I rememered a book I read in 2001: &#8220;Building Parsers with Java&#8221; by Steven John Metsker. Therein John introduces a framework to build left recursive parsers by programming only. This was exactly what I needed, despite the fact that the library is in  fin de siecle Java style, i.e. JDK 1.1 without the new collections and without generics and with enumerators instead of iterators&#8230; You get the picture. That&#8217;s why I tried to find out if Steve had maintained and modernized his library only to learn the sad truth that he had passed way in 2008. The book is still available and his <a title="Steve John Metsker" href="http://oozinoz.xp123.com/steve.htm" target="_blank">website</a> is still up; you can download the original version of his library and the examples <a href="http://oozinoz.xp123.com/bpwj.htm" target="_blank">there</a>.</p>
<p>Since the topic fascinated me so much I eventually ended up modernizing Steve&#8217;s original library. Moreover, I added an additional layer to  facilitate the creation of grammars. The whole thing is called <a title="Parse4SJM on github" href="http://wiki.github.com/jlink/Parse4SJM" target="_self"><em>Parse4SJM</em></a> in order to give continuous credit to Steve John Metsker. The library is basically an implementation of a <a title="recursive descent parser on wikipedia" href="http://en.wikipedia.org/wiki/Recursive_descent_parser" target="_blank">recursive descent parser</a> with backup; this type of parser has the comfortable property that you do not need to specify any look ahead since all possible interpretations of a grammar will be tried &#8211; if necessary. Of course, this feature comes with a price: potentially exponential execution time.</p>
<p>Let&#8217;s consider a simple example. You want to create a language to parse and evaluate simple math expression with addition, e.g. &#8220;3 + 5&#8243; or &#8220;1.0 + 2  + 3.1&#8243;. Your final grammar should look like that:</p>
<pre>
expr = term ('+' term)*;
term = Num;
</pre>
<p>Being agile we get to the end result in small steps, of course. A simple step is to start with the <em>term</em> rule:</p>
<pre>
import sjm.grammar.Grammar
Grammar mathGrammar = new Grammar("simple math");
mathGrammar.defineRule("term = Num;", new IParserMatched() {
  public void apply(List&lt;Object&gt; matches,
        Stack&lt;Object&gt; stack) {
    stack.push(((Token) matches.get(0)).value());
  }
});

IParsingResult result = mathGrammar.parse("5.1");
assert result.getStack().pop() == new BigDecimal("5.1");</pre>
<p>This is as easy as it gets &#8211; in Java. In Groovy you can get rid of a bit ceremony:</p>
<pre>
def mathGrammar = new Grammar("simple math")
mathGrammar.defineRule("term = Num;")
  { matches, stack -&gt;
    stack.push(matches[0].value())
  }
def result = mathGrammar.parse("5.1")
assert result.stack.pop() == 5.1</pre>
<p>What the code in the closure does is fairly simple: Whenever the rule matches, take the token from the stack and put its (mathematical) value on the stack instead. This kind of combined parsing and evaluation works quite often; if it doesn&#8217;t, Parse4SJM has other options as well. The full example looks like that:</p>
<pre>
def mathGrammar = new Grammar("simple math")
mathGrammar.discardAllConstants()
mathGrammar.defineRule("expr = term ('+' term)*;")
  { matches, stack -&gt;
    def sum = matches.inject(0) {sum, each -&gt; sum + each}
    stack.push(sum)
  }
mathGrammar.defineRule("term = Num;")
  { matches, stack -&gt;
    stack.push(matches[0].value())
  }
result = mathGrammar.parse("5.1 + 2.0 + 1.8")
assert result.stack.pop() == 8.9</pre>
<p>What&#8217;s my conclusion, then? Creating parsers can be easier than you think &#8211; and it doesn&#8217;t even require a code generation step. Maybe this approach can open the door for DSLs even a bit more. If you&#8217;re interested, just grab the jar or make your on clone from github. And then give me feedback. If you don&#8217;t the project will probably fall into oblivion, which should give you pangs of remorse.</p>
<br /> Tagged: groovy, java, pars4sjm, parsing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/200/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=200&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/08/09/building-grammars-and-parsers-on-the-fly/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>A Unified Theory of Software Design, Architecture and Everything</title>
		<link>http://blog.johanneslink.net/2009/03/06/a-unified-theory-of-software-design/</link>
		<comments>http://blog.johanneslink.net/2009/03/06/a-unified-theory-of-software-design/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 12:08:32 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[DRE]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=175</guid>
		<description><![CDATA[It&#8217;s probably an obvious symptom for my being on a downward spiral from software activist to theoretician, but I&#8217;ll do it anyway. I&#8217;m going to present you with a naive unified theory of software design, which I will call DRE: Dependencies Rule Everything. I consider it a real pity that the most common use of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=175&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s probably an obvious symptom for my being on a downward spiral from software activist to theoretician, but I&#8217;ll do it anyway. I&#8217;m going to present you with a naive unified theory of software design, which I will call DRE: <em><strong>D</strong>ependencies <strong>R</strong>ule <strong>E</strong>verything</em>. I consider it a real pity that the most common use of this abbreviation <em>until today</em> is <strong>D</strong>igital <strong>R</strong>ectal <strong>E</strong>xamination. This has to change.</p>
<p>I have been wondering for a while now why software design principles, heuristics and trade-offs are being described in so many different terms: coupling, cohesion, SOLID, LSP, DRY, LoD, you name it. It has always seemed obvious <em>to me</em> that there is only one concept that covers all the others: dependencies.</p>
<h3>Here is my definition:</h3>
<p><em>Party A depends on party B</em> means: If party B changes one or more of its observable aspects, there is some probability (greater than zero) that party A will have to adapt.</p>
<p>Let&#8217;s examine the building blocks of this definition and its implications more closely:</p>
<ul>
<li>I use the word <em>&#8220;party&#8221;</em> instead of some more code-centric expression like <em>&#8220;module&#8221;</em> or <em>&#8220;component&#8221;</em>. Rationale: There are dependencies between pieces of my software (functions, classes, modules, subsystems, components etc) but there are also dependencies onto the outer world &#8211; the domain. For instance, within DRE I would consider <em>the method who implements the logic</em> for withdrawing money from an account <em>as dependent on the domain rule</em> how money should be withdrawn. Thus, DRE dependencies are a superset of static code dependencies.</li>
<li> <em>Change, </em>the probability of the change and the probability of the change to affect the dependent together define the <em>strength</em> of a dependency. If the dependee can change (eg. disappear) without forcing the dependent to adapt there is no dependency worth mentioning. In that sense <em>loose coupling</em> has the goal to lower the probability of a change affecting the dependent and <em>static typing</em> usually raises the probability, e.g. by enforcing the number of arguments to a function call.</li>
<li>I am only interested in the <em>observables</em> of a party like interface, timing behaviour, error conditions, availability, cost. To put it differently: I don&#8217;t care about unobservable implementation details or anything that can change without the dependent noticing.</li>
<li>A dependency between individual parts results in a dependency between the respective aggregates. The more and the stronger the dependencies between the parts, the stronger the dependency between the aggregates.</li>
<li>Dependencies are directed and that&#8217;s a good thing. On an atomic level there must not be bidirectional dependencies since otherwise change would result in an unstable state. On an aggregate level bidirectional dependencies arise much too easy if you are not careful.</li>
<li>For most cases the dependency relation is <em>not</em> transitive. In some programming languages it seems like they are, but that&#8217;s usually because public visibility of inner parts is the default and the <a href="http://c2.com/cgi/wiki?LawOfDemeter" target="_blank">Law of Demeter</a> strikes. One notable exception to the rule is facilitated by C/C++ compilers, which enforce recompilation of statically dependent components and thus propagate change all the way up.</li>
<li>There exist at least three different major species of dependencies: <em>compile-time</em> dependencies, <em>runtime</em> dependencies and <em>domain-rule</em> dependencies. Statically typed and dynamically typed languages do different trade-offs between compile-time and runtime dependencies; type information is one kind of explicit dependency, which is obviously preferable over implicit &#8211; i.e. potentially unknown &#8211; dependencies. Speaking of explicitness: unit tests and acceptance tests are a different way of making dependencies explicit. Many of the techniques that promise  you a loosely coupled design do nothing else than going from explicit dependencies (a statically enforced method call) to implicit dependency by putting some obfuscating mechanism (e.g. XML serializing) in-between. This does not help you a thing, it just makes the system slower and more complex by introducing additional dependencies to libraries and structured documents. Unless, of course, if you really really really need it for cross-platform, cross-version, cross-process communication.</li>
</ul>
<h3>What is Good Design then?</h3>
<p>A good design &#8211; or architecture for that matter &#8211; in DRE is one in which the overall of dependencies and their strengths is minimized. Since strength is defined as the probability that a change will hit you there is quite some fortune telling involved in finding &#8220;the best&#8221; of all designs. In other words: if you cannot agree on a probable future you cannot agree on a good design. That&#8217;s why <em>Agile designers use a simple heuristic</em> to foretell the future: Everything will change but we don&#8217;t know how. In DRE-terms that means: optimizing dependencies within the system and assuming that the world outside (the domain and its rules) has zero probability to change. In practice this leads to lots of design changes in early stages of a project until the typical domain changes have been incorporated in internal design elements and will only affect the outer-most &#8220;parties&#8221; (e.g. the adapter class, the configuration file, the business rules database).</p>
<p>What follows from that is: If you really know the future, the agile approach of evolutionary design is not the best. But be honest, who the hell does?</p>
<h3>Reformulating OO Design Principles</h3>
<p>For most heuristics of good OO design it&#8217;s quite easy to see why they work at least as well in the DRE universe. I leave it to the  astute reader to translate the <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">SOLID</a> principles into DRE speak. One central rule is not so easy to reconcile with DRE, namely <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank">Don&#8217;t Repeat Yourself</a>. I&#8217;ll try it anyway:</p>
<p>Consider a simple case of duplication:</p>
<pre>def calculationOne() {
  ...
  def salesTax = amount * 0.19
  ...
}
def calculationTwo() {
  ...
  def salesTax = amount * 0.19
  ...
}</pre>
<p>Given a probability of <code>p</code> that the sales tax rate will change during the system&#8217;s life cycle, you have two dependencies with a strength of p, so your total dependency number is <code>2p</code>. Let&#8217;s now apply DRY in a straightforward matter:</p>
<pre>def calculationOne() {
  ...
  def salesTax = calculateSalesTax(amount)
  ...
}
def calculationTwo() {
  ...
  def salesTax = calculateSalesTax(amount)
  ...
}
def calculateSalesTax(amount) {
  return amount * 0.19
}</pre>
<p>Given a probability of <code>r</code> that we will have to change the interface of <code>calculateSalesTax</code> later on, the overall dependency number is now <code>2r + p</code>; if we have chosen our abstraction wisely, this figure will be lower than <code>2p</code>. Thus, the code with less duplication is better design in DRE theory. Quod erat demonstrandum.</p>
<h3>So what?</h3>
<p>There are two striking reasons why the unified theory appears attractive to me:</p>
<ol>
<li>It gives me the vocabulary to talk about the relation between different design approaches and thereby tackle questions like &#8220;What has loose coupling to do with the SOLID principles?&#8221; and &#8220;Does this decoupling technique really decouple anything?&#8221;.</li>
<li>It might provide me with a quantifiable means to compare different designs. Any tool vendors, contact me for licensing the approach!</li>
</ol>
<p>Now it&#8217;s up to you all to tell me why this is utter nonsense or perfectly useless or both. And I do appreciate congratulations for my future nobel prize on computer science. Shoot!</p>
<p><strong>Update:</strong></p>
<p>To make that clear, it was not my intention to suggest that simply adding up propabilities would make for a mathematically sound model for a &#8220;design quality number&#8221;; it was just the simplest thing to do and it felt intuitive enough.</p>
<br /> Tagged: architecture, design, DRE <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/175/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=175&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/03/06/a-unified-theory-of-software-design/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>ClasspathSuite 1.2.1</title>
		<link>http://blog.johanneslink.net/2009/03/04/classpathsuite-121/</link>
		<comments>http://blog.johanneslink.net/2009/03/04/classpathsuite-121/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 16:20:40 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cpsuite]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=171</guid>
		<description><![CDATA[In order to prove that gaussian distribution does not hold for the time between releases I&#8217;ve made ClasspathSuite version 1.2.1 available as of now. Basically one new feature got added. No bugs fixed since 1.2.0 beta &#8211; because no one has found any. Tagged: cpsuite, junit, testing<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=171&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>In order to prove that gaussian distribution does not hold for the time between releases I&#8217;ve made <a href="http://johanneslink.net/projects/cpsuite.html" target="_self">ClasspathSuite version 1.2.1</a> available as of now.</p>
<p>Basically <a href="http://johanneslink.net/projects/cpsuite.html#classpathProperty" target="_blank">one new feature</a> got added. No bugs fixed since 1.2.0 beta &#8211; because no one has found any.</p>
<br /> Tagged: cpsuite, junit, testing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/171/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=171&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/03/04/classpathsuite-121/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>ClasspathSuite 1.2.0 beta</title>
		<link>http://blog.johanneslink.net/2009/03/02/classpathsuite-120-beta/</link>
		<comments>http://blog.johanneslink.net/2009/03/02/classpathsuite-120-beta/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 21:23:04 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cpsuite]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=169</guid>
		<description><![CDATA[After more than a year of perfect stability I eventually adapted ClasspathSuite to JUnit 4.5&#8242;s way of building test suites. I added a new feature, too. Tagged: cpsuite, junit, testing<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=169&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>After more than a year of perfect stability I eventually adapted <a href="cpsuite.html" target="_self">ClasspathSuite</a> to JUnit 4.5&#8242;s way of building test suites.</p>
<p>I added <a href="http://johanneslink.net/projects/cpsuite.html#changes" target="_blank">a new feature</a>, too.</p>
<br /> Tagged: cpsuite, junit, testing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/169/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=169&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/03/02/classpathsuite-120-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>I am Probably Not</title>
		<link>http://blog.johanneslink.net/2009/02/07/i-am-probably-not/</link>
		<comments>http://blog.johanneslink.net/2009/02/07/i-am-probably-not/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 21:50:03 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[atheism]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=165</guid>
		<description><![CDATA[Tagged: atheism<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=165&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://ruletheweb.co.uk/b3ta/bus/"><img class="size-full wp-image-166 alignnone" title="There's probably no Johannes Link" src="http://johanneslink.files.wordpress.com/2009/02/bus.jpg?w=450&#038;h=300" alt="There is probably no Johannes Link" width="450" height="300" /></a></p>
<br /> Tagged: atheism <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=165&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/02/07/i-am-probably-not/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>

		<media:content url="http://johanneslink.files.wordpress.com/2009/02/bus.jpg" medium="image">
			<media:title type="html">There's probably no Johannes Link</media:title>
		</media:content>
	</item>
		<item>
		<title>And the Birds they Are Singing</title>
		<link>http://blog.johanneslink.net/2009/02/04/and-the-birds-they-are-singing/</link>
		<comments>http://blog.johanneslink.net/2009/02/04/and-the-birds-they-are-singing/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 09:57:30 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=154</guid>
		<description><![CDATA[I&#8217;m definitely not the first one to write about their twitter experiences. I especially like this presentation because it sort of reflects my past two months of twittering, and gives me some inkling of what I might see there in the future. There were two reasons for me to get onto the train in the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=154&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m definitely not the first one to write about their twitter experiences. I especially like <a href="http://www.slideshare.net/minxuan/how-twitter-changed-my-life-presentation" target="_blank">this presentation</a> because it sort of reflects <a href="http://twitter.com/johanneslink">my past two months of twittering</a>, and gives me some inkling of what I might see there in the future.</p>
<p>There were two reasons for me to get onto the train in the first place:</p>
<p>a) I was told by many that the cream of the technology crop had already moved away from the blogosphere. If I wanted to be in on the most recent trends and tools and techniques I would have to follow people&#8217;s tweets instead of their weblogs.</p>
<p>b) Due to a chronic writer&#8217;s block I needed a way to get some stuff out without having to write full sentences or even paragraphs.</p>
<p>I feel like a lucky guy considering the fact that hardly any one from my personal life is on twitter, so I only follow 30+ people on a regular basis. That&#8217;s both not much and quite a lot. It does not take me long to read the 50+ updates per day and identify the 5+ that trigger something in me. But it would take all day to follow up on the 5+ topics, so I do that for only 1 or 2 per day. I actually feel closer to the origin of new ideas and I guess I know a bit more about the (mostly) humans whose tweets I follow. On the other hand, it&#8217;s my impression there has been nothing so far technologywise which I wouldn&#8217;t have learned about through a different channel.</p>
<p>How about my own writing? In the beginning I was quite self-consciuos as more people started to follow me, quite a few of which I really consider to be top notch in their field. This self-consciousness made me polish my updates to a ridiculous degree. Spending 30 minutes to spit out &lt;141 characters: How vain can you get? Change made its way, though, after about a month (and a skiing holiday). Since then I basically write what comes to my mind and what I consider worthwhile to read for at least one of my followers. My rule is to not spend more than 5 minutes on a single post; if I catch myself doing otherwise, I delete all text and go back to real work.</p>
<p>Will I go on twittering? Abolutely, at least for the time being. Do I feel addicted? Not really, it&#8217;s more like a comfortable way to procrastinate. Should <em>you</em> follow <em>me</em>? Do as you please, I won&#8217;t hold it against you either way.</p>
<br /> Tagged: twitter <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=154&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/02/04/and-the-birds-they-are-singing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>Keeping Up My Programming Skills As a Non Programming Consultant</title>
		<link>http://blog.johanneslink.net/2009/01/18/keeping-up-my-programming-skills-as-a-non-programming-consultant/</link>
		<comments>http://blog.johanneslink.net/2009/01/18/keeping-up-my-programming-skills-as-a-non-programming-consultant/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 20:35:41 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.johanneslink.net/?p=148</guid>
		<description><![CDATA[Working as development coach instead of as contracting developer has at least one crucial advantage: I can charge a significant better rate since daily rates for &#8220;mere programmers&#8221;. But there is a reverses side to the same coin: People &#8211; my customers &#8211; don&#8217;t pay me for programming any more. I might be allowed to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=148&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Working as development coach instead of as contracting developer has at least one crucial advantage: I can charge a significant better rate since daily rates for &#8220;mere programmers&#8221;.</p>
<p>But there is a reverses side to the same coin: People &#8211; my customers &#8211; don&#8217;t pay me for programming any more. I might be allowed to pair with their development staff from time to time to TEACH certain skills like design or OO or TDD or  mocking. But the intensive programming experience with (pair) flow, new technologies, LEARNING and everything is out of reach for me during my  payed time. So I have to confess that I wrote the last line  of real code, ie. code someone payed for to do important business stuff, almost three years ago. Honestly, I&#8217;m somewhat ashamed about that since I&#8217;ve always stated &#8211; and stated very loudly &#8211; that those who don&#8217;t  program any more shouldn&#8217;t tell others about programming.</p>
<p>For a while a I tried to counter my loss of actual programming practice by doing small OS projects on the side and reworking my workshop exercises to  a ridiculous degree. This does not yield the same benefits, though, as programming for and with others. That&#8217;s why I used an open space session during XP Days Germany 2008 to offer the start of a &#8220;development project for bored consultants&#8221; and invited fellow retirees to join me for regular (remote) pairing sessions &#8211; and real meetings once or twice per year. Of course, it always takes longer to make the first step, but I&#8217;m proud to anounce that the kick-off meeting will eventually take place in a few weeks. We are seven people so far which leaves plenty of room for other enthusiasts to join us. Drop me an <a href="mailto::jl@johanneslink.net">email</a> if&#8230;</p>
<ul>
<li>you&#8217;d like to spent (at least) one day per month in a project with other agile consultants and you are willing to give this project priority on that day.</li>
<li>you are not too strongly opposed to start (test-driven) development with Groovy and Grails.</li>
</ul>
<p>We are planning to do most of the development work in remote pairing sessions. Up to date the participants are spread widely (but not evenly) across Germany, so there might be some chance to meet for programming sessions from time to time. The kick-off will be held on February 20 &amp; 21 in a place not too far from Frankfurt. We&#8217;d all be delighted to have a couple of more faces show up.</p>
<p>P.S.: Thanks, <a href="http://me.andering.com/" target="_blank">Willem</a>, for pointing out the best remedy against writer&#8217;s block</p>
<br /> Tagged: programming <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/148/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=148&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2009/01/18/keeping-up-my-programming-skills-as-a-non-programming-consultant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
		<item>
		<title>Can You Touch Type?</title>
		<link>http://blog.johanneslink.net/2008/09/15/can-you-touch-type/</link>
		<comments>http://blog.johanneslink.net/2008/09/15/can-you-touch-type/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 12:33:32 +0000</pubDate>
		<dc:creator>johanneslink</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://johanneslink.wordpress.com/?p=144</guid>
		<description><![CDATA[Well, I can&#8217;t. That&#8217;s why it struck a chord with me when I read Steve Yegge&#8217;s rant about those developers who claim that typing is not really important for fluent programming. The article is a very funny read and it left me determined to learn touch typing now &#8211; not today, but tomorrow &#8211; or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=144&subd=johanneslink&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Well, I can&#8217;t. That&#8217;s why it struck a chord with me when I read <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html" target="_blank">Steve Yegge&#8217;s rant</a> about those developers who claim that typing is not really important for fluent programming. The article is a very funny read and it left me determined to learn touch typing now &#8211; not today, but tomorrow &#8211; or maybe the year after tomorrow.</p>
<p>Can anyone recommend a good touch typing teaching software in German?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/johanneslink.wordpress.com/144/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/johanneslink.wordpress.com/144/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johanneslink.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johanneslink.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johanneslink.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johanneslink.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johanneslink.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johanneslink.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johanneslink.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johanneslink.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johanneslink.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johanneslink.wordpress.com/144/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.johanneslink.net&blog=3243974&post=144&subd=johanneslink&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.johanneslink.net/2008/09/15/can-you-touch-type/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/93fb781c56c547026a12cc957931e5ff?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">johanneslink</media:title>
		</media:content>
	</item>
	</channel>
</rss>