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

<channel>
	<title>let x=x &#187; test first</title>
	<atom:link href="http://www.crazymcphee.net/x/tag/test-first/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.crazymcphee.net/x</link>
	<description>programming idiom and methodology</description>
	<lastBuildDate>Fri, 27 Jan 2012 09:36:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JAOO Brisbane 2009 highlights and thoughts</title>
		<link>http://www.crazymcphee.net/x/2009/05/13/jaoo-brisbane-2009-highlights-and-thoughts/</link>
		<comments>http://www.crazymcphee.net/x/2009/05/13/jaoo-brisbane-2009-highlights-and-thoughts/#comments</comments>
		<pubDate>Wed, 13 May 2009 12:55:54 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[professional practice]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[tools and techniques]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[jaoo]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[profession]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[test first]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=356</guid>
		<description><![CDATA[I spent last Monday and Tuesday at the JAOO conference in Brisbane, and I have a couple of things which I want to say I thought interesting. (&#8216;JAOO&#8217; btw, because I see people asking about it on Twitter, is pronounced a bit like &#8220;yow&#8221; but with the &#8220;j&#8221; from German/Dutch like &#8220;jah&#8221;). Firstly, I found [...]]]></description>
			<content:encoded><![CDATA[<p>I spent last Monday and Tuesday at the <a href="http://www.jaoo.com.au/" target="_blank">JAOO</a> conference in Brisbane, and I have a couple of things which I want to say I thought interesting. (&#8216;JAOO&#8217; btw, because I see people asking about it on Twitter, is pronounced a bit like &#8220;yow&#8221; but with the &#8220;j&#8221; from German/Dutch like &#8220;jah&#8221;).</p>
<p>Firstly, I found the second day much better than the first. I did see <a href="http://www.michaelnygard.com/" target="_blank">Michael Nygard&#8217;s</a> two talks on Monday morning and got a lot a lot of useful information from those. Titled &#8216;Failure comes in flavours&#8217; the first was a great overview of the types of failure that applications running in production encounter, the second ways to avoid those failure modes. Basically it&#8217;s how many of the non-functional requirements can eat your app (and even the entire integration if you let the failure propagate easily) if you don&#8217;t give careful consideration to them. He&#8217;s got a <a href="http://www.pragprog.com/titles/mnee/release-it" target="_blank">book</a> so I&#8217;m going to check that out next.</p>
<p>The first day for me was severely spoilt by a poor vendor presentation (hint: one that is <em>not</em> Oracle, not that they would have necessarily done any better), which I should have known better to avoid. I already swim in the BPEL/BPM/SOA soup, I fully understand just how broken it is as an actual development concept (e.g. anti-test-first to name just <em>one</em>). I was fooled by the title to thinking maybe it had some insights to avoid the worst of these busted concepts, but no, the vendor&#8217;s tooling is all the rage if you drink the poor-tasting conceptual kool-aid. This stuff is marketed at managers and non-coding architects who choose to buy this stuff then dump it from a very great height into the laps of the poor developers who have to mangle it into a deliverable system (half the time with a development budget just a tenth the cost of the licence). Anyway back to the good stuff.</p>
<p>Mike Cannon-Brookes from <a href="http://www.atlassian.com/" target="_blank">Atlassian</a> (which makes great development tools, highly recommended) gave a mostly great closing speech on the first day which made me think about a couple of things. It wasn&#8217;t until the next morning however that it crystallised in my mind. It&#8217;s a bit of a minor criticism.</p>
<p>Mike threw out a minor line, an aside really, talking about Atlassian&#8217;s agile development methodology, and basically that said, people who say &#8216;you must do this&#8217; are wrong, because they miss your context. Here &#8216;this&#8217; is some type of agile process artefact like  maybe, pairing, or estimating in story points, or whatever. Well, it&#8217;s wrong and on two counts. The first count I realised just after the talk but couldn&#8217;t articulate it correctly in semi-drunken conversation. That first count is very simple. Mike&#8217;s timeline on his Atlassian experience has him, if I recall correctly, starting his company and creating the great tool Jira, in his early twenties. Now as he dissed &#8220;old people&#8221; in his talk I&#8217;m going to give some back. In your twenties you&#8217;ve got no idea <em>what works</em>, in a general sense. You might know (or think you know) <em>what works for you</em>, but that&#8217;s a completely different kettle of fish to <em>what works generally</em>. Why not? The word is <em>experience</em>. Its not until you reach &#8230; oh &#8230; I&#8217;ll say around 35 (and so maybe lose the capacity to build technical innovation, perhaps, as Mike asserted) that you can have real insights into <em>process</em> and <em>people</em>. It&#8217;s just because at this point, you just have not got enough <em>practice</em> at it (see Malcolm Gladwell&#8217;s recent book for some basic data about the power of practice).</p>
<p>But the bigger point I think is the word <em>context</em>. The phrase &#8216;my context is different&#8217;, is this classic phrase which <em>really</em> means &#8216;that won&#8217;t work here&#8217; and <em>that</em> really means, <em>I don&#8217;t want to change</em>. As a consultant , you hear this stuff all the time: &#8230; &#8220;We&#8217;re unique, our company is not like those other companies. We can&#8217;t do that here. Detailed estimates are really the most important part of the development process. The budget and the features must be fixed. We have a reporting process that allows the budget and features to be fixed. Pair programming doubles the time it takes to deliver the features. Quality doesn&#8217;t matter. Technical quality is  a business decision. The business are too busy to talk to you.&#8221; &#8230;  And a whole other other bunch of <em>epic agile fail</em>. Someone&#8217;s context is <em>exactly</em> why they aren&#8217;t as agile as their competitors and are looking at using &#8216;agile development&#8217; to help save them &#8230; but as long as they insist on <em>my context trumps all</em>, they will only get a fractional improvement and not an order-of-magnitude one. But Atlassian make great products, so it doesn&#8217;t mean you <em>have</em> to have &#8216;scrum&#8217;, or &#8216;XP&#8217; to do that, the greatness I guess, is orthogonal. However if you are looking to &#8216;do agile&#8217;, then <em>do agile</em>. Pick a method like Scrum or XP then do it all. How do you know pair programming will fail in your organisation if you don&#8217;t try it first? You don&#8217;t. Do it like it says to do it (e.g. the Kent Beck books) and after a few months experience for your team, use the lessons from the retrospectives that the team has discovered to improve the process. <em>Do not cripple the process with your &#8216;context&#8217; before you even try</em>.</p>
<p>And right on cue, on the second day along comes <a href="http://steve.cogentconsulting.com.au/" target="_blank">Steve Hayes</a> with a <em>great</em> presentation on exactly this topic: &#8220;How your choices affect your agility&#8221;. Steve is a fantastic speaker, entertaining and pretty insightful too I thought. I rated his talk the best talk of the conference. He said he got lots of red cards (participants could rate each talk as green==good, yellow==ok, red==bad) in his Sydney session &#8211; <em>what is the matter with your people</em>? It was a great talk. I loved the part about <em>naivety</em>. To propose a solution from the most naive perspective possible, and  what an <em>epic win </em>it is when a customer says &#8220;ok&#8221;! It means I understand the problem! I even tried this today with my client, I didn&#8217;t get the instant &#8220;OK&#8221; but working from the basis of that incredibly naive solution we did manage to eventually envisage <em>the simplest thing that could possibly work.</em> And I love that. So thanks tons for that insight, Steve!</p>
<p>Another great talk on the second day was <a href="http://www.lindarising.org/" target="_blank">Linda Rising&#8217;s</a> &#8216;Deception and Estimation&#8217; talk. Turns out (via psychology and evolutionary biology) we engage not in <em>rational</em> decision making but in <em>emotional</em> choices <em>all the time</em>. All choice is emotional. So we engage ourselves in self-deception <em>all the time</em>. And none of this is <em>bad</em> &#8230; <em>it&#8217;s good</em>. People who don&#8217;t engage in this constant self-deception are generally clinically insane. So get over it, and yourself, and when you&#8217;re estimating (and from the sounds of it, doing any sort of major-impact decision making) and get as <em>many perspectives as you can</em> from the most diverse range of people you can manage (to avoid <em>groupthink</em>, which is I guess, the situation where everyone&#8217;s self-deceptions all align). <a href="http://en.wikipedia.org/wiki/Joshua_Bloch" target="_blank">Joshua Bloch&#8217;s</a> second-day keynote was also highly worthy of praise. Good insight and excellent effective code examples (yes, in a <em>keynote</em>). Also worth the greatly discounted entry ticket price was the many interesting conversations I had with past colleagues and new friends on many different development issues.</p>
<p>In short, JAOO was generally of very high quality and I hope is keeps coming to Brisbane! Will definitely be going next year. Many thanks to all the organisers, presenters and sponsors.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/05/13/jaoo-brisbane-2009-highlights-and-thoughts/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Let it fail then learn to succeed</title>
		<link>http://www.crazymcphee.net/x/2009/03/01/let-it-fail-then-learn-to-succeed/</link>
		<comments>http://www.crazymcphee.net/x/2009/03/01/let-it-fail-then-learn-to-succeed/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 07:00:51 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[professional practice]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[profession]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[test driven design]]></category>
		<category><![CDATA[test first]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=208</guid>
		<description><![CDATA[On the scrum development mailing list, Dave Nicollette recommended shortening sprint length until it failed, then backing up one step: &#8220;Oh, my God! You&#8217;re going to let a sprint fail, just so you can determine the optimum length?&#8221; Yes. In other words, failure lets you learn your limits. But more importantly, as suggested here, is [...]]]></description>
			<content:encoded><![CDATA[<p>On the <a href="http://groups.yahoo.com/group/scrumdevelopment/" target="_blank">scrum development mailing list</a>, Dave Nicollette recommended shortening sprint length until it failed, then backing up one step:</p>
<blockquote><p>&#8220;Oh, my God! You&#8217;re going to let a sprint fail, just so you can determine the optimum length?&#8221; Yes.</p></blockquote>
<p>In other words, failure lets you learn your limits. But more importantly, as suggested here, is that failure can be <em>deliberately introduced</em> in order to <em>improve the process</em> &#8211; to decrease your limitations. I would say, for an organisation committed to process optimisation, you should shorten the sprint until it fails, but rather than just <em>accepting</em> that limit, learn <em>why</em> it fails and then experiment with optimising it until it succeeds. Let me explain.</p>
<p>Courtesy of a tip from <a href="http://trontos.com/dsouth/blog/" target="_blank">Doug South</a> at the <a href="http://groups.google.com/group/Brisbane-XP" target="_blank">Brisbane XP user&#8217;s group</a>, I&#8217;m nearly finished reading a book at the moment, <em>Chasing the Rabbit</em> by Steven J. Spear of MIT and formerly of Harvard. The book&#8217;s full title is <em>Chasing The Rabbit: How market leaders outdistance the competition and how great companies can catch up and win</em>. It&#8217;s a business book that describes the essential feature of successful companies such as Toyota and the Toyota Production System.</p>
<p>Before you roll your eyes and think I&#8217;m just another one of these lean software guys who&#8217;s about to rave over <em>kanban</em>, <em>kaizen</em>, and <em>just-in-time</em>, and applying manufacturing production-line process, possibly inappropriately, to the professional practice of software development, let me assure you I&#8217;m not. Neither does Spear. Basing his book on years of hands-on research into these high-velocity organisations (including time spent actually working on real production lines) he characterises <em>kanban</em> and friends as merely an <em>artifact</em> of a deeper philosophy towards building a successful company. In some ways its breathtaking simple, although hard to practice. The theme of the book is <em>discovery</em>.</p>
<blockquote><p>The factory was not only a place to to produce physical products, it was also a place to learn <em>how</em> to produce those products and &#8211; most important of all &#8211; it was a place to <em>keep</em> learning how to produce those products. In fact, this is exactly what so much of the early research about Japanese management had revealed &#8211; that learning and discovery were intrinsic to success. But that idea had gotten lost as people focused on the particular tools and artifacts used in the workplace at the expense of understanding the principles of how those systems where managed. (p 15).</p></blockquote>
<p>These companies don&#8217;t <em>succeed</em> or <em>fail</em>. They <em>succeed</em> or <em>learn to succeed</em>.</p>
<p>Now it is of course slightly more complex that just that. There are two characteristics and four capabilities that high-velocity organisations exhibit. The four capabilities are:</p>
<ol>
<li>Specifying design to capture existing knowledge and building in tests to reveal problems.</li>
<li>Swarming and solving problems to build new knowledge.</li>
<li>Sharing new knowledge throughout the organisation.</li>
<li>Leading by developing the first three capabilities.</li>
</ol>
<p>Now these capabilities can be developed &#8211; in different manifestations &#8211; in any sort of process, not just production-line processes. Spear shows it in action in health-care, in nuclear engineering, in aluminium production, and of course automotive production. I&#8217;ll into further detail perhaps in a later post. Here I&#8217;m going to discuss a simple example illustrating not just capability 1, in which a process not only captures knowledge but has built-in tests, and also capability 2, involving problem solving and process improvement, where the process is tested to failure, in order to reveal what knowledge is missing about the process.</p>
<p>In the book he describes a mattress factory, Aisin, that, after a long capability improvement process ends up with two production lines each capable of making (e.g.) 100 units a day to custom order. On some given day, imagine they have a requirement to make say 180 units. Rather instead of running one line at 100 the other at 80, or both at 90 units, they will instead <em>deliberately</em> overload one of the lines (e.g. ramp it to 110 or 120 units) in order to discover the process failure modes (that is, the process&#8217;s bottlenecks) so as to to improve them. They already know how to make 100 units a day. They can learn more about their process if they try to make 120. The reason they do this on days of lighter loading, is that the can use the unstressed production line as a back up, if the test was too stressful for the line under test.</p>
<p>Experienced software engineers might recognize this <em>stress testing</em> from their performance testing toolkit. Loading a software system to the point of failure is one quick way to learn where a system&#8217;s bottlenecks are, and what to do about eliminating them, and thus making your software architecture more efficient, and discovering new knowledge about how your architecture performs and what needs to change.</p>
<p>The point is of course, I&#8217;m not talking about stress testing <em>software</em>. I&#8217;m talking about stress testing software development <em>methodology</em> so you can discover what you don&#8217;t already know about your process, and therefore improve it. I don&#8217;t mean, just arbitrarily place more demands on your software teams to produce more with less. That&#8217;s just the most retarded type of management-by-objective.</p>
<p>Think about all the moving parts in your development process. What do you know about them? What do you assume? What do you just take for granted? How much do your team members know about the process? Can they identify problems and propose solutions? Do they need to learn that capability? Where are your failure modes? Do you just accept them, and perform a work around, or do you understand them as signals to elicit further discovery about the things you don&#8217;t understand about the process?<em> Embrace failure</em>. In fact, actively seek it out. Use it an opportunity to discover unknown information about your business and to improve your team&#8217;s skills.</p>
<p><em>Chasing The Rabbit</em> is a great book, highly recommended that all software development practioners read it, and special thanks to Doug for bringing it to my attention.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/03/01/let-it-fail-then-learn-to-succeed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Incremental test running with JUnit Max</title>
		<link>http://www.crazymcphee.net/x/2009/02/07/incremental-test-running-with-junit-max/</link>
		<comments>http://www.crazymcphee.net/x/2009/02/07/incremental-test-running-with-junit-max/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 06:38:29 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[tools and techniques]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[test driven design]]></category>
		<category><![CDATA[test first]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=146</guid>
		<description><![CDATA[Well looks like Joel Spolsky&#8217;s ignorant rant about Test Driven Design (TDD) resulted in some good after all. Kent Beck posted a brief response to Joel, which was pointed out in a mailing list discussion about the issue. But that&#8217;s not what I wanted to talk about here. Anyway it turns out that Kent is [...]]]></description>
			<content:encoded><![CDATA[<p>Well looks like Joel Spolsky&#8217;s ignorant rant about Test Driven Design (TDD) resulted in <em>some</em> good after all. Kent Beck posted a <a title="Joel Spolsky is wrong about my work: Kent Beck" href="http://www.threeriversinstitute.org/blog/?p=29" target="_blank">brief response to Joel</a>, which was pointed out in a<a href="http://groups.yahoo.com/group/straight_talking_java/"> mailing list</a> discussion about the issue. But that&#8217;s not what I wanted to talk about here.</p>
<p>Anyway it turns out that Kent is writing a product called <strong><a title="Junit Max" href="http://www.threeriversinstitute.org/junitmax/subscribe.html" target="_blank">JUnit Max</a></strong> which looks <em>super</em> interesting for those using the discipline of TDD to write better code. Look at the Flash presentation on this page: <a title="JUnit Max" href="http://www.threeriversinstitute.org/junitmax/subscribe.html" target="_blank">http://www.threeriversinstitute.org/junitmax/subscribe.html</a> &#8230; Also it brings together another thread we had on the mailing list which was about Eclipse&#8217;s incremental compilation features. This is incremental test running!</p>
<p>A pity it&#8217;s not free but I guess Kent&#8217;s got to eat. I might be tempted to buy it in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/02/07/incremental-test-running-with-junit-max/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmerless programming is just a mirage</title>
		<link>http://www.crazymcphee.net/x/2009/01/17/programmerless-programming-is-just-a-mirage/</link>
		<comments>http://www.crazymcphee.net/x/2009/01/17/programmerless-programming-is-just-a-mirage/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 10:09:24 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[professional practice]]></category>
		<category><![CDATA[tools and techniques]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[test driven design]]></category>
		<category><![CDATA[test first]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=51</guid>
		<description><![CDATA[&#8220;Programmerless programming&#8221; is a fad that never dies. It&#8217;s a mirage that never fades but always recedes to just out of reach. Every few years a vendor, or a group of vendors comes out with some bright idea to allow some class of end-user, or business analyst, or what have you to build their own [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Programmerless programming&#8221; is a fad that <a title="The End of The Software Developer" href="http://www.craigslinkedlist.com/posts/end-of-the-software-developer" target="_blank">never dies</a>. It&#8217;s a mirage that never fades but always recedes to just out of reach.</p>
<p>Every few years a vendor, or a group of vendors comes out with some bright idea to allow some class of end-user, or business analyst, or what have you to build their own systems, in recent years usually by some type of graphic language (draw your system&#8217;s program flow right on the screen! bypass those pesky, and expensive, <em>programmers</em> who just ask confusing questions and force you to clarify your thinking!  press the magic &#8216;deployment&#8217; button and your half-baked idea is in <em>production in seconds</em>!). In the past, these systems used &#8220;natural&#8221; language or &#8220;plain English&#8221;  languages such as say Director Lingo.  Every few years it moves onto some new paradigm or expression of the old one. <em>And it always just ends up simply with a whole new class of programmers being created.</em></p>
<p>Do not trust any product &#8211; or standard &#8211; that promises to deliver &#8220;programmerless programming&#8221;. Plenty of 4GLs like SQL and the like are originally meant for non-programmers to use  &#8230; imagine giving a business user just a SQLPLUS prompt now! Included in that mix there was CASE &#8230; a recent example from the past few years I can think of might be BPEL and ESB style tools, or for another example a number of attempts to define architectural languages that generate the system components for you off the UML or similar.</p>
<p>A big issue I see with these systems is that they tend to be highly resistant to modern programming <a title="Emergent Design" href="http://www.crazymcphee.net/x/2009/01/13/emergent-design/" target="_self">principles and practices</a>. For example, test-driven design &#8211; or even simple <a title="Unit testing as a discipline" href="http://www.crazymcphee.net/x/2009/01/15/unitestingasadiscipline/" target="_self">unit testing</a>. Sure, if you&#8217;re building a web app with these things, maybe you could use a web-testing framework to build functional tests and build-to-pass. But most of these tools are very resistant to a test-first approach.</p>
<p>Take Oracle&#8217;s BPEL tooling. For a start, you&#8217;re forced to used JDeveloper, which is a crap IDE you&#8217;d never otherwise inflict on yourself (it is so bad, on start up it displays the most meaningless <em>product slogan</em> I&#8217;ve seen seen on such a tool &#8211; &#8220;Productivity through Choice&#8221;). But more than poor tooling, the very paradigm is completely broken. Forget about a test-first approach (although I&#8217;m sure there&#8217;s some seriously weird way to achieve it), just try setting the damn tools to have the traditional <em>development</em>, <em>testing</em> and <em>production</em> environments. When ever you need to call a service end-point, you are bound to the particular host and port you specify &#8211; it&#8217;s embedded in XML document that represents the BPEL design. The workarounds? Well if you are super organised you could arrange for your different environments to contain identical setups and  use DNS hacks (or host files) to ensure that each service looks the same when you move from development to integration testing to production. Or you can write Ant scripts (or sed and awk if you really want) to search-and-replace the offending hostnames and ports and replace them with the correct values for the target environment. Clearly, once you use it, you see that the tool&#8217;s paradigm is, in reality, to just hook up the IDE to the production server, draw your pretty flow chart modelling your business process, then publish it straight back into production. In other words, there&#8217;s a whole new class of programmer out there now &#8211; BPEL programmers &#8211; and life must be a <em>nightmare</em> for them. Its fundamental paradigm is broken. Given me <em>any</em> language with a unit test framework with a half-decent programmer on <em>any</em> day of the week, and you will beat the pants off this system in productivity <em>and</em> choice. It&#8217;s living a lie &#8211; and a big one.</p>
<p>Ultimately, as each new generation of &#8220;programmerless&#8221; program-construction tooling comes along, it allows developers to do more powerful things (and sometimes, <em>less</em> powerful things in a <em>more</em> retarded way). And the scale of the task always increases to the point where development specialists are still needed. In my view, there is a definite on-going role for for the talented programmer/analyst who knows how to take a vaguely-worded, incomplete, and contradictory bunch of requirements expressed in common verbal language and then <em>ask the right questions</em> in order to clarify them and decompose the requirements to a series of simple logical components &#8211; and then develop and deliver those components in the form of usable systems. You need to continuously learn new languages and systems, but the basic skills stay the same.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/01/17/programmerless-programming-is-just-a-mirage/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Unit testing as a discipline</title>
		<link>http://www.crazymcphee.net/x/2009/01/15/unitestingasadiscipline/</link>
		<comments>http://www.crazymcphee.net/x/2009/01/15/unitestingasadiscipline/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 09:49:57 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[professional practice]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[emergent design]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[refactor]]></category>
		<category><![CDATA[test driven design]]></category>
		<category><![CDATA[test first]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=25</guid>
		<description><![CDATA[In Emergent Design Scott L. Bain dedicates a chapter to Paying attention to Disciplines: Unit testing. To an experienced agilist this may seem a little basic: of course the discipline of unit testing pays dividends! But I think that we agilists forget sometimes that there are still many programmers &#8211; or their management &#8211; who don&#8217;t value the investment [...]]]></description>
			<content:encoded><![CDATA[<p>In <a title="Emergent Design" href="http://www.crazymcphee.net/x/2009/01/13/emergent-design/" target="_self">Emergent Design</a> Scott L. Bain dedicates a chapter to <em>Paying attention to Disciplines: Unit testing</em>. To an experienced agilist this may seem a little basic: <em>of course</em> the discipline of unit testing pays dividends! But I think that we agilists forget sometimes that there are still many programmers &#8211; or their management &#8211; who don&#8217;t value the investment needed to get the extensive returns of unit testing and test driven development (let alone test driven <em>design</em>).</p>
<p>I have found too many code bases over the years, with bolted-on, after the fact tests, plagued by spaghetti code and strongly coupled components to be <em>that</em> naive about unit tests. Sure people pay lip-service to testing, but I think many programmers haven&#8217;t yet found the value of test driven design in their professional practice. I know enough that I come across this situation frequently. &#8220;Oh I&#8217;ll do the tests later&#8221;, &#8220;I don&#8217;t have time to write tests, I have to write code!&#8221;, etc. Heck, I am sometimes still guilty of it myself. Here&#8217;s some rolled-gold reasons Bain gives to pay particular attention to the discipline of unit testing in a test-first scenario:</p>
<ul>
<li>It reduces bugging time.</li>
<li>It makes the development process more predictable &#8211; finding bugs often exhibits non-linear unpredictability.</li>
<li>It encourages appropriate coupling, ensures cohesiveness, and reduces redundancy.</li>
<li>It makes you think about your code in more depth.</li>
</ul>
<p>I must say, even when confronted with an existing code base that has little to no unit testing, it&#8217;s always advantageous to start writing the tests before you start fooling around too much with the code base. It will help you discover the design weaknesses.</p>
<p>Another point I have to make about unit testing, is that whenever I need to evaluate a new technology,  I now use the ability to utilise test-driven methodologies as an important criteria. <em>Especially</em> if that technology is supposed to be a productivity-booster for programmers. If I can&#8217;t write the tests first, then I just know the tool, or technology, is going to produce less than optimum results &#8211; how can it make any programmer <em>more</em> productive if it removes the ability to write code until the tests pass? And if I can&#8217;t write <em>any</em> tests &#8211; that is it has no test framework either built-in or freely available, then I just know the tool <em><span style="text-decoration: underline;">sucks</span></em>, and is to be actively avoided and recommended against. I&#8217;m especially suspicious of technology such BPEL frameworks and other frameworks designed to provide &#8220;programmer-less programming&#8221; (but that will have to wait for another day).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/01/15/unitestingasadiscipline/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Emergent Design &amp; Professional Software Development</title>
		<link>http://www.crazymcphee.net/x/2009/01/13/emergent-design/</link>
		<comments>http://www.crazymcphee.net/x/2009/01/13/emergent-design/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 12:19:37 +0000</pubDate>
		<dc:creator>Scot Mcphee</dc:creator>
				<category><![CDATA[professional practice]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[emergent design]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[profession]]></category>
		<category><![CDATA[test driven design]]></category>
		<category><![CDATA[test first]]></category>

		<guid isPermaLink="false">http://www.crazymcphee.net/x/?p=11</guid>
		<description><![CDATA[Recently I read Emergent Design: The Evolutionary Nature of Professional Software Development by Scott L. Bain (on Amazon). It&#8217;s a very interesting read. [E]mergent design works by refactoring and enhancing code, due to the changes, bugs, and extensions that have to accommodate, while paying close attention to these principles of coding. (152) In order to deal with the [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I read <span class="nobr"><a rel="nofollow" href="http://www.netobjectives.com/resources/books/emergent-design">Emergent Design: The Evolutionary Nature of Professional Software Development by Scott L. Bain<sup><img class="rendericon" src="http://modular.autonomous.org/confluence/images/icons/linkext7.gif" border="0" alt="" width="7" height="7" align="absmiddle" /></sup></a></span> (on <span class="nobr"><a rel="nofollow" href="http://www.amazon.com/Emergent-Design-Evolutionary-Professional-Development/dp/0321509366">Amazon<sup><img class="rendericon" src="http://modular.autonomous.org/confluence/images/icons/linkext7.gif" border="0" alt="" width="7" height="7" align="absmiddle" /></sup></a></span>). It&#8217;s a very interesting read.</p>
<blockquote><p>[E]mergent design works by refactoring and enhancing code, due to the changes, bugs, and extensions that have to accommodate, while paying close attention to these principles of coding. (152)</p></blockquote>
<p>In order to deal with the idea idea of evolutionary software development with a lean or agile methodology you have to first grasp what software development is and isn&#8217;t. As a consequence of this, the first part of the book deals with the idea of &#8220;Software as a profession&#8221;. A lot of this is very thought-provoking; I&#8217;ve never really thought about what a &#8216;profession&#8217; actually is before.</p>
<blockquote><p>Software development has not been around for very long, in the grand scheme of things. Other, similar complex endeavors (medicine, the law, architecture and so on) have been around for hundreds, even thousands, of years, and in that time a whole set of standards, practices, and general wisdom has been captured and handed down from generation to generation. This has helped to increase the rate of predictable success for each new batch of doctors, lawyers, and builders, and in each case has led to the formation of an organism we call <em>the profession</em>.</p></blockquote>
<p>Although he admits that the choice of development as <em>profession</em> is somewhat arbitrary, it does serve to highlight that <em>what we do as developers is like no other activity</em>. In other words, software development is a unique activity, and there&#8217;s no point in organising it using the methods of electrical or mechanical engineering, research science, medicine, or house building. Each of these professions is different from software development and different <em>from each other</em>. Software developers need our own ways of organising our field of knowledge, some of these are currently absent.</p>
<p>Features that need to be covered in software development as a profession:</p>
<ul>
<li><strong>Specialised language</strong>. This would be at a high level, not a low abstraction level like at the code itself. Bain maintains that the design patterns &#8216;movement&#8217; is a move towards the development of a high-level specialised language that matures our field towards professionalism.</li>
</ul>
<ul>
<li><strong>A clear entry path</strong>. Something that&#8217;s currently clearly missing, although I&#8217;d contend that perhaps a computer science or information technology degree and employment as a graduate programmer, at least in this country (Australia), is something that somewhat fills that role.</li>
</ul>
<ul>
<li><strong>Peer-review</strong>. Peer review is fairly ad-hoc and chaotic, despite attempts at things like user groups and websites.</li>
</ul>
<ul>
<li><strong>Standards and practices</strong>. Unfortunately there is little agreement amongst the broad software development community about &#8216;what is right&#8217;. However, I would argue that the Agile movement is at least a move in the right direction.</li>
</ul>
<p>The sorts of things that need to be discussed and understood by a profession of evolutionary software development might number:</p>
<ul>
<li><strong>Qualities</strong>. How do we know when something is good? How do we choose the best thing? What is meant by <em>best</em>?</li>
</ul>
<ul>
<li><strong>Principles</strong>. The fundamentals of good software. &#8220;Principles promise better results in terms of the qualities we will emphasize&#8221;.</li>
</ul>
<ul>
<li><strong>Practices</strong>. The things you do in your daily coding activities. Practices must be easily taught because they &#8220;are truly valuable when they are shared and promoted to all the developers on a team&#8221;.</li>
</ul>
<ul>
<li><strong>Disciplines</strong>. These are similar to practices, but on a larger scale. Things you <em>should</em> do that have a basic and profound value to what you do as a developer. For example, unit testing, refactoring, test-driven development.</li>
</ul>
<ul>
<li><strong>Patterns</strong>. What worked before; &#8220;the set of interrelated points of wisdom that reflect what [the profession knows] about certain situations &#8230; that we find ourselves in again and again&#8221;. I would add, and the common, standarised jargon that we use to describe and discuss these patterns.</li>
</ul>
<ul>
<li><strong>Processes</strong>. How does development work? How do we know what to build? How do we know when we&#8217;ve built it? How do we correct the situation when we discover something&#8217;s wrong? How we we discover that something is wrong? Et cetera.</li>
</ul>
<p>In this day and age I can <em>still</em> find developers, usually working in crippled environments, who won&#8217;t even agree on the simple principles of maintaining &#8216;good&#8217; code practices, for <em>any</em> version of good. Whatever&#8217;s there, they&#8217;ll accept. Even when faced with seriously broken design, and a mandate to effect change, a cascading series of ever-fragile hacks will be accepted, even if it takes more time to produce, or modify, the hack. Code will never be deleted, even long after obsolescence. It is left remaining, &#8220;just in case&#8221;, and as if there was no version control system.</p>
<p>As a consultant, I have no real choice but to work with these programmers. I can only try to encourage them to follow a right path. I was recently told I was a <em>perfectionist</em>, simply for demanding any level of unit testing greater than 0.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crazymcphee.net/x/2009/01/13/emergent-design/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

