<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4207083292437591023</id><updated>2011-10-12T11:27:20.700-07:00</updated><category term='ethics'/><category term='business'/><category term='universal grammar'/><category term='democracy'/><category term='linguistics'/><category term='mysql'/><category term='XP'/><category term='snow leopard'/><category term='jbrains'/><category term='craftsman'/><category term='agile skills'/><category term='mission critical'/><category term='titles'/><category term='mingus'/><category term='apprentice'/><category term='sudoku'/><category term='dialectic'/><category term='agile'/><category term='projection'/><category term='rails'/><category term='fud-on-agile'/><category term='religion'/><category term='roles'/><category term='sacred'/><category term='eXtremeProgramming'/><category term='life-death'/><category term='agile-obstacles'/><category term='science'/><category term='low hanging fruit'/><title type='text'>FloorSweepings</title><subtitle type='html'>Any sufficiently advanced technology is 99% perspiration.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-2017228721255881626</id><published>2011-09-21T19:39:00.000-07:00</published><updated>2011-10-12T11:27:20.712-07:00</updated><title type='text'>What am I looking for?</title><content type='html'>20110921: &amp;nbsp; I'm looking for work. &amp;nbsp;Here's what I'm thinking would be ideal (this changes because I learn something new on every project - I'll keep this post up to date):&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A long term (contract or perm) engagement with a team working on legacy apps. &amp;nbsp;That's where the real challenge is - greenfield is easy. &amp;nbsp;I'm dead serious about this. &amp;nbsp;I know: every developer wants to get in on the ground floor of the next big cloud/social/multiplatform/HTML5/your-hot-language-here&lt;your-dynamic-language-here&gt; killer app. &amp;nbsp;Not me. &amp;nbsp;I do that at home. &amp;nbsp;At work I want a challenge of a particular type: the combination of technology and social interaction that is Agile and the jungle of legacy code.&lt;/your-dynamic-language-here&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice I say "team". &amp;nbsp;Ideally this would be a functioning XP team (if you think I'm talking about an old but still kicking OS, our relationship is already in trouble). &amp;nbsp;Or - better: a newly formed team in an organization that sincerely wants to go Agile and understands that Scrum is about management, not development: &amp;nbsp;XP is a Agile methodology for developers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I recently had a disastrous stint with a company that did not understand Agile. &amp;nbsp;I was actually told not to talk to other developers about what I was working on, because they were "busy". &amp;nbsp;Right. &amp;nbsp;These folks misrepresented themselves as open to Agile. &amp;nbsp;They weren't - or more charitably, maybe they just didn't know. Oh sure, they had daily standups. &amp;nbsp;But in terms of development process they were mostly in the Cowboy/Hero mode.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a matter of fact, I'm a terrific team member and mentor. &amp;nbsp;I always work Test-Driven (TDD and BDD) even if nobody else is, but I'm glad to show teammates how productive it can be - I gained some converts on the project I'm now rolling off. &amp;nbsp;(If you have a problem with TDD/BDD - again, our relationship is already in trouble.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am absolutely not interested in being an architect, QA tester, business analyst, DBA, Websphere administrator, etc., etc. &amp;nbsp;I'm a software developer: &amp;nbsp;J2EE, DotNET or Rails, frontend, middle or backend - ready willing to learn new OO or functional languages and frameworks and work in new domains. &amp;nbsp;(Of course, as an XP developer I have done all of the jobs above - as part of my normal development duties.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yes - I need to put food on the table and in bad times I take bad jobs. &amp;nbsp;Fortunately this is not a bad time. &amp;nbsp;But you'll have to be honest with me: &amp;nbsp;if you think Agile - XP in particular - is a bad idea, or it's being forced down your throat by Corporate and you'll show them!, better you don't even phonescreen me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;20110922: &amp;nbsp;Did I mention that I live and work in Chicago and will not travel or relocate?&lt;br /&gt;&lt;br /&gt;20111011: &amp;nbsp;Kent Beck recently said a lot of what I'm thinking &amp;nbsp;in&amp;nbsp;&lt;a href="http://www.threeriversinstitute.org/blog/?p=590"&gt;My Ideal Job Description&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-2017228721255881626?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/2017228721255881626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2011/09/what-am-i-looking-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2017228721255881626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2017228721255881626'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2011/09/what-am-i-looking-for.html' title='What am I looking for?'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5926121850647881677</id><published>2010-07-13T10:58:00.000-07:00</published><updated>2010-07-13T10:58:41.033-07:00</updated><title type='text'>Testing and Design</title><content type='html'>Just watched a great video - &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2010/07/the-deep-synergy-between-testability-and-good-design.html"&gt;The Deep Synergy Between Testability and Good Design,&lt;/a&gt; by Michael Feathers. &amp;nbsp;Combining this with JBrains' blog post &lt;a href="http://www.jbrains.ca/permalink/285"&gt;How test-driven development works (and more)&lt;/a&gt;&amp;nbsp;and his video &lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;Integration Tests are a Scam&lt;/a&gt;&amp;nbsp;would make an excellent intro to TDD, and maybe I'll get a chance to use it soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5926121850647881677?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5926121850647881677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/testing-and-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5926121850647881677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5926121850647881677'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/testing-and-design.html' title='Testing and Design'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-794606296749810132</id><published>2010-07-07T09:00:00.000-07:00</published><updated>2010-07-07T09:00:44.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='ethics'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><title type='text'>Not so fast, Otaku</title><content type='html'>That last post was a little over the top, particularly the part about "good, true and beautiful". &lt;br /&gt;&lt;br /&gt;Strike "good".&lt;br /&gt;&lt;br /&gt;Although XP does have an ethical component in terms of how team members should relate to each other (and, to some extent, to the customer), &amp;nbsp;it doesn't deal with some wider issues.&lt;br /&gt;&lt;br /&gt;You might never do a website for Kim Jong Il or Osama bin Laden. &amp;nbsp;That's an easy call.&lt;br /&gt;&lt;br /&gt;What about Goldman Sachs or BP?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-794606296749810132?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/794606296749810132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/not-so-fast-otaku.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/794606296749810132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/794606296749810132'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/not-so-fast-otaku.html' title='Not so fast, Otaku'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1318674132127010309</id><published>2010-07-06T22:43:00.000-07:00</published><updated>2010-07-06T23:38:25.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsman'/><category scheme='http://www.blogger.com/atom/ns#' term='sacred'/><category scheme='http://www.blogger.com/atom/ns#' term='apprentice'/><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='democracy'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>That's me at the pairing station, practicing my religion</title><content type='html'>The metaphor of programmer-as-craftsman and the concept of apprenticeship are great up to a point ... and that point is where it gets medieval.&lt;br /&gt;&lt;br /&gt;I don't think software development is a craft - I think it can and should be (and - in XP teams - is) an alloy of art, science and religion.&lt;br /&gt;&lt;br /&gt;For models, I look first to the Renaissance, to people like Michelangelo, who studied anatomy as seriously as any practitioners of "scientific medicine" of the time, &amp;nbsp;and to DaVinci, who studied physics equally seriously. &amp;nbsp;They were both also brilliant artists.&lt;br /&gt;&lt;br /&gt;The medieval role that comes closest to a model for me is not the craftsman but the monk &amp;nbsp;- particularly the scribe whose faith in a divine perfection drives the work.&lt;br /&gt;&lt;br /&gt;But the scribe is a soloist. &amp;nbsp;And so were Michelangelo and DaVinci. &lt;br /&gt;&lt;br /&gt;Renaissance artists who weren't simply soloists were businessmen. &amp;nbsp;The master/journeyman/apprentice hierarchy in the art biz survives even now - e.g., Andy Warhol and his "factory".&lt;br /&gt;&lt;br /&gt;What happens when software development organizations use the guild as a model? &amp;nbsp;In two big "Agile" consultancies I know of and will not name here, the result is ... architects. &amp;nbsp;Oh yes, they code. &amp;nbsp;But they also do BDUF. &amp;nbsp;And they radiate "authority". &amp;nbsp;This doesn't meet my understanding of Agile.&lt;br /&gt;&lt;br /&gt;XP is not a solo activity but a communal religious action with a particularly clear vision of the sacred. &amp;nbsp;In OO we have an esthetically and logically balanced basis for design, still evolving. &amp;nbsp;In XP, we have a concept of perfection - the sacred - that is dynamic and minimalist: &amp;nbsp;the simplest system that does exactly what the customer wants, no more no less. &amp;nbsp; (I'm using the term "sacred" here the way social anthropologists since Durkheim have used it - there's nothing intrinsically supernatural about it, &amp;nbsp;except to the extent that symbols themselves are supernatural [for which I will make a case elsewhere].)&lt;br /&gt;&lt;br /&gt;The closest modern analogy might be a Charismatic congregation (Catholic, Protestant or ...?) &amp;nbsp;with a lay leader who is not a priest (architect), who has no special connection to the sacred. &amp;nbsp;These groups are radically democratic.&lt;br /&gt;&lt;br /&gt;What makes XP more than any of these models is the unification of art, religion, science and commerce.&lt;br /&gt;&lt;br /&gt;It's the wisdom of a small crowd focused on the good, the true and the beautiful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1318674132127010309?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1318674132127010309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/thats-me-at-pairing-station-practicing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1318674132127010309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1318674132127010309'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/thats-me-at-pairing-station-practicing.html' title='That&apos;s me at the pairing station, practicing my religion'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-7243541686452268050</id><published>2010-07-06T08:35:00.001-07:00</published><updated>2010-07-06T22:47:20.102-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='jbrains'/><title type='text'>Nano-nit</title><content type='html'>As I've said before, &lt;a href="http://jbrains.ca/"&gt;JBrains&lt;/a&gt; is a freakin' genius. &amp;nbsp;I've never disagreed with anything he's said - except now for this one trivial point: &amp;nbsp;about 27 minutes into&amp;nbsp;&lt;a href="http://blogs.agilefaqs.com/2010/07/03/stop-it-or-i-will-bury-you-alive-in-a-box/"&gt;"Stop It Or I will Bury You Alive In A Box"&lt;/a&gt;&lt;span style="color: red;"&gt;*&lt;/span&gt;&amp;nbsp;at &lt;a href="http://www.agileindia.org/agilebengaluru2010"&gt;Agile Bengaluru 2010&lt;/a&gt;, &amp;nbsp;he says that unit tests without assertions test nothing.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, it's not quite nothing: &amp;nbsp;if the test actually executes some target code and doesn't throw an exception, it's testing &lt;i&gt;something&lt;/i&gt;. &amp;nbsp; But it's nano-next-to-nothing, it's still crap, and JB is still right.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;*&lt;/span&gt;&amp;nbsp;Okay, two nano-nits: &amp;nbsp;this is not correct title case.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;------------------&lt;br /&gt;&lt;br /&gt;P.S. &amp;nbsp;I forgot to say that you &lt;i&gt;have to &lt;/i&gt;watch this whole presentation. &amp;nbsp;JB is - as usual - moving the state of our art-science forward.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-7243541686452268050?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/7243541686452268050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/nano-nit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7243541686452268050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7243541686452268050'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/07/nano-nit.html' title='Nano-nit'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-2483493197804967554</id><published>2010-06-16T11:47:00.000-07:00</published><updated>2010-06-21T09:45:40.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='agile-obstacles'/><title type='text'>More hardlining</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial, verdana, helvetica; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;Matt Heusser says&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If your company is just starting to talk about "agiling up" it's software process, my advice is to forget about timeboxed iterations and test driven development. Oh yes, those are good things, and they can enable agile software development, but let's be very clear: &amp;nbsp;if the team isn't self-directed, cross-functional and respecting of its people, it's not Agile software development. It's ... something else.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Hold on to those ideals. Communicate about them clearly. Fight for them, leave no room for misunderstanding, and you might just make your little part of the software development world a better place.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I think that is noble, and worth fighting for.&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read &lt;a href="http://bit.ly/9x5bxA"&gt;the whole thing &lt;/a&gt;by Matt Heusser.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-2483493197804967554?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/2483493197804967554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/06/more-hardlining.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2483493197804967554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2483493197804967554'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/06/more-hardlining.html' title='More hardlining'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-2943289091629894297</id><published>2010-06-14T07:38:00.000-07:00</published><updated>2010-07-02T11:26:48.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='agile-obstacles'/><category scheme='http://www.blogger.com/atom/ns#' term='eXtremeProgramming'/><title type='text'>Hardlining</title><content type='html'>&lt;i&gt;I wrote the following toward the end of my last contract. &amp;nbsp;I hesitated to post it because I didn't want to offend the folks I worked with, and because I worried about the effect it might have on my own marketing. &amp;nbsp;With some distance now, it doesn't seem that offensive, &amp;nbsp;and if it eliminates some potential opportunities, they're likely to be in places I wouldn't want to spend 40 hours a week in anyway.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;My current "engagement" has turned me into a hard liner. I was burned, and I saw the light.  I'm not going to go into details, because I don't want to be blacklisted as a troublemaker.&lt;br /&gt;&lt;br /&gt;But I suspect I have no choice:  I am a troublemaker.&lt;br /&gt;&lt;br /&gt;I'm a true believer, and what I believe is this:&lt;br /&gt;&lt;br /&gt;There is no Agile but XP and success is its profit.&lt;br /&gt;&lt;br /&gt;Anything else that calls itself Agile is just a compromise with an increasingly myopic business/bureaucratic culture obsessed with short-term profit and the illusion of control and predictability via hierarchy. &lt;br /&gt;&lt;br /&gt;Scrum may rein in some of the worst tendencies of that culture, but it doesn't get at the heart of the problem.&lt;br /&gt;&lt;br /&gt;XP is about two things: one is communication - the dynamic perfection of process.&lt;br /&gt;&lt;br /&gt;The other is perfect software. &lt;br /&gt;&lt;br /&gt;This is not the static &lt;a href="http://fleursdumal.org/poem/228"&gt;Baudelairean&lt;/a&gt; perfection of &lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;BDUF&lt;/a&gt;. &amp;nbsp;It's dynamic, minimalist, infinitely flexible. &amp;nbsp;To be an XP developer is to be a Zen calligrapher inscribing sacred language, to apply all one's intellect and energy to creating and maintaining software that does exactly what the stories say, no more, no less.&lt;br /&gt;&lt;br /&gt;XP originated in the context of OO. &amp;nbsp;Unlike relational databases, &amp;nbsp;OO didn't spring full-blown from simple, elegant mathematical models, but it has evolved into something damn close. &lt;br /&gt;&lt;br /&gt;This vocation is absolutely incompatible with the hierarchical/centralized model in which coders have no autonomy.&lt;br /&gt;&lt;br /&gt;The bureaucratic model runs on the differential presence of one human emotion: guilt. &amp;nbsp;You rise to the top of a bureaucracy by becoming (or being born) a sociopath, &amp;nbsp; pushing risk downward. &amp;nbsp;Those stuck at the bottom accept this burden because they are guilty. The vision of future reward, &amp;nbsp;through graduation to&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Protestant_work_ethic"&gt;heaven&lt;/a&gt;, &amp;nbsp;winning the lottery, or the application of sheer &lt;a href="http://en.wikipedia.org/wiki/Horatio_Alger,_Jr."&gt;pluck and grit&lt;/a&gt;, is a consolation, not a motivating force.&lt;br /&gt;&lt;br /&gt;I've been there - recently - I know exactly how that guilt works. People who work in the environment I'm talking about &amp;nbsp;would recognize the power of that guilt - if not for the protective psychological repressions and distractions - the bread and circuses - that make it bearable.&lt;br /&gt;&lt;br /&gt;XP flourishes in startups and small businesses that can't afford IT departments. &lt;br /&gt;&lt;br /&gt;But I want to take it into the belly of the beast. &amp;nbsp;XP is strong medicine, tough love.&lt;br /&gt;&lt;br /&gt;Part II - Heroism&lt;br /&gt;&lt;br /&gt;Waitaminit! &amp;nbsp;The success of TradDev [i.e. &amp;nbsp;waterfall/hierarachy/cmd&amp;amp;ctl] is not all about fear. &amp;nbsp;There's a carrot, not just a stick. &amp;nbsp;It's the solitary pleasure of heroism. &amp;nbsp; And the dark side of that is empire building and job-security-thru-opacity.&lt;br /&gt;&lt;br /&gt;I had a heroism moment of my own: &amp;nbsp;successfully refactored some legacy Flex code without a net - i.e., no tests. &amp;nbsp;That was scary, and given the pathological coupling of the undocumented/untested codebase, it could have been a disaster. &amp;nbsp;(Actually, it still could be. &amp;nbsp;While I'm on that subject, instead of &lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;working effectively with legacy code&lt;/a&gt; by building a test harness around it, the team is drawing diagrams to document it. This will just contribute to its rigidity.)&lt;br /&gt;...&lt;br /&gt;As I write this, two heroes are talking near my desk. &amp;nbsp;It's a happy conversation. They're reinforcing each other's sense of being on top of things, and the buzz of working without a net in a risky environment. So what if it's about BDUF?&lt;br /&gt;...&lt;br /&gt;Now I'm idle. &amp;nbsp;No corkboard with cards for this iteration waiting to be picked up, &amp;nbsp;no pairing. &amp;nbsp;Waiting to get a &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt; (i.e., a task) assigned to me by our manager, who's working from home. &amp;nbsp;Yet another example of waste in the TradDev world. &amp;nbsp;I'm here waiting, so I'll bill for it, but it feels nasty. &amp;nbsp;If I offered to go home, what would happen?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-2943289091629894297?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/2943289091629894297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/06/hardliner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2943289091629894297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2943289091629894297'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/06/hardliner.html' title='Hardlining'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5865179169388483912</id><published>2010-05-21T13:00:00.000-07:00</published><updated>2010-05-21T13:03:33.181-07:00</updated><title type='text'>Agile Manifesto Reprise - This Time it's Personal</title><content type='html'>Stole this from &lt;a href="http://bit.ly/RJsAgileManifesto-Personal"&gt;Ron Jeffries&lt;/a&gt;&amp;nbsp;and I'm posting the whole thing cuz it's my story too except for maybe the cars:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="qt" id="qhide_489834" style="display: block;"&gt;&lt;i&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Where will YOU be in 3 years?&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;i&gt;Well, in my case I want to be alive and in good mental and physical&lt;br /&gt;health.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Looking back over various places I might have "wanted" to be, here's&lt;br /&gt;what I think today:&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I thought I wanted promotions, to be given more "power" as a&lt;br /&gt;recognition of how good I was. This reflected the organization I was&lt;br /&gt;in, which valued power. I was wrong. I didn't get a lot of joy from&lt;br /&gt;power. I did get joy from being able to solve harder and larger&lt;br /&gt;problems by having more people working on them with me.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I thought I wanted more money. This reflected my good taste i&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;n cars,&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt; and has certainly given me some pleasure. However, the highest&lt;br /&gt;paying jobs I have had were also the least pleasurable, and&lt;br /&gt;ultimately my lack of pleasure in them caused me to perform poorly.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I thought I wanted more women. You can imagine how that worked out.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I thought I wanted to be like people I admired. Many of them were&lt;br /&gt;major jerks (even more so than I am naturally) and emulating them&lt;br /&gt;did not serve me well.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;What I want, today, is to spend every possible moment doing things&lt;br /&gt;that I enjoy, with people I enjoy doing them with. I enjoy doing&lt;br /&gt;things that I do well, and things where I can sense that I am&lt;br /&gt;improving. I enjoy doing things that other people appreciate.&amp;nbsp;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5865179169388483912?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5865179169388483912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/agile-manifesto-reprise-this-time-its.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5865179169388483912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5865179169388483912'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/agile-manifesto-reprise-this-time-its.html' title='Agile Manifesto Reprise - This Time it&apos;s Personal'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1959228071234334815</id><published>2010-05-17T09:45:00.000-07:00</published><updated>2010-05-17T09:45:12.556-07:00</updated><title type='text'>Clarification of previous post</title><content type='html'>Actually, &lt;a href="http://bit.ly/EfficiencyAndTrust"&gt;that last post&lt;/a&gt; was a nitpick - things are going well on this project. &amp;nbsp;My bottom line is in the black: &amp;nbsp;the question I've learned to ask myself about a job is whether it is an energy source or an energy sink, and this one has become a source. &amp;nbsp;The team is coalescing, including management, customer reps, etc., in spite of the legacy ceremony. &lt;br /&gt;&lt;br /&gt;Trust/coherence is building, and the only question is whether/when management will perceive this and start dismantling the ceremonial edifice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1959228071234334815?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1959228071234334815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/clarification-of-previous-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1959228071234334815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1959228071234334815'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/clarification-of-previous-post.html' title='Clarification of previous post'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4801051123549575346</id><published>2010-05-16T20:33:00.000-07:00</published><updated>2010-05-17T09:46:29.542-07:00</updated><title type='text'>Efficiency and Trust</title><content type='html'>Haven't posted for a while because I've started a new contract. &amp;nbsp;The team is nominally Agile, the customer is nominally on board, but ... not really. &amp;nbsp; There's a lot of ceremony, no pairing or TDD expected (although we would not be punished for doing it), &amp;nbsp;a lot of micromanagement of time with JIRA (be sure to charge that 15-minute daily standup to the right task!).&lt;br /&gt;&lt;br /&gt;And I finally made the connection....&lt;br /&gt;&lt;br /&gt;&lt;i&gt;What do you do when your team/company is all excited to be “agile”, while your customers want to operate in the traditional, heavy-weight, documentation-driven approach?&amp;nbsp;&amp;nbsp;... &amp;nbsp;In most cases it turns out that they don’t trust the software team and hence they want to push all the risk to the software development side.&lt;/i&gt;&lt;br /&gt;-- &lt;a href="http://blogs.agilefaqs.com/2010/05/02/i-say-agile-you-say-traditional-document-driven/"&gt;I Say Agile, You Say Traditional, Document-Driven&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ceremony is the cost of doing business in an environment without trust. &amp;nbsp;Agile is efficient because trust allows us to eliminate ceremonies of security/CYA/blame/risk-shifting, which waste resources.&lt;br /&gt;&lt;br /&gt;The word "ceremony" as used in Agile circles could almost be glossed as "institutionalized Muda (waste)". &amp;nbsp;As an anthropologist, I think of it from the perspective of Durkheim: &lt;a href="http://en.wikipedia.org/wiki/%C3%89mile_Durkheim"&gt;He saw religion as a mechanism that shored up or protected a threatened social order.&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For example, estimates "cast in stone" are&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Sympathetic_magic"&gt;sympathetic magic,&lt;/a&gt; telling a highly structured story in the hope of imposing certainty on a situation involving major unknown risks. &amp;nbsp;Estimates in a traditional environment are not a tool but a prayer - or an oath.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;I will not identify the customer or the consulting company I'm subcontracting through. &amp;nbsp; Not for any reasons of trade secrets or confidentiality, but because of this: &lt;br /&gt;&lt;br /&gt;The customer's dress code is the new biz casual - i.e., jeans, polo shirts and sneakers are fine for everyone. &amp;nbsp;The consultancy requires us to wear the old biz casual - no jeans, no sneakers, dress shirts. &amp;nbsp;I was told this is because we want to impress the customer by being "a level above them".&lt;br /&gt;&lt;br /&gt;Consistent so far.&lt;br /&gt;&lt;br /&gt;But then - we have casual Fridays! &amp;nbsp; Not the customer - they're always casual. Just the "one-level up" consultants.&lt;br /&gt;&lt;br /&gt;WTF?&lt;br /&gt;&lt;br /&gt;It's like&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S_C8rL46EAI/AAAAAAAAAB4/YAmxqFFBaZw/s1600/The+Beatings+Will+Continue.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S_C8rL46EAI/AAAAAAAAAB4/YAmxqFFBaZw/s320/The+Beatings+Will+Continue.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;... but because we really care about all our ... uh ... development associates ... , &amp;nbsp;no beatings on Friday.&lt;br /&gt;&lt;br /&gt;Moo-dada!&lt;br /&gt;&lt;br /&gt;I won't believe a consulting company is Agile as long as it carries the baggage of the Old Biz Religion.&lt;br /&gt;&lt;br /&gt;[UPDATE: see the &lt;a href="http://floorsweepings.blogspot.com/2010/05/clarification-of-previous-post.html"&gt;clarification&lt;/a&gt;.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4801051123549575346?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4801051123549575346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/efficiency-and-trust.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4801051123549575346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4801051123549575346'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/05/efficiency-and-trust.html' title='Efficiency and Trust'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YQU7EFzWf8Y/S_C8rL46EAI/AAAAAAAAAB4/YAmxqFFBaZw/s72-c/The+Beatings+Will+Continue.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1560477548126230818</id><published>2010-04-15T21:19:00.000-07:00</published><updated>2010-04-15T21:19:19.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='dialectic'/><category scheme='http://www.blogger.com/atom/ns#' term='agile skills'/><title type='text'>Rockclimbing, Baguettes, Agile Skills and Opposing Forces</title><content type='html'>Got into some interesting conversations recently - check out &lt;a href="http://dhondtsayitsagile.blogspot.com/2010/04/slack-were-not-slacking-off.html"&gt;Slack: we're not slacking off!&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://groups.google.com/group/agile-developer-skills/browse_thread/thread/545f0e99f1940eb6?hl=en%3Fhl%3Den"&gt;FORCES Behind Skills&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1560477548126230818?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1560477548126230818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/04/rockclimbing-baguettes-agile-skills-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1560477548126230818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1560477548126230818'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/04/rockclimbing-baguettes-agile-skills-and.html' title='Rockclimbing, Baguettes, Agile Skills and Opposing Forces'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-3274636998489668100</id><published>2010-04-02T10:25:00.000-07:00</published><updated>2010-04-02T10:25:05.606-07:00</updated><title type='text'>Life/Death/Agility 6:  How Many Deaths Will it Take?</title><content type='html'>&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica;"&gt;&lt;/span&gt;&lt;br /&gt;Milo passed &lt;a href="http://www.poppendieck.com/safety.htm"&gt;this little gem &lt;/a&gt;on to me. It was published eight years ago and it makes just about every argument I've been making in this mini-series. &amp;nbsp;Why so long and still no change?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The passage quoted below may explain why "critical XP" still isn't happening: &amp;nbsp;a chicken-and-egg problem. &amp;nbsp;Read the whole thing for details on "Ron's project" and "the audit".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;The theory of punctuated equilibrium holds that biological species are not likely to change over a long period of time because mutations are usually swamped by the genes of the existing population.&amp;nbsp; If a mutation occurs in an isolated spot away from the main population, it has a greater chance of surviving.&amp;nbsp; This is like saying that it is easier for a strange new fish to grow large in a small pond.&amp;nbsp; Similarly, disruptive technologies&lt;/i&gt;&lt;i&gt;&amp;nbsp;(new species of technologies) do not prosper in companies selling similar older technologies, nor are they initially aimed at the markets served by the older technologies.&amp;nbsp; Disruptive technologies are strange little fish, so they only grow big in a small pond.&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;Ron’s project was being run under a military policy, even though it was a commercial project.&amp;nbsp; If the company policy had segmented off a commercial area for software development and explicitly allowed the team to develop its own process in that segment, then the auditor would have been satisfied.&amp;nbsp; He would not have seen a strange little fish swimming around in a big pond, looking different from all the other fish.&amp;nbsp; Instead he would have seen a new little fish swimming in its own, ‘official’ small pond.&amp;nbsp; There XP practices could have thrived and grown mature, at which time they might have invaded the larger pond of traditional practices.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;But it was not to be.&amp;nbsp; The project was canceled, a victim not of the audit but of the economy and a distant corporate merger.&amp;nbsp; Today the thing managers remember about the project is that XP did not pass the audit.&amp;nbsp; The little fish did not survive in the big pond.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;i&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;[in case you don't recognize&lt;i&gt; &lt;a href="http://www.lyricsfreak.com/b/bob+dylan/blowin+in+the+wind_20021159.html"&gt;How many deaths will it take...&lt;/a&gt;&lt;/i&gt;]&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-3274636998489668100?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/3274636998489668100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/04/lifedeathagility-6-how-many-deaths-will.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3274636998489668100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3274636998489668100'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/04/lifedeathagility-6-how-many-deaths-will.html' title='Life/Death/Agility 6:  How Many Deaths Will it Take?'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-243058829158337992</id><published>2010-03-29T19:37:00.000-07:00</published><updated>2010-03-29T19:37:15.154-07:00</updated><title type='text'>Learning as a design skill</title><content type='html'>&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="actions"&gt;&lt;div&gt;      &lt;a class="fav-action non-fav" href="" id="status_star_11266166554" title="favorite this tweet"&gt;&amp;nbsp;&amp;nbsp;&lt;/a&gt; &lt;/div&gt;&lt;/span&gt;             &lt;i&gt;&lt;span class="entry-content"&gt;the question isn't how good you  can make it, it's how fast you can learn about it. that's a design skill  too.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;-- Kent Beck tweet&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;Can we come up with "learning cycles" as powerful and satisfying as Red-Green-Refactor?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;Hmm - downshifting tweets to blog posts ... too retro? I would have retweeted it, but nobody follows me on Twitter.&amp;nbsp; At least here there's a chance folks will check out the blog later....&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-243058829158337992?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/243058829158337992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/learning-as-design-skill.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/243058829158337992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/243058829158337992'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/learning-as-design-skill.html' title='Learning as a design skill'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-6713453930994725202</id><published>2010-03-29T19:07:00.000-07:00</published><updated>2010-03-29T19:07:38.226-07:00</updated><title type='text'>Anything wrong with this picture? - 2</title><content type='html'>&lt;div class="infuse"&gt;&lt;i&gt;"Our team was perfectly aware that we sold scareware,"  says a translator who worked for the company in Kiev in 2008. "The  manager never made a big mystery of that." The team the translator was  part of had 10 staff and 15 freelancers to translate the text of IM's  products into 28 languages. "Not everyone was happy about it, but money  is money," the translator says. IM was paying around 60 per cent more  than similar jobs elsewhere offered.&lt;/i&gt;&lt;/div&gt;&lt;div class="infuse"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="infuse"&gt;&lt;i&gt;A mid-level employee, who left three  years ago after realising what the company was doing, says that  initially IM employed skilled developers to create genuine products. As  managers became increasingly concerned with making money, quality  declined and the fake scans came into use.&lt;/i&gt;&lt;/div&gt;&lt;div class="infuse"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="infuse"&gt;&lt;i&gt;Roughly half the people working there  knew the full story, says the employee, but again money talked. "There  were a lot of young people working there who did not care about the  product. They just took their salaries."&lt;/i&gt;&lt;/div&gt;&lt;div class="infuse"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="infuse"&gt;--&lt;a href="http://www.newscientist.com/article/mg20527532.400-infections-found-inside-the-great-scareware-scam.html?full=true"&gt; 'Infections found': Inside the great scareware scam      &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-6713453930994725202?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/6713453930994725202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/anything-wrong-with-this-picture-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/6713453930994725202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/6713453930994725202'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/anything-wrong-with-this-picture-2.html' title='Anything wrong with this picture? - 2'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-3788484102989729951</id><published>2010-03-27T12:31:00.000-07:00</published><updated>2010-03-27T22:25:56.680-07:00</updated><title type='text'>Anything wrong with this picture?</title><content type='html'>&lt;i&gt;As an example, consider one of our first Agile projects. Its goal was to  provide field representatives with handheld clients to access a  back-end application for submitting and tracking loan applications for  high-end recreational purchases such as boats, airplanes, and exotic  cars. Without such a tool, the field representatives could not tell  customers whether their loan applications had been approved for several  days. In that time, customers often came to their senses and canceled  the purchase. To finalize more sales, we wanted to be able to approve  loans and notify customers while they were still in the showroom and  still excited about the purchase. Furthermore, the business unit manager  had calculated an opportunity cost for delayed delivery of the  solution: If we missed the spring sales rush, we could lose up to $2  million in revenue per year, as well as losing market share and  conceding the market leadership position to a competitor. That is an  example of an &lt;/i&gt;&lt;i&gt;urgent project. (The traditional IT group put in a  bid of 10 months at $850,000; we did it with 4 people in 6 weeks at a  cost of $73,000.)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;-- from the otherwise great &lt;a href="http://www.davenicolette.net/articles/when_2b_agile.html"&gt;Dave Nicolette post&lt;/a&gt; that deFUDs Boehm and Turner (cited &lt;a href="http://floorsweepings.blogspot.com/2010/03/lifedeathagility-3-criticality-and.html"&gt;earlier in the Life/Death/Agility thread&lt;/a&gt; here).&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Reminds me of something I worked on once for an insurance company I won't name....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-3788484102989729951?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/3788484102989729951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/anything-wrong-with-this-picture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3788484102989729951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3788484102989729951'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/anything-wrong-with-this-picture.html' title='Anything wrong with this picture?'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4264795528309702082</id><published>2010-03-23T19:46:00.000-07:00</published><updated>2010-03-24T10:10:41.448-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Integration Tests are a Scam - Quantified!</title><content type='html'>JBrains is brilliant, no way 'round it.&amp;nbsp;&amp;nbsp; He wrote, directed and starred in &lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;this great indie&lt;/a&gt;, and if you want to see testing approaches dissected by the numbers, you'd better watch it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4264795528309702082?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4264795528309702082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/integration-tests-are-scam-quantified.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4264795528309702082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4264795528309702082'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/integration-tests-are-scam-quantified.html' title='Integration Tests are a Scam - Quantified!'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-8113051047676966638</id><published>2010-03-23T11:10:00.000-07:00</published><updated>2010-03-25T14:10:39.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='fud-on-agile'/><category scheme='http://www.blogger.com/atom/ns#' term='life-death'/><category scheme='http://www.blogger.com/atom/ns#' term='agile-obstacles'/><title type='text'>Life/Death/Agility 5: Criticality and Changeable Requirements</title><content type='html'>&lt;a href="http://milotodorovich.blogspot.com/"&gt;Milo Todorovich&lt;/a&gt; has pointed me to the granddaddy of FUD-on-Agile, Life/Death division:&amp;nbsp; &lt;a href="http://www.amazon.com/gp/product/0321186125/qid=1134500692/sr=2-1/ref=pd_bbs_b_2_1/104-3609087-1823927?s=books&amp;amp;v=glance&amp;amp;n=283155" target="ext" title="Amazon listing for the book"&gt;&lt;cite&gt;Balancing  Agility and Discipline: A Guide for the Perplexed&lt;/cite&gt;&amp;nbsp; &lt;/a&gt;by Boehm and Turner.&amp;nbsp; I'm trying to find a copy (IEEE wants $19 - hello, I'm broke!).&amp;nbsp; I intend to post episode 4 of this series shortly, where I magically demonstrate the ultimate Agile approach to criticality, but meanwhile, here's a corrective to B&amp;amp;T - read the whole post:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The Boehm and Turner book is generally very informative and useful; I  still turn to it as one of a handful of books that help me with Agile  project management on a practical level. But here they seem to reflect  the fear of adaptive development that was common in the early days.  Organizations were reluctant to risk an important project on an approach  that was, in their experience, unproven. Circa 2002 or 2003, the  authors' guidelines made sense. In the 2006-2007 time frame, as the  industry moves toward institutionalizing adaptive development at the  enterprise level, we need decision criteria that are more in keeping  with the realities of large organizations, and with the (now) proven  ability of adaptive development to deliver high value and high quality  results.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;Criticality and Changeable Requirements&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Because the criteria presented by Boehm and Turner are reiterated on &lt;a href="http://en.wikipedia.org/wiki/Agile_Software_Development" target="ext" title="Wikipedia entry on Agile development"&gt;Wikipedia &lt;/a&gt;,  and will therefore be read by many, let's begin by re-examining them.  First, I disagree with the authors' understanding of the criticality  criterion. In our experience, it is precisely on projects of high  criticality that adaptive methods have shone. Predictive methods tend to  bog down in paperwork and procedure. By the time project teams have  completed the heavyweight up-front analysis required with the predictive  approach, the criticality of the proposed project may well have  escalated to crisis proportions. An adaptive approach enables us to  deliver results incrementally, and thus to begin to chip away at the  critical problem almost immediately. Customers are usually more  satisfied with that outcome than with the &lt;acronym title="71% failure rate"&gt;typical outcome of predictive projects&lt;/acronym&gt;. Increasing the  chances of success is surely all the more important when the project is  critical.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;&lt;a href="http://www.davenicolette.net/articles/when_2b_agile.html"&gt;When to be Agile&lt;/a&gt;&lt;i&gt;, &lt;/i&gt;by Dave Nicolette&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-8113051047676966638?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/8113051047676966638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/lifedeathagility-3-criticality-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8113051047676966638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8113051047676966638'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/lifedeathagility-3-criticality-and.html' title='Life/Death/Agility 5: Criticality and Changeable Requirements'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1227255111583617265</id><published>2010-03-11T09:44:00.000-08:00</published><updated>2010-03-11T09:45:54.161-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='fud-on-agile'/><category scheme='http://www.blogger.com/atom/ns#' term='agile-obstacles'/><title type='text'>More FUD on Agile</title><content type='html'>&lt;i&gt;The notion that the XP team leader tells the customer "Sorry, I can't commit to anything" is a bit of anti-XP propaganda that has been spread around. I can't imagine I'd get much business if I told people that.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;-- Charlie Poole on &lt;a href="http://tech.groups.yahoo.com/group/extremeprogramming/message/153191"&gt;Contractor Rate Based On Velocity&lt;/a&gt; - thread in Yahoo XP group&lt;br /&gt;&lt;br /&gt;I haven't seen that, but it's not that different from &lt;a href="http://floorsweepings.blogspot.com/2010/03/unbearable-heaviness-of-requirements.html"&gt;the unbearable lightness of requirements&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1227255111583617265?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1227255111583617265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/more-fud-on-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1227255111583617265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1227255111583617265'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/more-fud-on-agile.html' title='More FUD on Agile'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-320052543054657232</id><published>2010-03-05T21:54:00.000-08:00</published><updated>2010-03-05T21:54:52.411-08:00</updated><title type='text'>Return of the Stakhanovites</title><content type='html'>&lt;i&gt;&lt;/i&gt;&lt;i&gt;One of the realities of development these days is that our software teams have heterogeneous skill levels. Most teams contain a mix of veterans and rookies. There can be large differences in how seriously people take continuing education, too. My team, for example, has a member who just announced that he never learned any of the Java 5 features and so couldn’t work on areas that used generics. Considering that we’re now migrating from Java 6 toward Groovy, this team member is pretty far behind the curve.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;&lt;a href="http://www.pragprog.com/magazines/2010-03/testing-as-contract"&gt;Testing as Contract: A Modest Proposal&lt;/a&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;That would be a really serious problem for any team, but particularly one that hopes to be Agile.&lt;br /&gt;&lt;br /&gt;I hope that - as the subtitle implies - the author is kidding when he suggests that the solution is for the "veterans" to write all the tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-320052543054657232?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/320052543054657232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/return-of-stakhanovites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/320052543054657232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/320052543054657232'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/return-of-stakhanovites.html' title='Return of the Stakhanovites'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5293581588731615963</id><published>2010-03-04T10:19:00.000-08:00</published><updated>2010-03-25T14:10:17.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='fud-on-agile'/><category scheme='http://www.blogger.com/atom/ns#' term='life-death'/><title type='text'>Life/Death/Agility 4: The Unbearable Lightness of Requirements</title><content type='html'>Another in the ongoing miniseries, Life/Death/Agility.&lt;br /&gt;&lt;br /&gt;I've seen this argument online and heard it in conversation: the reason you can't use Agile on serious projects like the Shuttle is that there are hard requirements that can't be changed.&lt;br /&gt;&lt;br /&gt;Apparently it's a principle of Agile that the developers can change requirements.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I can just see a team explaining to a NASA manager, "We understand you thought you had this requirement, but you have to get over it and embrace change: because of the Agileological refactorization/cohesion principle, we're going to have to make the heat-resistant tiles out of Charmin."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5293581588731615963?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5293581588731615963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/unbearable-heaviness-of-requirements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5293581588731615963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5293581588731615963'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/unbearable-heaviness-of-requirements.html' title='Life/Death/Agility 4: The Unbearable Lightness of Requirements'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5797877417042231436</id><published>2010-03-03T19:36:00.000-08:00</published><updated>2010-03-03T19:36:35.585-08:00</updated><title type='text'>Us:Language::Fish:Water</title><content type='html'>Watching &lt;a href="http://www.pbs.org/wgbh/nova/pluto/"&gt;The Pluto Files&lt;/a&gt;, what struck me wasn't how upset non-scientists got about the "demotion" of Pluto, but the way astronomers, astrophysicists, etc. got all hot and bothered over it.&lt;br /&gt;&lt;br /&gt;Whether Pluto is designated a "planet" is completely orthogonal to any practical/technical/scientific issues/research/hypotheses.&amp;nbsp; Nobody's disagreeing about any non-linguistic facts about Pluto or the "legit" planets.&amp;nbsp; This is exactly what people mean when they deride some controversy as "mere semantics" (and the opposite of what "semantics" is about).&lt;br /&gt;&lt;br /&gt;We swim through this transparent, intangible medium all our lives, but every once in a while it hits us with a compression wave and we wonder - what the hell was &lt;i&gt;that&lt;/i&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5797877417042231436?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5797877417042231436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/uslanguagefishwater.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5797877417042231436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5797877417042231436'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/uslanguagefishwater.html' title='Us:Language::Fish:Water'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1602207370254436043</id><published>2010-03-02T09:51:00.000-08:00</published><updated>2010-03-02T10:11:05.921-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='agile-obstacles'/><title type='text'>Career Pathing/ology - Getting at the obstacles</title><content type='html'>Great analysis by Tim Ottinger: &lt;a href="http://agileotter.blogspot.com/2010/02/career-pathing.html"&gt;Career Pathing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The biggest obstacles to Agile adoption are the built-in pathologies of industrial organization, the ways human motivations are manipulated.&amp;nbsp; As Tim says,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;In a typical career path, employees compete against each other for increasingly rare positions at higher levels. Esther Derby has written much about how this defeats morale and teamwork. In some situations one might find the "kiss up, kick down" strategy to be successful, where one panders to his bosses while sabotaging his peers and underlings. By political maneuvering, he is promoted (even "fast-tracked"), at the cost of productivity and harmony within the company. Distructive abuse of the career path discredits and defames the process.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The command-and-control model of organization (military-industrial complexity!) is echoed by waterfall methodology:&amp;nbsp; an unchangeable truth is emitted from authority and governs all following behaviors (horizontal) and all subordinate personnel (vertical).&amp;nbsp; This process gets its energy via the motivational patterns of the &lt;a href="http://en.wikipedia.org/wiki/The_Selfish_Gene"&gt;selfish gene&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Will_to_power"&gt;will-to-power&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Original_sin"&gt;original sin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;More to come ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1602207370254436043?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1602207370254436043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/career-pathing-getting-at-obstacles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1602207370254436043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1602207370254436043'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/career-pathing-getting-at-obstacles.html' title='Career Pathing/ology - Getting at the obstacles'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-7207610841546274443</id><published>2010-03-01T09:48:00.000-08:00</published><updated>2010-03-01T09:48:23.928-08:00</updated><title type='text'>Laziness in Moderation</title><content type='html'>&lt;i&gt;&lt;/i&gt;&lt;i&gt;A good programmer has to be     just the right amount of lazy. If he is too lazy, he will     simply copy &amp;amp; paste his code and modify a few lines. In     the end, his codebase will be unmaintainable, but he might be     promoted due to the amazing lines-of-code (LOC) he has     achieved. If he is not lazy enough, he will not shirk from     doing something over and over again. Both character flaws     (too lazy and too eager) result in code that is hard to     maintain.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;Heinz Kabutz, &lt;a href="http://www.javaspecialists.eu/archive/Issue181.html"&gt;Generating Static Proxy Classes 2/2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Laziness is a subtle thing.&amp;nbsp; I always figured "copy &amp;amp; paste ... and modify a few lines" was &lt;i&gt;more&lt;/i&gt; work, and it strongly resembles "doing something over and over again".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-7207610841546274443?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/7207610841546274443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/laziness-in-moderation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7207610841546274443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7207610841546274443'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/03/laziness-in-moderation.html' title='Laziness in Moderation'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5469729617536859675</id><published>2010-02-25T16:35:00.000-08:00</published><updated>2010-02-26T09:23:15.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='titles'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='roles'/><title type='text'>Send in the enterprise clowns</title><content type='html'>More on roles and titles: &lt;a href="http://www.linkedin.com/news?viewArticle=&amp;amp;articleID=111966805&amp;amp;gid=131804&amp;amp;articleURL=http%3A%2F%2Fbobtuse.blogspot.com%2F2010%2F02%2Fenterprise-architect-or-circus-clown.html&amp;amp;urlhash=8Jrs&amp;amp;trk=news_discuss"&gt;Architect or Circus Clown&lt;/a&gt;.&amp;nbsp; Good points, except for the Eastern-Western angle. [I.e., it feels like &lt;a href="http://en.wikipedia.org/wiki/Orientalism#Edward_Said_and_.22Orientalism.22"&gt;Orientalism&lt;/a&gt;.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5469729617536859675?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5469729617536859675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/send-in-enterprise-clowns.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5469729617536859675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5469729617536859675'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/send-in-enterprise-clowns.html' title='Send in the enterprise clowns'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5860824867244551524</id><published>2010-02-25T09:05:00.000-08:00</published><updated>2010-02-25T09:15:35.127-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mission critical'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='life-death'/><title type='text'>British Airways - more life &amp; death</title><content type='html'>&lt;i&gt;&lt;/i&gt;&lt;i&gt;Both Croucher and emergn's consultants agreed there are areas of development where agile is not an appropriate choice or, in some cases, even an option. "Approximately 25% of our organization has already changed over to agile. And we are still working to grow that number; but in the process of growing that number we've identified areas where we are certain waterfall development is our only choice," Croucher said.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;BA chooses to use the &lt;a href="http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci519580,00.html"&gt;waterfall methodology&lt;/a&gt; in areas where there are a lot of requirements that can't be altered; where user communities are long established and the existing infrastructure is functioning at a level that can't be easily topped; and where major operational integration software has been built around an &lt;a href="http://searchsoa.techtarget.com/sDefinition/0,,sid26_gci929153,00.html"&gt;SOA&lt;/a&gt; foundation. "These are the 'big bang' areas where a tremendous amount of continuous integration is required and there is no room for discussion or testing of barriers," said Croucher.&amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;from&lt;a href="http://searchsoftwarequality.techtarget.com/news/article/0,289142,sid92_gci1392636,00.html?track=NL-498&amp;amp;ad=751169&amp;amp;asrc=EM_NLN_10954569&amp;amp;uid=1460817"&gt;&lt;span style="font-size: small;"&gt; Where Agile development works and where it doesn't: A user story&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Digesting this....&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Requirements that can't be altered?&amp;nbsp; How is that a barrier to Agile? Every project has constraints.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Ditto for SOA and, in general, legacy software that has to be accommodated.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"... the existing infrastructure is functioning at a level that can't be easily topped&lt;/i&gt;&lt;span style="font-size: small;"&gt; ...."&amp;nbsp; This smacks of arm-waving.&amp;nbsp; But if there really is a waterfall process that ain't broke, not only shouldn't you fix it, you should tell the world about it.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;"&lt;/span&gt;&lt;i&gt;... where user communities are long established ..."&amp;nbsp; &lt;/i&gt;This is the one real issue:&amp;nbsp; the difficulty of explaining the benefits of Agile to people who have major economic and emotional investments in the status quo.&lt;br /&gt;&lt;br /&gt;This article is a specimen of a certain genre of "even-handed", "objective", "above-the-fray" punditry: sure, there's a time and a place for Agile, but &lt;a href="http://en.wikipedia.org/wiki/NIMBY"&gt;NIMBY&lt;/a&gt;....&lt;br /&gt;&lt;br /&gt;P.S. If you follow the link in that quote to "waterfall model",&amp;nbsp; you'll see this:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Alternatives to the waterfall model include joint application development (&lt;a class="inline" href="http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci820966,00.html"&gt;JAD&lt;/a&gt;), rapid application development (&lt;a class="inline" href="http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci214246,00.html"&gt;RAD&lt;/a&gt;), &lt;term&gt;synch and stabilize&lt;/term&gt;, &lt;a class="inline" href="http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci872640,00.html"&gt;build&lt;/a&gt; and fix, and the &lt;a class="inline" href="http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci755347,00.html"&gt;spiral model&lt;/a&gt;.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Something missing?&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;h1 class="a4" style="font-weight: normal;"&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5860824867244551524?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5860824867244551524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/british-airways-more-life-death.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5860824867244551524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5860824867244551524'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/british-airways-more-life-death.html' title='British Airways - more life &amp; death'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-8948399269778387394</id><published>2010-02-23T20:48:00.000-08:00</published><updated>2010-02-25T09:05:47.528-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mission critical'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='life-death'/><title type='text'>More life-and-death Agility</title><content type='html'>&lt;i&gt;&lt;b&gt;The Rogers Commission found that &lt;a href="http://en.wikipedia.org/wiki/NASA" title="NASA"&gt;NASA&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/Organizational_culture" title="Organizational culture"&gt;organizational culture&lt;/a&gt; and decision-making processes had been a key contributing factor to the accident.&lt;/b&gt; &lt;b&gt;NASA managers had known that contractor &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Morton_Thiokol" title="Morton Thiokol"&gt;Morton Thiokol&lt;/a&gt;'s design of the SRBs contained a potentially catastrophic flaw in the O-rings since 1977, but they failed to address it properly. &lt;/b&gt;&lt;b&gt;They also disregarded warnings from engineers about the dangers of launching posed by the low temperatures of that morning and had failed to adequately report these technical concerns to their superiors.&lt;/b&gt; The Rogers Commission offered NASA nine recommendations that were to be implemented before shuttle flights resumed.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;from &lt;a href="http://en.wikipedia.org/wiki/Space_Shuttle_Challenger_disaster"&gt;Space Shuttle Challenger disaster&lt;/a&gt; - my emphasis&lt;i&gt;.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://agilemanifesto.org/"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Individuals and interactions&lt;/b&gt; &lt;/span&gt;&lt;span style="font-size: small;"&gt;over processes and tools&lt;/span&gt;&lt;/a&gt;&amp;nbsp; - if Agile principles had been applied, the Challenger might be flying today.&amp;nbsp;&amp;nbsp; This makes the quote in my previous post even more hypocritical.&lt;br /&gt;&lt;br /&gt;(Thanks to Sasha and Andy at &lt;a href="http://www.pathf.com/"&gt;Pathfinder&lt;/a&gt; for reminding me of this.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-8948399269778387394?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/8948399269778387394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/more-life-and-death-agility.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8948399269778387394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8948399269778387394'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/more-life-and-death-agility.html' title='More life-and-death Agility'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-8216930940371878972</id><published>2010-02-19T11:58:00.000-08:00</published><updated>2010-02-23T20:57:00.072-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mission critical'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='life-death'/><title type='text'>Life-and-death Agility?</title><content type='html'>&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S37tJNbYpHI/AAAAAAAAABE/w92DTiAvZPk/s1600-h/220px-Challenger_explosion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="323" src="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S37tJNbYpHI/AAAAAAAAABE/w92DTiAvZPk/s400/220px-Challenger_explosion.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;-- &lt;/i&gt;picture from&lt;i&gt;&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Space_Shuttle_Challenger_disaster"&gt;Space Shuttle Challenger Disaster&lt;/a&gt; &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A software development life cycle model (SDLC) is a very important tool for successfully executing a software development project, and it’s important to choose the right approach for the right project.&amp;nbsp; Some of the factors that would go into choosing the right SDLC model are:&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;u&gt;Risk and Complexity of the Project&lt;/u&gt; – you would never choose a very agile approach for building the Space Shuttle software. The risk and complexity of the project is probably the biggest factor in choosing the most appropriate SDLC model for the project.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;... &lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;-- quote from &lt;i&gt;&lt;a href="http://chuckc3pm.blogspot.com/search/label/Agile"&gt;Agile versus “Non-Agile” Development&lt;/a&gt; &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;When I read this, my first impulse was to say&lt;i&gt; "just another old-line management type who doesn't get it".&amp;nbsp; &lt;/i&gt;But now I have an uncomfortable feeling about it.&amp;nbsp; Do I really believe that choosing waterfall development over Agile is a mistake - that the chances are good that it will come back to bite you?&amp;nbsp; I do - I'm pretty sure I do.&lt;br /&gt;&lt;br /&gt;Then do I believe it would be prudent or even possible to use an Agile approach to building shuttle software?&amp;nbsp; Would I be a fanatic if I said yes?&amp;nbsp; Would I be inconsistent if I said no?&amp;nbsp; Don't I believe that Agile is the best way to deal with risk, uncertainty, unknowns? Can there be such a thing as "mission critical Agile", or are there some things that have to be done "the old-fashioned way"?&lt;br /&gt;&lt;br /&gt;I certainly don't want to be a fanatic, but I think that if I don't believe that the best way to build the shuttle is with Agile, then there's something deeply wrong with what I do believe.&lt;br /&gt;&lt;br /&gt;If I look at it from the standpoint of user acceptance testing, maybe the issue goes away.&amp;nbsp; Just as skeptics say, "extraordinary claims call for extraordinary proof",&amp;nbsp; we can say, "mission critical software calls for mission critical testing".&lt;br /&gt;&lt;br /&gt;Suddenly this reminds me of how I overcame my fear of Ruby.&amp;nbsp; I spent years fighting for type safety, and now you're telling me to start typing like a duck?&amp;nbsp; I thought I could never trust a language like that. But then I realized that TDD is the answer - thank Dave for Rspec! - and I love Ruby to death.&lt;br /&gt;&lt;br /&gt;If NASA doesn't have rock-solid acceptance testing, then it doesn't matter what approach you use - you can't trust the product. And if they do have rock-solid acceptance testing,&amp;nbsp; you're free to pick the most efficient and effective approach, because your problem is now insulated by the solid walls of a black box.&lt;br /&gt;&lt;br /&gt;And the most efficient and effective approach will be ... Agile.&lt;br /&gt;&lt;br /&gt;This doesn't mean that things don't have to change:&amp;nbsp; maybe we'd need a higher level of structuring of testing, above Fitnesse and XUnit and Cucumber and Rspec.&amp;nbsp; Maybe we need automated &lt;a href="http://en.wikipedia.org/wiki/Requirements_traceability"&gt;requirements traceability&lt;/a&gt;, but with stories and tests and coverage testing, not &lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;BDUF&lt;/a&gt; and humongous documents.&lt;br /&gt;&lt;br /&gt;But change is what we embrace, and risk is what we face - with&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_YQU7EFzWf8Y/S37uw57XttI/AAAAAAAAABM/pS3B_Tn0VXg/s1600-h/cowardly-lion2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_YQU7EFzWf8Y/S37uw57XttI/AAAAAAAAABM/pS3B_Tn0VXg/s320/cowardly-lion2.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;Courage!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; &lt;/div&gt;&amp;nbsp;&lt;span style="font-size: xx-small;"&gt;[Bert Lahr pic from &lt;a href="http://craigtowens.com/2008/12/18/no-cowardly-lions-please/"&gt;No Cowardly Lions Please!&lt;/a&gt;, which did not attribute source]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-8216930940371878972?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/8216930940371878972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/life-and-death-agility.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8216930940371878972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8216930940371878972'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/life-and-death-agility.html' title='Life-and-death Agility?'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YQU7EFzWf8Y/S37tJNbYpHI/AAAAAAAAABE/w92DTiAvZPk/s72-c/220px-Challenger_explosion.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5058790877830306115</id><published>2010-02-18T22:52:00.000-08:00</published><updated>2010-02-18T23:06:41.042-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='universal grammar'/><category scheme='http://www.blogger.com/atom/ns#' term='projection'/><title type='text'>Because the world is round, you can't always say what you mean</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YQU7EFzWf8Y/S34ab558wQI/AAAAAAAAAAs/ABmhcAOO4hM/s1600-h/413px-Usgs_map_mercator.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://4.bp.blogspot.com/_YQU7EFzWf8Y/S34ab558wQI/AAAAAAAAAAs/ABmhcAOO4hM/s400/413px-Usgs_map_mercator.svg.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Mercator projection, from &lt;a href="http://en.wikipedia.org/wiki/Map_projection"&gt;Map Projection&lt;/a&gt;.&amp;nbsp; (Never knew they had such mathematical sophistication in the 16th century!)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=zSjYD9XgK8w"&gt;Because the Earth is - sort of - a sphere&lt;/a&gt;, any attempt to project its surface onto a plane inevitably leads to distortion of some metric.&amp;nbsp; Mercator projection is great for navigation because every straight line is an arc of a great circle, but it distorts the sizes of land masses as you move toward the poles.&amp;nbsp; That's why there's not just one kind of projection - different maps for different apps.&lt;br /&gt;&lt;br /&gt;One of the longstanding questions in linguistics is: why are there different grammars? &lt;a href="http://en.wikipedia.org/wiki/Word_order"&gt;For example, every possible ordering of subject, verb and object can be found in at least one language.&lt;/a&gt;&amp;nbsp; Claims for &lt;a href="http://en.wikipedia.org/wiki/Universal_grammar"&gt;universal grammar&lt;/a&gt; get pretty abstract.&lt;br /&gt;&lt;br /&gt;Well, here's my two cents on it:&amp;nbsp; because your mind is round, you can't always &lt;a href="http://www.youtube.com/watch?v=lzymBKGV8rw"&gt;say what you mean&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Your neurons form a three dimensional network. Propositions/knowledge/ideas are tiny subnets of this network.&amp;nbsp; Language is a great human invention, but with the significant exception of &lt;a href="http://en.wikipedia.org/wiki/Sign_language"&gt;sign language&lt;/a&gt;, it involves a lossy projection of a three dimensional structure onto a one-dimensional medium. &lt;br /&gt;&lt;br /&gt;And just as in the case of map projections, no matter how you do it, something is going to get distorted - some kind of information is going to be lost.&amp;nbsp; This is why we have things like &lt;a href="http://en.wikipedia.org/wiki/Anaphora_%28linguistics%29"&gt;anaphora&lt;/a&gt; - for example, pronouns - that allow us to refer to the same "thing" in several different "places".&amp;nbsp; In our minds, that thing is in one "place".&lt;br /&gt;&lt;br /&gt;There's a dynamic tension in syntax between what's easy to &lt;a href="http://en.wikipedia.org/wiki/Generative_grammar"&gt;generate&lt;/a&gt; and what's easy to understand. The syntax of any one language at any one time represents a dynamic equilibrium - tradeoffs in different dimensions. Syntax mutates and responds to a changing sociocultural environment because the relative perceived costs of different projective distortions change.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The same essential pattern applies to &lt;a href="http://en.wikipedia.org/wiki/Phonology"&gt;phonology&lt;/a&gt; - at any one time a language has a repertoire of phonemes that represent selection within two "competing" multidimensional spaces:&amp;nbsp; the variety of sounds we can distinguish with our ears&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S340SVqHsnI/AAAAAAAAAA8/CUH72jAtObQ/s1600-h/400px-Spectrogram_-iua-.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S340SVqHsnI/AAAAAAAAAA8/CUH72jAtObQ/s320/400px-Spectrogram_-iua-.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(the domain of &lt;a href="http://en.wikipedia.org/wiki/Acoustic_phonetics"&gt;acoustic phonetics&lt;/a&gt;) and the variety of sounds we can make with our mouths&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S34zd5jpRYI/AAAAAAAAAA0/9FvlFRyC2QM/s1600-h/Illu01_head_neck.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_YQU7EFzWf8Y/S34zd5jpRYI/AAAAAAAAAA0/9FvlFRyC2QM/s320/Illu01_head_neck.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;(the domain of &lt;a href="http://en.wikipedia.org/wiki/Articulatory_phonetics"&gt;articulatory phonetics&lt;/a&gt;).&amp;nbsp; The tradeoffs are in terms of difficulty of distinguishing sounds vs. difficulty of generating them. And what determines those tradeoffs would have to be factors outside of language, as exemplified in various explanations of the &lt;a href="http://en.wikipedia.org/wiki/Great_Vowel_Shift"&gt;the Great Vowel Shift&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;When I first studied classical Greek, it amazed me that the people who spoke it apparently believed that it was so hard to pronounce a vowel followed by a 'b' sound that they had to put an 'm' between them, but the initial sequence 'pt' (as in "pterodactyl") was no trouble at all.&lt;br /&gt;&lt;br /&gt;Anyway....&lt;br /&gt;&lt;br /&gt;I'm sure this has all been said before, and I've oversimplified and overgeneralized up the wazoo, but it's a revelation to me, and I hope it will help me in my quest to ... uh ... do... whatever it is I'm trying to do....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;[All illustrations are from Wikipedia]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5058790877830306115?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5058790877830306115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/because-world-is-round-you-cant-always.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5058790877830306115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5058790877830306115'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/because-world-is-round-you-cant-always.html' title='Because the world is round, you can&apos;t always say what you mean'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YQU7EFzWf8Y/S34ab558wQI/AAAAAAAAAAs/ABmhcAOO4hM/s72-c/413px-Usgs_map_mercator.svg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-890924865703753679</id><published>2010-02-05T11:49:00.000-08:00</published><updated>2010-02-25T16:35:41.129-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='titles'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='roles'/><category scheme='http://www.blogger.com/atom/ns#' term='mingus'/><title type='text'>More roles and titles</title><content type='html'>I'm posting this posted reply to the post I posted about in my previous post because&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ron Jeffries is cool&lt;/li&gt;&lt;li&gt;Charlie Mingus is cool (is-not-was, even tho....)&lt;/li&gt;&lt;/ol&gt;&lt;i&gt;&amp;nbsp;Hello, Jerry.  On Thursday, February 4, 2010, at 9:46:46 PM, you&lt;br /&gt;wrote:&lt;br /&gt;&lt;br /&gt;&amp;gt; To come up with what to code is the job of requirements analysts.&lt;br /&gt;&amp;gt; So in most cases the wrong is not with coders but with&lt;br /&gt;&amp;gt; requirements analysts. If requirements analysts were doing a good&lt;br /&gt;&amp;gt; job, most, if not all, coders would be doing a good job.&lt;br /&gt;&lt;br /&gt;Well, not according to how one does things in &lt;span class="yshortcuts" id="lw_1265398897_0" style="border-bottom: 1px dashed rgb(0, 102, 204); cursor: pointer;"&gt;Extreme Programming&lt;/span&gt;,&lt;br /&gt;in two regards.&lt;br /&gt;&lt;br /&gt;First, the team includes what we call a Customer, who is ideally a&lt;br /&gt;business person, not a "requirements analyst". The Customer, helped&lt;br /&gt;by the Whole Team, expresses what is needed in three forms that I&lt;br /&gt;call "Card, Conversation, &lt;span class="yshortcuts" id="lw_1265398897_1" style="border-bottom: 1px dashed rgb(0, 102, 204); cursor: pointer;"&gt;Confirmation&lt;/span&gt;" , namely a small token to&lt;br /&gt;remind us of what the "Story" is, and to use in tracking its status;&lt;br /&gt;discussion of the need until the team and Customer understand the&lt;br /&gt;problem; and tests, "owned" by the Customer but typically written by&lt;br /&gt;the team, to determine that it works.&lt;br /&gt;&lt;br /&gt;Second, your notion that coders would be doing a good job if&lt;br /&gt;requirements were clear does not hold up in practice. In order to&lt;br /&gt;write programs that actually work, we do need to know what to do. We&lt;br /&gt;also need to know how to test that code, how to refactor it as our&lt;br /&gt;understanding changes, and how to make sure that it keeps working.&lt;br /&gt;It turns out that many would-be programmers do not have all the&lt;br /&gt;skills necessary to turn "requirements" into viable "code", much&lt;br /&gt;less the additional skills needed to be effective members of the&lt;br /&gt;teams that create software.&lt;br /&gt;&lt;br /&gt;&lt;span class="yshortcuts" id="lw_1265398897_2" style="border-bottom: 1px dashed rgb(0, 102, 204); cursor: pointer;"&gt;Ron Jeffries&lt;/span&gt;&lt;br /&gt;www.XProgramming. com&lt;br /&gt;www.xprogramming. com/blog&lt;br /&gt;Anyone can make the simple complicated.&lt;br /&gt;&lt;span class="yshortcuts" id="lw_1265398897_3"&gt;Creativity&lt;/span&gt; is making the complicated simple. -- &lt;span class="yshortcuts" id="lw_1265398897_4"&gt;Charles Mingus&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="yshortcuts" id="lw_1265398897_4"&gt;UPDATE - from another poster:&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;I would also like to suggest that the semantics in this case are important. Job titles like Architect, Requirements Analyst, etc. will pigeon hole people, and will cause folks to see boundaries that shouldn't exist.&lt;/i&gt;&lt;i&gt;&lt;span class="yshortcuts" id="lw_1265398897_4"&gt; &lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-890924865703753679?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/890924865703753679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/more-roles-and-titles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/890924865703753679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/890924865703753679'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/more-roles-and-titles.html' title='More roles and titles'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4917724585294566024</id><published>2010-02-05T11:05:00.000-08:00</published><updated>2010-02-25T16:36:12.582-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='titles'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='roles'/><title type='text'>Roles and Titles</title><content type='html'>I just saw this post on the Yahoo extreme programming group (my emphases):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I came across a while ago sth like below:&lt;br /&gt;"to code is easy; to come up with what to code is hard."&lt;br /&gt;To come up with what to code is the job of &lt;b&gt;requirements analysts&lt;/b&gt;. So in most cases the wrong is not with &lt;b&gt;coders&lt;/b&gt; but with requirements analysts. If requirements analysts were doing a good job, most, if not all, coders would be doing a good job.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Would you think there's any chance the poster works in an Agile environment?&lt;br /&gt;&lt;br /&gt;Earlier today I&amp;nbsp; was phone-screened by a very friendly and smart guy from a consulting company who introduced himself as a &lt;b&gt;technical architect&lt;/b&gt;.&amp;nbsp; He said he does pure architecture sometimes and hands-on development other times.&amp;nbsp; He later explained that Agile and Waterfall are per-client and per-project-lead options.&lt;br /&gt;&lt;br /&gt;I've been a &lt;b&gt;supervisor&lt;/b&gt; and a &lt;b&gt;project lead&lt;/b&gt;. I was a &lt;b&gt;manager&lt;/b&gt; once. I've been offered &lt;b&gt;architect&lt;/b&gt; positions, but....&lt;br /&gt;&lt;br /&gt;I'm a &lt;b&gt;developer&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;And a &lt;a href="http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382"&gt;&lt;b&gt;floorsweeper&lt;/b&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4917724585294566024?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4917724585294566024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/roles-and-titles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4917724585294566024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4917724585294566024'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/roles-and-titles.html' title='Roles and Titles'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1602623288122048397</id><published>2010-02-04T13:30:00.000-08:00</published><updated>2010-02-04T13:30:36.496-08:00</updated><title type='text'>Tracking muck on the floor</title><content type='html'>Kent Beck tweet: &lt;span class="status-body"&gt;&lt;span class="actions"&gt;&lt;/span&gt;         &lt;b&gt;&lt;span class="entry-content"&gt;unit tests and source control are muck boots for the programmer's mind--you just don't have to worry where you walk&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;That's the thing of it!&amp;nbsp; I'm screwing around with my Pragmatic module now - anything goes because I have enough Rspec coverage.&amp;nbsp; I don't worry - I be happy.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Well, as much as I can under the circumstances.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1602623288122048397?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1602623288122048397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/tracking-muck-on-floor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1602623288122048397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1602623288122048397'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/02/tracking-muck-on-floor.html' title='Tracking muck on the floor'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-3530617139613438631</id><published>2010-01-28T17:28:00.000-08:00</published><updated>2010-01-28T19:15:59.959-08:00</updated><title type='text'>Yet another frakkin' metaphor...</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_YQU7EFzWf8Y/S2IrdhK59SI/AAAAAAAAAAc/W0-OeUcE_cc/s1600-h/Vintage+Trek.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/_YQU7EFzWf8Y/S2IrdhK59SI/AAAAAAAAAAc/W0-OeUcE_cc/s400/Vintage+Trek.jpg" width="400" /&gt;&lt;/a&gt;Vintage Trek from 1984, courtesy of &lt;a href="http://www.yakshaving.net/"&gt;YakShaving&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is beautiful, brilliantly engineered by master craftsmen and insanely efficient, but it's not what I want to build.&amp;nbsp; However,&amp;nbsp; it's what I do for a living, and I have to exhibit enthusiasm...&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;a href="http://www.yakshaving.net/"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_YQU7EFzWf8Y/S2IuQfc4QmI/AAAAAAAAAAk/hB9a84C1F60/s1600-h/180px-Wright+Bros.+First_flight2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://2.bp.blogspot.com/_YQU7EFzWf8Y/S2IuQfc4QmI/AAAAAAAAAAk/hB9a84C1F60/s400/180px-Wright+Bros.+First_flight2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;Wright Flyer 1, courtesy of &lt;a href="http://en.wikipedia.org/wiki/Wright_brothers"&gt;Wikipedia&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is ugly and somewhat makeshift, and is pretty lousy at its intended purpose.&amp;nbsp; But....&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-3530617139613438631?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/3530617139613438631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/yet-another-frakkin-metaphor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3530617139613438631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/3530617139613438631'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/yet-another-frakkin-metaphor.html' title='Yet another frakkin&apos; metaphor...'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YQU7EFzWf8Y/S2IrdhK59SI/AAAAAAAAAAc/W0-OeUcE_cc/s72-c/Vintage+Trek.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-2893962346132397087</id><published>2010-01-27T10:39:00.000-08:00</published><updated>2010-01-27T10:41:01.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='low hanging fruit'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><title type='text'>Low-Hanging Fruit vs. High Risk</title><content type='html'>Among my various misunderstandings of Agility is the algorithm for deciding what story/task/monster to attack first.&amp;nbsp; It's either:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Go after the low-hanging fruit, get the process rolling with an easy win, warm up your tools and environment.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Jump into the biggest unknown first to reduce the uncertainty, start requesting external resources or services that you might end up waiting on, start researching something you may have a serious learning curve on.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;With Sudoku, it's easy. I always go after the low hanging fruit - anything else would be absurd. Every cell filled in adds one more constraint to each of three cross-cutting sets - it lowers other fruit.&amp;nbsp; There are no externals and no research.&lt;br /&gt;&lt;br /&gt;With my linguistic ... uh ... hobby, it's radically different. I want to jump in and BDD me up some Rails, but I have so much linguistics to catch up on...&amp;nbsp; The low hanging Rspec fruit is tempting, but biting into it won't bring me that instant knowledge of Good and Evil linguistic theories I need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-2893962346132397087?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/2893962346132397087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/low-hanging-fruit-vs-high-risk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2893962346132397087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2893962346132397087'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/low-hanging-fruit-vs-high-risk.html' title='Low-Hanging Fruit vs. High Risk'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-2384708983472577117</id><published>2010-01-15T22:52:00.000-08:00</published><updated>2010-01-15T22:52:50.007-08:00</updated><title type='text'>Who's More Agile - CSI-V or Leverage?</title><content type='html'>The &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAkQFjAA&amp;amp;url=http%3A%2F%2Ftnt.tv%2Fseries%2Fleverage&amp;amp;ei=mlZRS4jxKI-0NobfzZgJ&amp;amp;usg=AFQjCNG8lWMEEaGk6bulciaQA0jl8MQ4dQ&amp;amp;sig2=Vsf8IKWEPtInyp9KWRlNWg"&gt;Leverage&lt;/a&gt; team is all specialists, no real diffusion of knowledge or skills.&amp;nbsp; Of course, now they've got &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FSeven_of_Nine&amp;amp;ei=P11RS8XgEpS2NvnOkZMJ&amp;amp;usg=AFQjCNGiVrNqRWjidPY7hZw_RRsP7jH46w&amp;amp;sig2=gd_XL4LPoQvQnq6OW_XRpw"&gt;Seven of Nine&lt;/a&gt;, who's used to mind-melding....&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fwww.cbs.com%2Fprimetime%2Fcsi%2F&amp;amp;ei=M1dRS8C3MJDSM-me6IkJ&amp;amp;usg=AFQjCNEIYuS4UtOz0R7Sxsf5FqLnWXpKKg&amp;amp;sig2=9c7W57JNB74liPPvZjUXvA"&gt;CSI-Vegas&lt;/a&gt; team all seem to know and do just about everything - including when to call themselves cops and when not to.&amp;nbsp; (This struck me in the latest episode [two dead pseudo-hookers and a pseudo-Jekyll] when Catherine was running a major lab op to get fingerprints off a DB with neither of the med examiners in sight.)&amp;nbsp; There have been learning experiences - when Greg (and later, Hodges) left the lab for field investigations.&lt;br /&gt;&lt;br /&gt;Given that &lt;b&gt;CSI-V&lt;/b&gt; has an aura of forensic science (in spite of - don't get me started - a major absurd fail at the&amp;nbsp;&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFDAA&amp;amp;url=http%3A%2F%2Fwww.msichicago.org%2F&amp;amp;ei=OllRS8KwC4HiNa-ftYYJ&amp;amp;usg=AFQjCNFVSb_PzJK4ThLfj9nhl8ZCnk4BdQ&amp;amp;sig2=7T3DEqx2a2bKlZI2L7brBg"&gt;MSI&lt;/a&gt; exhibit last year) and an imaginary lab to drool over, it does have some educational moments.&amp;nbsp; &lt;b&gt;Leverage&lt;/b&gt; has its post-hoc scam "reveals" - clever, but it's not in the same league.&lt;br /&gt;&lt;br /&gt;Character personalities are front and center in &lt;b&gt;Leverage&lt;/b&gt; and tend a bit more toward cartoons. &lt;b&gt;CSI-V&lt;/b&gt; is darker (in all ways). &lt;br /&gt;&lt;br /&gt;Toward the end of &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAkQFjAA&amp;amp;url=http%3A%2F%2Ffox.com%2Fdollhouse&amp;amp;ei=JFxRS-z3Do7CNb3b5YUJ&amp;amp;usg=AFQjCNFO8Ti37eWPI3T3M3iUz_MBgCm6Iw&amp;amp;sig2=kFm2DDbdAHj6aLk-gv-5Rg"&gt;Dollhouse&lt;/a&gt; (just watched the penultimate episode),&amp;nbsp; a team gels.&amp;nbsp; The distortion here is that skills are "learned" instantly via technomagic.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=4&amp;amp;ved=0CBYQFjAD&amp;amp;url=http%3A%2F%2Ffox.com%2Fbones&amp;amp;ei=2l1RS8yLI4SONsr1uIoJ&amp;amp;usg=AFQjCNEX658AxR1Wtz5rGyprRrUtwfvNlQ&amp;amp;sig2=t0RY_SXlAlbqcuo67LCmRQ"&gt;Bones&lt;/a&gt;&amp;nbsp; has the scientific aura of &lt;b&gt;CSI-V&lt;/b&gt; and the rigid specialization of &lt;b&gt;Leverage&lt;/b&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Okay - so I love these shows, but there's an issue here:&amp;nbsp; pop culture inevitably provides role models.&amp;nbsp; Are they good models for real work teams?&lt;br /&gt;&lt;br /&gt;P.S. What is it about the techies' names on these shows?&amp;nbsp; &lt;b&gt;Bones&lt;/b&gt; has Hodgins (although Angela's the software geek), &lt;b&gt;CSI-V&lt;/b&gt; has Hodges (who seems to have taken over Archie's responsibilities), and Hardison on Leverage is played by an actor&amp;nbsp; named &lt;b&gt;Hodge&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;P.P.S.&amp;nbsp; CSI-NY is a yawner and CSI-Miami is an obscenity - I won't even link to them. &lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Where have I been lately? Looking for an "engagement" and Railing on my linguistics hobby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-2384708983472577117?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/2384708983472577117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/whos-more-agile-csi-v-or-leverage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2384708983472577117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/2384708983472577117'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2010/01/whos-more-agile-csi-v-or-leverage.html' title='Who&apos;s More Agile - CSI-V or Leverage?'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-6622115682343924373</id><published>2009-12-20T12:11:00.000-08:00</published><updated>2009-12-20T12:11:16.072-08:00</updated><title type='text'>Rails and (unrelated) Rants</title><content type='html'>Rails TDD Boot Camp last Monday thru Thursday at Obtiva was great. Good small group (Alan, Ashutosh and me - should have got their email addresses!), good instructor (Andy),&amp;nbsp; good coverage. I'm ready to create websites to do just about anything.&lt;br /&gt;&lt;br /&gt;(Unrelated rant:) This is so true: &lt;a href="http://www.dailykos.com/story/2009/12/10/812722/-Aliens,-Elves,-and-the-Politics-of-Utopia"&gt;Aliens, Elves, and the Politics of Utopia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That's all. Have a nice holiday break, and don't wear a red shirt....&lt;br /&gt;&lt;br /&gt;[Oops, posted this on the wrong blog at first, but it's okay, nobody reads that one....]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-6622115682343924373?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/6622115682343924373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/rails-and-unrelated-rants.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/6622115682343924373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/6622115682343924373'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/rails-and-unrelated-rants.html' title='Rails and (unrelated) Rants'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-5801001532341296448</id><published>2009-12-06T21:37:00.000-08:00</published><updated>2009-12-06T21:37:40.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='snow leopard'/><title type='text'>Thanks to Andy...</title><content type='html'>...&amp;nbsp; I'm running on Rails at last.&lt;br /&gt;&lt;br /&gt;I had problems getting Rails talking to a database - either Sqlite or MySql. I figured since I'll be at&amp;nbsp; &lt;a href="http://www.obtiva.com/training-classes/ruby-on-rails-tdd-boot-camp"&gt;Ruby on Rails TDD Boot Camp&lt;/a&gt; next week, and Andy Maleh's teaching it, I could ask him for help. And help he did: we spent over two hours at the Red Eye Cafe (4164 N. Lincoln - free wifi, free parking!! and best of all, AC outlets by our table!!!) working through the combinations of versions of MySql, the mysql gem and 32/64 option in Snow Leopard.&amp;nbsp; Without going into the boring details, the combo that works is&amp;nbsp; MySql 5.1.41-osx10.5-x86_64 and mysql gem v. 2.7 installed with x86-64 support.&amp;nbsp; The kernel default in Snow Leopard is set to 32 bits because I haven't upgraded VMWare Fusion to support 64 (they want $40 - I'll try VirtualBox before I spend that!).&amp;nbsp; Other combinations cause various errors in either &lt;b&gt;rake db:create&lt;/b&gt; or &lt;b&gt;rake db:migrate&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Thanks again, Andy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-5801001532341296448?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/5801001532341296448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/thanks-to-andy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5801001532341296448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/5801001532341296448'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/thanks-to-andy.html' title='Thanks to Andy...'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1546640507656296526</id><published>2009-12-06T13:36:00.000-08:00</published><updated>2009-12-07T10:41:14.305-08:00</updated><title type='text'>Baby in the Bathwater</title><content type='html'>Yesterday's post started on a relatively optimistic note and ended less positively.&amp;nbsp; That was an overreaction, and it reflects a pattern that appeared earlier in the spike.&amp;nbsp; I test-drove some classes, decided they were not going to solve my problems, and abandoned them to go in a different direction.&amp;nbsp; But later I discovered that there was a good use for them within the new structure.&lt;br /&gt;&lt;br /&gt;In the first case, I had been working through the char-by-char element extractor class. I eventually decided that the complexity issues I was having with it meant that it was a cul de sac of premature generalization, premature concern with implementation details and/or overengineering, and decided to drop it in favor of the W1913 element extractor aimed at a very specific story. In the course of test-driving the latter, I found that it could use the element extractor exactly as it was.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Now it seems to me that the pattern repeated.&amp;nbsp; When Dave paired with me Friday, we at first tried to deal with some of the complexity by refactoring.&amp;nbsp; But then he suggested a much simpler approach to extracting entire dictionary entries by scanning an entire file with regexps. The result was beautifully simple and fast, and so at the end of that day's post, I declared the more complex code I had developed to be floorsweepings.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;But now I think that was premature - there's a baby in that bathwater (so much for metaphoric consistency with floorsweepings!). (I don't mean to imply that Dave was claiming his solution would work for my other stories - in fact he said it wouldn't.)&lt;br /&gt;&lt;br /&gt;I'll approach this from another direction now - the distinction between semantics and pragmatics.&lt;br /&gt;&lt;br /&gt;Something that annoyed me when I first saw the W1913 was the mix of visual and semantic markup.&amp;nbsp; Headword, PoS, sense and definition tags were intermixed with page break tags, &amp;lt;i&amp;gt;, &amp;lt;b&amp;gt;, etc. - purely visual markup.&amp;nbsp; (These days tags like &amp;lt;i&amp;gt; are deprecated in HTML in favor of things like &amp;lt;emph&amp;gt;.  The markup in W1913 was inserted in 1999.)&amp;nbsp; The bottom line for W1913 is that it supports two radically different purposes: the original intention was to be able to reproduce a book, but&amp;nbsp; my interest is in extracting dictionary entries for other kinds of processing.&amp;nbsp; This is a pragmatic distinction based on differing purposes - closely related to the distinction we make in application development between models and the processes that use them (services, views, controllers, etc).&lt;br /&gt;&lt;br /&gt;Semantics is simpler than pragmatics because it's context-free.&amp;nbsp; Using regexps to extract W1913 entries makes perfect sense.&amp;nbsp; However, the structure inside an entry is more complex for several reasons. One is that page breaks and visual tags are noise from the current perspective.&amp;nbsp; But more important - there's context. Here's an example from the A-B file:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;p&amp;gt;&amp;lt;hw&amp;gt;A*base"&amp;lt;/hw&amp;gt; (&amp;amp;adot;*b&amp;amp;amacr;s"), &amp;lt;pos&amp;gt;&amp;lt;i&amp;gt;v. t.&amp;lt;/i&amp;gt;&amp;lt;/pos&amp;gt;[&amp;lt;pos&amp;gt;&amp;lt;i&amp;gt;imp. &amp;amp; p. p.&amp;lt;/i&amp;gt;&amp;lt;/pos&amp;gt; &amp;lt;u&amp;gt;Abased&amp;lt;/u&amp;gt; (&amp;amp;adot;*b&amp;amp;amacr;st");&amp;lt;pos&amp;gt;&amp;lt;i&amp;gt;p. pr. &amp;amp; vb. n.&amp;lt;/i&amp;gt;&amp;lt;/pos&amp;gt; &amp;lt;u&amp;gt;Abasing&amp;lt;/u&amp;gt;.] [F. &amp;lt;i&amp;gt;abaisser&amp;lt;/i&amp;gt;, LL.&amp;lt;i&amp;gt;abassare&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;abbassare&amp;lt;/i&amp;gt; ; &amp;lt;i&amp;gt;ad&amp;lt;/i&amp;gt; + &amp;lt;i&amp;gt;bassare&amp;lt;/i&amp;gt;, fr.&amp;lt;i&amp;gt;bassus&amp;lt;/i&amp;gt; low. See &amp;lt;u&amp;gt;Base&amp;lt;/u&amp;gt;, &amp;lt;pos&amp;gt;&amp;lt;i&amp;gt;a.&amp;lt;/i&amp;gt;&amp;lt;/pos&amp;gt;]&amp;lt;sn&amp;gt;&amp;lt;b&amp;gt;1.&amp;lt;/b&amp;gt;&amp;lt;/sn&amp;gt; &amp;lt;def&amp;gt;To lower or depress; to throw or cast down; as, to &amp;lt;i&amp;gt;abase&amp;lt;/i&amp;gt; the eye.&amp;lt;/def&amp;gt; [Archaic]  &amp;lt;i&amp;gt;Bacon.&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are four occurrences of the &amp;lt;pos&amp;gt; tag here. The first one follows the headword - it says "abase" is a transitive verb.&amp;nbsp; The next two refer to inflected forms:&amp;nbsp; "abased" is both an imperfect and past participle, while "abasing" is a progressive and a verbal nominalization.&amp;nbsp; (It's not clear why these should be present in the entry at all, seeing as&amp;nbsp; they are perfectly regular inflections.) The fourth occurrence is in an etymological section: the word "base" in the sense of "crude" or "vile" is an adjective.&lt;br /&gt;&lt;br /&gt;What's relevant about this example from the perspective of extracting PoS information is that in the first and fourth occurrences, the form to which the PoS element applies precedes that element, whereas in the second and third case, the form follows the PoS.&amp;nbsp; The markers that would help us distinguish these cases are not tags, but square brackets and possibly the word "See", or the language markers ("F." and "LL.").&amp;nbsp; The simple line separating data and metadata (text and tags) is blurred. (To add to the complexity, there are many entries where the headword has no PoS tag at all.&lt;br /&gt;&lt;br /&gt;Semantics is about independence of context and history - that's why it's simpler than pragmatics. Since pragmatic information is progressively added to and removed from context (scoped), I suspect it's easier ultimately to use a state machine to parse it. My first crude attempt at this needs a lot of rework, and certainly applying the regexp scan makes the problem a lot simpler - it removes one layer of structure, so I can concentrate on intra-entry parsing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1546640507656296526?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1546640507656296526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/baby-in-bathwater.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1546640507656296526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1546640507656296526'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/baby-in-bathwater.html' title='Baby in the Bathwater'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4218946805440573382</id><published>2009-12-06T08:09:00.000-08:00</published><updated>2009-12-06T08:09:40.338-08:00</updated><title type='text'>Spike Day 5 - Last Day</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;12/4/09&lt;/h1&gt;&lt;h2&gt;Priorities&lt;/h2&gt;&lt;div&gt;This is the last day of the spike. If I’m going to proceed as if this were a normal project, there are several options:&amp;nbsp; create the Entry Builder and the Orchestrator, and finish the Entry Extractor.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Entry Builder has to extract PoS and sense info from the entry string and construct a new object,&amp;nbsp; a lexicon entry optimized for the yet-to-be-specified parser.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actually, there’s more to it than just distinguishing senses.&amp;nbsp; There’s a morphological issue: the parser will be seeing inflected versions of words.&amp;nbsp; Some of them, like “walks”, “walking”, “walked” and “walker” can be mapped by general rules to their root words (“walk”) – these are the “regular” nouns and verbs, and typically the rules for encoding and decoding them would be in a separate component.&amp;nbsp; Others, like “children”, “knives” and “fish” (plural) are “irregular”, and these forms are always in the lexicon. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The Orchestrator is essentially for setting up the pipeline: wiring up the queues and transformations/filters/processors. (Think Mario Brothers – or am I still missing Spring too much?).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The Entry Extractor needs a few more rspec cases.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Okay – given that there are outstanding domain issues on the Entry Builder,&amp;nbsp; the Entry Extractor work is pretty straightforward,&amp;nbsp; and this spike is more about learning how to use Ruby constructs, I’ll proceed with the Orchestrator and wire up the pieces I’ve already got.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;First, some refactoring.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The EOS (end of source) string I started out using – “***EOS” - is problematic because the asterisks need to be escaped for it to be used as a regexp pattern. There’s no need to have more than one of these things, so it can be a constant and not have to be passed into to each processor class. I’ll set up a Pipeline module for all the classes to include.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The pipeline subfolder I created was primarily for seeing how &lt;i&gt;require&lt;/i&gt;&lt;span style="font-style: normal;"&gt; paths work – and it still confuses me a bit. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Project Structure and Require&lt;/h2&gt;&lt;div&gt;Now I want to move some classes around and see how Git and TextMate interact when I do that. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;Created a processors subdir and moved all the processor classes into it, along with their rspecs.&amp;nbsp; (Should there be a separate parallel test hierarchy ala Maven?)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://blog.jayfields.com/2006/10/ruby-project-tree.html"&gt;Jay Fields’ Thoughts: Ruby Project Tree&lt;/a&gt; does advocate that separation, so I’ll follow his lead.&amp;nbsp; I won’t take his suggestion re what &lt;a href="http://blog.8thlight.com/articles/2007/10/08/micahs-general-guidelines-on-ruby-require"&gt;Micah’s guidelines on Ruby require&lt;/a&gt; calls “require farms”.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I’d like some Montrachet with this Pinot Noir: there is such a thing as “require hell”!&amp;nbsp; I was sizzling in it – until Joe Banks (and Dave Chelimsky’s pre-release Rspec book PDF) bailed me out.&amp;nbsp; It took quite a while to clean it all up. In the process I realized that Rake is something I still need to understand. &lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Spike End: Lessons Learned&lt;/h2&gt;&lt;div&gt;What I learned is what I still need to learn. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Interestingly ambiguous sentence – there’s a contradictory interpretation: “there’s a set of things that I still need to learn and I actually learned them (so I don’t still need to learn them, but then ....)”.&amp;nbsp; What I intended was: “there’s a set of things I still need to learn and I learned what that set is”.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The biggest thing I need to learn is to &lt;i&gt;unlearn&lt;/i&gt;&lt;span style="font-style: normal;"&gt; what my years in the waterfall business made second nature: implicit BDUF.&amp;nbsp; What’s wrong with BDUF is that it’s almost always the wrong design.&amp;nbsp; I had a graphic demonstration of this when Dave H. went over my project and found a simpler way to do just about everything with regexps and &lt;a href="http://hpricot.com/"&gt;hpricot&lt;/a&gt;.&amp;nbsp; The faulty assumption – that BDUF habit - was that I needed to work with character streams.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;(Actually, this character-by-character parsing happened in a class from the earlier phase – the Tag Extractor – which I essentially abandoned for the right reason when I started on the W1913-specific classes.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;If I can bring a whole dictionary file into memory,&amp;nbsp; Dave’s solution will do the whole trick. None of them is bigger than 10 megs, so it could work.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Tried it: sure it works! – and it handled the “chunking” of entries in the A-B file (~5 megs) in less than a second.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;There were two occasionally conflicting goals for this experiment:&amp;nbsp; learn Ruby and craft a project.&amp;nbsp; I learned a ton of Ruby, and a lot about what I still need to learn about the craft.&amp;nbsp;&amp;nbsp; The project code itself is not particularly usable for practical purposes –&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Floorsweepings.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4218946805440573382?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4218946805440573382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-5-last-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4218946805440573382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4218946805440573382'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-5-last-day.html' title='Spike Day 5 - Last Day'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-892274997212831170</id><published>2009-12-03T20:54:00.000-08:00</published><updated>2009-12-03T20:59:33.019-08:00</updated><title type='text'>Spike Day 4</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;12/3/09&lt;/h1&gt;&lt;h2&gt;Priorities&lt;/h2&gt;&lt;div&gt;Feels like I’ve been yakking too much here and not coding enough, so just coding is a priority for today.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let’s see how fast I can get a pipeline going without agonizing over the likelihood that there are better Ruby ways to do this.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I’d like to set up a git repo to keep a baseline of the extractor project, so I’ll &lt;a href="http://en.wikipedia.org/wiki/Timeboxing"&gt;timebox&lt;/a&gt; that. One hour -too much? I really want to use git, so one hour it is.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Maybe later I’ll talk about yesterday’s two interview questions (pairing, evaluating tech) and last night’s dream (grammar school).&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Git ‘er did&lt;/h2&gt;&lt;div&gt;Setting up the Git repo took 25 minutes from scratch. Admittedly I cheated, having experimented with Git before.&amp;nbsp; But today I started by googling and used this page: &lt;a href="http://git.or.cz/course/svn.html"&gt;Git - SVN Crash Course&lt;/a&gt;, because I’m a longtime Subversion user.&amp;nbsp; Everything I needed to get started was there. The only thing it didn’t cover was &lt;i&gt;.gitignore&lt;/i&gt;&lt;span style="font-style: normal;"&gt; – and that was what I had had trouble with before. I wanted to ignore the logs folder. So I googled that and &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html"&gt;gitignore(5)&lt;/a&gt; did the trick.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The moral of this story is: to learn something new, see if you can start from where you are (pragmatic) rather than from some ideal image of where you want to be (semantic).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So I’ve tagged the baseline, and now I’ll start pipelining. But I want to remember to look at the code Dave recommended as an example of good Ruby style. It’s on github, so I’ll pull it when I have time.&amp;nbsp;&amp;nbsp; I’ll put that on a card (thanks again, Milo).&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Pipeline&lt;/h2&gt;&lt;h3&gt;Start with a story:&lt;/h3&gt;&lt;div&gt;&lt;i&gt;As a ... what? ... parser developer? ... I want to extract entries including PoS-by-sense from the public domain Merriam Webster 1913 dictionary, available online in a set of semi-marked-up text files for eventual feed into a lexicon builder.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Decompose story into a set of tasks as follows:&lt;/h3&gt;&lt;div&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4207083292437591023" name="OLE_LINK34"&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4207083292437591023" name="OLE_LINK35"&gt;&lt;i&gt;Read files.&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;s&gt;Split into buffers.&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;s&gt;Queue buffers in sequence.&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Extract entries as strings.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;&lt;s&gt;Queue entry strings in sequence.&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Build entry objects with PoS, headword and sense exposed.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;s&gt;Queue entries.&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;s&gt;&lt;br /&gt;&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The struck-thru buffer and queue tasks were premature. They should emerge from a process of organizing the primary tasks into objects.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Objects:&lt;/h3&gt;&lt;div&gt;&lt;i&gt;FileReader&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;EntryStringExtractor&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;EntryBuilder&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Orchestrator&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;This isn’t completely satisfactory but it’s a start.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I should have done this the first day!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I could create &lt;a href="http://en.wikipedia.org/wiki/CRC_card"&gt;CRC cards&lt;/a&gt; (does anybody still use them?). I haven’t done this in years but it’s worth trying. I’ll write them here and then on real cards:&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;FileReader&lt;/h3&gt;&lt;h4&gt;Responsibilities&lt;/h4&gt;&lt;div&gt;Accepts a sequential list of files, a queue, an EOS marker string and a buffer size.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Opens files in sequence.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reads files into buffers in sequence.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puts buffers on queue.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puts EOS marker on queue after last file is processed.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Collaborations&lt;/h4&gt;&lt;div&gt;File&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Queue&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;EntryStringExtractor&lt;/h3&gt;&lt;h4&gt;Responsibilities&lt;/h4&gt;&lt;div&gt;Accepts an input queue, an output queue, entry start and end patterns, and an EOS marker string.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Extracts entry strings from input buffers.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puts entry strings on output queue.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Passes EOS marker to output queue.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Collaborations&lt;/h4&gt;&lt;div&gt;Queue&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ConstituentExtractor &lt;br /&gt;&lt;/div&gt;&lt;h3&gt;EntryBuilder&lt;/h3&gt;&lt;h4&gt;Responsibilities&lt;/h4&gt;&lt;div&gt;Accepts an input queue, an array of patterns for element extraction, an EOS marker and an output queue.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Wait a minute&lt;/h3&gt;&lt;div&gt;This is starting to smell like BDUF. I don’t know where to draw the line, but the EntryBuilder definitely needs more thought – extracting multiple PoS-sense objects from one entry is not so simple. I’ll probably need to inject one or more extractors into the builder, and they’ll be more complex than the tag extractor, although they can use it.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;This won’t be finished during the spike.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I’m realizing that it was unrealistic to expect to be able to come up with something anywhere near as elegant as the &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata"&gt;Bowling Game Kata&lt;/a&gt; – and that’s been in the back of my mind from the get-go. What I’m trying to do here is nowhere near as well-defined as a bowling game.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;There’s also the painful tension between working with a very specific source like W1913 and wanting to end up with something reusable. I think the best move is to bite the bullet, go with the specificity (pragmatic!) and have faith in the process:&amp;nbsp; when there’s another source to be plumbed, it should be possible to externalize the specificities thru refactoring.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;BDD : pragmatics :: BDUF : semantics.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So I’m definitely going to stop now, go with the FileReader and the EntryStringExtractor (which I hereby dub the W1913FileReader and W1913EntryStringExtractor) and see what things look like when I get to the point of needing an entry builder.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Dependency Dejection&lt;/h3&gt;&lt;div&gt;Another learning bump – after months of intensive Springing, I have to get used to the absence/irrelevance of dependency injection in Ruby. I wanted to test the file reader by injecting a mock file object. Thanks to a chat with Craig D., I’m now using StringIO for that (also covered in TWGR).&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Githubbed?&lt;/h3&gt;&lt;div&gt;Created a repo on Github:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/GHogChi/FloorSweepingsCraftsmanSpike"&gt;http://github.com/GHogChi/FloorSweepingsCraftsmanSpike&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I have to push to it.&amp;nbsp; L8r.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Progress&lt;/h3&gt;&lt;div&gt;Got the file reader working to match the story.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Got the entry extractor to the point of a non-trivial failing test (git rev 1ab471ac08be62b076d29cc5a7664f370f05b83b).&amp;nbsp; Now I have to plug in the element extractor I created previously.&amp;nbsp; But time is short – should I try to push the repo or finish the story?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pushing the repo is for the blog readers – so far they are few and local, so I can show them the code locally. The push can wait.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Got deadlocks, have to continue tomorrow.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Git&lt;/h3&gt;&lt;div&gt;I think the push worked. Here’s the public clone URL:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;git://github.com/GHogChi/FloorSweepingsCraftsmanSpike.git &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Oh yeah..&lt;/h3&gt;&lt;div&gt;About the two interview questions and the dream:&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Is pairing productive?&lt;/h4&gt;&lt;div&gt;I hope I was clear about it. What I should have said is that notwithstanding the studies that show it ultimately saves time by catching problems early, it establishes a pattern of open information flow within the team.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;How do you evaluate technologies?&lt;/h4&gt;&lt;div&gt;What I hope I/should have said: after all the research/googling/book reading, it's good to do a test drive and give yourself a chance to get enthusiastic about it: as a developer, you'll have to live with it.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Dream&lt;/h4&gt;&lt;div&gt;I dreamt that as an adult, I had somehow applied to an elementary school and been accepted. I wanted to get back to basics. I ended up having a conversation with some teachers (in the teachers' lounge?) about our graduate degrees.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Okay, it was weird - it was a dream, after all. But I think part of it is a reflection on the back-to-basics nature of this Craftsman Spike.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-892274997212831170?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/892274997212831170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/12309-priorities-feels-like-ive-been.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/892274997212831170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/892274997212831170'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/12309-priorities-feels-like-ive-been.html' title='Spike Day 4'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-8053792707939691576</id><published>2009-12-02T15:52:00.000-08:00</published><updated>2009-12-02T19:54:09.076-08:00</updated><title type='text'>Spike Day 3</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h1&gt;12/2/09&lt;/h1&gt;&lt;h2&gt;Priorities&lt;/h2&gt;&lt;div&gt;Finish the extractor BDDing or start on pipelining?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dave’s keeping the definition of the “Craftsman Spike” open is a blessing and a curse. It’s forcing me to prioritize across “meta” boundaries and confront the local existential question: why am I here?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Prioritization is part of the craft, so in wrestling with these issues, I am learning something important.&lt;br /&gt;&lt;br /&gt;The story-level cycle (think about the story, run RGR cycles, repeat) requires a way to guarantee that the “thinking algorithm” will halt at a reasonable point, avoiding “analysis paralysis” and over-engineering. (In fact, the same issue comes up within the RGR cycle itself – cf. &lt;a href="http://jamesshore.com/Blog/Red-Green-Refactor.html"&gt;Red-Green-Refactor&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rereading that post by James Shore reminds me that I still need to work seriously on keeping the coding short in the RGR cycle. That first fiasco with the TagExtractor is a case in point. In fact, this is another example of the halting problem. Given that emitting only short bursts of code – baby steps - is a big priority, it points toward finishing the extractor story.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;But another priority here is learning Ruby, which I’m interpreting as “getting some experience with all the constructs that are new to me as a Java/C# developer”. From that perspective, these extractor stories are like micro-spikes that don’t have to lead to production code, just proof of concept.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It occurs to me that I can use this log/blog/diary as part of the cycle in a more granular way as a check on concision.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Interrupt&lt;/h2&gt;&lt;div&gt;In the spirit of making this more real-time (and probably more boring to folks reading it – hmm, should I be tweeting?), I'll mention that I just got an email from Andy M. about my Rails getting-started DB problems. He’s asking for my database.yml and Rails logs. (Embarrassing that I never looked at them....)&amp;nbsp; So hold on while I go look for those.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Interrupting the Interrupt&lt;/h2&gt;&lt;div&gt;Todd just cranked up Pandora – his blues station – and I didn’t recognize Howlin’ Wolf.&amp;nbsp; That’s gigantically embarrassing, but I can’t let it stop my march toward craftsmanship.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Back to Priorities&lt;/h2&gt;&lt;div&gt;If I want to finish the constituent extractor (CE), there are two stories I haven’t dealt with.&amp;nbsp; The easy one is – extract multiple constituents from one string. The hard one is figuring out how to deal with EOS, because in the current rspec context, the end_matcher is the same as the start_matcher – i.e., the beginning of a W1913 entry is a headword element, and the only way to find the end of it is to find the next headword.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I’ll start with the easy one and concentrate on concision.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;It occurs to me that I could be providing zips of the current state of the code for anybody crazy enough to want to follow this stuff in detail.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Don’t see how to do it with Blog*Spot free hosting, although they will host images.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Stupidity Interrupt&lt;/h2&gt;&lt;div&gt;How the hell did I ever decide that the initials for Red-Green-Refactor were “RGF”?&amp;nbsp; Sheesh! It’s RGR from now on. But I won’t go back and correct it.&amp;nbsp; (Stop laughing, Milo!)&lt;br /&gt;&lt;br /&gt;[UPDATE:&amp;nbsp; I lied - I went back and fixed it. No point in confusing the reader.] &lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Back to CE&lt;/h2&gt;&lt;div&gt;Going with the easy one first. Shore wants me to restrict myself to five lines of code per cycle. Let’s see if I can do that.&amp;nbsp; Should I &lt;a href="http://butunclebob.com/ArticleS.PaulPagel.PreFactoring"&gt;prefactor&lt;/a&gt;? (Hmm, that word seems to have turned into &lt;a href="http://en.wikipedia.org/wiki/Prefactoring"&gt;something else&lt;/a&gt; since I heard Paul P. and Micah M. using it.)&amp;nbsp; I think it will be harmless to prevent duplication by making my headword matcher an instance variable and moving the definition into a &lt;i&gt;before(:each)&lt;/i&gt;&lt;span style="font-style: normal;"&gt;, although Craig D. instilled the maxim “see the duplication before you remove it” in me.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Okay, I’ll admit it – I really miss Eclipse’s (and Visual Studio/ReSharper’s) instant highlighting of errors.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another prefactoring – extract a validation method for the results.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Leaning over backward to keep it under five lines: wrote this very long one:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;results = ConstituentExtractor.new(@headword_matcher, @headword_matcher).extract('&lt;hw&gt;A&lt;/hw&gt;x&lt;hw&gt;B&lt;/hw&gt;y&lt;hw&gt;C&lt;/hw&gt;')&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(If it works, I’ll go back and verify that Ruby won’t let me break it before or after the ‘.’.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Oops – I needed the offset argument in the extract call.&amp;nbsp; Now it’s the “shade of red” I wanted, and the test is only four lines long. (Just checking the size of the results array for now – expected 2, got 1.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Extracted the extraction code to a private method. The extract method calls it in a loop and increments the offset as long as there’s a match. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Ran the test – good news, bad news: the single extraction test is green, but the double extraction is still red.&amp;nbsp; I’m inferring that the problem is possibly a one-off in the offset handling in the loop.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Interrupt&lt;/h2&gt;&lt;div&gt;&lt;a href="http://milotodorovich.blogspot.com/"&gt;Milo T&lt;/a&gt;. IMs me.&amp;nbsp; Interesting convo. Some of it will show up here. He’s reading this blog. Suggesting I use cards to put some of the technical overthinking on the stack to keep it from slowing me down – a good idea for production, but this Craftsman Spike is rehearsal – speed is not the issue here, and overthinking is part of the process.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;But Milo’s right, kids – kards are kool! &lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Back to CE&lt;/h2&gt;&lt;div&gt;Wait – there is no loop yet! No wonder it only found one constituent.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Set up a &lt;i&gt;begin .. end until&lt;/i&gt; loop.&amp;nbsp; Oops – infinite - had to force-quit TextMate!&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Meta: Agile Athletics&lt;/h2&gt;&lt;div&gt;After the IM with Milo about metrics and micrometrics, I realize I’ve thought about Agile development as an athletic activity for a long time – it goes back to Kent Beck and the name XP. So the Craftsman Spike is like training camp – not necessarily just boot camp, but a refresher.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Back to CE&lt;/h2&gt;&lt;div&gt;Corrected the offset calc, and all is green!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Refactor:&amp;nbsp; deleted the debug console dumps.&amp;nbsp; Could probably compress the extraction into fewer lines, but I want to move on.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Now the hard one – dealing with the end of the source text (EOS).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Realized I could put the project into git – that would be the simplest way to track it through time. Still a little learning curve there – last time I tried git I had problems getting it to ignore some things.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Okay – trying EOS. I hope it’s as simple as an alternation (‘|’) in the end matcher.&amp;nbsp; Worked in &lt;a href="http://rubular.com/"&gt;rubular&lt;/a&gt; anyway.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Got to green on the EOS test, but boy does this need refactoring!&amp;nbsp; Passing in a couple of procs helped me learn about procs (certainly a spike goal), but the justification for it (duck typing: you could pass in anything as a matcher as long as it returns something that quacks a bit like MatchData, in case ordinary regexps aren’t enough) isn’t cutting it at the moment, mainly because so much of MatchData is being used now that EOS is supported. What’s worse: the extractor is making assumptions about what’s captured in the regexps. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So I’m going to pass in three regexp patterns:&amp;nbsp; constituent start, constituent end, and source end. It was another case of premature generalization – regexps are fine for my current story. I have to have faith in the process: keeping the code DRY and OO-clean will make it easy to generalize in future if necessary.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let’s see if I can do this refactoring in baby steps without breaking tests.... With Java constructor overloading it might be easier, but too bad.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Okay, after a couple of false steps, it’s done. No more procs – but at least now I know how to use them.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Noticed something nice (it may happen with Java too, but I don’t remember seeing it, maybe because Java code is more verbose):&amp;nbsp; every time I refactor, the code gets more compact.&amp;nbsp; Certainly true of the rspec class.&amp;nbsp; In the extractor class, the private extractor method is 18 lines long, which seems like a lot, but the algorithm is kinda complex and I used intermediate variables to keep it a little clearer as to what’s happening. There’s one comment, and it regrets itself:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # (smelly that this needs a comment) following line handles the normal and EOS cases:&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end_match_index = end_match.captures[0] ? end_match.begin(1) : end_match.begin(2)&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Anyway, the exposed surface of MatchData is not all that transparent.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So – pipelining?&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Pipelining again&lt;/h2&gt;&lt;div&gt;I’ll start from the outside and maybe get into some Ruby file IO.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Just got sidetracked into looking at issues with IO and String classes and encoding.&amp;nbsp; Can’t expect to come up with the ultimate efficient solution now – just want to concentrate on reading in files, pipelining, extracting, etc.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Will get to it tomorrow.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-8053792707939691576?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/8053792707939691576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8053792707939691576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/8053792707939691576'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-3.html' title='Spike Day 3'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-1410077155844641961</id><published>2009-12-02T07:19:00.000-08:00</published><updated>2009-12-02T07:19:03.170-08:00</updated><title type='text'>Spike Day 2</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;&lt;/h1&gt;&lt;h1&gt;12/1/09&lt;/h1&gt;&lt;h2&gt;Procs and Duck Typing&lt;/h2&gt;&lt;div&gt;Picking up from yesterday: got the first rspec for the CE passing – no match returns empty array. That establishes the infrastructure of the class but with a minimal commitment to anything else. Now I have to decide exactly what should come back as the result of extraction.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How about:&amp;nbsp; start and end offsets and the match for the tipoff.&amp;nbsp; In the case of W1913, that would be the headword element:&amp;nbsp; &lt;hw&gt;someword&lt;/hw&gt;. In the case of the PPP (Post-Platonic Parser – TBE [To Be Explicated]), that would be a matter of matching a word like ‘the’ (the tipoff) and the noun phrase it introduces (the rest of the constituent).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or should it include the entire substring that represents the constituent? To say no at this point would smack of premature optimization. So I’ll go for it.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Should it be an object, a hash or an array? I’m leaning toward an object. I’m not sure that’s the simplest thing that can possibly work, but it seems cleaner. I’d rather create an object I don’t need and eliminate it later than have to find all the places I’d have to change a hash or an array to an object. (I’m afraid I’m still thinking too much in terms of static typing rather than duck typing, and maybe I’m overly concerned about the lack of refactoring tools.)&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Smelly&lt;/h2&gt;&lt;div&gt;Got to green on &lt;i&gt;it “should return the proper constituent on a match”&lt;/i&gt;&lt;span style="font-style: normal;"&gt;, but it took too long and involved too much code.&amp;nbsp; I learned a good chunk about procs and MatchData, but I’m not happy with my BDD process or the resulting code.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Part of the problem seems to be premature generalization – trying to implement two stories at once. I should have stuck with the W1913 entry extraction. Especially when I’m working with code constructs I’m not familiar with.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And there’s something smelly about the Constituent class I created, beyond its being just a transfer object.&amp;nbsp; It exposes the tipoff string and the full constituent string, which is okay, but it also exposes the offset of the constituent in the string passed in.&amp;nbsp; That datum is irrelevant to the actual use of the object, and it ended up there for two bad reasons. The first is that I was thinking ahead to the problem of buffering the multiple files that make up W1913. The second is some interference from thinking about citations (see yesterday): I want a citation object to track the location of its target string within a source object. (I want to track offsets in the PPP as well.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Does the fact that I’m wearing two hats at once (customer and developer) have something to do with it? Having a real dialog would help to clarify the issues (minimalist version of crowdsourcing – N heads better than one).&amp;nbsp; Similarly – I’m not pairing.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wait – I’m beating myself up unnecessarily here (stop grinning, Milo!).&amp;nbsp; The offset is not completely illegitimate – it really is part of the story - maybe it just needs to be packaged better.&amp;nbsp; There are local/contingent offsets within the strings (buffers) that are passed into the extractor, and there are persistent and meaningful offsets in the sources (files).&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And let’s face the generalization issue head-on.&amp;nbsp; There are lots of situations where we do this kind of thing: screen-scraping, data-mining, etc. No way this puppy can handle all of them. Generalization is way premature. If I end up with multiple classes that do very similar things, and they’re all good OO citizens,&amp;nbsp; generalizing should be a clean refactoring. So – back to the W1913 story.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;&amp;nbsp;Pipeline?&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;A new thought:&amp;nbsp; what if all these extractors could be pipelined? E.g.:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;W1913 files | entry extractor | PoS extractor | lexipedia updater [TBE]&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(I would have used “=&amp;gt;” there, but it would collide with Ruby notation, so I went for the *nix operator instead).&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Threads communicating via queues - not only could it work, and fit into the bigger picture, it gives me a chance to work with threading and file IO in Ruby.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;But first...&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;... a bit more work on the constituent extractor.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A thought about offsets: if I take the citation/source concept seriously, the current constituent extractor is working on essentially transient strings.&amp;nbsp; So the source object would have to reflect that, and the citation object would just be an offset and a reference to the source. The constituent extractor could easily inject citations into constituent constructors.&amp;nbsp; For pipelining, the thread that feeds the extractor could use the returned offsets in managing its buffers.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-1410077155844641961?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/1410077155844641961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1410077155844641961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/1410077155844641961'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-2.html' title='Spike Day 2'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-7928627023737582535</id><published>2009-12-01T14:52:00.000-08:00</published><updated>2009-12-02T19:52:55.109-08:00</updated><title type='text'>Spike Day 1</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;&lt;/h1&gt;&lt;h1&gt;11/30/09&lt;/h1&gt;&lt;h2&gt;Code&lt;/h2&gt;&lt;div&gt;Went back to the POS extractor project.&amp;nbsp; Moved Element from element_extractor.rb to its own file.&amp;nbsp; Tried to run the rspec from TextMate. Got exception:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/Users/Tom/.gem/ruby/1.8/gems/rspec-1.2.9/lib/spec/runner/options.rb:282:&lt;a href="http://www.blogger.com/post-create.g?blogID=4207083292437591023" name="OLE_LINK1"&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4207083292437591023" name="OLE_LINK2"&gt;in `files_to_load': File or directory not found&lt;/a&gt;: nt_extractor_spec.rb (RuntimeError)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Somehow the rspec file name is truncated.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tried running a different rspec file.&amp;nbsp; Name truncated – in both cases it’s the first five characters.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tried running the element extractor test from the command line:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;./element_extractor.rb:2:in `require': no such file to load -- log4r (LoadError)&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have to decide which issue to pursue. I want to be able to use TextMate, so ultimately that one needs to be resolved.&amp;nbsp; I also want to understand how to specify the load path for Ruby.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Googling the TextMate problem didn’t lead to a solution (nobody else seems to have this problem)....&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Meta: Baseline Meeting with Dave H.&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;... but talking to Dave did – rubber-duckily!&amp;nbsp; I had opened the project in TextMate at the wrong level – once I opened it at the folder level, everything worked fine.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, he explained the command line problem: I was trying to run the rspec tests with &lt;i&gt;ruby&lt;/i&gt;&lt;span style="font-style: normal;"&gt; rather than &lt;/span&gt;&lt;i&gt;spec&lt;/i&gt;&lt;span style="font-style: normal;"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dave saw that I was not using Rspec mocks correctly (could have just used an &lt;i&gt;Object.new&lt;/i&gt;&lt;span style="font-style: normal;"&gt;) in creating my “character stream”, and the need for a ‘fake’ class emerged from the convo.&amp;nbsp; I suspect that I would eventually have been driven to this conclusion by duplication across tests, but part of the goal of this spike for me is getting to a “Ruby state of mind” where these things occur to me sooner.&amp;nbsp; As a beginner, I’m bombarded with lots of different issues while trying to write code, and only when some operations become “second nature” will I have enough mental cycles available to see things like this early.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: normal;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Efficient use of resources is a major goal, one I suspect should be part of the apprenticeship process.&amp;nbsp; The learning process is like meta-RGR (red-green-refactor):&amp;nbsp; I get something accomplished, but then I need to review how I got there and see how my own thought processes can be refactored, made DRYer and simpler. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The issue of whether to get into Rails or continue with Ruby seems to be at least temporarily resolved in favor of Ruby after the convo with Dave, both for technical reasons (no immediate solution for the Rails problems) and for reasons of interest (linguistic) which seem to trump the career-oriented argument for Rails.&amp;nbsp; I’m a starving artist!&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dave also turned me on to WordNet (http://wordnet.princeton.edu/).&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Meta: Word for Mac destroys Universe&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;I was just about to enter something here (following section) [I started writing this blog in Word for Mac] when I made the mistake of using Cmd-W to close a Find dialog.&amp;nbsp; My MBP rebooted!&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lesson: if it hurts, don’t do it.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fallout:&amp;nbsp; Firefox crashed, leaving its profile locked.&amp;nbsp; Have to clean that up to get back to my bookmarked pages.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to deal with distractions/tangents like this without losing momentum? One answer would seem to be: find the simplest fix that can possibly work, but postpone the refactoring (i.e., preventing the problem). Put it on a card!&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally got Firefox back after having to delete both .parentlock and places.sqlite from the profile folder.&amp;nbsp; No simpler fix – I needed all the bookmarks! (I had to use Safari to find this info – glad it’s there!)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Changing stories&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;BDD’ing the Pos Extractor has led me to some new stories.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I need to identify the beginning and end of an entry in W1913.&amp;nbsp; This goes beyond element extraction with tags.&amp;nbsp; Entries begin with the &lt;i&gt;&lt;hw&gt;&lt;/hw&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt; (headword) tag, but the headword element is just the word name.&amp;nbsp; The only way to identify an entry is to find the beginning of the next one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I’m thinking that’s just what I need for analyzing constituents in text in general: a constituent extractor. It would have to operate on strings, not character streams, because it potentially needs to back up more than one character if it’s a matter of some kind of pattern match for the beginning of some other constituent.&amp;nbsp; In the case of a W1913 entry extractor, that would mean finding another headword start tag or EOF.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Can I use Ruby regexps for this? They would have to return the index of the beginning of the match. Or ... maybe it could be a Lispish thing of peeling off the head and leaving the tail....&amp;nbsp; The index isn’t the essence of the story: moving through the string is the key. As long as the regexp can return two matches, the constituent and the tipoff (e.g., start tag) of the next constituent, no index is needed.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Never mind! This is exactly what I need:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: black; font-family: Times-Roman; font-size: 9.5pt;"&gt;“Where &lt;/span&gt;&lt;span style="color: black; font-family: Courier; font-size: 9pt;"&gt;match &lt;/span&gt;&lt;span style="color: black; font-family: Times-Roman; font-size: 9.5pt;"&gt;and &lt;/span&gt;&lt;span style="color: black; font-family: Courier; font-size: 9pt;"&gt;=~ &lt;/span&gt;&lt;span style="color: black; font-family: Times-Roman; font-size: 9.5pt;"&gt;differ from each other chiefly is in what they return when there is a match: &lt;/span&gt;&lt;span style="color: black; font-family: Courier; font-size: 9pt;"&gt;=~ &lt;/span&gt;&lt;span style="color: black; font-family: Times-Roman; font-size: 9.5pt;"&gt;returns the numerical index of the character in the string where the match started, whereas &lt;/span&gt;&lt;span style="color: black; font-family: Courier; font-size: 9pt;"&gt;match &lt;/span&gt;&lt;span style="color: black; font-family: Times-Roman; font-size: 9.5pt;"&gt;returns an instance of the class &lt;/span&gt;&lt;span style="color: black; font-family: Courier; font-size: 9pt;"&gt;MatchData....&lt;/span&gt;“ &lt;br /&gt;&lt;/div&gt;&lt;div&gt;-- &lt;a href="http://www.amazon.com/Well-Grounded-Rubyist-David-Black/dp/1933988657/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1259707538&amp;amp;sr=1-1"&gt;&lt;b&gt;The Well-Grounded Rubyist&lt;/b&gt;&lt;/a&gt;&lt;span style="font-weight: normal;"&gt; by &lt;a href="http://www.amazon.com/David-A.-Black/e/B001K7RPQO/ref=ntt_athr_dp_pel_1"&gt;David Black&lt;/a&gt; &lt;/span&gt;–&amp;nbsp; Section 11.2.2, p.322&lt;br /&gt;&lt;br /&gt;(This is a great book - the best programming language intro I've ever read!) &lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Implish thought:&lt;o:p&gt;&lt;/o:p&gt;&lt;/h3&gt;&lt;div&gt;... as in “implementation” and “impish”.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Could operate on a char stream by extending buffers until a match or EOF is found.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seems best to proceed by ignoring this, working with strings, and having faith in the process – i.e., that using hygienic practices will allow for easy incorporation of streams later.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Time out to read TWGR on regexps and procs.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The goal here is for the PoS extractor to get a series of complete entries from its input, then extract PoS info from each entry. A constituent extractor would be used to get the entry.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This gets into the other objects I want: citation and source identifier.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Citation is an object that specifies a string within some persistent source entity: a file, a blob in a DB, etc. , but does not actually contain the string. It should be able to produce the string on demand. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A citation would hold a reference to a source identifier, an object that offers one or more ways to access the source entity:&amp;nbsp; URLs, filepaths, DB queries.&amp;nbsp; I’m not even going to try to imagine what “access” will turn out to mean in implementation terms.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is this BDUF again? Not if I BDD the constituent extractor without prejudice. If it doesn’t lead inevitably to a citation, so be it.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The reservoir&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;The above should have been a matter of thinking about possible designs without committing to anything. Here I’m following the concepts of one of my mentors, the actor, director and teacher Steven Ivcich. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He has a very nonstandard approach to preparing for performance. &amp;nbsp;It involves a lot of near-random improv and playing with the script. &amp;nbsp;His term for this is "filling up your reservoir". &amp;nbsp;The idea behind "classical" preparation and rehearsal for an actor is that you are locking down the character and all your moves before you ever perform. &amp;nbsp;Steven's approach is much more agile: &amp;nbsp;every performance involves new information - new audiences, &amp;nbsp;new energies, new twists on the interaction with other actors. &amp;nbsp;You develop the reservoir as a way of preparing to respond to unexpected developments. &amp;nbsp;In other words, no Big Design Up Front.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To bind the analogy:&amp;nbsp; the RGR cycle is the performance, and thinking about the domain and possible technologies before going into the cycle is filling the reservoir. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;BDDing the Constituent Extractor&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div&gt;I’m thinking that the CE is initialized with two procs for matching the beginning and end of a constituent, each returning an offset (maybe they just run a regexp, and maybe not), and it replies to messages containing a string and an offset with an array of strings – no, constituent objects, each of which has the offset of the beginning of the constituent and a length. If the CE finds the beginning of a constituent but not an end, the length will be nil or infinity.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is bothering me. Already too implish? Pushing toward the constituent object being a citation?&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-7928627023737582535?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/7928627023737582535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7928627023737582535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/7928627023737582535'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/spike-day-1.html' title='Spike Day 1'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4135681294165673433</id><published>2009-12-01T14:39:00.000-08:00</published><updated>2009-12-01T14:39:55.333-08:00</updated><title type='text'>More Run-up to the Spike</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;11/29/09&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Got the EE into reasonable shape.&amp;nbsp; Instead of proceeding on the PE, I’m going thru the Rails startup in &lt;b&gt;Agile Web Development with Rails&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Set up the demo project. Need to make MySQL the DB.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Problems with database.yml:&amp;nbsp; can’t use mysql – rake db:create throws a not-very-informative exception:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Couldn't create database for {"timeout"=&amp;gt;5000, "username"=&amp;gt;"root", "adapter"=&amp;gt;"mysql", "database"=&amp;gt;"railsdb.myapp", "pool"=&amp;gt;5, "host"=&amp;gt;"127.0.0.1", "password"=&amp;gt;nil, "socket"=&amp;gt;"/tmp/mysql.sock"}, charset: utf8, collation: utf8_unicode_ci (if you set the charset manually, make sure you have a matching collation)&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Googled it.&amp;nbsp; None of the proposed fixes work. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tried creating the database manually.&amp;nbsp; Now rake db:migrate throws an exception:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;uninitialized constant MysqlCompat::MysqlRes&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Googled it. Again, none of the proposed fixes work.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Followed advice from my Ruby help-line (Craig D.):&amp;nbsp; use the Rails default DB sqlite3. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now rake db:migrate succeeds, claiming it created the “users” table. After generating the scaffold, I try running the server from TextMate.&amp;nbsp; It complains:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;RuntimeError: Please install the db/sqlite3 adapter: `gem install activerecord-db/sqlite3-adapter` (no such file to load — active_record/connection_adapters/db/sqlite3_adapter)&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I try &lt;i&gt;sudo gem install activerecord-db/sqlite3-adapter&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt; which results in:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;ERROR:&amp;nbsp; could not find gem activerecord-db/sqlite3-adapter locally or in a repository&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I give up for the evening, but I’m thinking: if you’re going to throw a runtime exception that won’t be handled by code,&amp;nbsp; you should expect that it will end up in a logfile and some human will have to try to figure out what happened.&amp;nbsp; So why not have a mechanism that dumps not only a stacktrace but the context – like all variables in scope (locals, method arguments, instance variables, etc.) at each stack level?&amp;nbsp; Better to have way too much than way too little.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4135681294165673433?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4135681294165673433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/more-run-up-to-spike.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4135681294165673433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4135681294165673433'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/more-run-up-to-spike.html' title='More Run-up to the Spike'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4346701769791339272</id><published>2009-12-01T08:27:00.000-08:00</published><updated>2009-12-01T09:28:24.814-08:00</updated><title type='text'>Run-up to the Spike</title><content type='html'>&lt;span style="font-size: xx-small;"&gt;(See &lt;a href="http://floorsweepings.blogspot.com/2009/12/new-broom.html"&gt;New Broom&lt;/a&gt; for an explanation....)&lt;/span&gt;&lt;br /&gt;&lt;h3&gt;11/28/09&lt;/h3&gt;I’ve been writing Ruby using &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; and &lt;a href="http://rspec.info/"&gt;Rspec&lt;/a&gt; for a couple of days now.&lt;br /&gt;&lt;br /&gt;Yesterday I &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt;’d a TagExtractor specifically for extracting PoS (Part of Speech) info from &lt;a href="http://www.gutenberg.org/etext/660"&gt;W1913&lt;/a&gt; (the Project Gutenberg semi-marked-up Merriam-Webster dictionary from 1913). Strayed from the path – got into a very complicated parse method with multiple flags.&lt;br /&gt;&lt;br /&gt;I decided to step back and approach the problem from the direction of “pure &lt;a href="http://agile2009.agilealliance.org/taxonomy/term/579"&gt;story&lt;/a&gt;” – i.e., let the story drive the test and let the test drive the implementation decisions. This resulted in &lt;a href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;BDD&lt;/a&gt;ing of the&lt;br /&gt;PosExtractor, which will take a character stream and return an array of triples: {:word, :sense, :PoS}.&lt;br /&gt;&lt;br /&gt;Now there’s a dialectic between the PE (PosExtractor) and the TE (TagExtractor) which is starting to drive the TE toward a simpler and hopefully more Ruby-like implementation, using Element objects that consume from a character stream.&lt;br /&gt;&lt;br /&gt;Starting with the TE was the first mistake: a bottom-up approach locking into an implementation detail that should emerge from BDD. BDD done right prevents &lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;BDUF&lt;/a&gt;;&amp;nbsp; TDD can encourage it. Starting from the nouns and verbs of the story makes possible a progressive decomposition of the&lt;br /&gt;story into objects and functions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ruby.about.com/od/rubyfeatures/a/require.htm"&gt;Require&lt;/a&gt;d &lt;a href="http://log4r.sourceforge.net/"&gt;log4r&lt;/a&gt; to debug TE.&lt;br /&gt;&lt;br /&gt;Created new class ElementExtractor (EE) from TE to eliminate the find_all_tags noise – BDD’d it.&lt;br /&gt;Now the Element class, which was just a transfer object that accumulated content, has evolved under BDD pressure to detect its end tag and mark itself complete, which simplifies EE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4346701769791339272?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4346701769791339272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/run-up-to-spike.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4346701769791339272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4346701769791339272'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/run-up-to-spike.html' title='Run-up to the Spike'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4207083292437591023.post-4343946396608048327</id><published>2009-12-01T08:20:00.000-08:00</published><updated>2009-12-03T12:19:47.640-08:00</updated><title type='text'>New Broom</title><content type='html'>I'm starting this blog to track my software apprenticeship - for an explanation of that term, see &lt;a href="http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382/ref=ntt_at_ep_dpi_1"&gt;Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman&lt;/a&gt;&amp;nbsp; by &lt;a href="http://www.amazon.com/Dave-Hoover/e/B002TN5T0C/ref=ntt_athr_dp_pel_1"&gt;Dave Hoover&lt;/a&gt; and Adewale Oshineye.&amp;nbsp; In fact, buy the book, so you can understand why somebody who's been in the software development biz since computers ran on kerosene would want to be an apprentice, and whence the title of this blog.&lt;br /&gt;&lt;br /&gt;I'm going to start off with some postings from my Ruby diary.&amp;nbsp; I'm at &lt;a href="http://www.obtiva.com/"&gt;Obtiva&lt;/a&gt; this week, participating in a "Craftsman Spike".&amp;nbsp; Instead of trying to explain that, I'll let you read the posts.&amp;nbsp; And eventually I'll fill in more background.&lt;br /&gt;&lt;br /&gt;I've used "TWGR" in some of the posts - that stands for &lt;a href="http://www.amazon.com/Well-Grounded-Rubyist-David-Black/dp/1933988657/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1259871481&amp;amp;sr=1-1"&gt;The Well-Grounded Rubyist&lt;/a&gt;, the best programming language book I've ever read and currently my bible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4207083292437591023-4343946396608048327?l=floorsweepings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://floorsweepings.blogspot.com/feeds/4343946396608048327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/new-broom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4343946396608048327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4207083292437591023/posts/default/4343946396608048327'/><link rel='alternate' type='text/html' href='http://floorsweepings.blogspot.com/2009/12/new-broom.html' title='New Broom'/><author><name>G-Hog-Chi</name><uri>http://www.blogger.com/profile/09005675901048235160</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://2.bp.blogspot.com/_YQU7EFzWf8Y/S38jfNmwmpI/AAAAAAAAABY/8ANybDwK5oo/S220/20050201_groundhog.jpg'/></author><thr:total>0</thr:total></entry></feed>
