<?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-20731736</id><updated>2012-01-27T14:30:42.168Z</updated><title type='text'>bitwix</title><subtitle type='html'>Tangential comments about Software Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.bitwix.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20731736.post-1829302229804970633</id><published>2012-01-27T14:29:00.002Z</published><updated>2012-01-27T14:30:42.174Z</updated><title type='text'>Coincidence?</title><content type='html'>&lt;ul&gt;&lt;li&gt;Google Predict through the API Explorer - tick.&lt;/li&gt;&lt;li&gt;Through Google's sample code - tick.&lt;/li&gt;&lt;li&gt;Cut down to my own DLL - failed.&lt;/li&gt;&lt;/ul&gt;I tried various things. It was when I chose to reference my own DLL from the Google sample that it said my project was targetting a different .Net framework. So I changed it to be .Net 3.5. I ran the test. &lt;p/&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-nyL1hQUFLS4/TyK0ylMQvLI/AAAAAAAAAG8/jzfwl2-VAcY/s1600/UncleBobTweet.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="115" width="200" src="http://3.bp.blogspot.com/-nyL1hQUFLS4/TyK0ylMQvLI/AAAAAAAAAG8/jzfwl2-VAcY/s200/UncleBobTweet.png" /&gt;&lt;/a&gt;As it was passing, TweetDeck showed me Uncle Bob Martin's re-tweet : &lt;b&gt;RT @jon_cham: Prolific developers don't always write a lot of code, instead they solve a lot of problems. The two things are not the same.&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1829302229804970633?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1829302229804970633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1829302229804970633'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2012/01/coincidence.html' title='Coincidence?'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-nyL1hQUFLS4/TyK0ylMQvLI/AAAAAAAAAG8/jzfwl2-VAcY/s72-c/UncleBobTweet.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-5945786824317915537</id><published>2011-12-29T10:59:00.001Z</published><updated>2011-12-29T11:01:33.618Z</updated><title type='text'>Make it fast</title><content type='html'>I spent an afternoon on the &lt;a href="http://codekata.pragprog.com/2007/01/kata_nineteen_w.html"&gt;Word Chain kata&lt;/a&gt;. The challenge is given two words of equal length (e.g. CODE and MESS) to find words that change one into the other, altering one letter at a time, so CODE MODE MODS MOSS MESS.&lt;br /&gt;&lt;br /&gt;I got it to work, using the &lt;a href="http://wordlist.sourceforge.net/"&gt;SCOWL dictionary&lt;/a&gt;. I improved my algorithm, by searching from both ends rather than just one. I split classes into smaller ones with limited responsibilities - a ChainSeeker, a Tentacle, a Route. It was better.&lt;br /&gt;&lt;br /&gt;I then decided, uncharacteristically for me, to make it fast. So a list of used words was replaced by a hashmap. It was faster.&lt;br /&gt;&lt;br /&gt;As I proceeded, the slowest part was finding the possible words to go next. Input CODE, output a list of MODE, NODE, COPE, CODA etc. Here's the final code I used:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public List&amp;lt;string&amp;gt; GetPossibleNextWords(string word)&lt;br /&gt;{&lt;br /&gt;    List&amp;lt;string&amp;gt; result = new List&amp;lt;string&amp;gt;();&lt;br /&gt;    int wordhash = HashMap.MyHash(word);&lt;br /&gt;&lt;br /&gt;    for (int i = 0; i &amp;lt; word.Length; i++)&lt;br /&gt;    {&lt;br /&gt;        string before = String.Empty, after = String.Empty;&lt;br /&gt;        long hash0 = wordhash - HashMap.HashAt(word[i], i, word.Length);&lt;br /&gt;&lt;br /&gt;        char skipc = word[i];&lt;br /&gt;        for (char c = 'a'; c &amp;lt;= 'z'; c++)&lt;br /&gt;        {&lt;br /&gt;            if (c == skipc)&lt;br /&gt;                continue;&lt;br /&gt;            long hash = HashMap.HashAt(c, i, word.Length);&lt;br /&gt;            if (KnownHash(hash + hash0))&lt;br /&gt;            {&lt;br /&gt;                if (before == String.Empty &amp;amp;&amp;amp; after == String.Empty)&lt;br /&gt;                {&lt;br /&gt;                    before = i &amp;gt; 0 ? word.Substring(0, i) : String.Empty;&lt;br /&gt;                    after = i + 1 &amp;lt; word.Length ? word.Substring(i + 1) : String.Empty;&lt;br /&gt;                }&lt;br /&gt;                result.Add(before + c + after);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;It's faster, but it's worse. I'm taking advantage of understanding the hash algorithm to calculate the new hash from changing a letter. I'm keeping these strings before and after blank until I really need them, then holding them in memory on the off-chance that I need them  again.&lt;br /&gt;&lt;br /&gt;I daresay it could be made faster still. I'm sure that creating and passing List&amp;lt;string&amp;gt; objects is inefficient. But I think I've learned something, which is that I can keep making code faster, but at the expense of legibility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-5945786824317915537?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5945786824317915537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5945786824317915537'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/12/make-it-fast.html' title='Make it fast'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3660846641150193749</id><published>2011-11-06T12:05:00.001Z</published><updated>2011-11-06T12:11:11.749Z</updated><title type='text'>Judicious use of decoration</title><content type='html'>&lt;img src="http://dailydropcap.com/images/J-8-cap.png" title="Daily Drop Cap by Jessica Hische" align="left" alt="J"/&gt;essica Hische has this great blog, &lt;a href='http://www.dailydropcap.com/' target='_blank'&gt;Daily Drop Cap&lt;/a&gt;, with letters to use at the beginning of paragraphs. Just last month, I read &lt;i&gt;Roads to Quoz&lt;/i&gt; by William Least Heat-Moon where he admits to a fondness for the letter Q. Johns, Jemimas, Jacks and Juliets around the world may share with me a preference for the tenth letter of our alphabet. Judge me not for having married another. Jump on the opportunity to admit your passion! Jettison timidity and celebrate the letter in whatever way you choose!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3660846641150193749?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3660846641150193749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3660846641150193749'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/11/judicious-use-of-decoration.html' title='Judicious use of decoration'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1200963073503369031</id><published>2011-10-30T11:22:00.000Z</published><updated>2011-10-30T11:22:55.336Z</updated><title type='text'>Algol for Interviewing</title><content type='html'>Next time I'm interviewing a programmer for a job, I'd like to use this fragment of Algol. It comes from &lt;i&gt;Electronic Computers&lt;/i&gt; by Hollingdale and Tootill (published 1965) which I stole from my brother-in-law's bookshelves.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;begin comment Evaluate pi from Vieta's formula;&lt;br /&gt;  real e, f, product; integer count;&lt;br /&gt;  e := read tape;&lt;br /&gt;  f := 0; product := 1; count := 0;&lt;br /&gt;  for count := count + 1 while f &amp;lt; 2 - e do&lt;br /&gt;    begin f:= sqrt( 2 + f );&lt;br /&gt;      product := product x f/2&lt;br /&gt;    end;&lt;br /&gt;  newline; print (2/product); print (count)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Good algorithm, better maths. Sixteenth century Italy was an advanced place intellectually.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1200963073503369031?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1200963073503369031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1200963073503369031'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/10/algol-for-interviewing.html' title='Algol for Interviewing'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3876315569451173271</id><published>2011-09-12T14:47:00.001+01:00</published><updated>2011-09-14T15:20:05.747+01:00</updated><title type='text'>Je suis un bricoleur</title><content type='html'>... the 'bricoleur' is still someone who works with his hands and uses devious means compared to those of a craftsman. The 'bricoleur' is adept at performing a large number of diverse tasks; but, unlike the engineer, he does not subordinate each of them to the availability of raw materials and tools conceived and procured for the purpose of the &amp;nbsp;project. His universe of instruments is closed and the rules of his game are always to make do with 'whatever is at hand' ... the engineer is always trying to make his way out of and go beyond the constraints imposed by a particular state of civilization while the 'bricoleur' by inclination or necessity always remains within them.&lt;br /&gt;Claude Lévi-Strauss, &lt;i&gt;The Savage Mind&lt;/i&gt;, pp 16-19, quoted in &lt;i&gt;Adhocism&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The distinction is between appropriateness and urgency. The scientist is intent on using the tools and hypothesis appropriate to his job, whereas the bricoleur or adhocist is intent on undertaking his job immediately, with whatever resources are available.&lt;br /&gt;Charles Jencks, &lt;i&gt;Adhocism&lt;/i&gt;, p 17&lt;br /&gt;&lt;br /&gt;I am a bricoleur. That explains my divergence from some colleagues who want me to embrace a new language, and from greater agile minds who want me to use mock objects. I can make do with what I've got. Note, however, that Jencks insists that the bricoleur and scientist are equally objective and deal equally rigorously with the facts. The distinction is not one of kind or quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3876315569451173271?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3876315569451173271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3876315569451173271'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/09/je-suis-un-bricoleur.html' title='Je suis un bricoleur'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-5538025272544501117</id><published>2011-08-17T14:53:00.008+01:00</published><updated>2011-08-17T15:38:52.004+01:00</updated><title type='text'>SquareOnBoard Wordle</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-cGTdQjTVBAU/TkvJiFnCXII/AAAAAAAAAFQ/gvvYuu4hR60/s1600/SquareOnBoardWordle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 269px;" src="http://4.bp.blogspot.com/-cGTdQjTVBAU/TkvJiFnCXII/AAAAAAAAAFQ/gvvYuu4hR60/s400/SquareOnBoardWordle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5641824545670323330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wordle of code. This is heavily commented for Intellisense, causing the popularity of see, summary and returns. The class itself, SquareOnBoard, is more common than other classes such as MGCell or ExportParameter so not too bad on the feature envy front. I see there are both string.Empty and String.Empty, and we're using null rather than a Null object.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-gWdBwfEvwkI/TkvQgEyK3UI/AAAAAAAAAFY/HMEN8Jfrezc/s1600/SurfaceWordle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/-gWdBwfEvwkI/TkvQgEyK3UI/AAAAAAAAAFY/HMEN8Jfrezc/s400/SurfaceWordle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5641832207670238530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a second class. In this case I got Wordle to include common words, so if appears. I also used the alphabetic sort option. This one has no Intellisense comments. The effect of these changes is to see that I use r and c variables, and increment both with ++. The class itself, Surface, is hardly mentioned while the work it does is clearly on squares of various sorts. m is actually the m_ prefix on a member variable.&lt;br /&gt;&lt;br /&gt;What fun &lt;a href="http://www.wordle.net/"&gt;www.wordle.net&lt;/a&gt; is!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-5538025272544501117?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5538025272544501117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5538025272544501117'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/08/squareonboard-wordle.html' title='SquareOnBoard Wordle'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cGTdQjTVBAU/TkvJiFnCXII/AAAAAAAAAFQ/gvvYuu4hR60/s72-c/SquareOnBoardWordle.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7910040062271562509</id><published>2011-08-15T10:53:00.005+01:00</published><updated>2011-08-15T11:12:19.934+01:00</updated><title type='text'>Agile 2011 Sessions, Notes and Links</title><content type='html'>MONDAY&lt;br /&gt;&lt;br /&gt;Fluency over Proficiency: Accelerating Agile Learning and “Hunting Language”, Willem Larsen&lt;br /&gt;Also known as who I crashed and burned at learning American Sign Language&lt;br /&gt;&lt;br /&gt;The Transformation Priority Premise, Robert C. Martin&lt;br /&gt;Bowling score game : designed 400 lines, test driven 14 lines&lt;br /&gt;&lt;br /&gt;TUESDAY &lt;br /&gt;&lt;br /&gt;Fluency over Proficiency again, as an Open Jam session. I moved on a little bit.&lt;br /&gt;&lt;br /&gt;Powerful Questions, Carlton Nettleton &lt;br /&gt;&lt;br /&gt;Adaptive Leadership: Accelerating Organizational Agility, Jim Highsmith &lt;br /&gt; &lt;br /&gt;Lightning Talks including Michael Feathers on limits of agile&lt;br /&gt;&lt;br /&gt;WEDNESDAY&lt;br /&gt;&lt;br /&gt;Creating an Environment by Making, Keeping, and Amending Agreements, Amr Elssamadisy&lt;br /&gt;&lt;br /&gt;Continuous Integration, Jez Humble&lt;br /&gt;&lt;br /&gt;Agile Game Incubator, Michael McCulloch and Don McGreal&lt;br /&gt;&lt;a href="http://tastycupcakes.org/2011/08/zhong-zhi-a-one-handed-agile-game-for-illustrating-problems-and-finding-solutions/"&gt;Zhong Zhi&lt;/a&gt;, a one-handed agile game invented and refined&lt;br /&gt;&lt;br /&gt;Making Hard Choices about Technical Debt, Nanette Brown, Robert Nord&lt;br /&gt;Board game fun, and yay I beat Elisabeth Hendrickson&lt;br /&gt;See &lt;a href="http://c2.com/doc/oopsla92.html"&gt;Ward Cunningham's OOPSLA 92 presentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lightning Talks including &lt;a href="http://prezi.com/"&gt;www.prezi.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;THURSDAY&lt;br /&gt;&lt;br /&gt;Creating Customer Delight, Stephen Denning &lt;br /&gt;Net Promoter Score = Reichheld’s single question to customers. How likely are you to recommend us? 0 No – 10 Definitely. Count 9s +10s less 0-6s. Positive territory is good.&lt;br /&gt;&lt;br /&gt;Experimentation: a Missing Agile Practice, Arlo Belshee &lt;br /&gt;&lt;br /&gt;The Kata In The Hat, Emmanuel Gaillot &amp; Jonathan Perret &lt;br /&gt;&lt;br /&gt;Slackers and Debtors: Meet Commitments, Reduce Debt, and Improve Performance, James Shore&lt;br /&gt;&lt;br /&gt;FRIDAY&lt;br /&gt;&lt;br /&gt;Code, Kevlin Henney&lt;br /&gt;The Agile Mindset, Linda Rising&lt;br /&gt;&lt;br /&gt;QUOTATIONS ETC&lt;br /&gt;&lt;br /&gt;WILL TEACH CLOJURE FOR FOOD&lt;br /&gt;I think middle management gets a bad rap [applause] Jim Highsmith&lt;br /&gt;Without exception, all of my biggest mistakes occurred because I moved too slowly. John Chambers, CISCO CEO, quoted by Jim Highsmith&lt;br /&gt;“It’s not an act, is it Bob?” friend of Robert Martin, on finding him playing with his laser pointer in a mirrored bathroom&lt;br /&gt;As TDD developers, after doing a design, the first thing we do is ignore it RCMartin&lt;br /&gt;&lt;br /&gt;“What’s the chance of changing my wife?”&lt;br /&gt;“I divorced mine”&lt;br /&gt;“You gave up on changing your wife”&lt;br /&gt;“No, she gave up on me”&lt;br /&gt;&lt;br /&gt;SUGAR HOUSE&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wildflowersbb.com/"&gt;Wildflowers Bed and Breakfast&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.sugarhousecoffee.com/"&gt;Sugar House Coffee&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.omarsrawtopia.com/"&gt;Omar's Rawtopia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/WasatchJazzProject"&gt;Wasatch Jazz Project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7910040062271562509?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7910040062271562509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7910040062271562509'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/08/agile-2011-sessions-notes-and-links.html' title='Agile 2011 Sessions, Notes and Links'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6405344508973780855</id><published>2011-07-28T16:38:00.003+01:00</published><updated>2011-07-28T16:45:52.463+01:00</updated><title type='text'>Easy does it</title><content type='html'>I applaud &lt;a href="http://www.exampler.com/ease-and-joy.html"&gt;Brian Marick's argument&lt;/a&gt; that Ease should be a core value at work. In a talk at the SDC 2010 Conference he spoke of the smooth cadence of good work, such as the nurse who has ready the next instrument a surgeon needs.&lt;br /&gt;&lt;br /&gt;Javascript I do not find easy. I'm trying to relax into it, kick off my compile-time error expectations, use its freedom and informality. But I still aim for ease. To this end, I'm getting Intellisense to work for me and I'm learning which functions I need to add to make jQuery even more natural. I JSLint everything, and built a tiny publication application for combining and minifying  the .js files.&lt;br /&gt;&lt;br /&gt;Perhaps I'm getting there, perhaps I will end up liking Javascript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6405344508973780855?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6405344508973780855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6405344508973780855'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/07/easy-does-it.html' title='Easy does it'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-4413591851442257097</id><published>2011-06-22T19:03:00.001+01:00</published><updated>2011-06-22T19:05:55.118+01:00</updated><title type='text'>What could possibly go wrong?</title><content type='html'>So that's the architecture decided. We're building an MVC C#4 LINQ and EF server talking to an HTML5 JSLint-compliant JQuery and Knockout client. What could possibly go wrong?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-4413591851442257097?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4413591851442257097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4413591851442257097'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/06/what-could-possibly-go-wrong.html' title='What could possibly go wrong?'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-2909698739573501555</id><published>2011-05-30T11:30:00.004+01:00</published><updated>2011-05-30T11:36:32.481+01:00</updated><title type='text'>Pairfectionist Programming</title><content type='html'>I've signed up for Pair Programming. It's a much richer way of spending my day.&lt;br /&gt;&lt;br /&gt;I hadn't thought through what it would be like to PP with a perfectionist. The kind of guy who wants all user messages to be consistently formatted, in "real" and helpful English. The emotional arc goes from "how can this pedantic nuisance waste so much of my valuable time?" while we're programming to "what a lovely program - I must show it off to my friends" when we're done.&lt;br /&gt;&lt;br /&gt;My conclusion : Pairfectionist Programming is another example of PP getting the best out of everyone. Give it a chance!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-2909698739573501555?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2909698739573501555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2909698739573501555'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/05/pairfectionist-programming.html' title='Pairfectionist Programming'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-8937661061898663215</id><published>2011-04-16T08:38:00.004+01:00</published><updated>2011-04-16T08:47:29.193+01:00</updated><title type='text'>One either meets...</title><content type='html'>I described my "deskspace" office arrangement to a friend. "Are there meeting rooms as well?" she asked. I said something about the lunch tables at one end, but you could tell she wasn't convinced.&lt;br /&gt;&lt;br /&gt;Later that week I came across this quotation from Peter Drucker. &lt;b&gt;One either meets or one works&lt;/b&gt;. That's what I should have said back. That, and if her job involves lots of meetings, then I'm glad I don't work for her company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-8937661061898663215?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8937661061898663215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8937661061898663215'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/04/one-either-meets.html' title='One either meets...'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-2443073476003687282</id><published>2011-03-30T12:09:00.004+01:00</published><updated>2011-03-30T12:16:41.104+01:00</updated><title type='text'>TAD Happier</title><content type='html'>Yesterday afternoon, it was not going well. Trying to write visualisation code, I was getting some unexpected null links. It was difficult code and tricky design, and I'd not been doing any test first work.&lt;br /&gt;&lt;br /&gt;This morning, I aggressively changed it so that it could have tests. Test After Development, or TAD for short. Yes, I found the error (out by one). Code is testable. New feature added as a test first. Much happier.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-DNEXw1fxd_Q/TZMP940aM7I/AAAAAAAAAE0/CPPoPBWaNXo/s1600/PyleVisual.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 332px; height: 392px;" src="http://3.bp.blogspot.com/-DNEXw1fxd_Q/TZMP940aM7I/AAAAAAAAAE0/CPPoPBWaNXo/s400/PyleVisual.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5589829118395560882" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-2443073476003687282?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2443073476003687282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2443073476003687282'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/03/tad-happier.html' title='TAD Happier'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-DNEXw1fxd_Q/TZMP940aM7I/AAAAAAAAAE0/CPPoPBWaNXo/s72-c/PyleVisual.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-4494342142305049087</id><published>2011-02-08T10:15:00.004Z</published><updated>2011-04-16T08:38:37.632+01:00</updated><title type='text'>Pocket PC Tests</title><content type='html'>There's no current framework for unit tests on the Pocket PC Emulator. I found a few old blog posts, but nothing looked like it was still supported. So I rolled my own.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JQSe5r0tmqs/TVEYESmrLgI/AAAAAAAAAEs/OoFddexpEjw/s1600/PocketPCTests.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://4.bp.blogspot.com/_JQSe5r0tmqs/TVEYESmrLgI/AAAAAAAAAEs/OoFddexpEjw/s400/PocketPCTests.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5571260676026609154" /&gt;&lt;/a&gt;&lt;br /&gt;Interesting exercise. A trade-off between usefulness and ease of development. Highlights are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I really wanted a red/green bar for visualising success&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Attribute programming and reflection is easy enough if you're following a model&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Run one test with the debugger in Visual Studio is helpful&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The tests are slow by comparison with say NUnit and C# libraries&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They are not &lt;b&gt;Unit&lt;/b&gt; tests, by and large. I respect&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=126923"&gt; Michael Feathers' definition&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-4494342142305049087?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4494342142305049087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4494342142305049087'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/02/pcket-pc-tests.html' title='Pocket PC Tests'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JQSe5r0tmqs/TVEYESmrLgI/AAAAAAAAAEs/OoFddexpEjw/s72-c/PocketPCTests.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3624778150909910608</id><published>2011-01-31T12:30:00.003Z</published><updated>2011-01-31T12:41:53.473Z</updated><title type='text'>Clever Code and Simple Names</title><content type='html'>A new departure this month has been writing code for a handheld device running .Net Compact Framework and talking to a web service. It's gone well.&lt;br /&gt;&lt;br /&gt;One challenge has been to hold a cookie on the handheld so that the web service session can be held. Credit goes to a fine bit of code by &lt;a href="http://groups.google.com/group/microsoft.public.dotnet.framework.compactframework/browse_frm/thread/fcb642d1deb28f95"&gt;Alex Feinman&lt;/a&gt; which provided everything I need. Here's the code in action:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public List&lt;string&gt; FetchReferenceData()&lt;br /&gt;{&lt;br /&gt;    Service w = new Service();&lt;br /&gt;    RequestData ReqData = new RequestData(w.Url);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's the only reference to the ReqData object, while the service w logs in, downloads data and logs out. So when I copied the code to do an upload as well, I removed the RequestData line as being redundant. The upload failed, of course, because the "redundant" code was actually causing the cookied web request to work.&lt;br /&gt;&lt;br /&gt;What to conclude? My class now talks to a lazily created Service as shown below. But I feel that I should rename RequestData so that its usefulness is made clear. Does RequestWithCookie sound better than CookiedRequest?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        private Service MyService&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                if (m_service == null)&lt;br /&gt;                {&lt;br /&gt;                    m_service = new Service();&lt;br /&gt;                    m_requestdata = new RequestData(m_service.Url);&lt;br /&gt;                }&lt;br /&gt;                return m_service;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3624778150909910608?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3624778150909910608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3624778150909910608'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2011/01/clever-code-and-simple-names.html' title='Clever Code and Simple Names'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-9111306990283228314</id><published>2010-12-06T10:00:00.003Z</published><updated>2010-12-06T10:04:14.613Z</updated><title type='text'>Coat Hanger of Power</title><content type='html'>Liz Keogh ran a session at XpDay 2010 called &lt;a href="http://xpday-london.editme.com/Wow-I-Wish-Id-Known-That-Earlier"&gt;Wow I Wish I'd Known That Earlier&lt;/a&gt;. I mentioned my Coat Hanger of Power as an example of improvising an informative workspace. The idea amused people, so here's a photo of the original.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JQSe5r0tmqs/TPy1ClhdhGI/AAAAAAAAAEc/rhfSWBKizYc/s1600/CoatHangerOfPower.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_JQSe5r0tmqs/TPy1ClhdhGI/AAAAAAAAAEc/rhfSWBKizYc/s400/CoatHangerOfPower.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5547507897050432610" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-9111306990283228314?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/9111306990283228314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/9111306990283228314'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/12/coat-hanger-of-power.html' title='Coat Hanger of Power'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JQSe5r0tmqs/TPy1ClhdhGI/AAAAAAAAAEc/rhfSWBKizYc/s72-c/CoatHangerOfPower.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6893670287519311815</id><published>2010-11-29T13:43:00.003Z</published><updated>2010-11-29T18:42:34.948Z</updated><title type='text'>Role Play Your Worst Enemy</title><content type='html'>This is a record of an Open Space session at &lt;a href="http://xpday-london.editme.com/XpDay2010"&gt;XPDay 2010&lt;/a&gt; in London.&lt;br /&gt;&lt;br /&gt;The group shouted out a few difficult conversations they'd been part of. Then a pair of volunteers acted out that conversation. The rest of us watched, and afterwards discussed our reactions.&lt;br /&gt;&lt;br /&gt;Here are the opening line for the conversations:&lt;br /&gt;I don't want to Pair Program!&lt;br /&gt;The tests must inject these thousand objects into the system!&lt;br /&gt;Why do we have to have so much documentation?&lt;br /&gt;&lt;br /&gt;I was pleased by the session, with fascinating suggestions and challenges coming from everyone there. Personally, I had to face up to a willingness to "sideline" someone in order to move the project along.&lt;br /&gt;&lt;br /&gt;Thanks to all who were there: Ikenna, Liz, Ian, Benjamin, David, Nader and Squirrel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6893670287519311815?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6893670287519311815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6893670287519311815'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/11/role-play-your-worst-enemy.html' title='Role Play Your Worst Enemy'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1392596212020165314</id><published>2010-10-25T10:21:00.002+01:00</published><updated>2010-10-25T10:27:26.689+01:00</updated><title type='text'>(I'm All) Over Comprehensive Documentation</title><content type='html'>As an Agile Developer, I value &lt;a href="http://agilemanifesto.org/"&gt;working software over comprehensive documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So it's a good sign when, as the software goes into full use by the customer, I find the time to write a user manual. I'd previously mastered the table of contents features, so the challenge was to find a shared location on the customer's network to put it. Writing the text I don't mind, and screenshots do make it look complete.&lt;br /&gt;&lt;br /&gt;I intend to find out after a month who has used the manual. That's my problem with documentation - no feedback loop. Maybe this time will be different.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1392596212020165314?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1392596212020165314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1392596212020165314'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/10/im-all-over-comprehensive-documentation.html' title='(I&apos;m All) Over Comprehensive Documentation'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-198472305102035500</id><published>2010-10-16T13:37:00.002+01:00</published><updated>2010-10-16T13:40:46.781+01:00</updated><title type='text'>It's worth being dogmatic as a learning tool</title><content type='html'>That's a quotation from Kent Beck on Software Engineering Radio www.se-radio.net Episode 167.&lt;br /&gt;&lt;br /&gt;I think it's important he says "learning" tool, not "teaching". Inflict your dogma on yourself, not others. I went after 100% test coverage, and I learned a lot. I know I'd have had a mutiny if I'd demanded it of colleagues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-198472305102035500?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/198472305102035500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/198472305102035500'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/10/its-worth-being-dogmatic-as-learning.html' title='It&apos;s worth being dogmatic as a learning tool'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3525112481541546442</id><published>2010-10-10T17:44:00.000+01:00</published><updated>2010-10-10T17:45:41.452+01:00</updated><title type='text'>Scientists A-G</title><content type='html'>Mary Anning (1799–1847) was a British fossil collector, dealer and palaeontologist. Ichthyosaur &lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mary_Anning"&gt;http://en.wikipedia.org/wiki/Mary_Anning&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jocelyn Bell Burnell (born 1943) British astrophysicist. Pulsars&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Jocelyn_Bell_Burnell"&gt;http://en.wikipedia.org/wiki/Jocelyn_Bell_Burnell&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Margaret Cavendish (1623–1673) English aristocrat, a prolific writer, and a scientist. "Blazing World"&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Jocelyn_Bell_Burnell"&gt;http://en.wikipedia.org/wiki/Margaret_Cavendish,_Duchess_of_Newcastle-upon-Tyne&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mary Douglas (1921–2007) British anthropologist. "Purity and Danger"&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mary_Douglas"&gt;http://en.wikipedia.org/wiki/Mary_Douglas&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gertrude Elion (1918–1999) American biochemist and pharmacologist, 1988 Nobel Prize for Medicine. 6-mercaptopurine&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Gertrude_B._Elion"&gt;http://en.wikipedia.org/wiki/Gertrude_B._Elion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rosalind Franklin (1920–1958) was a British biophysicist, physicist, chemist, biologist and X-ray crystallographer. DNA.&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Rosalind_Franklin"&gt;http://en.wikipedia.org/wiki/Rosalind_Franklin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jane Goodall (born 1934) British primatologist, ethologist, anthropologist, and UN Messenger of Peace. Chimpanzees.&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Jane_Goodall"&gt;http://en.wikipedia.org/wiki/Jane_Goodall&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3525112481541546442?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3525112481541546442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3525112481541546442'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/10/scientists-g.html' title='Scientists A-G'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-657599983083188469</id><published>2010-09-07T17:19:00.001+01:00</published><updated>2010-09-07T17:20:30.603+01:00</updated><title type='text'>Full Coverage</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JQSe5r0tmqs/TIZmQsS1HWI/AAAAAAAAADs/8PutsrvL4vM/s1600/FullCoverage.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 384px; height: 261px;" src="http://4.bp.blogspot.com/_JQSe5r0tmqs/TIZmQsS1HWI/AAAAAAAAADs/8PutsrvL4vM/s320/FullCoverage.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5514207230715829602" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-657599983083188469?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/657599983083188469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/657599983083188469'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/09/full-coverage.html' title='Full Coverage'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JQSe5r0tmqs/TIZmQsS1HWI/AAAAAAAAADs/8PutsrvL4vM/s72-c/FullCoverage.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-9191302223089419365</id><published>2010-09-02T09:49:00.002+01:00</published><updated>2010-09-02T09:53:12.076+01:00</updated><title type='text'>On the value of Maths exams</title><content type='html'>'A window cleaner carries a uniform 60-lb. ladder 15 ft. long, at one end of which a bucket of water weighing 40 lb. is hung. At what point must he support the ladder to carry it horizontally? Where is the c.g. of his load?' Miss Brodie looked at the paper, after reading out this questions as if to indicate that she could not believe her eyes. Many a time she gave the girls to understand that the solution to such problems would be quite useless to Sybil Thorndike, Anna Pavlova and the late Helen of Troy.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The Prime of Miss Jean Brodie&lt;/span&gt;, Muriel Spark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-9191302223089419365?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/9191302223089419365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/9191302223089419365'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/09/on-value-of-maths-exams.html' title='On the value of Maths exams'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1659758620573029626</id><published>2010-08-26T16:30:00.004+01:00</published><updated>2010-08-26T16:35:41.245+01:00</updated><title type='text'>What happens when I aim for 100% Test Coverage</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I resent guard clauses, but they're better than nested ifs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I resent lazy initialisation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I move code, for instance making a Filler that talks to the database&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I find bugs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I feel giddy with the effort&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JQSe5r0tmqs/THaIuhn1GiI/AAAAAAAAADc/bILKoT-uWPE/s1600/Coverage.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 201px; height: 240px;" src="http://4.bp.blogspot.com/_JQSe5r0tmqs/THaIuhn1GiI/AAAAAAAAADc/bILKoT-uWPE/s200/Coverage.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5509741527015168546" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1659758620573029626?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1659758620573029626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1659758620573029626'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/08/what-happens-when-i-aim-for-100-test.html' title='What happens when I aim for 100% Test Coverage'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JQSe5r0tmqs/THaIuhn1GiI/AAAAAAAAADc/bILKoT-uWPE/s72-c/Coverage.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7494948449065378617</id><published>2010-07-29T16:10:00.004+01:00</published><updated>2010-07-29T16:18:24.586+01:00</updated><title type='text'>A Big Leap</title><content type='html'>I had an interesting example of a &lt;a href="/2010/05/responsive-design-examples.html"&gt;Responsive Design Leap&lt;/a&gt; this week.&lt;br /&gt;My application had a set of global data dictionaries. I decided to make them members of a Universe class, so that I could compare different data sets. I moved one, simple dictionary, fixed the broken tests, went on to the next. As the dictionaries became more significant to the application, the tests were becoming harder to fix. Some of them only broke under certain circumstances, my least favourite thing.&lt;br /&gt;&lt;br /&gt;The leap was to choose to complete moving the dictionaries across, without fixing the tests. I did this because I suspected that some of the bizarre behaviours were down to the mixed state, with some global and some local dictionaries.&lt;br /&gt;&lt;br /&gt;And so it turned out. Once the full set of dictionaries were in the Universe class, my tests passed. Rare and counter-intuitive, and therefore interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7494948449065378617?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7494948449065378617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7494948449065378617'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/07/big-leap.html' title='A Big Leap'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7816703621944678484</id><published>2010-06-28T08:30:00.003+01:00</published><updated>2010-06-28T08:43:58.404+01:00</updated><title type='text'>Build your test data</title><content type='html'>My new favourite line of code is &lt;b&gt;return this;&lt;/b&gt;&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;Credit for this is due to Steve Freeman and Nat Pryce, for Chapter 22 of their book &lt;i&gt;Growing Object-Oriented Software, Guided By Tests&lt;/i&gt;, chapter title Constructing Complex Test Data.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;It's been beyond my skills to write tests for systems like &lt;a href='http://www.whitespace.co.uk/cmr.net/cmr.html'&gt;CMR.Net&lt;/a&gt; which are heavily data dependent. So the data builder approach in Steve and Nat's book has changed everything. Here's how a test now appears.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void Formula()&lt;br /&gt;        {&lt;br /&gt;            MicroGrid mg = new GridBuilder()&lt;br /&gt;                .WithTextCell("A1", "2")&lt;br /&gt;                .WithFormulaCell("A2", "=A1*2")&lt;br /&gt;                .Build();&lt;br /&gt;            Stitch();&lt;br /&gt;            MGCell c = mg.CellAt("A2");&lt;br /&gt;            Assert.IsNotNull(c);&lt;br /&gt;            Assert.AreEqual(CellTypeLetter.FORMULA, c.CellType);&lt;br /&gt;            Assert.AreEqual("4", c.DisplayValue);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's that chained set of statements, starting with a new GridBuilder object, whose WithXX functions add internal data and return 'this'. They can therefore be chained together, until a final call to Build() returns a MicroGrid object. Damn fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7816703621944678484?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7816703621944678484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7816703621944678484'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/06/build-your-test-data.html' title='Build your test data'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1227718251596831597</id><published>2010-05-07T09:06:00.009+01:00</published><updated>2010-05-07T10:01:06.964+01:00</updated><title type='text'>Responsive Design Examples</title><content type='html'>I'd read about Kent Beck's ideas on &lt;a href="http://www.threeriversinstitute.org/blog/?page_id=379"&gt;Responsive Design&lt;/a&gt; and went to Sweden to attend his &lt;a href="http://www.scandevconf.se/2010/open-event/all/tutorial-responsive-design/"&gt;one-day workshop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In April 2010 I spent a week with a team refactoring and extending some functionality. Here are some examples of how the Responsive Design ideas look to me in practice.&lt;br /&gt;&lt;br /&gt;First, &lt;b&gt;Coupling and Cohesion&lt;/b&gt;. A change I made was criticised for making one set of classes aware of an area of the system that previously they'd been independent of. It was a data wrapper area, where all classes provided a similar depth of function. I introduced a specific behaviour to one class to do with the particular Configurable Export function.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JQSe5r0tmqs/S-PMDdzFCUI/AAAAAAAAACI/Kox3w8mFRds/s1600/MoreCoupling.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 173px;" src="http://4.bp.blogspot.com/_JQSe5r0tmqs/S-PMDdzFCUI/AAAAAAAAACI/Kox3w8mFRds/s320/MoreCoupling.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5468438732468455746" /&gt;&lt;/a&gt;&lt;br /&gt;That change increased the coupling, and therefore decreased the cohesion of the original classes. To preserve the cohesion we implemented the same functionality in a different way which left the data wrapper classes intact.&lt;br /&gt;&lt;br /&gt;Next I looked for examples of Kent's four styles of change.&lt;br /&gt;&lt;br /&gt;A &lt;b&gt;Leap&lt;/b&gt; example came in replacing variables that were over keen on the use of generics. Specifically the declaration of such variable was&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Dictionary&amp;lt;string, Dictionary&amp;lt;string, &lt;br /&gt;List&amp;lt;string, Dictionary&amp;lt;string, string&amp;gt;&amp;gt;&amp;gt;&amp;gt; x;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I could see that we should replace such variables with a new named class, and replace the accessing of the dictionaries and lists with named functions. But I could not see either how to do that in small steps, nor could I see what names to give to the access functions. It was just a leap. The system was broken until the compile errors went away, but then all worked nicely. I then renamed a couple of functions once I'd seen their use and I was done.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Parallel&lt;/b&gt; change I made concerned code which was in the wrong place, making a class way too big. It was not clear to me what set of functions should be moved out, so I created a Helper class and just moved things that looked right from their function signatures and use of class variables. I disabled the functionality in the original class rather than deleting it at this stage. Once I had something that looked better, I got input from the team about whether it was an improvement and what to call the class. Only when everyone was happy did I remove the obsolete functionality from the original class.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Stepping Stone&lt;/b&gt; change was a classic refactor where an enormous class just had to be broken down and simplified. At least we had good tests around it. The crucial insight here was to convince my programming partner that the changes together would result in a complete change. To start with he was daunted by the scale of the task with its three hundred line functions and enormous switch statements. Kent's Power Point slide for Stepping Stones showed the start of a way across a river. The important point is that you can reach the opposite bank.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Simplification&lt;/b&gt; change came when we wanted to write an update screen for all the configuration data involved in the process. We had editable data grids, but didn't have an easy way of maintaining parent-child links across newly inserted data rows. But we realised that just changing text values would be helpful - not letting the user add rows or affect relationships, just literally letting them change USD to U.S.Dollars. We made that change, stopped, agreed that it was worthy of being released.&lt;br /&gt;&lt;br /&gt;Was this &lt;b&gt;Responsive Design&lt;/b&gt;? For me, the changes felt like the kinds of refactor I've been doing for ages. It's helpful to think of them in the four forms, because each form suggests its own way of reassuring doubters. Perhaps it would have felt like Design if the system was larger, and therefore a "similarity at different levels" argument means that these are helpful, if small, examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1227718251596831597?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1227718251596831597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1227718251596831597'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/05/responsive-design-examples.html' title='Responsive Design Examples'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JQSe5r0tmqs/S-PMDdzFCUI/AAAAAAAAACI/Kox3w8mFRds/s72-c/MoreCoupling.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1077667559985530859</id><published>2010-04-24T14:10:00.002+01:00</published><updated>2010-04-24T14:19:08.355+01:00</updated><title type='text'>Languages: The Good Parts</title><content type='html'>"Most programming languages contain good and bad parts. I discovered that I could be a better programmers by using only the good parts and avoiding the bad parts."&lt;br /&gt;Douglas Crockford, &lt;span style="font-style:italic;"&gt;Javascript: The Good Parts&lt;/span&gt;, p1&lt;br /&gt;&lt;br /&gt;"Take an existing programming language and make significant improvements to it by making no changes except to exclude the low-value features."&lt;br /&gt;&lt;i&gt;Ibid&lt;/i&gt; p.99&lt;br /&gt;&lt;br /&gt;So what do I leave out?&lt;br /&gt;&lt;br /&gt;In &lt;b&gt;C#&lt;/b&gt; I use public a lot, private a bit, internal almost never.&lt;br /&gt;In &lt;b&gt;Excel&lt;/b&gt; magic numbers, multi-level formulae&lt;br /&gt;&lt;br /&gt;That's probably why I took to jQuery - the Write Less Do More mindset.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1077667559985530859?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1077667559985530859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1077667559985530859'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/04/languages-good-parts.html' title='Languages: The Good Parts'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3485459947225200747</id><published>2010-04-16T15:03:00.005+01:00</published><updated>2010-04-16T15:38:54.305+01:00</updated><title type='text'>Nobody Likes Plastic Flowers</title><content type='html'>I'm telling all my friends to read &lt;a href="http://37signals.com/rework/"&gt;Rework&lt;/a&gt; by Jason Fried and David Heinemeier Hansson of 37signals. They have a great mindset on how to start and run a small company, IT or not. And it's a Twitter style of book, concentrating hard on being pithy. The last-but-one draft of the book was 57,000 words, and they cut 30,000 of those. Nice one.&lt;br /&gt;&lt;br /&gt;My favourite dicta:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Why grow?&lt;/li&gt;&lt;li&gt;Enough with "entrepreneurs"&lt;/li&gt;&lt;li&gt;Ignore the details early on&lt;/li&gt;&lt;li&gt;Throw less at the problem&lt;/li&gt;&lt;li&gt;Meetings are toxic&lt;/li&gt;&lt;li&gt;Good enough is fine&lt;/li&gt;&lt;li&gt;Underdo your competition&lt;/li&gt;&lt;li&gt;Say no by default&lt;/li&gt;&lt;li&gt;Out-teach your competition&lt;/li&gt;&lt;li&gt;Nobody likes plastic flowers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Perhaps that last one needs an explanation? People accept the imperfections of a fresh flower, even that it will decay. So why bother aiming to sound perfectly "professional"? Be yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3485459947225200747?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3485459947225200747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3485459947225200747'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/04/nobody-likes-plastic-flowers.html' title='Nobody Likes Plastic Flowers'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6112515311220588903</id><published>2010-04-16T14:00:00.008+01:00</published><updated>2010-04-16T15:40:51.643+01:00</updated><title type='text'>36 Heroes</title><content type='html'>I just finished &lt;a href="http://37signals.com/rework/"&gt;Rework&lt;/a&gt; by Jason Fried and David Heinemeier Hansson of 37signals. An excellent read.&lt;br /&gt;&lt;br /&gt;The last page is a "list of some of the people we know, and don't know, who have inspired us in one way or another." Nice to see heroes of mine like Kent and Dieter. Makes me want to find out more about Marc and Judith.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Frank Lloyd Wright&lt;/td&gt;&lt;td&gt;Seth Godin&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Warren Buffett&lt;/td&gt;&lt;td&gt;Jamie Larson&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Clayton Christensen&lt;/td&gt;&lt;td&gt;Ralph Nader&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jim Coudal&lt;/td&gt;&lt;td&gt;Benjamin Franklin&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ernest Kim&lt;/td&gt;&lt;td&gt;Jeff Bezos&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scott Heiferman&lt;/td&gt;&lt;td&gt;Antoni Gaudi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Carlos Segura&lt;/td&gt;&lt;td&gt;Larry David&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Steve Jobs&lt;/td&gt;&lt;td&gt;Dean Kamen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bill Maher&lt;/td&gt;&lt;td&gt;Thomas Jefferson&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mies van der Rohe&lt;/td&gt;&lt;td&gt;Ricardo Semler&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Christopher Alexander&lt;/td&gt;&lt;td&gt;James Dyson&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kent Beck&lt;/td&gt;&lt;td&gt;Thomas Paine&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gerald Weinberg&lt;/td&gt;&lt;td&gt;Kathy Sierra&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Julia Child&lt;/td&gt;&lt;td&gt;Marc Hedlund&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Nicholas Karavites&lt;/td&gt;&lt;td&gt;Michael Jordan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Richard Bird&lt;/td&gt;&lt;td&gt;Jeffrey Zeldman&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dieter Rams&lt;/td&gt;&lt;td&gt;Judith Sheindlin&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ron Paul&lt;/td&gt;&lt;td&gt;Timothy Ferriss&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6112515311220588903?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6112515311220588903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6112515311220588903'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/04/36-heroes.html' title='36 Heroes'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3460209081198989087</id><published>2010-03-19T13:07:00.004Z</published><updated>2010-03-19T13:49:28.359Z</updated><title type='text'>Gothenburg SDC 2010</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Diana Larsen&lt;/span&gt; &lt;br /&gt;Management by wishful thinking&lt;br /&gt;Too often, managers either abdicate or clamp down&lt;br /&gt;Five tracker skills, inspired by Gervase Bushe:&lt;br /&gt;1) How would it look if you were a different person, with a different skill or perspective?&lt;br /&gt;2) Look at the “dead zones”, the areas you usually ignore because they’re not the significant / important / dynamic parts. What’s there? &lt;br /&gt;3) Balance your inputs. If you get most of your knowledge in certain ways, use some 40 methods that others use. &lt;br /&gt;4) Learn the patterns you wish to see. Take the part you like most / are proudest of, and break that down into constituent parts. &lt;br /&gt;5) Reduce one’s disturbance, increase one’s awareness. As bosses, we may be told what people think we want to hear. Try to get to unvarnished, unfiltered truths. &lt;br /&gt;"Employees can't change if their leaders don't" McKinsey Quarterly November 2008&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Rik Arends&lt;/span&gt;&lt;br /&gt;Mentioned Etherpad, which Google have swallowed up, and &lt;a href="https://mozillalabs.com/bespin/"&gt;Bespin&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Nathaniel Schutta&lt;/span&gt;&lt;br /&gt;Principle of Least Surprise - the JQuery ordering of function arguments sometimes fails here&lt;br /&gt;Look at the Ext grid &lt;a href="http://www.extjs.com/products/js/"&gt;http://www.extjs.com/products/js/&lt;/a&gt;&lt;br /&gt;Jeremy Keith on &lt;a href="http://www.alistapart.com/articles/behavioralseparation"&gt;Behavioral Separation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Thomas Lundstr&amp;ouml;m&lt;/span&gt;&lt;br /&gt;Behaviour Driven Design demo of Cucumber and Webrat.&lt;br /&gt;"Lots of crooks and nannies"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Brian Marick&lt;/span&gt;&lt;br /&gt;Likening an Agile Team to a Monastery - not the cut off aspect&lt;br /&gt;Unremarked Agile Values : naivete, ease, technical skill, reactive, decency, being wrong, joy, working software&lt;br /&gt;The &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;Manifesto for Software Craftsmanship&lt;/a&gt;&lt;br /&gt;If you ignore the future, you get good at change. So yes, don't build tomorrow's request even if you're certain that you'll be asked for it.&lt;br /&gt;Work with ease - that's the first step&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Kent Beck&lt;/span&gt;&lt;br /&gt;The effect of accelerating releases from Annual to Quarterly to Monthly to Weekly to Daily to Hourly&lt;br /&gt;Getting an organisation to stop doing something is even harder than getting it to start &lt;br /&gt;Change "we can't do X because of Y" to "if we did X we'd have to do Z"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Other Observations&lt;/span&gt;&lt;br /&gt;Bl&amp;aring;b&amp;auml;rspaj has the three versions of a, and tastes nice too&lt;br /&gt;The &lt;a href="http://www.alltidgot.com/?p=172"&gt;triangular tower blocks&lt;/a&gt; of Kortedala should be more famous, especially in Kortedala&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3460209081198989087?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3460209081198989087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3460209081198989087'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/03/gothenburg-sdc-2010.html' title='Gothenburg SDC 2010'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-5235275067980614807</id><published>2010-03-08T14:12:00.008Z</published><updated>2011-04-16T08:58:25.707+01:00</updated><title type='text'>Flashy or Anonymous</title><content type='html'>"The students should be trained to work in teams - also with students of related techniques - in order to learn methods of collaboration with others. [...] The nature of teamwork will lead the students to good 'anonymous' architecture rather than to flashy 'stunt' design."&lt;br /&gt;&lt;br /&gt;Walter Gropius, &lt;span style="font-style:italic;"&gt;The Search for a Better Architectural Education&lt;/span&gt;, 7th CIAM Congress, 1949&lt;br /&gt;&lt;br /&gt;I know what he means about flashy 'stunt' design in programming. Interesting that the alternative is 'anonymous'. If it's good, maybe that's what you see. Perfect code, without the maker's hand visible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-5235275067980614807?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5235275067980614807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5235275067980614807'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/03/flashy-or-anonymous.html' title='Flashy or Anonymous'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7408621420279445138</id><published>2010-02-23T10:07:00.003Z</published><updated>2010-02-23T10:16:11.854Z</updated><title type='text'>On The Learning Curve</title><content type='html'>I started a new project with a colleague. We decided we weren't scared of new technologies so we would use the best thing we'd heard of for any given job. Off we went.&lt;br /&gt;&lt;br /&gt;He'd been using &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; and told me that it was neat. I wanted to share code smoothly so we used &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt; which I cleverly got him to set up. We were drawing pretty graphs, so I used &lt;a href="http://excanvas.sourceforge.net/"&gt;ExCanvas&lt;/a&gt; until someone told me about &lt;a href="http://raphaeljs.com/"&gt;Raphael&lt;/a&gt;. Thankfully the port of my code only took an hour. Our raw data is often XML, so we opted for &lt;a href="http://msdn.microsoft.com/en-us/library/bb387098.aspx"&gt;LINQ&lt;/a&gt; and then map data came as &lt;a href="http://bbs.keyhole.com/ubb/ubbthreads.php?ubb=showthreaded&amp;Number=332073"&gt;KML&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's all gone well. Is this the way the future's meant to be? When can I rest on my C Programmer laurels?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7408621420279445138?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7408621420279445138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7408621420279445138'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/02/on-learning-curve.html' title='On The Learning Curve'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-4173589103797578613</id><published>2010-01-15T15:00:00.005Z</published><updated>2010-01-15T15:19:10.466Z</updated><title type='text'>Optimal Optimisation</title><content type='html'>I don't write optimised code. Generally speaking, the computer is fast enough that worrying about how often I create a new string object is absurd. Code readability and extensibility is what matters to me.&lt;br /&gt;&lt;br /&gt;Every so often, I have a process I want to speed up. So it was in looking at the Flipping Coins problem : &lt;a href="http://cplus.about.com/od/programmingchallenges/a/challenge31.htm"&gt;http://cplus.about.com/od/programmingchallenges/a/challenge31.htm&lt;/a&gt;. I had a brute force method that was taking 30 seconds to solve a five by five grid, and a lot longer to decide there was no solution.&lt;br /&gt;&lt;br /&gt;I'm accustomed to colleagues saying they can speed code up by looking for inefficiencies at the code level. Pre-allocate the storage of a StringBuilder class they say, that sort of thing. I'm always saying that we can have a greater effect on by writing a better algorithm - doing the same thing in fewer steps.&lt;br /&gt;&lt;br /&gt;So I decided to test my position. I could see that I could make the brute force more efficient by using recursion - I would create fewer objects on the way to finding the solution. So I implemented that, creating code that was very clever and therefore very difficult to read. Result : five times speed increase.&lt;br /&gt;&lt;br /&gt;Then I thought hard about how to solve these problems, came up with a new technique. Coding that was easy - none of this tricky recursion. Speed improvement : more than a thousand times faster than the 'optimised' recursive version, five thousand times faster than the brute force version.&lt;br /&gt;&lt;br /&gt;I'm convinced!&lt;br /&gt;&lt;br /&gt;Brute force method : 30 seconds&lt;br /&gt;Some code optimisation : 6 seconds&lt;br /&gt;Algorithmic change : 1/200 of a second&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JQSe5r0tmqs/S1CHHBXeuYI/AAAAAAAAAAs/frckNpm9YRA/s1600-h/CoinFlip.PNG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 181px;" src="http://1.bp.blogspot.com/_JQSe5r0tmqs/S1CHHBXeuYI/AAAAAAAAAAs/frckNpm9YRA/s320/CoinFlip.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5426986105677199746" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-4173589103797578613?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4173589103797578613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4173589103797578613'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2010/01/optimal-optimisation.html' title='Optimal Optimisation'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JQSe5r0tmqs/S1CHHBXeuYI/AAAAAAAAAAs/frckNpm9YRA/s72-c/CoinFlip.PNG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3853818049255646252</id><published>2009-11-23T12:09:00.002Z</published><updated>2009-11-23T12:15:44.761Z</updated><title type='text'>You Assume, I Bet</title><content type='html'>"That will work," he said. "How do you know?" I said. "I assume it will," he said.&lt;br /&gt;&lt;br /&gt;I'm all in favour of intuition. But in Agile programming, I find that the feedback loop when intuition fails is not sharp enough. When my assuming colleague is wrong, he doesn't feel enough pain and goes on to assume another day.&lt;br /&gt;&lt;br /&gt;In future, I will require a monetisation of his confidence. Instead of "I assume it will" I will get him to say "I bet it will" followed by the question "how much?" Is this a five pence level of confidence or a five pound one?&lt;br /&gt;&lt;br /&gt;It'll be interesting to see how this pans out. Either he's very good and he wins all the bets. Or I have a get-rich-quick scheme. Or he learns to question his assumptions regularly. Any of these results will be good. Or so I'd assume.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3853818049255646252?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3853818049255646252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3853818049255646252'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/11/you-assume-i-bet.html' title='You Assume, I Bet'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-8761695933845840667</id><published>2009-10-16T12:38:00.001+01:00</published><updated>2009-10-16T12:40:25.434+01:00</updated><title type='text'>Blues and Yellows</title><content type='html'>My agile insight of the week came yesterday. My colleagues Ben and Dylan had done a release a couple of weeks ago, then both went on holiday. We had a flipchart covered with blue sticky notes of features. We started moving the done features to one side, and added new features that were requested. It so happened that we used yellow sticky notes for the new things. We then put the tasks to be done next at the top of the chart, with the rest at the bottom. The seven tasks we selected to do were all written on yellow stickies. All of the blue ideas, which seemed relevant a month ago, were no longer important. We checked with the project sponsor and he agreed the priorities. A nice visual proof of why "responding to change" is to be preferred over "following a plan" (&lt;a href="http://agilemanifesto.org/"&gt;agilemanifesto.org/&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-8761695933845840667?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8761695933845840667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8761695933845840667'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/10/blues-and-yellows.html' title='Blues and Yellows'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3022132573959254421</id><published>2009-09-16T14:34:00.001+01:00</published><updated>2009-09-16T14:37:03.695+01:00</updated><title type='text'>How do you say pensées in Danish?</title><content type='html'>In order truly to help someone else, I must understand more than he - but certainly first and foremost understand what he understands.&lt;br /&gt;&lt;br /&gt;All true helping starts with a humbling.&lt;br /&gt;&lt;cite&gt;Chapter 1 A : SS2&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Compel a person to an opinion ... that I cannot do. But one thing I can do: I can compel him to become aware.&lt;br /&gt;&lt;cite&gt;Chapter 1 A : SS4&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;I am regarded as a kind of Englishman, a half-mad eccentric, with whom we jolly well all, society people and street urchins, think to have their fun.&lt;br /&gt;&lt;cite&gt;Pap IX A 288&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;The Point of View for my Work as an Author 1851&lt;br /&gt;S&amp;oslash;ren Kierkegaard&lt;br /&gt;(Volume XXII of Kierkegaard's Writings)&lt;br /&gt;Translated by Howard V. Hong and Edna H. Hong&lt;br /&gt;Princeton 1998&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3022132573959254421?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3022132573959254421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3022132573959254421'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/09/how-do-you-say-pens-in-danish.html' title='How do you say pens&amp;eacute;es in Danish?'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6157570385803972660</id><published>2009-09-08T17:51:00.002+01:00</published><updated>2009-09-08T18:05:48.795+01:00</updated><title type='text'>How To Fail With Agile</title><content type='html'>Here are the twenty guidelines from &lt;b&gt;How To Fail With Agile: Twenty Tips to Help You Avoid Success&lt;/b&gt;, an article by &lt;a href="http://www.agilegamedevelopment.com/2008/08/article-how-to-fail-with-agile.html"&gt;Clinton Keith&lt;/a&gt; and &lt;a href="http://www.mountaingoatsoftware.com/articles/40-how-to-fail-with-agile"&gt;Mike Cohn&lt;/a&gt; in Better Software Magazine, August 2009. I copied the text from an &lt;a href="http://projectmgr.net/blog/?p=103"&gt;HTML Version&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I like to use these in the retrospective of a successful project. If it all went well, how did we avoid doing these things?&lt;br /&gt;&lt;br /&gt;1-5 are Management Issues, 6-8 are Team Issues, 10-13 are Product Owner Issues, and 14-20 are Process Issues.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Don’t trust the team or agile. Micromanage both your team members and the process.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If agile isn’t a silver bullet,blame agile.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Equate self-managing with self-leading and provide no direction to the team whatsoever.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ignore the agile practices. They don’t apply to management.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Undermine the team’s belief in agile.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Continually fail to deliver what you committed to deliver during iteration planning.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cavalierly move work forward from one iteration to the next. It’s good to keep the product owner guessing about what will be delivered.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do not create cross-functional teams. Put all the testers on one team, all the programmers on another, and so on.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Large projects need large teams. Ignore studies that show productivity decreases with large teams due to increased communication overhead. Since everyone needs to know everything, invite all fifty people to the daily standup.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don’t communicate a vision for the product to the team or to the other stakeholders.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don’t pay attention to the progress of each iteration and objectively evaluate the value of that progress.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Replace a plan document with a plan "in your head" that only you know.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Have one person share the roles of ScrumMaster (agile coach) and product owner. In fact, have this person also be an individual contributor on the team.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Start customizing an agile process before you’ve done it by the book.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Drop and customize important agile practices before fully understanding them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slavishly follow agile practices without understanding their underlying principles.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don’t continually improve.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don’t change the technical practices.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rather than align pay, incentives, job titles, promotions, and recognition with agile, create incentives for individuals to undermine teamwork and shared responsibility.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Convince yourself that you’ll be able to do all requested work, so the order of your work doesn’t matter.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6157570385803972660?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6157570385803972660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6157570385803972660'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/09/how-to-fail-with-agile.html' title='How To Fail With Agile'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3541792781158340641</id><published>2009-09-01T01:50:00.002+01:00</published><updated>2009-09-16T14:39:35.601+01:00</updated><title type='text'>Pairing as the Junior Partner</title><content type='html'>Agile 2009 Conference in Chicago. The Live Aid effort developed an iPhone application to let donors give to the Mano A Mano effort supporting communities in Bolivia. I spent a couple of afternoons helping out.&lt;br /&gt;&lt;br /&gt;I knew nothing of the domain, infrastructure or programming languages. It was all being done on Mac Book Pro laptops, so I couldn’t even get a scroll bar to work in Firefox. That’s how useless I was.&lt;br /&gt;&lt;br /&gt;Except that no pairing partner is useless. Here’s what I contributed:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Syntax and spell checking as my colleague typed&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fluency in HTML when we were modifying web pages&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Discussing the value to be gained from making the pages fully XHTML compliant&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Guessing how to enter a bank account number into Pay Pal when it refused my pair’s efforts&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Helping a new colleague get starting by just knowing a little of the directory structure&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reminding my pair that the first step was a failing test, not a pretty, well-written or comprehensive test&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Congratulating my pair when he got that test to go from red to green&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Noticing a precedent in a Cucumber test for how to echo the HTML to the console&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Writing down the test cases so my pair could start working through them&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Seeking targeted guidance from the Ruby and Rails experts on the team&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Speaking up at the stand-ups&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I think I did enough. I’m certainly grateful to a partner who fills in those gaps when it’s me who’s meant to know what to do.&lt;br /&gt;&lt;br /&gt;Please visit (by iPhone or browser) &lt;a href="http://www.manoamano.org"&gt;www.manoamano.org&lt;/a&gt; to see what we did, with your credit card at the ready. And a big thanks to all of the team for letting me help out, with a particular mention to Dwight Illk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3541792781158340641?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3541792781158340641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3541792781158340641'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/09/pairing-as-junior-partner.html' title='Pairing as the Junior Partner'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3497831653134418697</id><published>2009-07-29T06:49:00.004+01:00</published><updated>2009-07-31T16:53:31.278+01:00</updated><title type='text'>And then there's the 5% of the time</title><content type='html'>&lt;a href="http://www.codinghorror.com/blog/archives/001079.html"&gt;The First Rule of Programming: It's Always Your Fault&lt;/a&gt; is right. If something's awry look at your code rather than blame Microsoft etc. If that doesn't work, look at your code again. Repeat until you notice the semi-colon on the end of your while() statement.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;In one week I had a doozy of an exception. We had code which put values into an Excel spreadsheet, copied a graph into the clipboard and pasted into a Word Content Control. It worked. It worked. It failed.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;We found that certain combinations of data, together with certain blobbiness of a dotted error line on the graph would cause a problem with our pasting code which we could not reproduce by ctrl-c ctrl-v in the applications. We changed the error line to a solid line and haven't seen it fail. But is it fixed? Who knows for sure?&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;If the problem lies in some other bit of code that you don't control, you'll not only have learned essential troubleshooting and diagnostic skills, you'll also have an audit trail of evidence to back up your claims, too.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;That's true. We did learn something about isolating a problem within the Office applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3497831653134418697?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3497831653134418697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3497831653134418697'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/07/and-then-theres-5-of-time.html' title='And then there&apos;s the 5% of the time'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-3827549070394000388</id><published>2009-06-28T17:34:00.002+01:00</published><updated>2009-06-28T17:40:06.815+01:00</updated><title type='text'>Exploratory Testing</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Scenario One&lt;/span&gt; I'm rewriting an ASP website into ASP.Net. It's going well. I can now run the two systems side by side, seeing what is different and what's the same. Over a finite site that seems just as good a test as having a specification.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario Two&lt;/span&gt; On snother website I was asked to add a confirmation email when a new user registers. I've noticed a lot of errors on this page. My first guess was that this public page is falling prey to web crawlers. After all, my exploratory testing didn't make it fail. But I was wrong. Checking logs yesterday I found that the error was the confirmation email - a badly formed email address (why do users do this?) and it was throwing an error. It's fixed now.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt; Exploring means opening your mind to come up with likely scenarios. Get it right, and its an effective use of time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-3827549070394000388?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3827549070394000388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/3827549070394000388'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/06/exploratory-testing.html' title='Exploratory Testing'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6217358291960278679</id><published>2009-04-04T10:07:00.002+01:00</published><updated>2009-04-04T10:14:57.826+01:00</updated><title type='text'>Queasing and Pairgramming</title><content type='html'>I believe the Financial Times coined 'Queasing' as a shortened form for Quantitive Easing, the economic plan of the month. My breakthrough practice of the month has been applying Queasing to Pair Programming, by introducing a second keyboard and mouse.&lt;br /&gt;&lt;br /&gt;My colleague Ben and I were stuck at the "Storming" phase - we were not getting on well. Memorably, when the customer asked what Ben thought of my code, he said nothing at all. A couple of hours later he managed "I've seen worse." Pair programming had been a miserable experience for both of us. He didn't like programming with "someone looking over my shoulder."&lt;br /&gt;&lt;br /&gt;One day at the customer site, with a second screen plugged into the back of the laptop, I added a keyboard and mouse. Now we had dual control - no more asking to use the keyboard. He had to use the laptop trackpad, but he was up to that challenge.&lt;br /&gt;&lt;br /&gt;The day went much better.&lt;br /&gt;&lt;br /&gt;Since then, we've tried it back at our office with two full keyboards and mice. It is an improvement. So Quantitive Easing can help with Pair Programming. Or should that be Queasing helps Pairgramming?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6217358291960278679?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6217358291960278679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6217358291960278679'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/04/queasing-and-pairgramming.html' title='Queasing and Pairgramming'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1087962402065696800</id><published>2009-03-01T12:42:00.003Z</published><updated>2009-03-01T12:49:19.673Z</updated><title type='text'>Four Lines of Code in an Afternoon</title><content type='html'>The other day, my pair and I managed four lines of code in a whole afternoon. But they were the right lines of code, so we were very happy.&lt;br /&gt;&lt;br /&gt;We wanted to add charts to an application creating MS Word Documents. We knew a little bit about automating Excel and updating Word's Content Controls. The four lines were&lt;br /&gt;&lt;ol&gt;&lt;li&gt;set the source cells for an Excel chart&lt;/li&gt;&lt;li&gt;copy the chart to the clipboard&lt;/li&gt;&lt;li&gt;select a content control in Word&lt;/li&gt;&lt;li&gt;paste from the clipboard&lt;/li&gt;&lt;/ol&gt;No reinvention of any wheels. The end user will be able to edit the look of the graphs as a template in Excel, or as the end result in Word. All graph types supported.&lt;br /&gt;&lt;br /&gt;Agile is the art of maximizing work not done, so that was a good afternoon's work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1087962402065696800?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1087962402065696800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1087962402065696800'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/03/four-lines-of-code-in-afternoon.html' title='Four Lines of Code in an Afternoon'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7303184387433675112</id><published>2009-01-31T11:53:00.002Z</published><updated>2009-01-31T12:02:25.470Z</updated><title type='text'>My Seven Wastefulness</title><content type='html'>I'm reading Mary and Tom Poppendieck's &lt;i&gt;Implementing Lean Software Development&lt;/i&gt;, which I recommend highly.&lt;br /&gt;&lt;br /&gt;Confession time : here's how my development process on my landlords' website looks in terms of the Seven Wastes (p.74)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Partially Done Work&lt;/b&gt; is pretty good. I tend to select modifications that can be done fully in the session I have available.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Extra Features&lt;/b&gt; is good, because I am harsh about what I will add. After all, it's free software.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Relearning&lt;/b&gt; is problematic. I have to remind myself all sorts of things about MySql and the website database layer each time I work on it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Handoffs&lt;/b&gt; is not a problem, because I don't hand off the work to anyone.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Task Switching&lt;/b&gt; is good when I'm working on a feature.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Delays&lt;/b&gt; is of course a problem. When exactly will I address that particular issue? Today? This week?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Defects&lt;/b&gt; is a challenge, because of the distance between me and the users and because some problems are related to the loading on the server. Some user somewhere has a quote key that breaks my SQL insert statement. What can I do about that?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7303184387433675112?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7303184387433675112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7303184387433675112'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2009/01/my-seven-wastefulness.html' title='My Seven Wastefulness'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7294102474997575781</id><published>2008-12-11T13:51:00.004Z</published><updated>2008-12-11T13:57:06.146Z</updated><title type='text'>Yagni and Wisdom</title><content type='html'>I ran an Open Space session entitled &lt;strong&gt;YAGNI and Wisdom&lt;/strong&gt; at the XP Day Conference &lt;a href="http://www.xpday.org"&gt;www.xpday.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this session I wanted to explore what happens when a strong You Arent't Gonna Need It (YAGNI) attitude meets insufficient wisdom for the attitude to be safe.&lt;br /&gt;&lt;br /&gt;I introduced the sesssion by giving an informal experience report about how my YAGNI attitude caused some problems in a website development. Specifically, I wrote a very light database connection piece of code which turned out to be insufficient. When problems arose I spent my time providing fixes and only later found the time to rewrite enough of the database code for the site to be sufficiently robust.&lt;br /&gt;&lt;br /&gt;The audience then took over, asking me pointed questions about why I'd done what I did, what I should have done instead.&lt;br /&gt;&lt;br /&gt;On the specific subject of wisdom, we synthesised our views to the realisation that a team dynamic, when it's going well, provides that wisdom. When I suggested the aphorism "Together, we're wiser than we are individually" it was improved to &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Together, I'm less stupid&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We continued with this thought, looking at the reasons for my mistakes. For instance, we saw that I was not rational in one of the decisions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Together, I'm less crazy&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;One issue was why did I not roll back a change when it started failing. Others observed that that it was a financial decision or that it may have seemed just as hard to go back as go forward. I then admitted that it was probably my ego that stopped me retreating - I was going to fix this! Others recalled times where their teams had stopped that happening.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Together, I'm less egotistical&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So thanks to Paul, Jason, Pete, Dolan, Ben and the others whose badges I couldn't read.&lt;br /&gt;&lt;br /&gt;Jonathan Clarke&lt;br /&gt;11 December 2008&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7294102474997575781?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7294102474997575781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7294102474997575781'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/12/yagni-and-wisdom.html' title='Yagni and Wisdom'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1638045742247894847</id><published>2008-09-30T22:39:00.006+01:00</published><updated>2008-10-05T09:55:34.038+01:00</updated><title type='text'>The Thoughts of Chairman Bob</title><content type='html'>If you're like me, and mainly program by epithet, then you must read &lt;i&gt;Clean Code&lt;/i&gt; by Robert C. Martin. Here are a few of his dicta.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Smart programmers are not professional programmers ... clarity is king (p. 25)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The first rule of functions is that they should be small. The second rule of functions is that &lt;i&gt;they should be smaller than that&lt;/i&gt;. (p. 34)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Communication is the professional developer's first order of business (p. 76)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Serious thought needs to be put into the best way to represent the data that an object contains. The worst option os to blithely add getters and setters. (p. 95)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1638045742247894847?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1638045742247894847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1638045742247894847'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/09/thoughts-of-chairman-bob.html' title='The Thoughts of Chairman Bob'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-1971080965825372646</id><published>2008-07-30T13:19:00.003+01:00</published><updated>2008-08-04T14:45:28.803+01:00</updated><title type='text'>Yes, we have no XP practices</title><content type='html'>I joined a team to help them get from a death march project to a demonstrable product. Not being asked to be an XP coach, I’ve been interested to see which XP practices find their way into a team, which are already in place and which are resisted.&lt;br /&gt;&lt;br /&gt;Pair Programming : we do some, we enjoy it when we do because we learn so much. We just don’t think it’s necessary for most of the time. That’s the collective “we” – I’d want to use it much more.&lt;br /&gt;&lt;br /&gt;Collective Code Ownership : give it time. Currently most of the code “belongs” to P-J (who left months before I arrived) or Nick (who left a week after I started).&lt;br /&gt;&lt;br /&gt;Coding Standards : I’m the problem here, because I can’t see the reason for some of the standards used. Blank line between every line of code? A variable of MyCleverDerivedClass is usually myCleverDerivedClass which makes typing much slower. Is it an XP practice to sneak in new conventions to new code, hoping they gain traction over time? I don’t see why not.&lt;br /&gt;&lt;br /&gt;Refactoring : I never do this mercilessly, so the issue is whether we do it at all. Yes, some. But I have had a programmer argue that taking out some code from a big class to a small helper class is making it more complicated. I wonder if he’s changing his view.&lt;br /&gt;&lt;br /&gt;Automated Testing : not enough, never enough. I use test-driven development for new code, but I haven’t written the coding structures to make the tests either fast or reliable. There’s plenty of testing effort, mainly comparing the new system with the one it’s replacing. Is that a valid alternative?&lt;br /&gt;&lt;br /&gt;On-site Customer : pretty good, because the company both use the system and sell it to others to use. So there are team members who really know what it does and have a benchmark in the old system. I’m happy with this; I wonder if the other programmers are.&lt;br /&gt;&lt;br /&gt;Short Iterations : pretty good, again, because we want to support the on-site customer in their work and their testing.&lt;br /&gt;&lt;br /&gt;Planning Game : didn’t happen in my time - I arrived to a project with defined tasks. However there’s been some low-level action on this, encouraging people to think outside the bug list, consider the value involved in different changes and so on.&lt;br /&gt;&lt;br /&gt;Continuous Integration : if God didn’t want us to do this, he wouldn’t have given us Subversion. Admittedly, no-one knows how to add me to the list of people who get the build-broken automatic email. But we’re all checking out the code regularly, so I hear soon enough.&lt;br /&gt;&lt;br /&gt;Metaphor : no we don’t – do you? I tried once, but everyone insisted that LongClassNameExplainingWhatItsDerivedFrom is a good practice. In protest I’ve started calling a colleague “Secundus” because that’s a more descriptive name than “Sam”. &lt;br /&gt;&lt;br /&gt;Simple Design : not a lot. Too many programmers love complexity, and telling them “you’re not going to need it” gets a response ending in “off”. The only place I’m winning is over next-release features to help with the sales process. There isn’t time to program these “properly” so I’m being allowed to do a quick simple design and then see what emerges.&lt;br /&gt;&lt;br /&gt;Forty-hour Week : in place, widely observed. Well, this is the old style City of London.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-1971080965825372646?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1971080965825372646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/1971080965825372646'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/07/marks-out-of-twelve.html' title='Yes, we have no XP practices'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6636779248079709830</id><published>2008-06-30T17:55:00.002+01:00</published><updated>2008-07-08T20:46:44.979+01:00</updated><title type='text'>All Philosophy, No Practices</title><content type='html'>In my current project, I'm talking up the XP Philosophy without being able to follow any of the XP Practices. This is how it's working out.&lt;br /&gt;&lt;br /&gt;Courage, Simplicity, Feedback and Communication.&lt;br /&gt;&lt;br /&gt;Courage was almost instantaneous. The project was veering towards a Death March. I asked the Gold Owner when he wanted it ready to show it to his customers. He said twelve weeks. All I did was to convince the team that this was a deadline worth working to – anything is better than the open-ended march. Sure, scope negotiation became a key issue for a week or two, but only that much. Everyone wants to meet that deadline, and I just “encouraged” them. The next step will be to get the Gold Owner to have the courage to present the product confidently to customers and be convincing about why it’s worth the money. That’s for next month.&lt;br /&gt;&lt;br /&gt;“You are a good programmer, but you never listen” said a colleague to me. Notice that I did hear what he said, so I can’t be quite as bad as all that. But communication is an issue; a team gets into a way of communicating, and whether it’s good or bad they stick with it. I don’t. For me it’s all about face-to-face little chats, as often as possible, in a setting that’s most likely to get a shared conclusion. So the team used the internal phone system, but I use the stairs. The team used a bug tracking system, I scribble on flip charts. I’m not saying that my way is better; but if the entrenched methods aren’t working then communicate in the simplest way, which is just a matter of strolling over to a colleague’s desk, smile, ask for a few minutes of time, and then take no more than that. Smile again, say thank you, you’re done.&lt;br /&gt;&lt;br /&gt;Simplicity? We have a database layer written using interfaces to allow a new database storage method “later”. We have a naming convention so Product.Business is two things – a project in it’s own right and a sub-directory within the Product project. We have spectacularly “generalised” code for data import which I can’t get to import anything. It all works, but simple it ain’t. However, I’m seeing a few changes. My first fight with a team like this is about not using the debugger. My second fight is wanting to run the code through NUnit. I’m delighted to see that one of the programmers has noticed how much time he saves by doing this, that it is simpler and quicker to work in this way. The current challenge is about new features. One colleague wants to add an Excel API, another wants to rewrite the reporting protocol. Both would take weeks. I’m pushing them towards a simple interface with a spreadsheet, a step-by-step improvement of the reporting. We’ll see whether banning the complex (which I have) makes them find a simpler path.&lt;br /&gt;&lt;br /&gt;Writing this makes me realise that Feedback is the challenge. Downstairs from the programmers are the testers. They find an issue and log it in the bug tracking system. The programmers feel they don’t have enough detail. The testers feel the bug shouldn’t have occurred in the first place. The feedback loop is all wrong. We’ll have to fix that. I could work on making the automated tests more helpful – they’re broken in all the usual ways. But the simpler thing is probably to become a one-man feedback mechanism, spending my time running the code, automating where possible but not worrying when I can’t.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6636779248079709830?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6636779248079709830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6636779248079709830'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/06/all-philosophy-no-practices.html' title='All Philosophy, No Practices'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6227846753499607493</id><published>2008-05-20T09:43:00.003+01:00</published><updated>2008-05-20T09:48:32.357+01:00</updated><title type='text'>Gamma Marx Maciavelli Fowler</title><content type='html'>Q: What links Erich Gamma, Karl Marx, Niccolo Machiavelli and Martin Fowler?&lt;br /&gt;&lt;br /&gt;A: Amazon.com's top 10 books classified as Books &amp;gt; Nonfiction &amp;gt; Foreign Language Nonfiction &amp;gt; French&lt;br /&gt;&lt;br /&gt;On 20 May 2008, Gamma and the Gang of Four are in at number 1, Marx and Engels at number 2 for &lt;i&gt;The Communist Manifesto&lt;/i&gt;, Machiavelli gets into the top 5 with &lt;i&gt;The Prince&lt;/i&gt; and Fowler's &lt;i&gt;Refactoring&lt;/i&gt; is at number 7.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/bestsellers/books/16261001/ref=pd_zg_hrsr_b_2_4_last"&gt;Check top 10 today&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Vahid M and Chris B for generating the kind of conversation that leads to finding this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6227846753499607493?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6227846753499607493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6227846753499607493'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/05/gamma-marx-maciavelli-fowler.html' title='Gamma Marx Maciavelli Fowler'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-242556735551689093</id><published>2008-05-09T23:19:00.003+01:00</published><updated>2008-05-09T23:29:19.266+01:00</updated><title type='text'>Just enough to test a Windows UI</title><content type='html'>Here's just enough code to test a Windows Form. Put this in a Class Library project called Tests which references the DLL or EXE with the form in. The Tests project will need to reference System.Windows.Forms.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;using Dunwoody;&lt;br /&gt;using NUnit.Framework;&lt;br /&gt;&lt;br /&gt;namespace Tests&lt;br /&gt;{&lt;br /&gt;    [TestFixture]&lt;br /&gt;    public class UITests&lt;br /&gt;    {&lt;br /&gt;        Form1 m_f;&lt;br /&gt;        [SetUp]&lt;br /&gt;        public void SetUp()&lt;br /&gt;        {&lt;br /&gt;            m_f = new Form1();&lt;br /&gt;            m_f.Show();&lt;br /&gt;        }&lt;br /&gt;        [TearDown]&lt;br /&gt;        public void TearDown()&lt;br /&gt;        {&lt;br /&gt;            m_f.Dispose();&lt;br /&gt;            m_f = null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void RequiredWidgets()&lt;br /&gt;        {&lt;br /&gt;            Assert.AreEqual( "", HasWidgets(new string[] { &lt;br /&gt;                "button1", "textbox1" &lt;br /&gt;            }));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private string HasWidgets(string[] ctrlnames )&lt;br /&gt;        {&lt;br /&gt;            StringBuilder result = new StringBuilder();&lt;br /&gt;            foreach (string ctrlname in ctrlnames)&lt;br /&gt;            {&lt;br /&gt;                if (GetControl(ctrlname) == null)&lt;br /&gt;                    result.Append(ctrlname + " ");&lt;br /&gt;            }&lt;br /&gt;            return result.ToString().Trim();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void HasButton()&lt;br /&gt;        {&lt;br /&gt;            Button b = GetButton( "button1" );&lt;br /&gt;            Assert.IsNotNull(b);&lt;br /&gt;        }&lt;br /&gt;        [Test]&lt;br /&gt;        public void NoSuchButton()&lt;br /&gt;        {&lt;br /&gt;            Assert.IsNull(GetButton("x"));&lt;br /&gt;        }&lt;br /&gt;        [Test]&lt;br /&gt;        public void TextboxNotButton()&lt;br /&gt;        {&lt;br /&gt;            Assert.IsNotNull(GetControl("textbox1"));&lt;br /&gt;            Assert.IsNull(GetButton("textbox1"));&lt;br /&gt;        }&lt;br /&gt;        [Test]&lt;br /&gt;        public void HasTextbox()&lt;br /&gt;        {&lt;br /&gt;            Assert.IsNotNull(GetTextbox("textbox1"));&lt;br /&gt;        }&lt;br /&gt;        [Test]&lt;br /&gt;        public void SetTextbox()&lt;br /&gt;        {&lt;br /&gt;            string test = "Test";&lt;br /&gt;            GetTextbox("textbox1").Text = test;&lt;br /&gt;            Assert.AreEqual(test, GetTextbox("textbox1").Text);&lt;br /&gt;        }&lt;br /&gt;        [Test]&lt;br /&gt;        public void ButtonClick()&lt;br /&gt;        {&lt;br /&gt;            string test = "Test";&lt;br /&gt;            string str = GetTextbox("textbox1").Text;&lt;br /&gt;            GetTextbox("textbox1").Text = test;&lt;br /&gt;            GetButton("button1").PerformClick();&lt;br /&gt;            Assert.AreEqual("[" + test + "]", GetTextbox("textbox1").Text);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private TextBox GetTextbox(string ctrlname)&lt;br /&gt;        {&lt;br /&gt;            Control ctrl = GetControl(ctrlname);&lt;br /&gt;            if (ctrl != null)&lt;br /&gt;                return ctrl as TextBox;&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private Button GetButton(string ctrlname )&lt;br /&gt;        {&lt;br /&gt;            Control ctrl = GetControl(ctrlname);&lt;br /&gt;            if (ctrl != null)&lt;br /&gt;                return ctrl as Button;&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private Control GetControl(string ctrlname)&lt;br /&gt;        {&lt;br /&gt;            foreach (Control ctrl in m_f.Controls)&lt;br /&gt;                if (String.Compare(ctrlname.Trim(), ctrl.Name, true) == 0)&lt;br /&gt;                    return ctrl;&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-242556735551689093?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/242556735551689093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/242556735551689093'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/05/just-enough-to-test-windows-ui.html' title='Just enough to test a Windows UI'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-8141340386309516379</id><published>2008-04-25T21:16:00.006+01:00</published><updated>2008-04-29T10:46:31.461+01:00</updated><title type='text'>Only The Important Ones</title><content type='html'>Some quotations from &lt;i&gt;Extreme Programming Examined&lt;/i&gt; ed Giancarlo Succi and Michele Marchesi, Addison-Wesley 2001.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Is Design Dead&lt;/i&gt; Martin Fowler&lt;br /&gt;&lt;br /&gt;"I certainly still reach for GOF whenever I feel a pattern coming on."&lt;br /&gt;&lt;br /&gt;"Don't draw every class - only the important ones. For each class, don't show every attribute and operation - only the important ones. Don't draw sequence diagrams for all use cases and scenarios - only ... you get the picture."&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Patterns and XP&lt;/i&gt; Joshua Kerievsky&lt;br /&gt;&lt;br /&gt;Quotes GOF's concluding remarks : "Design Patterns provide targets for your refactorings."&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Learn XP : Host a Boot Camp&lt;/i&gt; Christian Wege and Frank Gerhardt&lt;br /&gt;&lt;br /&gt;"As workshop instructors we had the coach and the customer roles at the same time. It was not always easy to make the separation between these two roles visible for the participants. Maybe a real hat would have helped."&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The Expert-in-Earshot Project Management Pattern&lt;/i&gt; Alistair Cockburn&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The Costs and Benefits of Pair Programming&lt;/i&gt; Alistair Cockburn and Laurie Williams&lt;br /&gt;&lt;br /&gt;Discuss eight aspects : Economics, Satisfaction, Design Quality, Continuous Reviews, Problem Solving, Learning, Team Building and Communication, Staff and Project Management. &lt;a href="http://collaboration.csc.ncsu.edu/laurie/Papers/XPSardinia.PDF"&gt;Full text&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-8141340386309516379?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8141340386309516379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8141340386309516379'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/04/only-important-ones.html' title='Only The Important Ones'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-5382903433337169468</id><published>2008-03-09T12:13:00.004Z</published><updated>2008-03-09T12:21:41.465Z</updated><title type='text'>(Fr)Agile Egos</title><content type='html'>I'm a great believer in customer contact, getting them to think in terms of value to the project and then selecting tasks that deliver most value. It's the right way to run an agile project.&lt;br /&gt;&lt;br /&gt;But a recent project is straining my goodwill. The customers have some technical proficiency and are setting the 'how' as well as the 'what'. For instance how should two web pages communicate? I said the simplest thing that could possibly work was a text page, the customer insisted on URL despite issues with length and character encoding.&lt;br /&gt;&lt;br /&gt;I built the URL version, it started creaking with those issues, so we needed to change. Text file? No - it's now a web service, which is all modern and lovely. The project wall lost it's pink postit saying "Do the simplest thing..." and has a new postit saying "do the coolest thing that could possibly be coded".&lt;br /&gt;&lt;br /&gt;To function in this environment it seems I have to have a very agile ego, where being overruled on technical matters is to be expected. Living by the agile mantra of feedback, I shall let the customers know about this post, and see whether there's any change in working pattern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-5382903433337169468?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5382903433337169468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5382903433337169468'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/03/fragile-egos.html' title='(Fr)Agile Egos'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-907601675533446914</id><published>2008-02-25T08:27:00.002Z</published><updated>2008-02-25T08:35:09.285Z</updated><title type='text'>Ernest Hemingway on Test Driven Development</title><content type='html'>"Stop when you are going good and when you know what will happen next. If you do that every day ... you will never be stuck."&lt;/quot&gt;&lt;br /&gt;&lt;div style="float:right"&gt;&lt;i&gt;Ernest Hemingway On Writing&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;"Finish a solo session by writing a test case and running it to be sure is doesn't pass. When you come back to the code, you then have an obvious place to start. You have an obvious, concrete bookmark to help you remember what you were thinking."&lt;br /&gt;&lt;div style="float:right"&gt;&lt;i&gt;Test-Driven Development By Example&lt;/i&gt; Kent Beck&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's not crazy to suggest there is a direct link between these two great minds. Beck picked up the advice with regard to writing, and I know that writing teachers in America get students to read the book of Hemingway's thoughts as guidance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-907601675533446914?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/907601675533446914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/907601675533446914'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/02/ernest-hemingway-on-test-driven.html' title='Ernest Hemingway on Test Driven Development'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-2990778227424545883</id><published>2008-01-08T11:32:00.000Z</published><updated>2008-01-08T11:40:09.812Z</updated><title type='text'>Pair Requirements Analysis</title><content type='html'>I like to pair program. Two heads are better than one. It's an efficient way of sharing knowledge and ideas.&lt;br /&gt;&lt;br /&gt;The challenge on my current project is not the programming, which is in C# and using our libraries that are becoming cool and mature. Instead the challenge is in the Requirements Analysis.&lt;br /&gt;&lt;br /&gt;The solution is Pair Requirements Analysis. I sit at a pair workstation with my colleague Tallboy. We both leaf through copies of the documents that have tried to record what the user wants. As we identify a requirement I put it in to the system in some way - as a test, as an item on the wiki, as an index card, as a TODO comment in the code. That hardly interrupts Tallboy's flow - it only takes a few seconds. We then discuss the next thing he's found and what it might mean for the system.&lt;br /&gt;&lt;br /&gt;It's an odd process. But it's honest. I know why this project started with a sheaf of mildly disorganised documents, and this is looking like an efficient way of getting from them the tasks to be done. Try it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-2990778227424545883?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2990778227424545883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2990778227424545883'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2008/01/pair-requirements-analysis.html' title='Pair Requirements Analysis'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-8270977626569423954</id><published>2007-12-28T10:21:00.000Z</published><updated>2007-12-28T16:15:39.088Z</updated><title type='text'>The Art of Agile Development - Book Reactions</title><content type='html'>Here are a few reactions to &lt;i&gt;The Art of Agile Development&lt;/i&gt; by James Shore and Shane Warden, O'Reilly, 2007.&lt;br /&gt;&lt;br /&gt;It's a deceptively big book. Just over 400 pages and a small type face, so there are a lot of words. The type size means long lines - sixteen or eighteen words per line - which I find a strain to read.&lt;br /&gt;&lt;br /&gt;I like the Self-Assessment quiz. I remember doing it on a prior project. You answer questions in each of five areas - Thinking, Collaborating, Releasing, Planning, Developing. 75 out of 100 or less means "immediate improvement required". But the questions are not equally weighted. My favourite is in "collaborating" -&lt;br /&gt;&lt;div style="FONT-FAMILY: Courier New"&gt;&lt;br /&gt;Do programmers ever make guesses rather than getting answers to questions?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;... and you lose 75 marks if you answer Yes.&lt;br /&gt;&lt;br /&gt;And I get quoted in it, taking a view on how to run stand-up meetings. I've never been so proud :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-8270977626569423954?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8270977626569423954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/8270977626569423954'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/12/art-of-agile-development-book-reactions.html' title='The Art of Agile Development - Book Reactions'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-64109637426625314</id><published>2007-10-16T12:28:00.000+01:00</published><updated>2007-10-16T12:39:05.336+01:00</updated><title type='text'>ASP.Net and Subsites</title><content type='html'>By Subsite I mean www.yourdomain.com/newarea. In my case I wanted to add &lt;a href='http://www.rentroll.co.uk/gwlflickrtagr'&gt;www.rentroll.co.uk/gwlflickrtagr&lt;/a&gt; to help Guess Where London users on Flickr tag their photos. The project had to be completely independent of the code for www.rentroll.co.uk.&lt;br /&gt;&lt;br /&gt;There are probably better ways of doing these things. But each workaround is helping me.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't use web.config&lt;/b&gt; as IIS throws a wobbly if you have the file in a sub-directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't use app_code&lt;/b&gt; as the compiled bin classes go in www.rentroll.co.uk/bin and the app_code there is for the main site&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Make your own Page parent class&lt;/b&gt; requires &lt;i&gt;using&lt;/i&gt; statements in all .aspx.cs code but that's a small price to pay for the code sharing&lt;br /&gt;&lt;br /&gt;&lt;b&gt;./MasterPage.master&lt;/b&gt; instead of tilde-slash. Tilde slash will look in the parent directory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;this.Page.Request.PhysicalPath&lt;/b&gt; tells you where your application is installed. This gets away from needing lots of Directory entries in the web.config you're not allowed to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-64109637426625314?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/64109637426625314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/64109637426625314'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/10/aspnet-and-subsites.html' title='ASP.Net and Subsites'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-6956614033588979326</id><published>2007-09-03T10:52:00.000+01:00</published><updated>2007-09-03T11:05:47.041+01:00</updated><title type='text'>Test Delayed Development</title><content type='html'>Here's a heterodoxy born out of weakness.&lt;br /&gt;&lt;br /&gt;Tests are Delaying my Development.&lt;br /&gt;&lt;br /&gt;I love the idea of Test-Driven Development (TDD). C# and NUnit go together like Flintoff and Injuries. But I'm writing an ASP.Net web site and I just can't get going on TDD for it.&lt;br /&gt;&lt;br /&gt;I'm trying to change the security model. I have written my own provider. I can test my code using NUnit. But I can't at the moment test the code through NUnit when it touches the Microsoft classes like MembershipUser. I suspect this is because the live environment uses web.config, and I don't know what steps to take to get it to work in NUnit.&lt;br /&gt;&lt;br /&gt;So instead I try to test the website using Watir. This means learning a new language, Ruby, just for testing. And open source packages like Watir and Rspec, which take constructive guesswork on how to do things.&lt;br /&gt;&lt;br /&gt;All of which delays my development. Preferred solution for me is to have a pair who understands this stuff so I can just get on with the programming. I'm not against new languages and new techniques but by golly they do take time.&lt;br /&gt;&lt;br /&gt;Time which delays the development. Hmm. This is written on the first working day of September 2007. I shall see whether I still find this in December, in March.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-6956614033588979326?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6956614033588979326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/6956614033588979326'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/09/test-delayed-development.html' title='Test Delayed Development'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-2983062487292363202</id><published>2007-08-29T11:45:00.000+01:00</published><updated>2007-08-29T13:07:22.811+01:00</updated><title type='text'>City Gate House by Giles Gilbert Scott</title><content type='html'>&lt;b&gt;Giles Gilbert Scott&lt;/b&gt;&lt;br /&gt;1880-1960 Knighted 1924 RIBA President 1933-1935&lt;br /&gt;It was his view that &lt;i&gt;to employ an architect was an act of faith, and that once the problem was set there should be no interference with matters of design&lt;/i&gt; Hubert Worthington, RIBA Journal 1960&lt;br /&gt;&lt;i&gt;Let us aim at quality rather than novelty&lt;/i&gt; GGS 1933&lt;br /&gt;Last of the Art-Architects. By the 1920s, architects were faced with formidable considerations of planning, construction and technlogy for which a largely artisitic training was inadequate. Some architects opted for a "mechanistic modernism", others restricted themselves to small-scale projects. GGS attempted to come to terms with the Twentieth Century but, like Lutyens, was oftern "consulting architect" applying a cosmetic treatment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notable Works&lt;/b&gt;&lt;br /&gt;Liverpool Anglican Cathedral 1903-60, fininshed 1980&lt;br /&gt;St Alban and St Michael (Golders Green) designed 1925, built 1932-33&lt;br /&gt;William Booth Memorial College (Camberwell) 1926-29&lt;br /&gt;Battersea Power Station 1929-1934 (West Half; East Half added 1944-45) : Scott was consultant when building was underway; responsible for the elaborate parapet, bases to chimneys etc&lt;br /&gt;New Bodleian Library, Oxford 1935-46 "much abused"&lt;br /&gt;Waterloo Bridge 1935-45 still has the temporary railings and no sculptural groups as designed; note that it is cantilevered, the arches being decorative not structural&lt;br /&gt;House of Commons refurbishment 1950 "neon-Gothic"&lt;br /&gt;St Michael Chester Square&lt;br /&gt;Phoenix Theatre (with others) Charing Cross Road facade&lt;br /&gt;King George V statue plinth at Old Palace Yard&lt;br /&gt;Joshua Reynolds statue plinth at the Royal Academy&lt;br /&gt;Memorial Cross at Our Lady of Victories, Clapham Park Road&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Homes&lt;/b&gt;&lt;br /&gt;4 Campden Hill&lt;br /&gt;28 Tavistock Square&lt;br /&gt;Chester House, Clarendon Place, Paddington (RIBA medal 1927, lived until his death) Blue Plaque 1990&lt;br /&gt;&lt;br /&gt;&lt;b&gt;City Gate House&lt;/b&gt;&lt;br /&gt;Built 1930-31&lt;br /&gt;"Associate architects" with Frank Reginald Gould Willis. &lt;br /&gt;"Embarrassingly pedestrian and commercial" according to the RIBA Drawings Collection. &lt;br /&gt;Scott re-designed Willis's facades (1928) in a more disciplined and severe style&lt;br /&gt;Square was planned by George Dance Snr in 1751, laid out by George Dance Jnr in 1777&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Scott Family&lt;/b&gt;&lt;br /&gt;George Gilbert Scott Snr (grandfather) : Albert Memorial, St Pancras Station, St Giles Camberwell&lt;br /&gt;George Gilbert Scott Snr (father) : St Agnes Kennington, All Hallows (Pepper Street) Southwark&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Web Links&lt;/b&gt;&lt;br /&gt;&lt;a target="_new" href="http://www.designmuseum.org/design/giles-gilbert-scott"&gt;Design Museum&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-2983062487292363202?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2983062487292363202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/2983062487292363202'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/08/city-gate-house-by-giles-gilbert-scott.html' title='City Gate House by Giles Gilbert Scott'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-7503305410483644347</id><published>2007-08-23T10:33:00.000+01:00</published><updated>2007-08-23T11:28:01.839+01:00</updated><title type='text'>Bob's Not My Uncle</title><content type='html'>Here are Uncle Bob's &lt;b&gt;Test-Driven Developers Practitioners Three Laws&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1&lt;/b&gt; You may not write production code unless you've first written a failing unit test.&lt;br /&gt;&lt;b&gt;2&lt;/b&gt; You may not write more of a unit test than is sufficient to fail.&lt;br /&gt;&lt;b&gt;3&lt;/b&gt; You may not write more production code than is sufficient to make the failing unit test pass.&lt;br /&gt;&lt;br /&gt;Robert C Martin &lt;i&gt;Professionalism and Test-Driven Development&lt;/i&gt; in IEEE Software Magazine, Vol 24 No 3 May/June 2007.&lt;br /&gt;&lt;br /&gt;I wanted to add encryption to a C# application, tested under NUnit. So I wrote&lt;br /&gt;&lt;div class="code"&gt;        [Test]&lt;br /&gt;        public void Encrypt()&lt;br /&gt;        {&lt;br /&gt;  string output = m_sc.Encrpyt(INPUT_1);&lt;br /&gt;  Assert.AreNotEqual(INPUT_1, output );&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The test failed. On to Step 3, sufficient code to make the test pass.&lt;br /&gt;&lt;div class="code"&gt;                public string Encrpyt(string input )&lt;br /&gt;        {&lt;br /&gt;  return "_" + input;&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Next test. Different strings get different encryptions. Passed first time.&lt;br /&gt;&lt;div class="code"&gt;[Test]&lt;br /&gt;        public void EncryptDifferent()&lt;br /&gt;        {&lt;br /&gt;  string output1 = m_sc.Encrpyt(INPUT_1);&lt;br /&gt;  string output2 = m_sc.Encrpyt(INPUT_2);&lt;br /&gt;  Assert.AreNotEqual(output1, output2 );&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, decryption. A test and just enough code.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;[Test]&lt;br /&gt;        public void Decrypt()&lt;br /&gt;        {&lt;br /&gt;            string output = m_sc.Decrypt( m_sc.Encrpyt(INPUT_1) );&lt;br /&gt;            Assert.AreEqual(INPUT_1, output );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Decrypt(string p)&lt;br /&gt;        {&lt;br /&gt;            return p.Substring(1);&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;That passes.&lt;br /&gt;&lt;br /&gt;But what should I do now? How do I write a unit test that shows up the insufficiency of this encryption? And if I only write enough code to get past that test, will I have a decent level of encryption. If I encypt SECRET as ___*S*E*C*R*E*T*___ who am I fooling, other than my test which checked for a limited set of items?&lt;br /&gt;&lt;br /&gt;No disrespect to Uncle Bob. I am not worthy to put a semi-colon on the end of his statement. I just need to know when to disobey the laws.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-7503305410483644347?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7503305410483644347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/7503305410483644347'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/08/bobs-not-my-uncle.html' title='Bob&apos;s Not My Uncle'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-4211556252820299514</id><published>2007-06-30T11:42:00.000+01:00</published><updated>2007-08-23T11:42:30.772+01:00</updated><title type='text'>The March of IDEs</title><content type='html'>I like the way that modern Integrated Development Environments (IDEs) are making programming a &lt;i&gt;physical&lt;/i&gt; job. That is, using the IDE's knowledge of what you might be about to type speeds up coding, and knowing how quickly the IDE will react makes this a real-time process.&lt;br /&gt;&lt;br /&gt;For instance, a common line in my C# code is entered as &lt;b&gt;r e t (tab) res (tab) ; (return)&lt;/b&gt; which gives&lt;br /&gt;&lt;div class="code"&gt;return result;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;because the IDE correctly guesses the rest. To use this, I have stopped calling a return value "retval" because that slows down this process.&lt;br /&gt;&lt;br /&gt;Here's another example &lt;b&gt;u s (tab) n u (ctrl-space) . F (tab) ; (return)&lt;/b&gt; gives&lt;br /&gt;&lt;div class="code"&gt;using NUnit.Framework;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;a s s (tab) . A (tab) S t r (tab) . E (tab)&lt;/b&gt; gives&lt;br /&gt;&lt;div class="code"&gt;Assert.AreEqual( String.Empty&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So how has this changed the way I code?&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;First long variable names are no problem. As long as they are distinct within the first few characters.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Within ASP.Net, I get to ConfigurationManager by &lt;b&gt;C o n (tab) M (tab)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I try to avoid using System.IO, which is good for various reasons but in this case is because Stream comes before String.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In pair programming this can become a dangerous habit, trying to control the Driver at the individual keystroke level. Apologies to my colleagues.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-4211556252820299514?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4211556252820299514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/4211556252820299514'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/06/march-of-ides.html' title='The March of IDEs'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-5098535003386948012</id><published>2007-04-20T10:21:00.000+01:00</published><updated>2007-04-20T10:41:08.832+01:00</updated><title type='text'>XP Customers : 9 plus 9</title><content type='html'>Credit where credit is due : these come from the presentation &lt;strong&gt;Programmers are from Mars, Customers are from Venus&lt;/strong&gt; by Angela Martin, Robert Biddle and James Noble at XPDay 2006.&lt;h3&gt;Nine Key Roles&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Geek Interpreter : talk to the XP programmers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technical Liaison : talk to the IT department&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Political Adviser : identify key players and rules&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Acceptance Tester : is it good enough?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;UI Designer : does it look OK?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technical Writer : do we need documentation?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Diplomat : are all views represented?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Super-Secretary : get all stories written down and followed up&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Negotiator : agree trade-offs in order to keep moving&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;h3&gt;Nine Customer Practices&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Programmer On-Site : they should see what the business looks like&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customer Apprentice : help writing stories, attending meetings&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Programmer Holiday : if the development gets ahead, the geeks take a break&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Story Standards : write them in a consistent way&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Show and Tell : keep the sponsors informed&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customer Pairing : work with another&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customer Counselor : get help with your role&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Look Before You Leap : have a business case and a release plan&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Three Month Calibration : expect a sanity / progress check at 3 months&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-5098535003386948012?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5098535003386948012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/5098535003386948012'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2007/04/xp-customers-9-plus-9.html' title='XP Customers : 9 plus 9'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-116039035701251137</id><published>2006-10-09T11:33:00.000+01:00</published><updated>2006-10-09T15:51:57.980+01:00</updated><title type='text'>Notes on Simplicity</title><content type='html'>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;First, some inspiration.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/SeaHarrier.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/SeaHarrier.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/SkiJumper.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/SkiJumper.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/Winglet.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/Winglet.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;Three simple improvements which anyone can understand. RAF planes take off more easily by using a ramp at the end of an aircraft carrier's flight deck. Ski jumpers fly further if they splay their skis. A turned up tip at the end of an aircraft wing improves long-haul efficiency.&lt;br /&gt;&lt;br /&gt;I don’t know who came up with these ideas, whether by accident or design, or what percentage improvement they were on what was there before. I just love the simplicity of each of them.&lt;br /&gt;&lt;h4&gt;Why Simplicity is a good thing&lt;/h4&gt;&lt;br /&gt;Because it’s cheap and it’s knowable.&lt;br /&gt;&lt;br /&gt;There are established reasons for Simplicity in Extreme Programming. A simple design needs less documentation. It’s easier to improve a simple design than to build perfection from day one. Others have explained these better before. I thought I’d add these two reasons.&lt;br /&gt;&lt;br /&gt;Simple things are often cheap in themselves, cheaper to develop and make less expensive the things around them. The ski jumper above has paid no more for his skis to use the splayed pose. The aircraft carrier ramp reduces the overall size of the ship, because it does not need the catapult technology used by the Americans.&lt;br /&gt;&lt;br /&gt;And cheap is good because either (a) you get to spend more of the budget on comfy chairs and faster computers, or (b) because it increases the number of people who can get involved in the programming community. Your preference for (a) or (b) may say a lot about you, by the way.&lt;br /&gt;&lt;br /&gt;Simple things are easy to use. You can just see what they do, you know how to use them. Whether that’s a door bell or a database connection, the simpler it is to use the better. Steve Krug’s book on web usability &lt;em&gt;Don’t Make Me Think&lt;/em&gt; is brilliant on this subject, even down to the title telling you everything you need to know. Web sites must not need manuals – they should just work as the man on the Clapham omnibus expects them to work.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/Hackman.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/Hackman.jpg" border="0" alt="" /&gt;&lt;/a&gt; I illustrate this by contrasting two kitchen items made by Hackman in Finland. On the left we have the bottle opener. It’s a joy to use, fits in the hand, reassuring weight so you know you won’t bend it, and it opens bottles. On the right is the salt cellar. It dispenses salt. It’s lovely to use as long as you don’t have wet hands or arthritis. You can distinguish it from the pepper grinder because the little dot on the top is white not black (that’s not visible in the photo). And after owning one for six years I finally found how to fill it with salt without dismantling it completely.&lt;br /&gt;&lt;br /&gt;My point is that simplicity and minimalism are not the same thing. You want to see enough of how something works, not too much and not too little. At that point it becomes knowable.&lt;br /&gt;&lt;h4&gt;How to get into a simple frame of mind&lt;/h4&gt;&lt;br /&gt;You could do a Maths degree. I’ve talked to people with English degrees, History degrees and so on, and there was nothing in their university course that was simple – that was the whole point. In my Maths degree we were taught various simple techniques to make complicated problems soluble. Substituting a value in a formula, proof by induction, a single counter example. Use any of these in the right way and you have the answer. Just as significantly, we were taught to celebrate that simplicity.&lt;br /&gt;&lt;br /&gt;A three year Maths course may be a bit much. Alternatively, I recommend looking for the simpler thing all the time, in everything you do. Is the music you listen to simple? If the food you eat simple? Do you talk simply? Practice simplicity everywhere and it will get easier.&lt;br /&gt;&lt;br /&gt;Let’s start with music. I’m listening to Yo-Yo Ma playing Bach’s cello suites. That’s one man, one cello, no need for anything else. Of course it’s not simple in the sense of trivial. But it is simple in comparison with a whole orchestra bashing out some symphony. There’s no distraction, no waste, just purity.&lt;br /&gt;&lt;br /&gt;Apply that to your art form of choice. Realise that &lt;em&gt;The Lord of the Rings&lt;/em&gt;, both the book and the film is complexity gone mad. Whereas Doctor Seuss’s &lt;em&gt;Green Eggs and Ham&lt;/em&gt; is a masterpiece of simplicity, needing a vocabulary of only 50 words. If that’s too great a disjunction for you, put &lt;em&gt;Moby Dick&lt;/em&gt; alongside &lt;em&gt;Bartleby&lt;/em&gt;. Prefer Picasso’s single line sketches to Guernica. Go to stand up comedy rather than Shakespeare.&lt;br /&gt;&lt;br /&gt;Now food and drink. The best coffee is just coffee. Un espresso in Italy, un café in France. Starbucks is the enemy of this simplicity, all flavours and froths. Just say no. Pasta with a home made tomato sauce is a fine dish. If a dish on a restaurant menu has a two line description using words new to you, then it’s not going to help you to embed a simple mindset.&lt;br /&gt;&lt;br /&gt;In conversation, the same thing. Congratulate yourself every time you speak simply. If someone asks a question carefully, a simple "yes" or "no" may be all the answer required. You’re failing if the person you’re talking to needs a word explained, so watch for saying "heuristic" if "guideline" would do just as well.&lt;br /&gt;&lt;br /&gt;Do this today and tomorrow. By the weekend you’ll have examples of the simple thing you admire, the moment you took the simple path. It may be a door handle. It may be a three-second input that saved someone three hours. Well done, you kept it simple.&lt;br /&gt;&lt;h4&gt;What this means to me as a programmer&lt;/h4&gt;&lt;br /&gt;Here’s a simple test for you. At a bookshop, pick out the "for Dummies" book on a subject you know about. Flick through it. See what you think.&lt;br /&gt;&lt;br /&gt;I went for &lt;em&gt;C for Dummies&lt;/em&gt; by Dan Gookin. Here’s a quotation. "Don't forget the ampersand (&amp;amp;) required in front of the variable used in a scanf statement. Without that &amp;amp; there, the program really screws up." I like that. I don’t think the book should be discussing exactly what happens without the ampersand, it should just be drumming the point home that leaving it out is bad bad bad. There’s some discussion about how a preprocessor works but it’s prefaced with "Long, tedious information that you want to miss". As you’re learning C, the important thing is to know to use #define MAXLENGTH 200, not the curious behaviours possible of #define MAX(x,y) (x&amp;gt;y?x:y).&lt;br /&gt;&lt;br /&gt;OK, here’s the uncomfortable truth. If you get cross that the surface is being skated over, that the authors are missing out crucial stuff, that no-one should ever read “Firewalls for Dummies”, then you may have to admit you don’t like simplicity. I remember Kent Beck saying that the five values of XP can be used as a test. If a person or an organisation does not intrinsically believe in communication, for instance, then XP is not for them. If you don’t like simplicity, maybe you shouldn’t be doing XP.&lt;br /&gt;&lt;br /&gt;Time for a few examples.&lt;br /&gt;&lt;br /&gt;Multiple returns from a function can be good. They support simplicity because the moment you have the answer you quit the function. The dogmatists who hate the following coding style are not keeping it simple.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int MyFunction( int param )&lt;br /&gt;{&lt;br /&gt; if( param &lt;= 0 )  &lt;br /&gt;  return 0;&lt;br /&gt; for( int i = 0; i &lt; param; i++ )&lt;br /&gt; {&lt;br /&gt;  if( MySecondFunction( i, param ) )&lt;br /&gt;   return i;&lt;br /&gt;  if( MyThirdFunction( i, param ) ) &lt;br /&gt;   return i;&lt;br /&gt; }&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Database normalisation can be bad. Simple data tables tend to have lots of columns and a fair amount of data duplication. This makes them easy to query – no need for joining multiple tables together. And it makes them tolerant of poor input. If someone puts in an incomplete address, for instance, a simple database design will hold what was entered, whereas a normalised design requiring county or state to be chosen from a predefined list will fail.&lt;br /&gt;&lt;br /&gt;Refactor a bit and then stop. Merciless refactoring can take too much time, or just set up too much expectation amongst the programmers. To quote from an Apple report presented at Agile 2006, "refactor … only on demand, when the code is grossly missing the intended functionality or needs major optimization." Beware the salt cellar example where “simplicity” tipped over into minimal unusability.&lt;br /&gt;&lt;h4&gt;Enough already&lt;/h4&gt;&lt;br /&gt;Some people find that the perfection of "simple" solutions makes simplicity difficult to practice. To them I say, "enough". You practice simple design by doing "enough design up front". Ask yourself what "enough" would be in a context, and you’re headed down the simple path.&lt;br /&gt;&lt;br /&gt;If a ten-minute build is proving difficult, a simple solution may be beyond your reach. An "enough" solution is to work round a 30 minute build. Then let the team find a rhythm which hits the build button at convenient moments – first person to arrive, at the start of lunch, before any meeting.&lt;br /&gt;&lt;br /&gt;A good example came over lunch at Agile 2006. One delegate wanted help with introducing continuous integration. Other delegates, who really knew their stuff, gave him chapter and verse on Subversion, Tortoise, Nant, Cruise Control and the kitchen sink. All I did was to ask how big his company was. When told three people, I suggested that an "enough" solution might not need all of the above.&lt;br /&gt;&lt;br /&gt;The great thing about an enough solution is you can improve it the next day. The London Transport map is a classic of design, working from the realisation that it did not need distances to be shown consistently. Even then, the simplicity matured over many years and many editions, as the designers understood how to use their concept. Again it can be carried too far. New Yorkers hated a subway map that took the London Underground approach and simplified Central Park to just a square.&lt;br /&gt;&lt;h4&gt;The End&lt;/h4&gt;&lt;br /&gt;That’s enough from me. Simplicity is good because it is cheap and knowable. Practice it in everything and it will get easier in your work. Enough may be enough – don’t force yourself to over do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-116039035701251137?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/116039035701251137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/116039035701251137'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/10/notes-on-simplicity.html' title='Notes on Simplicity'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-115710734552762783</id><published>2006-09-01T11:37:00.001+01:00</published><updated>2006-09-01T11:47:19.410+01:00</updated><title type='text'>Agile leadership - make it happy</title><content type='html'>Brian Marick blogged &lt;a href="http://www.testing.com/cgi-bin/blog/2006/07/26#unhappy-trend-1"&gt;An unhappy trend: leadership&lt;/a&gt; which I saw supported on Willem van den Ende's post &lt;a href="http://me.andering.com/2006/08/16/just-enough-structure/"&gt;Just enough structure&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I took part in Willem's &lt;a href="http://me.andering.com/2006/08/04/drawing-carousel-at-agile2006/"&gt;Drawing Carousel session &lt;/a&gt; at Agile 2006.&lt;br /&gt;&lt;br /&gt;The most striking comment in the final wrap up was that some of the team were unhappy not knowing the overall state of the project. We traced that to having stuck to the limitation of pairs not communicating during iterations. I checked to see if you would have allowed us to have someone overseeing - Willem said yes - so the restriction was self-imposed or we were too blinkered to think of it.&lt;br /&gt;&lt;br /&gt;This is a sign that there is a desire for co-ordination and overseeing - I’m going to call that leadership. And that self-organising teams may well not put someone in this role.&lt;br /&gt;&lt;br /&gt;I suggest that “An unhappy trend: leadership” is wrong. The unhappy trend is the Great Man theory being adopted by Agilists. A good scrum master functions by leading in an agile way, not leading in a great man way.&lt;br /&gt;&lt;br /&gt;And a self-organising team will benefit from considering appointing a leader in a way that suits the team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-115710734552762783?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115710734552762783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115710734552762783'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/09/agile-leadership-make-it-happy.html' title='Agile leadership - make it happy'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-115701867592475572</id><published>2006-08-31T11:02:00.000+01:00</published><updated>2006-08-31T12:01:20.960+01:00</updated><title type='text'>Wireless at the birthplace of Computing</title><content type='html'>Ah, the freelance life. No ties, no office to go to, no fixed hours. I can work anywhere, so I choose to work from the home of Charles Babbage, England's claim to be the inventor of the computer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/BabbagePlaque.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7743/2087/320/BabbagePlaque.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;First, South London has to claim to be his birthplace. The &lt;em&gt;International Biographical Dictionary of Computer Pioneers&lt;/em&gt; lists him as born in Teignmouth, Devon, so I prefer the &lt;em&gt;Oxford Dictionary of National Biography&lt;/em&gt; which argues that his father's house in Crosby Row, Walworth is the most likely.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/LibraryView.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7743/2087/320/LibraryView.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;His date of birth was 26 December 1791, which makes him 78,410 days old. I calculated this using a Difference Engine, first trying Excel, but it can't handle dates that long ago. Instead I turned to SQL Server - select datediff( d, '26-Dec-1791', '31-Aug-2006' ). Babbage said that he would give up the rest of his life to live three days in 500 years time, guessing that by then we might have inventions worthy of his interest.&lt;br /&gt;&lt;br /&gt;We celebrate Babbage for building the Difference Engine, a mechanical devices capable of arithmetic (No. 1, 1832). He had grander plans for an analytic engine, capable of any mathematical calculation, but was not enough of a politician to get the funding to carry it through. The Prime Minister of the day, Robert Peel, suggested that the machine should be set to calculate the time it would be of use.&lt;br /&gt;&lt;br /&gt;An extraordinary man, and the calculating machines were only a fraction of his interests. See &lt;a href="http://en.wikipedia.org/wiki/Charles_Babbage"&gt;Wikipedia's biography&lt;/a&gt; for more. I respect this source as it also promotes South London as his birthplace.&lt;br /&gt;&lt;br /&gt;So, ask yourself, does your workspace provide the following -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;High ceilinged room with excellent natural light, and&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Excellent public transport connections, and&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Free wireless internet (a good use of my Council Tax), and&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A deep sense of history?&lt;/li&gt;&lt;/ul&gt;If not, relocate to the Walworth Road. You'll not regret it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-115701867592475572?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115701867592475572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115701867592475572'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/08/wireless-at-birthplace-of-computing.html' title='Wireless at the birthplace of Computing'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-115140845118265114</id><published>2006-06-27T12:39:00.000+01:00</published><updated>2006-06-27T14:32:27.530+01:00</updated><title type='text'>Regex, Roman Numerals and TDD</title><content type='html'>I read a &lt;a href="http://www.differentpla.net/node/58"&gt;blog&lt;/a&gt; on Roman Numeral Conversion and decided to do the reverse, roman to integer conversion. I wanted to use Regular Expressions as I thought they would allow a neat treatment. And I wanted to use Test Driven Development (TDD) to ensure that I had written what I thought I had written.&lt;br /&gt;&lt;br /&gt;I started with a simple test, and a simple class (in that order). After one and a half iterations, the code was like this. By one and a half iterations, I mean one working test, one failing test.&lt;br /&gt;&lt;pre&gt;[TestFixture]&lt;br /&gt;public class RomanToIntTester&lt;br /&gt;{&lt;br /&gt;    [Test]&lt;br /&gt;    public void TestZero()&lt;br /&gt;    {&lt;br /&gt;        RomanToInt r2i = new RomanToInt();&lt;br /&gt;&lt;br /&gt;        Assert.AreEqual(0, r2i.Convert( "" ) );&lt;br /&gt;    }&lt;br /&gt;    [Test]&lt;br /&gt;    public void TestOne()&lt;br /&gt;    {&lt;br /&gt;        RomanToInt r2i = new RomanToInt();&lt;br /&gt;&lt;br /&gt;        Assert.AreEqual(1, r2i.Convert("I"));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class RomanToInt&lt;br /&gt;{&lt;br /&gt;    public RomanToInt()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    public int Convert(string str)&lt;br /&gt;    {&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I chose not to work through tests for II = 2, III = 3, IV = 4, but instead to write the daddy of all tests, using Excel to do the repetitive coding for me. I set up a 4,000 row spreadsheet, and put the following formulae into the cells on row 4000 -&lt;br /&gt;&lt;pre&gt;A4000 =A3999+1&lt;br /&gt;B4000 =ROMAN(A4000,0)&lt;br /&gt;C4000 =CONCATENATE("Assert.AreEqual(",A4000,", r2i.Convert(""",B4000,"""));")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I then copied these into rows 1 to 3999, and then typed 0 into cell A1. Column C was now my test code. I copied it into my test class and had the following -&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[Test]&lt;br /&gt;public void TestZeroTo3999()&lt;br /&gt;{&lt;br /&gt;    RomanToInt r2i = new RomanToInt();&lt;br /&gt;    Assert.AreEqual(0, r2i.Convert(""));&lt;br /&gt;    Assert.AreEqual(1, r2i.Convert("I"));&lt;br /&gt;    Assert.AreEqual(2, r2i.Convert("II"));&lt;br /&gt;...&lt;br /&gt;    Assert.AreEqual(3997, r2i.Convert("MMMCMXCVII"));&lt;br /&gt;    Assert.AreEqual(3998, r2i.Convert("MMMCMXCVIII"));&lt;br /&gt;    Assert.AreEqual(3999, r2i.Convert("MMMCMXCIX"));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I then set about the task. I wrote tests then code to remove say "IV" and replace it with "4". I used a Regex Replace call for this. Then tests and code to replace all two-letter values - IV, IX, XL, XC, CD and CM - with a single digit or a letter not otherwise used - "F" for "XL" (forty), "N" for "XC" (ninety), "A" and "B" for "CD" and "CM".&lt;br /&gt;&lt;pre&gt;    Assert.AreEqual("9", r2i.ReplaceAll("IX"));&lt;br /&gt;    Assert.AreEqual("MBN9", r2i.ReplaceAll("MCMXCIX"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I wrote tests and a function to count the number of occurences of a character and return that count multiplied by a base value.&lt;br /&gt;&lt;pre&gt;    Assert.AreEqual(3, r2i.RepeatCountAndMultiply("XXXVIII", "I", 1));&lt;br /&gt;    Assert.AreEqual(5, r2is.RepeatCountAndMultiply("XXXVIII", "V", 5));&lt;br /&gt;    Assert.AreEqual(30, r2i.RepeatCountAndMultiply("XXXVIII", "X", 10));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All that remained was to implement the Convert function in full, as a call to ReplaceAll followed by incrementing a value with successive calls to RepeatCountAndMultiply. And guess what? The TestZeroTo3999 test &lt;strong&gt;passed first time&lt;/strong&gt;. Does the smugness come through in the tone of this post? I quickly &lt;br /&gt;refactored the class and tests to make most of the functions protected, and therefore deriving the tester class from the implementation class (is this a good idea?) and I considered myself done.&lt;br /&gt;&lt;br /&gt;Here's the conversion class in full.&lt;br /&gt;&lt;pre&gt;namespace MusingsLib&lt;br /&gt;{&lt;br /&gt;    public class RomanToInt&lt;br /&gt;    {&lt;br /&gt;        public RomanToInt()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;        public int Convert(string str)&lt;br /&gt;        {&lt;br /&gt;            int retval = 0;&lt;br /&gt;            str = ReplaceAll(str);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "I", 1);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "4", 4);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "V", 5);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "9", 9);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "X", 10);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "F", 40);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "L", 50);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "N", 90);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "C", 100);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "A", 400);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "D", 500);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "B", 900);&lt;br /&gt;            retval += RepeatCountAndMultiply(str, "M", 1000);&lt;br /&gt;            return retval;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected string ReplaceAll(string str)&lt;br /&gt;        {&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "IV", "4");&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "IX", "9");&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "XL", "F");&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "XC", "N");&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "CD", "A");&lt;br /&gt;            str = ReplaceRomanWithAlternative(str, "CM", "B");&lt;br /&gt;            return str;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected int RepeatCountAndMultiply(string inputstr, string roman, int baseval)&lt;br /&gt;        {&lt;br /&gt;            Regex r = new Regex( roman );&lt;br /&gt;            return r.Matches(inputstr).Count * baseval;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected string ReplaceRomanWithAlternative(string inputstr, string roman, string alt)&lt;br /&gt;        {&lt;br /&gt;            Regex r = new Regex( roman );&lt;br /&gt;            return r.Replace(inputstr, alt);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Reference : &lt;a href="http://www.differentpla.net/node/58"&gt;www.differentpla.net/node/58&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-115140845118265114?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115140845118265114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115140845118265114'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/06/regex-roman-numerals-and-tdd.html' title='Regex, Roman Numerals and TDD'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-115115320066088797</id><published>2006-06-24T13:44:00.000+01:00</published><updated>2006-06-24T17:50:04.250+01:00</updated><title type='text'>Regex and TDD - sine qua non</title><content type='html'>I'm hauling myself up the regular expressions learning curve. What worries me is that it is so easy to use them wrongly. When there's an expression like "(?=(\d\d\d)*$)(\d\d\d)" how sure are you of what it does?&lt;br /&gt;That's where Test Driven Development comes to the rescue. I'm telling myself to write at least half a dozen tests to check that the behaviour is as expected. Take the following function, designed to turn a long value like 1234567 into a string value of 1,234,567. A neat use of regular expressions, processing a set of matches using a lookahead. But can you see the bug?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        public string BignessWithCommas&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                string retval = string.Empty;&lt;br /&gt;                string str = m_bigness.ToString();&lt;br /&gt;&lt;br /&gt;                Regex r = new Regex(@"(?=(\d\d\d)*$)(\d\d\d)");&lt;br /&gt;                int tripletlen = 0;&lt;br /&gt;                foreach (Match m in r.Matches(str))&lt;br /&gt;                {&lt;br /&gt;                    if (retval != string.Empty)&lt;br /&gt;                        retval += ",";&lt;br /&gt;                    retval += m.Value;&lt;br /&gt;                    tripletlen += 3;&lt;br /&gt;                }&lt;br /&gt;                if( tripletlen &lt; str.Length )&lt;br /&gt;                    retval = str.Substring( 0, str.Length - tripletlen ) + "," + retval;&lt;br /&gt;                return retval;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No, I couldn't see the bug either. Thankfully, I tested it with&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void ItemWithCommas()&lt;br /&gt;        {&lt;br /&gt;            DuctTop100Item x = new DuctTop100Item("Me", 17);&lt;br /&gt;            Assert.AreEqual("17", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 179; Assert.AreEqual("179", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 1790; Assert.AreEqual("1,790", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 12790; Assert.AreEqual("12,790", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 123790; Assert.AreEqual("123,790", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 1234790; Assert.AreEqual("1,234,790", x.BignessWithCommas);&lt;br /&gt;            x.Bigness = 1234567890; Assert.AreEqual("1,234,567,890", x.BignessWithCommas);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and it went wrong immediately. As so often is the case, it failed on the simple example, because my whole brain was used up doing the difficult bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-115115320066088797?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115115320066088797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115115320066088797'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/06/regex-and-tdd-sine-qua-non.html' title='Regex and TDD - sine qua non'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-115038634313493450</id><published>2006-06-15T16:36:00.000+01:00</published><updated>2006-06-21T15:28:07.760+01:00</updated><title type='text'>BookDiff on XP Explained</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/firstedition.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 0px 0px; CURSOR: hand" alt="First Edition" src="http://photos1.blogger.com/blogger/7743/2087/320/firstedition.jpg" border="0" /&gt;&lt;/a&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/SecondEdition.jpg"&gt;&lt;img style="MARGIN: 0px 10px 0px 0px; CURSOR: hand" alt="Second Edition" src="http://photos1.blogger.com/blogger/7743/2087/320/SecondEdition.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;I needed a copy of Kent Beck's &lt;em&gt;Extreme Programming Explained&lt;/em&gt;, and was pleased to see a new edition. True to the XP ethos, it has been refactored. But I fear it may not pass a suite of tests, such as repeating all that was good in the first edition.&lt;/p&gt;&lt;p&gt;Kent shares the Second Edition (SE) credit with Cynthia Andres. I wonder whose idea was it to forbid sexual relationships between team members (SE p43), and are they ashamed of their heterosexual stereotyping? And I’m suspicious that Kent and Cynthia are closer than some other co-authors – on page 104 there is a reference to Beth Andres-Beck.&lt;/p&gt;&lt;p&gt;So we used to have four values – communication, simplicity, feedback and courage. SE adds Respect. The First Edition (FE) chapter on principles is 6 pages long, the SE chapter is 12 pages, and there’s almost no common ground between the two.&lt;/p&gt;&lt;p&gt;The shock is that the twelve practices have gone, at least as a tightly defined list. I miss them so much I put together &lt;a href="http://www.bitwix.com/xpdiagram.htm"&gt;http://www.bitwix.com/xpdiagram.htm&lt;/a&gt; to remind me what they are. Instead of the excellent diagram on FE page 70, we have spidery maps.&lt;/p&gt;&lt;p&gt;And so it goes on. Do you want to read about Frederick Taylor, the industrial engineer who used systematic methods to improve factory production? In FE, he is in the bibliography but dismissed with “as strategies for software development [his principles make] no business sense and no human sense”. In SE, he gets a whole chapter.&lt;/p&gt;&lt;p&gt;My disappointment is that Kent’s first edition was so practical and so readable, it was inspiring. The second edition is neither. It loses the simple, countable sets of values, principles and practices in a mess of new ideas. And the ideas are communicated in such a way that I find myself skipping to the end of the chapter.&lt;/p&gt;&lt;p&gt;Thankfully, there are secondhand copies of the first edition available. Embrace change? Not in this case.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-115038634313493450?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115038634313493450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/115038634313493450'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/06/bookdiff-on-xp-explained.html' title='BookDiff on XP Explained'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-114279179520263290</id><published>2006-03-19T18:09:00.001Z</published><updated>2006-03-26T00:55:21.146Z</updated><title type='text'>On Rounding</title><content type='html'>This is just a wee bitch about Microsoft's permanent need to improve our programming lives. In this case, it's about rounding numbers to two decimal places.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/RoundingExcel.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Excel Rounding" src="http://photos1.blogger.com/blogger/7743/2087/320/RoundingExcel.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In the UK, Value Added Tax (VAT) is 17.5%. If something costs £2.00 then £0.35 is added in VAT making a total paid of £2.35. If something costs £2.20 then 17.5% is £0.385 which either £0.38 or £0.39 depending on whether you round up or round down.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;At school, I was taught to round up if the number ended in 5. And that's what the Excel rounding routines (see above) do. It's also what the SQL Server ROUND function does - see below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/RoundingSqlServer.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="SQL Server Rounding" src="http://photos1.blogger.com/blogger/7743/2087/320/RoundingSqlServer.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border=0&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/RoundingCSharp.0.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/320/RoundingCSharp.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's not what the .Net Framework rounding does - they have decided to use Bankers Rounding, where you round towards an even number. So 0.385 is rounded to 0.38. Bankers Rounding must be cockney rhyming slang for &lt;b&gt;Astounding&lt;/b&gt;.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/RoundingVB.0.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/320/RoundingVB.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At least .Net looks consistent. Imagine my surprise when I checked this in Visual Basic 6.0 to find that some roundings go one way, some go another. How else to explain that the VAT on 0.20 is 0.03, but the VAT on 4.20 is 0.74? It is pretty stink, as they say in New Zealand.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-114279179520263290?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/114279179520263290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/114279179520263290'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/03/on-rounding.html' title='On Rounding'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-113834638943675583</id><published>2006-01-27T07:15:00.000Z</published><updated>2006-02-08T22:08:52.160Z</updated><title type='text'>Wheel Spire Dome Office Flat</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/08Feb2006%20001.jpg"&gt;&lt;img alt="Wheel Spire Dome Office Flat" src="http://photos1.blogger.com/blogger/7743/2087/320/08Feb2006%20001.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These five buildings and structures rise above the South London streets. Each has its own story. Some have stayed the same, others have moved from one use to another.&lt;br /&gt;&lt;br /&gt;First we have the "London Eye" also known as the Millennium Wheel. It is now iconic, but I remember sitting on the Embankment in September 1999 watching them fail to hoist it from its horizontal position, making it another national embarrassment.&lt;br /&gt;&lt;br /&gt;Next is the spire of Christ Church and Upton Chapel, physical home of &lt;a href="http://www.church.co.uk"&gt;www.church.co.uk&lt;/a&gt; (now that's what I call a website address). There is the suggestion that the stars and stripes on its spire link to Abraham Lincoln's family who contributed to the original building.&lt;br /&gt;&lt;br /&gt;Third is the dome of the Imperial War Museum, a radical transformation of a mental asylum. As a kid I just loved going there to see tanks and fighter planes up close. Now it's the human stories I go for, and I never come out laughing.&lt;br /&gt;&lt;br /&gt;The Shell Centre comes next. This is the Upstream building and is still used as offices, unlike other parts of the complex which have become flats. The architects wanted a building nearly twice as high; I'm glad they weren't allowed. Its best moment is as a projection screen for events such as the poppy drop in November.&lt;br /&gt;&lt;br /&gt;Last we have a block of flats, which got in the paper when someone asked £4,500,000 for a one bedroom flat. For me it isimportant to note that it used to be the headquarters of MI6, the British spies now relocated to a landmark building. This block was never interesting enough to feature in a James Bond movie.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/Wheel.2.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/200/Wheel.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/spire.2.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/200/spire.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/dome.1.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/200/dome.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/flat.1.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7743/2087/200/flat.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/Office.2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/200/Office.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-113834638943675583?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113834638943675583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113834638943675583'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/01/wheel-spire-dome-office-flat.html' title='Wheel Spire Dome Office Flat'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-113788632331128818</id><published>2006-01-21T23:05:00.000Z</published><updated>2006-01-22T00:20:07.976Z</updated><title type='text'>A Random Number Web Service - Keeping It Honest</title><content type='html'>Two things Microsoft have made easy for us these days. Writing a web service and producing random numbers. But do they work together?&lt;br /&gt;&lt;br /&gt;Web services are new(ish) so it's no surprise that the authoring tools are getting easy to use. Visual Studio 2005 does get you from zero to hero in minutes. If you skip documentation paragraphs (as I do), then the only gotcha is that yes, you have to run WSDL from the VS2005 command line prompt.&lt;br /&gt;&lt;br /&gt;Random number generators have been around for years. We've all used them for silly programs. Most of us have then noticed that to start with they actually gave us the same stream of "random" numbers, so we read up about seeding and then found a way that was random enough to seed the generator so that we never saw the same sequence twice.&lt;br /&gt;&lt;br /&gt;We were therefore pleased that in the .Net Framework&lt;br /&gt;&lt;pre&gt;Random r = new Random();&lt;/pre&gt;used a seed generated from the time. So we could just use that and *bingo* our numbers were never the same twice.&lt;br /&gt;&lt;br /&gt;Put these two technologies together, and you have a random number generating web service.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Except you don't.&lt;/b&gt; Use the service twice on a page, and you get the same number.&lt;br /&gt;&lt;br /&gt;The problem is that each call to the web service creates a new Random() class object, seeded with the current time. Call it quickly enough, and the next one will be seeded with the same time, and it's no longer random.&lt;br /&gt;&lt;br /&gt;My solution was to pause for a tick before creating the Random object. I did this by holding the DateTime.Now.Ticks and then sleeping the thread for 1 millisecond.&lt;pre&gt;using System.Threading;&lt;br /&gt;&lt;br /&gt;public class RandomData &lt;br /&gt;    : System.Web.Services.WebService&lt;br /&gt;{&lt;br /&gt;    Random m_r;&lt;br /&gt;    public RandomData () &lt;br /&gt;    {&lt;br /&gt;        long tc = DateTime.Now.Ticks;&lt;br /&gt;        do&lt;br /&gt;        {&lt;br /&gt;            Thread.Sleep(1);&lt;br /&gt;        } while (tc == DateTime.Now.Ticks);&lt;br /&gt;        m_r = new Random();&lt;br /&gt;    }&lt;/pre&gt;You can then use m_r.Next() without fear.&lt;br /&gt;&lt;br /&gt;Why do you want a random number web service? So that it can become a full random data web service, applying algorithms or reading databases of potential values. See &lt;a href="http://www.bitwix.com/NorMad.aspx"&gt;www.bitwix.com/NorMad&lt;/a&gt; for more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-113788632331128818?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113788632331128818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113788632331128818'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/01/random-number-web-service-keeping-it.html' title='A Random Number Web Service - Keeping It Honest'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-113786076006225320</id><published>2006-01-21T16:20:00.000Z</published><updated>2006-01-21T16:40:43.486Z</updated><title type='text'>New / Change / Nouvel : Pun your own headline</title><content type='html'>Just East of St Paul's Cathedral is a red brick building, shortly to become a building site, then to become Britain's first building by Jean Nouvel.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;It's an interesting test case of what constitutes a building worth keeping, and when the combination of a "starchitect" and a commercial property developer is likely to do the city any good.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;My bias is that in 2002 I schlepped over to Switzerland for Expo.02. In the town of Morat, in the middle of the lake, was a massive iron cube. You queued to get on the boat out to this cube, and then had three panoramic experiences on three different levels. Stunning, and a credit to Monsieur Nouvel.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/NewChangeDetail.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/NewChangeDetail.jpg" border="0" alt="" /&gt;&lt;/a&gt;The red-brick New Change Buildings (built 1953-1960) by Victor Heal have their detractors. "Regrettable ... silly little semi-period balconies ... sculpture as retardataire as the architecture" says Nikolaus Pevsner in the 1962 edition of &lt;i&gt;The Buildings of England : London&lt;/i&gt;.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Instead we get 220,000 sqft of "retail destination" which Land Securities promises us will "create a vibrant commercial hub for this important City community". The buildings are not high - six floors - but they are designed to get plenty of floorspace for shops and offices.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;On balance, I'm content that the Heal building will go. I've watched the City being filled in with so many really bad blocks, this one might be a little better. We are told that there will be rooftop public space - I would appreciate that if it is more public than, say, the garden on Stirling's One Poultry.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I just don't expect a building of real quality. We won't get an Institut Monde Arabe.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.landsecurities.co.uk/websitefiles/one%20new%20change%20planning.pdf"&gt;Land Securities&lt;/a&gt; press release&lt;br /&gt;&lt;a href="http://www.jeannouvel.com/"&gt;Jean Nouvel&lt;/a&gt; and the &lt;a href="http://www.vitruvio.ch/arc/contemporary/1946-2001_02/monolithe.php"&gt;Morat Monolith&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-113786076006225320?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113786076006225320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113786076006225320'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/01/new-change-nouvel-pun-your-own.html' title='New / Change / Nouvel : Pun your own headline'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-113726360594655929</id><published>2006-01-14T18:03:00.000Z</published><updated>2006-01-21T16:41:02.383Z</updated><title type='text'>The largest hidden gem in London</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/7743/2087/1600/StockwellBusGarage.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7743/2087/320/StockwellBusGarage.jpg" border="0" alt="Stockwell Bus Garage" /&gt;&lt;/a&gt;&lt;p/&gt;Of course you &lt;i&gt;know&lt;/i&gt; it's there, it's just that you've never seen it. A stadium sized concrete structure hidden away in a back street, magnificently doing the job is was built to do.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;&lt;b&gt;Stockwell Bus Garage&lt;/b&gt; is a landmark building in London. Archictecturally perfect and completely unaffected by the heritage industry. A fair sprinkling of graffiti but that's no more offensive than the plethora of official signs forbidding unauthorised access.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;It was a mediocre grey day when I walked over to the garage, stopping to photograph the blue plaque for Dan Leno. So the photo does not do it justice. If you want to see it, turn left out of Stockwell tube and take the second left turn. Better would be to use the 196 or P5 bus.&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Stockwell_Garage"&gt;Wikipedia article&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.londonbusgarages.co.uk/swphoto.html"&gt;Photos on LondonBusGarages.co.uk&lt;/a&gt; showing that it is always a grey day in Stockwell&lt;br /&gt;&lt;a href="http://www.crapmatchreports.blogspot.com/pictemps/sbg.html"&gt;Onionbagblog pictures&lt;/a&gt; - still no blue sky&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-113726360594655929?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113726360594655929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113726360594655929'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/01/largest-hidden-gem-in-london.html' title='The largest hidden gem in London'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-20731736.post-113693758081172465</id><published>2006-01-10T23:58:00.000Z</published><updated>2006-01-21T16:41:29.900Z</updated><title type='text'>Do all programmers speak Sanskrit?</title><content type='html'>The most commented-on post in 2005 on Scot Adams's blog was &lt;a href="http://blogs.msdn.com/brada/archive/2005/01/24/359983.aspx"&gt;Do all programmers speak english?&lt;/a&gt;. I read this while setting up a Wiki for my company, thinking that &lt;b&gt;Wiki&lt;/b&gt; was the first word of Hawaiian I had learned.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Which got me to thinking about the derivation of words we programmers use. They mostly fall into two groups - classic adaptations and clever neologisms. Where, I thought, are the words borrowed from other languages, adapted for use in computing?&lt;br /&gt;&lt;p&gt;&lt;br /&gt;By classic adaptations, I mean someone has gone for a Latin or Greek root and used it for a new purpose. &lt;b&gt;Computer&lt;/b&gt;, to take an obvious one, comes from the Latin &lt;i&gt;computare&lt;/i&gt;, to reckon. &lt;b&gt;Program&lt;/b&gt; from the Greek &lt;i&gt;programma&lt;/i&gt; a proclamation.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Some words have a root in other languages. &lt;b&gt;Window&lt;/b&gt; is recorded in English in the early thirteenth century. Its first use in the sense of overlapping rectangles on a screen was in 1974. Whereas &lt;b&gt;Menu&lt;/b&gt; as a computing term was used in 1967, a mere 130 years after its first recorded use in English (from the French).&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The neologisms are where the fun starts. &lt;b&gt;Bit&lt;/b&gt; as a contraction of Binary Digit, then &lt;b&gt;Byte&lt;/b&gt; for eight bits, and so &lt;b&gt;Nybble&lt;/b&gt; for half a Byte. My favourites are &lt;b&gt;copyleft&lt;/b&gt; (as opposed to copyright), &lt;b&gt;marketecture&lt;/b&gt; (design elements for marketing it, not for using it) and &lt;b&gt;outernet&lt;/b&gt; (a.k.a. the real world).&lt;br /&gt;&lt;p&gt;&lt;br /&gt;But these words are inventions. Where are the borrowings? Where are the computing equivalents of boss (Dutch), tycoon (Japanese), guru (Sanskrit) or coach (Hungarian), all words we use but in the same sense as everyone else?&lt;br /&gt;&lt;p&gt;&lt;br /&gt;You could claim &lt;b&gt;Algorithm&lt;/b&gt;, which traces back to al-Khowarazmi, Arabic for the man from Khwarazm, meaning one Abu Ja'far Mohammed Ben Musa, a mathematician whose work on Algebra influenced the use of the Arabic number system in Europe. Or &lt;b&gt;Bot&lt;/b&gt;, a contraction of Robot, from a Czech word for forced labour, used by Karel Capek in his play &lt;i&gt;R.U.R.&lt;/i&gt; (1920). But both of these had a life in English before computing adopted them.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;One I can find is &lt;b&gt;Kludge&lt;/b&gt;, which was first used in 1962 as "an ill-assorted collection of poorly-matching parts, forming a distressing whole", yet comes from the German word &lt;i&gt;Kluge&lt;/i&gt;, originally meaning smart or witty, according to the Oxford English Dictionary (CD-Rom, 1992, still runs on my wife's computer, can't install it on my computer as I have no 3.5" floppy drive). Or, from the Scots &lt;i&gt;kludge&lt;/i&gt; or &lt;i&gt;kludgie&lt;/i&gt; for a common toilet, according to the &lt;a href="http://ursine.ca/Kludge"&gt;Jargon Wiki&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The second, to go with boss, tycoon etc, is &lt;b&gt;Kahuna&lt;/b&gt;, which is Hawaiian for shaman, and shows that Wiki was actually my second word in that language.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Any one got any more?&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Meanwhile, I've found a word for the naming of classes by joining nouns together, such as TextBox or ToolBarButtonCollection. Henceforth, this is to be known as the Tatpurusha Class Naming Convention, borrowing the word &lt;b&gt;Tatpurusha&lt;/b&gt; which comes from the Sanskrit for &lt;i&gt;his servant&lt;/i&gt; and is therefore itself a tatpurusha word. Currently Googling for &lt;a href="http://www.google.com/search?q=%22tatpurusha+class%22"&gt;"tatpurusha class"&lt;/a&gt; returns no hits, but it is only a matter of time.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;That's it. Forgive me for being such a geek (U.S Slang from 1916), an anorak (Greenland Eskimo, 1934) and a nerd (made up by Dr Seuss, 1950, probably).&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20731736-113693758081172465?l=blog.bitwix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113693758081172465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20731736/posts/default/113693758081172465'/><link rel='alternate' type='text/html' href='http://blog.bitwix.com/2006/01/do-all-programmers-speak-sanskrit.html' title='Do all programmers speak Sanskrit?'/><author><name>bitwix</name><uri>http://www.blogger.com/profile/02334562757872872172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://bp3.blogger.com/_JQSe5r0tmqs/SD5cgvuBcUI/AAAAAAAAAAM/c2TQrdhbvxM/S220/Bitwix114x100.jpg'/></author></entry></feed>
