<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Always Be Exploring</title>
	<atom:link href="http://trevorburnham.com/2009/12/29/always-be-exploring/feed/" rel="self" type="application/rss+xml" />
	<link>http://trevorburnham.com/2009/12/29/always-be-exploring/</link>
	<description>Sure, it works in practice...</description>
	<lastBuildDate>Sat, 01 May 2010 22:42:47 -0400</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Peter Boothe</title>
		<link>http://trevorburnham.com/2009/12/29/always-be-exploring/comment-page-1/#comment-11</link>
		<dc:creator>Peter Boothe</dc:creator>
		<pubDate>Wed, 30 Dec 2009 03:22:19 +0000</pubDate>
		<guid isPermaLink="false">http://trevorburnham.com/?p=100#comment-11</guid>
		<description>I&#039;m glad you liked it, and especially glad that it stirred up something in your brain!

I think I agree with you in broad strokes - testing and experimentation and exploratory programming are large reasons for increased speed.  But it&#039;s important to emphasize that it&#039;s the underlying fluency and ability to make small changes quickly that makes those techniques useful.  You can&#039;t be agile if you aren&#039;t small and quick.  If that quickness weren&#039;t there, then exploratory programming would have a *huge* time cost, and would not be nearly so useful.  With larger time costs comes an increasing tendency to do a BDUF and that leads to decreased speeds, which leads to larger time costs, which leads to a greater tendency to do a BDUF, which leads to....

Anyhow, it&#039;s exactly the native fluency and willingness to experiment that I need to impart to my students, but I am unclear how to teach it.  It seems like a &quot;knack&quot; more than a traditional body of knowledge or a skill, which means that the best I can currently do is repeatedly throw students at problems which benefit from that knack until they start to develop the knack.  But that&#039;s basically hazing, and surely there is some less cruel way to go about imparting an exploratory attitude and fluency...</description>
		<content:encoded><![CDATA[<p>I’m glad you liked it, and especially glad that it stirred up something in your brain!</p>
<p>I think I agree with you in broad strokes — testing and experimentation and exploratory programming are large reasons for increased speed.  But it’s important to emphasize that it’s the underlying fluency and ability to make small changes quickly that makes those techniques useful.  You can’t be agile if you aren’t small and quick.  If that quickness weren’t there, then exploratory programming would have a *huge* time cost, and would not be nearly so useful.  With larger time costs comes an increasing tendency to do a BDUF and that leads to decreased speeds, which leads to larger time costs, which leads to a greater tendency to do a BDUF, which leads to.…</p>
<p>Anyhow, it’s exactly the native fluency and willingness to experiment that I need to impart to my students, but I am unclear how to teach it.  It seems like a “knack” more than a traditional body of knowledge or a skill, which means that the best I can currently do is repeatedly throw students at problems which benefit from that knack until they start to develop the knack.  But that’s basically hazing, and surely there is some less cruel way to go about imparting an exploratory attitude and fluency…</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Craig</title>
		<link>http://trevorburnham.com/2009/12/29/always-be-exploring/comment-page-1/#comment-10</link>
		<dc:creator>Craig</dc:creator>
		<pubDate>Wed, 30 Dec 2009 01:34:40 +0000</pubDate>
		<guid isPermaLink="false">http://trevorburnham.com/?p=100#comment-10</guid>
		<description>There is some truth here, also some truth in Pete&#039;s post.

Coding fast is a good thing no doubt, but it&#039;s hardly a be all end all.

I rank the following as far more important:

Thinking clearly about your problem and the abstractions you will use for solving it is the first and foremost task for a software engineer.
 
Decomposition, which is related to good abstractions, is the ability to find the relevant (independent) sub-problems and solve them (independently).

This ability then goes hand in hand with interface design, and here I do not mean UI design, but API design. Consistent, well-thought through interfaces that are easy to learn, easy to remember, anticipate a client&#039;s needs, and are easily composable, are a key to good software.

Coding is the thing you do at the end when the problem is solved.

That said, you and Pete give a good description of how I prototype. This is almost always understood to be throw away code though, and is not always necessary.

The &quot;fast coding&quot; thing is nice when:
1) I don&#039;t understand the technology I&#039;m working with very well.
2) When there is a tricky algorithmic aspect to what I&#039;m doing.
3) When I&#039;m developing a new technique or idiom.
4) When I&#039;m not exactly sure where I&#039;m going or don&#039;t feel like thinking through a problem. After all it is fun to hack sometimes.

Clearly #1-#3 imply smaller chunks of code, while #4 is basically cowboy coding and probably should be discouraged for &quot;real&quot; projects.

And yes, test-driven code is an asset. It should be obvious that good abstractions, good decomposition, and good interfaces aide the test-driven methodology.</description>
		<content:encoded><![CDATA[<p>There is some truth here, also some truth in Pete’s post.</p>
<p>Coding fast is a good thing no doubt, but it’s hardly a be all end all.</p>
<p>I rank the following as far more important:</p>
<p>Thinking clearly about your problem and the abstractions you will use for solving it is the first and foremost task for a software engineer.</p>
<p>Decomposition, which is related to good abstractions, is the ability to find the relevant (independent) sub-problems and solve them (independently).</p>
<p>This ability then goes hand in hand with interface design, and here I do not mean UI design, but API design. Consistent, well-thought through interfaces that are easy to learn, easy to remember, anticipate a client’s needs, and are easily composable, are a key to good software.</p>
<p>Coding is the thing you do at the end when the problem is solved.</p>
<p>That said, you and Pete give a good description of how I prototype. This is almost always understood to be throw away code though, and is not always necessary.</p>
<p>The “fast coding” thing is nice when:<br />
1) I don’t understand the technology I’m working with very well.<br />
2) When there is a tricky algorithmic aspect to what I’m doing.<br />
3) When I’m developing a new technique or idiom.<br />
4) When I’m not exactly sure where I’m going or don’t feel like thinking through a problem. After all it is fun to hack sometimes.</p>
<p>Clearly #1-#3 imply smaller chunks of code, while #4 is basically cowboy coding and probably should be discouraged for “real” projects.</p>
<p>And yes, test-driven code is an asset. It should be obvious that good abstractions, good decomposition, and good interfaces aide the test-driven methodology.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
