<?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'><id>tag:blogger.com,1999:blog-11901247</id><updated>2009-06-12T06:21:36.109-05:00</updated><title type='text'>Meta addiction</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11901247.post-9061656569151386708</id><published>2009-06-12T06:17:00.002-05:00</published><updated>2009-06-12T06:21:36.204-05:00</updated><title type='text'>New domain, new blog</title><content type='html'>After a long period of inactivity on this blog, I've decided that I need something better than &lt;a href="http://www.blogger.com/"&gt;blogger&lt;/a&gt;.  My new blog is at &lt;a href="http://www.apcjones.com/blog/"&gt;http://www.apcjones.com/blog/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not moving any of the old posts across, so they will stay here indefinitely.&lt;br /&gt;Bye bye blogger, it's been good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-9061656569151386708?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/9061656569151386708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=9061656569151386708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/9061656569151386708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/9061656569151386708'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2009/06/new-domain-new-blog.html' title='New domain, new blog'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-1339384836423658487</id><published>2007-07-16T17:44:00.000-05:00</published><updated>2007-07-16T17:56:10.120-05:00</updated><title type='text'>Low-tech card storage</title><content type='html'>&lt;a href="http://www.flickr.com/photos/apcj/829079597/" title="Low-tech card storage"&gt;&lt;img src="http://farm2.static.flickr.com/1038/829079597_163f17e1e6.jpg" width="500" height="375" alt="Low-tech card storage" /&gt;&lt;/a&gt;&lt;br /&gt;An unexpected "feature" of this system is that the sleeves don't go on so far if the pile is thicker; you get some idea of how many cards there are from the width of the overall package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-1339384836423658487?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/1339384836423658487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=1339384836423658487' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/1339384836423658487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/1339384836423658487'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2007/07/low-tech-card-storage.html' title='Low-tech card storage'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-5751759661140436017</id><published>2007-05-02T11:30:00.000-05:00</published><updated>2007-05-04T10:15:48.249-05:00</updated><title type='text'>It's null-time</title><content type='html'>My phone line isn't working.  I went to the faults website to check on progress:&lt;br /&gt;&lt;blockquote&gt; You scheduled an appointment for: - null . An engineer arrived at the agreed time, however we were not able to gain access to your premises. Would you like to reschedule your appointment?                                                         &lt;img src="https://www2.bt.com/static/i/media/images/your_account/faults/s.gif" /&gt;&lt;br /&gt;&lt;/blockquote&gt;I wasn't at home at &lt;span style="font-style: italic;"&gt;null o'clock&lt;/span&gt;, but it seems an engineer didn't turn up either; no card through the letterbox.  Oh, of course, they put a &lt;span style="font-style: italic;"&gt;null card&lt;/span&gt; through the letterbox...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-5751759661140436017?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/5751759661140436017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=5751759661140436017' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/5751759661140436017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/5751759661140436017'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2007/05/its-null-time.html' title='It&apos;s null-time'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-7669988627513815167</id><published>2007-05-02T07:29:00.000-05:00</published><updated>2007-05-06T17:54:16.483-05:00</updated><title type='text'>Protect valuable assets</title><content type='html'>It was a T-shirt day.  What better on a T-shirt day than to wear a T-shirt, and shorts, and cycle to work in the unusual London sunshine?  I whizzed past cars.  I felt great.  What's he indicating for?  Oh shit.&lt;br /&gt;I found myself lying on the road, a few feet away from the Mercedes that had suddenly blocked my path.  I looked for my bike; it was some way behind.&lt;br /&gt;The driver was apologetic.  He noticed my arm was bleeding.  I said I was fine.  I figured out I must have landed on my head.  The bike was fine apart from a crushed saddle.  I cycled off, bought bandages from Boots, and got to the office a little late.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/apcj/487099350/" title="Damaged Helmet"&gt;&lt;img src="http://farm1.static.flickr.com/187/487099350_efd9438ed7_m.jpg" alt="Damaged Helmet" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/apcj/487128107/" title="Scary Crack"&gt;&lt;img src="http://farm1.static.flickr.com/210/487128107_8bd3c80a4b_m.jpg" alt="Scary Crack" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now everything is repaired and my arm and shoulder are healing well.  I'm left amazed and relieved that my head is uninjured after a hefty collision with the tarmac of Southwark Street.&lt;br /&gt;So, thanks to the cycle helmet people - mine did the job, and I've bought a new one exactly the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-7669988627513815167?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/7669988627513815167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=7669988627513815167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/7669988627513815167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/7669988627513815167'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2007/05/protect-valuable-assets.html' title='Protect valuable assets'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-4780092396037157672</id><published>2007-01-02T16:26:00.000-06:00</published><updated>2007-01-02T17:25:06.072-06:00</updated><title type='text'>Monkey Work</title><content type='html'>I met a guy at a party who recently graduated in Computer Science, from the &lt;a href="http://www.york.ac.uk/"&gt;University of York.&lt;/a&gt;  He has a job, starting this month, for one of the &lt;a href="http://en.wikipedia.org/wiki/Big_Four_auditors"&gt;big-four&lt;/a&gt; accounting firms.  I asked what he'd be doing.  "IT Audit," was the department.  Apparently this is mostly checking up on IT security, running through check-lists and then suggesting or taking corrective action.  Trying to be as polite as possible (although I don't think it came out that way) I confessed that I wouldn't find that very interesting.  I might even have used the word "boring".  He didn't seem too bothered.  "At least I'm not programming, that's just monkey work!"&lt;br /&gt;Monkey Work!  I went into shock.  Was it just a joke?  I don't think I'd told him by that point what I do, so little chance of retaliation for the b-word.  At the end of the evening, I apologised in case I'd been too rude. He accepted my apology, but specifically said, "I don't take back that thing about programming being monkey work."  Ok then, no joke.&lt;br /&gt;What's my problem here?  It's not that somebody else likes IT Audit while I like programming; that's fine.  My problem is that a fresh graduate in Computer Science, a specifically technical degree, believes (or at least goes around saying) that programming is monkey work.  Programming is not for everyone, and it's possible that students discover they don't like it during a Computer Science degree.  But how can they graduate without appreciating some of the skill and ingenuity required to program well?  If people who have been taught about computers don't understand what we do, who will?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-4780092396037157672?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/4780092396037157672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=4780092396037157672' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/4780092396037157672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/4780092396037157672'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2007/01/monkey-work.html' title='Monkey Work'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-116027710258604726</id><published>2006-10-07T22:06:00.000-05:00</published><updated>2006-11-01T11:16:50.383-06:00</updated><title type='text'>how big is my potato?</title><content type='html'>&lt;a href="http://www.howbigismypotato.com/"&gt;&lt;img src="http://www.howbigismypotato.com/banner.png" alt="howbigismypotato.com" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This important question is answered by my new website, &lt;a href="http://www.howbigismypotato.com/"&gt;howbigismypotato.com&lt;/a&gt;.  Check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-116027710258604726?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/116027710258604726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=116027710258604726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/116027710258604726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/116027710258604726'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/10/how-big-is-my-potato.html' title='how big is my potato?'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-115680773549968842</id><published>2006-08-28T18:07:00.000-05:00</published><updated>2006-11-01T11:16:50.325-06:00</updated><title type='text'>"Pairing": two's productive, three's a crowd</title><content type='html'>I find it productive and rewarding to have two people sitting at a computer.  But if three people sit at a computer, things don't go so well.  I get the feeling that we usually get less done than with two people, which is frustrating as well as wasteful.&lt;br /&gt;So if somebody comes and joins your pair (probably because you wanted to show or ask them something) I suggest that one person should duck out.  I call this "bump pairing" because somebody gets bumped out by the newcomer.&lt;br /&gt;&lt;br /&gt;What should you do after being bumped out?  You might well join somebody who is "odd" (sitting by themselves).  It could be the person left behind by the newcomer who bumped you out: a straight swap.  Or you could fill in for somebody missing through a natural break like having a smoke or taking an important call.  A different option is to offer help to a complete pair.  If your help is wanted then logically you should bump out one of its members.  And so another person is free...&lt;br /&gt;&lt;br /&gt;Bump pairing could result in faster pair rotation.  I think of it as providing a higher frequency wave of pair rotation, overlaid on a more traditional slower wave of rotation.  In this model each member of the team belongs to a single natural pair (the one that signed up to deliver a story, for example), but might also find themselves working in a number of short-term temporary pairs.  I suspect something like this happens already in most teams, but it is useful to explicitly recommend that trioing is avoided.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-115680773549968842?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/115680773549968842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=115680773549968842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115680773549968842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115680773549968842'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/08/pairing-twos-productive-threes-crowd.html' title='&quot;Pairing&quot;: two&apos;s productive, three&apos;s a crowd'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-115554888021170515</id><published>2006-08-13T23:30:00.000-05:00</published><updated>2006-11-01T11:16:50.267-06:00</updated><title type='text'>Oh, the waste</title><content type='html'>&lt;a href="http://www.flickr.com/photos/apcj/214900719/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/68/214900719_fb17dcf126_m.jpg" alt="IMG_2027.JPG" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How important is wine?  In our world where thousands die needlessly each day, and with terrorism on the doorstep, I suppose it's not very important at all.  But to throw away whole bottles of good, well-chosen wine pained me immensely.&lt;br /&gt;This morning I experienced some of the new &lt;a href="http://news.bbc.co.uk/1/hi/uk/4778615.stm"&gt;restrictions&lt;/a&gt; to UK-related air travel.  Liquids are not allowed in the cabin.  We heard about the worrying developments of last week while on holiday in Italy, but we thought it would be fine to carry the few bottles we had already picked up in a suitcase.  It's been a few years, but bottles of spirits used to make it back fine from Ibiza.  Sadly this assumption was wrong and we had to remove 5 bottles of wine from their carefully protected positions in my Oyster luggage and dispose of them.  There was no way for us to have them sent separately, and we didn't hold much hope of finding a shipping office open at 9am on a Sunday morning.  We gave a couple of bottles to some Germans in the next check-in queue, who were not subject to the same restrictions, and we drunk most of a third before going through security.  That left two bottles to be added to the impressive pile of bottles left by other passengers in the same situation.  Drinking a bottle of wine in the airport was a surprisingly rewarding experience.  A barman at the land-side bar was obligingly removing corks for a long line of us - no British jobsworth here.  Then we sat outside in the morning sun - great.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/apcj/214900761/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/78/214900761_7c07d0473e_m.jpg" alt="IMG_2028.JPG" height="240" width="180" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now I have to prepare for my next planned flight, London to New York on Tuesday.  I suspect this will be more challenging.  Let's just hope that the new restrictions combined with other action of the security services is effective against the current threat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-115554888021170515?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/115554888021170515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=115554888021170515' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115554888021170515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115554888021170515'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/08/oh-waste.html' title='Oh, the waste'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-115092262125488579</id><published>2006-06-21T15:10:00.000-05:00</published><updated>2006-11-01T11:16:50.147-06:00</updated><title type='text'>Sailing too far from the shore</title><content type='html'>I've been looking for a metaphor to describe the situation when too many tests are broken.  In the normal course of TDD only one or two tests are broken at a time (generally the new one I just wrote).  However, sometimes I find myself breaking lots of tests, maybe lots of my code doesn't even compile.  I've come to recognise this as a bad situation, because although my purpose is correct, and the changes I am making are valid, any significant time where my tests are broken (so I can't check in) is bad.  The time taken to fix broken tests is roughly proportional to the number of broken tests, so the more that are broken, the longer it will be before I can check in.&lt;br /&gt;&lt;br /&gt;Now when I see these signs, I turn to my pair and ask, "Do you think we might be sailing too far from the shore?".  To understand the metaphor, imagine that you are traveling along a beautiful coastline in small sailing boat.  You progress in a series of zig-zags, sailing out into the sea, then returning to the shore.  Dry land represents the security of all tests passing, while the sea is the dangerous world of broken tests.  The wind feels stronger over the more dangerous water - perhaps you are traveling faster.  However, the further you are from the shore, the more tests are broken, and the longer it will take you to sail back to dry land, or to fix the tests.  If something goes wrong while at sea (your compass breaks, your sail tears) then the coast guard tows you back to the point that you were last on dry land.  This failure scenario represents having to throw away your changes, and no real progress being made.  The change of your excursion failing is greater if it is a larger step, so it could be more efficient to make lots of small excursions than a few larger ones.  It all boils down to saying "check in often".&lt;br /&gt;&lt;br /&gt;I find this particular metaphor useful because I like to visualise the journey to get the code back into a passing state.  It also makes me think about the size of task that I am biting off, and try to find a way to break it down into a series of smaller excursions into the sea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-115092262125488579?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/115092262125488579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=115092262125488579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115092262125488579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/115092262125488579'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/06/sailing-too-far-from-shore.html' title='Sailing too far from the shore'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-114752573328966386</id><published>2006-05-13T07:34:00.000-05:00</published><updated>2006-11-01T11:16:50.089-06:00</updated><title type='text'>Smiles and Waves</title><content type='html'>&lt;a href="http://www.flickr.com/photos/apcj/146156957/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/53/146156957_00db133ac2_m.jpg" width="219" height="240" alt="Story Done Bell" /&gt;&lt;/a&gt;&lt;br /&gt;Something strange happened in the office this week.  First a child's bicycle bell was taped onto the wall, below the hundreds of story cards.  Then we started to ring it when finishing a story.  Finishing a story is good news, so a few people started to clap when the bell was rung.  After a day, and about five rings of the bell, most people were clapping.  Then a whisper went round, "Next time the bell rings, we're going to do a Mexican wave."  And we did.   Now it seems we will be ringing a bell and doing Mexican waves every day for the next few months&lt;br /&gt;&lt;br /&gt;What happened here?  How did my British cynicism fail to resist this onslaught of enthusiasm?  I've shared an office with a sales team before and pitied them for their cheesy whistle-blowing, but I feel that the teams around us don't pity us, they might even be a little jealous.  There's a lot of smiling going on and some giggling.  Like the best humour, we're laughing at ourselves, but we're also smiling because we're doing a good job, and we've found a way to celebrate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-114752573328966386?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/114752573328966386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=114752573328966386' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114752573328966386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114752573328966386'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/05/smiles-and-waves.html' title='Smiles and Waves'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-114461372061308637</id><published>2006-04-09T14:59:00.000-05:00</published><updated>2006-11-01T11:16:49.820-06:00</updated><title type='text'>Whisper Pairing</title><content type='html'>This week I lost my voice due to a sore throat.  I suspect the trigger was screaming from Furnival Gardens at a &lt;a href="http://news.bbc.co.uk/sport1/hi/other_sports/rowing/4870298.stm"&gt;very exciting&lt;/a&gt; university boat race. (However, medical opinion is divided on whether a bit of shouting on its own can trigger a prolonged sore throat).&lt;br /&gt;The result was that I could only whisper all day long and found it more difficult than usual to be understood.  It turns out pairing is a vocally-intensive activity and I had to resort to pointing a lot, as well as whispering.  It's funny how people adjust quickly to the volume that others speak at; I'm sure the whole area was quieter than usual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-114461372061308637?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/114461372061308637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=114461372061308637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114461372061308637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114461372061308637'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/04/whisper-pairing.html' title='Whisper Pairing'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-114182387812374666</id><published>2006-03-08T07:17:00.000-06:00</published><updated>2006-11-01T11:16:49.760-06:00</updated><title type='text'>Pink Dates</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/apcj/108171946/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/46/108171946_3799021398_o.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/apcj/108171946/"&gt;Pink Dates&lt;/a&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;I looked at this window for over a minute trying to work out which, if any, dates were pink.  My girlfriend helped out by confirming that some were pink, but I still wasn't getting it.  Then I happened to look at the screen from an oblique angle, and suddenly a few numbers looked different.  It seems I was helped out by the relatively poor viewing angle on my PowerBook screen; the alignment of the sub-pixels leads to an occasionally helpful colour distortion.&lt;br /&gt;We all need to pay attention to colour schemes, but maybe I should pay even more attention to usability for people with more serious disabilities than mere colour blindness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-114182387812374666?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/114182387812374666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=114182387812374666' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114182387812374666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114182387812374666'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/03/pink-dates.html' title='Pink Dates'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-114125572556989596</id><published>2006-03-01T17:15:00.000-06:00</published><updated>2006-11-01T11:16:49.696-06:00</updated><title type='text'>Using Eclipse as an IntelliJ addict</title><content type='html'>After 3 solid years of IntelliJ use, I've spent the last two months using Eclipse full-time.&lt;br /&gt;The only two features I've really really missed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The code generator for equals() and hashCode().  If there is such a feature, 5 minutes of searching didn't find it.  Perhaps I need to install a plugin.  Besides, IntelliJ's implementation is rock-solid and easily accessible - it's just on Alt-Insert (bizarrely Ctrl-N on the Mac).  Even when I had a few medium sized classes to knock out equals() for, it wasn't enough for me to install IntelliJ.&lt;/li&gt;&lt;li&gt;Ctrl-Alt-Shift-N, that "browse for symbol" thing.  When I'm trying to figure out what's going on in a velocity template this is a fantastic feature, and this one was enough for me to install IntelliJ in parallel.  My problem was solved within a couple of minutes.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Although there were no other features I really missed, the editor &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; responds slowly and feels cumbersome.  To me it's years behind IntelliJ.  Both very impressive tools, but my preference hasn't changed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-114125572556989596?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/114125572556989596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=114125572556989596' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114125572556989596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/114125572556989596'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/03/using-eclipse-as-intellij-addict.html' title='Using Eclipse as an IntelliJ addict'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-113957159948439883</id><published>2006-02-10T05:33:00.000-06:00</published><updated>2006-11-01T11:16:49.500-06:00</updated><title type='text'>Late hours</title><content type='html'>Why don't pubs close at 11 anymore?  Then I would have been chucked out in time to catch a tube home, rather than ending up getting a taxi, and before I had time to drink enough beer to give me a nasty hangover.  I need to break the dependency on hearing a bell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-113957159948439883?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/113957159948439883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=113957159948439883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113957159948439883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113957159948439883'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/02/late-hours.html' title='Late hours'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-113874321903675301</id><published>2006-01-31T15:03:00.000-06:00</published><updated>2006-11-01T11:16:49.438-06:00</updated><title type='text'>The most satisfying thing to do with source code</title><content type='html'>Delete it.&lt;br /&gt;And I don't just mean &lt;a href="http://ivan.truemesh.com/archives/000393.html"&gt;deleting bad code&lt;/a&gt;, in the same sense as you might enjoy clearing junk from your yard. I think it's even more satisfying to delete code that you like, that you had a hand in creating, that you feel proud of.&lt;br /&gt;Deleting good code makes sense either when circumstances have changed so that it is no longer required, or when the code has served as a stepping stone but will not be used in the final solution.&lt;br /&gt;&lt;h3&gt;Pseudo-examples&lt;/h3&gt;&lt;h3&gt;Changing Business&lt;br /&gt;&lt;/h3&gt;&lt;ol&gt;   &lt;li&gt;Write code to solve a business problem&lt;/li&gt;   &lt;li&gt;Deploy the code into production and use it to run the business&lt;/li&gt;   &lt;li&gt;Change the business, possibly due to a short term business opportunity&lt;/li&gt;   &lt;li&gt;Delete the redundant code&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Exploratory Test&lt;br /&gt;&lt;/h3&gt;&lt;ol&gt;   &lt;li&gt;Write a unit test to express how a part of the system should operate&lt;/li&gt;   &lt;li&gt;While trying to make the test pass, discover a different abstraction that will be easier to test and implement&lt;/li&gt;&lt;li&gt;Write new tests and implementations using the new abstraction&lt;br /&gt;  &lt;/li&gt;    &lt;li&gt;Delete the original unit test&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Refactoring Pontoon&lt;/h3&gt;&lt;ol&gt;   &lt;li&gt;Attempt a refactoring that is too large to complete in one step.&lt;/li&gt;   &lt;li&gt;Write pontoon code, possibly many new classes, that will keep the system in a working state while the refactoring is in progress.&lt;/li&gt;   &lt;li&gt;Complete the large refactoring after several steps&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Delete the pontoon code&lt;/li&gt; &lt;/ol&gt; Once good code has been deleted, it's like an exemplary citizen - not only did it serve its purpose well while useful, but it imposes no burden on the remaining system after it has gone. Less code can mean less complexity, and a lower cost of change for the code that remains.&lt;br /&gt;&lt;br /&gt;Deleting "perfectly good" code might seem wasteful, but going down that road is going bring you to the old fallacies about predicting programmer productivity by measuring their typing speed.&lt;br /&gt;&lt;br /&gt;I've started to realise I feel proud when I delete good code, with an environmentally friendly kind of smugness. Hopefully I'm doing my bit to reduce my complexity footprint on the software landscape.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-113874321903675301?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/113874321903675301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=113874321903675301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113874321903675301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113874321903675301'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2006/01/most-satisfying-thing-to-do-with.html' title='The most satisfying thing to do with source code'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-113456234964202678</id><published>2005-12-14T06:04:00.000-06:00</published><updated>2006-11-01T11:16:49.270-06:00</updated><title type='text'>Reducing Risk: Frequent Releases vs Quiet Periods</title><content type='html'>Agile methods encourage us to frequently release software into production. However, there is a force pulling in the opposite direction: a desire for gaps between changes, or "quiet periods".&lt;br /&gt;&lt;br /&gt;for frequent releases:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Business value delivered sooner.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Each release is a smaller change.&lt;/li&gt;   &lt;li&gt;Release process becomes well practiced and understood.&lt;/li&gt; &lt;/ul&gt; for quiet periods:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;No new software defects can be introduced during a quiet period.&lt;/li&gt;   &lt;li&gt;If each release requires downtime, keep it to a minimum by making fewer releases.&lt;/li&gt; &lt;/ul&gt; My approach for dealing with this conflict is to attack the (perfectly reasonable) advantages of quiet periods so that they become less important. For example&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;If you are worried about introducing bugs every time you make a release, maybe you need to invest more in automated testing, which tests both the code to be released, and that it has been deployed correctly in production. &lt;/li&gt;   &lt;li&gt;If each release requires downtime, maybe you should automate as much of the deployment process as possible, so that the downtime is shortened. Ultimately it might be worthwhile changing the architecture so that a release can be completed without any downtime at all.&lt;/li&gt; &lt;/ul&gt; Of course you should strike a balance. I like the idea of releasing into production every half hour, &lt;a href="http://blogs.warwick.ac.uk/chrismay/entry/deploy_every_30/"&gt;as flickr is supposed to&lt;/a&gt;, but in reality few enterprises can invest enough to make this practical. I think releasing once a day is often achievable though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-113456234964202678?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/113456234964202678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=113456234964202678' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113456234964202678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113456234964202678'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/12/reducing-risk-frequent-releases-vs.html' title='Reducing Risk: Frequent Releases vs Quiet Periods'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-113079695642849074</id><published>2005-10-31T15:44:00.000-06:00</published><updated>2006-11-01T11:16:49.210-06:00</updated><title type='text'>A sorry tale of modern technology</title><content type='html'>I arrived at the office and opened my PowerBook. It started beeping at me. Oh dear. Seemed fine on the train. Better reboot. Phew, beeping has stopped.&lt;br /&gt;Now a new problem. I get a context menu everywhere I click, as if I'm clicking the right button, but there is only one button. I try playing with the Control key, it seems fine. I try playing in System Preferences, it makes no difference. "Is it the Control key?" suggests Darren, unaware that I have thoroughly inspected it.&lt;br /&gt;&lt;br /&gt;And then it dawns on me.&lt;br /&gt;&lt;br /&gt;My swanky new &lt;a href="http://www.apple.com/keyboard/"&gt;keyboard&lt;/a&gt;, which I purchased 3 days earlier, is in its box, in a bag, on the window sill, on the other side of the office. And sure enough I left it switched on, and the Control key was being held down by the polystyrene packaging. The wonders of Bluetooth - too much power to entrust to a simple software developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-113079695642849074?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/113079695642849074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=113079695642849074' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113079695642849074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/113079695642849074'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/10/sorry-tale-of-modern-technology.html' title='A sorry tale of modern technology'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-112779600465371442</id><published>2005-09-26T23:37:00.000-05:00</published><updated>2006-11-01T11:16:49.144-06:00</updated><title type='text'>Raw coding is nonthinking work, apparently</title><content type='html'>&lt;span class="artText"&gt;I read this in an &lt;a href="http://www.infoworld.com/article/05/08/25/35FEmanage_1.html"&gt;InfoWorld article&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;People go into an offshore deal thinking its only the nonthinking work [they] can move offshore -- the raw coding&lt;/blockquote&gt;Wow, so writing software requires no thought?&lt;br /&gt;&lt;br /&gt;Even if it's not required, I will continue to think about the code I write, while my primary goal remains delivering business value. Maybe there was some time when coding had nothing to do with the proper business people who do all the "real thinking", but that time has passed.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-112779600465371442?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/112779600465371442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=112779600465371442' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/112779600465371442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/112779600465371442'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/09/raw-coding-is-nonthinking-work.html' title='Raw coding is nonthinking work, apparently'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-112400787487367794</id><published>2005-08-14T02:49:00.000-05:00</published><updated>2006-11-01T11:16:49.084-06:00</updated><title type='text'>blame-culture avoidance</title><content type='html'>Who makes technical decisions in a team?&lt;br /&gt;If you are asked "why did you do this, it seems like a bad idea?", the answer should never be "I knew it was a bad idea, but my boss/tech lead/arhictecture department told me to do it".  Maybe you disagree with your boss, but it is your responsibility to explain your point of view and the boss' responsibility to explain theirs.  You should be making a decision together, not making two decisions and throwing one away.  "I knew it was a bad idea" becomes "I had reservations but we went that way because my boss explained..."&lt;br /&gt;A related idea is that everybody in the team needs authority to make decisions, without having to gain approval from a leader.  Most people who ask for approval know more about the question than the person they ask.  This timewasting distracts from the things that really do need discussion.  Pair programming provides a good sounding board for deciding whether a decision requires a full-team discussion.  If it doesn't, just go ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-112400787487367794?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/112400787487367794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=112400787487367794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/112400787487367794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/112400787487367794'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/08/blame-culture-avoidance.html' title='blame-culture avoidance'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-111393843233262062</id><published>2005-04-19T14:16:00.000-05:00</published><updated>2006-11-01T11:16:48.946-06:00</updated><title type='text'>Graphic design makes people happy - bah humbug</title><content type='html'>Graphic design in software is getting a lot better and making people (like me) smile more.&lt;br /&gt;I'm an outsider to graphic design, but I think what's happened is that design for screen has continued to mature. At one time web design consisted of chopping design for print up into chunks and sticking it in an HTML table. We also had the TV inspired age where every corporate web site had to be introduced by a clunky animation. Perhaps we are now mature enough to see that design features are there to enhance the information rather than distract from it. It's about clear text and simple buttons. It's about being pixel-perfect rather than bold and flashy. It's back to good old fashioned typography. Designers realise again that the empty space around glyphs is as important as the glyphs themselves.&lt;br /&gt;My favourite trick is how gmail seems text-based, and yet if you look closely you find loads of pixel-perfect rounded corners and tiny clever graphics. Like all the best design you don't notice it's there.&lt;br /&gt;As a Java developer, I'm inclined not to care about pixel-perfect rendering of web pages. I tend to feel that the content, the domain model, the integrity of the data, even the usability of the system are more important. The rendering is just a detail, and besides, it's probably somebody else's problem.&lt;br /&gt;I think we should worry about these issues much more. I think that the detail of your GUI has a subtle but significant effect on the user. For example, it makes me smile. I would like to think about these issues as software quality issues, in the same way that we think about bugs. How about raising a bug when one word hasn't been anti-aliased properly, or one pixel is the wrong shade of blue? Generally these things aren't a priority in the business-software world, but it would be nice if they were.&lt;br /&gt;And maybe one day I might sort out my blog template.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-111393843233262062?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/111393843233262062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=111393843233262062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/111393843233262062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/111393843233262062'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/04/graphic-design-makes-people-happy-bah.html' title='Graphic design makes people happy - bah humbug'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11901247.post-111342956246007789</id><published>2005-04-13T16:57:00.000-05:00</published><updated>2006-11-01T11:16:48.733-06:00</updated><title type='text'>Testing software with G-clamps</title><content type='html'>&lt;p&gt;Do you like G-clamps? I do. They’re great when you want to hold pieces of wood together while the glue sets, or even better holding a huge piece of plywood to the bench when cutting sweeping curves with the jigsaw.&lt;br /&gt;&lt;a href="http://www.premiertools.co.uk/item2837.htm"&gt;&lt;img alt="'G-Clamp" src="http://www.premiertools.co.uk/usrimage/ak6002.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;To get to the point, I use G-clamps most often when explaining how I think about testing software. The metaphor is that I take some part of a software system and put a clamp around it. The part of the system being tested is the part inside the clamp. The clamp has two “ends”; at one end I pretend to be a user of this section (clicking buttons or calling methods) and see what happens, while at the other end I provide an environment for the test (put data in the database or simulate the response of an external system). In this kind of testing there are 3 roles:&lt;br /&gt;1. The narrative of the test, or the tester, pretending to be a user of the system&lt;br /&gt;2. The system being tested.&lt;br /&gt;3. The components not being tested, but which 2 needs in order to work. The behaviour of these components must be simulated.&lt;br /&gt;&lt;br /&gt;Or 1. Stimulate, 2. Operate, 3. Simulate (catchy! - not)&lt;br /&gt;These roles map onto a G-clamp as follows:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.apcj.net/gallery/albums/gclamps/3roles.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;G-clamps come in lots of different sizes, just as I like to test different sized pieces of my software system. I try to unit-test every part of the system (with small clamps) and I want to have integrations tests that test the whole system at once (with a huge clamp fastened around the whole system).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.apcj.net/gallery/albums/gclamps/unittest.jpg"/&gt;&lt;br /&gt;&lt;img src="http://www.apcj.net/gallery/albums/gclamps/integrationtest.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;G-clamps also have some handy properties:&lt;br /&gt;They are mobile, suggesting that you can test lots of different parts of the system with the same tool.&lt;br /&gt;They have an adjustable screw reminding me that I can choose the thickness of section to test.&lt;br /&gt;&lt;br /&gt;TDD helps with many aspects of design. One of these is understanding how each component depends on those around it. Although it’s not always possible, it’s desirable for the dependencies to form an acyclic graph, i.e. it’s a good thing to avoid cyclic dependencies. This applies to both large components like tiers, and to tiny components like individual classes. I find it helpful to visualise dependency graphs with the most depended-on things at the bottom of the page. If I draw my components out following this pattern then I find that I always “stimulate” further up the page than where I “simulate”. In other words, I find that all my clamps are vertical.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.apcj.net/gallery/albums/gclamps/manyclamps.jpg"/&gt;&lt;br /&gt;Where do mock objects fit into this picture? I see them as a convenient way of providing the bottom half of the clamp, most suited to a unit testing scenario, where you are only testing one layer of the graph. Are mocks desirable in all unit tests? If you are testing at the bottom of dependency graph then you are doing something wrong if you are using mocks because there is no lower level to simulate. However my experience is that objects that can be unit tested in isolation like this are very rare.&lt;br /&gt;&lt;br /&gt;What type of test is best? (What is the best size of clamp?) Our vocabulary for types of test is poor right now (and some tests probably shouldn’t be called tests at all). I think it’s important to separate the concerns of what you intend to gain from your test, and what the scale of the test is. Also it’s important to appreciate that lots of different test scopes are possible. We tend to think of integration tests as horrible big beasts that use all the layers in our stack, while in reality we can write integration tests for just two classes, and every scale right up to the whole stack. So &lt;a href="http://blog.alancfrancis.com/2005/04/no_no_no.html"&gt;Alan's&lt;/a&gt; quote:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;that if you never tested any collaborations with live objects, your rapid feedback test suite had limited use. &lt;/blockquote&gt;&lt;p&gt;Is spot on; your rapid feedback suite should include tests of varying scale, some integrating with “real” objects. These don’t need to be the big heavy integration tests that take half an hour to run; you can write something just a shade bigger than a unit test, or whatever you need to find the things that break often.&lt;br /&gt;&lt;br /&gt;In general we could test every line of code many times, just by unit testing, and testing all combinations of adjacent components. My proposal is that all code should be unit tested, and integration tests should exist where they help to trap bugs. So the choice of which scales of integration test are best (or which sizes of clamp are best) comes down to a question of which scales will be most efficient at trapping bugs. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11901247-111342956246007789?l=apcj.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apcj.blogspot.com/feeds/111342956246007789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=11901247&amp;postID=111342956246007789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/111342956246007789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11901247/posts/default/111342956246007789'/><link rel='alternate' type='text/html' href='http://apcj.blogspot.com/2005/04/testing-software-with-g-clamps.html' title='Testing software with G-clamps'/><author><name>Alistair Jones</name><uri>http://www.blogger.com/profile/09397853227349128817</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00289206475257616329'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>