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

<channel>
	<title>Refractalize!</title>
	<atom:link href="http://refractalize.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://refractalize.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Sat, 26 Sep 2009 08:58:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='refractalize.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Refractalize!</title>
		<link>http://refractalize.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://refractalize.wordpress.com/osd.xml" title="Refractalize!" />
	<atom:link rel='hub' href='http://refractalize.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Risks and Dependencies</title>
		<link>http://refractalize.wordpress.com/2009/09/26/risks-and-dependencies/</link>
		<comments>http://refractalize.wordpress.com/2009/09/26/risks-and-dependencies/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 08:58:55 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/?p=132</guid>
		<description><![CDATA[Manage your risks and dependencies. Why? Because doing so can mean the difference between a successful project and a failing (or a really stressful) one. Isn&#8217;t this something my project manager should be doing? Well, yes and no. Yes because they should know, and they&#8217;ll be able to communicate risks to your stake holders and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=132&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Manage your risks and dependencies.</p>
<p>Why?</p>
<p>Because doing so can mean the difference between a successful project and a failing (or a really stressful) one.</p>
<p>Isn&#8217;t this something my project manager should be doing?</p>
<p>Well, yes and no. Yes because they should know, and they&#8217;ll be able to communicate risks to your stake holders and potential impacts to other teams and all that stuff. I say no because risks and dependencies tend to be intrinsic to the application domain and the technical nature of the project. It&#8217;ll depend how technical or how much of a domain expert your PM is of course, but generally a business analyst, architect, tester or developer will have a much better appreciation for these risks because they&#8217;re often way more involved in the messy details.</p>
<p>So what are risks and dependencies?</p>
<p>Risks have a well known definition, they&#8217;re usually broken down into having a likelihood and an impact. A dependency is anyone or anything you depend on in the project. Dependencies <em>are</em> risks. The reason I&#8217;m keen to say &#8220;risks and dependencies&#8221;, probably, is that dependencies are often the most common form of risk but are rarely seen as such. At any rate, your mission is to avoid them both. Some projects will have a &#8220;risks register&#8221;, this is a good idea and reviewing it and keeping those risks in mind throughout the project is essential. But it&#8217;s not enough to just &#8220;register&#8221; risks, you need to mitigate them too, otherwise your risk register is only as good as &#8220;I told you so&#8221; when one occurs.</p>
<p>An example. We have a digital video ordering system that runs internally to our organisation, and we send these orders to other organisations. Orders can and do take several hours or days to be completed, and we need to know exactly when they&#8217;re completed or if they can&#8217;t be completed. Initial thoughts were that those other organisations would let our system know by making web service calls on our system to the effect of &#8220;order X completed&#8221;, or &#8220;order Y failed, because &#8230;&#8221;. This would mean that we would need to punch holes in the firewall to allow these inbound web service calls in, and all the security around who to let in and who not to, etc. The network guys are already shaking their heads, they&#8217;ve done it before but you just know it&#8217;s going to take ages (and cost a lot.) But as it stands, our project can&#8217;t go ahead without it.</p>
<p>This is a major dependency and all the head shaking turns it into a proper risk too. We can write the software fine, we know how to do that, but there&#8217;s a big possibility it&#8217;s just going to be sitting in source control somewhere waiting to go live because the network has been put in place yet. That stuff is depressing, and it quickly turns ugly as product owners are getting shirty, network guys are still waiting on firewall routers to be delivered and the dev team&#8217;s moved on to something else.</p>
<p>Ok, it&#8217;s a major risk, what can we do about it? Well, lets redesign our ordering system to periodically call theirs for any recently completed or failed orders. This means we only have outbound connections and the network guys are happy. Even better, we can go live as soon as we&#8217;ve finished without waiting for other teams to finish. (As a bonus, we&#8217;re able to debug the ordering system from our laptops too because it doesn&#8217;t matter where outbound connections are coming from.) If we really want inbound calls too, for whatever reason, we can do it later. Better to have something released and working than to have it perfect the first time.</p>
<p>This was just one example of many. When you look around there are simply loads of risks and dependencies, big and small, and mitigating or eliminating them will make for early stress-free releases. Just another thing to keep you Agile!</p>
<p><a href="http://www.amazon.com/Waltzing-Bears-Managing-Software-Projects/dp/0932633609">Waltzing with Bears</a>, by Tom DeMarco and Timothy Lister is some excellent reading on the topic.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/132/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=132&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/26/risks-and-dependencies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Scoping Anti-Patterns &#8211; The Framework</title>
		<link>http://refractalize.wordpress.com/2009/09/21/scoping-anti-patterns-framewor/</link>
		<comments>http://refractalize.wordpress.com/2009/09/21/scoping-anti-patterns-framewor/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 07:58:56 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/?p=127</guid>
		<description><![CDATA[Another Anti-Pattern in the &#8220;scope will kill you&#8221; saga, this time: The Framework Us geeky lot are into mathematical sensibilities, we often talk of &#8220;beautiful architectures&#8221; and &#8220;dashingly simple algorithms&#8221;, &#8220;breathtaking abstractions&#8221;. Lovely stuff &#8211; mostly what keeps us in the field is what I&#8217;d say. We like to generalise, to use simple but powerful [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=127&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Another Anti-Pattern in the &#8220;scope will kill you&#8221; saga, this time:</p>
<h2>The Framework</h2>
<p>Us geeky lot are into mathematical sensibilities, we often talk of &#8220;beautiful architectures&#8221; and &#8220;dashingly simple algorithms&#8221;, &#8220;breathtaking abstractions&#8221;. Lovely stuff &#8211; mostly what keeps us in the field is what I&#8217;d say. We like to generalise, to use simple but powerful concepts to make our lives easier, we love using frameworks that with only a few tweaks can let us change the world. Power, flexibility, generality, expressiveness. One solution for all. We&#8217;re suckers for beautiful concepts that simplify the otherwise chaotic real world.</p>
<p>And when we get started on a new project, our minds are constantly breaking business rules down, looking for patterns and languages and the concepts that could glue the whole thing together. And if you get it right, you can vastly simplify a complicated project, and when you do, you&#8217;re beholden to something truly beautiful. You&#8217;ll stay awake all night just thinking about it.</p>
<p>This brings me to my second real-life story of just such a framework. Before we get started I have to say that I wasn&#8217;t directly involved in this one, not to say that it&#8217;s particularly embarrassing, but I happened to observe it from across the room.</p>
<p>The big idea in this framework was a messaging and communication system for disparate and offline agents. Agents could send other agents messages whether they were online or not, and the next time the agent logged in, it could download the latest messages for it to process. Think email, but make it more reliable and put it in the control of automated applications instead of people. It was an interesting idea, not entirely revolutionary by any means but still interesting. And we had a need for it, we had several applications that required on- and off-line usability from various mobile platforms (&#8220;mobile&#8221; as in laptops, tablet PCs, PDAs, etc). But desperate need or not, the project had been going for 1.5 years by the time I&#8217;d heard of it and it still had a huge backlog of work to be done before it could be released. In the mean time, all our desperate applications had put together rudimentary communication systems to solve their own particular offline problems. Thoughts on this were of two general themes, first, that because our various application stacks had already solved the problem we didn&#8217;t especially need a single unifying framework for all, and second, that all these applications solved pretty much the same problems completely differently was precisely why we needed a single unifying framework. Both arguments were correct in their own way, and the project investment backed both at the same time.</p>
<p>Where this project went seriously wrong was not in concept, it was a fine concept, it was just that it never actually released anything. By the time I got involved in it, probably 2.5 years in, it was because I was designing one of those offline mobile applications myself. The scope of the framework changed immediately. Talk was of redesigning the framework to include support for my particular application&#8217;s needs, and to roll it out with all sorts of amazing features. Bumbling around adding new scope, they&#8217;d effectively extended the project by another 18 months. Meanwhile I was busy looking into quick alternatives, the last thing I wanted was for my own project to be extended by 18 months too.</p>
<p>The problem with<em> </em>the <em>framework</em>, as a way of delivering software, is that they&#8217;ll trick you into thinking that you have to finish it before you can start writing any real applications with it. It&#8217;s like saying, &#8220;To build this application, we&#8217;re going to write a framework that will allow us to write the application really quickly.&#8221; A perplexed product owner might ask, &#8220;And how long is it going to write this, um&#8230; framework?&#8221;</p>
<p>Lets say you had a 6 month project with two features, A and B. Features A and B share a lot of common functionality so you decide to put that functionality into a single unified framework. Not a bad idea by any means. But your project now looks a bit like this: you work on the framework for 4 months, then a month for feature A, that&#8217;s 5 months, and now you can release. This is the earliest release you can make. Then another month and you can release feature B, 6 months. It would be much better to split the time spent on features A and B evenly: feature A takes you 3 months, then feature B takes you the next 3. In the first 3 months, you&#8217;re building just enough framework to get feature A, then the next 3 months extend and refactor the framework just enough to get you feature B. The point is, features A and B drive out the framework and not the other way round, that way you don&#8217;t waste your time building too much framework. Also, and this can be very likely, after the first 3 months your company gets a new business opportunity and would prefer feature C instead of feature B. But that&#8217;s ok because you&#8217;ve not spent any time working on feature B yet, nothing&#8217;s wasted.</p>
<p>In the end, both projects (mine and the framework) were cancelled. The company lost a huge source of revenue (unrelated to either project) and was tanking pretty hard, so push came to shove and anything not making direct revenue was dropped. If only we&#8217;d released sooner, either of our projects, we might just have made the cut.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=127&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/21/scoping-anti-patterns-framewor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Scoping Anti-Patterns &#8211; The Rewrite</title>
		<link>http://refractalize.wordpress.com/2009/09/19/scoping-anti-patterns-the-rewrite/</link>
		<comments>http://refractalize.wordpress.com/2009/09/19/scoping-anti-patterns-the-rewrite/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 15:39:04 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/?p=124</guid>
		<description><![CDATA[The scope of a software project can be a very predictive indicator of success. I have scant evidence for this statement, I&#8217;m only a beginner, but nevertheless, it sounds like a &#8220;true fact&#8221;. As opposed to a normal &#8220;fact&#8221;. But I&#8217;ll plough on, I&#8217;m pretty certain that scope can make or break projects, and I&#8217;ve [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=124&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The scope of a software project can be a very predictive indicator of success.</p>
<p>I have scant evidence for this statement, I&#8217;m only a beginner, but nevertheless, it sounds like a &#8220;true fact&#8221;. As opposed to a normal &#8220;fact&#8221;. But I&#8217;ll plough on, I&#8217;m pretty certain that scope can make or break projects, and I&#8217;ve got some stories to back up my dubious claim.</p>
<p>First steps though, I&#8217;m going to group these concrete examples into Anti-Patterns, as that&#8217;s now become a pattern-in-itself for describing random stuff in tech blogs and books. Ok? Here&#8217;s the first one:</p>
<h2>The Rewrite</h2>
<p>Back when I started out I would get dumped on some ugly looking project to fix bugs and add meagre functionality. It was fun for a couple of days because you knew the system you were working on was really &#8220;important&#8221; and you&#8217;re basking in all it&#8217;s glory. A few days later and you&#8217;re stuck in a pit of tar &#8211; even the smallest changes are like a butterfly to a hurricane and before you know it you&#8217;re shit-scared to do anything. The system&#8217;s well f£$ked, to put it bluntly. Your daily/hourly/minutely thoughts are &#8220;what on Earth?&#8221; and &#8220;Oh my God!&#8221; and the now canonical &#8220;WTF?&#8221;. If only you were given a chance to do it all over, you&#8217;ve got plenty of good ideas and you just can&#8217;t wait to be cutting clean code again. You suggest a rewrite: &#8220;based on my professional experience, which is (by now) extensive, this project is in the toilet and we&#8217;ve got to start over.&#8221;</p>
<p>If only I could eat those words now. All of them; there must have been dozens of times I&#8217;ve said that&#8230;</p>
<p>I&#8217;m sure you&#8217;ve all been on such projects and screamed out for rewrites, but in this story we rewrote for different reasons.</p>
<p>This project was a lovely little C++ desktop application. It had a few bugs in it (which is what I was there to fix) but it largely worked. The main problem was the C++: nobody in our C#/.Net shop knew what the hell was going on and new feature requests from users were just being avoided. Then finally good news came down from on top, we&#8217;re getting to rewrite it! This time we&#8217;re going to use the latest and greatest new tech we&#8217;d all been experimenting with in our spare time and the project was swarmed with enthusiastic hard hitters. I was in there early, writing a lovely little pull-based workflow engine, accompanied by an IronPython based DSL. Months went by and enthusiasm wained, deadlines went by and project managers were getting stuff thrown at them. Still more months went by and even the slightest reasons were given for not deploying it. Even though it was technically finished, the users couldn&#8217;t just upgrade from their C++ desktop app to a ASP.Net app over night.</p>
<p>It was deployed eventually and it now serves its purpose well, but the dev team did near on nothing else for 9 months! And you can imagine, all the way up to that deployment date the value we&#8217;d delivered was <span style="text-decoration:underline;">none</span>. Zilcho. Had the project been pulled, or someone decided it wasn&#8217;t fit for purpose we&#8217;d have wasted some big investments. Further, we had not much idea if we were building the right application, we had little to no feedback during the whole 9 months right up until we&#8217;d released it.</p>
<p>The problem with rewrites is that the <strong>scope is fixed</strong>. There&#8217;s no way you can release the rewrite until it&#8217;s entirely feature complete viz-a-viz the old version. Not only that, but you have to consider data migration, user migration and dependent system migration &#8211; all things we gave very little thought to in those heady early days, discussing beautiful Ajaxian pages and cute domain-object validation. Instead we should have concentrated on getting a release out in only weeks, we should have asked questions like, &#8220;how can we add features to a C++ app with ASP.Net?&#8221;. And answered with things like &#8220;Host parts of the C++ in ActiveX in the browser.&#8221; Or, &#8220;host a browser in the C++ app for new functionality.&#8221; Neither sound sexy, but we could have delivered new features every 2 weeks and got valuable feedback from actual users and given them real control over what to release next.</p>
<p>This is a very common scenario and I&#8217;ve heard much worse. What&#8217;s more, in most of the cases I&#8217;ve known, the projects were all run &#8220;agile&#8221;. They ran in sprints, had standups, had reasonably good communications with product owners, and even had Kanban boards! One project in particular was well over budget and especially frantic in the end, all due to fixed scope and an inability to release early and often.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/124/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=124&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/19/scoping-anti-patterns-the-rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Descope!</title>
		<link>http://refractalize.wordpress.com/2009/09/12/descope/</link>
		<comments>http://refractalize.wordpress.com/2009/09/12/descope/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 11:46:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/09/12/descope</guid>
		<description><![CDATA[There&#8217;s one thing that can quite simply make or break a project, and that&#8217;s scope. I&#8217;ll even suggest that scope is the most influential property of any project, and getting it right is a, hmm, how am I to say this? a Silver Bullet? Of course, there are all sorts of other project properties that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=111&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="font:12px Helvetica;margin:0;">There&#8217;s one thing that can quite simply make or break a project, and that&#8217;s scope. I&#8217;ll even suggest that scope is the most influential property of any project, and getting it right is a, hmm, how am I to say this? a Silver Bullet? <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Of course, there are all sorts of other project properties that help, including good risk management, good metrics (like a Kanban), good technology, good quality code, good practices (usually the XP ones), etc, etc. Everything helps, but if the scope&#8217;s still too large your project can tank, and all too easily.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">What you need to be able to do at the beginning of a project, or even half way through it, is descope. You need to remove features and functionality that aren&#8217;t essential. If you&#8217;re not careful though, your requirements will suggest that <i>everything</i> is essential. Sometimes this is true, but only sometimes, but don&#8217;t be fooled, thinking that everything is essential usually means you&#8217;re not trying hard enough.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">The goal is to break your project down into very small feature releases that are often called Minimal Marketable Features (MMFs).</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">These features should take only a few weeks to finish each, the shorter the better. When you&#8217;ve finished them you should be able to release them to a live and running environment and to real users.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">They should be useful too. This is very important because a useless feature in live won&#8217;t be used, and won&#8217;t be tested, and you won&#8217;t be getting valuable feedback. Furthermore, your users won&#8217;t be seeing the value in your work which makes it, well, useless. Think of it this way, every line of code you write is pointless until it&#8217;s live and somebody&#8217;s using it. Release it!</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Features should be independent too. This is often overlooked, but it has to do with risk management and options. If feature B is dependent on feature A then not only does B have to wait until A is finished, but it inherits all the risks of feature A too. It also reduces your options too, for example, if feature B was more valuable than feature A, you&#8217;d want to release B first right? But if it&#8217;s dependent on A, you can&#8217;t. Having independent features means you can swap features in and out as your users need them, and this is especially useful as the business requirements change around you, and they will, all the time.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">To do this you need to work closely with your users, if you can, or a good business analyst, or both. A good business analyst can be essential to this process, don&#8217;t underestimate them. You need to understand the most valuable requirements in as much detail as you can get them. Then get a rough idea of the technical solution and go through a few release scenarios.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">You ask, &#8220;ok, we&#8217;re going to release features B, C and E together first, is that useful?&#8221;</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">And the users might say, &#8220;but we really need features A and D too.&#8221;</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">And they&#8217;re bound to say that, they always want more features. So you say, &#8220;well, adding A and D is going to mean release 4 weeks later, is that ok?&#8221; They&#8217;re instantly thinking that they can&#8217;t use B, C and E for another 4 weeks, so they&#8217;ll try again, &#8220;What if you released A, B and E, and dropped C and D?&#8221; Ok, now we&#8217;re getting somewhere, but don&#8217;t stop there, ask if you can release just A, or just B, or just E.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Users want functionality so they can use it, often because it&#8217;s useful to them <i>now</i>. So by negotiating a first release by adding and removing features, and by suggesting rough release dates, the users can interactively design the most valuable and earliest release, and if you&#8217;re lucky this will only be a few weeks away.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">This approach, of identifying small features that can be swapped into and out of releases is known as providing <i>options</i>. Options give business users a real sense of control over the development process, and if you get the right stakeholders involved, it can mean the software you write today will have the most impact in the not too distant future. (<a href="http://julianeverett.wordpress.com/">Julian Everett&#8217;s</a> work on Real Options pushes the analysis further out to the business, asking that the cost of each potential release is weighed against the ROI and treating each one as an financial investment, with risk.)</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">I have to point out that this process is hard work. It&#8217;s hard to do technically and it&#8217;s hard to do from a usability point of view too. This is why having a decent business analyst will help no end, or having decent usage statistics to identify which areas of the application would be used the most. Cutting the project up into certain classes of usage, or certain classes of data, or certain classes of reliability, or scalability, or anything, can be very hard to do, and you need people who have a very good understanding of the business to do it.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">From the technology side you&#8217;ll need to think laterally to be able to release usable features with minimal effort. These will often be seen as hacks, or not strategic advances. For example, in a project where we were integrating with a 3rd party with web services, we made a release very quickly by sending them an email with a spreadsheet in it. No web services, but it worked, it was in the users&#8217; hands in a few weeks and we had released other important parts of the software. In subsequent releases we constructed the web service interaction properly and added other useful features. We do this all the time, we&#8217;re always looking for quick ways to get the job done, but at the same time walking the fine balance between frequent usable releases and good strategic software architecture.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Just because you&#8217;re writing &#8220;hacks&#8221;, doesn&#8217;t mean you do them badly. Everything is written test-first, everything is integration tested, well designed and high quality. The name of game with this style of project is <i>refactoring</i>, you&#8217;ll be refactoring everything, all the time. Always growing the software out from first feature to the last, so it&#8217;s <i>really</i> important to have high quality code.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=111&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/12/descope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Alpha blended watermarks with FFmpeg</title>
		<link>http://refractalize.wordpress.com/2009/09/12/alpha-blended-watermarks-with-ffmpeg/</link>
		<comments>http://refractalize.wordpress.com/2009/09/12/alpha-blended-watermarks-with-ffmpeg/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 10:12:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/09/12/alpha-blended-watermarks-with-ffmpeg</guid>
		<description><![CDATA[(For those unfamiliar, FFmpeg is an open source video transcoder, and with x264, one of the highest quality H.264 encoders in existence. We&#8217;re using it to transcode 5,000 hours of video into mp4 flash files with the help of a dozen or so Linux boxes.) FFmpeg provides a filtering system that allows modification of the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=110&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="font:12px Helvetica;margin:0;">(For those unfamiliar, <a href="http://ffmpeg.org/">FFmpeg</a> is an open source video transcoder, and with <a href="http://www.videolan.org/developers/x264.html">x264</a>, one of the <a href="http://www.compression.ru/video/codec_comparison/mpeg-4_avc_h264_2005_en.html">highest quality</a> H.264 encoders in existence. We&#8217;re using it to transcode 5,000 hours of video into mp4 flash files with the help of a dozen or so Linux boxes.)</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">FFmpeg provides a filtering system that allows modification of the video during transcoding, this means you can place an image over the video, variously known as overlays, DOGs (digital on-screen graphic), watermarks or bugs.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Fortunately, FFmpeg gives you some out-of-the-box watermarking and imaging filters with it&#8217;s vhook facility. Unfortunately (and weirdly) none of these offer alpha blending, so in the spirit of all open source projects, I wrote my own.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">This patch means that the watermark.so vhook now obeys the alpha channel in a PNG file. The -m option is the mode and must be 2 for alpha blending. The watermark image is scaled to fit the input video before being applied to it, so for a decent quality DOG it&#8217;s recommended that your PNG file is the same dimensions as your input video.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Usage:</div>
<div style="color:#333233;font:13px Helvetica;margin:0;">ffmpeg &#8230; -vhook &#8216;/usr/local/lib/vhook/watermark.so -m 2 path/to/image.png&#8217; &#8230;</div>
<div style="color:#333233;font:13px Helvetica;min-height:16px;margin:0;"></div>
<div style="color:#333233;font:13px Helvetica;margin:0;">(replace /usr/local/lib/vhook with wherever your watermark.so is.)</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">The patch works against the <a href="http://ffmpeg.org/releases/ffmpeg-0.5.tar.bz2">0.5 release</a> of FFmpeg, the latest public release with vhook support.</div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;">Get the <a href="http://github.com/refractalize/refractalize/blob/be869b242b4cdff9125ed634a39939ee55211598/ffmpeg/vhook/watermark.patch">patch</a>, or the whole <a href="http://github.com/refractalize/refractalize/blob/be869b242b4cdff9125ed634a39939ee55211598/ffmpeg/vhook/watermark.c">watermark.c</a> file. ./configure … &amp;&amp; make &amp;&amp; make install.</div>
<div style="font:12px Helvetica;margin:0;"></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/110/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=110&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/12/alpha-blended-watermarks-with-ffmpeg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Imperfectionism</title>
		<link>http://refractalize.wordpress.com/2009/09/05/imperfectionism/</link>
		<comments>http://refractalize.wordpress.com/2009/09/05/imperfectionism/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 09:54:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/09/05/imperfectionism</guid>
		<description><![CDATA[[A] Utopia is conceived as a perfect society, and anything perfect has automatically ceased growing; even [William] Godwin qualified his rash claims for the perfectibility of man by protesting that he did not mean men could be made perfect, but that they were capable of of indefinite improvement, an idea which, he remarked, &#8216;not only [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=109&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>[A] Utopia is conceived as a perfect society, and anything perfect has automatically ceased growing; even [William] <a href="http://en.wikipedia.org/wiki/William_Godwin">Godwin</a> qualified his rash claims for the perfectibility of man by protesting that he did not mean men could be made perfect, but that they were capable of of indefinite improvement, an idea which, he remarked, &#8216;not only does not imply the capacity for being brought to perfection, but stands in express opposition to it.&#8217;</p></blockquote>
<p>&nbsp;George Woodcock, <a href="http://books.google.com/books?id=6-ipiV20WEkC&amp;lpg=PP1&amp;ots=4gBsDJyPv_&amp;dq=george%20woodcock%20anarchism&amp;pg=PP1#v=onepage&amp;q=&amp;f=false">Anarchism</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/109/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=109&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/05/imperfectionism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Profiling</title>
		<link>http://refractalize.wordpress.com/2009/09/04/profiling/</link>
		<comments>http://refractalize.wordpress.com/2009/09/04/profiling/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 20:47:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/09/04/profiling</guid>
		<description><![CDATA[On a very recent weekend I was hacking on tycho, as I&#8217;m want to do from recent weekend to recent weekend, I came upon a disappointing realisation, that my new parser was slower&#160;than my original one. What have I been working on for the last 5 months? Quick: download a decent free profiler, build a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=108&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="font-family:'Lucida Grande';font-size:small;"><span style="font-size:11px;">On a very recent weekend I was hacking on <a href="http://tycho.googlecode.com/">tycho</a>, as I&#8217;m want to do from recent weekend to recent weekend, I came upon a disappointing realisation, that my new parser was <i>slower</i>&nbsp;than my original one. What have I been working on for the last 5 months?</span></span>
<div><span style="font-family:'Lucida Grande';font-size:small;"><span style="font-size:11px;"><br /></span></span></div>
<div><span style="font-family:'Lucida Grande';font-size:small;"><span style="font-size:11px;">Quick: download a <a href="http://www.eqatec.com/tools/profiler">decent free profiler</a>, build a performance test, identify hotspots, tune and optimise, and repeat.</span></span></div>
<div><span style="font-family:'Lucida Grande';font-size:small;"><span style="font-size:11px;"><br /></span></span></div>
<div><span style="font-family:'Lucida Grande';font-size:small;"><span style="font-size:11px;">And lo, only a handful of hours later my parser is 4-5 times faster. Bring it!</span></span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=108&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/04/profiling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>Dataflow</title>
		<link>http://refractalize.wordpress.com/2009/09/03/dataflow/</link>
		<comments>http://refractalize.wordpress.com/2009/09/03/dataflow/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 18:56:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/09/03/dataflow</guid>
		<description><![CDATA[I think I&#8217;m going to struggle to write this blog. I&#8217;ll tell you why: I&#8217;m trying to find a solution to an age old problem that is particularly prevalent in enterprise software. I mentioned this in my last post, that enterprise software can be conceptually very straightforward yet implementations can be surprisingly complex. My theory [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=107&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I think I&#8217;m going to struggle to write this blog.</p>
<p>I&#8217;ll tell you why: I&#8217;m trying to find a solution to an age old problem that is particularly prevalent in enterprise software. I mentioned this in my last post, that enterprise software can be conceptually very straightforward yet implementations can be surprisingly complex. My theory (a simple one, perhaps too simple) is that the complexity is borne out of <em>aspects</em>, which are often characterised as requirements that don&#8217;t affect the algorithmic nature of the software, but do affect how the software operates or is deployed.</p>
<p>How an algorithm operates or executes <em>could</em> be a separate concern, even though is most of the software I&#8217;ve written and seen over the years, the execution of an algorithm and the algorithm itself are inseperable. What do I mean by &#8220;operate&#8221; or &#8220;execute&#8221;? Lets take a simple example, to add two numbers to produce a third: <code>c = a + b</code>. Often this statement is executed in memory, using the <span class="caps">CPU</span> to add the two numbers together and pop the result into a local variable, usually found on the stack. Or perhaps a more abstract example, but no less simple: <code>y = f(x)</code>, a function <code>f</code> to transform <code>x</code> to be assigned to <code>y</code>. These statements are our algorithms, it so happens that they&#8217;re so simple that not many people would actually call them algorithms, nevertheless, they define the computation that is to take place. The execution of these algorithms on the other hand, may be entirely variable. It may be the case that function <code>f</code> is very expensive and time consuming and we choose to distribute it over several machines. Values representing <code>x</code> are queued up and machines executing <code>f</code> just take new <code>x</code> values when they arrive, producing a series of <code>y</code>s as output.</p>
<p>As it turns out, a project I&#8217;ve been working on is pretty much exactly <code>y = f(x)</code>. We&#8217;re transcoding 5,000 hours of flash video with a load of Linux boxes running <a href="http://ffmpeg.org/">ffmpeg</a>. (ffmpeg is freakin awesome for transcoding high quality H.264 flash files.) <span class="caps">WMV</span> files come in, transcode magic happens, MP4 files go out. Conceptually rather simple but we have stuff to deal with like, for example, copying input files to each of the machines (provisioning) and taking the output files off (harvesting.) At some point we&#8217;ll want to know which machine is running and which not, from a monitoring point of view, logging various activities, errors etc. Nothing especially complicated, but the original <code>y = f(x)</code> is quickly lost in several hundred lines of Ruby scripts, running on several different machines.</p>
<p>My goal is slightly ambitious, I&#8217;d like to write <code>y = f(x)</code> first, then make decisions about how the computation is distributed, how the queues work and over what protocols, whether the need for outputs (the <code>y</code>s) <em>pull</em> the computation, or whether the presence of inputs (<code>x</code>s) <em>push</em> it. It may be fine that <code>f</code> is executed once for each <code>x</code>, or that there can be efficiency gains in processing multiple <code>x</code>s at once, so we batch up <code>x</code>s before executing. If we can separate these concerns from the basic algorithm, surely we&#8217;re better off!</p>
<p>A possible solution can be found in the ideas that underpin dataflow languages (see <a href="http://puredata.info/">Pure Data</a>, <a href="http://www.mozart-oz.org/">Mozart/Oz</a>, <a href="http://www.erights.org/history/joule/">Joule</a> and the <a href="http://en.wikipedia.org/wiki/Dataflow_programming">Wikipedia page</a>). Dataflow languages make explicit the notion of processing streams of data. Processing nodes take inputs and produce outputs, and all you have to do is wire the outputs up to the inputs of other processing nodes, etc, etc, then just throw in loads of data as input. The common command line shell is a dataflow language, what with it&#8217;s pipes and all. One command pipes data to another, and the shell (Bash or whatever) will buffer the data produced by the first that hasn&#8217;t yet been consumed by the second.</p>
<p>The main difference between dataflow languages and normal languages is that they operate on streams of values instead of single values. The interesting for us is what happens <em>between</em> the processing nodes, or functions. The functions are typical, they would transform input values into output values. Some functions may be more efficient at processing several values at once, but for all intents and purposes, functions are functions like you know them to be. What happens to the data between the functions is where the fun begins.</p>
<p>For the sake of discussion we&#8217;ll define a process: <code>z = f(g(x))</code>. We could also represent it like this:</p>
<p>x &#8594; g() &#8594; y &#8594; f() &#8594; z</p>
<p>As I was saying before, run this statement in any regular programming language and it will use <span class="caps">CPU</span> registers and the stack to store the values represented by <code>x</code> and <code>z</code>, and also (careful not to forget) the intermediate value generated by <code>g()</code>, we&#8217;ll call <code>y</code>.</p>
<p>But we&#8217;ll have other considerations to worry us. Let&#8217;s mix it up a bit and suggest that <code>g</code> is a service that is invoked asynchronously, the input <code>x</code> is sent in a message to <code>g</code>, and the result <code>y</code> is sent back. (Pretend that <code>g</code> takes 3 hours to compute, it may make sense that it&#8217;s invoked asynchronously.) Notice that this doesn&#8217;t change the algorithm one bit, but it <em>does</em> change how it executes. <code>g</code> itself doesn&#8217;t change, but how it is invoked, how <code>x</code> values are ferried to it and <code>y</code> values are ferried back has changed compeltely. Can these concerns be added to our simple little program without having to rewrite it?</p>
<p>What if <code>f</code> is a manual process? Somebody is manually taking <code>y</code>s and producing <code>z</code>s. People tend to work only 8 hours a day but with <code>g</code> being automatic and mechanical it can run 24/7. We&#8217;re going to need to store the <code>y</code>s that <code>g</code> produces that the people involved in <code>f</code> haven&#8217;t got around to seeing yet. Ah, persistence! We&#8217;ll store in them in a database!</p>
<p><code>y</code> used to be a <span class="caps">CPU</span> register or local variable in the stack frame, now it&#8217;s a database table. Ultimately, as programmers we&#8217;d like this to be a one line change in our source code, not a rewrite.</p>
<p>There are loads of other things you may want to do with values while they&#8217;re in this limbo zone: log them, store them, send them across networks, distribute them between load balanced services. There are plenty of things you may want to do with functions too: have them run in multiple threads, or on multiple machines, monitor their progress, or simply execute them on the same thread, synchronously and as fast as possible.</p>
<p>Being a programming language geek and all, I naturally think of this in terms of, well, programming languages. Ultimately then, the goal is a programming language that allows this sort of flexibility. The programmer can write algorithms that do the work, and following that, configure them for all the other requirements. The key expressiveness of this language is scalability, it scales from the smallest simplest programs that run entirely in memory using <span class="caps">CPU</span> registers and stack space, right out to running them across hundreds of machines spread across the Internet, all with minimal source code changes. Seriously, <code>z = f(g(x))</code> might become something like:</p>
<pre>x -&gt; g() -&gt; y -&gt; f() -&gt; zwhere    x: atom-feed http://some-atom-feed.com/incoming    y: db table_name, "connection string"    z: email some-dude@poor-suckers.co.uk</pre>
<p>For this scaling to be possible we need to be able to make certain assumptions about these programs. We have to assume that a function <code>f</code> <em>can</em> be run in parallel, the easiest way to ensure this is for the function to have no side-effects, it is what functional programmers refer to as &#8220;pure&#8221;. We have to assume that the messages or values in queues between functions aren&#8217;t lost. I&#8217;m not sure if this wonderful language should enforce these sorts of things or not, or if we leave it to the programmer&#8217;s best judgement.</p>
<p>But a new programming language is a big project, and of course nobody would use it for years and bloody hell, you&#8217;d have to write the thing and who&#8217;s going to do that? Couldn&#8217;t we just use these principles when we write applications, normally, today? Sure!</p>
<p>First of all try to divide your application into three areas:</p>
<ol>
<li>Pure functions, code that takes arguments as input and produces results as output, no side-effects!</li>
<li>Queues, code that stores or loads values from some sort of data store, either in memory or in a database, on an <span class="caps">ATOM</span> feed, whatever.</li>
<li>Execution environments. This is the code that drives the algorithm, picking values off queues and executing functions. An execution environment may drive functions by pushing the inputs or pulling outputs. Execution environments have some overlap with queues, for example some queues may need to be polled periodically for new values, others simply invoke some sort of event handler when new values are ready. There may be some scheduling to do, in the case of in memory function calls (as in most programming langauages) the queues are one item memory slots, and the runtime ensures that functions are executed in the right order such that each of these memory slots has exactly one value in it.</li>
</ol>
<p>If an application has been separated into these three areas, (I&#8217;m guessing) it should be easier to swap in new configurations, and hence, new <em>aspects</em>. We should be able to reuse a durable queue implementation for all message types, to be plumbed between any two given functions. We should be able to reuse execution environments for different algorithms and different queue implementations. Hopefully this would lead us to a programming <em>style</em> or architecture or pattern that gives us flexibility to scale up or down or sideways, inserting new requirements without resulting in that dreaded hideous complexity so endemic in enterprise software.</p>
<p>What this is trying to do in effect, is make the marshalling of values and the execution of functions abstract. To look at a normal programming language, let&#8217;s say C#, or Ruby, they bind way too early on how data is transferred between functions and you have no option to change it. Data is <em>always</em> passed in memory. Functions are <em>always</em> called synchronously. Any time you want anything different and you basically have to program it yourself. But we <em>do</em> need flexibility for these concerns for enterprise software to be any easier.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=107&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/09/03/dataflow/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>It&#8217;s a trick! Or, why enterprise software is hard.</title>
		<link>http://refractalize.wordpress.com/2009/08/15/its-a-trick-or-why-enterprise-software-is-hard/</link>
		<comments>http://refractalize.wordpress.com/2009/08/15/its-a-trick-or-why-enterprise-software-is-hard/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 23:18:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/08/15/its-a-trick-or-why-enterprise-software-is-hard</guid>
		<description><![CDATA[One of the things that characterises enterprise software development is how everybody underestimates it&#8217;s complexity. This is probably because most of the stuff we&#8217;re trying to do in an enterprise environment is, conceptually speaking, relatively straightforward. It&#8217;s not like we&#8217;re writing H.264 encoders or anything, no, we&#8217;re building workflows and basic CRUD websites. But it&#8217;s [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=106&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"></span><br /><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">One of the things that characterises enterprise software development is how everybody underestimates it&#8217;s complexity. This is probably because most of the stuff we&#8217;re trying to do in an enterprise environment is, conceptually speaking, relatively straightforward. It&#8217;s not like we&#8217;re writing H.264 encoders or anything, no, we&#8217;re building workflows and basic CRUD websites. But it&#8217;s a trick! Don&#8217;t be fooled for a second!</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">Enterprise software is rarely the inspiration for those lovely mind-bending computer science papers&#8230; but I think we may be making a terrible comparison. Enterprise software is no less complicated, it&#8217;s just often way less elegant. Enterprise software simply cannot be elegant, almost by definition. Enterprise environments can be fast paced, have </span></span><i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">very </span></span></i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">diverse systems and data, and there&#8217;s a lot more going on than any single brain can keep up with. In other words, enterprise organisations are just very complicated, no amount of software is going to change that.</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">But&#8230; back to the technicals. The reason enterprise software is often complicated is because of </span></span><i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">aspects</span></span></i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"> &#8211; as in Aspect Oriented Programming. Clean and simple concepts such as taking a user&#8217;s address, or a &#8220;shopping cart&#8221;, are completely corrupted with necessary requirements such as long term persistence, validation, paging, concurrency, long running (business) transactions, regular (database) transactions, asynchronicity, timeouts, exception handling, internet friendly protocols (HTTP), data migration and data quality, reports, logging, &#8230; batching, throttling&#8230; oh man, the stuff you need to think about! Then, what about all the *-ilities?</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">Programmers in an enterprise environment are, to use an AOP term, aspect weavers. As much as we like to separate concerns, we&#8217;re often using or inventing patterns that combine two or more of them. Take a repository pattern for instance, a pattern that can be good at abstracting the differences between persistence implementations, but never good at abstracting the difference between having persistence and not having persistence.</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">Building an application with a repository pattern is </span></span><i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">weaving</span></span></i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"> persistence into the application&#8217;s architecture, and in most cases, from the very beginning. We&#8217;re binding too early to persistence (in this case) and probably to a great many of other aspects at the same time. And the more aspects you add, the more complex it gets. And the more complex it gets, the more complex it gets!</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">But you could always go back to hacking on software transactional memory or a distributed column store, you know, to take your mind off things.</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">Seriously though, would it be possible to late bind to aspects like persistence? Can you write an application without persistence and then, without too much effort, simply turn it on?</span></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">Who knows&#8230; but I&#8217;ll be exploring a </span></span><i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;">possible</span></span></i><span class="Apple-style-span" style="font-size:medium;"><span style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;"> solution to this in my next article&#8230; stay tuned!</span></span></div>
<p></span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/106/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=106&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/08/15/its-a-trick-or-why-enterprise-software-is-hard/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
		<item>
		<title>I am an Anti-Pattern</title>
		<link>http://refractalize.wordpress.com/2009/07/05/i-am-an-anti-pattern/</link>
		<comments>http://refractalize.wordpress.com/2009/07/05/i-am-an-anti-pattern/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 13:58:00 +0000</pubDate>
		<dc:creator>synotia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://refractalize.wordpress.com/2009/07/05/i-am-an-anti-pattern</guid>
		<description><![CDATA[I&#8217;m an ignorant proponent of bad practices. I am the reason my projects are late, expensive and buggy. I&#8217;d like to say this wasn&#8217;t true, but I&#8217;ve been on so many projects that have been late, expensive and buggy that I have to make some inferences. First inference to make is that I was there, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=105&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="font-family:'Lucida Grande';font-size:small;"><span class="Apple-style-span" style="font-size:11px;">
<div style="font:16px Times;margin:0;"></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I&#8217;m an ignorant proponent of bad practices.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I am the reason my projects are late, expensive and buggy.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">I&#8217;d like to say this wasn&#8217;t true, but I&#8217;ve been on so many projects that have been late, expensive and buggy that I have to make some inferences. First inference to make is that I was there, that&#8217;s got to count for something.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">I know this for sure, that I </span><i><span class="Apple-style-span" style="font-size:medium;">used</span></i><span class="Apple-style-span" style="font-size:medium;"> to be an Anti-Pattern. Looking back at all the stupid mistakes I made, the things I wasn&#8217;t vocal about enough, the things I was too vocal about, the things I never even thought of and the things I&#8217;d never even heard of. What was I thinking? That code I wrote back then is seriously legacy crap.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">Of course, I only write good code now. Well factored, lots of tests. I only make good decisions now. Break large projects down in to little releasables, reduce dependences, mitigate risks. But really, am I perfect? I thought I was perfect 2 years ago, damn, even 10 years ago.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">What am I going to learn in the next two years? I&#8217;m pretty sure I&#8217;m going to look back at today&#8217;s output in embarrassed bewilderment. What was I thinking?&#8230;</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">Even today<b> I am an Anti-Pattern.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I&#8217;m an ignorant proponent of bad practices.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I am the reason my output is embarrassing.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">But wait. Why am I looking back with such shame? Isn&#8217;t that a sign of a good thing? Surely I would be more embarrassed if I looked back and found only good things&#8230; I can&#8217;t have learned much if I think last year&#8217;s code is still in pretty good knick.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">The antidote to me being an Anti-Pattern is learning style. I need to learn everything, from everybody around me, from every mistake I make, from every source I can find. And the best way to do that is for me to think that <b>I am an Anti-Pattern.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I&#8217;m an ignorant proponent of bad practices.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I am the reason my projects don&#8217;t give good RoI.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">And to learn, I need to be an apprentice. All the time.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;">All my </span><i><span class="Apple-style-span" style="font-size:medium;">good</span></i><span class="Apple-style-span" style="font-size:medium;"> practices were stolen from other people. They&#8217;re not mine. All my bad practices were taken from others too. I am a random collection of other people&#8217;s behaviour. None of these practices are really </span><i><span class="Apple-style-span" style="font-size:medium;">mine</span></i><span class="Apple-style-span" style="font-size:medium;">, so why should I hang on to them as if they are? When I really understand that it won&#8217;t matter what I learn or from whom, I&#8217;ll be truly open to learning everything. Only then can I be serious about being a software craftsman.</span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I am an Anti-Pattern.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>I&#8217;m the ignorant proponent of bad practices.</b></span></div>
<div style="font:12px Helvetica;min-height:14px;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b><br /></b></span></div>
<div style="font:12px Helvetica;margin:0;"><span class="Apple-style-span" style="font-size:medium;"><b>But I&#8217;m going to improve. Promise!</b></span></div>
<div><span style="font-family:Helvetica;font-size:small;"><span class="Apple-style-span" style="font-size:12px;"><br /></span></span></div>
<p></span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/refractalize.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/refractalize.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/refractalize.wordpress.com/105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=refractalize.wordpress.com&amp;blog=5709358&amp;post=105&amp;subd=refractalize&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://refractalize.wordpress.com/2009/07/05/i-am-an-anti-pattern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/53d301869ff9f450d180eb40fdcca434?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">synotia</media:title>
		</media:content>
	</item>
	</channel>
</rss>
