<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://jerryjvl.com/wp-atom.php">
	<title type="text">JerryJvL</title>
	<subtitle type="text">Step Inside my Mind... Pull Up an Argument</subtitle>

	<updated>2012-05-20T06:24:51Z</updated>

	<link rel="alternate" type="text/html" href="http://jerryjvl.com" />
	<id>http://jerryjvl.com/feed/atom</id>
	

	<generator uri="http://wordpress.org/" version="3.3.2">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/JerryJvL" /><feedburner:info uri="jerryjvl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[The Maw]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/BQQkLqXNkqA/the-maw" />
		<id>http://jerryjvl.com/?p=815</id>
		<updated>2012-05-19T07:47:37Z</updated>
		<published>2012-05-19T07:47:37Z</published>
		<category scheme="http://jerryjvl.com" term="PC Games" /><category scheme="http://jerryjvl.com" term="review" /><category scheme="http://jerryjvl.com" term="Steam" />		<summary type="html"><![CDATA[The Maw has been sitting in my Steam to-play list for some time now. After finally giving in and giving it a try, I was very pleasantly surprised by how much fun this game is.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/entertainment/games/games-pc/the-maw">&lt;p&gt;I bought this game on-special on Steam over XMAS, but I had not played it yet. I had assumed it was going to be a tricky action-based game, and I never felt I quite had the patience for that before.&lt;/p&gt;
&lt;p&gt;My bad.&lt;/p&gt;
&lt;p&gt;The premise of the game is that the player and The Maw escape imprisonment on a space ship when it crash-lands in the opening sequence. Together they must try to make their way past their captors and the local wild-life to try and escape altogether.&lt;/p&gt;
&lt;p&gt;Throughout the game the player must guide The Maw by an electronic leash that you find at the start of the first level. This gets hard at times when The Maw has his own idea of what he’d like to do.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawCowering.jpg" data-rel="prettyPhoto[folio]" title="The Maw - Cowering" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawCowering.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Maw is very expressive, which is quite an achievement considering he barely has any features at all. The styling and animation of this game has a very cartoony feel to it, which works perfectly with its sense of humour.&lt;/p&gt;
&lt;p&gt;When The Maw gets excited he hops around on his one foot. When he gets hit he looks dazed. When he eats something delicious he gets a dreamy look in his eyes… uhm… eye.&lt;/p&gt;
&lt;p&gt;Oh, I forgot to mention.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawTransformer.jpg" data-rel="prettyPhoto[folio]" title="The Maw - Transforming" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawTransformer.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Maw likes to eat things.&lt;/p&gt;
&lt;p&gt;Anything really. Little of the indigenous fauna will be left standing when you complete each level. And as he eats, he will occasionally grow a size. And as he grows, he can eat larger food. And he will not leave you in any doubt as to what he’d like to eat next.&lt;/p&gt;
&lt;p&gt;And that’s where the main twist comes in. Occasionally when eating an animal, The Maw will transform and gain an ability of said animal (&lt;em&gt;no spoilers&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;This adds a lot of variety to the game-play, because the strategy to tackle various levels changes depending on The Maw’s last meal.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawInGameHints.jpg" data-rel="prettyPhoto[folio]" title="In-game hints as the game progresses" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawInGameHints.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Although a game with so much variety might otherwise risk becoming inaccessible to inexperienced gamers, The Maw manages to keep things flowing naturally by providing casual hints as you go along.&lt;/p&gt;
&lt;p&gt;Early on, floating question marks draw attention to the next thing to try.&lt;/p&gt;
&lt;p&gt;The level design seems to have been done very well to steer the line-of-sight of the player so that crucial elements of the level naturally come in view without feeling forced.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawMatrixDodge.jpg" data-rel="prettyPhoto[folio]" title="Actions are also hinted" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawMatrixDodge.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Additionally, the game controls are explained as you go along as well. At the start pop-up screens explain the main buttons to lead The Maw, move objects and throw them around.&lt;/p&gt;
&lt;p&gt;And for the more action-based controls, small overlay balloons show you which button to use to for example do a Matrix-style dodge of an incoming shot.&lt;/p&gt;
&lt;p&gt;And even if you react too late, nothing is lost. There are no “&lt;em&gt;lives&lt;/em&gt;” in this game. You cannot die.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawAchievements.jpg" data-rel="prettyPhoto[folio]" title="Achievements" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/05/TheMawAchievements.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The only “&lt;em&gt;down-side&lt;/em&gt;” of all this built-in assistance is that this is not a very challenging game. I managed to complete it in under 5 hours. And even if I try to finish all the achievements it probably would not add more than another 5 hours on top of that.&lt;/p&gt;
&lt;p&gt;Having said that, nothing feels like “&lt;em&gt;filler&lt;/em&gt;” in this game. New game elements are continuously introduced to the player and none of the levels involve excessive back-tracking in an attempt to make it feel like “&lt;em&gt;you are getting your moneys’ worth&lt;/em&gt;“. It also doesn’t attempt to stretch the game by being fiddly; the controls are quite forgiving when trying to line up an action.&lt;/p&gt;
&lt;p&gt;All up, it’s a lot of fun, and never really frustrating.&lt;/p&gt;
&lt;p&gt;The only real criticism I have is that at times I wish I could have panned the camera up or down to get a better view of the level, but unfortunately you can only control it 360 degrees around. This is only a minor quibble though, because it never prevented me from seeing what I needed to see to keep going.&lt;/p&gt;
&lt;p&gt;You can get the &lt;a href="http://store.steampowered.com/app/26000/" title="The Maw on Steam" target="_blank" class="link"&gt;whole game on Steam&lt;/a&gt; with all the downloadable content for US$12, and that’s only if you’re not patient enough to wait for it to be on special sometime.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=BQQkLqXNkqA:PgNqHN_M8M4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=BQQkLqXNkqA:PgNqHN_M8M4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=BQQkLqXNkqA:PgNqHN_M8M4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/BQQkLqXNkqA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/entertainment/games/games-pc/the-maw#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/entertainment/games/games-pc/the-maw/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/entertainment/games/games-pc/the-maw</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Hardware Alchemy]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/XSuSXbhdI_s/hardware-alchemy" />
		<id>http://jerryjvl.com/?p=795</id>
		<updated>2012-04-15T11:07:32Z</updated>
		<published>2012-04-15T01:48:24Z</published>
		<category scheme="http://jerryjvl.com" term="Computers" /><category scheme="http://jerryjvl.com" term="ebay" /><category scheme="http://jerryjvl.com" term="gpu" />		<summary type="html"><![CDATA[In which I turn a Galaxy S into a Gigabyte HD7850 through the alchemical process called eBay. My next post might be a while, Settlers 7 is calling!]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/tech/hardware/hw-computers/hardware-alchemy">&lt;p&gt;I turned my no-longer-needed-because-I-upgraded Samsung Galaxy S into a HD7850 (almost), via the alchemical process called eBay. I’ve long since gotten over wanting to hang on to bits of hardware “&lt;em&gt;just in case I need it sometime&lt;/em&gt;“.&lt;/p&gt;
&lt;p&gt;I never do.&lt;/p&gt;
&lt;p&gt;And they end up gathering dust till they are obsolete.&lt;/p&gt;
&lt;p&gt;The best way to go about this I’ve found is to let the item do all the work:&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;List the most relevant specs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Highlight&lt;/strong&gt; the best features&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mention any flaws, but don’t dwell on them&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;List for as long as possible (10 days)&lt;/li&gt;
&lt;li&gt;Start at $0.99&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that last step is the scary part. So far every time I’ve sold for more than I expected, but it is always possible it ends up selling for $0.99 … I’d only stray from this tactic if I had to sell something to a niche market that might not spot the item within 10 days.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/04/HardwareAlchemy1.jpg" data-rel="prettyPhoto[folio]" title="HD7850 - Gigabyte OC model" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/04/HardwareAlchemy1-1024x636.jpg" alt="HD7850 - Gigabyte OC" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So finally, I’m back on a &lt;em&gt;real&lt;/em&gt; graphics card. After my HD5870 died sometime last year and I settled for a HD5450 to tide me over, I can finally play &lt;a href="http://en.wikipedia.org/wiki/The_Settlers_7:_Paths_to_a_Kingdom" class="link"&gt;Settlers 7&lt;/a&gt; again!&lt;/p&gt;
&lt;p&gt;I was originally looking at a HD7950 or a HD7870, but after some reflection I’m not the kind of gamer that needs the fastest possible card. I’ll drop the detail a fraction if I really cannot hit a decent framerate as-is.&lt;/p&gt;
&lt;p&gt;And the media PC in the living room has a brand new silent (fan-less) HD5450 in the process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Addendum (9pm)&lt;/strong&gt;: It feels great maxing out all those sliders! … That is all.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=XSuSXbhdI_s:5iwsTGDltAQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=XSuSXbhdI_s:5iwsTGDltAQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=XSuSXbhdI_s:5iwsTGDltAQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/XSuSXbhdI_s" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/tech/hardware/hw-computers/hardware-alchemy#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/tech/hardware/hw-computers/hardware-alchemy/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/tech/hardware/hw-computers/hardware-alchemy</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Forbidden Island]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/vd-NNhT6QkQ/forbidden-island" />
		<id>http://jerryjvl.com/?p=776</id>
		<updated>2012-04-11T14:57:19Z</updated>
		<published>2012-04-11T14:57:19Z</published>
		<category scheme="http://jerryjvl.com" term="Board Games" /><category scheme="http://jerryjvl.com" term="game" /><category scheme="http://jerryjvl.com" term="review" /><category scheme="http://jerryjvl.com" term="wednesday" />		<summary type="html"><![CDATA[Most Wednesdays we meet up with a group of close friends to catch up and chat. Often this includes board games. This week's new game: Forbidden Island, where the game tries to kill the collaborating players.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/entertainment/games/games-board/forbidden-island">&lt;div class="wp-caption alignright" style="width: 210px"&gt;&lt;a href="http://www.gamesparadise.com.au/forbidden-island"&gt;&lt;img alt="Forbidden Island - Front of the Box" src="http://www.gamesparadise.com.au/media/catalog/product/cache/5/image/390x/9df78eab33525d08d6e5fb8d27136e95/f/o/forbiddenisland2_1.jpg" title="Front of the Box" width="200" height="200" /&gt;&lt;/a&gt;
&lt;p class="wp-caption-text"&gt;Front of the Box&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Almost every Wednesday evening we have some friends over. It’s a long-standing weekly ritual. It involves having snacks and dinner and dessert together. Sometimes it involves nothing but talk. Sometimes we go out and watch a movie. But most of the time we play board games…&lt;/p&gt;
&lt;p&gt;I may have to be a little bit more specific here, because the first mental image that “&lt;em&gt;board games&lt;/em&gt;” conjures for most people are the bland mainstays of Monopoly or Risk. Little do they know there’s this whole ‘nuther world out there of somewhat geeky/nerdy (&lt;em&gt;but don’t let that turn you off before you try!&lt;/em&gt;) games with a lot more depth and complexity than traditional board games. And it really isn’t as intimidating as it sounds.&lt;/p&gt;
&lt;p&gt;Tonight was the first time we tried &lt;strong&gt;&lt;a href="http://www.gamesparadise.com.au/forbidden-island" title="Forbidden Island" target="_blank" class="link"&gt;Forbidden Island&lt;/a&gt;&lt;/strong&gt;, and it played a lot quicker than I would have expected. In the end we had enough time to play 6 rounds, although some were shockingly brief.&lt;/p&gt;
&lt;div class="wp-caption alignleft" style="width: 210px"&gt;&lt;a href="http://www.gamesparadise.com.au/forbidden-island"&gt;&lt;img alt="Forbidden Island - Back of the Box" src="http://www.gamesparadise.com.au/media/catalog/product/cache/5/image/390x/9df78eab33525d08d6e5fb8d27136e95/f/o/forbiddenisland3_1.jpg" title="Back of the Box" width="200" height="200" /&gt;&lt;/a&gt;
&lt;p class="wp-caption-text"&gt;Back of the Box&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;What is somewhat special about this game is that you do not play against each other. All the players are adventurers stuck together on an island, filled with treasures, that is slowly sinking. Everybody plays with their cards open on the table. It is a cooperative game, and you either win or lose together. The game actively tries to kill you all.&lt;/p&gt;
&lt;p&gt;Fun fact: there is one way to win the game – collect all the treasures while shoring up the island to keep it above water just long enough to all make it back to the helicopter pad and escape the island.&lt;/p&gt;
&lt;p&gt;Second fun fact: there are three ways to lose the game – one of the players drowns, or a part of the island sinks that is critical to completing the mission, or the water level rises too high.&lt;/p&gt;
&lt;p&gt;Let’s put it this way: the odds are slightly stacked against the players. We played six rounds in about three hours at the “Novice” level. The first attempt we lost the game without even completing a full round due to sheer bad luck.&lt;/p&gt;
&lt;div class="wp-caption alignright" style="width: 210px"&gt;&lt;a href="http://www.gamesparadise.com.au/forbidden-island"&gt;&lt;img alt="Forbidden Island - Contents of the Box" src="http://www.gamesparadise.com.au/media/catalog/product/cache/5/image/390x/9df78eab33525d08d6e5fb8d27136e95/f/o/forbiddenisland.jpg" title="Contents of the Box" width="200" height="200" /&gt;&lt;/a&gt;
&lt;p class="wp-caption-text"&gt;Contents of the Box&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All in all I think we won three out of six, but it was more of a struggle than it seemed it should have been. The good thing about the game is that the turns are all pretty quick, so nobody will have to sit around twiddling thumbs getting bored. And when you lose, there’s always time for another game.&lt;/p&gt;
&lt;p&gt;The rules seem complex at first reading, but once you get to playing the game it’s really not that hard to wrap your head around. The most easily forgotten part is that each adventurer has a “profession” and a special ability that comes with it. It’s very easy to overlook your special abilities when in the heat of the moment you are trying to save the helipad from sinking into the abyss and rescuing the pilot from certain death.&lt;/p&gt;
&lt;p&gt;I think it’ll be a while before we scale the fourth difficulty level, intimidatingly labelled “Legendary”.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=vd-NNhT6QkQ:I9lO_XnoVe8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=vd-NNhT6QkQ:I9lO_XnoVe8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=vd-NNhT6QkQ:I9lO_XnoVe8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/vd-NNhT6QkQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/entertainment/games/games-board/forbidden-island#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/entertainment/games/games-board/forbidden-island/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://jerryjvl.com/entertainment/games/games-board/forbidden-island</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Easter Storm]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/SCoUy6c45h8/easter-storm" />
		<id>http://jerryjvl.com/?p=759</id>
		<updated>2012-04-08T11:42:11Z</updated>
		<published>2012-04-08T11:40:15Z</published>
		<category scheme="http://jerryjvl.com" term="Life" /><category scheme="http://jerryjvl.com" term="Easter" /><category scheme="http://jerryjvl.com" term="lightning" />		<summary type="html"><![CDATA[Easter Sunday ended in a big deluge here over western Sydney. I tried to get some lightning pictures, but was only moderately successful.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/life/easter-storm">&lt;p&gt;About ten minutes into the storm tonight it occurred to me that I had access to a tripod and a good quality DSLR. The view out the front rooms has always been great for lightning; the house is on the raised side of the street and we have a rather good view out over the suburb here.&lt;/p&gt;
&lt;p&gt;Lots of sky.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning1.jpg" data-rel="prettyPhoto[folio]" title="First lightning strike I captured" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning1-1024x512.jpg" alt="First lightning strike" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning2.jpg" data-rel="prettyPhoto[folio]" title="Second lightning strike I captured" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning2-1024x512.jpg" alt="Second lightning strike" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately it turned out that most of the lightning was happening behind the cloud cover, so I got only a few single bolts, and lots of ho-hum shots with purple/blue clouds.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning3.jpg" data-rel="prettyPhoto[folio]" title="Cars rushing past, note the orange streaks of the indicator" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning3-1024x512.jpg" alt="Passing cars" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning4.jpg" data-rel="prettyPhoto[folio]" title="A good view of the bucketing rain" data-text="» Enlarge" class="hovering"&gt;&lt;img class="scale-with-grid alignleft" src="http://jerryjvl.com/wp-content/uploads/2012/04/Lightning4-1024x512.jpg" alt="Rain bucketing down in the headlights" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After a day of no driving (everything is closed on Sunday, so there wasn’t really anywhere to go) it seemed like everyone started driving along as soon as the rain started. Most of my shots have streaky headlights in the bottom. I kept a few of the better ones to show off how wet the weather was. Especially the last one shows off the bucketing rain in the headlights of a passing car.&lt;/p&gt;
&lt;p&gt;Now… what was I doing before all this started happening?&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=SCoUy6c45h8:Cv2ePvLluyo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=SCoUy6c45h8:Cv2ePvLluyo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=SCoUy6c45h8:Cv2ePvLluyo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/SCoUy6c45h8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/life/easter-storm#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/life/easter-storm/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://jerryjvl.com/life/easter-storm</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Site Redesigned]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/sNDPK1wv4nU/site-redesigned" />
		<id>http://jerryjvl.com/?p=752</id>
		<updated>2012-04-06T14:42:38Z</updated>
		<published>2012-04-06T13:50:15Z</published>
		<category scheme="http://jerryjvl.com" term="Design" /><category scheme="http://jerryjvl.com" term="overview" /><category scheme="http://jerryjvl.com" term="theme" /><category scheme="http://jerryjvl.com" term="Themeforest" /><category scheme="http://jerryjvl.com" term="web" />		<summary type="html"><![CDATA[I finally re-themed my site. In the end I didn't do the work myself, because as it turns out I'm not very good value for money as a web designer.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/meta/meta-design/site-redesigned">&lt;h3&gt;Procrastination&lt;/h3&gt;
&lt;p&gt;I have wanted to re-style this site for quite some time. Looking at the &lt;a href="http://wordpress.org/extend/themes/" title="Wordpress Themes" target="_blank" class="link"&gt;free WordPress themes&lt;/a&gt; for inspiration I’d decided to get what I wanted I was going to have to put it together myself.&lt;/p&gt;
&lt;p&gt;Alas, finding time to do it right has proven difficult.&lt;/p&gt;
&lt;p&gt;Turns out that there was a much simpler way out. For about US$25 – US$35 the &lt;a href="http://themeforest.net/" title="Theme Forest" target="_blank" class="link"&gt;Theme Forest&lt;/a&gt; site has a very broad range of professional designs for WordPress. And plenty of them looking close enough to be good enough.&lt;/p&gt;
&lt;p&gt;If you are looking to put together a personal blog this is an excellent place to get something slick. Just ask yourself, how much is your time worth to you? And how little of it would US$30 pay for?&lt;/p&gt;
&lt;p&gt;Of course this means the theme isn’t completely exclusive to me, but there are plenty of knobs and levers to twiddle that it won’t look much like anyone else’s. Note that a lot of these themes use “Option Tree” which is a WordPress plugin that provides for very flexible configuration pages.&lt;/p&gt;
&lt;p&gt;I wanted something a bit more than just a slick theme though; I wanted a &lt;a href="http://en.wikipedia.org/wiki/Responsive_design" title="Responsive Web Design" target="_blank" class="link"&gt;responsive design&lt;/a&gt; that adjusts itself based on the dimensions of the window. As a result, if you look at this site on a mobile device or re-size the window it should adapt to any available space.&lt;/p&gt;
&lt;p&gt;Responsive designs are not quite common yet, but more of them come out every day.&lt;/p&gt;
&lt;h3&gt;My Theme Choice&lt;/h3&gt;
&lt;p&gt;In the end I settled on the &lt;a href="http://themeforest.net/item/apex-responsive-portfolio-wordpress-theme/1597958?WT.ac=search_item&amp;#038;WT.seg_1=search_item&amp;#038;WT.z_author=damojo" title="Apex Responsive Portfolio Theme" target="_blank" class="link"&gt;Apex Responsive Portfolio&lt;/a&gt; theme, which I tweaked and customised quite extensively to make it more my own.&lt;/p&gt;
&lt;p&gt;The theme options allowed for most of the tweaks:&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;Picking a blue shade for the highlight colour&lt;/li&gt;
&lt;li&gt;Adjusting the header fonts from the &lt;a href="http://www.google.com/webfonts" title="Google Web Fonts" target="_blank" class="link"&gt;Google Web Font&lt;/a&gt; library&lt;/li&gt;
&lt;li&gt;Substituting a custom logo based on the same font and colour I already picked&lt;/li&gt;
&lt;li&gt;Setting up the front page slider with my own images&lt;/li&gt;
&lt;li&gt;Customising the header menus&lt;/li&gt;
&lt;li&gt;Tweaking the footer widgets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That didn’t quite get me where I wanted to be, so in the end I had to resort to some custom PHP hacking in the theme files. In no way do I recommend this. Few developers have the discipline to write maintainable PHP.&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;By default the blog view truncates every post to the first 35-odd words; I like my blog to show the full post instead.&lt;/li&gt;
&lt;li&gt;Even where I didn’t want the full post to show, 35 words doesn’t seem like nearly enough. Although the word count was a parameter to the calls in the theme, it didn’t seem to accept values above 55, so… more tweaking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There were many more minor tweaks that I won’t go into right now.&lt;/p&gt;
&lt;p&gt;More interesting is the matter of plug-ins. It took me quite some time to find a compatible and functional set to address my needs. I’ll write about that process sometime soon, because I think I have a few useful suggestions for would-be WordPress users.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=sNDPK1wv4nU:8-io-BzEzW8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=sNDPK1wv4nU:8-io-BzEzW8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=sNDPK1wv4nU:8-io-BzEzW8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/sNDPK1wv4nU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/meta/meta-design/site-redesigned#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/meta/meta-design/site-redesigned/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/meta/meta-design/site-redesigned</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Understanding Code]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/Xzvu8Nkkppc/understanding-code" />
		<id>http://jerryjvl.com/?p=412</id>
		<updated>2012-04-05T11:51:41Z</updated>
		<published>2011-11-01T06:42:25Z</published>
		<category scheme="http://jerryjvl.com" term="Computing Science" /><category scheme="http://jerryjvl.com" term="code" /><category scheme="http://jerryjvl.com" term="formal methods" /><category scheme="http://jerryjvl.com" term="idea" />		<summary type="html"><![CDATA[The most difficult aspect of developing code is understanding code. The best way to make code understandable is to have it document itself. Some thoughts on the best approach to do this.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/tech/software/sw-science/understanding-code">&lt;h3&gt;Spot The Invariant&lt;/h3&gt;
&lt;p&gt;Writing correct code in itself is not the most difficult and important thing programmers have to be able to do. By far the more difficult and crucial part of my profession is understanding code.&lt;/p&gt;
&lt;p&gt;Understanding code is a factor in all of the following activities:&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;Finding bugs in existing code&lt;/li&gt;
&lt;li&gt;Enhancing existing code&lt;/li&gt;
&lt;li&gt;Using libraries from new code&lt;/li&gt;
&lt;li&gt;Keeping a mental model of a system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And all of these activities are distributed over larger parts of a code base, whereas writing correct code is essentially a very localised activity. (&lt;em&gt;Note that designing the architecture for an application or system can be much more difficult, but only needs to be done once, and is therefore not as big a part of the programmers life as understanding is&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;And understanding isn’t always easy…&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;
static int calculate(int n)
{
    int a = 0, b = 1;
    int x = 0, y = 1;
    while (n != 0)
    {
        if ((n &amp;#038; 1) == 0)
        {
            int temp = a;
            a = a * a + b * b;
            b = temp * b * 2 + b * b;
            n = n / 2;
        }
        else
        {
            int temp = x;
            x = a * x + b * y;
            y = b * temp + a * y + b * y;
            n--;
        }
    }
    return x;
}
&lt;/pre&gt;
&lt;p&gt;In fact, this fragment goes out of its way to give as few clues about what it does as possible, and yet it implements a very simple and well-known calculation.&lt;/p&gt;
&lt;h3&gt;Two Viewpoints&lt;/h3&gt;
&lt;p&gt;Every language makes trade-offs in its syntax between being terse and being understandable. Perl&lt;sup&gt;[&lt;a href="#understanding-code-n-1" class="footnoted" id="to-understanding-code-n-1"&gt;1&lt;/a&gt;]&lt;/sup&gt; is a famously terse language, where randomly mashing the keyboard is almost guaranteed to result in a valid program, whereas Java is well known to be verbose but relatively easy to understand.&lt;/p&gt;
&lt;p&gt;Terse syntax has many obvious benefits. The terser the syntax, the more compact the code, the more source will fit on a single screen. And the more source fits on a screen the broader the overview you can get at a single glance over a fragment of code.&lt;/p&gt;
&lt;p&gt;This is the rationale of many modern languages like Boo and Python and Ruby for example.&lt;/p&gt;
&lt;p&gt;It seems to me though that the danger of making languages terse is that it optimises for ease of local understanding over easy of remote understanding. No matter how brief the source of a method is, if the method signature doesn’t give (m)any clues about the encapsulated functionality then using the method from another location in the source becomes needlessly difficult.&lt;/p&gt;
&lt;h3&gt;Clues&lt;/h3&gt;
&lt;p&gt;Naming is the first line of defense against incomprehensible code, and the only one that is guaranteed to exist in all languages (as far as I am aware). Classes get names, methods get names, often parameters get names. If these names are chosen well, both local and the global understanding are improved. This is why naming is such a big deal, and everyone intuitively understands this.&lt;/p&gt;
&lt;p&gt;But often, names alone do not make the full constraints on parameters clear. This is where strongly typed languages have a further benefit. And even more so if there is at least optional explicit typing. Every parameter and return value that has a type implicitly tells something further about the meaning about the method (&lt;em&gt;we’re operating on a collection, it holds strings, the result is a number, etc&lt;/em&gt;). I concede that small applications may be able to get away with pervasive dynamic typing, but larger systems often compensate by adding unit tests whose implicit purpose is to make sure methods operate on the right type of arguments and return the right type of results. But really, moving the typing information out of the method signature and into tests is in my opinion not progress.&lt;/p&gt;
&lt;p&gt;Beyond this there are many more mechanisms that variously are employed to make code more understandable (&lt;em&gt;documentation comments, code contracts&lt;sup&gt;[&lt;a href="#understanding-code-n-2" class="footnoted" id="to-understanding-code-n-2"&gt;2&lt;/a&gt;]&lt;/sup&gt;, unit tests, word documentation&lt;/em&gt;), but as you stray further and further away from the actual source code and method signatures itself, the connection between the code and it’s constraint becomes ever more tenuous. Often this requires intervention from the IDE and third party tools and build checks, which move ever further away from the point where a developer is trying to understand the code in front of them.&lt;/p&gt;
&lt;h3&gt;Remedies&lt;/h3&gt;
&lt;p&gt;I don’t really have a one-size-fits-all answer or a ready-made recipe to make code better, but here are a few suggestions.&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;Use good names – don’t just look at this from the local perspective; what would a method invocation look like? Is the invocation self-documenting? For methods with multiple parameters, try and use the parameter names at the invocation site if your language will allow you to. Consider using names to compensate for the lack of other mechanisms; if your language of choice has no explicit typing, maybe calling an argument “&lt;code&gt;stringsToEliminate&lt;/code&gt;” is a good idea? Maybe calling an argument “&lt;code&gt;positiveInteger&lt;/code&gt;” is a good idea? But don’t make anything more specific than it needs to be.&lt;/li&gt;
&lt;li&gt;Use good types – even when typing parameters, pick the broadest type that will work. In .NET the compiler will keep telling you to use collection interfaces rather than explicit collection types. And sometimes creating a new type just so you can make one or more signatures more explicit may be a good trade-off; if a method only should take a value generated from a specific collection of other methods, then making the type “&lt;code&gt;double&lt;/code&gt;” is probably not as good an idea as using a custom “&lt;code&gt;Temperature&lt;/code&gt;“.&lt;/li&gt;
&lt;li&gt;Use good tools – if you use any other mechanisms outside the language per-se, such as code contracts or source documentation, then you must have supporting tools as well. Source documentation is useless unless you have an IDE or tool that can “&lt;em&gt;transport&lt;/em&gt;” this documentation from the method it is on to the place where it is invoked. Once you’re forced to go to the source of the implementation, odds are that a terse method implementation could more concisely explain what is going on already.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But first and foremost, pick a language that is suited to the problem at hand. Python is not a bad language, but I’m not sure it’s a good language for systems programming; it probably is better suited to web systems that often have many small self-contained features. Brevity is not a bad thing, as long as it doesn’t force you to work around an inability to use good names, or good types, or good tools.&lt;/p&gt;
&lt;h3&gt;Back to the Example&lt;/h3&gt;
&lt;p&gt;So, what of the example at the start of my post? It would have been much less opaque had the signature been along the following lines…&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;
/// &amp;lt;summary&amp;gt;
/// Calculate the n-th Fibonacci number using an
/// O(log N) algorithm.
/// &amp;lt;/summary&amp;gt;
static int Fibonacci(int n)
{
    Contract.Requires(n "Result will overflow int");
    ...
}
&lt;/pre&gt;
&lt;p&gt;Making the implementation itself easy to understand requires a few pages of explanation, and I’ll leave that as an exercise to the reader.&lt;/p&gt;
&lt;hr /&gt;
&lt;ol class="footnotes"&gt;
&lt;li class="footnote" id="understanding-code-n-1"&gt;&lt;strong&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/strong&gt; Apparently, Perl users are unable to write programs more accurately than those using a language designed by chance – source: &lt;a class="link" href="http://lambda-the-ultimate.org/node/4391"&gt;Lambda-the-Ultimate&lt;/a&gt; &lt;a class="note-return" href="#to-understanding-code-n-1"&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li class="footnote" id="understanding-code-n-2"&gt;&lt;strong&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/strong&gt; As of .NET 4, there’s a very useful &lt;a class="link" href="http://msdn.microsoft.com/en-us/devlabs/dd491992"&gt;Code Contracts&lt;/a&gt; mechanism available to C# developers; there are even plug-ins for the VS2010 IDE that can make these contracts visible as an implied part of the pop-up method documentation &lt;a class="note-return" href="#to-understanding-code-n-2"&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=Xzvu8Nkkppc:bVqzg3NaEJw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=Xzvu8Nkkppc:bVqzg3NaEJw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=Xzvu8Nkkppc:bVqzg3NaEJw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/Xzvu8Nkkppc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/tech/software/sw-science/understanding-code#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/tech/software/sw-science/understanding-code/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/tech/software/sw-science/understanding-code</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Book — The Time Traveler’s Wife]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/zX5s8r3dTms/book-the-time-travelers-wife" />
		<id>http://jerryjvl.com/?p=405</id>
		<updated>2012-04-06T04:14:15Z</updated>
		<published>2011-10-30T13:35:25Z</published>
		<category scheme="http://jerryjvl.com" term="Books" /><category scheme="http://jerryjvl.com" term="Hollywood" /><category scheme="http://jerryjvl.com" term="opinion" />		<summary type="html"><![CDATA[After both reading the book and watching the movie, Hollywood has once again proven itself incapable of doing book adaptations properly.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/entertainment/media/media-books/book-the-time-travelers-wife">&lt;p&gt;I spent most of today stuck in &lt;a href="http://www.amazon.com/Time-Travelers-Wife-Audrey-Niffenegger/dp/015602943X/ref=sr_1_1?s=books&amp;#038;ie=UTF8&amp;#038;qid=1319979858&amp;#038;sr=1-1" title="The Time Traveler's Wife" target="_blank"&gt;“&lt;em&gt;The Time Traveler’s Wide&lt;/em&gt;” by &lt;em&gt;Audrey Niffenegger&lt;/em&gt;&lt;/a&gt;, and as I’m writing this I’m watching the movie based on the book. But first, the book.&lt;/p&gt;
&lt;p&gt;The story was a surprisingly quick and easy read; at 540-or-so pages it didn’t take very long to read at all. Considering the amount of time travel involved it could easily have been incomprehensible, but the skill poured into this book is such that the story is easy to follow despite it’s complexities.&lt;/p&gt;
&lt;p&gt;It’s inherently a very romantic story. And a very sad story. The foreshadowing does a good job of avoiding surprise in the reader, and leaves just the tension of the inevitable conclusions. I think that more than anything dragged me all the way through without stopping.&lt;/p&gt;
&lt;p&gt;A note of critique is important here though; the book takes great efforts to try and give a rationale for the &lt;em&gt;temporal displacement&lt;/em&gt; of the central character. And the continuous explanations to the people around him of his condition. It all feels contrived though, because this is very fundamentally &lt;em&gt;not&lt;/em&gt; a science fiction story, and it would be much better for having lacked most of those elements.&lt;/p&gt;
&lt;p&gt;Nevertheless, I would wholeheartedly recommend the book to anyone. Even those that may have seen the movie. Rather, &lt;strong&gt;especially&lt;/strong&gt; those that have.&lt;/p&gt;
&lt;p&gt;I’m sure the movie works in its own right, but watching it right after the book it’s painfully obvious how badly adapted it is. Everything feels rushed and mashed together. A lot of the natural setup in the carefully ordered scenes of the book is just missing. The central romance is not very well explained because they just dumped a whole lot of the scenes; why &lt;em&gt;Clare&lt;/em&gt; cares &lt;strong&gt;at all&lt;/strong&gt; about &lt;em&gt;Henry&lt;/em&gt; is almost completely missing. How his travel shaped her growing up.&lt;/p&gt;
&lt;p&gt;It feels like they have tried to make the movie more interesting by trying to increase the pace. Perhaps in the mistaken belief that the book is about time travel. And it does it so much injustice. If ever there was a book that could handily be a three hour movie and be better for it…&lt;/p&gt;
&lt;p&gt;At best I would consider the movie a very badly warped cheat-sheet overview of the actual story. The plot points are all there, but the character motivation just simply isn’t.&lt;/p&gt;
&lt;p&gt;Verdict: &lt;em&gt;just read the book already&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Addendum; the movie just ended, and it looks like they converted all the suspense into surprise instead, and in my opinion the story is poorer for it. There is just no emotional pull at all. The longing of the first part of the book was completely missing. The happiness and contentment of the middle was weakly portrayed. And the sadness of the inevitability of the ending lacked punch because the first part was missing. A very flawed adaptation of a very good first novel.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;The Time Traveler’s Wife – &lt;em&gt;$17.16&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.amazon.com/Time-Travelers-Wife-Audrey-Niffenegger/dp/0547119798%3FSubscriptionId%3DAKIAJGX72HVBTZZBJBKA%26tag%3Dje084-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0547119798"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51salzzLXAL._SL160_.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=zX5s8r3dTms:V_4adUWeNiA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=zX5s8r3dTms:V_4adUWeNiA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=zX5s8r3dTms:V_4adUWeNiA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/zX5s8r3dTms" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/entertainment/media/media-books/book-the-time-travelers-wife#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/entertainment/media/media-books/book-the-time-travelers-wife/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/entertainment/media/media-books/book-the-time-travelers-wife</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[On Python]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/0Y-YNaoiUWA/on-python" />
		<id>http://jerryjvl.com/?p=399</id>
		<updated>2012-04-05T11:52:58Z</updated>
		<published>2011-10-23T06:52:49Z</published>
		<category scheme="http://jerryjvl.com" term="Programming" /><category scheme="http://jerryjvl.com" term="language" /><category scheme="http://jerryjvl.com" term="opinion" /><category scheme="http://jerryjvl.com" term="Python" />		<summary type="html"><![CDATA[After spending a few days with Python I'm already seeing a number of reasons it's not going to be my favourite language. Call me a purist, but static typing exists for a reason...]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/tech/software/sw-programming/on-python">&lt;p&gt;I’ve spent some time to familiarise myself with Python, and on the whole it’s a pleasantly terse language. Although the Python website does not explicitly say so, it seems to me that its terse syntax is meant to directly appeal to the idea that less code is better code.&lt;/p&gt;
&lt;p&gt;And on the whole I wholeheartedly agree with that sentiment. But sometimes less code is just less code; less safety, less implicit documentation, less business-readiness (to just make up a word).&lt;/p&gt;
&lt;p&gt;Let’s have a look at a fragment from a Sudoku solver (full article here: http://norvig.com/sudoku.html)&lt;/p&gt;
&lt;pre class="brush:py"&gt;
def search(values):
    "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all(len(values[s]) == 1 for s in squares):
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    n,s = min((len(values[s]), s) for s in squares if len(values[s]) &amp;gt; 1)
    return some(search(assign(values.copy(), s, d))
		for d in values[s])
&lt;/pre&gt;
&lt;p&gt;Before I rant, note that understanding this code in the context of the article isn’t too difficult. There isn’t a lot of code in the complete program, and it’s quite possible to hold all of the constraints and implicit type information in mind while reading through.&lt;/p&gt;
&lt;p&gt;And yet, looking at just this fragment it’s needlessly difficult to figure out the semantics of the “values” argument, or the return value. I definitely wouldn’t be able to figure it out just from the method signature even with the documentation comment.&lt;/p&gt;
&lt;p&gt;When I looked at some larger established samples of Python code it was striking how many large code bases compensate for this lack by having code comments that frequently approach the size of the functional code itself. The biggest problem with this kind of “contract” is that the comments are not validated by any part of the compiler, and as we all know, comments over time will invariably end up lying and contradicting the implementation.&lt;/p&gt;
&lt;p&gt;More over, a lot of this deficiency seems to be compensated for with unit tests. I love unit tests. But why should I use unit tests to make sure method implementations continue to return values of the right types? Using unit tests to validate the contract of a method in my mind should be a remedy of last resort, not the first and only remedy.&lt;/p&gt;
&lt;p&gt;On the upside though, yes, Python code can be wonderfully terse, and it is possible to keep a clear overview over much more functionality simply because methods are shorter and more of them fit onto the screen together.&lt;/p&gt;
&lt;p&gt;I will definitely keep playing with Python, because there are a number of products use it as their scripting language. And I think it’ll be an excellent language to throw together once-off data processing tools.&lt;/p&gt;
&lt;p&gt;But for anything larger than a few listings (and god forbid, involving developers at multiple skill levels and various familiarity with the existing code-base), I really need to stick with a language that does a bit more to help find flaws before run-time.&lt;/p&gt;
&lt;p&gt;Alas, so much power, but just not enough safety. On to the next language.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=0Y-YNaoiUWA:nsLosDRMoBo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=0Y-YNaoiUWA:nsLosDRMoBo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=0Y-YNaoiUWA:nsLosDRMoBo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/0Y-YNaoiUWA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/tech/software/sw-programming/on-python#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/tech/software/sw-programming/on-python/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/tech/software/sw-programming/on-python</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[Languages]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/70Oa6XRBlAI/languages" />
		<id>http://jerryjvl.com/?p=395</id>
		<updated>2012-04-05T11:53:36Z</updated>
		<published>2011-09-15T12:23:32Z</published>
		<category scheme="http://jerryjvl.com" term="Programming" /><category scheme="http://jerryjvl.com" term="Boo" /><category scheme="http://jerryjvl.com" term="Clojure" /><category scheme="http://jerryjvl.com" term="D" /><category scheme="http://jerryjvl.com" term="F#" /><category scheme="http://jerryjvl.com" term="Go" /><category scheme="http://jerryjvl.com" term="Haskell" /><category scheme="http://jerryjvl.com" term="idea" /><category scheme="http://jerryjvl.com" term="Javascript" /><category scheme="http://jerryjvl.com" term="Python" /><category scheme="http://jerryjvl.com" term="Ruby" /><category scheme="http://jerryjvl.com" term="Scala" />		<summary type="html"><![CDATA[I have decided; I've been sitting comfortably on my preferred language (C#) for long enough now, whilst only casually observing interesting tidbits of other languages. It's really about time that I crawl out of that box and try some other languages wholesale.]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/tech/software/sw-programming/languages">&lt;p&gt;I have decided; I’ve been sitting comfortably on my preferred language (C#) for long enough now, whilst only casually observing interesting tidbits of other languages. It’s really about time that I crawl out of that box and try some other languages wholesale.&lt;/p&gt;
&lt;p&gt;Currently I’m well on my way diving into Python, and now I’ve got a taste for more.&lt;/p&gt;
&lt;p&gt;So, following, my short-list of languages that seem worth investigating in more depth:&lt;/p&gt;
&lt;ul class="square"&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/F_Sharp_(programming_language)" title="F#" class="link"&gt;F#&lt;/a&gt; (because it will complement C#)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Boo_(programming_language)" title="Boo" class="link"&gt;Boo&lt;/a&gt; (because it has powerful meta-programming)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_(programming_language)" title="Python" class="link"&gt;Python&lt;/a&gt; (because the web likes it, and it’s very terse)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)" title="Ruby" class="link"&gt;Ruby&lt;/a&gt; (because it’s the other flavour-du-jour)&lt;/li&gt;
&lt;li&gt;Some variant of &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)" title="Lisp" class="link"&gt;Lisp&lt;/a&gt; (because I love braces)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Go_(programming_language)" title="Go" class="link"&gt;Go&lt;/a&gt; (because AppEngine loves it)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/D_(programming_language)" title="D" class="link"&gt;D&lt;/a&gt; (because I’m curious if C can be salvaged)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript" title="Javascript" class="link"&gt;Javascript&lt;/a&gt; (because we live in a Web world)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scala_(programming_language)" title="Scala" class="link"&gt;Scala&lt;/a&gt; (because Java is verbose, but the JVM is getting more interesting)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Haskell_(programming_language)" title="Haskell" class="link"&gt;Haskell&lt;/a&gt; (because it is the key to the future)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I reckon that will keep me busy for a while. I am curious if it’ll impact on the substance of my thoughts about exceptions and dependency injection.&lt;/p&gt;
&lt;p&gt;Python for now. I might blog some thoughts as I go along. Right now my mind is a little overwhelmed by the details; the broad brush strokes are fairly familiar and pedestrian.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=70Oa6XRBlAI:cL826IhjTT0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=70Oa6XRBlAI:cL826IhjTT0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=70Oa6XRBlAI:cL826IhjTT0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/70Oa6XRBlAI" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/tech/software/sw-programming/languages#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/tech/software/sw-programming/languages/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/tech/software/sw-programming/languages</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jerryjvl</name>
						<uri>http://jerryjvl.com</uri>
					</author>
		<title type="html"><![CDATA[On Code Libraries]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JerryJvL/~3/kG_XTI3qVC8/on-code-libraries" />
		<id>http://jerryjvl.com/?p=388</id>
		<updated>2012-04-06T07:17:44Z</updated>
		<published>2011-09-09T02:03:28Z</published>
		<category scheme="http://jerryjvl.com" term="Programming" /><category scheme="http://jerryjvl.com" term="dependency injection" /><category scheme="http://jerryjvl.com" term="large systems" /><category scheme="http://jerryjvl.com" term="libraries" />		<summary type="html"><![CDATA[Libraries of common code have a bad habit of growing wild. I currently maintain one such library, and at just under 25k lines of code it is getting a little unwieldy and every change risks unintended consequences. All the time the library seems to be gobbling up more and more additional code adding complexity and [...]]]></summary>
		<content type="html" xml:base="http://jerryjvl.com/tech/software/sw-programming/on-code-libraries">&lt;p&gt;Libraries of common code have a bad habit of growing wild. I currently maintain one such library, and at just under 25k lines of code it is getting a little unwieldy and every change risks unintended consequences.&lt;/p&gt;
&lt;p&gt;All the time the library seems to be gobbling up more and more additional code adding complexity and further headaches.&lt;/p&gt;
&lt;h3&gt;The Problem&lt;/h3&gt;
&lt;p&gt;In an ideal world the current version of the library would only contain code that is actually used by more than one application. The central purpose of a code library is to avoid duplicated effort.&lt;/p&gt;
&lt;p&gt;In reality what has happened is that any variation on any theme that already exists in the library gets sucked into the library as well, regardless of whether there will ever be a second use for said variation.&lt;/p&gt;
&lt;p&gt;The problem lies in the structure of the library. It wasn’t written to be modular in the Dependency-Injection sense.&lt;/p&gt;
&lt;p&gt;Let’s say the library contains a carefully crafted component to deal with file IO, from monitoring an input directory, to file locking, to archiving and clean-up. Then an application comes around and it needs &lt;em&gt;exactly&lt;/em&gt; that functionality… &lt;em&gt;exactly&lt;/em&gt;… except, the scanning algorithm is all wrong; the files need to be returned sorted on &lt;em&gt;that name between those underscores at the end there, see&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Now there are two possible approaches.&lt;/p&gt;
&lt;p&gt;Either the application copies all the code of the component and adjusts the scanning algorithm in its local copy. Yes, I can hear you cringing at the mere thought of branching the code in this way. Then there are two versions to maintain.&lt;/p&gt;
&lt;p&gt;The other solution is not much better though, because that involves implementing a feature in the library that only makes sense in the context of that single application. An extra set of branches at every extension point, and keeping fingers crossed that nothing was overlooked and no bad interactions with pre-existing code were introduced.&lt;/p&gt;
&lt;h3&gt;The Solution&lt;/h3&gt;
&lt;p&gt;I already gave it away above really. Writing the library with a foundation in Dependency Injection will give applications the ability to use a whole component whilst replacing just a single part of it with its own implementation.&lt;/p&gt;
&lt;p&gt;Discussions on why Dependency Injection is a good idea tend to focus on test-ability, or auto-wiring of the dependencies, or component lifetime management.&lt;/p&gt;
&lt;p&gt;In reality, the killer feature is the ability to allow a code library to define the common-scenario assembly of code parts into reusable components, &lt;strong&gt;whilst allowing individual applications to replace any one or more constituent code parts with its own as needed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With DI in-place it becomes possible to enforce a strict rule that unless a code variation or component or code part is actively used by more than a single application it will not be let into the library. When the first application uses some code it will be private to the application. Only when a second use actually eventuates does it get considered for lifting into the library.&lt;/p&gt;
&lt;p&gt;I plan to make that the new hard-and-fast rule as DI gets introduced into the code base of the library.&lt;/p&gt;
&lt;p&gt;I’ll do a more in-depth post about DI and my opinions on its correct use sometime soon.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=kG_XTI3qVC8:DeD24vP5qpA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?i=kG_XTI3qVC8:DeD24vP5qpA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JerryJvL?a=kG_XTI3qVC8:DeD24vP5qpA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JerryJvL?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JerryJvL/~4/kG_XTI3qVC8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://jerryjvl.com/tech/software/sw-programming/on-code-libraries#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://jerryjvl.com/tech/software/sw-programming/on-code-libraries/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://jerryjvl.com/tech/software/sw-programming/on-code-libraries</feedburner:origLink></entry>
	</feed>

