<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.1.2" -->
<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/"
	>

<channel>
	<title>Exploration Through Example</title>
	<link>http://www.exampler.com/blog</link>
	<description>Example-driven development, Agile software development, testing, Ruby, and other things of interest to Brian Marick</description>
	<pubDate>Tue, 15 May 2012 16:02:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<item>
		<title>Speculation about the origin of CamelCase</title>
		<link>http://www.exampler.com/blog/2012/05/15/speculation-about-the-origin-of-camelcase/</link>
		<comments>http://www.exampler.com/blog/2012/05/15/speculation-about-the-origin-of-camelcase/#comments</comments>
		<pubDate>Tue, 15 May 2012 10:49:41 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[who knows?]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[miscellany]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/05/15/speculation-about-the-origin-of-camelcase/</guid>
		<description><![CDATA[Prompted by Avdi Grimm&#8217;s post on underscores in program identifiers, I&#8217;ll publicly air my guess about why theBlightOfCamelCaseInfestsOurPrograms when_identifiers_with_underscores_are_obviously_more_readable. (Although Avdi is right that dashes are superior to both.)
As far as I can tell, the popularity of camel case came from Java, which got it from Smalltalk. But where did Smalltalk get it, and why [...]]]></description>
			<content:encoded><![CDATA[<p>Prompted by <a href="https://twitter.com/#!/avdi">Avdi Grimm</a>&#8217;s post on <a href="http://devblog.avdi.org/2012/05/15/underscores-are-stupid/">underscores in program identifiers</a>, I&#8217;ll publicly air my guess about why theBlightOfCamelCaseInfestsOurPrograms when_identifiers_with_underscores_are_obviously_more_readable. (Although Avdi is right that dashes are superior to both.)</p>
<p>As far as I can tell, the popularity of camel case came from Java, which got it from Smalltalk. But where did Smalltalk get it, and why did such smart people go so badly astray?</p>
<p>Flash back to 1979-1981. I was a <a href="http://en.wikipedia.org/wiki/Computer_operator">computer operator</a> for a <a href="http://en.wikipedia.org/wiki/PDP-10">PDP-10</a> mainframe at the University of Illinois <a href="http://www.csl.uiuc.edu/">Coordinated Science Lab</a>. (I still have two pieces of that computer in my basement.) We had a bunch of <a href="http://en.wikipedia.org/wiki/VT100">VT-100</a> act-alike terminals. But off in a corner, where no one ever used it, we had a single terminal we called &#8220;the European terminal&#8221;. One interesting thing about the European terminal was that it had no underscore key. Instead, it had a back-arrow key. I have a faint recollection that if you viewed text with underscores on that terminal, it would show up with back arrows instead. (Or was it that the keyboard <i>did</i> have an underscore on it, but when you pressed it, it displayed a back arrow?)</p>
<p>It&#8217;s unlikely you&#8217;d write←identifiers←with←back←arrows←in←them and, in any case, some programming languages (such as Smalltalk) use back arrow to mean assignment (instead of, as was common before C took off, `:=`). </p>
<p>All of which makes me think&#8212;especially since Smalltalk came from <a href="http://en.wikipedia.org/wiki/Simula">Simula</a>, and Simula came from Europe&#8212;<i>was</i> there no underscore available to the people who built Smalltalk back in its early days? Was that why they fell back on StudlyCaps?</p>
<p>(I even have a very dim memory of some language&#8212;I don&#8217;t think it was Smalltalk&#8212;where underscore, as well as a back arrow, could be used for assignment.)</p>
<p>Does anyone know?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/05/15/speculation-about-the-origin-of-camelcase/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Possible SCNA topic</title>
		<link>http://www.exampler.com/blog/2012/05/08/possible-scna-topic/</link>
		<comments>http://www.exampler.com/blog/2012/05/08/possible-scna-topic/#comments</comments>
		<pubDate>Tue, 08 May 2012 23:11:56 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[odd ideas]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[conferences]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/05/08/possible-scna-topic/</guid>
		<description><![CDATA[I&#8217;ve been thinking about what talk I might give at Software Craftsmanship North America this year. I have a reputation for &#8220;Big Think&#8221; talks that pull together ideas from not-software fields and try to apply them to software. I&#8217;ve been trying to cut back on that, as part of my shift away from consulting toward [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking about what talk I might give at <a href="http://scna.softwarecraftsmanship.org/">Software Craftsmanship North America</a> this year. I have a reputation for &#8220;Big Think&#8221; talks that pull together ideas from not-software fields and try to apply them to software. I&#8217;ve been trying to cut back on that, as part of my shift away from consulting toward contract programming. Also, I&#8217;ve heard rumblings that SCNA is too aspirational, not enough actionable.</p>
<p>However, old habits die hard, and I&#8217;m tempted to give a talk like the following. What do you think? Should I instead talk about functional programming in Ruby? Since this antique Wordpress installation makes commenting annoying, feel free to <a href="mailto:marick@exampler.com">send me mail</a> or reply on Twitter (@marick).</p>
<p><b>Persuasion, Scientists, and Software People</b></p>
<p>Science, as practiced, is a craft. Even more, it&#8217;s a high-stakes craft: scientists have to make big bets by joining in on what Imre Lakatos called &#8220;research programmes&#8221;. (A research programme is a Big Theory like Newtonian physics, quantum mechanics, Darwinian evolution, Freudian psychology, the viral theory of cancer, and so on.) It&#8217;s interesting to learn how scientists are persuaded to make those big bets.</p>
<p>It may also be useful. There are similarities between scientists and software people that go beyond how software people tend to like science and to be scientifically and mathematically inclined. Scientists build theories that let them build more theories. They build theories that let them build experiments that help them build more experiments. Software people build programs that help them build programs&#8212;and help them build theories about programming. So ways scientists are persuaded might also be ways software people can be persuaded. </p>
<p>If so, knowing how scientists persuade each other might help you persuade people around you to risk joining in on your craftsmanship &#8220;programming programme&#8221;.</p>
<p>In this talk, I&#8217;ll cover what the science students Imre Lakatos, Joan Fujimura, and Ian Hacking say about how science progresses. I&#8217;ll talk about viruses, jUnit, comets, Cucumber, Mercury&#8217;s orbit, Scrum, and positrons.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/05/08/possible-scna-topic/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My story about cyclomatic complexity</title>
		<link>http://www.exampler.com/blog/2012/03/25/my-story-about-cyclomatic-complexity/</link>
		<comments>http://www.exampler.com/blog/2012/03/25/my-story-about-cyclomatic-complexity/#comments</comments>
		<pubDate>Sun, 25 Mar 2012 11:26:07 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[the larger world]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/03/25/my-story-about-cyclomatic-complexity/</guid>
		<description><![CDATA[In the 1980&#8217;s, I was interested in metrics, maybe even a fan, and cyclomatic complexity was trendy. I was never entirely comfortable with it: all the justification in terms of &#8220;basis paths&#8221; seemed hand-wavily disconnected from the reality of code, and the literature seemed to go out of its way to obscure the fact that [...]]]></description>
			<content:encoded><![CDATA[<p>In the 1980&#8217;s, I was interested in metrics, maybe even a fan, and <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">cyclomatic complexity</a> was trendy. I was never entirely comfortable with it: all the justification in terms of &#8220;basis paths&#8221; seemed hand-wavily disconnected from the reality of code, and the literature seemed to go out of its way to obscure the fact that the cyclomatic complexity of a routine is just the number of branches + 1 (including the implicit branches in boolean statements like <code>a &#038;&#038; b</code>). (I don&#8217;t remember if there are any restrictions on that identity.)</p>
<p>Then I read a paper in <a href="http://cacm.acm.org/">CACM</a> on the cyclomatic complexity of Unix commands, and it was quite a revelation. You see, I worked for a Unix porting shop. We were regularly presented with broken commands whose code we didn&#8217;t know well, commands we had to dive into and fix. Two of the commands whose code was ranked least complex by the paper were <i>notorious</i> among us for being hard to understand. Otherwise fearless programmers wept like children when told they&#8217;d have to work on `/bin/sh` and `adb`.</p>
<p>Why were those two commands so hard to understand, even if not complex? The one I remember best was `/bin/sh`. This was an older version, written by Steve Bourne, I believe. At that time (I assume he&#8217;s gotten over it), he was enamored with the idea of turning C into Algol using the C preprocessor. </p>
<p>That is, his code included a header file that looked like this:</p>
<p><code><br />
#define BEGIN {<br />
#define END }<br />
#define AND &#038;&#038;<br />
</code></p>
<p>That meant the parts of C that are easy to understand were defined into <i>another language</i>. But you can&#8217;t do that with the parts of C that are hard to understand&#8212;&#8221;Is this a pointer to a function returning an array or a pointer to an array of functions?&#8221;&#8212;so all that was left (mostly) alone. The end result was like a combination of German and Sanskrit, which turns out to be hard to read even if you know both languages.</p>
<p>(As I recall, the &#8220;Algol&#8221; part wasn&#8217;t just a matter of lexical substitution: it also also meant using Algol idioms instead of familiar C ones. I don&#8217;t remember the details, but it might have been things like not using C&#8217;s null-terminated strings and malloc/free, but instead inventing new libraries to learn.)</p>
<p>None of this affected the branchiness of the `/bin/sh` code, so it didn&#8217;t affect the cyclomatic complexity. It just made the job of understanding the code much more, um, complex.</p>
<p>I don&#8217;t remember as much about `adb`. I think it was partly the complexity of the domain (it was an assembly-level debugger), partly that it was heavily data-driven (so that the complexity was in the setup and interconnection of data, not in the code that then processed it).</p>
<p>The point of all of this is that <b>merely using a word from the domain of human psychology allows you to import, under cover of night, tons and tons of assumptions, making them harder to notice</b>. By saying &#8220;complexity&#8221; instead of &#8220;branchiness&#8221;, the purveyors of one simplistic measure were able to make it seem profound. They could hide, perhaps even from themselves, the fact that they were, at best, <a href="http://en.wikipedia.org/wiki/Blind_men_and_an_elephant">feeling one part of the elephant</a>.</p>
<p>&#8212;</p>
<p>The same applies, I suspect, to the <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=functional+programs+are+easier+to+reason+about&amp;ie=UTF-8&amp;oe=UTF-8">common statement</a> that &#8220;functional programs are easier to reason about.&#8221; I happen to believe that&#8217;s a heck of a lot closer to being true than that complexity is all about branchiness, but still: it&#8217;s important to realize that the motivation for that broad statement has historically been the much narrower claim that functional languages make it easier to <i>prove that programs satisfy their specifications</i>. </p>
<p>When most of us slap down our coffee cup next to the keyboard and open up some code in the editor, our conscious goal is not to make proofs. It&#8217;s to accomplish other ends. Therefore, a straight extrapolation from &#8220;easier to write proofs about&#8221; to &#8220;easier to reason about&#8221; is a big leap. It smuggles in an assumption that &#8220;to reason&#8221; is one sort of thing, and that one sort of thing is formal logical deduction. That&#8217;s a really strong and dubious claim about the nature of thought, one that hasn&#8217;t led to overwhelming practical success when used in, oh, artificial intelligence or as <a href="http://bit.ly/H0P5gz">logical positivism</a>. </p>
<p>As usual, we ought to leave the grand claims about &#8220;the way humans are&#8221; or &#8220;the way that it is best to live/work&#8221; to psychologists and preachers. Amongst ourselves, perhaps we should just say things like &#8220;I&#8217;ve been doing this one kind of fairly specific thing recently, and I&#8217;ve been surprised to find that <i>X</i> has been really helpful to me. Maybe it will help you too.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/03/25/my-story-about-cyclomatic-complexity/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rubactive: functional reactive programming in Ruby</title>
		<link>http://www.exampler.com/blog/2012/03/01/rubactive-functional-reactive-programming-in-ruby/</link>
		<comments>http://www.exampler.com/blog/2012/03/01/rubactive-functional-reactive-programming-in-ruby/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 22:24:10 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/03/01/rubactive-functional-reactive-programming-in-ruby/</guid>
		<description><![CDATA[I was trying to figure out what functional reactive programming (FRP) is. I found the descriptions on the web too abstract(*) and the implementations to be in languages that weren&#8217;t easy for me to use. I could have been more patient, but I&#8217;ve always found rewriting (documentation and implementation) a good way to understand, so [...]]]></description>
			<content:encoded><![CDATA[<p>I was trying to figure out what functional reactive programming (FRP) is. I found the descriptions on the web too abstract(*) and the implementations to be in languages that weren&#8217;t easy for me to use. I could have been more patient, but I&#8217;ve always found rewriting (documentation and implementation) a good way to understand, so I (1) implemented my own (extremely trivial) library in Ruby and (2) changed the names to ones that made sense to me (since I found the terms commonly used to be more opaque tokens than ones that pointed me toward meaning).</p>
<p>And&#8212;why not?&#8212;I put <a href="https://github.com/marick/rubactive">the code</a> up on github. I also wrote the <a href="https://github.com/marick/rubactive/blob/master/README.rdoc">documentation/tutorial</a> I wish that I&#8217;d found early on.</p>
<p>I should point out that it&#8217;s quite possible I never really did understand FRP, making my tutorial a Bad Thing.</p>
<p>(*) I don&#8217;t mean to criticize that abstract descriptions. They were written by people in particular <a href="http://en.wikipedia.org/wiki/Interpretive_communities">interpretive communities</a> for other members. I just happen not to be one of those members.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/03/01/rubactive-functional-reactive-programming-in-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Refactoring code retreat - help needed</title>
		<link>http://www.exampler.com/blog/2012/02/20/refactoring-code-retreat-help-needed/</link>
		<comments>http://www.exampler.com/blog/2012/02/20/refactoring-code-retreat-help-needed/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 21:03:33 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/20/refactoring-code-retreat-help-needed/</guid>
		<description><![CDATA[Based on (mostly twitter) response to my note asking for information on composed refactorings, I&#8217;ve concluded there&#8217;s a gap in the knowledge-market, and I&#8217;ve decided to see if I can fill it. 
The topic is medium-scale refactorings, ones composed from the kind of Opdyke/Fowler-style &#8220;atomic&#8221; refactorings that tools can implement. Such medium-scale refactorings can be [...]]]></description>
			<content:encoded><![CDATA[<p>Based on (mostly twitter) response to my note asking for <a href="http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/">information on composed refactorings</a>, I&#8217;ve concluded there&#8217;s a gap in the knowledge-market, and I&#8217;ve decided to see if I can fill it. </p>
<p>The topic is medium-scale refactorings, ones composed from the kind of <a href="http://www.laputan.org/pub/papers/opdyke-thesis.pdf">Opdyke</a>/<a href="http://martinfowler.com/refactoring/catalog/index.html">Fowler</a>-style &#8220;atomic&#8221; refactorings that tools can implement. Such medium-scale refactorings can be done in, say, an hour to a day in response to needs that I think of as vaguely &#8220;small-scale architectural&#8221; (things like the need for layers that cross-cut many vertical slices, or separation of responsibilities into multiple cooperating classes, or the desire to segregate behavior into a pluggable <a href="http://industriallogic.com/xp/refactoring/">state machine pattern</a>, etc).</p>
<p>As with small-scale refactorings, the goal is to make the change safe in the sense of having a set of tests that always pass. It&#8217;s a lower risk and lower disruption (but perhaps slower) approach than discarding and rewriting.</p>
<p>Two aspects particularly interest me:</p>
<ul>
<li>
<p>
How do you get good at imagining the &#8220;path&#8221; from where your code is now to where you want it to be? (A good path wouldn&#8217;t leave you stuck halfway with the only way forward being a big, risky change to a bunch of code. It also is one that holds open the possibility of discovering an <i>even better</i>, unanticipated path halfway through.)
</p>
</li>
<li>
<p>
People who prefer rewriting to refactoring sometimes say they fear that refactoring gets them &#8220;stuck at a local maximum&#8221;. I can imagine that: I see what my code is like now, I can see how it would be better, but I can&#8217;t see a refactoring path from here to there. But, because I&#8217;m hooked on the feeling of safety refactoring gives me, I don&#8217;t improve the code.
</p>
<p>
So it&#8217;s worth exploring how often a really good refactorer (not me - yet!) will be unable to see any path. What characterizes such hard cases?
</p>
<p>
And there are related questions: once you can really do changes well both ways (refactoring and rewriting), what are the tradeoffs? how do you decide which to do?
</p>
</li>
</ul>
<p>The first way I want to address the topic is via a <i>refactoring code retreat</i>, patterned roughly after Corey Haines&#8217; <a href="http://coderetreat.com/">code retreats</a>. There have to be differences, though. The point of a code retreat is that you write the code from scratch and throw it away when you&#8217;re done. The point of a refactoring code retreat has to be that you start from a code base and transform it. That means someone &#8212; that is, me &#8212; has to provide the starting code. I&#8217;m beginning to do that <a href="https://github.com/marick/refactoring-examples">here</a>. There&#8217;s currently one Ruby exercise, complete with instructions.</p>
<p>How can you help?</p>
<ul>
<li>
<p>
Try out the <a href="https://github.com/marick/refactoring-examples/tree/master/split-into-two">split-into-two example</a>. (You can get a tarball or zipball <a href="https://github.com/marick/refactoring-examples/downloads">here</a>.) Join the <a href="http://groups.google.com/group/refactoring-retreat">mailing list</a> and post your reaction. (Too simple? Too unclear? Needs a dash of <i>X</i> to make it more realistic? Etc.) [I&#8217;ll also take pull requests.]
</p>
</li>
<li>
<p>
Give me an example of a medium-scale refactoring you&#8217;ve done yourself. A written description at the level of detail of the sections labeled &#8220;The app&#8221; and &#8220;The story&#8221; in the <a href="https://github.com/marick/refactoring-examples/tree/master/split-into-two">split-into-two example</a> would be great. So would a pointer to two commits on Github (or equivalent) and a brief note like &#8220;Look at how classes A, B, C changed into A, B, D, and E.&#8221;
</p>
</li>
<li>
<p>
I&#8217;m thinking of having all the examples in Ruby, Java, and JavaScript. Help translating them would be cool. Examples in other languages might also be fun.
</p>
</li>
<li>
<p>
I&#8217;m concentrated on traditional object-oriented refactoring, but I&#8217;m also interested in how refactoring applies in functional languages like Clojure. Got examples?
</p>
</li>
<li>
<p>
I&#8217;ll need a local host for a first trial workshop. Chicago area preferred.
</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/20/refactoring-code-retreat-help-needed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The aim of architecture</title>
		<link>http://www.exampler.com/blog/2012/02/14/the-aim-of-architecture/</link>
		<comments>http://www.exampler.com/blog/2012/02/14/the-aim-of-architecture/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 19:25:46 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/14/the-aim-of-architecture/</guid>
		<description><![CDATA[A quote from Wilfrid Sellars:

The aim of philosophy, abstractly formulated, is to understand how things, in the broadest possible sense of the term, hang together, in the broadest possible sense of the term. [&#8230;] To achieve success in philosophy would be, to use a contemporary turn of phrase, to &#8216;know one&#8217;s way around.&#8217; [Two commas [...]]]></description>
			<content:encoded><![CDATA[<p>A quote from Wilfrid Sellars:</p>
<blockquote><p>
The aim of philosophy, abstractly formulated, is to understand how things, in the broadest possible sense of the term, hang together, in the broadest possible sense of the term. [&#8230;] To achieve success in philosophy would be, to use a contemporary turn of phrase, to &#8216;know one&#8217;s way around.&#8217; [Two commas added for clarity]
</p></blockquote>
<p>In a <a href="http://plato.stanford.edu/entries/sellars/">biographical article</a>, Willem deVries expands on that:</p>
<blockquote><p>
Thus, philosophy [to Sellars] is a reflectively conducted higher-order inquiry that is continuous with but distinguishable from any of the special disciplines, and the understanding it aims at must have <b>practical force, guiding our activities, both theoretical and practical</b>. [Emphasis mine]
</p></blockquote>
<p>That seems to me not horribly askew from what I&#8217;m starting to understand as the aim of software architecture. I&#8217;d say something like this: </p>
<blockquote><p>
The aim of architecture is to describe how code, in a broad sense of the term, hangs (or will hang) together, in a broad sense of the term. The practical force of architecture is that it guides a programming team&#8217;s activities so as to make growing the code easier.
</p></blockquote>
<p>This definition discards the idea of architecture as some etherial understanding that stands <a href="http://en.wikipedia.org/wiki/Theory_of_Forms">separate from, and above</a>, the code. Architecture isn&#8217;t <i>true</i>, it&#8217;s <i>useful</i>, specifically for actions like moving around (in a code base) and putting new code somewhere.</p>
<p>I also like the definition because it lets me bring in <a href="http://plato.stanford.edu/entries/rorty/">Richard Rorty</a>&#8217;s idea that conceptual change is not effected by arguing from first principles but by telling stories and appealing to imagination. So architecture is not just &#8220;<a href="http://youtu.be/SOSWaJPC2yY?t=32s">ankle bone connected to the leg bone</a>&#8220;–it&#8217;s about allowing programmers to <a href="http://sportsmedicine.about.com/cs/sport_psych/a/aa091700a.htm">visualize</a> making a change.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/14/the-aim-of-architecture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>If I were an architect</title>
		<link>http://www.exampler.com/blog/2012/02/12/if-i-were-an-architect/</link>
		<comments>http://www.exampler.com/blog/2012/02/12/if-i-were-an-architect/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 00:11:08 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/12/if-i-were-an-architect/</guid>
		<description><![CDATA[The client I was at for the last three weeks has enough teams working on a single code base that they have an architect role (indeed, a distinct architecture team). That&#8217;s made me wonder what I would do were I on that team, given my awfully iterative, refactor-your-architecture-into-being biases.
About those biases
The way I was taught [...]]]></description>
			<content:encoded><![CDATA[<p>The client I was at for the last three weeks has enough teams working on a single code base that they have an architect role (indeed, a distinct architecture team). That&#8217;s made me wonder what I would do were I on that team, given my awfully iterative, refactor-your-architecture-into-being biases.</p>
<p><b>About those biases</b></p>
<p>The way I was taught to do architecture was like this:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/w-paHwANlQE?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>You think and think and think, and design an infrastructure that will support the needed features. Then you add the features, one by one. The first part is the hard part, which makes the second part easy.</p>
<p>That approach still has enormous appeal for me, but it&#8217;s really hard to pull it off. The design is so often wrong, and the features don&#8217;t require what you expected, and the infrastructure needs to be changed, but you had no practice changing it, so it&#8217;s hard to change it right, and the lesser programmers who are supposed to be doing the features are standing around tapping their feet, or (worse!) they&#8217;re not standing around, they&#8217;re implementing the features anyway and doing all sorts of hackery to make up for the infrastructure failings, and you were <i>supposed</i> to be this godlike disembodied intelligence that Gets It Right, but now everyone scorns you.</p>
<p>So the safer approach is to start with a single feature and implement it as a &#8220;vertical slice&#8221; (in a web app, from javascript down to database):</p>
<p><img src="http://www.exampler.com/images/arch-1.png"/></p>
<p>Now you implement the next slice:</p>
<p><img src="http://www.exampler.com/images/arch-2.png"/></p>
<p>Amazingly, the second slice does some things quite similar to what the first one did. Either during the slice&#8217;s development or just after, factor that commonality out into shared code:</p>
<p><img src="http://www.exampler.com/images/arch-3.png"/></p>
<p>Repeat the process with each new slice, constantly finding and factoring common behavior:</p>
<p><img src="http://www.exampler.com/images/arch-4.png"/></p>
<p>The end result is a system with an infrastructure:</p>
<p><img src="http://www.exampler.com/images/arch-5.png"/></p>
<p>Moreover, if you do it well, that infrastructure will look like it was designed by some really smart person who provided exactly (and only) the features needed by the current implementation. And it&#8217;s an infrastructure that&#8217;s well tuned to allow the sorts of changes and growth that the business will demand in the future (because it was built by responding to those sorts of changes in the past). </p>
<p>How often does this work <i>superbly</i>? Probably about as often as big-architecture-up-front does, but it seems to be less risky and (I&#8217;m inclined to believe) gets closer to a really good architecture more often. </p>
<p><b>What would I do?</b></p>
<p>My first (and ongoing) task as an architect would be modest. I would pair with people on the implementation of vertical slices, concentrating on being <b>a moving information radiator</b>. In some ways, an architecture is nothing but a bunch of libraries, but any library so restrictive that it can&#8217;t be misused is one that can&#8217;t be used well. People need to know <i>how</i> to use a library, and the best way of teaching them is to sit with them and show them. An effective project has a common style. It&#8217;s everyone&#8217;s job to develop and communicate that style, but it surely seems an architect ought to pay special attention to it.</p>
<p>I would also be <b>an agent of intolerance</b>. Programmers are <i>way</i> too tolerant of programming experiences that grate, that throw up friction to seemingly every action. They tweet that they spent the whole day <a href="http://catb.org/jargon/html/Y/yak-shaving.html">shaving a yak</a> as if that were a mildly humorous thing instead of an outrage. As I programmed with my pair, I would insist we remove the friction for the next person who&#8217;ll have to do something similar. If it means we miss our story estimate (we&#8217;re working on a real vertical slice, remember), so be it: I will model a calm resolve.</p>
<p>If I do this well, all the teams will know they <i>certainly</i> have permission to solve the many small problems that would otherwise slow them down. They won&#8217;t wait for someone else (the architect!) to fix them. </p>
<p><img src="http://www.exampler.com/images/with-ease-small.png"/></p>
<p>Having enlisted all the teams in putting out small fires, would I then leap toward grand architectural visions? Not if I could avoid it. I&#8217;d rather work on solving <b>medium-scale problems</b>. Those are problems that even I wouldn&#8217;t be willing to solve under the auspices of a single story. </p>
<p>Here might be a scenario: as before, I&#8217;m pairing with someone. We notice the need for some abstraction or other solution, one that&#8217;s too big to get right during this story or iteration. We can still do three things, though: (1) imagine what a good solution would look like, (2) imagine what sort of smaller steps might get us there, and (3) take the first step. We end up with a delivered story, some rough plans for the future, and code whose structure is more than the minimum required. For example, we might have pushed code out into a class in a new package/namespace. And we might have changed both our new code and some existing code similar to it to use that new package.</p>
<p>Now, I as architect will actively look for new stories that give excuses to take further steps toward the good solution. I&#8217;ll pair with people on those stories. We&#8217;ll use the stories as an excuse to flesh out the previous solution (in a way that either doesn&#8217;t break previous stories or adapts them to use the fleshed-out solution). </p>
<p>I fully expect that the original &#8220;good solution&#8221; will look somewhat naive partway through this process. That&#8217;s fine. If I&#8217;m an architect, I&#8217;m supposed to be good at adjusting my path as I traverse it.</p>
<p>Eventually, we have a decent solution, some vertical slices that use it, some vertical slices that don&#8217;t use it, and some vertical slices that use it in a sort of halfway, intermediate, not-quite-right way. It&#8217;s my job to make sure code doesn&#8217;t get frozen in that state. Partly that&#8217;s a matter of helping on stories that give us an excuse to fix up some vertical slice. Partly that&#8217;s making sure my pairing results in ever more people who know how to use the solution and are sure to change code to use it when they get the excuse. (That&#8217;s the information radiator and agent of intolerance roles as applied to this one solution.)</p>
<p>What about the <b>grand architectural vision</b>? I don&#8217;t know. I&#8217;ve factored out medium-scale solutions, but I don&#8217;t have the personal experience to know how you get from one major architecture to a completely different one. I want to get vicarious experience in that this year.</p>
<p>So, I&#8217;d be nervous about big picture architecture, were I an architect. However, I&#8217;d take some comfort in knowing that we&#8217;d almost certainly be using frameworks that suggest their own architecture (Rails being a good example of that), and that we wouldn&#8217;t go <i>too</i> far wrong if we just did what our toolset wanted us to. (So, even though I&#8217;m personally fashionably <a href="http://www.exampler.com/blog/2011/10/31/using-functional-style-in-a-ruby-webapp/">skeptical</a> of the value of object-relational mapping layers, I&#8217;d be conservative and use <code>ActiveRecord</code>, though I&#8217;d probably lean toward a development style like <a href="http://avdi.org/devblog/about/">Avdi Grimm</a>&#8217;s <i><a href="http://avdi.org/devblog/2011/11/15/early-access-beta-of-objects-on-rails-now-available-2/">Objects on Rails</a></i>.)</p>
<p>Still, there are two things I&#8217;d emphasize, if only out of fear of my own inexperience:</p>
<ul>
<li>
<p>
I do surely think that <a href="http://www.exampler.com/writing/product-director.pdf">product directors</a> should emphasize doing high-business-value work early and low- or speculative-business-value work later. However, as an architect, I&#8217;d be on the lookout for <a href="http://joearnold.com/2008/03/22/the-minimal-marketable-feature-mmf/">minimal marketable features</a> that would stress the architecture, and I&#8217;d sweet-talk the product director into scheduling them earlier than she otherwise might. (Said sweet-talking would be easier because I&#8217;d always be concentrating on reinforcing the <a href="http://www.exampler.com/blog/2011/05/22/business-value-as-a-boundary-object-2/">gift economy structure</a> that makes Agile work.)
</p>
</li>
<li>
<p>
There exists an architectural change cycle that wastes endless amounts of money: humble programmers work within a given architecture, Architects That Be decree there will be a new one, programmers continue to work in old architecture because the new one isn&#8217;t available, the new architecture appears, programmers begin to use it, it turns out to have serious flaws, now the system has some code in architecture 1 <i>and</i> in architecture 2, all of which will be superseded by the &#8220;This time, definitely&#8221; architecture 3, etc.
</p>
<p>
I&#8217;d hope to force myself to roll out any new architecture gradually (in increments, as it was developed). That imposes extra cost on architecture development and somewhat reduces the possibility of change, but my bet would be the business cost of that constraint would be less than that of a Big Bang rollout.
</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/12/if-i-were-an-architect/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Outgrowing rhetoric-heavy business-facing tests</title>
		<link>http://www.exampler.com/blog/2012/02/12/outgrowing-rhetoric-heavy-business-facing-tests/</link>
		<comments>http://www.exampler.com/blog/2012/02/12/outgrowing-rhetoric-heavy-business-facing-tests/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 17:54:58 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/12/outgrowing-rhetoric-heavy-business-facing-tests/</guid>
		<description><![CDATA[Tools like Fit/FitNesse, Cucumber, and my old Omnigraffle tests allow you to write what I call &#8220;rhetoric-heavy&#8221; business-facing tests. All business-facing tests should be written using nouns and verbs from the language of the business; rhetoric-heavy tests are specialized to situations where people from the business should be able to read (and, much more rarely, [...]]]></description>
			<content:encoded><![CDATA[<p>Tools like Fit/<a href="http://fitnesse.org/">FitNesse</a>, <a href="http://cukes.info/">Cucumber</a>, and my old <a href="http://www.exampler.com/blog/2007/07/13/graphical-workflow-tests-for-rails/">Omnigraffle tests</a> allow you to write what I call &#8220;rhetoric-heavy&#8221; <a href="http://www.exampler.com/old-blog/2003/08/21/#agile-testing-project-1">business-facing</a> tests. All business-facing tests should be written using nouns and verbs from the language of the business; <i>rhetoric-heavy</i> tests are specialized to situations where people from the business should be able to read (and, much more rarely, write) tests easily. Instead of a sentence like the following, friendly to a programming language interpreter:</p>
<p><code><br />
given.default_payment_options_specified_for(:my_account)<br />
</code></p>
<p>&#8230; a test can use a line like this:</p>
<p><code><br />
I have previously specified default payment options.<br />
</code></p>
<p>(The examples are from a description of <a href="http://johnwilger.com/blog/2012/01/21/acceptance-and-integration-testing-with-kookaburra/">Kookaburra</a>, which looks to be a nice Gem for organizing the implementation of Cucumber tests.) </p>
<p>You could argue that rhetoric-heavy tests are useful even if no one from the business ever reads them. That argument might go something like this: &#8220;Perhaps it&#8217;s true that the programmers write the tests based on whiteboard conversations with product owners, and it&#8217;s <i>certainly</i> true that transcribing whiteboard examples into executable tests is easier if you go directly to code, but some of the value of testing is that it takes one out of a code-centric mindset to a what-would-the-user-expect mindset. In the latter mindset, you&#8217;re more likely to have a Eureka! moment and realize some important example had been overlooked. So even programmers should write Cucumber tests.&#8221;</p>
<p>I&#8217;m skeptical. I think even Cucumber scenarios or Fit tables are too constraining and formal to encourage Aha! moments the way that a whiteboard and conversation do. Therefore, I&#8217;m going to assume for this post that you wouldn&#8217;t do rhetoric-heavy tests unless someone from the business actually wants to read them. </p>
<p>Now: when would they <i>most</i> want to read them? In the beginning of the project, I think. That&#8217;s when the business representative is most likely to be skeptical of the team&#8217;s ability or desire to deliver business value. That&#8217;s when the programmers are most likely to misunderstand the business representative (because they haven&#8217;t learned the required domain knowledge). And it&#8217;s when the business representative is worst at explaining domain knowledge in ways that head off programmer misunderstandings. So that&#8217;s when it&#8217;d be most useful for the business representative to pore over the tests and say, &#8220;Wait! This test is wrong!&#8221;</p>
<p>Fine. But what about six months later? In my limited experience, the need to read tests will have declined greatly. (All of the reasons in the previous paragraph will have much less force.) If the business representative is still reading tests, it&#8217;s much more likely to be pro forma or a matter of habit: once-necessary <a href="http://www.englishcompanion.com/assignments/heaneyweeklypoem.htm">scaffolding</a> that hasn&#8217;t yet been taken down. </p>
<p>Because process is so hard to remove, I suspect that everyone involved will only tardily (or never) take the step of saying &#8220;We don&#8217;t need cucumber tests. We don&#8217;t need to write the fixturing code that adapts the rhetorically friendly test steps to actual test APIs called by actual test code.&#8221; People will keep writing this:</p>
<script src="https://gist.github.com/1809865.js?file=gistfile1.feature"></script>
<p>&#8230; when they could be writing something like this:</p>
<script src="https://gist.github.com/1809875.js?file=gistfile1.rb"></script>
<p>That latter (or something even more unit-test-like) makes tests into actual code that fits more nicely into the programmer&#8217;s usual flow.</p>
<p>How often is my suspicion true? How often do people keep doing rhetoric-heavy tests long after the rhetoric has ceased being useful?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/12/outgrowing-rhetoric-heavy-business-facing-tests/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Looking for information about composed refactorings</title>
		<link>http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/</link>
		<comments>http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 03:56:29 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/</guid>
		<description><![CDATA[Even after all these years, I take too-big steps while coding. In less finicky languages (or finicky languages with good tool support), I can get away with it, but I can&#8217;t do that in C++ (a language I&#8217;ve been working in the past two weeks). So I&#8217;ve had to think more explicitly about taking baby [...]]]></description>
			<content:encoded><![CDATA[<p>Even after all these years, I take too-big steps while coding. In less finicky languages (or finicky languages with good tool support), I can get away with it, but I can&#8217;t do that in C++ (a language I&#8217;ve been working in the past two weeks). So I&#8217;ve had to think more explicitly about taking baby steps. And that&#8217;s made me realize that there must be some refactoring literature out there that I&#8217;ve overlooked or forgotten. That literature would talk about composing small-scale refactorings into medium-scale changes. The only example I can think of is <a href="https://twitter.com/#!/joshuakerievsky">Joshua Kerievsky</a>&#8217;s <i><a href="http://industriallogic.com/xp/refactoring/">Refactoring to Patterns</a></i>. I like that book a lot, but it&#8217;s about certain types of medium-scale refactorings (those that result in classic design patterns), and there are other, more mundane sorts.</p>
<p>Let me give an example. This past Friday, I was pairing with <a href="https://twitter.com/#!/emonical">Edward Monical-Vuylsteke</a> on what amounts to a desktop GUI app. Call the class in question <code>Controller</code>, as it&#8217;s roughly a Controller in the Model-View-Controller pattern. Part of what <code>Controller</code> did was <a href="http://c2.com/cgi/wiki?ObserverPattern">observe</a> what I&#8217;ll call a <code>ValueTweaker</code> UI widget. When the user asked for a change to the value (that is, tweaked some bit of UI), the <code>Controller</code> would observe that, cogitate about it a bit, and then perhaps tell an object deeper in the system to make the corresponding change in some hardware somewhere. </p>
<p>That was the state of things at the end of Story A. Story B asked us to add a second <code>ValueTweaker</code> to let the user change a different hardware value (of the same type as the first, but reachable via a wildly different low-level interface). The change from &#8220;one&#8221; to &#8220;two&#8221; was a pretty strong hint that the <code>Controller</code> should be split into three objects of two classes:</p>
<ul>
<li>
<p>
A <code>ValueController</code> that would handle only the task of mediating between a <code>ValueTweaker</code> on the UI and the hardware value described in story A.
</p>
</li>
<li>
<p>
A second <code>ValueController</code> that would do the same job for story B&#8217;s new value. The difference between the two <code>ValueControllers</code> wouldn&#8217;t be in their code but in which lower-level objects they&#8217;d be connected to.
</p>
</li>
<li>
<p>
A simplified <code>Controller</code> that would continue to do whatever else the original <code>Controller</code> had done.
</p>
</li>
</ul>
<p>The question is: how to split one class into two? The way we did it was to follow these steps (if I remember right):</p>
<ol>
<li>
<p>
Create an empty <code>ValueController</code> class with an empty <code>ValueController</code> test suite. Have <code>Controller</code> be its subclass. All the <code>Controller</code> tests still pass.
</p>
</li>
<li>
<p>
One by one, move the <code>Controller</code> tests that are about controlling values up into the <code>ValueController</code> test suite. Move the code to make them pass.
</p>
</li>
<li>
<p>
When that&#8217;s done, we still have a <code>Controller</code> object that does everything it used to do. We also have an end-to-end test that checks that a tweak of the UI propagates down into the system to make a change and also propagates back up to the UI to show that the change happened.
</p>
</li>
<li>
<p>
Change the end-to-end test so that it no longer refers to <code>Controller</code> but only to <code>ValueController</code>.
</p>
</li>
<li>
<p>
Change the object that wires up this whole subsystem so that it (1) creates both a <code>Controller</code> and <code>ValueController</code> object, (2) connects the <code>ValueController</code> to the <code>ValueTweaker</code> and to the appropriate object down toward the hardware, and (3) continues to connect the <code>Controller</code> to the objects that don&#8217;t have anything to do with changing the tweakable value. Confirm (manually) that both tweaking and the remaining <code>Controller</code> end-to-end behaviors work.
</p>
</li>
<li>
<p>
Since it no longer uses its superclass&#8217;s behavior, change <code>Controller</code> so that it&#8217;s no longer a subclass of <code>ValueController</code>.
</p>
</li>
<li>
<p>
Change the wire-up-the-whole-subsystem object so that it also makes story B&#8217;s vertical slice (new <code>ValueTweaker</code>, new <code>ValueController</code>, new connection to the hardware). Confirm manually.
</p>
</li>
</ol>
<p>I consider that a medium-scale refactoring. It&#8217;s not something that even a smart IDE can do for you in one safe step, but it&#8217;s still something that (even in C++!) can easily be finished in less than an afternoon.</p>
<p>So: where are such medium-scale refactorings documented?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Two phase release planning</title>
		<link>http://www.exampler.com/blog/2012/02/04/two-phase-release-planning/</link>
		<comments>http://www.exampler.com/blog/2012/02/04/two-phase-release-planning/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 19:56:33 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2012/02/04/two-phase-release-planning/</guid>
		<description><![CDATA[A twitter conversation between Zee Spencer and Ron Jeffries makes me think I&#8217;ve never written down my two-phase approach to release planning.
Phase 1: Someone wants something. They have a problem to be solved by a software system. There are probably a few key features that are needed, perhaps buried in a mass of requirements that [...]]]></description>
			<content:encoded><![CDATA[<p>A twitter conversation between <a href="http://www.twitter.com/zspencer">Zee Spencer</a> and <a href="http://www.twitter.com/RonJeffries">Ron Jeffries</a> makes me think I&#8217;ve never written down my two-phase approach to release planning.</p>
<p><b>Phase 1</b>: Someone wants something. They have a problem to be solved by a software system. There are probably a few key features that are needed, perhaps buried in a mass of requirements that pretend to more authority than they&#8217;ll turn out to have. If the key features aren&#8217;t delivered, the system isn&#8217;t worth having. (Or the new release of an existing system isn&#8217;t worth having - it doesn&#8217;t matter.) </p>
<p>The person who wants the system (or wants to sell it) might have a release date in mind. It might be based on real constraints, like the beginning of a school year or the Christmas sales season. Or it might be arbitrary. Doesn&#8217;t matter to me.</p>
<p>At this point, the development team&#8217;s job is to answer the question: can <i>this</i> team produce a <i>respectable</i> implementation of that system by that date?</p>
<p>&#8220;Respectable&#8221; is a somewhat tricky idea. One conceptually easy part of it is &#8220;provides the key features&#8221;. Another is, embarrassingly, fuzzier: more about whether something can be provided that feels like a &#8220;whole&#8221; rather than a collection of parts. This is the kind of thing that Jeff Patton&#8217;s <a href="http://www.agileproductdesign.com/blog/the_new_backlog.html">story mapping</a> is about. It also includes Jeff&#8217;s idea of the <a href="http://agileproductdesign.com/blog/dont_know_what_i_want.html">distinction</a> between incremental development (where you develop by bolting on features one at a time) and iterative development (where you get something complete-for-some-real-purpose done quickly but crudely, then add flesh to the <a href="http://alistair.cockburn.us/Walking+skeleton">walking skeleton</a>.)</p>
<p>The answer to the &#8220;can it be done by that date?&#8221; question is going to be something of a leap of faith. The estimate that &#8220;we can do that by then&#8221; isn&#8217;t going to be as reliable as, say, the use of <a href="http://martinfowler.com/bliki/YesterdaysWeather.html">yesterday&#8217;s weather</a> in iteration planning. </p>
<p>One way to get a better answer is to just go ahead and start the project. As <a href="http://kaner.com/">Cem Kaner</a> has said, you know less about the project right now than you ever will again. Spend a month building the product, <i>then</i> ask: can it be built by the desired date? You&#8217;ll get a much better answer. [Note: I&#8217;d favor <i>really</i> starting to build the project, just as if you&#8217;d made a two-year commitment, rather than doing some pilot study. I&#8217;d be suspicious that a pilot study would ignore a lot of the grinding details that take up a lot of project time.] The risk here, though, is that an answer of &#8220;well, it turns out we won&#8217;t be able to do it&#8221; will be unacceptable. </p>
<p>(Whether estimating at the beginning or after a month, I&#8217;d personally err on the conservative side because my experience is (1) the development team is more likely to be optimistic than pessimistic, and (2) I favor pleasant surprises - &#8220;We can do more! Or release sooner!&#8221; - over unpleasant ones.)</p>
<p><b>Phase 2</b>: At this point, there&#8217;s a commitment: a respectable product will be released on a particular date. Now those paying for the product have to accept a brute fact: they will not know, until close to that date, just what that product will look like (its feature list). What they <i>do</i> know is that <b>it will be the best product this development team can produce by that date</b>. It&#8217;ll be the best product because the team commits to being flexible enough to put features into the product in any order. Therefore, the most valuable features can go in first, then the less valuable ones, then&#8230; </p>
<p>So, in this phase, you can stop worrying about anything but the near horizon. For much of the project, all that&#8217;s required is occasional stock-taking. (&#8221;Do we still think we&#8217;ll have a respectable product by the release date?&#8221;) Toward the end, there might be some need to predict more precisely than &#8220;best possible, given this team and that date&#8221;. Not everything that needs to be done before release might be as changeable as the code. (It&#8217;s harder to un-train a salesperson than to turn off the code for a feature that won&#8217;t be done in time.) But you&#8217;ll be in a good position to make good predictions by then.</p>
<p>&#8212;&#8212;&#8211;</p>
<p>My success selling this approach has been mixed. People really like the feeling of certainty, even if it&#8217;s based on nothing more than a grand collective pretending.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2012/02/04/two-phase-release-planning/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

