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

<channel>
	<title>Manuel Klimek &#187; Software</title>
	<atom:link href="http://klimek.box4.net/blog/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://klimek.box4.net/blog</link>
	<description>Dedicated to Software Development</description>
	<lastBuildDate>Wed, 01 Jul 2009 20:23:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>All Programmers Are Code Narcissists</title>
		<link>http://klimek.box4.net/blog/2009/06/07/all-programmers-are-code-narcissists/</link>
		<comments>http://klimek.box4.net/blog/2009/06/07/all-programmers-are-code-narcissists/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 22:05:45 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/?p=106</guid>
		<description><![CDATA[01001101011110010010000001100011011011110110010001100101
00100000011100100111010101101100011001010111101000100001
I finally discovered the truth about why developers rather rewrite a 1MLOC project from scratch than trying to understand a fellow programmer&#8217;s code:
We&#8217;re all code narcissists!
And the reason for that can easily deducted in a tiny logical chain:
(The best code is easy to understand) ^ (I can understand my own code the easiest, duh!)
=> (My [...]]]></description>
			<content:encoded><![CDATA[<p>01001101011110010010000001100011011011110110010001100101<br />
00100000011100100111010101101100011001010111101000100001</p>
<p>I finally discovered the truth about why developers rather rewrite a 1MLOC project from scratch than trying to understand a fellow programmer&#8217;s code:</p>
<p><b>We&#8217;re all code narcissists!</b></p>
<p>And the reason for that can easily deducted in a tiny logical chain:<br />
<em>(The best code is easy to understand) ^ (I can understand my own code the easiest, duh!)<br />
=> (My own code is the best code)</em></p>
<p>Unfortunately this is only true for me, or perfect clones of myself. Which rules out everybody else I work with. Which reminds me&#8230; What was the reason that programming is done in teams?</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2009/06/07/all-programmers-are-code-narcissists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leaving the Comfort Zone</title>
		<link>http://klimek.box4.net/blog/2008/12/22/leaving-the-comfort-zone/</link>
		<comments>http://klimek.box4.net/blog/2008/12/22/leaving-the-comfort-zone/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 21:02:43 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/?p=104</guid>
		<description><![CDATA[A week ago I held my first talk since university. It was the first talk in my life I held in English, and I was scared like hell. It felt like living through those exam days back at school all over again &#8211; just that this time I thought I&#8217;m old enough to realize that [...]]]></description>
			<content:encoded><![CDATA[<p>A week ago I held my first talk since university. It was the first talk in my life I held in English, and I was scared like hell. It felt like living through those exam days back at school all over again &#8211; just that this time I thought I&#8217;m old enough to realize that it&#8217;ll all be okay. I&#8217;m obviously not.</p>
<p>I acted just like I did back in school. Or worse. I waited for the last possible moment before I started preparing the talk. When I finally started with the slides, a little perfectionist devil Manuel sat down leisurely on my left shoulder, telling me that this crap is just not up to my own standards. I worked long hours the night before the big day, and woke up early just to be able to rehearse the whole play before entering the stage.</p>
<p>Of course everything worked out just fine. Well, besides me saying basic-a-lly all the time. So why was I so freaked out? Well, I was obviously leaving my comfort zone.</p>
<p>Now the interesting thing beneath all that personal drama I&#8217;m ranting about is that I suddenly realized for how long I did not really step out of my safe little comfort zone. Granted, applying at Google is not the most un-stressful experience I ever had. And obviously starting a new job with all those bright people around me did not exactly make me fell warm and cozy.</p>
<p>But at that very moment I stood there, my peers gazing absent-mindedly into their laptops, my hands slightly sweating, I suddenly realized that ever since I started working I was doing everything exactly in the way I was most comfortable with. And that was kind of a shock.</p>
<p>Of course after giving the talk I felt great. I had known that in advance, but I realized that without being nudged enough I&#8217;d probably have tried to wiggle out somehow. </p>
<p>Lessons learned:</p>
<ol>
<li>It&#8217;s easier to step out of the comfort zone when somebody kicks your ass.</li>
<li>It&#8217;s a long way from leaving your comfort zone once to <a href="http://www.ibm.com/developerworks/rational/library/nov07/pollice/index.html">real change</a>.</li>
<li>I must learn how to leave my comfort zone on my own.</li>
</ol>
<p>Do you know tricks that make it easier to leave the comfort zone?</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2008/12/22/leaving-the-comfort-zone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ubuntu Gutsy Ximeta NDAS Howto</title>
		<link>http://klimek.box4.net/blog/2007/06/10/ubuntu-gutsy-ximeta-ndas-howto/</link>
		<comments>http://klimek.box4.net/blog/2007/06/10/ubuntu-gutsy-ximeta-ndas-howto/#comments</comments>
		<pubDate>Sun, 10 Jun 2007 13:37:41 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/06/10/ubuntu-gutsy-ximeta-ndas-howto/</guid>
		<description><![CDATA[A month ago I bought a TREKSTOR NDAS device. This devices promises on it&#8217;s package to be linux compatible. So after I unpacked the hardware and everything was running in Windows I tried to install it in linux. Unfortunately the stock feisty debian package I found didn&#8217;t work with my WLAN configuration.
Now after I reinstalled [...]]]></description>
			<content:encoded><![CDATA[<p>A month ago I bought a TREKSTOR NDAS device. This devices promises on it&#8217;s package to be linux compatible. So after I unpacked the hardware and everything was running in Windows I tried to install it in linux. Unfortunately the stock feisty debian package I found didn&#8217;t work with my WLAN configuration.</p>
<p>Now after I reinstalled ubuntu and upgraded to gutsy which comes right now with a 2.6.22er kernel I tried to build the driver from source. I had to patch the sources to make it work, but since it works flawlessly right now I provide my patch and a little compilation howto.</p>
<p>Download the <a href="http://code.ximeta.com/dev/current/linux/">current NDAS sources</a> and my <a href='http://klimek.box4.net/blog/wp-content/uploads/2007/06/ndas-11-2_kernel-2622.patch' title='NDAS patch for linux kernel 2.6.22'>NDAS patch for linux kernel 2.6.22</a>.</p>
<pre class="code">
# installed some packages. I don't know which exactly, but you'll need
# at least the following:
apt-get install build-essential checkinstall linux-headers-generic

# extract and patch the ndas sources...
tar xvzf /path/to/ndas-1.1-2.tar.gz
cd ndas-1.1-2
patch -p1 < /path/to/ndas-1.1-2_kernel-2.22.patch

# you only need to set NDAS_KERNEL_VERSION if you
# don't want to compile ndas for the currently running
# kernel for example, if you're compling from within colinux
NDAS_KERNEL_VERSION=2.6.22-6-generic
make

# ndas_root must be exported for make install and
# checkinstall to work
export ndas_root=$(pwd)
# somehow I had to make install before checkinstall...
# this is no problem, since checkinstall will clean up
# the whole mess again
sudo make install
sudo checkinstall
</pre>
<p>After that you can start the NDAS service by issuing</p>
<pre class="code">
/etc/init.d/ndas start
</pre>
<p>Configure your device by following the <a href="http://code.ximeta.com/trac-ndas/wiki/Usage">Ximeta NDAS driver documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/06/10/ubuntu-gutsy-ximeta-ndas-howto/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Mobile Ubuntu Colinux Setup</title>
		<link>http://klimek.box4.net/blog/2007/06/08/mobile-ubuntu-colinux-setup/</link>
		<comments>http://klimek.box4.net/blog/2007/06/08/mobile-ubuntu-colinux-setup/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 21:38:11 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/06/08/mobile-ubuntu-colinux-setup/</guid>
		<description><![CDATA[My Vista Home Premium finally arrived. Since I have a Ati 9250 at work, which is a smartly rebranded DirectX 8 card, I was craving for the full &#8220;vista experience&#8221;. After doing some backup I installed Vista on my laptop and spent some time setting up the basic programs I need. Since installing colinux is [...]]]></description>
			<content:encoded><![CDATA[<p>My Vista Home Premium finally arrived. Since I have a Ati 9250 at work, which is a smartly rebranded DirectX 8 card, I was craving for the full &#8220;vista experience&#8221;. After doing some backup I installed Vista on my laptop and spent some time setting up the basic programs I need. Since installing colinux is one of the great challenges of the Game Of Windows I&#8217;ll try to present you a step-by-step guide to a working mobile colinux setup in Vista.<br />
<span id="more-49"></span></p>
<p>My goal is to set up a colinux configuration for truely mobile computing. That means that I use wireless networking in Windows and Kubuntu natively as my primary networking interface. I want colinux networking to work whenever my Windows has network access and I want a single configuration on linux and Windows. The configuration you find here is based on the two years I use colinux now and constant fidling with the configuration parameters.</p>
<p>As a prerequisite you need a running GNU/Linux on your computer. I installed an Kubuntu Feisty onto a spare partition. Kubuntu is my favorite distribution at the moment, because you get up-to-date basic packages like in debian/sid, and up-to-date KDE packages like SuSE. After installing GNU/Linux I rebooted into Vista. Let&#8217;s rumble.</p>
<p>First I installed colinux 0.8.0 pre from Henry Nestler. My experience with colinux is that the latest unstable you can get at <a href="http://www.henrynestler.com/">Henry&#8217;s site</a> is the most stable version available.</p>
<p>Once you installed it (you can safely skip downloading the linux image, we&#8217;ll boot from a real partition instead) head to C:\Programme\coLinux and copy example.conf to colinux.conf. Now edit colinux.conf with WordPad. Since I have activated UAC I can&#8217;t simply edit the system file but use an administrator notepad. Start &#8211; Type &#8220;Notepad&#8221; &#8211; Right Click the appearing notepad and select &#8220;Run as administrator&#8230;&#8221;.</p>
<p>Now my colinux configuration looks like this:</p>
<pre class="code">
kernel=vmlinux

# my swap partition
sda3=\\Device\\Harddisk0\\Partition3

# my root partition
# I usually have to play around with the partition numbers before
# I get the final digit right.
sda4=\\Device\\Harddisk0\\Partition4

# this should point to the root partition...
root=/dev/sda4
ro
initrd=initrd.gz
mem=768

# a slirp device for internet access; when I boot
# kubuntu natively, this is my wired ethernet device
eth0=slirp

# when I boot kubuntu natively this is my wireless
# connection; since I don't want any configuration
# changes from native to colinux I inserted a
# unusable eth1 device in the colinux configuration
eth1=pcap-bridge,"Unknown"

# internal high-speed connection between colinux
# and vista only
eth2=tuntap

# I want to see my Vista files and cdrom in colinux...
cofs0=c:
cofs1=d:
cofs2=e:
</pre>
<p>Now I can start colinux. Configuring the network devices takes some time, since the stuff is not yet configured on the linux side. </p>
<p>Edit /etc/network/interfaces. Remove the default entry for eth1 (it will be handled by knetworkmanager later, we don&#8217;t want to use it in colinux) and change eth2 to a private network:</p>
<pre class="code">
auto eth2
iface eth2 inet static
address 192.168.42.2
netmask 255.255.255.0
</pre>
<p>Now configure the tuntap device on Windows to ip 192.168.42.1. Start colinux and you should be able to ping colinux at 192.168.42.2 from Windows. You can&#8217;t ping back since the Windows Vista Firewall is active on the tuntap device.</p>
<p>Install <a href="http://sourceforge.net/projects/xming">Xming</a> and <a href="http://cygwin.com">cygwin</a>. Make sure you select openssh when installing cygwin, you&#8217;ll need it later to log into your colinux.</p>
<p>Run XLaunch (from Xming) and configure an X Server without access control and save the configuration to your local documents directory. To start the X server without access control at login time link the config.xlaunch file into your Autostart menu. Make sure that you allow your X through the firewall. Don&#8217;t do this if you don&#8217;t have an extra firewall to the internet, since otherwise people from outside would be able to contact your X server! </p>
<p>Now you have to make sure you can log into your colinux from cygwin without a password. Luckily ssh features public-key based authentication, and it&#8217;s not that hard to set up. </p>
<p>Start a cygwin shell.</p>
<pre class="code">
ssh-keygen -t dsa
</pre>
<p>Copy the file to the .ssh directory on the colinux server. Make sure you have a .ssh directory in your $HOME before doing this:</p>
<pre class="code">
scp .ssh/id_dsa.pub manuel@192.168.42.2:~/.ssh/authorized_keys
</pre>
<p>Now we&#8217;re able to ssh manuel@192.168.42.2 without using a password. Edit a file konsole.bat on your desktop.</p>
<pre class="code">
c:
cd \\cygwin\\bin
run bash --login -c 'ssh manuel@192.168.42.2 "export DISPLAY=192.168.42.1:0; konsole > /dev/null 2>&#038;1"'
</pre>
<p>Now all that is left to do is to run colinux as a service. At an adminstrator command prompt (Start->Run &#8220;cmd&#8221;, Right-Click->Run As Administrator) c:\Programme\coLinux write:</p>
<pre class="code">
colinux-daemon.exe @colinux.conf --install-service colinux
</pre>
<p>Open &#8220;Services&#8221; as administrator and edit the properties of the colinux service. Set the start mode to automatic. Voila.</p>
<p>To access your windows partitions from colinux you can simply add them to your /etc/fstab:</p>
<pre class="code">
0 /media/c cofs user,defaults,rw 0 0
1 /media/d cofs user,defaults,rw 0 0
2 /media/e cofs user,defaults,rw 0 0
</pre>
<p>Now your init-scripts will mount your cofs devices (a.k.a. Windows Drives) when colinux boots.</p>
<p>I use this configuration on a Dell XPS M170 laptop. Of course you can use it for workstations, too. I myself prefer a winpcap&#8217;ed configuration for workstations, though. It&#8217;s easier to get access to the colinux that way. Unfortunately winpcapping the device doesn&#8217;t work on most wireless networks in the wild.</p>
<p>See also:</p>
<p><a href="http://klimek.box4.net/blog/2007/04/09/information-overflow-colinux-wlan-networking/">Information Overflow &#038; Colinux WLAN Networking</a></p>
<p><a href="http://klimek.box4.net/blog/2006/11/24/colinux-on-windows-vista/">Colinux On Windows Vista</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/06/08/mobile-ubuntu-colinux-setup/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Information Overflow &amp; Colinux WLAN Networking</title>
		<link>http://klimek.box4.net/blog/2007/04/09/information-overflow-colinux-wlan-networking/</link>
		<comments>http://klimek.box4.net/blog/2007/04/09/information-overflow-colinux-wlan-networking/#comments</comments>
		<pubDate>Sun, 08 Apr 2007 23:12:00 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/04/09/information-overflow-colinux-wlan-networking/</guid>
		<description><![CDATA[In case you didn&#8217;t notice: I&#8217;ve been away from my keyboard for two weeks. My wife and me had a beautiful vacation in Jamaica where I learned that reading and writing English doesn&#8217;t help a lot to understand people actually talking. Ya Man!

Now that I&#8217;m back home I get lost in the information that I [...]]]></description>
			<content:encoded><![CDATA[<p>In case you didn&#8217;t notice: I&#8217;ve been away from my keyboard for two weeks. My wife and me had a beautiful vacation in Jamaica where I learned that reading and writing English doesn&#8217;t help a lot to understand people actually <i>talking</i>. Ya Man!</p>
<p><span id="more-48"></span></p>
<p>Now that I&#8217;m back home I get lost in the information that I missed in <i>just two weeks</i>. I&#8217;ve got some IEEE magazines and journals, some GI resources and the extreme programming group which clogs my Gmail account &#8211; and I don&#8217;t want to miss any of it.</p>
<p>This week the extreme programming group features some nice discussions about &#8220;good code&#8221;, the IEEE software engineering journal features an article about pair programming and an other interesting story on theory usage in software development. The IEEE spectrum contains an article on a <a href="http://amal.net/rfid.html">guy who implanted two RFID chips in his hands</a>.</p>
<p>After spending some hours reading today I caught up on extreme programming and finally realized that my colinux networking still totally sucks.</p>
<p>I finally found out how to use colinux with my Intel 2200BG adapter: It&#8217;s simply a matter of setting the adapter to <a href="http://colinux.wikia.com/wiki/Network">non-promiscuous</a> mode and add the adapters MAC address to the configuration:</p>
<pre class="code">
eth1=pcap-bridge,"Connection Name",<MAC address>,nopromisc
</pre>
<p>Now I can set an ip address in linux and happily access the network. Unfortunately this is not a very mobile setup for a laptop. If you are at home in varying wireless and wired networks you usually just want to use dhcp and use whatever ips the network provides.</p>
<p>If I use dhcp in linux and windows on a bridged wireless adapter, both windows and linux will get the same ip (since I must specify the same MAC address &#8211; otherwise the WLAN router won&#8217;t accept my packages). This leads to an unusable network (again). Of course I could just specify a fixed ip but then again I have to change configuration when roaming wireless networks.</p>
<p>The next requirement is that I want to be able to have some linux services accessible via my broadband router when I&#8217;m at home. Therefore I need to know an ip to configure some port forwardings. And I want to be able to use the same configuration regardless if I boot into windows and start colinux or if I boot into linux directly.</p>
<p>Now I came up with a configuration that allows me to do all this: I use slirp for external networking and a tuntap device for windows to linux networking (tuntap is faster than slirp). I configured some port forwarding into slirp and forward the required ports from my broadband router to the ip of my laptop&#8217;s wireless network device.</p>
<p>Then I configured my kubuntu desktop to use network manager (basically by throwing everything away in /etc/network/interfaces) and to use the same MAC address for the wired and wireless interfaces. This way I can really plug and play without loosing any port forwardings from my broadband router. Neat. This whole configuration is quite complicated, so I should probably post a blog entry about the configuration before I forget it.</p>
<p>For all of you celebrating: Happy Easter!</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/04/09/information-overflow-colinux-wlan-networking/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Reaching Programmer Level 2</title>
		<link>http://klimek.box4.net/blog/2007/03/11/reaching-programmer-level-2/</link>
		<comments>http://klimek.box4.net/blog/2007/03/11/reaching-programmer-level-2/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 20:39:53 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/03/11/reaching-programmer-level-2/</guid>
		<description><![CDATA[Today was a beautiful sunny day. The warm sunbeams on my skin told a story of the oncoming spring. And while my body started up it&#8217;s Vitamin B3 production line, I remembered a conversation I had yesterday with Bernhard, a rocket engineer, that evolved around two statements:
&#8220;With hardware, theoretically anything is possible.&#8221; &#8211; This statement [...]]]></description>
			<content:encoded><![CDATA[<p>Today was a beautiful sunny day. The warm sunbeams on my skin told a story of the oncoming spring. And while my body started up it&#8217;s Vitamin B3 production line, I remembered a conversation I had yesterday with Bernhard, a rocket engineer, that evolved around two statements:</p>
<p>&#8220;With hardware, theoretically anything is possible.&#8221; &#8211; This statement emphasizes the limits of hardware. <i>Theoretically</i> you can do whatever you want, but you&#8217;re limited by the material the earth provides. I admit that human beings are highly innovative &#8211; memory chip designers happily use techniques today that were believed to be physically impossible not long ago.</p>
<p>&#8220;With software, practically anything is possible.&#8221; &#8211; Software has no inherent limitations. The concept &#8220;software&#8221; consists of a bunch of algorithms neatly packed together into a structured specification of how to solve a problem. Of course, software is limited by the hardware it is run on, which is why I usually have a problematic relationship with hardware which sometimes leads to mutual physical violence.</p>
<p>There is a point in the life of a software developer when you realize this (the limitlessness of software, not my problem with hardware). That realization marks your promotion to Programmer Level 1. At that time you usually know a bunch of programming languages, acquired some basic algorithmic competence and finished some minor projects. You leave the hunting grounds of not knowing how to implement things and ascend to the heavenly plains of being capable of anything.</p>
<p><b>You&#8217;re Turing Complete.</b></p>
<p><span id="more-46"></span></p>
<p>It&#8217;s tempting to stay at this level. It&#8217;s a great feeling &#8211; you know that you can do whatever task comes your way. You are a professional. All you need is somebody to tell you what she needs and you&#8217;ll develop the solution. Some of them will need some creativity with regards to runtime performance, but hey, that&#8217;s just another technical challenge. There&#8217;s nothing more you need to learn besides exciting new technological tools.</p>
<p>It&#8217;s even more tempting to completely ignore level 2. Some people even vehemently deny it&#8217;s existence. Acknowledging level 2 is the first step on your long journey to the highest programming nirvana. You&#8217;ll reach level 2 once you can write <i>maintainable</i> software. If you ask &#8220;now, buddy, what is so hard about that?&#8221; then you&#8217;re a long way away from mastering level 1.</p>
<p>The principle behind maintainable software is easy:</p>
<p><b>Write software that your fellow programmers can understand.</b></p>
<p>The easier it is for others to understand your code, the better your code. So how can you write understandable code? This is the hard one. It&#8217;s not easy. There are no &#8220;top ten guidelines&#8221; you follow and somehow become a good programmer over night. There&#8217;s no &#8220;30 minutes Howto for Dummies&#8221;. It means hard work. It means lifelong learning. And it means to have a certain attitude towards coding:</p>
<ul>
<li><b>Be a teacher.</b> Write code that teaches the reader what the program does. Don&#8217;t be the Riddler. Communicate your intent clearly.</li>
<li><b>Be a student.</b> Watch how people react to your code. Be open to ideas and criticism. Learn from your fellow coder.</li>
<li><b>Be pragmatic.</b> Don&#8217;t do stuff &#8220;just because&#8221;. Always know an answer to &#8220;why&#8221;. Introduce convenience to get things done.</li>
<li><b>Be a methodologist.</b> Be fierce when sloppiness threatens the clarity of your design and code. Don&#8217;t give in to convenience if this makes it harder to read your code.</i>
</ul>
<p>Reaching Programmer Level 2 is an ideal, an illusion. When you realize that being able to code anything is not enough you somehow enter Level 2 metaphysically, knowing that you&#8217;ll never reach it for good. But if you want to enter the life long journey and defy the perils of the Code Monster, here&#8217;s a hint on how to start:</p>
<ul>
<li>Read <a href="http://klimek.box4.net/blog/library/andrew-hunt/the-pragmatic-programmer-from-journeyman-to-master/">The Pragmatic Programmer</a>. This will give you the initial force you&#8217;ll need to keep on going.</li>
<li>Read some more: <a href="http://klimek.box4.net/blog/library/steve-mcconnell/code-complete-microsoft-programming/">Code Complete</a> is one of the most acknowledged writings on the subject.</li>
<li>Never stop learning. You can take a look at my <a href="http://klimek.box4.net/blog/library/">Library</a>, or just search for programming books at <a href="http://www.amazon.de/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.de%2F&#038;site-redirect=de&#038;tag=manuelklimek-21&#038;linkCode=ur2&#038;camp=1638&#038;creative=6742">Amazon</a><img src="http://www.assoc-amazon.de/e/ir?t=manuelklimek-21&amp;l=ur2&amp;o=3" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/03/11/reaching-programmer-level-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>How To Diagnose Morbus Maximus Hypercodus</title>
		<link>http://klimek.box4.net/blog/2007/03/04/how-to-diagnose-morbus-maximus-hypercodus/</link>
		<comments>http://klimek.box4.net/blog/2007/03/04/how-to-diagnose-morbus-maximus-hypercodus/#comments</comments>
		<pubDate>Sun, 04 Mar 2007 19:43:24 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/03/04/how-to-diagnose-morbus-maximus-hypercodus/</guid>
		<description><![CDATA[Morbus Maximus Hypercodus, also known as BPCD (Best Possible Coder Disease) is an uncommon illness these days. It mostly affects integral parts of the brain and while some people believe it to be a genetic dysfunction, others claim that BPCD has purely psychological causes. People who suffer from BPCD are usually not aware of it [...]]]></description>
			<content:encoded><![CDATA[<p>Morbus Maximus Hypercodus, also known as BPCD (Best Possible Coder Disease) is an uncommon illness these days. It mostly affects integral parts of the brain and while some people believe it to be a genetic dysfunction, others claim that BPCD has purely psychological causes. People who suffer from BPCD are usually not aware of it &#8211; this is in fact one of the symptoms of the disease. </p>
<p>The only known effect of BPCD is that the infected person writes exceptionally clean, well-structured, bug-free and easy to maintain code. The benign character of the illness is the root of a devilish new pest called WBPCD (Wannabe Best Possible Coder Disease). Curing WBPCD is hard, since the infected person usually believes to suffer from BPCD and stubbornly refuses medication.</p>
<p>Since spreading BPCD is supposed to have positive effects in corporate environments, you can find quite a lot of studies about effectively spreading BPCD. Mostly getting infected by BPCD involves close collaboration with people you believe to suffer from BPCD, or mind-to-mind intercourse which is easy to practice by reading.</p>
<p>Unfortunately you can never diagnose BPCD for yourself, since if you believe you have BPCD you&#8217;re just a WBPCD case and should consider professional help. If you don&#8217;t believe you have BPCD &#8211; well, it could be that you&#8217;re right,  but since you don&#8217;t believe it this won&#8217;t help you. The only known solution to this problem is to try to get BPCD infected for the rest of your life, always hoping to be infected, but always doubting your current condition.</p>
<p>That said, it&#8217;s not too hard to diagnose BPCD if you know the symptoms. If you suffer from WBPCD you may subconsciously use this information to make others believe you&#8217;re a BPCD patient, so watch out! Don&#8217;t fool yourself.</p>
<p><b>Symptoms of BPCD:</b></p>
<ul>
<li><i>Unbreakable optimism</i> &#8211; BPCD patients usually start getting infected with Morbus Codus (Coding Disease). They recognize quickly that it&#8217;s impossible to write bug-free code. This is the turning point in the course of disease. Some people just stop there, running away to business or law schools. The other lot is optimistic enough to hope that this time everything will be all right. While WBPCD patients just assume that their code is top notch (they believe to be BPCD infected), real BPCD people realize that optimism must be controlled with caution and test their assumptions thoroughly.</li>
<li><i>Easily bored and clumsy</i> &#8211; Doing repetitive tasks will bore a person suffering from BPCD to death. If the person is also clumsy this results in a high error rate. While WBPCD patients just ignore those errors and think they will manage to do everything correctly the next time, you will find a high level of automation in the BPCD infected work environment.</li>
<li><i>A strange kind of perfectionism</i> &#8211; While WBPCD causes the infected person to believe to be already perfect and requesting perfectionism from other people, BPCD makes you strive for perfectionism yourself. The typical BPCD patient is always in a mentally driven state, trying to learn and improve and help others get BPCD infected as well.</li>
<li><i>Annoying curiosity</i> &#8211; Living or working with a BPCD infected person can be a challenging experience. Always seeking for answers the BPCD patient never stops questioning every possible process until he either recognizes it&#8217;s worth or starts trying to make you change. People who do not want to change should try to avoid contact with BPCD infected persons to prevent physical damage.</lii>
<li><i>Bad memory</i> &#8211; An unimaginably bad memory can help to catch BPCD. Some patients can&#8217;t remember what or why they did whatever they did last week, or if NMBR is shorthand for &#8220;number&#8221; or &#8220;Non Memorable Abbreviation&#8221;. Thus they find themselves reading their own code with the eyes of a stranger. This makes BPCD infected programmers write code in a way that people who know close to nothing about the project can easily read their code. For WBPCD infected persons this just means being late to meetings.</li>
</ul>
<p>If you want to get BPCD infected you can read this nice <a href="http://willcode4beer.blogspot.com/2007/02/becoming-better-developer.html">article about becoming a better developer at willcode4beer&#8217;s</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/03/04/how-to-diagnose-morbus-maximus-hypercodus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XP &#8211; Cult or Movement?</title>
		<link>http://klimek.box4.net/blog/2007/02/26/xp-cult-or-movement/</link>
		<comments>http://klimek.box4.net/blog/2007/02/26/xp-cult-or-movement/#comments</comments>
		<pubDate>Mon, 26 Feb 2007 19:32:23 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/02/26/xp-cult-or-movement/</guid>
		<description><![CDATA[Today somebody posted a very interesting comment on my recent article about my experience with XP. He (or she) linked to an article called Extreme Deprogramming. The comment&#8217;s author said it was &#8220;The most insightful take on XP&#8221;, in his opinion. Well, the article is very entertaining indeed, so first of all I recommend that [...]]]></description>
			<content:encoded><![CDATA[<p>Today somebody posted a very interesting comment on my recent <a href="http://klimek.box4.net/blog/2007/02/19/do-you-understand-xp/">article about my experience with XP</a>. He (or she) linked to an article called <a href="http://www.hacknot.info/hacknot/action/showEntry?eid=11">Extreme Deprogramming</a>. The comment&#8217;s author said it was &#8220;The most insightful take on XP&#8221;, in his opinion. Well, the article is very entertaining indeed, so first of all I recommend that you read it if you promise to come back when you&#8217;re finished&#8230;</p>
<p>The article finds that XP is a cult. Well, I totally agree. But than again &#8211; so what? All great movements that come to my mind started as small cults. For example &lt;insert your preferred transcendent association&gt;. I don&#8217;t really know about anything but Christianity, but I believe that other religious leaders had a hard time being accused of cult leadership, too, when they started their business. Now of course I counter polemics with polemics &#8211; but hey, I&#8217;ll flagellate myself later with my cult-colored whip.</p>
<p>Speaking about movements, don&#8217;t forget emancipation, civil rights or the Internet. In the beginning it&#8217;s always a few nerds with some crazy idea who build up a cult. And in the beginning nobody can say if it&#8217;s going to be the next big movement or just an other flash in the pan that didn&#8217;t beat <a href="http://en.wikipedia.org/wiki/Metcalfe's_law">Metcalfe&#8217;s Law</a>.</p>
<p>The article doesn&#8217;t have a single argument against any XP practice. Funny, eh? The value of XP is judged purely by the author&#8217;s perception of XP in the media. Can you tell if an apple is sweet without taking a good bite?</p>
<p>Apart from tagging XP a cult, which is true, the article raises some claims that are &#8211; let me put it bluntly: wrong. For those of you who favor polemics over reasoning, stop reading here.</p>
<p><b>Elitist Attitude</b><br />
Cited from <a href="http://www.hacknot.info/hacknot/action/showEntry?eid=11">Extreme Deprogramming</a>.<br />
<cite>This is definitely a group of people who think they have got it, and that anyone else not similarly enthused is a laggard.</cite><br />
<cite>That knowledge of what is and isn&#8217;t OK is seen to be held by a central authority and is not in the hands of the practitioners themselves [...]</cite></p>
<p>Those citations give the impression that XP&#8217;s great ol&#8217; ones are arrogant know-it-alls, who just want to make a lot of money. OK, they probably want to make a lot of money, but if you get involved with the extreme programming yahoo group, you&#8217;ll see that they answer your questions patiently. Especially Ron gives away a lot of consulting time for free (or he is a quick writer). The community behind XP is caring, open-minded and welcoming, always reflecting upon their own flaws.</p>
<p><b>All or nothing</b><br />
<cite>This all-or-nothing thinking is typical of cults. Members must display total dedication to the cult and its objectives, or they are labeled impure and expelled from the community.</cite></p>
<p>I don&#8217;t know where this insight comes from, but when I read the yahoo group for XP many people advice you to try to implement a practice only if you think it addresses a problem you have. </p>
<p>Most of the author&#8217;s knowledge about XP seems to stem from the newsgroup comp.software.extreme-programming. I can only do some guesswork: Mayhap there are many agile zealots who don&#8217;t have a clue of what XP is about and they manage to build up some weird image in open newsgroups. I can only recommend to take a look at the archives over at <a href="http://tech.groups.yahoo.com/group/extremeprogramming/">the XP group</a> and lean more about the community.</p>
<p><b>Conclusion</b><br />
The long term success of XP will probably depend a lot on whether it really works. To get the answer you can try it out for yourself. Apart from that only time can tell if XP will be a movement that changes the way we implement software systems or yet another hype. </p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/02/26/xp-cult-or-movement/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Brave New Ruby World</title>
		<link>http://klimek.box4.net/blog/2007/02/25/brave-new-ruby-world/</link>
		<comments>http://klimek.box4.net/blog/2007/02/25/brave-new-ruby-world/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 17:02:52 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/02/25/brave-new-ruby-world/</guid>
		<description><![CDATA[The first time I heard about ruby was at University about eight years ago when most of ruby&#8217;s documentation was Japanese. Back than it was hard to find a good introduction to ruby and since I favor curly bracket languages for aesthetic reasons I decided to stick with perl.
Last week I gave ruby a new [...]]]></description>
			<content:encoded><![CDATA[<p>The first time I heard about ruby was at University about eight years ago when most of ruby&#8217;s documentation was Japanese. Back than it was hard to find a good introduction to ruby and since I favor curly bracket languages for aesthetic reasons I decided to stick with perl.</p>
<p>Last week I gave ruby a new chance to enter my programming tools portfolio. I&#8217;m developing embedded C++ for a living and usually automate coupling of code and data by using scripts. Now the task was to write a script to parse some enums in header files which use a predefined layout for comments, parse the whole code base to check whether those codes are used consistently (> 100.000 LOC) and generate and check some XML files that define default configurations for the software product.</p>
<p>Most of the scripts we used in the past are written in perl, since python just lacks the convenience. But since I always have a problem building up data structures in perl and knew that this script required some heavy data structure building I wanted to give ruby a try. So I opened some ruby introductions and documentations in my browser and watched myself learning ruby.</p>
<p>I was impressed. The documentation is very good and I was able to write productive code right from the start. One interesting thing is that while I learned more about ruby the code I had already written didn&#8217;t seem awkward. With ruby I was able to write nice and clean code right from the start. This is probably what Yukihiro meant when he said he tried to make ruby &#8220;natural&#8221;.</p>
<p>Ruby adapted to my OO style beautifully. Writing new objects and building up data structures works like the language was tailored to my needs. The convenient regular expression handling methods (which include the good ol&#8217; $1 .. $n variables we know from perl) make string parsing as easy as in perl. And while I don&#8217;t have any data available, the perceived performance is quite impressive &#8211; parsing our complete code base with multiple regular expressions just takes a couple of seconds. Ruby even provides a perl-compatible command line argument set for in-line editing that can be <a href="http://www.ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/variable.html#opt_i">controlled via built-in variables</a> (see the <a href="http://www.ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/index.html">Ruby Language Reference Manual</a>).</p>
<p>After working with ruby for some hours, I find it very attractive that you automatically stick to a functional programming style for most of the time while introducing imperative data manipulating statements where necessary. This makes programming a far less error prone experience.</p>
<p>But the ruby also shows some less shiny sides. During the first hours of using ruby I discovered some interface anomalies that are not made explicit. For example it took me some time to figure out the difference between the foreach and the each function. Now that I understood that foreach is parametrized by an additional layer of abstraction objects I really like the concept, but still the naming got me confused at first &#8211; for me for each is executed for each element, so what&#8217;s the difference?</p>
<p>Talking about interfaces: I used ruby libxml for xml parsing and generation. Everything worked fine in linux, but I was not able to install ruby-libxml via gem on windows without compiling the code by myself. So I looked for a different xml library that is available in windows, too. I found REXML, but REXML and ruby-libxml are not interface compatible. In a statically typed language the compiler would have taken care of this, but in ruby I don&#8217;t get errors until late at runtime. It&#8217;s especially hard in such a case when the interfaces contain methods with the same names that do different things. But than again perhaps such a high level of interface coherence is only possible with integrated commercial libraries like Java and .Net.</p>
<p>All in all ruby has blow my mind and I&#8217;ll use it as primary scripting language from this day on. If you are looking for a clean object oriented dynamically typed language with a nice functional touch give ruby a try.</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/02/25/brave-new-ruby-world/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Do You Understand XP?</title>
		<link>http://klimek.box4.net/blog/2007/02/19/do-you-understand-xp/</link>
		<comments>http://klimek.box4.net/blog/2007/02/19/do-you-understand-xp/#comments</comments>
		<pubDate>Mon, 19 Feb 2007 21:27:37 +0000</pubDate>
		<dc:creator>klimek</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://klimek.box4.net/blog/2007/02/19/do-you-understand-xp/</guid>
		<description><![CDATA[The first time I heard of Extreme Programming was during my University days. We didn&#8217;t really learn anything more sophisticated than the Waterfall model, so I was totally unprepared. Since I had no practical experience in programming teams with more than two persons, I didn&#8217;t understand the problems of the Waterfall model or even of [...]]]></description>
			<content:encoded><![CDATA[<p>The first time I heard of Extreme Programming was during my University days. We didn&#8217;t really learn anything more sophisticated than the Waterfall model, so I was totally unprepared. Since I had no practical experience in programming teams with more than two persons, I didn&#8217;t understand the problems of the Waterfall model or even of a complete lack of processes. I never experienced the pressure building up when you code with a deadline hanging around like the sword of Damocles.</p>
<p>Then I took a look at <a href="http://www.extremeprogramming.org/">extremeprogramming.org</a>. I poked around for a while, read about Pair Programming, Test Driven Development and Customer Involvement and concluded: This just can&#8217;t work.</p>
<p><b>How can doing more work make you more productive?</b></p>
<p>This is the way many people react to the XP ideas when they first hear about it. About a year ago, just after I read the <a href="http://klimek.box4.net/blog/library/andrew-hunt/the-pragmatic-programmer-from-journeyman-to-master/">Pragmatic Programmer</a>, I decided that the time was ripe to find out what XP was all about. So I ordered me a copy of <a href="http://klimek.box4.net/blog/library/kent-beck/extreme-programming-explained-embrace-change-2nd-edition/">Extreme Programming Explained</a>. With two years of real experience as a software developer XP made a lot more sense. But still I was not convinced. I didn&#8217;t see the big picture yet.</p>
<p>Over the last year I started to read some &#8220;classic&#8221; software development literature, like the <a href="http://klimek.box4.net/blog/library/frederick-p-brooks/the-mythical-man-month-essays-on-software-engineering-20th-anniversary-edition/">Mythical Man Month</a> or <a href="http://klimek.box4.net/blog/library/steve-mcconnell/code-complete-microsoft-programming/">Code Complete</a>. While studying software processes I realized that the ideas of XP were not new. In fact, some of them were 30 year old knowledge distilled into a set of best practices.</p>
<p><b>It took me about a year of studying and work experience to grasp the essence of XP.</b></p>
<p>Why is XP counterintuitive at a first glance? The answer to this is easy: Nearly every concept of XP looks like it makes you less productive. Only once you understand the concept of the cost of errors (see this <a href="http://stevemcconnell.com/articles/art04.htm">article by Steve McConnel</a> and his book <a href="http://klimek.box4.net/blog/library/steve-mcconnell/code-complete-microsoft-programming/">Code Complete</a>) you&#8217;ll recognize why XP pays off. Let&#8217;s consider some of the XP practices in detail.</p>
<p><b>Pair Programming:</b> How can it pay off in terms of ROI to have two programmers work at the same problem at the same time? Don&#8217;t we live in the age of specialization, where working on highly specialized tasks in parallel guarantees maximum output? The problem is the cost per error. </p>
<p>Software development is a complex process where errors are easy to make and hard to catch. High level languages and even MDA don&#8217;t reduce system complexity, they only help ordering our mind. So one of the maxims of software development is to get quality into the system <i>when the code is written</i>. If errors are found while pondering over the problem, they&#8217;re fixable within a fraction of a second. So pondering with a programming peer helps to build quality into the system, to reduce waste when a problem is found that the peer can easily solve and to keep focused but not zoned out while writing code.</p>
<p>As of today you can find some studies about Pair Programming, which are unfortunately mostly built upon a University experiments, so the validity of the results are questionable. That aside, all studies I found so far claimed increased productivity by the pairs.</p>
<p><b>Test Driven Development:</b> It took me quite some time to buy into this one. Kent Beck admits in Extreme Programming Explained that you&#8217;ll write as much LOC for tests as for the real system. So there&#8217;s the magic factor of two again. Just like with Pair Programming, everybody agrees enthusiastically that implementing unit tests is good, but it&#8217;s hard to believe that writing as many LOC for unit tests as for the target will improve productivity.</p>
<p>This is one of the concepts where you have to &#8220;be there&#8221; before you&#8217;ll really understand. The value in unit tests is not only that you have a nice regression test suite during development that helps you refactor your system without breaking old features, but it <i>helps you to understand your own code</i>. This is magic. Try it. Feel it. And you will believe.</p>
<p><b>Continuous Integration:</b> Of course everybody wants to do continuous integration. But is it really possible? This is where XP&#8217;s practices interconnect: Without the high level of quality that Pair Programming and TDD yield, it&#8217;s hard to maintain a stable development version. And once you have the required high quality processes in place, continuous integration is for free and feeds back into your high quality loop.</p>
<p><b>Collective Code Ownership:</b> Some things about software development are purely in the head of the developers. But even without owning a degree in experimental psychology it&#8217;s easy to see that Pair Programming is hard to implement if code &#8220;belongs&#8221; to individuals. If everybody is accountable for &#8220;his&#8221; achievements, Pair Programming feels like giving away time to your team mates. So much for being a team player.</p>
<p><b>Story Cards:</b> Yeah, so using a different kind of medium will solve all my problems, right? First, no. No single practice of XP claims to solve all your problems. And second, take a look at this <a href="http://www.xprogramming.com/xpmag/Etudes.htm">article by Ron Jeffries</a>. In combination with fixed iteration cycles, story cards can give you valuable feedback about how fast you&#8217;re going (warning: this may be a shocking experience).</p>
<p><b>Fixed iteration cycles:</b> In my view this is one of the practices that is coupled the most to the other XP principles. To implement fixed iteration cycles successfully you need continuous integration &#8211; otherwise you&#8217;ll spend your time managing myriads of branches. As stated above, this implies high quality code, which is all but impossible without automating your tests and constantly reviewing your code. And you&#8217;ll get most out of your fixed iterations if you can measure your velocity (the sum of completed story points) at the end of each iteration. </p>
<p><b>Customer Involvement:</b> Isn&#8217;t it impossible to have a customer on-site if you produce for a range of users? The first thing that is easily misinterpreted about customer involvement is the very concept itself. Customer involvement doesn&#8217;t necessarily mean to place a real customer next to your developers. It just means that a person that knows the user (which may very well be your in-house product management) prioritizes the user stories. This way you maximize the ROI in every iteration.</p>
<p>-</p>
<p>At a first glance most of the XP principles are counterintuitive. They seem to cost a lot of programmer time while lacking measurable return of investment. The only way to see through the top layer and to understand the inner workings of XP is to learn more about XP or agile processes in general. If you want to understand XP better or just start a flame about software development processes I recommend the <a href="http://tech.groups.yahoo.com/group/extremeprogramming/">Extreme Programming Yahoo Group</a>. Over there Ron Jeffries, Kent Beck et al. patiently answer your questions (in Ron&#8217;s case mostly with more questions).</p>
]]></content:encoded>
			<wfw:commentRss>http://klimek.box4.net/blog/2007/02/19/do-you-understand-xp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
