<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0UBRno4cCp7ImA9WhRaFE0.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003</id><updated>2012-02-16T14:07:37.438Z</updated><category term="SOLID" /><category term="Ubiquity XForms" /><category term="Twitter" /><category term="talk to the duck" /><category term="DevDays" /><category term="design patterns" /><category term="javascript" /><category term="Pomodoro Technique" /><category term="static analysis" /><category term="debugging" /><category term="books" /><category term="The Art of Agile Development" /><category term="Hubbub" /><category term="unit tests" /><category term="single responsibility principle" /><category term="games" /><category term="FriendFeed" /><category term="small teams" /><category term="UBX" /><category term="XForms DZ" /><category term="workspace" /><category term="Refactoring" /><category term="Visual Studio Add-In" /><category term="C++" /><category term="C#" /><category term="Gang of Four" /><category term="big visible charts" /><category term="Ruby" /><category term="oo" /><category term="software craftsmanship" /><category term="Stack Overflow" /><category term="Safari" /><category term="link" /><category term="article" /><category term="The Pragmatic Programmer" /><category term="User Control" /><category term="iteration plans" /><category term="procrastination" /><category term="test-driven development" /><category term="Clean Code" /><category term="const_cast" /><category term="coding marathon" /><category term="IE8 ten grand" /><category term="conferences" /><category term="extreme programming" /><category term="XForms" /><category term=".NET" /><category term="Pragmatic Thinking and Learning" /><title>Existing by coincidence, programming deliberately</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://phil-booth.blogspot.com/" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/phil-booth" /><feedburner:info uri="phil-booth" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D08ARH06fip7ImA9Wx9SEU8.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4979178687667799067</id><published>2010-11-30T13:52:00.004Z</published><updated>2010-11-30T14:04:05.316Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-30T14:04:05.316Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="procrastination" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Pomodoro Technique" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio Add-In" /><title>An integrated pomodoro timer for Visual Studio</title><content type="html">&lt;p&gt;As part of my &lt;a href="http://phil-booth.blogspot.com/2009/01/iteration-plans-my-antidote-to.html"&gt;ongoing fight against procrastination&lt;/a&gt;, I recently started using &lt;a href="http://www.pomodorotechnique.com/"&gt;the Pomodoro Technique&lt;/a&gt; to help me focus on the job at hand.&lt;/p&gt;&lt;p&gt;For anyone unfamiliar with it, the Pomodoro Technique is a time management practice invented by &lt;a href="http://www.francescocirillo.com/fc.html"&gt;Francesco Cirillo&lt;/a&gt; while he was a student in the late 1980s. It works by dividing a day into a series of focused 25-minute slices, called &lt;em&gt;pomodoros&lt;/em&gt;, broken up by short breaks away from work.&lt;/p&gt;&lt;p&gt;The beginning of the day is given over to planning which tasks are to be accomplished, resulting in a prioritised list. Then, pomodoros are used to progress through the list of tasks in order, working as many pomodoros as necessary to complete each task. When a pomodoro finishes, a mark is placed next to the relevant item from the list, so that the time spent on each task can easily be tracked.&lt;/p&gt;&lt;p&gt;Pomodoros are indivisible, so interruptions are not allowed. If an interruption does occur, that pomodoro is declared void and the timer is reset. Equally, completing a task 'early' results in the remaining time being spent on &lt;em&gt;overlearning&lt;/em&gt;; either reviewing, repeating or improving whatever has just been done.&lt;/p&gt;&lt;p&gt;One of the requirements of the technique is that the timer is always visible. Because most of my work occurs in Microsoft Visual Studio, I thought it would be useful to have an integrated pomodoro timer that runs in a docked Visual Studio tool window. As well as making it easy to glance at while coding, such a timer would also enable a visual alarm to be used, thus sparing the concentration of co-workers who might not appreciate a bell or buzzer sounding off every 25 minutes or so.&lt;/p&gt;&lt;img src="http://lh3.ggpht.com/_-nhm-H0WNtc/TPT_ULkuORI/AAAAAAAADog/SZCccKCNPJE/s800/pomodoro.png" alt="Screenshot of VSPomodoro" title="" /&gt;&lt;p&gt;To that end, I've built &lt;em&gt;VSPomodoro&lt;/em&gt;, an integrated pomodoro timer for Visual Studio. It is a very basic little add-in, but I've &lt;a href="https://github.com/philbooth/VSPomodoro"&gt;pushed it up to GitHub&lt;/a&gt; in case anyone else is interested. I've also &lt;a href="https://github.com/philbooth/VSPomodoro/archives/master"&gt;made an installer available&lt;/a&gt; for those people that are interested in using it without looking at the code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4979178687667799067?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5jgDtFHRxH5kaOuR4mAEjoLbbcQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5jgDtFHRxH5kaOuR4mAEjoLbbcQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5jgDtFHRxH5kaOuR4mAEjoLbbcQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5jgDtFHRxH5kaOuR4mAEjoLbbcQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/yObkHA70G7U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4979178687667799067/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2010/11/integrated-pomodoro-timer-for-visual.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4979178687667799067?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4979178687667799067?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/yObkHA70G7U/integrated-pomodoro-timer-for-visual.html" title="An integrated pomodoro timer for Visual Studio" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_-nhm-H0WNtc/TPT_ULkuORI/AAAAAAAADog/SZCccKCNPJE/s72-c/pomodoro.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2010/11/integrated-pomodoro-timer-for-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUHSHo-cCp7ImA9Wx5WEkQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-6511562137361915935</id><published>2010-07-13T11:08:00.009+01:00</published><updated>2010-09-24T02:03:59.458+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-24T02:03:59.458+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="User Control" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>An intuitive, editable .NET ListBox control</title><content type="html">&lt;p&gt;For a recent C# side-project, I found myself wanting to use an editable &lt;code&gt;ListBox&lt;/code&gt; control, with intuitive keyboard shortcuts for rapid data-entry. The model I had in mind was similar in appearance to the &lt;code&gt;VC++ Directories&lt;/code&gt; pane in Visual Studio's &lt;code&gt;Options&lt;/code&gt; dialog, adding support for &lt;code&gt;Tab&lt;/code&gt; and &lt;code&gt;Shift+Tab&lt;/code&gt; navigation between items in the list. Trawling round the web, I found plenty of candidates for re-use, but none of them really had the look and feel I was after. So I took the opportunity to educate myself about .NET User Controls and started work on a new side-side-project.&lt;/p&gt;&lt;p&gt;As it turns out, implementing a basic User Control is pleasingly simple. Visual Studio has a wizard that generates the boilerplate code and from there it is straightforward to use the design view to position any constituent parts in much the same way as you would for a Windows Form. In the case of my &lt;code&gt;EditableListBox&lt;/code&gt;, those components were a normal &lt;code&gt;ListBox&lt;/code&gt;, a &lt;code&gt;TextBox&lt;/code&gt; to act as the edit field and some &lt;code&gt;Button&lt;/code&gt; instances to enable user-invoked sorting, ordering, addition and removal of items. I took the icons for the buttons from &lt;a href="http://en.wikipedia.org/wiki/Everaldo_Coelho"&gt;Everaldo Coelho&lt;/a&gt;'s &lt;a href="http://everaldo.com/crystal/"&gt;Crystal icons project&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/0qrRm9UKsWtH-sXto1MVZOlQzDPbPhRUDkprCwcr8bQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_-nhm-H0WNtc/TDuq5Ni0O0I/AAAAAAAAC1k/NonM40QktJY/s400/EditableListBox_design.png" alt="My EditableListBox in Visual Studio's design view" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The next step was to add appropriate keyboard event handlers so that the control presented the smooth data-entry experience that I envisaged. I opted to display the edit field in place over an item when that item is double-clicked, or when &lt;code&gt;Enter&lt;/code&gt; or &lt;code&gt;Space&lt;/code&gt; are pressed and the item is selected. &lt;code&gt;Tab&lt;/code&gt; and &lt;code&gt;Shift+Tab&lt;/code&gt; can then be used to navigate through the listed items, confirming any changes that are made, whereas the up and down cursor keys perform similarly, but will discard changes. The editing mode can be left by pressing &lt;code&gt;Enter&lt;/code&gt;, to confirm changes, or &lt;code&gt;Escape&lt;/code&gt;, which discards changes.&lt;/p&gt;&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/0ug4LoaH-V6FH4FpWKK4WOlQzDPbPhRUDkprCwcr8bQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_-nhm-H0WNtc/TDuq5QFSleI/AAAAAAAAC1o/i7zXp1K7t3s/s400/EditableListBox_source.png" alt="The source code for the main key event handler" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Event handlers were also added for each of the buttons, so that the control could be operated with the mouse as it could with the keyboard. The most noteworthy of these was the sort button, which actually led to two different sorting algorithms being implemented. When the button is pressed, a &lt;a href="http://en.wikipedia.org/wiki/Quicksort"&gt;quicksort&lt;/a&gt; is used to order the items with typical &lt;em&gt;O (n log n)&lt;/em&gt; performance. However, when a new item is added to an already sorted list, it is only necessary to &lt;a href="http://en.wikipedia.org/wiki/Bubble_sort"&gt;bubble&lt;/a&gt; that item up or down to its correct position.&lt;/p&gt;&lt;p&gt;With the event handlers in place, all that remained was to expose a set of public properties from the control, so that end-users could customise its appearance and behaviour to match their requirements.&lt;/p&gt;&lt;p&gt;For anyone interested in looking at or re-using the source code, &lt;a href="http://github.com/philbooth/PBCtrl"&gt;I've pushed the source up to GitHub&lt;/a&gt; under an &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;MIT license&lt;/a&gt;. I've also &lt;a href="http://github.com/philbooth/PBCtrl/downloads"&gt;uploaded a built DLL&lt;/a&gt; containing the control, for anyone that simply wants to re-use it in their own project &lt;em&gt;verbatim&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/xE2mWtOpllZ0yQ19E3XiCOlQzDPbPhRUDkprCwcr8bQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_-nhm-H0WNtc/TDuq5d-UmpI/AAAAAAAAC1s/ac26_YePgz4/s800/EditableListBox_test.png" alt="A screenshot of my EditableListBox running in its test stub" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-6511562137361915935?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yoNAMACJeKnEhVuB_Ik3iwEmlJ0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yoNAMACJeKnEhVuB_Ik3iwEmlJ0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yoNAMACJeKnEhVuB_Ik3iwEmlJ0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yoNAMACJeKnEhVuB_Ik3iwEmlJ0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/6cvDIJMXwxM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/6511562137361915935/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2010/07/intuitive-editable-net-listbox-control.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/6511562137361915935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/6511562137361915935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/6cvDIJMXwxM/intuitive-editable-net-listbox-control.html" title="An intuitive, editable .NET ListBox control" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_-nhm-H0WNtc/TDuq5Ni0O0I/AAAAAAAAC1k/NonM40QktJY/s72-c/EditableListBox_design.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2010/07/intuitive-editable-net-listbox-control.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMAQHszfip7ImA9Wx5WFk8.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-1493500730417161177</id><published>2010-02-24T12:39:00.004Z</published><updated>2010-09-27T23:27:21.586+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-27T23:27:21.586+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Gang of Four" /><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="oo" /><category scheme="http://www.blogger.com/atom/ns#" term="SOLID" /><title>An anti-pattern rant</title><content type="html">&lt;p&gt;This post is not &lt;em&gt;about&lt;/em&gt; &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern"&gt;anti-patterns&lt;/a&gt;, rather it &lt;em&gt;is itself&lt;/em&gt; anti-&lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;pattern&lt;/a&gt;. I am railing against the ubiquity of patterns because I believe that, in many cases, their fundamental message has become lost in the midst of an unthinking, cultish devotion to the "patternal" (to coin a phrase) doctrine.&lt;/p&gt;&lt;p&gt;First, a couple of anecdotal items to illustrate where I'm coming from.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ITEM:&lt;/strong&gt; Recently, I attended a job interview. During the interview, I was asked about design patterns and the &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;GoF book&lt;/a&gt;. Yet at no point was I asked about the wider topic of object-oriented design in general.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ITEM:&lt;/strong&gt; In a previous job, I worked under a technical lead who consistently exhorted his minions to consult the GoF for every design decision under the sun. Not once was discussion initiated from a standpoint of the &lt;em&gt;principles&lt;/em&gt; of good design.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Okay, so this is nothing like a statistically significant sample of the programming universe, I know. But equally, conversations with my peers suggest that these are not uncommon phenomena.&lt;/p&gt;&lt;p&gt;So what is the problem, exactly? The problem, as I see it, is akin to one of stalled &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Shuhari"&gt;shu-ha-ri&lt;/a&gt;&lt;/em&gt;. The GoF book has been very successful at encouraging developers to consider the implications of their design choices. It contains concrete implementation details, which make it easy for developers to apply each pattern. But that very ease of application has also, I suspect, stymied deeper thought for many developers about the underlying justifications for patterns. In particular, I think that some programmers develop blind spots around the edges of the patterns that they apply to their code.&lt;/p&gt;&lt;p&gt;I've seen a number of cases where patterns from the GoF have been applied inappropriately. The best of these cases merely introduced unnecessary complexity. The worst cases actually led to serious issues of rigidity, fragility and immobility in the surrounding code. Clearly patterns are not a panacea, yet I've seen them used that way, as if by rote. Of course, this reflects a failing of the developer(s) concerned in each case, not a failing on the part of the GoF. But my concern is that the GoF patterns make traps like these easy to fall into.&lt;/p&gt;&lt;p&gt;Patterns are (or should be) a means to an end, not an end in and of themselves. Instead the end should be a design that is flexible, robust and reusable. Perhaps that sounds easier said than done, but it is the natural consequence of adhering to the five SOLID &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;principles of object-oriented design&lt;/a&gt;, collectively popularised by &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Uncle Bob&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In a recent, unscientific straw poll of eleven of my peers, only two of us were familiar with the SOLID principles, yet all eleven were familiar with the GoF book. This state of affairs worries me greatly.&lt;/p&gt;&lt;p&gt;Briefly, the five SOLID principles are as follows.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;Single responsibility principle&lt;/a&gt;: Every class should have exactly one reason to change.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/ocp.pdf"&gt;Open-closed principle&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Bertrand_Meyer"&gt;Bertrand Meyer&lt;/a&gt;'s paradigm-defining assertion that classes "should be open for extension, but closed for modification". That is to say, new behaviour can be added to a class without needing to modify it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/lsp.pdf"&gt;Liskov substitution principle&lt;/a&gt;: Derived classes must be substitutable for their base classes. Everything that is true of a base class must also be true of its derived classes.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/isp.pdf"&gt;Interface segregation principle&lt;/a&gt;: Classes should provide separate interfaces, according to the sets of methods that are required by their clients or client groups.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/dip.pdf"&gt;Dependency inversion principle&lt;/a&gt;: Dependencies should be on abstract interfaces, rather than on concrete implementations.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These are the principles that underpin all good object-oriented design, including the patterns in the GoF book. And it is these principles that should be a lingua franca in design discussions, regardless of the specific programming languages involved. Of course, the GoF patterns can and should still be used where they are suitable. But they should be used within a framework of understanding the design principles on which they are based.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-1493500730417161177?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5XCyllq89AmfdSVPRM-aapHRwy8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5XCyllq89AmfdSVPRM-aapHRwy8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5XCyllq89AmfdSVPRM-aapHRwy8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5XCyllq89AmfdSVPRM-aapHRwy8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/1GScjHBIoxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/1493500730417161177/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2010/02/anti-pattern-rant.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1493500730417161177?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1493500730417161177?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/1GScjHBIoxY/anti-pattern-rant.html" title="An anti-pattern rant" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2010/02/anti-pattern-rant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGQnw8eip7ImA9WxBRF0U.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-7850986216138327638</id><published>2010-01-06T13:36:00.000Z</published><updated>2010-01-06T13:40:23.272Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-06T13:40:23.272Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="test-driven development" /><title>Improving TDD with one assertion per test</title><content type="html">&lt;p&gt;A nagging problem that I continue to suffer from when practising TDD is the urge to take bigger steps at each turn of the cycle. It's a problematic itch because, when scratched, it leads to longer periods coding with a red bar. In my experience, coding against a red bar is like leaving the lid off a &lt;a href="http://en.wikipedia.org/wiki/Petri_dish"&gt;petri dish&lt;/a&gt;: bugs grow there. When smaller steps are taken, the lid is off the petri dish for a shorter time and bugs have less opportunity to develop.&lt;/p&gt;&lt;p&gt;Recently, in an effort to address this issue explicitly, I started restricting my unit tests to a single assertion each. It is not an original idea, although I'm not sure where the proper credit for it lies (I first saw it mentioned in &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=35578"&gt;this old post by Dave Astels&lt;/a&gt;). I've dabbled with the technique before but, for whatever reason, I was unconvinced at the time. However, I've now come to realise that it may be the best weapon I have against the aforementioned itch.&lt;/p&gt;&lt;p&gt;Typically, when I'm writing the test for some planned feature, part of my brain seems to rapidly announce a list of all the conditions that must be tested in order for that feature to be done. Followed to their natural conclusion, these thoughts lead to a unit test that appears comprehensive but looks messy. There are echoes of &lt;a href="http://c2.com/xp/BigDesignUpFront.html"&gt;BDUF&lt;/a&gt; here, I think, in the eagerness to get every permutation written down &lt;em&gt;right now&lt;/em&gt;, almost OCD-like.&lt;/p&gt;&lt;p&gt;By limiting myself to just one assertion per unit test, I'm forced to ignore all but the simplest of these conditions, which can feel frustrating at first. Yet it has the precise effect of minimising the time spent with a red bar, usually to under a minute. The remaining conditions are dealt with by subsequent unit tests and suddenly I find myself hitting that very tight red-green-refactor rhythm, which tells me that I'm practising TDD how the books say I should.&lt;/p&gt;&lt;p&gt;There is another benefit to using this method too. I've discussed the issue of &lt;a href="http://phil-booth.blogspot.com/2009/04/clean-unit-tests.html"&gt;clean unit tests&lt;/a&gt; before and I'm always concerned that my own are not as clean as they should be. With only a single assertion, though, I've thus far found it impossible to write a messy unit test.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-7850986216138327638?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FgbT35F43z0DRtfo118eFBLDiE0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FgbT35F43z0DRtfo118eFBLDiE0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FgbT35F43z0DRtfo118eFBLDiE0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FgbT35F43z0DRtfo118eFBLDiE0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/-qfrZYZ_nCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/7850986216138327638/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2010/01/improving-tdd-with-one-assertion-per.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/7850986216138327638?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/7850986216138327638?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/-qfrZYZ_nCk/improving-tdd-with-one-assertion-per.html" title="Improving TDD with one assertion per test" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2010/01/improving-tdd-with-one-assertion-per.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MAQnY5eSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-660143364744754443</id><published>2009-10-30T18:49:00.005Z</published><updated>2009-12-15T17:50:43.821Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:50:43.821Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DevDays" /><category scheme="http://www.blogger.com/atom/ns#" term="Stack Overflow" /><category scheme="http://www.blogger.com/atom/ns#" term="conferences" /><title>My take on the Stack Overflow DevDays</title><content type="html">&lt;p&gt;On Wednesday, I attended the &lt;a href="http://stackoverflow.carsonified.com/events/london/"&gt;London leg&lt;/a&gt; of the &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; &lt;a href="http://stackoverflow.carsonified.com/"&gt;DevDays&lt;/a&gt;. Conferences are normally way out of my league, financially, but at a relatively cheap £85, this was my first chance to spend a day at one.&lt;/p&gt;&lt;p&gt;&lt;a href="http://carsonified.com/"&gt;Carsonified&lt;/a&gt;, the event organisers, did a really great job setting up the venue. The wireless was near faultless and there were plenty of power sockets to run laptops from. Twitter apps encouraging social interaction among the audience were also a neat touch.&lt;/p&gt;&lt;p&gt;It felt like there were a lot of speeches crammed into the day, kicked off by &lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt;'s excellent and thoroughly engaging keynote. Of the others, these are the ones that I found most interesting:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/users/116112/michael-sparks"&gt;Michael Sparks&lt;/a&gt; analysed the &lt;a href="http://norvig.com/spell-correct.html"&gt;source code&lt;/a&gt; for a spellchecker, written in just 21 lines of &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; by Google's &lt;a href="http://norvig.com/"&gt;Peter Norvig&lt;/a&gt;. From a technical perspective, this was an excellent speech, walking through the source and building up a mental model of how powerful Python can be.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/users/822/reto-meier"&gt;Reto Meier&lt;/a&gt;'s introduction to &lt;a href="http://code.google.com/android"&gt;Android&lt;/a&gt; development probably captured my imagination more than anything else. He was quite explicit about contrasting Google's openness with Android against Apple's paranoid control-freakery with the iPhone, which was a pretty astute pitch to a hall full of developers. And having the JVM at the core of everything just sweetened the pill even further, when compared to Objective-C (of which more in a bit). It got me tossing around some ideas for an Android side-project, written in &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Next up was &lt;a href="http://stackoverflow.com/users/22617/remy-sharp"&gt;Remy Sharp&lt;/a&gt;'s talk on &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. I got the impression that 90% of the audience found this one quite tedious because it was aimed at jQuery novices. But that suited me perfectly and I found it to be a great introduction. It also helped that Remy is clearly a very accomplished public speaker.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/users/32136/phil-nash"&gt;Phil Nash&lt;/a&gt; presented an iPhone development jump-start. It was another good speech and quite a persuasive argument for investing the time to learn &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html"&gt;Objective-C&lt;/a&gt;, but... Objective-C. I mean, what's &lt;em&gt;with&lt;/em&gt; that language? It just seems wilfully awkward. Separate labelling and naming of arguments, for instance; did somebody &lt;em&gt;really&lt;/em&gt; think that was a good idea? Suffice to say, Clojure/Android seems way more attractive to me at the moment.&lt;/li&gt;
&lt;li&gt;Pekka Kosonen delivered a fairly high-level overview of &lt;a href="http://qt.nokia.com/products"&gt;Qt&lt;/a&gt;. I first looked at Qt three or four years ago, while evaluating cross-platform C++ libraries. Unfortunately, the GPL restriction on the free version turned me right off, so I chose &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt; instead. That was a shame, because Qt's signals and slots architecture sounds cool. Anyway, since buying Trolltech, it appears that Nokia have relaxed the GPL restriction, so I may come back to Qt next time I need to work in C++. It looks like Nokia's intention is to leverage Qt to muscle in on the developer space that Apple has carved out with the iPhone and Google is now angling for with Android. I wish them luck, but I can't see it happening somehow.&lt;/li&gt;
&lt;li&gt;Last up, Christian Heilmann delivered an interesting overview of &lt;a href="http://developer.yahoo.com/"&gt;Yahoo!'s developer tools&lt;/a&gt;. I'm already familiar with &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; because it is at the core of &lt;a href="http://code.google.com/p/ubiquity-xforms/"&gt;Ubiquity XForms&lt;/a&gt; but, of the others, &lt;a href="http://developer.yahoo.com/yql/"&gt;YQL&lt;/a&gt; seemed especially interesting. I thought it was a bit of a shame that Christian's talk was at the very end of the day, because the audience were visibly tiring by that point.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All in all, it was a good day and definitely worth the entrance fee.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-660143364744754443?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FEfLgSkmBmdQ8cVsg2BhPKEcr8c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FEfLgSkmBmdQ8cVsg2BhPKEcr8c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FEfLgSkmBmdQ8cVsg2BhPKEcr8c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FEfLgSkmBmdQ8cVsg2BhPKEcr8c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/AFXHhsI41Xw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/660143364744754443/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/10/my-take-on-stack-overflow-devdays.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/660143364744754443?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/660143364744754443?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/AFXHhsI41Xw/my-take-on-stack-overflow-devdays.html" title="My take on the Stack Overflow DevDays" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/10/my-take-on-stack-overflow-devdays.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YDR3g_fCp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-1214710143363411060</id><published>2009-09-25T08:11:00.006+01:00</published><updated>2009-12-15T17:46:16.644Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:46:16.644Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Safari" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><title>Five wishes for the javascript debugger in Safari</title><content type="html">&lt;p&gt;This week, I played around with the javascript debugger in Safari 4, as I started &lt;a href="http://webbackplane.com/phil-booth/blog/2009/09/23/countdown-safari"&gt;adding Safari support to Ubiquity XForms&lt;/a&gt;. Until now, all of my javascript-based work had been targeted at Internet Explorer and/or Firefox, so I had no prior experience with &lt;a href="http://trac.webkit.org/wiki/Drosera"&gt;Drosera&lt;/a&gt;. From experience debugging javascript in those other two, though, my feelings about what is a pretty significant part of modern software development were mixed at best.&lt;/p&gt;&lt;p&gt;There were some early hiccups, predictably enough, but I was quickly impressed by what Safari offered. The UI looked slick and it ran very reliably. Overall, my impression was of a very solid debugger, so kudos to everyone involved for that.&lt;/p&gt;&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/yMvWrwn2u0S1G9AOYCh1zw?authkey=Gv1sRgCMbm6YjJy-vu_AE&amp;feat=directlink"&gt;&lt;img src="http://lh4.ggpht.com/_-nhm-H0WNtc/Srtc5gO2bnI/AAAAAAAABqY/fMM2Emz3Lls/s400/safari-js-debug.jpg" alt="Screenshot of javascript debugging in Safari 4" title="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;However, I was also left with a sense that, if only a few more crucial features had been implemented, the whole thing would be genuinely industrial-strength excellent. That feeling led to this blog post, so here, ladies and gentlemen of the internet, are my five wishes for the javascript debugger in Safari:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;My biggest gripe at the moment is that changes to my scripts are not loaded when I refresh the page in the browser. I assume this is probably down to something in WebKit itself, but when debugging it is a major pain to have to close and re-open the entire browser, just to debug with some modified code.&lt;/li&gt;&lt;li&gt;Hot keys for important actions like 'step over', 'step into' and 'step out of' would be a massive bonus. When debugging large applications, it can take some time to zero in on problem areas. On every occasion that my fingers have to leave the keyboard, just to step to the next statement, that time is increased.&lt;/li&gt;&lt;li&gt;Making the console window update calculated values dynamically would also be a huge time-saver. Round about the third or fourth time that I have to paste the same variable name into that window, just to see its current value, it gets quite tedious. Alternatively, a dedicated watch window, separate from the console output, would be just as good.&lt;/li&gt;&lt;li&gt;Tooltips for certain items like variable names, showing the current value, or breakpoints, showing the current hit count. That would be sweet.&lt;/li&gt;&lt;li&gt;And if that little lot got finished, then it would be really nice if the code view were actually a code editor, so I didn't have to Alt+Tab to a separate window to make changes. This would be especially great because the dropdown list of currently loaded scripts is way cool and I really, really want it in my editor.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: So, I've just discovered that you can use the cursor keys for shell-style scrolling through the command history in the console window. You can also use them to auto-complete the names of objects, properties and methods. These go a long way to assuaging my pain from #3, although the dynamic update of values / dedicated watch window would still be very nice to have.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-1214710143363411060?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NbY4GHZ2ZuM_3k3KGS8hXrvXEFA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NbY4GHZ2ZuM_3k3KGS8hXrvXEFA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NbY4GHZ2ZuM_3k3KGS8hXrvXEFA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NbY4GHZ2ZuM_3k3KGS8hXrvXEFA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/PO8aIV7uLjQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/1214710143363411060/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/09/five-wishes-for-javascript-debugger-in.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1214710143363411060?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1214710143363411060?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/PO8aIV7uLjQ/five-wishes-for-javascript-debugger-in.html" title="Five wishes for the javascript debugger in Safari" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_-nhm-H0WNtc/Srtc5gO2bnI/AAAAAAAABqY/fMM2Emz3Lls/s72-c/safari-js-debug.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/09/five-wishes-for-javascript-debugger-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cEQX44fCp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4921673481384446988</id><published>2009-09-15T18:46:00.002+01:00</published><updated>2009-12-15T17:43:20.034Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:43:20.034Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XForms DZ" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubiquity XForms" /><title>The XForms Developer Zone</title><content type="html">&lt;p&gt;Well I've not been around these parts much of late, but it is good to see that the old blog is still standing. Now seems like a fine time to blow off the cobwebs that have gathered around this place and post some news about what's been keeping me so busy.&lt;/p&gt;&lt;p&gt;Over at &lt;a href="http://webbackplane.com/"&gt;Backplane&lt;/a&gt;, we've dedicated a significant portion of the last few months to improving &lt;a href="http://code.google.com/p/ubiquity-xforms"&gt;Ubiquity XForms&lt;/a&gt;, the open-source project that we're developing jointly with &lt;a href="http://www.ibm.com"&gt;IBM&lt;/a&gt;. Going hand-in-hand with this work has been the creation of a new XForms community resource, the &lt;a href="http://xformsdz.org"&gt;XForms Developer Zone&lt;/a&gt;. The vision for &lt;code&gt;&amp;lt;xforms:dz&amp;gt;&lt;/code&gt; is a community-driven site for anything and everything XForms-related. Developers and users of all XForms processors are welcome, in fact they (and you) are positively encouraged to sign up and contribute.&lt;/p&gt;&lt;p&gt;As it is only the first day of the new site's life, content is still quite thin on the ground right now, but we're aiming to add new articles thick and fast. Already on there, amongst other items, is a tutorial by yours truly that demonstrates &lt;a href="http://xformsdz.org/article/2009/09/easy-map-controls-ubiquity-xforms"&gt;how Ubiquity XForms and Google Maps can be combined to easily add powerful map controls to your web pages&lt;/a&gt;. And looking forward, we're excited about plenty of other Ubiquity XForms articles that we have in the pipeline, not to mention even more content about the likes of &lt;a href="http://www.chiba-project.org:8080/chiba"&gt;Chiba&lt;/a&gt;, &lt;a href="http://code.google.com/p/ubiquity-formsplayer"&gt;formsPlayer&lt;/a&gt;, &lt;a href="http://www.orbeon.com/"&gt;Orbeon&lt;/a&gt;, &lt;a href="http://www.agencexml.com/xsltforms"&gt;XSLTForms&lt;/a&gt; and &lt;a href="http://www.w3.org/TR/xforms11/"&gt;XForms&lt;/a&gt; in general.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4921673481384446988?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/B8kSAAzLm68tx4FIMGIqcNrXgYg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B8kSAAzLm68tx4FIMGIqcNrXgYg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/B8kSAAzLm68tx4FIMGIqcNrXgYg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B8kSAAzLm68tx4FIMGIqcNrXgYg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/NEVA8gnpItI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4921673481384446988/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/09/xforms-developer-zone.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4921673481384446988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4921673481384446988?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/NEVA8gnpItI/xforms-developer-zone.html" title="The XForms Developer Zone" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/09/xforms-developer-zone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIAQHc7eyp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-5777626230860010887</id><published>2009-06-22T09:34:00.017+01:00</published><updated>2009-12-15T17:35:41.903Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:35:41.903Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IE8 ten grand" /><title>That IE8 ten grand thing, clue #4 (b)</title><content type="html">&lt;p&gt;So, &lt;a href="http://twitter.com/Tengrand_IE8"&gt;@Tengrand_IE8&lt;/a&gt; just tweeted again, yet it seems too early for the next clue to me, even when the time difference to Australia is factored in. Is this a new clue? Or another part of today's clue?&lt;/p&gt;&lt;p&gt;The clue is a link to &lt;a href="http://twitpic.com/835jr"&gt;an image&lt;/a&gt;, showing parts of the Canadian province of Saskatchewan and the American states of Montana and North Dakota. Featuring quite prominently is the Canadian city of Regina. &lt;em&gt;Regina&lt;/em&gt; is the latin word for 'queen'. Is that what this clue is getting at?&lt;/p&gt;&lt;p&gt;If we then run with &lt;a href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4.html?showComment=1245654176586#c6299602079192515043"&gt;ENKC's Oscar Wilde idea&lt;/a&gt; about today's earlier clue, &lt;a href="http://www.echeat.com/essay.php?t=33998"&gt;it seems&lt;/a&gt; that &lt;em&gt;The Importance of Being Earnest&lt;/em&gt; was part satire on the reign of Queen Victoria. So my gut is telling me that the first part of today's clue identifies Wilde's play and the second part identifies Queen Vic. &lt;a href="http://en.wikipedia.org/wiki/Victoria_%28Australia%29"&gt;Victoria is also a state in Australia&lt;/a&gt;, where Microsoft are running the competition. It all seems to fit together rather nicely, pointing at 'Victoria' as today's answer. Or am I seeing patterns where none exist?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-5777626230860010887?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/u5GKe-W9EzuzxketzyKrIO7iHTA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u5GKe-W9EzuzxketzyKrIO7iHTA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u5GKe-W9EzuzxketzyKrIO7iHTA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u5GKe-W9EzuzxketzyKrIO7iHTA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/cEOq4-YJdBE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/5777626230860010887/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4-b.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/5777626230860010887?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/5777626230860010887?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/cEOq4-YJdBE/that-ie8-ten-grand-thing-clue-4-b.html" title="That IE8 ten grand thing, clue #4 (b)" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>11</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4-b.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQNSHYzcSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-3409445332758443781</id><published>2009-06-22T07:24:00.011+01:00</published><updated>2009-12-15T17:33:19.889Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:33:19.889Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IE8 ten grand" /><title>That IE8 ten grand thing, clue #4</title><content type="html">&lt;p&gt;Clue #4: &lt;a href="http://twitter.com/Tengrand_IE8/status/2272452918"&gt;"New clue: a predatory fish being earnest"&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What strikes me first is the presence of the text "new clue". None of the other clues had that. Is it part of the clue?&lt;/p&gt;&lt;p&gt;A predatory fish. Shark? Piranha? Barracuda?&lt;/p&gt;&lt;p&gt;Synonyms for earnest: grave; humourless; no-nonsense; sedate; serious; severe; sober; solemn; staid; uncomic; unfunny; unsmiling; weighty.&lt;/p&gt;&lt;p&gt;I shall ponder it some more on my journey to work.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: &lt;a href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4.html?showComment=1245654176586#c6299602079192515043"&gt;EKNC made the inspired link&lt;/a&gt; from this clue to &lt;a href="http://en.wikipedia.org/wiki/Oscar_Wilde"&gt;Oscar Wilde&lt;/a&gt;'s &lt;em&gt;The Importance of Being Earnest&lt;/em&gt;, an &lt;em&gt;oscar&lt;/em&gt; being a species of predatory fish. That feels like a very good answer to me.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-3409445332758443781?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w5K9zQ0zh0eUK4sH83gRkjp_LmI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w5K9zQ0zh0eUK4sH83gRkjp_LmI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w5K9zQ0zh0eUK4sH83gRkjp_LmI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w5K9zQ0zh0eUK4sH83gRkjp_LmI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/RazSU6WYmPU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/3409445332758443781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/3409445332758443781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/3409445332758443781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/RazSU6WYmPU/that-ie8-ten-grand-thing-clue-4.html" title="That IE8 ten grand thing, clue #4" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUCQnwzeip7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-8679974996777937703</id><published>2009-06-21T09:36:00.010+01:00</published><updated>2009-12-15T17:31:03.282Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:31:03.282Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IE8 ten grand" /><title>That IE8 ten grand thing, clue #3</title><content type="html">&lt;p&gt;Hmmm. This one's a toughie. &lt;a href="http://twitter.com/Tengrand_IE8/status/2259642815"&gt;"You are now watching 370211931299"&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;At first my attention was drawn to the numbers. Three hundred and seventy billion, two hundred and eleven million, nine hundred and thirty one thousand, two hundred and ninety nine. It is a pretty big number, seems too big to be significant in and of itself. It is not prime. The constituent digits sum to 47. In hexadecimal it is 563259c4a3. I'm making approximately zero progress here, anyone else have thoughts on it?&lt;/p&gt;&lt;p&gt;After failing with the numbers, I decided to fail with the words instead. Why &lt;em&gt;now&lt;/em&gt;? Why &lt;em&gt;watching&lt;/em&gt;? What do each of those four words mean, decomposed, in isolation? I'm completely stumped right now, so I shall let my r-mode do its thing in the background while I teach myself &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: It turns out that I was being way too analytical on this one; &lt;a href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-3.html?showComment=1245579114626#c5824900565344752860"&gt;'Anonymous' has quite brilliantly pointed out&lt;/a&gt; that the clue refers to an item on eBay, &lt;a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;amp;item=370211931299&amp;amp;ru=http%3A%2F%2Fshop.ebay.com%3A80%2F%3F_from%3DR40%26_trksid%3Dp3907.m38.l1313%26_nkw%3D370211931299%26_sacat%3DSee-All-Categories%26_fvi%3D1&amp;amp;_rdc=1"&gt;item #370211931299&lt;/a&gt;. 'You are now watching' is the part that was meant to get you to eBay, it is the phrase displayed when you watch an item. So my hunch is that the answer to this clue is title of the book: "Buried Treasures You Can Find". But more context is needed, roll on the next clue!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-8679974996777937703?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sCpLynh4CiSaXgU9wc6h1oC5Xsc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sCpLynh4CiSaXgU9wc6h1oC5Xsc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sCpLynh4CiSaXgU9wc6h1oC5Xsc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sCpLynh4CiSaXgU9wc6h1oC5Xsc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/MX5ctoVJPwQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/8679974996777937703/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-3.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/8679974996777937703?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/8679974996777937703?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/MX5ctoVJPwQ/that-ie8-ten-grand-thing-clue-3.html" title="That IE8 ten grand thing, clue #3" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYCSHc-eSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-8158609158275627576</id><published>2009-06-20T09:33:00.007+01:00</published><updated>2009-12-15T17:29:29.951Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:29:29.951Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IE8 ten grand" /><title>That IE8 ten grand thing, clue #2</title><content type="html">&lt;p&gt;Morning, internet. Today should be all about a gentle recovery from my obligatory Saturday morning hangover. But, with it being a &lt;a href="http://www.lionsrugby.com/"&gt;Lions&lt;/a&gt; year, a gentle recovery is not really an option. It is the first test match today, so it's all about the hair of &lt;a href="http://www.fullers.co.uk/rte.asp?id=48"&gt;the dog that bit me&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Second clue is up. Can I be bothered? Not really sure. &lt;a href="http://twitter.com/Tengrand_IE8/status/2247291048"&gt;"FbWiFnRg"&lt;/a&gt;. In spite of my fuzzy head, the presence of Microsoft's &lt;a href="http://www.bing.com/"&gt;bing&lt;/a&gt; in there seems obvious. It is interspersed with the letters F-W-F-R, which, according to bing, is a &lt;a href="http://www.fwfr.com/"&gt;four-word film review&lt;/a&gt;. Is that significant? I'm not sure. Perhaps sobriety, however fleeting, will aid matters.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-8158609158275627576?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lQqXITd2IsoN42_C4QU1lrGwPCo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lQqXITd2IsoN42_C4QU1lrGwPCo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lQqXITd2IsoN42_C4QU1lrGwPCo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lQqXITd2IsoN42_C4QU1lrGwPCo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/v39Mvg-u3qg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/8158609158275627576/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-2.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/8158609158275627576?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/8158609158275627576?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/v39Mvg-u3qg/that-ie8-ten-grand-thing-clue-2.html" title="That IE8 ten grand thing, clue #2" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcMQn4zfip7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4643517675106268461</id><published>2009-06-19T09:30:00.013+01:00</published><updated>2009-12-15T17:28:03.086Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T17:28:03.086Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IE8 ten grand" /><title>That IE8 ten grand thing, clue #1</title><content type="html">&lt;p&gt;Not being Australian, or knowing any Australians, I'm not in a position to take part in &lt;a href="http://www.microsoft.com/australia/ie8/competition/"&gt;Microsoft's mildly diverting hunt for the 'buried' $10,000&lt;/a&gt;. So instead I'm going to offer what little insight I have &lt;em&gt;gratis&lt;/em&gt; to my dear friend, the internet. Are you there, internet?&lt;/p&gt;&lt;p&gt;The first clue is a cinch: &lt;a href="http://twitter.com/Tengrand_IE8/status/2234003681"&gt;"3000 upside down"&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In roman numerals, 3000 is &lt;em&gt;MMM&lt;/em&gt;. Upside down, that is &lt;em&gt;www&lt;/em&gt;. Clearly we have the beginning of a URL.&lt;/p&gt;&lt;p&gt;Next!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4643517675106268461?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sz1wssqxnBBQhUkjBVkH0hupUl4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sz1wssqxnBBQhUkjBVkH0hupUl4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sz1wssqxnBBQhUkjBVkH0hupUl4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sz1wssqxnBBQhUkjBVkH0hupUl4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/gO4jhcDrlng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4643517675106268461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-1.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4643517675106268461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4643517675106268461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/gO4jhcDrlng/that-ie8-ten-grand-thing-clue-1.html" title="That IE8 ten grand thing, clue #1" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/06/that-ie8-ten-grand-thing-clue-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFRH05fip7ImA9WxBSEEU.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4904743212765849531</id><published>2009-05-02T14:22:00.007+01:00</published><updated>2009-12-17T22:23:35.326Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-17T22:23:35.326Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="single responsibility principle" /><category scheme="http://www.blogger.com/atom/ns#" term="Clean Code" /><title>Grokking the SRP</title><content type="html">&lt;p&gt;I've been doing a lot of thinking about the &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;single responsibility principle&lt;/a&gt; recently. It is one of the many excellent things I've learned from reading &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"&gt;Clean Code&lt;/a&gt; (there's that book again, I promise to stop namechecking it soon). Basically, the single responsibility principle asserts that classes should have only one reason to change.&lt;/p&gt;&lt;p&gt;One bit that I really like about it is that definition of responsibility: a reason to change. Defining it thus, in terms of the effects, immediately suggests some of the benefits that are available to adherents to the SRP. Individual changes become localised to specific areas of a system, not strewn out across numerous modules. This means that making changes becomes easier and the risk of introducing problems when making those changes is decreased. It also has the effect of making code easier to read, because each module in the system will be focused on just one area.&lt;/p&gt;&lt;p&gt;Another good aspect of the SRP is that it provides an objective test of whether a class is too big. Rather than relying on some abstract property such as the number of lines of code it has, it suggests instead ways to verify that even very short classes are not doing too much. For instance, if some member variables are used only by a subset of methods in a class, that might be a reasonable pointer to a smaller class that is stuck inside waiting to be released.&lt;/p&gt;&lt;p&gt;And the SRP applies to methods too. It is commonly accepted that good functions do one thing, at one level of abstraction. Conceptually, this just seems like the SRP at the function level to me.&lt;/p&gt;&lt;p&gt;My realisation of the fundamental truth encapsulated by the SRP has already led to one significant set of &lt;a href="http://www.refactoring.com/"&gt;refactorings&lt;/a&gt; in &lt;a href="http://github.com/philbooth/plum-xml/tree/master"&gt;one of my side-projects&lt;/a&gt;: the extraction of all exception-throwing code out to dedicated exception-throwing classes. All told, the process took a couple of weeks of my spare time, but it was worthwhile. The resulting code was both shorter and eminently more understandable. Looking forward, I feel more confident as a developer, having the SRP in my armoury.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4904743212765849531?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FQhYObZWVPSScB0ihtcEbrNg9fI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FQhYObZWVPSScB0ihtcEbrNg9fI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FQhYObZWVPSScB0ihtcEbrNg9fI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FQhYObZWVPSScB0ihtcEbrNg9fI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/1ioUCcb9tCQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4904743212765849531/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/05/grokking-srp.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4904743212765849531?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4904743212765849531?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/1ioUCcb9tCQ/grokking-srp.html" title="Grokking the SRP" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/05/grokking-srp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUBQXY6fyp7ImA9WxBSEk4.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-1426232768401880132</id><published>2009-04-18T08:25:00.008+01:00</published><updated>2009-12-19T14:50:50.817Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-19T14:50:50.817Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="test-driven development" /><category scheme="http://www.blogger.com/atom/ns#" term="Clean Code" /><title>Clean unit tests</title><content type="html">&lt;p&gt;Earlier this week, I read the chapter on &lt;a href="http://c2.com/cgi/wiki?UnitTest"&gt;unit tests&lt;/a&gt; in &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"&gt;Clean Code&lt;/a&gt;. One of the things it stresses is  that having clean unit tests is in some ways more important than having clean code, because unit tests themselves are prone to rot exactly as production code is. Yet, whereas rotten code can be refactored with confidence as long as it is supported by unit tests, rotten unit tests are an outwardly-spiralling liability that become progressively more difficult and time-consuming to maintain. Eventually, if left unchecked, rotten unit tests get dropped entirely, at which point, every subsequent change to the production code becomes a potential bug.&lt;/p&gt;&lt;p&gt;Well, forgive me father, for I have sinned. Seriously, I'm &lt;em&gt;ridden&lt;/em&gt; with guilt on this one. It seems such a manifestly obvious point that I can't believe how thick I was being not to realise it before. I always just kind of hoped that my unit tests were fire-and-forget tools, smart weaponry that needn't be reconsidered once written. At times, of course, I've had to modify tests to account for behavioural changes in my code or whatever, but I've always done it in a thoughtless fashion, regarding it as a distraction from my actual work rather than important work in its own right.&lt;/p&gt;&lt;p&gt;The area in which I'm most culpable is 'single concept per test'. The &lt;a href="http://c2.com/cgi/wiki?AntiPattern"&gt;anti-pattern&lt;/a&gt; I've tended to use in my unit tests is to write a test for a given method, then continue to test all variations of parameters and entrance conditions to that method in the same place. But, of course, each of those variations should be a separate test in its own right. It has also confirmed for me that I'm doing &lt;a href="http://c2.com/cgi/wiki?TestDrivenDevelopment"&gt;test-driven development&lt;/a&gt; wrong. For some time, I've suspected that I'm not taking small enough steps, and I see my dirty unit tests as another symptom of that. They are part of my coding phenotype, I guess, with incorrect TDD in my genotype.&lt;/p&gt;&lt;p&gt;So, anyway, that's the diagnosis. The prescription for cure, I think, lies in the &lt;a href="http://fitnesse.org/FitNesse.BuildOperateCheck"&gt;build-operate-check&lt;/a&gt; pattern and perhaps adhering to a given-then-when naming convention (ripped off from &lt;a href="http://dannorth.net/"&gt;Dan North&lt;/a&gt;'s &lt;a href="http://dannorth.net/introducing-bdd"&gt;behaviour-driven development&lt;/a&gt;). I shall also experiment with &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=35578"&gt;limiting each test to a single assertion&lt;/a&gt;, although I'm not convinced enough about that to get dogmatic about it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-1426232768401880132?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3mdWiOvwbRuvU7ID7Nvm-1ZxmzI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3mdWiOvwbRuvU7ID7Nvm-1ZxmzI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3mdWiOvwbRuvU7ID7Nvm-1ZxmzI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3mdWiOvwbRuvU7ID7Nvm-1ZxmzI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/joRTNIuQIrA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/1426232768401880132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/04/clean-unit-tests.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1426232768401880132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1426232768401880132?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/joRTNIuQIrA/clean-unit-tests.html" title="Clean unit tests" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/04/clean-unit-tests.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUCQ3Y6eSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-1762467105858393393</id><published>2009-04-05T15:06:00.015+01:00</published><updated>2009-12-15T16:57:42.811Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:57:42.811Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="The Pragmatic Programmer" /><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="test-driven development" /><category scheme="http://www.blogger.com/atom/ns#" term="software craftsmanship" /><category scheme="http://www.blogger.com/atom/ns#" term="Pragmatic Thinking and Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="Clean Code" /><title>Software craftsmanship</title><content type="html">&lt;p&gt;The &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;software craftsmanship&lt;/a&gt; movement has been accumulating an increasing amount of attention lately and I think it's an important development for the software industry. When I first heard the term used, I have to confess that I wasn't a fan. I detected a faintly unpleasant air of superiority and pomposity surrounding the whole thing. In hindsight, I see that this was primarily a defensive reaction on my part, stemming from an unacknowledged realisation that my own set of development practices at the time weren't working as well as I'd hoped. But since then, my thoughts regarding software craftsmanship have altered radically, in line with improvements that I've gradually been making to the way I develop software.&lt;/p&gt;&lt;p&gt;Fundamental to this change have been my early experiences with the various &lt;a href="http://www.extremeprogramming.org/rules.html"&gt;XP practices&lt;/a&gt;. As I've discussed here &lt;a href="http://phil-booth.blogspot.com/2009/02/reflections-on-applying-xp-to-very.html"&gt;before&lt;/a&gt;, my experiences with XP have been something of a mixed bag. Part of the struggle has been in the small team size and the lack of a single, unifying project to work on. The company I work for is simply not a good fit for out-of-the-box, vanilla XP. However, some of the practices have had a hugely positive effect on our productivity and none more so than &lt;a href="http://www.extremeprogramming.org/rules/testfirst.html"&gt;test-driven development&lt;/a&gt;. Seeing and feeling the benefit of TDD in my daily work was a trigger for me to analyse other practices and approaches that might make me a better developer.&lt;/p&gt;&lt;p&gt;At that point I started to read a lot of technical books. I've always been an avid reader, but reading for me before then was always about escapism, so I rarely bothered with non-fiction. Now it is the other way round; I rarely have time to read fiction because my stack of unread technical literature is piled so high. Most of the books I read during this period were good. A few of them, though, were just magnificent. These few have filled in some of the other holes in my approach to software development, continuing the process that TDD started:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/books.html#refactoring"&gt;Refactoring&lt;/a&gt;, by &lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmer&lt;/a&gt;, by &lt;a href="http://blog.toolshed.com/"&gt;Andy Hunt&lt;/a&gt; and &lt;a href="http://pragdave.pragprog.com/"&gt;Dave Thomas&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.objectmentor.com/articles/2008/04/08/clean-code-whew"&gt;Clean Code&lt;/a&gt;, by &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert C. Martin&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&gt;Pragmatic Thinking &amp;amp; Learning&lt;/a&gt;, by Andy Hunt.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So now I find myself thoroughly approving of the idea of software craftsmanship. It feels as though a great myth of our industry is finally being busted. Software development is not engineering. It is not science. It is craftsmanship.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-1762467105858393393?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HYmhRfQW24xgMbLDocOvT6RnUZU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HYmhRfQW24xgMbLDocOvT6RnUZU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HYmhRfQW24xgMbLDocOvT6RnUZU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HYmhRfQW24xgMbLDocOvT6RnUZU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/x0U_cd0F9YE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/1762467105858393393/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/04/software-craftsmanship.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1762467105858393393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1762467105858393393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/x0U_cd0F9YE/software-craftsmanship.html" title="Software craftsmanship" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/04/software-craftsmanship.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EHQ345eyp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-7146779870243743595</id><published>2009-03-28T11:27:00.006Z</published><updated>2009-12-15T16:47:12.023Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:47:12.023Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clean Code" /><category scheme="http://www.blogger.com/atom/ns#" term="static analysis" /><title>Clean code and static analysis</title><content type="html">&lt;p&gt;I've been meaning to buy a copy of &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Uncle Bob&lt;/a&gt;'s &lt;a href="http://blog.objectmentor.com/articles/2008/04/08/clean-code-whew"&gt;Clean Code&lt;/a&gt; for a while now, and finally did so this week. It seems like a pretty good read so far: Principled, opinionated, well-argued and &lt;em&gt;right&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It has set me thinking about a possible side-project too... are there any open-source static analysis tools that specifically analyse code cleanliness? I'm imagining metrics such as &lt;a href="https://elearning.industriallogic.com/gh/submit?Action=PageAction&amp;amp;album=recognizingSmells&amp;amp;path=recognizingSmells/technicalDebt/technicalDebtMismanagement&amp;amp;devLanguage=Java"&gt;longest function&lt;/a&gt;, mean function length, argument counts and so on. Analysing names would be difficult I guess, although incidences of one- and two- character variable names could easily be tracked, for instance. I shall do some hunting around for existing projects while pondering this some more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-7146779870243743595?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BcpAmeeCYzOeUB7npyzAxRc0P50/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcpAmeeCYzOeUB7npyzAxRc0P50/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BcpAmeeCYzOeUB7npyzAxRc0P50/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcpAmeeCYzOeUB7npyzAxRc0P50/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/GRUxF6OLbvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/7146779870243743595/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/03/clean-code-and-static-analysis.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/7146779870243743595?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/7146779870243743595?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/GRUxF6OLbvw/clean-code-and-static-analysis.html" title="Clean code and static analysis" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/03/clean-code-and-static-analysis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCQ3w-cSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-153941619559242967</id><published>2009-03-20T07:24:00.008Z</published><updated>2009-12-15T16:44:22.259Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:44:22.259Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="The Pragmatic Programmer" /><category scheme="http://www.blogger.com/atom/ns#" term="Pragmatic Thinking and Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="talk to the duck" /><category scheme="http://www.blogger.com/atom/ns#" term="workspace" /><title>A refactored workspace</title><content type="html">&lt;p&gt;Last autumn, there was a point where I was spending most of my free time manically extolling the virtues of &lt;a href="http://blog.toolshed.com/"&gt;Andy Hunt&lt;/a&gt;'s excellent &lt;a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&gt;Pragmatic Thinking &amp;amp; Learning&lt;/a&gt; to anyone that would listen, not to mention quite a few that wouldn't. Most people managed to feign interest quite well, presumably certain that it was just a phase I was going through and that it'd pass soon enough. It did leave a lasting impression on me, though, and I realised yesterday that my workspace has become some kind of weird shrine to much of the book's content.&lt;/p&gt;&lt;p&gt;It started with a single index card, bluetacked to the wall above my display, reading "CONSIDER THE CONTEXT". The book suggests doing this as early as page six, so I obviously bought into it right from the off. The index cards gradually multiplied and changed as I progressed through the chapters, until eventually there were &lt;a href="http://picasaweb.google.co.uk/pmbooth/TheOffice#5315017653162038674"&gt;13 of them&lt;/a&gt;, arranged in two horizontal rows just above my display. They're generally just little reminders of things from the book that seemed like they might help me to work more effectively. My favourites are: "Don't just do something, stand there"; "Learn by synthesis"; and "Know what you don't know".&lt;/p&gt;&lt;p&gt;The next thing to change on my desk was the addition of &lt;a href="http://picasaweb.google.co.uk/pmbooth/TheOffice#5315017951332731762"&gt;a second display&lt;/a&gt;, effectively doubling the size of my visible work area. As the book suggested it would, doing this had a tangible, positive effect on the way I work, allowing me to focus my attention on more pieces of information simultaneously.&lt;/p&gt;&lt;p&gt;Almost immediately, I followed that by installing &lt;a href="http://virtuawin.sourceforge.net/"&gt;VirtuaWin&lt;/a&gt;, software for Windows that allows you to run separate virtual desktops. So web browsers, iTunes, IRC and so on were all banished from view, allowing me to focus purely on actual work. This resulted in fewer interruptions, less context-switching and increased productivity.&lt;/p&gt;&lt;p&gt;Then, just before Christmas, I decided that the starkly-lit, whitewashed walls of our windowless basement needed breaking up with a bit of colour. So I bought &lt;a href="http://picasaweb.google.co.uk/pmbooth/TheOffice#5315017599791870322"&gt;a couple of posters&lt;/a&gt; on the internet that would also serve to remind me of the book's advice. The first is a picture of the earth, taken from the moon. This reminds me to turn my assumptions on their head if I'm ever stuck on something and try to view them from a different angle. The second poster shows both the tip and the much larger, hidden section of an iceberg. This reminds me that a problem's symptom is not the whole thing and that I must always consider the context.&lt;/p&gt;&lt;p&gt;The final piece of this slightly obsessive jigsaw was actually something I first heard of from Hunt's first book with &lt;a href="http://pragdave.pragprog.com/"&gt;Dave Thomas&lt;/a&gt;, &lt;a href="http://www.pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmer&lt;/a&gt;. I wish I'd read that book much earlier on in my career, because it would have saved me from learning a lot of things the hard way. As it was, it was a great feeling to finally put proper names and rules to concepts or approaches that I'd been imperfectly forming in my own mind over the years. Anyway, the last arrival at my desk was a plastic duck, a prize from a rather drunken general knowledge quiz at my friend's house on New Year's Eve. It feels like I was destined to win &lt;a href="http://picasaweb.google.co.uk/pmbooth/TheOffice#5315017642974499202"&gt;that duck&lt;/a&gt;, who now occupies pride of place on the stack of books next to my two displays.&lt;/p&gt;&lt;p&gt;So what's the point of the duck? The duck is there for me to talk through sticky problems with. It is consistently surprising how the very act of describing aloud the symptoms of a problem can instantly cause one to discover the cause. By describing the symptoms to the duck instead of a person, I am saving my teammates from the tedious job of walking across the room just to listen to me answer my own question. Although I must confess I'm still occasionally guilty of this, so I'll add a 14th index card to my wall today: "Talk to the duck!"&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-153941619559242967?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xsv7NW9uvWwdO0MBypr84NDt7us/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xsv7NW9uvWwdO0MBypr84NDt7us/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xsv7NW9uvWwdO0MBypr84NDt7us/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xsv7NW9uvWwdO0MBypr84NDt7us/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/65GYuYrqKvQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/153941619559242967/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/03/refactored-workspace.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/153941619559242967?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/153941619559242967?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/65GYuYrqKvQ/refactored-workspace.html" title="A refactored workspace" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/03/refactored-workspace.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEDRng4fSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-5404583309640719370</id><published>2009-03-12T22:20:00.012Z</published><updated>2009-12-15T16:31:17.635Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:31:17.635Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="big visible charts" /><category scheme="http://www.blogger.com/atom/ns#" term="coding marathon" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubiquity XForms" /><title>The 12-day week</title><content type="html">&lt;p&gt;The last month or so at work has seen a change in emphasis for me, as I've shifted my focus to the &lt;a href="http://code.google.com/p/ubiquity-xforms/"&gt;Ubiquity XForms&lt;/a&gt; project that we're working on in partnership with &lt;a href="http://www.ibm.com/"&gt;IBM&lt;/a&gt;. Ubiquity XForms is an open-source, cross-browser, client-side javascript library that implements the &lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt;'s &lt;a href="http://www.w3.org/TR/xforms11/"&gt;XForms 1.1 recommendation&lt;/a&gt; and is now pretty close to reaching full compliance in Internet Explorer and Firefox.&lt;/p&gt;&lt;p&gt;In an effort to break the back of the remaining features, we agreed as a team to throw ourselves whole-heartedly into a timeboxed coding marathon. This involved ditching the typical &lt;a href="http://www.extremeprogramming.org/rules/iterationplanning.html"&gt;iteration plan&lt;/a&gt; for a couple of weeks and instead throwing all of the outstanding story cards onto the whiteboard. It was then a case of ploughing through the stack of cards as quickly as possible. Although this approach breaks almost every principle of &lt;a href="http://www.extremeprogramming.org/rules.html"&gt;XP&lt;/a&gt;, the consensus was that it was worth the extra effort at this point in time. So, coming towards the end of an arduous 12-day week, I've got a few observations about the experience.&lt;/p&gt;&lt;p&gt;At the start of the week I drew up a new &lt;a href="http://www.xprogramming.com/xpmag/BigVisibleCharts.htm"&gt;BVC&lt;/a&gt; on the whiteboard by my desk. I had in mind the run-rate charts that television broadcasters put on screen during coverage of limited-overs cricket matches. It is similar in many ways to Scrum's &lt;a href="http://www.mountaingoatsoftware.com/release-burndown"&gt;burn down chart&lt;/a&gt;, except that the progress is plotted as a required rate of stories per day rather than a sum of all the outstanding work. I have no idea whether this kind of chart is one that has been used by other devlopment teams in the past, but I thought it was pretty useful in our situation. &lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="http://picasaweb.google.co.uk/pmbooth/TheCodingMarathon#5314636179369028098"&gt;Here it is&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Predictably, there was a big increase in stupid, sleep-deprived coding errors, especially in the evenings. The cost of these was kept reasonably low because of &lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;TDD&lt;/a&gt;. Code a bit, test a bit, code a bit, test a bit, code a bit, what the...? Keeping the cycle tight meant that it was never a big deal to undo some changes or &lt;code&gt;svn revert&lt;/code&gt; before having another go at something. The thought of doing it without that safety net of unit tests is genuinely frightening.&lt;/p&gt;&lt;p&gt;Something that I hadn't expected was the sense of unity and common purpose that evolved within the team. Most of the time, each of us is working on a separate project, pretty much isolated from everything else that is going on. Obviously we talk about each others' work and so on, but there is rarely any collaboration between us. This has never seemed remarkable to me before, it was just the norm in our office. But the situation now is a noticeable improvement and I hope that we are able to maintain it.&lt;/p&gt;&lt;p&gt;Ultimately, I think that the coding marathon has been part-success, part-failure. We didn't finish everything that we set out to, but we achieved a fair amount and learned some new things on the way. I'll be very interested to hear everyone else's thoughts during the next retrospective.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-5404583309640719370?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qpcJIm2yKVGKbdALBECrpFeGOzA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qpcJIm2yKVGKbdALBECrpFeGOzA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qpcJIm2yKVGKbdALBECrpFeGOzA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qpcJIm2yKVGKbdALBECrpFeGOzA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/HqU1dMK7R5s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/5404583309640719370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/03/12-day-week.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/5404583309640719370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/5404583309640719370?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/HqU1dMK7R5s/12-day-week.html" title="The 12-day week" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/03/12-day-week.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQBRHc9fSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4829593827405183086</id><published>2009-02-14T11:33:00.007Z</published><updated>2009-12-15T16:09:15.965Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:09:15.965Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="link" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="article" /><category scheme="http://www.blogger.com/atom/ns#" term="XForms" /><title>XForms in .NET</title><content type="html">&lt;p&gt;I've just updated an old article that I wrote on &lt;a href="http://www.codeproject.com/"&gt;the Code Project&lt;/a&gt;. It describes how to use &lt;a href="http://www.w3.org/TR/xforms11/"&gt;XForms&lt;/a&gt; to build dynamic user interfaces in a &lt;a href="http://www.microsoft.com/NET/"&gt;.NET&lt;/a&gt; application. If that sounds like it might be your bag, check it out. Behold! &lt;a href="http://www.codeproject.com/KB/dotnet/XFormsNET.aspx"&gt;How to Harness the Power of XHTML and XForms in your .NET Applications&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4829593827405183086?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tGfTFlKk3zdn1X3EEWwuOhlhlC8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tGfTFlKk3zdn1X3EEWwuOhlhlC8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tGfTFlKk3zdn1X3EEWwuOhlhlC8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tGfTFlKk3zdn1X3EEWwuOhlhlC8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/GwAy4ivjxuI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4829593827405183086/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/02/xforms-in-net.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4829593827405183086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4829593827405183086?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/GwAy4ivjxuI/xforms-in-net.html" title="XForms in .NET" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/02/xforms-in-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYDQHg5cSp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-4125810739491523362</id><published>2009-02-04T20:11:00.011Z</published><updated>2009-12-15T16:06:11.629Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:06:11.629Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extreme programming" /><category scheme="http://www.blogger.com/atom/ns#" term="The Art of Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="small teams" /><title>Reflections on applying XP to a (very) small company, part I</title><content type="html">&lt;p&gt;There have been &lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;a&lt;/a&gt; &lt;a href="http://martinfowler.com/bliki/FlaccidScrum.html"&gt;lot&lt;/a&gt; of &lt;a href="http://xprogramming.com/blog/2009/01/30/context-my-foot/"&gt;excellent&lt;/a&gt; &lt;a href="http://xprogramming.com/blog/2009/02/02/discovering-essential-technical-practices/"&gt;posts&lt;/a&gt; in the agile blogosphere of late about poor technical practices causing teams to fail. These have tended to centre around &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;Scrum&lt;/a&gt;, for the obvious reason that it does not mandate the use of any particular technical practices &lt;em&gt;per se&lt;/em&gt;. Although we are not using Scrum, I've been pondering the implications of many of the concluding opinions for my own team (&lt;em&gt;my own&lt;/em&gt; implies membership rather than ownership here btw).&lt;/p&gt;&lt;p&gt;We are a small team of three developers, each tending to work on a completely separate project to the rest. In fact, it would probably be more accurate to say that we are three one-man teams, rather than a single team of three. This structure is one that has grown organically, through necessity, as the business itself has developed over the years.&lt;/p&gt;&lt;p&gt;About a year ago, we discussed as a team how we could work more effectively. Our manager indicated that he was keen for us to try &lt;a href="http://www.extremeprogramming.org/"&gt;XP&lt;/a&gt;, using &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore &amp;amp; Shane Warden's excellent tome &lt;/a&gt;as our bible. The book quickly pointed out that our team size and the amount of legacy code involved meant that we were not simply looking at a standard, vanilla port of XP. However, we realised that there was still an awful lot that we could try to collectively improve and have since had varying degrees of success applying some XP practices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Working to a regular rhythm of weekly &lt;a href="http://www.extremeprogramming.org/rules/iterative.html"&gt;iterations&lt;/a&gt; and thus knowing our &lt;a href="http://www.extremeprogramming.org/rules/velocity.html"&gt;velocity&lt;/a&gt; was a near-immediate win.&lt;/li&gt;&lt;li&gt;Ditto the &lt;a href="http://osdir.com/ml/programming.extreme-programming.xp-explained2/2004-10/msg00024.html"&gt;informative workspace&lt;/a&gt; with lots of whiteboards and big, visible charts.&lt;/li&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/start-trust-start-retrospective"&gt;Retrospectives&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/rules/standupmeeting.html"&gt;daily stand-up meetings&lt;/a&gt; have both gone pretty well, although they seem to be valued much more by some team-members than others.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/unittests.html"&gt;Unit tests&lt;/a&gt;, &lt;a href="http://www.extremeprogramming.org/rules/testfirst.html"&gt;TDD&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/rules/refactor.html"&gt;refactoring&lt;/a&gt; have been introduced, but there is still a very large burden of &lt;a href="http://www.martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt; to pay off. We also have some source code, mostly written in &lt;a href="http://www.w3.org/TR/xforms11/"&gt;XForms&lt;/a&gt;, that we lack a suitable unit-testing framework for (which probably means we should be writing one ourselves).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/pair.html"&gt;Pair-programming&lt;/a&gt; enjoyed a brief period of popularity and promsicuity before fizzling out somewhat. It still makes an appearance from time to time when individuals want to make it happen, but the combined effects of an odd-numbered team, the disparate nature of the projects we're each predominatly responsible for and the resultant context-swapping that occurs when we switch the pair are a problem for us.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On balance, I think that we're definitely operating more effectively as a team than we were a year previously. However, I am utterly &lt;em&gt;convinced&lt;/em&gt; that we remain a long way short of anything like our full potential. And the single, biggest factor in taking the next step seems to me like sustaining a radical increase in the amount of pair-programming we do. Hopefully, a year from now, I'll be writing a new post here about how we got on.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-4125810739491523362?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HXApdiWYt-iAZ59KkG3AYJ1lun0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HXApdiWYt-iAZ59KkG3AYJ1lun0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HXApdiWYt-iAZ59KkG3AYJ1lun0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HXApdiWYt-iAZ59KkG3AYJ1lun0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/g1QVt-x6gRg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/4125810739491523362/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/02/reflections-on-applying-xp-to-very.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4125810739491523362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/4125810739491523362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/g1QVt-x6gRg/reflections-on-applying-xp-to-very.html" title="Reflections on applying XP to a (very) small company, part I" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/02/reflections-on-applying-xp-to-very.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUFQHg5cCp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-3174678838360253425</id><published>2009-01-28T21:22:00.009Z</published><updated>2009-12-15T15:50:11.628Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T15:50:11.628Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="procrastination" /><category scheme="http://www.blogger.com/atom/ns#" term="extreme programming" /><category scheme="http://www.blogger.com/atom/ns#" term="iteration plans" /><title>Iteration plans, my antidote to procrastination</title><content type="html">&lt;p&gt;I read an &lt;a href="http://www.economist.com/science/displaystory.cfm?story_id=12971028"&gt;interesting article&lt;/a&gt; recently that described a study into the causes of &lt;a href="http://www.dilbert.com/strips/comic/2002-11-17/"&gt;procrastination&lt;/a&gt;. I have suffered at the hands of that particular demon more than once in my life and am consequently quite interested in the &lt;a href="http://www.psychologytoday.com/articles/pto-20030823-000001.html"&gt;psychology of it&lt;/a&gt;. People (i.e. &lt;em&gt;me&lt;/em&gt;) are often aware that they're not doing themselves any favours by procrastinating, yet they can continue to invent ever more creative devices to avoid getting on with the job in hand. The study mentioned in the article concludes that people are more likely to procrastinate if the task they are trying to do is viewed in abstract terms, whereas people tend to act quicker when they are given specific, concrete tasks.&lt;/p&gt;&lt;p&gt;This effect is something that I became very aware of in myself when I first started using &lt;a href="http://www.extremeprogramming.org/"&gt;XP&lt;/a&gt; practices. Specifically, I discovered that the rhythm of &lt;a href="http://www.extremeprogramming.org/rules/iterative.html"&gt;regular iterations&lt;/a&gt; and the breaking down of features into &lt;a href="http://www.extremeprogramming.org/rules/userstories.html"&gt;stories&lt;/a&gt; (and stories into tasks) really helped me to cut out time that I was previously spending between tasks on trivial or even unnecessary jobs. I've not seen this effect discussed explicitly anywhere, which makes me wonder whether procrastination is not a big deal for most people? Or perhaps it is, but people don't like to aknowledge the existence of such a negative trait?&lt;/p&gt;&lt;p&gt;What I do know is that I am now very reluctant to work on a project without the supporting crutch of an &lt;a href="http://www.extremeprogramming.org/rules/iterationplanning.html"&gt;iteration plan&lt;/a&gt; to help me focus. This is despite the fact that I basically work as a one-man team in my job and that in the preceding &lt;em&gt;n&lt;/em&gt; years of my professional life I seemed very happy with just a bug-tracking system and a long queue of bugs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-3174678838360253425?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/z32EfhkszI0S2-WWsxSt-vZrptI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z32EfhkszI0S2-WWsxSt-vZrptI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/z32EfhkszI0S2-WWsxSt-vZrptI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z32EfhkszI0S2-WWsxSt-vZrptI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/RqJ2OoqqdiY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/3174678838360253425/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/01/iteration-plans-my-antidote-to.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/3174678838360253425?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/3174678838360253425?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/RqJ2OoqqdiY/iteration-plans-my-antidote-to.html" title="Iteration plans, my antidote to procrastination" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/01/iteration-plans-my-antidote-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EBQXs5fyp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-915363733142749605</id><published>2009-01-23T21:54:00.008Z</published><updated>2009-12-15T15:40:50.527Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T15:40:50.527Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FriendFeed" /><category scheme="http://www.blogger.com/atom/ns#" term="Hubbub" /><category scheme="http://www.blogger.com/atom/ns#" term="UBX" /><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><title>Introducing Hubbub</title><content type="html">&lt;p&gt;In my day-job for the last six months, I've been working on a new application called &lt;a href="http://hubbub.me/"&gt;Hubbub&lt;/a&gt;. In its current form, Hubbub is a social networking client based around a couple of popular web services: &lt;a href="http://friendfeed.com/"&gt;FriendFeed&lt;/a&gt; and &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Our aim was to provide an interface to their APIs that was radically different to the look and feel of existing client applications. We wanted the UI to be intuitive, aesthetically pleasing and unhindered by the limitations of convention.&lt;/p&gt;&lt;p&gt;To that end, we enlisted the services of &lt;a href="http://gecoloco.com/who-we-are/"&gt;Bartek&lt;/a&gt;, an excellent Dublin-based designer that we've worked with on a number of projects over the last few years. He came up with some great designs and helped us to put some intellectual dynamite under the constraints that application developers typically operate within.&lt;/p&gt;&lt;p&gt;Looking forward, there is still a ton of stuff that we want to do with Hubbub, however it is at the stage where we're keen to start getting feedback from real users. It is only available on Windows for now, as there is still some work outstanding on porting our &lt;a href="http://ubx.googlecode.com/"&gt;UBX framework&lt;/a&gt; to other operating systems. But if you're interested in finding out more, check out the &lt;a href="http://hubbub.me/gallery/version-0.5"&gt;screenshots&lt;/a&gt;, or &lt;a href="http://hubbub.me/"&gt;sign up&lt;/a&gt; for the beta and download Hubbub for yourself. And if you have any feedback, bug reports or feature requests, you should post them to the &lt;a href="http://groups.google.com/group/hubbub-users"&gt;Hubbub mailing list&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-915363733142749605?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xfxG4423-l3Y6R0RAtakQW8QdAo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfxG4423-l3Y6R0RAtakQW8QdAo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xfxG4423-l3Y6R0RAtakQW8QdAo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfxG4423-l3Y6R0RAtakQW8QdAo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/d4HQW3R3bLU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/915363733142749605/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/01/introducing-hubbub.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/915363733142749605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/915363733142749605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/d4HQW3R3bLU/introducing-hubbub.html" title="Introducing Hubbub" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/01/introducing-hubbub.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QEQns4eyp7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-6752738829846686023</id><published>2009-01-21T16:33:00.007Z</published><updated>2009-12-15T15:35:03.533Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T15:35:03.533Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="Pragmatic Thinking and Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><title>To play is to learn</title><content type="html">&lt;p&gt;One of the myriad excellent things that I learned from &lt;a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&gt;Pragmatic Thinking &amp;amp; Learning&lt;/a&gt; concerns how playing with information is a highly effective method of learning (it is how we instinctively do it as children, after all). I just spotted an utterly inspired case of this on &lt;a href="http://oursignal.com/"&gt;Our Signal&lt;/a&gt;: &lt;a href="http://github.com/ryanb/ruby-warrior/tree/master"&gt;Ruby Warrior&lt;/a&gt;, a game that teaches &lt;a href="http://www.ruby-lang.org/en/about"&gt;the Ruby programming language&lt;/a&gt; by requiring the player to write Ruby scripts to complete game levels. A brilliant idea, brilliantly executed. One day, all introductory programming courses will be like this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-6752738829846686023?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eYjC-omIwaF9YYv_KofSdPLoenw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYjC-omIwaF9YYv_KofSdPLoenw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eYjC-omIwaF9YYv_KofSdPLoenw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYjC-omIwaF9YYv_KofSdPLoenw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/zomEthu5fcA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/6752738829846686023/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/01/to-play-is-to-learn.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/6752738829846686023?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/6752738829846686023?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/zomEthu5fcA/to-play-is-to-learn.html" title="To play is to learn" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/01/to-play-is-to-learn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4MQnszeip7ImA9WxBTGEQ.&quot;"><id>tag:blogger.com,1999:blog-336091357949177003.post-1326550553190239815</id><published>2009-01-08T16:11:00.003Z</published><updated>2009-12-15T15:29:43.582Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T15:29:43.582Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="const_cast" /><title>Considering const_cast</title><content type="html">&lt;p&gt;Yesterday I had cause to consider the &lt;a href="http://www.cppreference.com/wiki/keywords/const_cast"&gt;&lt;code&gt;const_cast&lt;/code&gt;&lt;/a&gt; operator from &lt;a href="http://www.research.att.com/%7Ebs/C++.html"&gt;C++&lt;/a&gt;. I came &lt;em&gt;this&lt;/em&gt; close to employing it out of sheer laziness when working with some &lt;a href="http://www.objectmentor.com/resources/articles/WorkingEffectivelyWithLegacyCode.pdf"&gt;legacy code&lt;/a&gt;. Fortunately, voice #2 objected loudly enough to rouse my conscience in the nick of time.&lt;/p&gt;&lt;p&gt;It made me ponder, though: is there any conceivable scenario in which casting away an object's &lt;code&gt;const&lt;/code&gt; behaviour is the &lt;em&gt;right&lt;/em&gt; course of action (as opposed to the quickest, say)? It seems pretty unlikely. So I guess the argument must run that at least explicit usage of &lt;code&gt;const_cast&lt;/code&gt; makes such activity easier to find in &lt;a href="http://www.laputan.org/mud/mud.html"&gt;large code bases&lt;/a&gt;, which is fair enough.&lt;/p&gt;&lt;p&gt;However, what if there &lt;em&gt;was&lt;/em&gt; no &lt;code&gt;const_cast&lt;/code&gt; to fall back on in the first place? And, furthermore, what if compilers refused the right of C-style casts and &lt;a href="http://www.cppreference.com/wiki/keywords/reinterpret_cast"&gt;&lt;code&gt;reinterpret_cast&lt;/code&gt;&lt;/a&gt; to cast away an object's &lt;code&gt;const&lt;/code&gt;? Might enforcing the sanctity of const in this way make C++ a better language?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/336091357949177003-1326550553190239815?l=phil-booth.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c-qNwi4RZOUHJ37S_TA5mWFOGbE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-qNwi4RZOUHJ37S_TA5mWFOGbE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c-qNwi4RZOUHJ37S_TA5mWFOGbE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-qNwi4RZOUHJ37S_TA5mWFOGbE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phil-booth/~4/LqMp2btXat4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phil-booth.blogspot.com/feeds/1326550553190239815/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://phil-booth.blogspot.com/2009/01/considering-constcast.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1326550553190239815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/336091357949177003/posts/default/1326550553190239815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phil-booth/~3/LqMp2btXat4/considering-constcast.html" title="Considering const_cast" /><author><name>&lt;a href="http://philbooth.info/"&gt;Phil Booth&lt;/a&gt;</name><uri>http://www.blogger.com/profile/06610969505375381231</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://phil-booth.blogspot.com/2009/01/considering-constcast.html</feedburner:origLink></entry></feed>

