<?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-8579476</id><updated>2012-01-03T19:44:16.854-08:00</updated><title type='text'>Reflections on Programming</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://reflectionsonprogramming.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8579476.post-5671068491399621955</id><published>2007-01-17T09:03:00.000-08:00</published><updated>2007-01-17T09:04:57.485-08:00</updated><title type='text'>Moving</title><content type='html'>I have decided  to consolidate my blogs into a single one at &lt;a href="http://john-dunne.blogspot.com/"&gt;http://john-dunne.blogspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-5671068491399621955?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/5671068491399621955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/5671068491399621955'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2007/01/moving.html' title='Moving'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-115341168901096447</id><published>2006-07-20T09:07:00.000-07:00</published><updated>2006-07-20T09:08:09.026-07:00</updated><title type='text'>Quote of the Day</title><content type='html'>&lt;div style="text-align: left; font-style: italic;"&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;blockquote&gt;Watch where the footpaths go before you lay down  the sidewalks.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-115341168901096447?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/115341168901096447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/115341168901096447'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2006/07/quote-of-day.html' title='Quote of the Day'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113829329287898754</id><published>2006-01-26T08:34:00.000-08:00</published><updated>2006-01-26T08:34:52.886-08:00</updated><title type='text'>Grooks</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;By way of &lt;a href="http://dig.csail.mit.edu/breadcrumbs/node/72"&gt;Tim Berners-Lee&lt;/a&gt;, I found this wonderful collection of &lt;a href="http://chat.carleton.ca/%7Etcstewar/grooks/grooks.html"&gt;Grooks&lt;/a&gt; by Piet Hein. They have a wonderfully whimsical character, like this one:&lt;br/&gt;&lt;blockquote&gt;&lt;pre&gt;BUDGETING: THE FIRST LAW &lt;br/&gt;&lt;br/&gt;If you want to know&lt;br/&gt;where your money went,&lt;br/&gt;you must spend it quickly&lt;br/&gt;before it's spent. &lt;/pre&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113829329287898754?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113829329287898754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113829329287898754'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2006/01/grooks.html' title='Grooks'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113812912561081467</id><published>2006-01-24T10:58:00.000-08:00</published><updated>2006-01-24T10:58:45.650-08:00</updated><title type='text'>Great Quote</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.darrenhobbs.com/archives/2006/01/agile_answers.html"&gt;Darren Hobbs: Agile Answers&lt;/a&gt; &lt;br/&gt; &lt;blockquote&gt;Developing incrementally does not (in my opinion) mean taking your brain out before starting. &lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113812912561081467?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113812912561081467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113812912561081467'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2006/01/great-quote.html' title='Great Quote'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113778787175309382</id><published>2006-01-20T12:05:00.000-08:00</published><updated>2006-01-20T12:11:11.766-08:00</updated><title type='text'>What happens when you don't "get it"</title><content type='html'>&lt;a href="http://blogs.pragprog.com/cgi-bin/pragdave.cgi/Random/Imitation.rdoc"&gt;PragDave&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;Without exception, these early attempts at imitation failed: the car companies replicated what they saw Toyota doing, but only on the surface. They didn't really understand what was behind these practices. It was like trying to become an artist by copying the angle and velocity of the brush held by a master.&lt;/blockquote&gt;You see this happen often with various "agile" practices, like test driven development, XP, or Scrum.  If all of the participants don't grok the practice, then they blindly execute a series of steps, and say, "See.  It didn't work!"&lt;br /&gt;&lt;br /&gt;There are two possible resolutions to this problem.&lt;br /&gt;&lt;br /&gt;You can &lt;span style="font-weight: bold;"&gt;tighten up the process&lt;/span&gt;.  Unfortunately, if you didn't "get it" in the first place, you are likely to cause more harm than good.  At its pathological extreme, your team works like the staff of a McDonald's, with each person following a carefully prescribed methodology.  If you are building the software equivalent of a Big Mac, then this might be perfect for you.&lt;br /&gt;&lt;br /&gt;You can &lt;span style="font-weight: bold;"&gt;invest in your people&lt;/span&gt;.  The old saw about giving a man a fish versus teaching him to fish applies here.  For even the most simple project, it is nearly impossible to prescribe everything.  At some point, personal judgement has to kick in, therefore it makes sense to equip the team with the mental tools needed to make the right decisions.&lt;br /&gt;&lt;br /&gt;I don't mean to "dis" process, but I think you reach a point of diminishing returns, with "process improvement" whereas "people improvement" will always pay off handsomely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113778787175309382?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113778787175309382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113778787175309382'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2006/01/what-happens-when-you-dont-get-it.html' title='What happens when you don&apos;t &quot;get it&quot;'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113632441403801573</id><published>2006-01-03T13:40:00.000-08:00</published><updated>2006-01-03T13:40:14.046-08:00</updated><title type='text'>Design by Contract is trademarked!</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I was reading this article called &lt;a href="http://www.artima.com/cppsource/deepspace.html"&gt;Contract Programming 101&lt;/a&gt;, when I ran into this little gem:&lt;br/&gt;&lt;blockquote&gt;Note: the term &lt;em&gt;Design By  Contract&lt;/em&gt; was trademarked in 2003 by Dr.  Meyer, so all the little  free software pixies are dropping the term like a hot coal.  The latest  favoured term is &lt;em&gt;Contract Programming&lt;/em&gt;, as suggested by Walter  Bright in 2004 and used in the recent proposal by Thorsten Ottosen and  Lawrence Crowl to the C++ standards body.&lt;/blockquote&gt;That is not cool!&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/8579476-113632441403801573?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113632441403801573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113632441403801573'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2006/01/design-by-contract-is-trademarked.html' title='Design by Contract is trademarked!'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113174915191523233</id><published>2005-11-11T14:45:00.000-08:00</published><updated>2005-11-11T14:45:51.950-08:00</updated><title type='text'>Index Cards</title><content type='html'>Extreme Programming has this strong tradition of using index cards to track &lt;a href="http://www.c2.com/cgi/wiki?UserStory"&gt;user stories&lt;/a&gt;, or to aid in design through the use of &lt;a href="http://www.c2.com/cgi/wiki?CrcCard"&gt;CRC cards&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Now, I have always had a strong preference for Excel spreadsheets.&amp;nbsp;&amp;nbsp;You can print them, e-mail them, share them, and save them. &lt;br/&gt;&lt;br/&gt;But there is something wonderful in the very nature of index cards.&amp;nbsp;&amp;nbsp;Their very constraints create interesting feedback loops.&amp;nbsp;&amp;nbsp;Think of all the objections that you might have against them:&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Index cards are too easy to lose.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;Yes – but why are you writing anything important on an index card in the first place?&amp;nbsp;&amp;nbsp; At the end of the day, the only important work product is the code.&amp;nbsp;&amp;nbsp;&lt;a href="http://www.agilemodeling.com/"&gt;Requirements and any other models&lt;/a&gt; exist to facilitate conversations about the code.&amp;nbsp;&amp;nbsp;If you have been writing tests along the way, when the coding is done, the requirements don’t need to exist anymore.&amp;nbsp;&amp;nbsp;The requirements aren’t sacred.&amp;nbsp;&amp;nbsp;The only thing that is sacred, the desires of your users, cannot be captured in any format, but must be discovered through a constant dialog.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Index cards are too bulky.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;If you have more index cares than you can manage, then your user stories are either too fine grained or your scope is too ambitious.&amp;nbsp;&amp;nbsp;Either way, the cards are telling you that you need to change.&lt;br/&gt;&lt;br/&gt;This is a pet peeve of mine.&amp;nbsp;&amp;nbsp;Quite often, when you are doing the wrong thing, it will be difficult.&amp;nbsp;&amp;nbsp;The correct solution is not to make it easier to do the wrong thing, but to change what you were doing in the first place.&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Only one person can “own” an index card at a time.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;So what?&amp;nbsp;&amp;nbsp;Distributed ownership is the worst thing that can happen in project management.&amp;nbsp;&amp;nbsp;If everyone owns a task, then no one is really responsible for carrying it out.&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Having said all that, I am still mulling over the use of index cards in my process, and have started collecting links about index cards in &lt;a href="http://del.icio.us/johndunne/indexcards"&gt;del.icio.us&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113174915191523233?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113174915191523233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113174915191523233'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/11/index-cards.html' title='Index Cards'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113145160402704058</id><published>2005-11-08T03:56:00.000-08:00</published><updated>2005-11-08T09:39:26.456-08:00</updated><title type='text'>Holistic thinking is disruptive</title><content type='html'>In the November issue of the &lt;a href="http://www.theatlantic.com/"&gt;Atlantic Monthly&lt;/a&gt;, there was a &lt;a href="http://www.theatlantic.com/doc/prem/200511/primarysources"&gt;brief article&lt;/a&gt; about the heuristics used by the US intelligence community to detect spies.&lt;br /&gt;&lt;blockquote&gt;They may also take a "holistic view of world affairs" that could lead them to believe espionage is "morally justifiable."&lt;/blockquote&gt;You can read this any number of ways, and I won't debate the ethics of making decisions to support particular policies of this adminstration in spite of common sense (or holistic thinking) telling you otherwise.&lt;br /&gt;&lt;br /&gt;But I would like to touch briefly on his this might affect &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; organization. When it exceeds a certain size, every organization begets a hierarchy of departments.  While the organization, as a whole, might wish to move in one direction, each department has its own incentives, which sometimes contradict the organization's larger goals.&lt;br /&gt;&lt;br /&gt;In such a world, to think &lt;span style="font-weight: bold; font-style: italic;"&gt;holistically&lt;/span&gt; is to think about disruption, as any move to re-align the departments with the organization's goals will result in disruption to that department's practices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113145160402704058?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113145160402704058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113145160402704058'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/11/holistic-thinking-is-disruptive.html' title='Holistic thinking is disruptive'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113137949177607957</id><published>2005-11-07T08:04:00.000-08:00</published><updated>2005-11-07T08:04:51.826-08:00</updated><title type='text'>Behavior Driven Development</title><content type='html'>I recently read an interesting paper by &lt;a href="http://www.daveastels.com/index.php?section=1"&gt;Dave Astels&lt;/a&gt;, entitled &lt;a href="http://blog.daveastels.com/?p=53"&gt;A New Look at Test-Driven Development&lt;/a&gt;, which suggested that Test Driven Design is overly focused on testing, which gets in the way of reaping the true benefits of TDD.&lt;br/&gt;&lt;br/&gt;I agree that using the word “test” when describing TDD definitely gets in the way, when explaining it to other people.&amp;nbsp;&amp;nbsp;Management asks, “Why are we hiring testers if developers will be writing tests?”&amp;nbsp;&amp;nbsp;Developers ask, “Why should I write unit tests for code that will get tested by the (manual or automatic) acceptance tests?”&amp;nbsp;&amp;nbsp;And so on.&amp;nbsp;&amp;nbsp;You get the usual objections to TDD.&lt;br/&gt;&lt;br/&gt;So I am down with giving TDD another name, but what threw me was the suggestion that we ought &lt;strong&gt;&lt;em&gt;not &lt;/em&gt;&lt;/strong&gt;to use the word “test” when actually writing the tests.&lt;br/&gt;&lt;br/&gt;In Behavior Driven Development, tests are called “specifications.”&amp;nbsp;&amp;nbsp;Fixtures are called “contexts.”&amp;nbsp;&amp;nbsp;And instead of assert, one would say “should.”&amp;nbsp;&amp;nbsp;(Dave’s essay has examples of their usage.)&lt;br/&gt;&lt;br/&gt;Initially, I was fairly dismissive of what seemed like a cosmetic change, but I decided to give it a go for the past week.&amp;nbsp;&amp;nbsp;Here is what I found.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;I wrote more, smaller test fixtures.&amp;nbsp;&amp;nbsp;&lt;/em&gt;Whereas I used to write test fixtures with names, like CustomerFixture, I found myself creating many little contexts, with names like CustomerWithOverdueBill or CustomerWithoutAddress.&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;I wrote more asserts per test.&amp;nbsp;&amp;nbsp;&lt;/em&gt;Each test started with a particular context, invoked a particular operation in that context, and then verified the expected resulting context.&amp;nbsp;&amp;nbsp;That verification often took multiple asserts.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The tests naturally had better names.&amp;nbsp;&amp;nbsp;&lt;/em&gt;In the past, when writing tests for a Customer class, I might have tests with names like testSetAddress.&amp;nbsp;&amp;nbsp;Now, I find myself thinking in terms of scenarios, so that the CustomerWithoutAddress context might have a specification like settingAddressForFirstTimeSendsNotifcation.&lt;br/&gt;&lt;br/&gt;In summary, this change in perspective has proven extremely useful, so I am sticking with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-113137949177607957?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113137949177607957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113137949177607957'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/11/behavior-driven-development.html' title='Behavior Driven Development'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-113067756842869154</id><published>2005-10-30T05:05:00.000-08:00</published><updated>2005-10-30T05:06:08.443-08:00</updated><title type='text'>Could You Pass 8th Grade Math?</title><content type='html'>&lt;table width=350 align=center border=0 cellspacing=0 cellpadding=2&gt;&lt;tr&gt;&lt;td bgcolor="#CDDEFF" align=center&gt;&lt;font face="Georgia, Times New Roman, Times, serif" style='color:black; font-size: 14pt;'&gt;&lt;b&gt;You Passed 8th Grade Math&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#EBF2FF"&gt;&lt;center&gt;&lt;img src="http://images.blogthings.com/couldyoupasseighthgrademathquiz/passed.jpg" height="100" width="100"&gt;&lt;/center&gt;&lt;font color="#000000"&gt;&lt;br /&gt;Congratulations, you got 10/10 correct!&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div align="center"&gt;&lt;a href="http://www.blogthings.com/couldyoupasseighthgrademathquiz/"&gt;Could You Pass 8th Grade Math?&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/8579476-113067756842869154?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113067756842869154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/113067756842869154'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/10/could-you-pass-8th-grade-math.html' title='Could You Pass 8th Grade Math?'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112897574738415872</id><published>2005-10-10T13:22:00.000-07:00</published><updated>2005-10-10T13:22:27.410-07:00</updated><title type='text'>Planarity.net</title><content type='html'>A way cool game that tests your facility with spacial relationships:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.planarity.net/#"&gt;Planarity.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112897574738415872?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112897574738415872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112897574738415872'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/10/planaritynet.html' title='Planarity.net'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112654430378433293</id><published>2005-09-12T09:58:00.000-07:00</published><updated>2005-09-12T09:58:23.813-07:00</updated><title type='text'>Are iterations hazardous to your project?</title><content type='html'>&lt;a href="http://alistair.cockburn.us/crystal/articles/aih/areiterationshazardous.htm"&gt;Are iterations hazardous to your project?&lt;/a&gt;: "That surprise experience helped open my eyes to why 'iterations' may be hazardous to your project: Danger grows when the results of the iteration are not directly linked to delivering the product to the end user. Without that linkage, iteration results hang in the air just as badly as the old, pre-agile forms of wandering in the wilderness."&lt;br /&gt;&lt;br /&gt;This could be filed under the general heading of "Don't let the process become the goal,"  which is a disease that strikes nearly every organization.  &lt;br /&gt;&lt;br /&gt;Here is how it happens:&lt;br /&gt;&lt;br /&gt;Management wants feedback that the team is making progress towards a particular goal, so they add instrumentation to the process to gather metrics.  The team responds by trying to improve those metrics.  If management chooses the wrong metrics, the end effect is that they drive the team &lt;b&gt;away&lt;/b&gt; from its goals, rather than towards them.&lt;br /&gt;&lt;br /&gt;I think that all of Alistair's observations and recommendations are dead-on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112654430378433293?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112654430378433293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112654430378433293'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/09/are-iterations-hazardous-to-your.html' title='Are iterations hazardous to your project?'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112377618675493546</id><published>2005-08-11T08:32:00.000-07:00</published><updated>2005-08-11T09:03:06.803-07:00</updated><title type='text'>Laziness Driven Design</title><content type='html'>I have become fanatical about writing unit tests for every method on every class, regardless of how trivial that method first appears. ( "But it's just a getter!" )&lt;br /&gt;&lt;br /&gt;This leads to an interesting &lt;span style="font-style: italic;"&gt;laziness driven feedback loop&lt;/span&gt;.  Here's what happens:&lt;br /&gt;&lt;br /&gt;I am implementing a feature, and think that the shortest distance between two points, is to add another dependency onto one of my classes, but then I realize that this new dependency would further complicate all of my tests, requiring large changes. Ugh! I don't have time for sweeping changes to my test suite.&lt;br /&gt;&lt;br /&gt;So, in my laziness, I skip over the initial, obvious solution, think a little bit harder, and come up with a &lt;span style="font-style: italic;"&gt;truly simpler solution.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112377618675493546?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112377618675493546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112377618675493546'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/08/laziness-driven-design.html' title='Laziness Driven Design'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112351917299709122</id><published>2005-08-08T08:06:00.000-07:00</published><updated>2005-08-08T09:39:33.040-07:00</updated><title type='text'>The PO-STAR Movement</title><content type='html'>In the past year, I have seen an increasing number of "Plain Old *" abbreviations:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.martinfowler.com/bliki/POJO.html"&gt;POJO &lt;/a&gt;- Plain Old Java Objects&lt;/li&gt;   &lt;li&gt;POCO - Plain Old CLR (.NET runtime) Objects&lt;/li&gt;   &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Plain_Old_XML"&gt;POX&lt;/a&gt; - Plain Old XML&lt;/li&gt; &lt;/ul&gt; At this point, I think it qualifies as a crypto-movement, and the clue to the genesis of this movement is in Andy Smith's "&lt;a href="http://an9.org/devdev/why_frameworks_suck?sxip-homesite=&amp;checked=1"&gt;Why Frameworks Suck&lt;/a&gt;."&lt;br /&gt;&lt;blockquote&gt;Frameworks hurt sharing. I’d really like to give you this fork Jimmy, but you’re gonna need a knife and plate to use it.&lt;/blockquote&gt;The alternative to PO* is to buy into some framework, which inevitably prevents code reuse as your classes become riddled with framework junk. &lt;br /&gt;&lt;br /&gt;You know a library is really a framework when:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;It requires you to derive your classes from some library class.&lt;/li&gt;   &lt;li&gt;It requires you to use their main() function.&lt;/li&gt;   &lt;li&gt;It requires you to use their Application class.&lt;/li&gt;   &lt;li&gt;It requires your classes to depend on some third party library.&lt;/li&gt;   &lt;li&gt;The setup() and teardown() methods of your test suites become really complex.&lt;/li&gt; &lt;/ul&gt; Nearly every time that I have written framework-like functionality into an application, I have found that I was able to factor it out in favor of simple library classes that are themselves PO* objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112351917299709122?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112351917299709122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112351917299709122'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/08/po-star-movement.html' title='The PO-STAR Movement'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112343046811407372</id><published>2005-08-07T08:58:00.000-07:00</published><updated>2005-08-07T09:01:08.140-07:00</updated><title type='text'>I Heart Python</title><content type='html'>I have been playing around with Python at home, developing a simple web application, and I just wanted to say that I think that Python is awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112343046811407372?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112343046811407372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112343046811407372'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/08/i-heart-python.html' title='I Heart Python'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112343025425944290</id><published>2005-08-07T07:58:00.000-07:00</published><updated>2005-08-07T08:57:35.223-07:00</updated><title type='text'>Fear of the Domain Model</title><content type='html'>Did you ever notice that many programmer's tend to shy away from developing a domain model?&lt;br /&gt;&lt;br /&gt;This is a pretty reasonable reaction. We want to exploit our strengths, and leave the domain to the domain experts. We want to continue to improve our knowledge of computer technology, because this translates into a personal asset.&lt;br /&gt;&lt;br /&gt;I think that the ability to elicit domain knowledge from a domain expert and convert this into a viable domain model is a more important skill than the knowing the latest technology that your tools vendor is trying to push at your CIO.&lt;br /&gt;&lt;br /&gt;A rich domain model is truly fertile ground for &lt;a href="http://www.pragmaticprogrammer.com/ppllc/papers/1998_03.html"&gt;developing applications&lt;/a&gt;, and building working, valuable applications is way more important than extending one's knowledge of the solution domain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112343025425944290?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112343025425944290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112343025425944290'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/08/fear-of-domain-model.html' title='Fear of the Domain Model'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-112326735544625002</id><published>2005-08-05T11:42:00.000-07:00</published><updated>2005-08-05T11:42:35.476-07:00</updated><title type='text'>The Garden</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/39354941@N00/31494557/" title="photo sharing"&gt;&lt;img src="http://photos21.flickr.com/31494557_ee32bd3391_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/39354941@N00/31494557/"&gt;&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/39354941@N00/"&gt;Jennifer Dunne&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;This is picture of a flower in my wife's garden.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-112326735544625002?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112326735544625002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/112326735544625002'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/08/garden.html' title='The Garden'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111333822051725708</id><published>2005-04-12T13:37:00.000-07:00</published><updated>2005-04-12T13:37:00.516-07:00</updated><title type='text'>Thoughtless Interfaces</title><content type='html'>Here is a great write-up on how to &lt;strong&gt;not&lt;/strong&gt; create an interface:  &lt;a href="http://www.livejournal.com/users/sirenian/13646.html?mode=reply"&gt;IFoo as Foo's interface is evil and should be punished.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's all about responsibilities, people!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111333822051725708?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111333822051725708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111333822051725708'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/04/thoughtless-interfaces.html' title='Thoughtless Interfaces'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111323559218020707</id><published>2005-04-11T09:06:00.000-07:00</published><updated>2005-04-11T09:06:32.180-07:00</updated><title type='text'>Toothpaste</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/39354941@N00/9109906/" title="photo sharing"&gt;&lt;img src="http://photos4.flickr.com/9109906_518401c2f9_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/39354941@N00/9109906/"&gt;&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/39354941@N00/"&gt;Jennifer Dunne&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;My wife took these wonderful pictures of toothpaste, which had quietly extruded itself from the tube in the middle of the night.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111323559218020707?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111323559218020707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111323559218020707'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/04/toothpaste.html' title='Toothpaste'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111290830598712032</id><published>2005-04-07T14:11:00.000-07:00</published><updated>2005-04-07T14:11:45.986-07:00</updated><title type='text'>Trust is an essential deliverable</title><content type='html'>From &lt;a href="http://www.testing.com/cgi-bin/blog/2005/04/06"&gt;Exploration Through Example&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Sometimes teams are jumping into Agile to avoid the horror of the previous release. The code was too buggy, or too late, or cost too much per feature, or all three. In such a case, the programmer team is probably not trusted by the business people. If so, trust is an essential deliverable. It's not enough to be better; you have to be visibly better soon. Delivering tested, working features at frequent intervals is a key way to get trust back. Another way is close cooperation with a product owner that demonstrates that the team's orientation is toward helping her meet her goals. But more generally, the team should pay active attention to how well they're doing at building trust, not just at building code.&lt;/cite&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111290830598712032?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111290830598712032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111290830598712032'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/04/trust-is-essential-deliverable.html' title='Trust is an essential deliverable'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111152164237186481</id><published>2005-03-22T12:00:00.000-08:00</published><updated>2005-03-22T12:00:42.370-08:00</updated><title type='text'>A Perfect Recipe for a SOA Failure</title><content type='html'>From &lt;a href="http://blogs.sun.com/roller/page/crupi/20050319#soa_is_a_business_driven"&gt;SOA is a Business-Driven Architectural Style&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;cite&gt;"It means that for SOA to be successful, it must be a 'top-down' approach. And top-down, means problem to architecture to solution. It does not mean, working from what we have and just wrapping it with new technologies just because we can. This bottom-up approach is quite natural and easy and is the perfect recipe for a SOA failure. "&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;I will go a bit further and say that any architecture that isn't bent on solving a particular problem is a recipe for failure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111152164237186481?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111152164237186481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111152164237186481'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/03/perfect-recipe-for-soa-failure.html' title='A Perfect Recipe for a SOA Failure'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111144110636980118</id><published>2005-03-21T13:22:00.000-08:00</published><updated>2005-03-21T13:38:26.370-08:00</updated><title type='text'>Searching Google for Books</title><content type='html'>I had heard about &lt;a href="http://print.google.com/"&gt;Google Print&lt;/a&gt; a while back. &lt;br /&gt;&lt;br /&gt;I hadn't realized that the &lt;a href="http://print.google.com/googleprint/library.html"&gt;Google Library project&lt;/a&gt; would mean that public domain books, like &lt;a href="http://www.google.com/search?q=book+huckleberry+finn&amp;sourceid=mozilla-search&amp;amp;start=0&amp;start=0&amp;amp;ie=utf-8&amp;oe=utf-8&amp;amp;client=firefox-a&amp;rls=org.mozilla:en-US:official"&gt;Huckleberry Finn&lt;/a&gt;,  would now be searchable via Google.&lt;br /&gt;&lt;br /&gt;You just enter "book" followed by the book title in Google.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111144110636980118?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111144110636980118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111144110636980118'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/03/searching-google-for-books.html' title='Searching Google for Books'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-111142599621103400</id><published>2005-03-21T09:26:00.000-08:00</published><updated>2005-03-21T09:26:36.210-08:00</updated><title type='text'>Yahoo has acquired Flickr</title><content type='html'>&lt;a href="http://jeremy.zawodny.com/blog/archives/004362.html"&gt;Thoughts on Flickr and Yahoo (by Jeremy Zawodny)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope they don't mess it up.  :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-111142599621103400?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111142599621103400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/111142599621103400'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/03/yahoo-has-acquired-flickr.html' title='Yahoo has acquired Flickr'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110978627611605608</id><published>2005-03-02T09:55:00.000-08:00</published><updated>2005-03-02T09:57:56.120-08:00</updated><title type='text'>Being Careful Is Not The Solution</title><content type='html'>Sometimes, when you touch a piece of code, or a build script, or a configuration file, you might feel the urge to be very careful, because your change might break the overnight build, or result in a subtle bug.&lt;br /&gt;&lt;br /&gt;Being careful is not the solution.  You cannot be careful all the time.  Sooner or later, you will let you guard down and make a mistake.  It is inevitable.  If you are lucky, this mistake will occur when you have loads of time to diagnose it.  If you are unlucky, you'll get a bad build at the 11th hour.&lt;br /&gt;&lt;br /&gt;When you find that you need to be careful, you should ask yourself, how can I change this situation so that mistakes are either impossible to make or discovered immediately after making them?&lt;br /&gt;&lt;br /&gt;If you think about it, you probably already know a few strategies for achieving this right now:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Unit tests insure that your classes behave as you expect them to.&lt;/li&gt;   &lt;li&gt;Asserts (Design by Contract) achieve the same thing from a different direction.&lt;/li&gt;   &lt;li&gt;Code generation eliminates duplication, so that you only have to make a change in one place.  &lt;/li&gt;   &lt;li&gt;Static type checking catches mistakes at compile time.&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110978627611605608?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110978627611605608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110978627611605608'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/03/being-careful-is-not-solution.html' title='Being Careful Is Not The Solution'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110973404027874621</id><published>2005-03-01T19:27:00.000-08:00</published><updated>2005-03-01T19:27:20.276-08:00</updated><title type='text'>Jellyfish</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/johndunne/5718906/" title="photo sharing"&gt;&lt;img src="http://photos6.flickr.com/5718906_de066a2be5_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/johndunne/5718906/"&gt;Jellyfish&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/johndunne/"&gt;JohnDunne&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;This is a jellyfish that we saw while poking around the aquarium at the Mandalay Bay hotel in Las Vegas.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110973404027874621?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110973404027874621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110973404027874621'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/03/jellyfish.html' title='Jellyfish'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110936232468493912</id><published>2005-02-25T12:12:00.000-08:00</published><updated>2005-02-25T12:12:04.683-08:00</updated><title type='text'>Tips for Google Maps</title><content type='html'>Some neat tips from &lt;a href="http://www.clarkware.com/cgi/blosxom/2005/02/25#GoogleMaps"&gt;Mike Clark&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110936232468493912?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110936232468493912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110936232468493912'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/tips-for-google-maps.html' title='Tips for Google Maps'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110866299011957949</id><published>2005-02-17T09:44:00.000-08:00</published><updated>2005-02-17T14:12:55.780-08:00</updated><title type='text'>Need Driven Development</title><content type='html'>In "&lt;a href="http://joe.truemesh.com/MockRoles.pdf"&gt;Mock Roles, Not Objects&lt;/a&gt;" [1], Freeman, Pryce, Mackinnon, and Walnes say:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;A core principle of Lean Development is that value should be pulled into existence from demand, rather than pushed from implementation: The effect of ‘pull’ is that production is not based on forecast; commitment is delayed until demand is present to indicate what the customer really wants.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;This is the flow of programming with Mock Objects. By testing an object in isolation, the programmer is forced to consider an object’s interactions with its collaborators in the abstract, possibly before those collaborators exist. TDD with Mock Objects guides interface design by the services that an object requires, not just those it provides. This process results in a system of narrow interfaces each of which defines a role in an interaction between objects, rather than wide interfaces that describe all the features provided by a class. We call this approach &lt;span style="font-weight: bold;"&gt;Need-Driven Development&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I recently experienced the opposite of this approach. I had done some initial design, and come up with a list of classes and their responsibilities. I picked the most important class and started implementing it.&lt;br /&gt;&lt;br /&gt;So how did I mess up?&lt;br /&gt;&lt;br /&gt;You need to start at the edge of the system, from the external interfaces and work your way in. My "important class" was not nearly as important as I thought it was, and certainly was not more or less important than any of my other business objects.&lt;br /&gt;&lt;br /&gt;When I finally got around to implementing my external interface, which was a messaging layer, I found that some of my earlier assumptions did not hold true. I had over-implemented some of the business objects. It is easy to fall into this trap with TDD, because you can implement your objects before anyone actually needs them.&lt;br /&gt;&lt;br /&gt;If I were to do it over again, I would not forgo that initial design, because it certainly helped the process along, but I would always start my implementation with the classes that are closest to the business requirements.&lt;br /&gt;&lt;br /&gt;[1]  http://joe.truemesh.com/MockRoles.pdf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110866299011957949?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110866299011957949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110866299011957949'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/need-driven-development.html' title='Need Driven Development'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110850162250498736</id><published>2005-02-15T13:02:00.000-08:00</published><updated>2005-02-15T13:07:02.506-08:00</updated><title type='text'>We’ll ship when the product is ready.</title><content type='html'>From the &lt;a href="http://blogs.msdn.com/ie/archive/2005/02/15/373104.aspx"&gt;Internet Explorer team&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I’ve gotten questions about the ship date. Yes, we have a date in mind. I’ll talk about the date after we get feedback from customers and partners. We’re going to release a beta and listen, then refresh the beta and listen some more. We’ll ship when the product is ready.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a refreshing point of view, that you don't hear too often.  I imagine that the IE team is under a certain amount of pressure, due to Firefox's increasing marketshare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110850162250498736?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110850162250498736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110850162250498736'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/well-ship-when-product-is-ready.html' title='We’ll ship when the product is ready.'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110840887795673702</id><published>2005-02-14T11:21:00.000-08:00</published><updated>2005-02-15T13:26:42.300-08:00</updated><title type='text'>This is my brain in....</title><content type='html'>&lt;a href="http://kevan.org/extispicious.cgi?name=JohnDunne"&gt;del.icio.us&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can map your &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; tags with &lt;a href="http://kevan.org/extispicious"&gt;this handy tool.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110840887795673702?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110840887795673702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110840887795673702'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/this-is-my-brain-in.html' title='This is my brain in....'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110840312657216911</id><published>2005-02-14T09:45:00.000-08:00</published><updated>2005-02-14T09:46:17.363-08:00</updated><title type='text'>Pilers vs. Fliers</title><content type='html'>This is a great posting about the importance of not letting your inbox pile up.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jasonclarke.net/archives/2005/02/09/if-your-inbox-has-more-than-a-screenful-of-messages-in-it-youre-rude/"&gt;If Your Inbox Has More Than a Screenful of Messages In It, You’re Rude&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I totally agree with Jason Clarke. My own system is to move every e-mail that I have read to a folder called "Read Mail". If I don't have the time to immediately respond, I hit the "Reply" button and save the reply in my "Drafts" folder. If I need to do some research before replying to the e-mail, I copy it to my "Tasks" folder which automatically creates a new Task.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110840312657216911?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110840312657216911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110840312657216911'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/pilers-vs-fliers.html' title='Pilers vs. Fliers'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110831848429273510</id><published>2005-02-13T10:14:00.000-08:00</published><updated>2005-02-15T08:46:02.696-08:00</updated><title type='text'>The Gates in Central Park</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/johndunne/4734071/" title="photo sharing"&gt;&lt;img src="http://photos3.flickr.com/4734071_b43d36845c_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="margin-top: 0px;font-size:0;" &gt;  &lt;a href="http://www.flickr.com/photos/johndunne/4734071/"&gt;The Gates in Central Park&lt;/a&gt; &lt;br /&gt; Originally uploaded by &lt;a href="http://www.flickr.com/people/johndunne/"&gt;JohnDunne&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;We took a walk on Central Park yesterday to view "The Gates."&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://www.spaceimaging.com/gallery/spacepics/central_park_12Feb05.jpg"&gt;satellite image&lt;/a&gt; of The Gates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;2/15/04 - Added satellite image.&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/8579476-110831848429273510?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110831848429273510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110831848429273510'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/gates-in-central-park.html' title='The Gates in Central Park'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110814656600302027</id><published>2005-02-11T10:28:00.000-08:00</published><updated>2005-02-12T09:45:00.560-08:00</updated><title type='text'>Get Your Code Head On</title><content type='html'>Ever since I adopted test driven development, I have noticed a subtle shift in my development patterns.&lt;br /&gt;&lt;br /&gt;Before TDD, I used to make a lot of effort to get into a "code head", a place where the code would just flow. To get there, I would eliminate all distractions and think about nothing but the code. Any lengthy interruption would set me back by an hour or two, because I needed to remember everything.&lt;br /&gt;&lt;br /&gt;Now, I don't bother to remember anything. I maintain a to-do list of tests that I need to write, and I cycle continuously through "write test --&gt; write code --&gt; check-in". If I forget something, the tests tell me immediately.&lt;br /&gt;&lt;br /&gt;This has meant a lot to my productivity as I get interrupted a lot.  ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;2/12/05 - Updated wording.&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/8579476-110814656600302027?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110814656600302027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110814656600302027'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/get-your-code-head-on.html' title='Get Your Code Head On'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110788591418571572</id><published>2005-02-08T09:58:00.000-08:00</published><updated>2005-02-08T10:17:00.053-08:00</updated><title type='text'>Creating Abstractions</title><content type='html'>To properly write testable code, you need to be able to test your objects in isolation. In practice, this means that your objects must only depend on abstractions that can be easily stubbed out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wagging the Dog&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How do you know what to pull out into an abstract interface?  Let's look at an example.&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;class Dog&lt;br /&gt;{&lt;br /&gt; void bark();&lt;br /&gt; void setOwner( PetOwner* o );&lt;br /&gt; PetOwner* getOwner();&lt;br /&gt;}&lt;/blockquote&gt;You might want to just abstract the whole thing, like this:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;struct IDog&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual void bark() = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual void setOwner( PetOwner* o ) = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual PetOwner* getOwner() = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;This is often referred to as the &lt;a href="http://c2.com/cgi/wiki?PimplIdiom"&gt;pimpl idiom &lt;/a&gt;, but it has some problems.&lt;br /&gt;&lt;br /&gt;- It presupposes that all clients want to deal with a Dog, forcing clients to write different implementations for cats and parakeets.&lt;br /&gt;- It is harder to mock, requiring you to mock the whole beast rather than the one part that you care about.&lt;br /&gt;&lt;br /&gt;We have achieve physical isolation of the Dog code, but have not logically decoupled anything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consider Your Clients When Creating Abstractions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you create an abstraction, remember that you are defining an interface between two units of code. You need to take into account both classes, rather than just one. Sometimes, this can be tricky, but fortunately, TDD helps us to learn what the needs of both classes are.&lt;br /&gt;&lt;br /&gt;And we have some rules of thumb to guide us. When we create abstractions, we may want to consider abstracting capabilities and roles.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Capabilities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A capability is an interface that, you guessed it, denotes the ability to do something. By convention, capability class names end in "-able", like &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclasstopic.asp"&gt;ISerializable &lt;/a&gt;or &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html"&gt;Serializable&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By pulling a capability into its own interface, you make it easy for clients to get only what want.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;struct IBarkable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual void bark() = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;It makes it possible for me to write a re-useable client, that works with anything that barks, and not just dogs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;void makeThemAllBark( std::vector&lt;/span&gt;&lt;ibarkable&gt;&lt;span style="font-family:courier new;"&gt;&amp; barkers );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Roles &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A role is an interface that has a meaning to a particular audience.  The same object may fulfill many different roles.&lt;br /&gt;&lt;br /&gt;In our Dog example, having an owner is not a quality which is intrinsic to dogs. You can pull that out and say that this is a quality of a pet.&lt;br /&gt;&lt;/ibarkable&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;struct IPet&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual void setOwner( IPetOwner* o ) = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual IPetOwner* getOwner() = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;You can add this interface to any class that needs to support "pet ownership" semantics. You might see an opportunity to create one standard pet implementation which you can mix-in to different animal classes.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;class PetImpl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    : public IPet&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual void setOwner( IPetOwner* o );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    virtual IPetOwner* getOwner();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;The Abstract Dog&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Our final class looks like this:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;class Dog&lt;br /&gt; : public IBarkable,&lt;br /&gt; public IPet,&lt;br /&gt; public PetImpl&lt;br /&gt;{&lt;br /&gt; // IBarkable&lt;br /&gt; virtual void bark();&lt;br /&gt;&lt;br /&gt; // IPet    is implemented by PetImpl&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110788591418571572?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110788591418571572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110788591418571572'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/creating-abstractions.html' title='Creating Abstractions'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110737992442868792</id><published>2005-02-02T13:32:00.000-08:00</published><updated>2005-02-02T13:33:42.196-08:00</updated><title type='text'>Things to Say When You're Losing a Technical Argument</title><content type='html'>A useful list of ready made arguments, when you find yourself in one of "those" situations.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pigdog.org/auto/mr_bads_list/shortcolumn/1914.html"&gt;Things to Say When You're Losing a Technical Argument&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110737992442868792?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110737992442868792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110737992442868792'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/things-to-say-when-youre-losing.html' title='Things to Say When You&apos;re Losing a Technical Argument'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110736556488460103</id><published>2005-02-02T09:30:00.000-08:00</published><updated>2005-02-02T09:40:39.746-08:00</updated><title type='text'>How to Organize Your Blogs</title><content type='html'>When I first got into reading blogs, and the number of blogs to which I subscribed started to become unmanageable, I organized them by topic. This seems to be a pretty common method, as I see it whenever someone publishes their OPML file.&lt;br /&gt;&lt;br /&gt;The problem with topic-based organization is that no one ever stays on topic, as proved by this very same posting to a blog entitled "&lt;a href="http://reflectionsonprogramming.blogspot.com/"&gt;Reflections on Programming&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;Even if every blog did stay on topic, you are faced with a ever growing list of blogs where only some of them are truly important. By nature, you will be more interested in some topics than others. You wind up with 50 subscriptions under "Programming" and just one subscription under "Snow Boarding". You never miss a posting about "Snow Boarding", but you frequently skip &lt;a href="http://weblogs.asp.net/oldnewthing/"&gt;Raymond Chen's latest posting&lt;/a&gt;, because it gets lost in the noise.&lt;br /&gt;&lt;br /&gt;The solution is to organize your blogs, based on their relevance to you. I have three categories: "Must Read", "Should Read", and "Whenever". I meticulously read the stuff in the first category, while I only skim the stuff in the last category. As the blogs evolve, I move them up and down in the list. Sometimes, they fall off the bottom when I am no longer interested them.&lt;br /&gt;&lt;br /&gt;Here are my subscriptions on bloglines:  &lt;a href="http://www.bloglines.com/public/JohnDunne"&gt;http://www.bloglines.com/public/JohnDunne&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note to bloggers: These are organized based on their relevance to me, and should not be construed as a judgment about the overall quality of your blog.&lt;br /&gt;&lt;br /&gt;Note to RSS Reader authors:  My ideal feed reader would allow me to view my blogs by both category and relevance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110736556488460103?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110736556488460103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110736556488460103'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/how-to-organize-your-blogs.html' title='How to Organize Your Blogs'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110728025376323706</id><published>2005-02-01T09:49:00.000-08:00</published><updated>2005-02-01T09:50:53.763-08:00</updated><title type='text'>TDD Meets GTD</title><content type='html'>In David Allen's "&lt;a href="http://www.davidco.com/"&gt;Getting Things Done&lt;/a&gt;" [1], tasks are organized in terms of Next Actions. A next action is the absolute next thing you need to do to advance towards a particular goal.&lt;br /&gt;&lt;br /&gt;For example, a goal might be to organize your finances.  The next action might be to balance your checkbook. &lt;br /&gt;&lt;br /&gt;As you complete each next action, you figure out what comes next, and add it to your list.  You organize your next actions in terms of the context in which they will be done.  This might seem counter-intuitive, but it make sense when you think about it.  If you have a big requirements meeting coming up, wouldn't you rather have a list of issues to discuss in the meeting in one place?  Other forms of organization, like chronological or topical, fall apart, because there is no guarantee that the timing will work out the way you expect or that you will be able to remember the topics that you created from one day to the next.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://c2.com/cgi/wiki?TestDrivenDevelopment"&gt;Test Driven Development&lt;/a&gt; [2], you constantly cycle between writing tests and implementing the functionality that they test.  I find that I sometimes lose my place, and over implement a class, writing code that will never really be needed.&lt;br /&gt;&lt;br /&gt;So I started maintaining a "test to-do list".  Whenever I encounter a situation where I think I am going to need another test, I just add it to the list.  This keeps me focussed on getting tests to pass.  When I eventually get back to the to-do list, I sometimes find that I did not need that functionality at all.&lt;br /&gt;&lt;br /&gt;Like GTD's Next Actions, I store my to-do list with the test suite itself, so whenever I turn my attention back to that suite, I have a list of outstanding issues.&lt;br /&gt;&lt;br /&gt;[1] http://www.davidco.com/&lt;br /&gt;[2] http://c2.com/cgi/wiki?TestDrivenDevelopment&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110728025376323706?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110728025376323706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110728025376323706'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/02/tdd-meets-gtd.html' title='TDD Meets GTD'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110644226862908602</id><published>2005-01-22T17:01:00.000-08:00</published><updated>2005-01-22T17:11:30.000-08:00</updated><title type='text'>Switching to Feedburner</title><content type='html'>After seeing the statistics that &lt;a href="http://www.feedburner.com/"&gt;Feedburner&lt;/a&gt; provides, I decide to follow my &lt;a href="http://reflectionsonprogramming.blogspot.com/2004/12/feedburner.html"&gt;colleague&lt;/a&gt;, and make the switch as well.&lt;br /&gt;&lt;br /&gt;You can now subscribe to this blog at &lt;a href="http://feeds.feedburner.com/ReflectionsOnProgramming"&gt;http://feeds.feedburner.com/ReflectionsOnProgramming.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will let you know how this experiment pans out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110644226862908602?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110644226862908602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110644226862908602'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/01/switching-to-feedburner.html' title='Switching to Feedburner'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110574070099208096</id><published>2005-01-14T14:11:00.000-08:00</published><updated>2005-01-14T14:11:40.993-08:00</updated><title type='text'>Flickr</title><content type='html'>This is a test post from &lt;a href="http://www.flickr.com/r/testpost"&gt;&lt;img alt="flickr" src="http://www.flickr.com/images/flickr_logo_blog.gif" width="41" height="18" border="0" align="absmiddle" /&gt;&lt;/a&gt;, a fancy photo sharing thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110574070099208096?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110574070099208096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110574070099208096'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/01/flickr.html' title='Flickr'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110564019533852242</id><published>2005-01-13T10:08:00.000-08:00</published><updated>2005-01-13T10:16:35.336-08:00</updated><title type='text'>Keeping you reading list in  del.icio.us</title><content type='html'>A while backed, I blogged about how you can use &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; to &lt;a href="http://reflectionsonprogramming.blogspot.com/2004/12/tips-for-using-delicious.html"&gt;manage your workflow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I recently discovered Firefox's &lt;a href="http://www.mozilla.org/products/firefox/live-bookmarks.html"&gt;Live Bookmarks&lt;/a&gt; feature, which allows you to create a set of bookmarks from an RSS feed.&lt;br /&gt;&lt;br /&gt;del.icio.us allows you to get an RSS feed for any combination of tags.&lt;br /&gt;&lt;br /&gt;Are you thinking what I am thinking?&lt;br /&gt;&lt;br /&gt;I created a Live Bookmark called "Reading List" and pointed it at http://del.icio.us/rss/johndunne/toread&lt;br /&gt;&lt;br /&gt;I wish my defect tracking system had an RSS interface.  I would love to be able to get a set of bookmarks to all issues assigned to me.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110564019533852242?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110564019533852242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110564019533852242'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2005/01/keeping-you-reading-list-in-delicious.html' title='Keeping you reading list in  del.icio.us'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110433650445492482</id><published>2004-12-29T08:06:00.000-08:00</published><updated>2004-12-29T08:08:24.456-08:00</updated><title type='text'>Feedburner</title><content type='html'>A &lt;a href="http://www.primordia.com/blog/"&gt;colleague&lt;/a&gt; has recently switched his &lt;a href="http://feeds.feedburner.com/PrimordialOoze"&gt;rss feed&lt;/a&gt; over to &lt;a href="http://www.feedburner.com/fb/a/home"&gt;Feedburner&lt;/a&gt;.  I will be very curious to see how this experiment pans out.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110433650445492482?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110433650445492482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110433650445492482'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/feedburner.html' title='Feedburner'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110426202484653663</id><published>2004-12-28T11:22:00.000-08:00</published><updated>2004-12-28T11:30:41.536-08:00</updated><title type='text'>RSS 0.91 was born on this day in 1997</title><content type='html'>Danny Ayers &lt;a href="http://dannyayers.com/archives/2004/12/28/today-in-rss-history/"&gt;notes&lt;/a&gt; that today is the birthday of RSS 0.91.&lt;br /&gt;&lt;br /&gt;I remember Microsoft's CDF format and the promise of push technology. I think that "push" fizzled out because dynamic languages, like &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; and &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt;, hadn't quite arrived.&lt;br /&gt;&lt;br /&gt;With Python's &lt;a href="http://www.python.org/doc/current/lib/module-urllib.html"&gt;urllib&lt;/a&gt;, I can easily play around with XML over in HTTP, whereas doing the same thing in C++ is almost painful.&lt;br /&gt;&lt;br /&gt;Your ability to absorb a new idea is directly related to how quickly you can play around with that technology.  Expensive, difficult to implement, technologies will never get the mind share that you can get from something which is truly simple.&lt;br /&gt;&lt;br /&gt;RSS 0.91 is that simple.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110426202484653663?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110426202484653663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110426202484653663'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/rss-091-was-born-on-this-day-in-1997.html' title='RSS 0.91 was born on this day in 1997'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110381313930201112</id><published>2004-12-23T06:45:00.000-08:00</published><updated>2004-12-23T07:57:33.430-08:00</updated><title type='text'>Infrastructure projects</title><content type='html'>In the TOC message group, Ron Jeffries made this amusing observation:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"We probably all know of infrastructure projects that have developed huge staffs, gone on for years, delivering nothing and ultimately coming to nothing. Those of us who don't know about these projects should report the color of the sky on their planet, for the benefit of those of us on planet Earth.&lt;/i&gt;  &lt;a href="http://finance.groups.yahoo.com/group/TOCSoftware/message/262"&gt;"The taxi business"&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;I have to concur. Whenever a project does not target a specific user, but delivers a more nebulous infrastructure, it is highly unlikely that anything will get delivered.&lt;br /&gt;&lt;br /&gt;Tool vendors get away with building infrastructure, because at the end of the day, they won't eat if they don't build something that they can sell. Internal infrastructure projects have no such limitation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110381313930201112?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110381313930201112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110381313930201112'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/infrastructure-projects.html' title='Infrastructure projects'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110375540663805969</id><published>2004-12-22T14:43:00.000-08:00</published><updated>2004-12-22T14:43:26.640-08:00</updated><title type='text'>Serenity Now!</title><content type='html'>&lt;a href="http://www.iserenity.com/index.htm"&gt;iSerenity&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110375540663805969?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110375540663805969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110375540663805969'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/serenity-now.html' title='Serenity Now!'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110260825795409760</id><published>2004-12-09T08:01:00.000-08:00</published><updated>2004-12-09T08:04:17.953-08:00</updated><title type='text'>Dynamic Languages and C++</title><content type='html'>As I read &lt;a href="http://www.tbray.org/ongoing/When/200x/2004/12/08/DynamicJava"&gt;Tim Bray's blog&lt;/a&gt; last night, I wondered if plain old C++ had a particularly compelling story to tell in the dynamic language space.&lt;br /&gt;&lt;br /&gt;It seems like .NET and Java have a leg up on C++.  Yeah -- I know you can write Python extension in C/C++, but you have to do extra work.  It seems like with Java and .NET, you get this stuff "for free".&lt;br /&gt;&lt;br /&gt;BTW, don't you think that Sun had an ulterior motive in inviting these dyanmic language gurus to their campus?  To build up some street cred perhaps?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110260825795409760?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110260825795409760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110260825795409760'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/dynamic-languages-and-c.html' title='Dynamic Languages and C++'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110235438062661355</id><published>2004-12-06T09:09:00.000-08:00</published><updated>2004-12-06T09:33:00.626-08:00</updated><title type='text'>Tips for using del.icio.us</title><content type='html'>I have become a big fan of the social bookmarking site &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;, as you might have &lt;a href="http://del.icio.us/johndunne/"&gt;guessed&lt;/a&gt;, so I thought I might share some tips that I had.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.davidco.com/"&gt;Getting Things Done&lt;/a&gt;, David Allen talks about processing your inbox, which may be either a literal or metaphorical inbox, by periodically purging it.  Every item in your inbox gets filed as either a to-do item, reference material, or gets sent to the trash.&lt;br /&gt;&lt;br /&gt;Whenever I encounter a link that I find even slightly interesting, I file it under the tag "&lt;a href="http://del.icio.us/johndunne/toread"&gt;toread&lt;/a&gt;".  If I think a link might be worthy of a blog entry, I tag it as "toblog". &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110235438062661355?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110235438062661355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110235438062661355'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/tips-for-using-delicious.html' title='Tips for using del.icio.us'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110231116438985131</id><published>2004-12-05T20:56:00.000-08:00</published><updated>2004-12-05T21:32:44.390-08:00</updated><title type='text'>Precious Thoughts</title><content type='html'>I have a &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00069DKVG/qid=1102309259/sr=8-1/ref=sr_8_xs_ap_i1_xglna/002-3334902-4837661?v=glance&amp;s=hpc&amp;amp;n=507846"&gt;moleskine notebook&lt;/a&gt;, and yet I hardly ever write anything in it.   It is a beautiful little book, that has this incredible feel of permanence when you hold it in your hand.  Every time I open it, I imagine that I am writing something that my grandchildren might one day read.&lt;br /&gt;&lt;br /&gt;So, of course, I hardly ever write anything in it.&lt;br /&gt;&lt;br /&gt;It is not that I don't value my own thoughts, but that I find it exceptionally difficult to think while simulatenously criticizing what I am thinking.  I can only manage to write anything by first spewing out everything in my head, and then going back and editing the resulting mess. &lt;br /&gt;&lt;br /&gt;Programming is a lot like writing.  It is hard to get everything perfect the first time around, so you hack things out the best that you can, and then make a second pass, fixing the mistakes you made the first time.  You only get into trouble when the decisions you made in that first pass are difficult to change, like the notes in my moleskin.&lt;br /&gt;&lt;br /&gt;So here is yet another way to define the term "loosely coupled":&lt;br /&gt;&lt;br /&gt;Your code is loosely coupled, when you have contrived to house all of your difficult decisions in their own components, so that you may change those decisions without having to touch any other component.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110231116438985131?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110231116438985131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110231116438985131'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/12/precious-thoughts.html' title='Precious Thoughts'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-110055530219606520</id><published>2004-11-15T13:46:00.000-08:00</published><updated>2004-11-15T13:53:30.856-08:00</updated><title type='text'>Notes from VS Connections</title><content type='html'>I am writing this blog entry, after the fact. I wish that I could have blogged "live", like so many other bloggers, but there just wasn't enough time. These are not all the events that I attended, just the ones that I took notes during.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Day One&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Keynote&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The speaker was the product manager for Visual Studio. I wasn't particularly shocked by anything that was said in the keynote. The main point of the keynote seemed to be that they were opening up Developer Studio to more than just the coder role, so that other team members ( project manager, architect, tester ) could find a home there as well.&lt;br /&gt;&lt;br /&gt;One neat feature: Visual Studio may now import .VSI files, which contain application templates. Various third parties will be supplying templates for common problems. This is integrated into a search facility, which you may execute from the "New Project" dialog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introducing Indigo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nothing new here since any of the previous Indigo demos that I have seen. I did get a kick out of Indigo's composability, as this has been something for which I have aimed in recent designs. In my case, I am coding in C++ and add new functionality using the Strategy pattern. In Indigo, you can weave in new functionality with .NET attributes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows Forms&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;90 minutes of dragging controls on to forms.  Okay...I get it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web Services&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It seems like everything is just an attribute that you slap onto a class. I often have a hard time believing that it is simple as adding [webservice] or whatever to a class.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Day Two&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;.NET&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The presenter gave a more general talk about the biz value of moving to .NET CLR.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generating Windows Forms Interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some interesting stuff, regarding code generation, databases, and user interfaces, but I think that the fundamental premise, using code generation to automate the building of CRUD forms is flawed. Dialogs should represent business actions.&lt;br /&gt;&lt;br /&gt;The presenter did throw out an interesting aside: generating unit tests from method comments. I thought this was pretty cool. I'd love to be able to do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    multiply&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    x             y                 retval&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    10            20               200&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    -10           20               -200&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;int multiply( int x, int y ) {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And automatically build unit tests from the comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Whitehorse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Whitehorse is a RAD tool for designing distributed systems. I was impressed with its potential and I very curious to see how far Microsoft can take it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Day Three&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Permission Based Security&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.NET allows you to define required permission as attributes. Principal information is stored on a per thread basis. The presentation did not cover authentication, which I would have been a much thornier topic. I would really have liked to have seen the whole thing presented from end to end, as I think that Code Access Security is an incredibly important feature in .NET.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C# Generics&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Way cool. A lot like C++ templates, except that you can define constraints on template parameters, which are expressed as required interfaces.&lt;br /&gt;&lt;br /&gt;One of my favorite things about C# is that, like Java, it elevates interfaces into first class citizens. I have always found this to be serious deficiency in C++.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-110055530219606520?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110055530219606520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/110055530219606520'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/11/notes-from-vs-connections.html' title='Notes from VS Connections'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109961243498838482</id><published>2004-11-04T15:28:00.000-08:00</published><updated>2004-11-04T15:56:24.736-08:00</updated><title type='text'>Evolution</title><content type='html'>I have spent most of my professional life developing traditional Win32 applications in C++. Sometimes, I wonder how relevant this sort of application will be in the future.&lt;br /&gt;&lt;br /&gt;Don't get me wrong.  There will always be room for that sort of development, but  in this increasingly interconnected world, &lt;a href="http://msdn.microsoft.com/smartclient/"&gt;smart clients&lt;/a&gt; and web-based apps make more sense.&lt;br /&gt;&lt;br /&gt;Adam Bosworth &lt;a href="http://www.adambosworth.net/archives/000028.html"&gt;states&lt;/a&gt; that web-based apps or services can evolve more quickly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Well this is where the comment about evolution in action comes in. Things that breed rapidly more quickly adopt through natural selection to a changing environment. Services can typically deploy changes every month or even more rapidly because they only have one single configuration on a set of machines whose OS, storage and networking they totally control and which they manage in their data centers. These days Microsoft gives birth to new products at a pace that makes an elephant seem quick, about every 60 months, that means in the time that a service can make 60 adaptions to its customer's needs, Microsoft makes one. It used to be that they shipped every 12 months. Then 18. Then 24. And so on. The creep is driven by the ever increasiongly complexity of features, hardware, os variations, and backward compatibility of the API's so ably designed to lock developers in. They locked the developers in all right. The Microsoft ones. This alone to me has been a compelling argument that when a product can be delivered as a service, it should be.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reading this makes me question some of the architectural decisions that I have made recently. The main virtue of a smart client is that it support off-line capability. If you eliminate this consideration, it would seem that a web-based client is always the way to go. I think the only remaining question, is whose &lt;a href="http://c2.com/cgi/wiki?ToolChain"&gt;tool chain&lt;/a&gt; to use?&lt;br /&gt;&lt;br /&gt;Next week, I head off to &lt;a href="http://www.devconnections.com/vs/"&gt;VS Connections&lt;/a&gt;, where perhaps the trade-offs will become more clear to me.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109961243498838482?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109961243498838482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109961243498838482'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/11/evolution.html' title='Evolution'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109950040739862758</id><published>2004-11-03T07:27:00.000-08:00</published><updated>2004-11-03T08:46:47.396-08:00</updated><title type='text'>Unreflective Actions</title><content type='html'>This morning on the Subway, I read Brian Marick's paper, &lt;a href="http://www.testing.com/writings/methodology-and-ontology.pdf"&gt;Methodology Work Is Ontology Work&lt;/a&gt; in which he says:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I'm particularly interested in &lt;span style="font-weight: bold;"&gt;unreflective actions&lt;/span&gt;, actions people take because they are the obvious thing to do in a situation, given the way the world is.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;I think this is a fantastic observation.  Brian goes on to build a whole methodology "toolkit", covering a lot of ground from how we learn best practices to what is the best number of core values in a methodology (4), but I think this one quote makes the whole paper.&lt;br /&gt;&lt;br /&gt;I cannot count the number of times that I tried to engineer a situation so that the only choice is the correct choice.   This one concept may be applied to user interface design, architectural design, and code construction.  It reminds me of manufacturing's &lt;a href="http://www.campbell.berry.edu/faculty/jgrout/pokayoke.shtml"&gt;poka-yoke&lt;/a&gt;, a device intended to prevent mistakes.&lt;br /&gt;&lt;br /&gt;I wonder what changes I can make in my personal and professional life, so that I  choose the  correct action without reflection?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&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/8579476-109950040739862758?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109950040739862758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109950040739862758'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/11/unreflective-actions.html' title='Unreflective Actions'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109943613687499224</id><published>2004-11-02T14:41:00.000-08:00</published><updated>2004-11-02T14:56:36.083-08:00</updated><title type='text'>Re-usable Code</title><content type='html'>&lt;a href="http://homepage.mac.com/keithray/blog/"&gt;Keith Ray&lt;/a&gt; blogged about &lt;a href="http://homepage.mac.com/keithray/blog/2004/11/02/#RulesForReuse"&gt;code re-usability&lt;/a&gt; as a set of rules.&lt;br /&gt;&lt;br /&gt;I will summarize the rules that I like:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Write your class to avoiding depending on other classes (etc).&lt;/li&gt;   &lt;li&gt;A class should have one responsibility, delegating other responsibilities to other classes.&lt;/li&gt;   &lt;li&gt;A class should not depend on other concrete classes [except the most basic types like String].&lt;/li&gt;   &lt;li&gt;To further allow substitution of concrete types, avoid using "new ConcreteClass" within your class -- particularly the constructors.&lt;br /&gt; &lt;/li&gt; &lt;/ul&gt; He goes on to say:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The user of your class may want to subclass-and-override. Make that possible by avoiding static, final, or non-virtual methods, and private methods. Private methods either need to be declared protected, or should be moved to another class and made public, with the original class using an instance of that other class.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And provides a set of rules for making classes easily extensible.&lt;br /&gt;&lt;br /&gt;I strongly disagree with this sentiment. Making everything overridable may seem to increase the likelihood that your class will be reused, but it also makes it likely that the implementation of a class will be spread across several classes in your hierarchy. In the long run, this makes maintenance increasingly difficult, particularly if you choose to employ the &lt;a href="http://c2.com/cgi/wiki?TemplateMethodPattern"&gt;Template Method Pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think it makes more sense to prefer containment to inheritance, and to mix in new behaviors with the &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Inversion of Control&lt;/a&gt; pattern.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109943613687499224?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109943613687499224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109943613687499224'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/11/re-usable-code.html' title='Re-usable Code'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109896969766884269</id><published>2004-10-28T06:17:00.000-07:00</published><updated>2004-10-28T06:21:37.666-07:00</updated><title type='text'>Geek Test</title><content type='html'>A friend passed on one of those &lt;a href="http://www.innergeek.us/"&gt;online geek tests&lt;/a&gt; to me, which my wife proceeded to take for me.  Frankly, I was not too shocked when my score turned out to be 42.99%.&lt;br /&gt;&lt;br /&gt;Further confirmation of our geekiness came when we spent the evening standing in the dark in &lt;a href="http://www.prospectpark.org/"&gt;Prospect Park&lt;/a&gt;, waiting for the &lt;a href="http://abcnews.go.com/US/wireStory?id=204761"&gt;lunar eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;sigh&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109896969766884269?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109896969766884269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109896969766884269'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/10/geek-test.html' title='Geek Test'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109882345730962562</id><published>2004-10-26T13:31:00.000-07:00</published><updated>2004-10-26T13:44:17.310-07:00</updated><title type='text'>GMail</title><content type='html'>Jon Udell just posted an &lt;a href="http://www.infoworld.com/article/04/10/22/43OPstrategic_1.html"&gt;article&lt;/a&gt; about &lt;a href="http://gmail.google.com/"&gt;GMail&lt;/a&gt;, where he says:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Because Gmail’s behavior is embedded in the UI engine, all subsequent interaction between the browser and the Gmail service is just an exchange of data. What Hwang calls the DataPack format is not XML, though; it’s JavaScript. When you make a request to the Gmail service, whether to refresh your inbox or to modify the list of labels you can attach to messages, the response is a minimal set of JavaScript function calls and associated data objects that the engine uses to update the display.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;This is the very first thing that I noticed about GMail, and it continues to amaze me whenever I use it.  I have to imagine that the GMail architecture is extremely scalable.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&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/8579476-109882345730962562?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109882345730962562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109882345730962562'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/10/gmail.html' title='GMail'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109820291836062411</id><published>2004-10-19T09:08:00.000-07:00</published><updated>2004-10-26T15:03:57.343-07:00</updated><title type='text'>Wormholes</title><content type='html'>Bill Caputo talks about &lt;a href="http://www.williamcaputo.com/archives/000083.html"&gt;wormholes&lt;/a&gt;, which are passages that transport implementation details through your layered architecture.&lt;br /&gt;&lt;br /&gt;Martin Fowler follows up, talking about &lt;a href="http://martinfowler.com/bliki/LocalDTO.html"&gt;Data Transfer Objects&lt;/a&gt;,  which are "an object that carries data between processes in order to reduce the number of method calls."&lt;br /&gt;&lt;br /&gt;So what's the big deal?&lt;br /&gt;&lt;br /&gt;I think that a layered architecture is great, so long as it buys you actual decoupling.  If a layered architecture only buys you more layers, it is time to rethink the architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109820291836062411?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109820291836062411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109820291836062411'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/10/wormholes.html' title='Wormholes'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109690643262474525</id><published>2004-10-04T09:03:00.000-07:00</published><updated>2004-10-04T09:26:14.903-07:00</updated><title type='text'>Cleverness considered harmful</title><content type='html'>Chris Sells posted &lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1532"&gt;this quote &lt;/a&gt;today:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it."&lt;br /&gt;--Brian Kernighan&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I tend to carry around a toolbox of not very clever, tried and true, techniques that I trot out for nearly every problem. This is probably a little reductionist, but it keeps me from getting into trouble. I used to get in trouble a lot.&lt;br /&gt;&lt;br /&gt;When I find things are getting complicated, I know this is a sign that I don't really understand the problem. Sometimes, though, you need to write clever code to get to a place where you know enough to simplify it.&lt;br /&gt;&lt;br /&gt;Still, this is a great acid test. If you find that you are stretching your mental limits just to write the code, then what chance do you have to maintain it?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109690643262474525?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109690643262474525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109690643262474525'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/10/cleverness-considered-harmful.html' title='Cleverness considered harmful'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8579476.post-109685924214651836</id><published>2004-10-03T19:50:00.000-07:00</published><updated>2004-10-03T20:07:22.146-07:00</updated><title type='text'>Moving my blog</title><content type='html'>I have had a &lt;a href="http://www.bloglines.com/blog/JohnDunne"&gt;similarly titled blog&lt;/a&gt; on bloglines for some time, but bloglines does not present a very easy way to edit this blog, so I am moving over to Blogger.&lt;br /&gt;&lt;br /&gt;The topic of this blog is computer programming, but I will probably avoid talking too much about the various technical tips and tricks that are covered so throroughly elsewhere.  &lt;br /&gt;&lt;br /&gt;I am more interested in design techniques,  project management, and the little things that make the day to day slog through coding fun, rather than a chore.&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8579476-109685924214651836?l=reflectionsonprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109685924214651836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8579476/posts/default/109685924214651836'/><link rel='alternate' type='text/html' href='http://reflectionsonprogramming.blogspot.com/2004/10/moving-my-blog.html' title='Moving my blog'/><author><name>John Dunne</name><uri>https://profiles.google.com/115016577887682055228</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-QO5ouZPOnsc/AAAAAAAAAAI/AAAAAAAAAOM/sRBYeEFD51A/s512-c/photo.jpg'/></author></entry></feed>
