<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1050311087092043047</id><updated>2011-11-28T00:45:04.613Z</updated><category term='Twitter'/><category term='Ivy'/><category term='Scala'/><category term='Failure'/><category term='SSH'/><category term='Architecture'/><category term='Agile'/><category term='html'/><category term='QCon'/><category term='Process'/><category term='CI'/><category term='JUnit'/><category term='Macports'/><category term='Java'/><category term='OSX'/><category term='OpenSource'/><category term='Ant'/><category term='Groovy'/><category term='Names'/><category term='Web'/><category term='Testing'/><title type='text'>Random Whitterings</title><subtitle type='html'>Some random thoughts, usually about software, systems and process.
&lt;br&gt;&lt;br&gt;
&lt;i&gt;All views expressed are mine and not necessarily those of my employers past, present and future.&lt;/i&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-7667834413939132672</id><published>2011-06-11T20:52:00.001+01:00</published><updated>2011-06-11T20:54:08.162+01:00</updated><title type='text'>Enter the Pipeline .... exploring Scala and Akka</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
Sometime ago I did some interesting work with Akka. &amp;nbsp;These days I don't code everyday, most of what I do is in my own time and I wanted to play with the latest Akka (1.1) and see if it was still as fun as it was.&lt;br /&gt;
&lt;br /&gt;
I wanted something simple to connect to Twitter, read the stream, chop it up message by message, pass them to a JSON parsing actor, which it turn would pass them on to further actors for more processing.  The concept can be extended in many ways.&lt;br /&gt;
&lt;br /&gt;
The codebase as it stands is quite small, which is really thanks to standing on the shoulders of giants:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Scala 2.9.0&lt;br /&gt;
&amp;nbsp;Akka 1.1&lt;br /&gt;
&amp;nbsp;SJSON&lt;br /&gt;
&amp;nbsp;Signpost OAuth library&lt;br /&gt;
&amp;nbsp;Apache HTTP Client 4.1&lt;br /&gt;
&amp;nbsp;ScalaTest&lt;br /&gt;
&amp;nbsp;Mockito&lt;br /&gt;
&amp;nbsp;SBT&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;u&gt;A few comments about the code...&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Firstly its not production code, it is an exploration of various things.  I will outline some of what I think are the most interesting parts of the code.  See the bottom of this post where to find the code.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using Either and Option&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One of the things that has always created confusion is the use of exceptions for things that are not really exceptional cases.  Too often we see exceptions used for alternate path selection, often the less travelled path but still a valid path.&lt;br /&gt;
&lt;br /&gt;
If you expect failure, which in a networked environment we should, then you should not be using exceptions, its not an exceptional case, its an expected one.  However how do you represent this in code? Thankfully Scala gives you Either.  Your methods can use Either to indicate that this method will return either an error or a result.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1015475.js?file=gistfile1.scala"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
In the above we have defined a trait with a connect method that can return either an Error if something goes wrong, or a BufferedReader if all goes well.&lt;br /&gt;
&lt;br /&gt;
Similarly you can use Option to indicate that a method may return a value or not.  This is much more meaningful than returning null's as you cannot be sure what a null really means, whereas an Option explicitly states its Optional.&lt;br /&gt;
&lt;br /&gt;
And its possible to combine the two...&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1015506.js?file=gistfile1.scala"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
So in the above we are saying, either expect a ReadError if there is a problem otherwise you will 'optionally' get a string.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using 'become' to manange connection state&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Akka provides the ability to change the receive method of an Actor using 'become', this can be very useful to manage the state of an actor based on the messages it receives.  In this case we have two "states", active and inActive.  The messages that are valid in each state are different.  The actor can move between these states using 'become'.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1015527.js?file=gistfile1.scala"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Testing&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I have written the tests with ScalaTest, in a Given-Then-When style.  One of the challenges of testing an intergration point is verifying expected behaviour without actually having to connect to a real service.  Using AkkaTestKit and Mockito I have attempted to test as close to the integration as possible without actually building a mock service.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Testing logging events&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Akka provides an eventing service which is an alternative to traditional logging.  Eventing decouples the action of logging from the source of the event, this is very useful in many respects including testing.  It is possible to hook into the event service through the test, in this case I used an actor that simply places the events received on the queue.  The test can then verify expected events are on the queue in the expected timeframe.&lt;br /&gt;
&lt;br /&gt;
Whilst it is possible to get the Events sent to the TestKit testactor I found this tended to made the test confusing as essentially two streams of messages were being merged which in turn made the test logic quite complex. By using a separate queue it made it clearer (in my view) to understand.&lt;br /&gt;
&lt;br /&gt;
Below you can see an example using Mockito as well as the event queue.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1019707.js?file=gistfile1.scala"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;How to use it&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Warning: whilst using this code for testing and experimentation does not (according to my understanding) break any Twitter T&amp;amp;C's you should satisfy yourself should you decide to use this code or alternatively base any future code upon it.&lt;br /&gt;
&lt;br /&gt;
You will need to register an application with Twitter for which you will need to have a Twitter account, login and then go to https://dev.twitter.com/apps&lt;br /&gt;
&lt;br /&gt;
Here you can register a new application, then make note of the consumerKey and consumerSecret.  You will also need to make note of your Access Token (oauth_token) and Access Token Secret (oauth_token_secret).&lt;br /&gt;
&lt;br /&gt;
Then you need to clone the source code and built it using sbt (http://code.google.com/p/simple-build-tool/)&lt;br /&gt;
&lt;br /&gt;
The following transcript shows how to use it.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1020862.js?file=gistfile1.txt"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
If you want to play with the code in Intellij, just run 'sbt idea' on the command line.  The code is tagged with 'blog_post' at the point in time of writing this blog post.&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-7667834413939132672?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/7667834413939132672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=7667834413939132672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7667834413939132672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7667834413939132672'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2011/06/enter-pipeline-exploring-scala-and-akka.html' title='Enter the Pipeline .... exploring Scala and Akka'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-8789964062331544679</id><published>2011-04-27T19:55:00.000+01:00</published><updated>2011-04-27T19:55:45.886+01:00</updated><title type='text'>When the pressure is on</title><content type='html'>&lt;span id="internal-source-marker_0.8158729466155322" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Ever  been in that situation, its a deadline, you are under the gun, things  are going wrong. &amp;nbsp;You are putting in the long hours, but no matter how  hard you work things seem out of control. &amp;nbsp;I’ve been in that situation, a  few times. &amp;nbsp;I’ve worked in a couple of start-ups, and one in particular  had a couple of occasions where it almost all went wrong, we pulled it  in, but boy it was close. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;So  you think, we’ve done it before but we didn’t fail, we made that  release or we went live with that customer... or maybe you didn’t... or  maybe you did but in the process you burnt the relationship with the  client... or burnt yourself (or your team) out or maybe you found  yourself in firefighting mode for weeks post release scrambling to keep  things running behind the schemes.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The  problem is it can be addictive, it can be a rush to pull that rabbit  out of the hat, and it tends to propagate the Hero culture and then it  feeds on itself.&amp;nbsp; Eventually this will lead to an implosion where projects and possibly the company will fail.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;How do we break that cycle, given that we are in the middle of it? &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;[Context  note: &amp;nbsp;This is more aimed at small teams/startups and I am not going to  go into how to avoid the situation in this post, it is about the  situation at hand] &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;First, find some calm.&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tK2Pcze5R1o/TbhcitaxgsI/AAAAAAAAACM/RNFkno9-nxk/s1600/keep_calm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tK2Pcze5R1o/TbhcitaxgsI/AAAAAAAAACM/RNFkno9-nxk/s1600/keep_calm.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Second, step back, go for a walk, go to a cafe, take a nap - do what you need to do in order to get some effective head space.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Third,  you need to plan, and I don’t mean a detailed plan, I mean just enough  of a plan to keep you on the right track, a meta-plan if you like,  something to guide you.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;So you are now calm, you can judge risk more clearly, you can make decisions, you will make less mistakes.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If  you are still doing features I recommend setting up a really simple  “Kanban” board. &amp;nbsp;Something like [ backlog | dev | test | deploy | accept  ], put up a few of the most important/riskiest tasks (negotiate, argue,  decide amongst the team and the product owner) on the left, and pull  them across one at a time right through to the end before starting the  next - don't be tempted to work on too many at once, more team members than cards in flight is a good rule of thumb. &amp;nbsp;When that bunch is done, put up the next few important and  repeat, keep the number of cards on the board small, don’t overwhelm it  or yourselves. &amp;nbsp;Don’t get hung up on the column names and the card  content/structure - just do the minimum to keep a tab on what you are  doing, adjust as appropriate.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Its  likely that you are close to release, perhaps your stuck in a nasty  bug/quick fix cycle. &amp;nbsp;“This change will fix it, ah no, damn, ah, try  this, and this..... “. Time to break cycle. &amp;nbsp;This sort of thing will  destroy the confidence of your client, your credibility and damage the likelihood of future work.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;So  how do you break out of this? &amp;nbsp;Don’t guess, be data driven, work from facts and not supposition, that meas work from test results. &amp;nbsp;Ideally you’ll be  using TDD or BDD style methods but if you aren’t you can still leverage some of those  ideas to help break the cycle. &amp;nbsp;Reproduce failures, if possible work out how to  automate that test - even a simple bash script using curl and grep with a  simple assertion (exit 1) is better than nothing. &amp;nbsp;And will help  prevent that problem creeping back in later.&amp;nbsp; You can take these tests and later build them into a proper BDD suite.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Take small steps: when confidence is low move slow.&amp;nbsp; By taking small steps you can confidently move forward as you take less risk and its easier to roll back to a known, or at least better known state.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“But  I don’t have an environment to test in” … so this is a huge risk,  usually it is actually the case that the live environment is very different to the test  one. &amp;nbsp;Time to change that, a few hours (even days) will make all the  difference. &amp;nbsp;“We don’t have the hardware” … sorry that excuse is running  out, AWS and other cloud providers allow you to put together a lot of  hardware quickly at pretty reasonable cost that you can turn off when  done - a few hundred $/£/€ may be worth it if you can solve the problems  effectively.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Remember  its not easy, if it was someone would have already done it, so looking  for silver bullets is counter productive. &amp;nbsp;Whilst you can get away with  cutting some corners (with acceptable consequences usually in the form of technical debt) there are some you  can’t - sometimes you just have to accept spending that time and money  to make sure you can test what you are doing adequately.&amp;nbsp; Keep note of those decisions, where you have incurred technical debt, so it can be addressed later. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The  important thing is to maintain perspective. &amp;nbsp;Yes things are bad, but  its possible to bring things under control, when things are in control  you can make better decisions, you can make clear decisions on trade  offs.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Setting  up a ‘war room’ is sometimes a good idea, as long as it promotes that  calm control, and doesn’t become a yelling chaos factory. &amp;nbsp;Protect your  space, make it clear that you don’t want those who will disturb the  groups balance invading that space. &amp;nbsp;Agree to provide status updates on  your terms - ideally your simple Kanban board will give enough of that  status for you!&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Protect  your relationship with the client/customer - keep a clear consistent  communication channel, one person to inform, update and ask questions.  &amp;nbsp;I sometimes call this an Anchor, like a news Anchor they are there to  keep consistency and to keep it (the channel) together under pressure. &amp;nbsp;They can also  help prevent the ‘quick fix/release/break’ cycle by keeping check on the  team output.&amp;nbsp; They should be professional, keep emotion aside (including not reacting to emotion from the other side) and try to build a collaborative approach.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“It’s  not our fault its broken … It works for us” … this is a very common  attitude, however whilst at the time you may think you are right, all  too often you turn out not to be.&amp;nbsp; That is embarrassing and possibly  worse. &amp;nbsp;If its not your fault, be prepared to be able to prove it. &amp;nbsp;If  you can’t prove it and more importantly if you can’t prove it in the environment that your  client is seeing it in, then accept its more likely your problem than  theirs. &amp;nbsp;The worst thing about this sort of response is that it breaks  confidence, and reduces trust because once you do it once it becomes all the more difficult to work closely with the client to solve the next  problem.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;No plan survives contact with the enemy &lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;(http://bit.ly/kl5OgR&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;) be prepared to adapt as necessary.&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp; Periodically  step back, breathe and review the board. &amp;nbsp;Take a quick poll of the  team, chat to the client and sanity check your priorities.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;One  boss early in my career gave me this advice, “In the next quarter they  are not going to remember that you were two weeks late, but they are  going to remember if you delivered them a steaming turd on time”.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Now  days I view this advice in terms of the time/scope/cost triangle - they  won’t remember if you were missing a couple of features, but they will  if it didn’t work at all.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The  goal is to move toward sustainable development and to not be in this  situation to begin with. But things don’t always work out, you and your  team may not have the experience or the available resources, you may just be moving too fast so as not to miss the opportunity. &amp;nbsp;Some times you  find yourself in a fire fight and you need some help with the hose and  not a lecture on the dangers of playing with matches.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Importantly  when the dust settles a bit you make the time to look back, do a  retrospective, try and work out where things went wrong in the first place and  look to improve.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-8789964062331544679?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/8789964062331544679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=8789964062331544679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8789964062331544679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8789964062331544679'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2011/04/when-pressure-is-on.html' title='When the pressure is on'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-tK2Pcze5R1o/TbhcitaxgsI/AAAAAAAAACM/RNFkno9-nxk/s72-c/keep_calm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-500675794612835379</id><published>2011-02-09T21:15:00.000Z</published><updated>2011-02-09T21:15:51.292Z</updated><title type='text'>Estimation? No a distribution of confidence ...</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;I have always been wary of estimation...&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Well no, that's not quite true, I wasn't until I gave an estimate to a salesman, and then I found myself having to meet a hard release date... once bitten... twice bitten... well in reality I am a slow learner so it was probably a couple of dozen times.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Most estimates are really figures plucked from the air by a developer, or worse someone who doesn't actually work on the code, or even far far worse by someone who have never even seen the code.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;So here is my current thoughts on estimation.. not fully formed, and probably poorly communicated, but I still think worth sharing, if only to improve my own understanding.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Even with Agile poker planning methods, estimation is still a dubious business.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;An estimation is only valuable if you are aware of the context in which the estimation was made. &amp;nbsp;Then you must remember that estimation is exactly that, an estimation - it is in fact some sort of distribution curve of the confidence of the person making the estimation.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Huh?&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;What if you plot the 'confidence' of the person making the estimation against the possible solution time. &amp;nbsp;Typically this might look something like this. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_FXuJhOiZZGM/TVL52HwkciI/AAAAAAAAAA8/mQ4kxCK-_oc/s1600/DistributionBroad.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://3.bp.blogspot.com/_FXuJhOiZZGM/TVL52HwkciI/AAAAAAAAAA8/mQ4kxCK-_oc/s320/DistributionBroad.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;The estimate they will give should be around the peak of this curve - well&amp;nbsp;pessimistic&amp;nbsp;estimators will be a bit to the right to give them some margin, and optimistic to the left.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Now the shape of this curve is what is interesting. &amp;nbsp;It will be determined by how 'known' the problem is. &amp;nbsp;So a really well known task may have a graph like so:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_FXuJhOiZZGM/TVL55TW1WNI/AAAAAAAAABA/-Gk4vRx-WrQ/s1600/DistributionImpulse.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_FXuJhOiZZGM/TVL55TW1WNI/AAAAAAAAABA/-Gk4vRx-WrQ/s1600/DistributionImpulse.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;And a conversely really poorly understood problem may have a distribution like:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_FXuJhOiZZGM/TVL57WQsfmI/AAAAAAAAABE/DZBeHc50Nzo/s1600/DistributionFlat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://1.bp.blogspot.com/_FXuJhOiZZGM/TVL57WQsfmI/AAAAAAAAABE/DZBeHc50Nzo/s320/DistributionFlat.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;At either end of the spectrum shown here estimation is pointless.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Either you know the problem so well that time spent estimating is actually waste or you have no idea of the problem so it becomes essentially a random guess. A random guess is more dangerous than not estimating at all.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;So estimation is of most value in this middle region, where you have a reasonable understanding of the problem, but not so well that estimation is just waste. &amp;nbsp;A goldilocks zone if you like.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Good poker planning sessions often are more about the conversations and the discovery around a problem. &amp;nbsp;These discussions attempt to drag the flat distribution into a more normal one where it is sufficient to make an estimate.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;One of the things I have seen here is some teams then get into an obsessive &lt;i&gt;perfection of estimation&lt;/i&gt; loop. &amp;nbsp;Where every retrospective has a key outcome of 'we must improve our estimation'. &amp;nbsp;And I've seen teams haggle for what feels like hours as to whether it really is a 7 hour or 13 hour story.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;Their key outcome is wrong, they are focusing on the wrong thing. &amp;nbsp;The real outcome should be, &lt;i&gt;we should improve our understanding of the problems at hand&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;I think that one way to avoid this&amp;nbsp;obsession&amp;nbsp;is to use T-Shirt sizing - step away from the numbers and use more coarse grain concepts like Small, Medium, Large.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Note that I think story points are better than real time measures but I still think the&amp;nbsp;psychology&amp;nbsp;of dealing with the numbers is the same.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;T-Shirt sizes are coarse, deliberately so. &amp;nbsp;You can start with a rough equivalent to 1 day, 3 day, 5 day - but they should not be thought of in that way when doing the estimation - you just try to group them into general categories of S, M, L.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Over time you can measure what your outputs are, and then you can get average times for each of your sizes and these then can be used by those&amp;nbsp;interested&amp;nbsp;in trying to predict the future.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;So estimation or planning sessions should really be about discovery, learning and then putting that problem into some general category. &amp;nbsp;Importantly&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&amp;nbsp;don't be afraid to turn to the group and say - Hang on, I don't think we can even categorise this, it requires better understanding, more learning - lets take it out of this process and do some more focused work.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;And even if you don't change a single thing about the way you work just think a little about the way you work. &amp;nbsp;Remind yourself that estimation is just that, estimation and just as important remind those who use your estimations.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-500675794612835379?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/500675794612835379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=500675794612835379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/500675794612835379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/500675794612835379'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2011/02/estimation-no-distribution-of.html' title='Estimation? No a distribution of confidence ...'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FXuJhOiZZGM/TVL52HwkciI/AAAAAAAAAA8/mQ4kxCK-_oc/s72-c/DistributionBroad.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-7083803191315466587</id><published>2011-01-29T09:25:00.000Z</published><updated>2011-01-29T09:25:36.398Z</updated><title type='text'>The Failure of the Skunkworks</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Something I have seen as a quite common approach in an organisation is to start a skunkworks project, to get something critical off the ground.  I have been involved in several in the course my career, with varying success.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Typically these initiatives are actually done for the wrong reasons, but that’s not what I am going to talk about here.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;What I have noticed is that more often than not, a skunkworks project is started; a small, skilled and motivated team is split off, it is isolated and allowed to focus on a specific issue.  Now this (sometimes) results in fantastic results, the team is hugely productive and makes brilliant in-roads into the issue.  Their progress reports are astounding and it promises great things.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Then they reach that critical juncture and the team is brought back into the fold.  Unfortunately then more often than not things start to unravel. &amp;nbsp;The business views the final outcome as if not a failure, then a partial one.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Looking at what has happened we can find a lot of potential ‘reasons’ for this:&lt;/div&gt;&lt;ul style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;li&gt;The skunkworks team just failed, they misreported their progress, they built false hope.&lt;/li&gt;
&lt;li&gt;The process of creating a skunkworks team created too much animosity, those left behind were resentful and they then either consciously or unconsciously sabotaged the final integration of the solution.&lt;/li&gt;
&lt;li&gt;The team produced something which whilst it solved the problem, couldn’t realistically be integrated into the ‘real’ system, it was either too advanced or couldn’t be understood by the mere mortals expected to continue or support the work.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Regardless of these and many other possible reasons I actually think there is something very different at work here – I think the perceptions of the above don’t take into account something &amp;nbsp;fundamental.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;When you split off your skunk-works team, you removed them from your ‘System’.   You gave them freedom, they probably self-organised, they were smart and motivated. &amp;nbsp;In their work they created their own little system in a bubble, one that suited their needs and as a result their productivity exploded.  They probably even ignored the remnants of the system they were supposed to use (timesheets... nah can’t be bothered waste of time ...) and got away with it, because they were the skunkworks team, they were special.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Then you dragged them out of that bubble.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Pulled back into the ‘System’, and you crushed them, that bubble dissolved, productivity plummeted and problems rocketed – you re-imposed those constraints which held them back in the first place.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Chances are some of that team you pampered by allowing that&amp;nbsp;microcosm&amp;nbsp;walked out the door, they saw what was possible and had it cruelly ripped out from under them.  The ‘System’ defeated them.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;You see the huge gains in productivity were not down to isolating them, giving them their own coffee machine or supplying them with pizza late into the evenings.  Sure they loved that stuff, but what they really loved was the freedom – the new system they created specifically to meet their goals.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;By System, I don't mean process (Waterfall, SCRUM, etc) , I don't mean the Feng Shui of the office, I don't mean free pizza - the system encompasses all of those things and much more. &amp;nbsp;In turn the system produces a culture, and that culture plays a part in driving the behaviour of the people who work there.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Its an extremely complex system with positive and negative feedback loops and a million variables. &amp;nbsp;More people, more variables, more loops.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div style="font-family: Arial, Helvetica, sans-serif;"&gt;I don’t have a magical solution if you are considering or have an existing a skunkworks project, every situation is different.&amp;nbsp; But I do suggest you step back, and really think about why there needs to be a one. &amp;nbsp;I am betting that stepping back, thinking about the way you work, the system and its culture, that it will help you find alternative paths to solve your problems.&lt;/div&gt;&lt;div style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-7083803191315466587?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/7083803191315466587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=7083803191315466587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7083803191315466587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7083803191315466587'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2011/01/failure-of-skunkworks.html' title='The Failure of the Skunkworks'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-852161720066458061</id><published>2010-11-27T19:40:00.005Z</published><updated>2010-11-27T20:17:13.766Z</updated><title type='text'>The mysterious case of the slow Alpha</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;One of the questions I like to ask candidates during the interview process is, "What is the most memorable problem you have had to solve".  Often I am disappointed in the answers I get and thats with candidates with 10+ years of experience who I would have expected to come across some gnarly problem they had to solve.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Thinking about the question from my own experience I have several answers, but one in particular is now over 10 years old I thought was worth documenting before it fades from my memory.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;In the late 90's and early 00's I worked in a startup in the telephony space, or more correctly the computer telephony integration space.  It was a niche that was growing fast and one we were doing very well in.  We had secured a contract with DEC (just as they merged with Compaq and since merged with HP) to port our software onto DECUnix (later Tru64).  We had been running on Intel based systems for sometime using SCOUnix, Linux and Solaris.  I had joined the team just after the port had been done, we had a couple of systems live and a couple running in labs.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;There were some concerns raised on performance during integration testing with a client, and we embarked on some benchmarking.  We pitted a brand new DS-20 on loan from DEC against our latest and greatest PIII-500 - in theory the DS-20 should have left the P-III in its dust.  But it didn't, it didn't even come close to matching it, in fact in some tests it came in at almost 50% slower.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;There was much gnashing of teeth.  We were relying on the higher performance of the DS-20 to drive our SS7/ISUP solution into new markets at a scale our competitiors couldn't match.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;I was still pretty early in my carreer, wet behind the ears if you like.  I set about looking at what changes had been made during the port, and after a few days could not find any significant changes, those which were made I did some micro-benchmarks on and couldn't find any issue.  We tried tuning the DECUnix kernel, we spoke to Compaq and adjusted everything to what was considered the optimum for our situation, no real change.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Tempers were rising, client was threating to pull the plug, my boss and I were spending hours on end, stepping through code, testing, tuning all to no avail.  Eventually our CTO rang Compaq and gave them a barrage about how **** their Alpha's were and how we were so dissappointed with their performance we were going to drop our port and withdraw from the contract.   After some too'ing and fro'ing Compaq flew an engineer out to take a look at our benchmarks and to see if they could help us out.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;So the engineer arrived, I walked him through our tests, ran the benchmark and showed him the outputs.  He looked over the tuning we'd done and agreed we'd done all the right things.  I asked if he'd like to see the code, he said not yet, instead lets profile it.  Profile?  I'd not really thought of doing that on the Alpha, we'd profiled on the intel, ok so how can we do that on DECUnix?  So he spent a few minutes showing me how to do it, I did a fresh build with profiling enabled, and then we re-ran the benchmark with profiling on.  As expected it was slower still, but we generated a profile.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Right lets take a look.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;The engineer looks at the results and within 30 seconds he said, 'Any reason you are opening /dev/null 11 million times during that test?'....huh, WTF?!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;I looked through the application code, no references to '/dev/null' - it must be from somewhere else.  Some find, strings and grep later we found the culprit, a shared library with no much in it, but it wasn't a DEC library.  A search through our CVS repository, and I found a small module written by my predecessor who left a few days after I started - just after he'd finished setting up the new server.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;In that module was a single function snprintf ... and a lot of comments abusing DEC for not including this function in their standard libraries......&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;And in that function was the reference to /dev/null&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;He had implemented his own snprintf, and thought he'd done a smart job.  He was using the fact that fprintf would return the length of what was outputted, so in order to determine the length of the input he would open /dev/null, fprintf it, get the length, close /dev/null and then use that length to determine if the input needed truncation before calling sprintf.  Oh crap.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Some quick hacking, a fresh build, and bang our Alpha was now screaming along just under twice as fast as the Intel.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Red faced, I thanked the engineer, and slunk off to explain to the CTO where the problem was.  A day or so later we shipped a new version to our client using the GNU library instead of our insane one.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Contracts saved, faces red and a lot learnt.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-852161720066458061?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/852161720066458061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=852161720066458061' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/852161720066458061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/852161720066458061'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2010/11/mysterious-case-of-slow-alpha.html' title='The mysterious case of the slow Alpha'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-4218788784456533162</id><published>2010-03-15T18:45:00.005Z</published><updated>2010-03-19T06:15:48.834Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2010 Wrapup</title><content type='html'>&lt;font face="arial"&gt;
Last week I attended QCon London 2010.  I was lucky enough to get to two days of tutorials as well as the full three days of the conference.&lt;br/&gt;
&lt;br/&gt;
First up I attended the brilliant Rest In Practice tutorial run by Jim Webber and Ian Robinson.  The tutorial is based around their forthcoming book with Savas Parastatidis which now in &lt;a href="http://oreilly.com/catalog/9780596805838"&gt;rough cuts&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
The tutorial covered a lot of ground, and was well presented.  By using Hypermedia you can create very rich services and this tutorial provided a great insight on how and why you should do just that.  It provided a good overview of what REST really is using the &lt;a href="http://www.crummy.com"&gt;Leonard Richardson&lt;/a&gt; maturity model, and how most services that tout being RESTful are not actually fully RESTful (though they may indeed still be of value).&lt;br/&gt;
&lt;br/&gt;
On day 2 I attended the Resource Oriented Architecture tutorial run by Brian Sletten.  Before going in I wondered if I'd made a mistake selecting two REST tutorials - but it turned out to be a great choice, it was complementary to the day before.&lt;br/&gt;
&lt;br/&gt;
One of the most memorable parts of the tutorial was the 'musical interlude' where Brian did a brilliant job of explaining derivative works, and how public data opens up a world of possibilities.&lt;br/&gt;
&lt;br/&gt;
The conference proper kicked off on Wednesday.  The opening key note by Bob Martin, whilst at times a bit preachy, was entertaining and re-enforced some good development practices.&lt;br/&gt;
&lt;br/&gt;
As usual it was difficult at times to chose which talk to attend, which became irritating when you hit a slot where there were no talks that stood out.  This year was also much busier, with rooms becoming crowded and at times overcrowded.  I felt that it wasn't quite as well organised this year, things didn't flow quite as well and some of the speakers seemed ill prepared.&lt;br/&gt;
&lt;br/&gt;
However many of the talks were of high standard, and very enjoyable.&lt;br/&gt;
&lt;br/&gt;
Unlike last year I am not going to try and summarise every talk I went to, I just don't have the time these days. But some stand outs for me included:&lt;br/&gt;
&lt;br/&gt;
&lt;font style="font-weight: bold;"&gt;The Counter-Intuitive Web by Ian Robinson&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;
One of the best talks of QCon, Ian delved into the differences between Operation and Resource centric architectures - some overlap with Mondays tutorial, but was in many ways complimentary.&lt;br/&gt;
&lt;br/&gt;
He talked about how to map Domains on to Resources and how HTTP can be used appropriately as the Application Transfer Protocol and not just treated as a Transport Protocol.  One of the best tag-lines of the talk was 'Intention should be written on the wire'.  The idea that contracts can be expressed simply in the combination of link relations, media types, HTTP idioms and an entry point URI.&lt;br/&gt;
&lt;br/&gt;
&lt;font style="font-weight: bold;"&gt;Simplicity - The Way of the Unusual Architect by Dan North&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;
Dan is a great speaker, entertaining and engaging.  The talk started with a comical biblical style story with one of my favourite lines being - "And Maven brought forth a Plague of Apache Commons, and there was a flood of all the Libraries of the Internet as a judgement upon the people"&lt;br/&gt;
&lt;br/&gt;
The talk was about how we over complicate things, gradually over time we introduce further and further complexity.  Dan presented some techniques to try and address these tendencies.&lt;br/&gt;
&lt;br/&gt;
&lt;font style="font-weight: bold;"&gt;How to do over 100K contended complex business transactions per second at less than 1ms latency - Dave Farley &amp;amp; Martin Thompson&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;
Ok, the only thing I can say is - this hurt my brain.  Their solution was computer engineering elegance, hitting the sweet spot at every point in the chain - really forced me to think about how to approach problems and really reminded me of the early days of PC's where every bit of performance was eeked out of the system.&lt;br/&gt;
&lt;br/&gt;

&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-4218788784456533162?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/4218788784456533162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=4218788784456533162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/4218788784456533162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/4218788784456533162'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2010/03/qcon-london-2010-wrapup.html' title='QCon London 2010 Wrapup'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-6091372249771284015</id><published>2009-10-18T10:58:00.006+01:00</published><updated>2009-11-21T11:38:55.942Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Failure'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>The Freedom to Fail</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;
Recently I had a discussion with a colleague about his strong 'fear of failure'.  We spoke about it and hopefully I put his fears into context, and I will try and build on that here.&lt;br/&gt;
&lt;br/&gt;
Now the Fear of Failure is important, it helps keep us motivated, it keeps us diligent and for some people its is truly what drives them.  However in our industry it also stifles growth, innovation and promotes over conservative behaviour.&lt;br/&gt;
&lt;br/&gt;
I am quite lucky in my current role, I lead a team of engineers who have explicitly been given 'The Freedom to Fail' - it is actually in the team mission statement, how neat is that?&lt;br/&gt;
&lt;br/&gt;
Now that doesn’t mean its ok to sit back relax and just let projects crash on to the rocks.  There are some projects that we should not ever fail on, those where a solution is self-evident, where we have more than adequate resources and where risks are contained.&lt;br/&gt;
&lt;br/&gt;
But what it does mean is, we can be more experimental in our approach, we can truly try and learn whilst tackling the challenge, and we can try things that normally would be considered risky.  We get a chance to learn and grow.&lt;br/&gt;
&lt;br/&gt;
In an organisation that in many ways is very conservative, and in a current climate that promotes that conservatism, we break the mold.&lt;br/&gt;
&lt;br/&gt;
Now that doesn't mean we do things purely because we like the idea of them (well I lie, we occasionally do but as a learning exercise).  But we question the traditional approaches, we ask ourselves if the "typical" solution is appropriate, if the corporate template is appropriate and seek out other approaches which may indeed prove to be a better fit.&lt;br/&gt;
&lt;br/&gt;
Perhaps luckily our choices have proved successful more often than not.  But things do go wrong, we on occasion do fail and wind up either having to restart, rework or abandon a piece of work.&lt;br/&gt;
&lt;br/&gt;
It is not wrong to fail, however it is very very wrong to hide, deny or ignore failure.  That failure may only be partial or minor, but it is still a failure and needs to be addressed.&lt;br/&gt;
&lt;br/&gt;
So here is what is important...&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Identify Failure&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
Have a way of identifying failure (and subsequently success).  There are many useful techniques that can be applied here, including time boxing, acceptance testing and "done means done". &lt;br/&gt;
&lt;br/&gt;
Time boxing can be vitally important.  Estimated work often overruns its a fact of life, we are poor at estimating and often something simple takes a lot longer than expected.  Using a time-box you can identify that you have failed, and you need help, need to change approach or need to give up.&lt;br/&gt;
&lt;br/&gt;
Acceptance testing lets you prove that you haven't failed.  In many cases I take a pessimistic view of success, if its not passing all the tests its a fail.&lt;br/&gt;
&lt;br/&gt;
Done means done" - all too often you can ask if feature X finished and you'll get the reply "oh yes that's done but this part needs tweaking".  Sorry pal, if that part needs tweaking its not done, now put that card back into "in progress" and finish it properly before declaring it done.&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Understand the consequences of Failure&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
It is important to understand what the consequence of failure is at every point.  There are varying magnitudes to this, both at a project planning "will we get this done on time" point of view and real life consequences of failure of the project after release.&lt;&lt;br/&gt;
&lt;br/&gt;
It is important to know what can be done (if anything) to mitigate the failure.  Can a different approach be taken, can another team undertake the work, can we just ditch it?&lt;br/&gt;
&lt;br/&gt;
Structure what you do to ensure any failure occurs as early as possible in the process.  Failing quickly increases the chances that we can mitigate the failure or if that is not possible then stop work before more resources are wasted.&lt;&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Understand the Root Cause of the Failure&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
All too often the root cause of a failure is not fully understood.  "We think its because the connection pool was used up and that caused ..." - wait up here, stop, "We think?"&lt;br/&gt;
&lt;br/&gt;
In some cases the root cause is obvious and at other times it requires investigation (root cause analysis) however something that is often over looked is what I consider "people problems".&lt;br/&gt;
&lt;br/&gt;
Dealing with people is hard, especially in an industry known for having anti-social tendencies.  Quite often people without the correct skills, experience or support are given problems they are just not equipped to handle - and thats a management failure.&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Disseminate the Failure&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
This is the bit a lot of people shy away from.  I have a great deal of respect for someone who can stand up in a meeting and say, "yeah I screwed that up, I need help to find a way to resolve it".&lt;br/&gt;
&lt;br/&gt;
In my experience the failure to discuss failure is worse than the original failure - it dooms others to repeat it.  And covering up a failure is far far worse than than actually failing, perpetuating a lie that something works when it doesn't.&lt;br/&gt;
&lt;br/&gt;
Honesty is indeed the best policy.  Of course I don't mean that companies should publicly air their dirty laundry but rather within your team (and hopefully within your entire company) there should be open, honest and frank communication.&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Final Whitterings&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
Does your team fear failure to the extent they don't think outside what they think is expected of them?  Worse yet do they fear it to the extent they will actively hide or deny it?  Are you holding your team back through your own fears?&lt;br/&gt;
&lt;br/&gt;
Building a sense of trust within a team is vital, how you address the issue of failure I think is vital.&lt;br/&gt;
&lt;br/&gt;
If you work in an environment where failure is expensive then try and create a space where it is acceptable.  Code Dojo's, Hack Days and similar events give people a chance to flex their mental muscles, their creativity and lets them grow, it gives them that freedom to fail.&lt;br/&gt;
&lt;br/&gt;
Can't afford to fail?  Can't afford not to learn from failure.&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-6091372249771284015?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/6091372249771284015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=6091372249771284015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/6091372249771284015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/6091372249771284015'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/10/freedom-to-fail.html' title='The Freedom to Fail'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-7361210956403973774</id><published>2009-08-25T13:27:00.011+01:00</published><updated>2009-08-25T14:28:28.232+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>Learning Scala when Sleep Deprived</title><content type='html'>&lt;span style="font-family: arial;"&gt;So I've not blogged anything in a while, usual excuse of being busy, the not so usual excuse of becoming a Dad for the second time.  So as well as being busy I am somewhat sleep deprived.&lt;br/&gt;

I've been doing some stuff with Scala and Lift, and hit a really basic issue that took me a moment (in my current state that equals about an hour) to understand.&lt;br/&gt;

I had a couple of classes and was trying to access a field in one class from another ... well I thought it was a field.&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: groovy"&gt;
package foo

class A( name: String ) { }

class B() {
  val myA = new A("foobar")
  println( myA.name )
}
&lt;/pre&gt;
&lt;br/&gt;
When I compiled I got this error:&lt;br/&gt;
&lt;br/&gt;
error: value name is not a member of foo.A&lt;br/&gt;
&lt;br/&gt;
Huh?  Fields are public by default in Scala, what is going on here.  It really had me stumped, my addled brain failed to find any reason for this, and a google search found nothing really useful.&lt;br/&gt;
&lt;br/&gt;
So I changed my code to...&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: groovy"&gt;
class A( name: String ) {
  def getName = { name }
}

class B() {
  val myA = new A("foobar")
  println( myA.getName )
}
&lt;/pre&gt;
&lt;br/&gt;
Now I was calling a method which simply returned name, this compiled and ran fine.  So why did my original code not work?  And why if I first thought that perhaps constructor parameter generated fields were private, but why did I not get an accessibility error?&lt;br/&gt;
&lt;br/&gt;
Then I had a thought, how does the compiler know if 'name' is a val or a var?  What if I explicitly state so?&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: groovy"&gt;
class A( val name: String ) { }

class B() {
  val myA = new A("foobar")
  println( myA.name )
}
&lt;/pre&gt;
&lt;br/&gt;
This worked.  Interestingly using 'var' worked as well - I can only assume that the compiler is getting confused if its not specifying it and so silently doesn't create a field.  Even though you can still reference it internally in the class it has no external representation.&lt;br/&gt;
&lt;br/&gt;
Perhaps a case for either a warning or better error granularity?&lt;br/&gt;
&lt;br/&gt;
Or perhaps just a case for me to get more sleep?&lt;br/&gt;
&lt;br/&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-7361210956403973774?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/7361210956403973774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=7361210956403973774' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7361210956403973774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7361210956403973774'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/08/learning-scala-when-sleep-deprived.html' title='Learning Scala when Sleep Deprived'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-8156911274969104682</id><published>2009-06-04T19:36:00.003+01:00</published><updated>2009-06-09T10:52:45.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>In order to ...</title><content type='html'>&lt;span style="font-family: arial;"&gt;
Lately I've been doing some story generation for a few projects, and I've really been focusing on the idea of putting value first.&lt;br/&gt;
&lt;br/&gt;
Its a subtle, but powerful idea.  I was introduced to it by &lt;a href="http://dannorth.net/"&gt;Dan North&lt;/a&gt; during his tutorial on &lt;a href="http://qconlondon.com/london-2009/presentation/Behaviour-driven+development%3A+writing+software+that+matters"&gt;BDD at QCon London 2009&lt;/a&gt; and it really clicked.&lt;br/&gt;
&lt;br/&gt;
I've been doing quite a bit of process work involving Kanban, which really focuses on value - so it has a kind of synergy (pardon me while I wash my mouth out for using management speak).  &lt;a href="http://lizkeogh.com/"&gt;Liz Keogh&lt;/a&gt; also wrote a good article for &lt;a href="http://infoq.com"&gt;InfoQ&lt;/a&gt; recently on &lt;a href="http://www.infoq.com/articles/pulling-power"&gt;Kanban and BDD.&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
So the format we've chosen is the same Liz describes in her article:&lt;br/&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;span style="font-family: courier new; font-weight: bold;"&gt;
In order to ...&lt;br/&gt;
As a ...&lt;br/&gt;
I want ...&lt;br/&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;span style="font-family: arial;"&gt;
And its working really well so far.  By putting the value first it makes more sense to our domain experts, who typically being non-technical in most cases got stuck on "As a", and "I want".  And we've found that we keep our scope better contained as people stop thinking about "I want" and concentrate on the end value of "In order to".&lt;br/&gt;
&lt;br/&gt;
So if you are working on stories I would really encourage you to try this one simple change.  Hopefully you'll see the benefits.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-8156911274969104682?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/8156911274969104682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=8156911274969104682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8156911274969104682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8156911274969104682'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/06/in-order-to.html' title='In order to ...'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-3015929275020280857</id><published>2009-05-28T21:05:00.003+01:00</published><updated>2009-06-09T10:54:52.945+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CI'/><category scheme='http://www.blogger.com/atom/ns#' term='Ant'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ivy'/><title type='text'>IVY</title><content type='html'>&lt;span style="font-family:arial;"&gt;
One of the things I have been using lately is Ivy.&lt;br/&gt;
&lt;br/&gt;
In the past I have had to use Maven on various projects - and must admit, I hated it.  Whilst it might be really trendy at the moment to use "convention over configuration" to me doesn't sit well in a build system.  Several times what I've needed to do hasn't fit into the Maven model and I really dislike having to "wedge things in" to appease a tool.&lt;br/&gt;
&lt;br/&gt;
But one thing I did like was the dependency management.&lt;br/&gt;
&lt;br/&gt;
Well Ivy gives you this, without all the other stuff you don't need.  You use it from Ant, its clean and easy to manage dependencies, and it leverages the existing Maven repositories.&lt;br/&gt;
&lt;br/&gt;
And something else neat is the ability to bootstrap it from Ant, so you don't have to rely on someone having Ivy already installed, you can install it from within your Ant build and use it on the fly.&lt;br/&gt;
&lt;br/&gt;
What I do is this, create an install-ivy.xml with the following contents:&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;project ivy="antlib:org.apache.ivy.ant"&gt;
  &amp;lt;property name="ivy.install.version" value="2.1.0-rc1"&gt;
  &amp;lt;property name="ivy.jar.dir" value="${basedir}/.ivy"&gt;
  &amp;lt;property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"&gt;

  &amp;lt;target name="download-ivy" unless="skip.download"&gt;
    &amp;lt;mkdir dir="${ivy.jar.dir}"&gt;
    &amp;lt;get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" dest="${ivy.jar.file}" usetimestamp="true"/&gt;
  &amp;lt;/target&gt;

  &amp;lt;target name="install-ivy" depends="download-ivy"&gt;
    &amp;lt;path id="ivy.lib.path"&gt;
      &amp;lt;fileset dir="${ivy.jar.dir}" includes="*.jar"&gt;
    &amp;lt;/path&gt;
    &amp;lt;taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"&gt;
  &amp;lt;/target&gt;

  &amp;lt;target name="clean-ivy"&gt;
    &amp;lt;delete dir="${ivy.jar.dir}"&gt;
  &amp;lt;/target&gt;

  &amp;lttarget name="clean-ivy-cache" depends="install-ivy"&gt;
    &amp;lt;ivy:cleancache&gt;
  &amp;lt;/target&gt;

&amp;nbsp;&amp;lt;/project&gt;
&lt;/pre&gt;
Then in the build.xml I add an:&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: xml"&gt;
    &amp;lt;import file="install-ivy.xml"&gt;
&lt;/pre&gt;

Then have a target like:&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: xml"&gt;
  &amp;lt;target name="resolve" depends="prepare,install-ivy"&gt;
    &amp;lt;ivy:retrieve&gt;
  &amp;lt;/target&gt;
&lt;/pre&gt;

Then its just a matter of setting up your ivy.xml with your dependencies, which could be something simple like:&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;ivy-module version="2.0"&gt;
  &amp;lt;info organisation="org.apache" module="hello-ivy"&gt;
  &amp;lt;dependencies&gt;
    &amp;lt;dependency org="com.thoughtworks.xstream" name="xstream" rev="1.3.1"&gt;
    &amp;lt;dependency org="commons-lang" name="commons-lang" rev="2.4"&gt;
    &amp;lt;dependency org="junit" name="junit" rev="4.5"&gt;
    &amp;lt;dependency org="org.mockito" name="mockito-all" rev="1.7"&gt;
  &amp;lt;/dependencies&gt;
&amp;lt;/ivy-module&gt;
&lt;/pre&gt;
&lt;br/&gt;
One of the good things I find is that, I work on a variety of machines, and I don't need to install ivy, my build scripts do it for me as and when.&lt;/br&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-3015929275020280857?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/3015929275020280857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=3015929275020280857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/3015929275020280857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/3015929275020280857'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/05/ivy.html' title='IVY'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-8174889382306515028</id><published>2009-05-18T20:21:00.002+01:00</published><updated>2009-06-19T21:31:07.189+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>An Unexpected(?) Advantage of TDD</title><content type='html'>&lt;span style="font-family:arial;"&gt;So there are a lot of advantages to using TDD, they are well documented and there are plenty of people who extol its virtues.&lt;br/&gt;
&lt;br/&gt;
One of them however has resonated with me of late.  And that is how it effectively builds a living document of the implemented functionality of your system.&lt;br/&gt;
&lt;br/&gt;
I am working on a personal project, and the time I can spend on it is quite sporadic.  Between work and a young family, time to code for fun is quite broken - 10 minutes here, an hour there, a weeks break, another 10 minutes and so forth.  It doesn't make for much of a flow.&lt;br/&gt;
&lt;br/&gt;
But what I have found is, by sticking to TDD and by using test names that are informative that I have built a living document of what I've implemented.  So when I come back to the code even for a moment I know where I am.  Run the tests, and green, there is all my functionality.&lt;br/&gt;
&lt;br/&gt;
Better yet, the breaks force me to revisit my naming, and I actively refactor the code (including the tests) to try and make it more readable.&lt;br/&gt;
&lt;br/&gt;
I've also found that by invoking the "&lt;span style="font-style: italic;"&gt;if its not green at then end of the session then ditch it&lt;/span&gt;" rule quite effective too.  Now you might say that if you only have five minutes to work on it then chances are you're not going to get to &lt;span style="font-style: italic;"&gt;green&lt;/span&gt;.  And a lot of the time its true - but before I stop, I roll back to &lt;span style="font-style: italic;"&gt;green&lt;/span&gt;.&lt;br/&gt;
&lt;br/&gt;
Now at first that seems counter productive, as the tests will show where its broken and you know where to come back to - but in practice I have found that it actually tends to mislead me, particularly if I have been away from it for a while.  So better to return to a clean slate.  Then what I find is that my subconscious tends to chew on the problem for a while, and when I come back to it I find my flow much quicker.&lt;br/&gt;
&lt;br/&gt;
So its just another reason to use TDD and descriptive test names.&lt;br/&gt;


&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-8174889382306515028?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/8174889382306515028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=8174889382306515028' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8174889382306515028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8174889382306515028'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/05/unexpected-advantage-of-tdd.html' title='An Unexpected(?) Advantage of TDD'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-5835370073152948349</id><published>2009-05-08T21:12:00.003+01:00</published><updated>2009-06-09T10:31:28.868+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Building your Village</title><content type='html'>&lt;span style="font-family:arial;"&gt;On Friday the 24th of April I ran an Agile day for my team and others at the BBC, I managed to get some good speakers on a variety of Agile and Development topics - it turned out to be a really good day.  The official blog post on it is almost ready to go up.&lt;br/&gt;
&lt;br/&gt;
During the day my mind drifted on to the importance of interactions.&lt;br/&gt;
&lt;br/&gt;
I tend to see a project team as a village, the village should be as self contained as possible - the butcher, the baker and the candlestick maker.  Everyone in a village has their part to play in its success.   And in a strong village everyone pulls together when times are tough, they come to a fellow villagers aid in times of trouble.&lt;br/&gt;
&lt;br/&gt;
So whilst we may have a team made of specific roles and skill sets the team is greater than the sum of its parts.  So as a project suffers challenges the team &lt;span style="font-weight: bold;"&gt;should&lt;/span&gt; pull together to meet those challenges.&lt;br/&gt;
&lt;br/&gt;
I have worked in teams that do this naturally, and teams where its just never quite happened and teams where it never had a chance.&lt;br/&gt;
&lt;br/&gt;
The teams where it worked had a few things in common:&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Experience&lt;/span&gt; - in all cases the team was experienced, both in software engineering and the problem domain.  Each team had at least one problem domain expert, someone who could answer or anticipate the questions.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Attitude&lt;/span&gt; - in all cases the team had a strong professional attitude.  Not only did the teams strive to minimise technical debt, but all had generally strong work practices.   That sense of professionalism actually was strong enough that the team was able to "stand up" to management at those times when it was really needed.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt; - in all cases the team was motivated.  And typically the motivation came from the enjoyment of working with a great team doing great stuff.  Something that is often overlooked.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Now if you had these things you could argue that pretty much any process would work, and I would agree - not all these projects were what we would call Agile today.  But they were Agile in the sense of putting People and Interactions, before Process and Tools.&lt;br/&gt;
&lt;br/&gt;
So if your team is not pulling together in troubled times, look at the three points above.  Does your team have experience, attitude and motivation?  If it doesn't you need to look at how to address it.  And you don't need to be the team leader or manager to address it - its amazing what influence any member of the team can have if they are prepared to talk to their team members.&lt;br/&gt;
&lt;br/&gt;
So how do you build your village?&lt;br/&gt;
&lt;br/&gt;
Firstly, interaction.  How well does the team communicate?  &lt;/span&gt;&lt;span style="font-family:arial;"&gt;All the members of the team need to feel that they can speak up, and all the members of the team have an obligation to listen.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;  Do you all sit together?  If you can't sit together do you use the same watercooler or coffee machine?  How often do you have lunch or go to the pub as a team?&lt;br/&gt;
&lt;br/&gt;
I wrote a little while ago about &lt;a href="http://glen-ford.blogspot.com/2009/04/software-development-is-social-activity.html"&gt;development being a social activity&lt;/a&gt; - this follows on that great teams subconsciously understand this.  Now by social I don't mean going out and partying, but I mean &lt;span style="font-weight: bold;"&gt;interacting&lt;/span&gt;.&lt;br/&gt;
&lt;br/&gt;
So why do I think interaction on these levels is so important?&lt;br/&gt;
&lt;br/&gt;
Well a team that communicates well will be more fun to work with, it will improve team motivation, it will lead to improved attitude (management by example or culture) and it will encourage everyone to use their experience, encourage people to improve or better themselves.&lt;br/&gt;
&lt;br/&gt;
Its not going to solve the problem of having domain experts, java experts, jvm tuning experts - but you in the end you get to be an expert by doing and learning.  Ideally by learning from another expert, but that doesn't have to be from the team, it could be from conferences, blogs, mailing lists, geek nights, books, consultants or from another team in the organisation.  Building the right village will encourage the team to learn, to rise to the challenge.&lt;br/&gt;
&lt;br/&gt;


&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-5835370073152948349?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/5835370073152948349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=5835370073152948349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/5835370073152948349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/5835370073152948349'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/05/building-your-village.html' title='Building your Village'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-8740151254665759089</id><published>2009-04-22T21:10:00.001+01:00</published><updated>2009-06-09T10:33:12.533+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><title type='text'>URIPlay is now OpenSource</title><content type='html'>&lt;span style="font-family:arial;"&gt;
A little late but URIplay is now available as OpenSource, the &lt;a href="http://open.bbc.co.uk/rad"&gt;BBC RAD Team&lt;/a&gt; has made the code available under the Apache 2.0 license&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;span style="font-family:arial;"&gt;URIplay is a name service for media content, giving each file a URI and a simple description. Think of it as DNS for media. The service is not intended to be used directly by viewers. Like DNS, it works behind the scenes to make things easier.&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-family:arial;"&gt;You can see a simple demo here: &lt;a href="http://open.bbc.co.uk/rad/projects/uriplay"&gt;http://open.bbc.co.uk/rad/projects/uriplay&lt;/a&gt; &lt;a href="http://open.bbc.co.uk/rad/uriplay.php"&gt;&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
The code has been picked up and is already evolving here:  &lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;a href="http://uriplay.org/"&gt;http://uriplay.org&lt;/a&gt;&lt;/span&gt;
&lt;span style="font-family:arial;"&gt;
&lt;/span&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-8740151254665759089?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/8740151254665759089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=8740151254665759089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8740151254665759089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/8740151254665759089'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/04/uriplay-is-now-opensource.html' title='URIPlay is now OpenSource'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-4920276069528703699</id><published>2009-04-14T20:10:00.002+01:00</published><updated>2009-06-09T10:34:15.270+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><title type='text'>Why do we assume they know what they are doing?</title><content type='html'>&lt;span style="font-family:arial;"&gt;I had a interesting thought whilst talking to someone about the whole 'Twitter using Scala' thing.&lt;br/&gt;
&lt;br/&gt;
Now I have no vested interest in either Ruby or Scala.  I like both languages, I tend to lean toward Scala as I am a staticly typed kind of guy, but in the end I like to think I am a pragmatist and will use the right tool for the job.&lt;br/&gt;
&lt;br/&gt;
But what got me after looking at all the blog posts, all the tweets and email threads was, why do we assume that they (Twitter) know what they are really doing?  Now I am by no means having a go a Twitter, I think it was a brilliant idea, it has captured the imagination of many and I see plenty of people that bag it still updating their status every hour or more.&lt;br/&gt;
&lt;br/&gt;
But coming up with a great idea for a service doesn't mean you instantly know the right way to implement it - especially if its never been done before.&lt;br/&gt;
&lt;br/&gt;
So Twitter, its kind of like a global IRC service, its web-scale.  Did the guys that came up with the idea have any experience with building web-scale services?&lt;br/&gt;
&lt;br/&gt;
(Hint: buy &lt;a href="http://jim.webber.name/"&gt;Jim Webber&lt;/a&gt; a few beers if you want to know how to play nicely at web scales and how to leverage its nature to your advantage).&lt;br/&gt;
&lt;br/&gt;
So as the debate over Ruby-vs-Scala continues, which I think is irrelevant, the real questions on the learning Twitter has gone through linger on.  Have they learnt enough about the domain (web scale messaging)?  Has the underlying Architecture improved or does it remain the same regardless of the language of implementation?&lt;br/&gt;
&lt;br/&gt;
My guess (and it is a guess) is the Architecture remains the same.  In that case they may have undertaken what has been done many times before and just reimplemented it but in another language. They may have even done it right, managed to get a clean break from some technical debt that was dragging them under, but in my experience, that never quite happens either.  So you are still faced with technical debt (possibly even more) as well as a sub-optimal architecture.&lt;br/&gt;
&lt;br/&gt;
Having said all of that, it is worth keeping in mind that Twitter is still here today and is still increasing in popularity despite the "Fail Whales".  And I will continue to use it.&lt;br/&gt;
&lt;br/&gt;
And in reality this doesn't just go for Twitter, theirs just happens to be more public than most.&lt;br/&gt;
&lt;br/&gt;
So a reminder (to myself as much as anything) - Before reaching out for that implementation solution, that golden hammer - its worth stepping back, taking a break and looking at the architecture and even the requirements and asking is that really valid, does it really have to be 'that' way?  Are we making life more difficult for ourselves.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-4920276069528703699?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/4920276069528703699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=4920276069528703699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/4920276069528703699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/4920276069528703699'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/04/why-do-we-assume-they-know-what-they.html' title='Why do we assume they know what they are doing?'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-982248442581264808</id><published>2009-04-14T13:22:00.003+01:00</published><updated>2009-04-14T20:15:32.891+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Fluent Java Interface for generating HTML</title><content type='html'>&lt;span style="font-family:arial;"&gt;Am very happy to see that Alistair Jones (&lt;a href="http://building-hbimp.blogspot.com/"&gt;of How Big is my Potato fame&lt;/a&gt;) has produced a neat Fluent Interface for generating HTML from Java:

&lt;a href="http://code.google.com/p/hypirinha/wiki/Tutorial"&gt;http://code.google.com/p/hypirinha/wiki/Tutorial&lt;/a&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-982248442581264808?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/982248442581264808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=982248442581264808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/982248442581264808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/982248442581264808'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/04/fluent-java-interface-for-generating.html' title='Fluent Java Interface for generating HTML'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-81217245081403330</id><published>2009-04-13T08:51:00.004+01:00</published><updated>2009-06-09T10:36:02.958+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Software Development is a Social Activity</title><content type='html'>&lt;span style="font-family:arial;"&gt;Something I have been pondering for a while, is "Why is software so hard?".  I know it is hard, I have spent a long time working in the industry, I have seen it fail - thankfully I have seen it succeed (albeit often "challenged") more regularly.  I have read a lot of books and talked to a lot of people, but still I felt something was missing.&lt;br/&gt;
&lt;br/&gt;
Computers are logical devices, they follow your instructions exactly without the slightest deviation - however being human we are not logical, and we do not execute or think naturally in the same precise logical manner.  Our brains are non-linear, we make jumps, we shift through varying layers of abstraction and we rarely stay in that logical state for too long.&lt;br/&gt;
&lt;br/&gt;
But that still doesn't explain why software is &lt;span style="font-weight: bold;"&gt;so&lt;/span&gt; hard.  We also have the tools to focus us and guide us when it comes to writing the code.  Compilers, unit tests, analysis tools, exploratory testing as well as a myriad of processes attempt to focus us on the problem at hand.  So why is it still so hard?&lt;br/&gt;
&lt;br/&gt;
I think one of the leading reasons is this, Software Development is a Social Activity and those that work in software development are stereo-typically anti-social in nature.  Yes it is a stereo-type, but it does have a firm foundation in the truth.  By in large, we are not social butterflies, we tend to prefer the company of machines to that of humans, the company of our problem domain to that of other people.  I hear cries of disagreement from some quarters - yes it is not the rule, there are some highly sociable developers out there.&lt;br/&gt;
&lt;br/&gt;
However time and time again, I have seen software projects flounder because of the lack of both information and 'social' bandwidth.  By social bandwidth I mean the social interactions between members of the team.  Good social bandwidth from my experience requires a very high information bandwidth - face to face communication is good example.  This is somewhat difficult to explain, and something I feel that I am only beginning to grasp.
&lt;br/&gt;
Email has perhaps one of the narrowest social bandwidths of all.  You have no real sense of the other persons state of mind, their current emotion or their current physical situation.  Its even narrower when one or even both parties don't recognise that fact.  We have all witnessed email storms caused by an off the cuff comment at one time or other.&lt;br/&gt;
&lt;br/&gt;
An area of high social bandwidth is the office coffee machine or water cooler.  Where people tend to meet, talk and exchange idea's purely because of the constructed environment - you would not choose to go and chat to a random person every hour or so just for the hell of it (... or maybe you would, maybe you are one of those social butterflies).&lt;br/&gt;
&lt;br/&gt;
Location is a key factor here, as we congregate together to work, we construct a village, a place of community.  Now communities don't always get on, and certainly are not all best friends - but they do tend to build a spirit over time, especially where interaction is unavoidable.&lt;br/&gt;
&lt;br/&gt;
The act of developing a piece of software is the act of a community, it requires a varied team.  Just as the village requires the butcher, the baker and the candle-stick maker.  The most productive teams recognise and encourage that variation in skills, and tend naturally strive to increase their social bandwidth to spread those skills and experience.&lt;br/&gt;
&lt;br/&gt;
Too many times I have heard a senior manager, who having walked into the office for 30 seconds in a month, complain that a team is not working hard enough - when I know what they heard was actually the sound of productivity, the sound of high information and social bandwidth.  A team with a strong bond, can have a chat or a laugh - a positive working environment increases productivity, it makes people want to come into the office.&lt;br/&gt;
&lt;br/&gt;
Now I am not saying the team needs to hold hands and sing campfire songs, but rather the team needs interaction.  It needs developers, testers, business analysts, project managers and customers to interact.  And the team should foster that interaction both professionally and socially.  I've seen project managers turn down a pub lunch request which would have done wonders in building a fragile relationship into something more substantial.&lt;br/&gt;
&lt;br/&gt;
It is important that this social drive come from within the team, and not an enforced company social event, one which will leave some feeling awkward or even resentful, and actually discourage some from attending at all.  A sense of professionalism can provide that balance, and it is more than achievable with the right team.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-81217245081403330?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/81217245081403330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=81217245081403330' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/81217245081403330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/81217245081403330'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/04/software-development-is-social-activity.html' title='Software Development is a Social Activity'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-3727116221672201082</id><published>2009-03-31T21:40:00.001+01:00</published><updated>2009-06-09T10:57:05.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CI'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Continuous Integration - Moving beyond the build</title><content type='html'>&lt;span style="font-family: arial;"&gt;
So everyone (well I really hope everyone) is now using Continuous Integration of some form or other.  However a lot of CI I have seen is purely build, or build and unit-test.  This is really under utilising a potentially great resource.&lt;br/&gt;
&lt;br/&gt;
These days developer time is expensive compared to processor cycles.  So we need to maximise developer time spent on productive things.  Automation can help us do this, and automation starts with CI.&lt;br/&gt;
&lt;br/&gt;
So what can we do to make this a reality?&lt;br/&gt;
&lt;br/&gt;
Firstly consider what tasks do you do repetitively that take up time?  Deployments, Integration Tests, Acceptance Tests?  What tasks would you do more often but they take too much time?  Static Analysis, Performance Tests, Endurance Tests?&lt;br/&gt;
&lt;br/&gt;
But, I hear you say, this takes too much time, we cannot spare that right now.&lt;br/&gt;
&lt;br/&gt;
Well I disagree - the time that you spend now &lt;/span&gt;&lt;span style="font-weight: bold; font-family: arial;"&gt;will&lt;/span&gt;&lt;span style="font-family: arial;"&gt; pay you back later.&lt;br/&gt;
&lt;br/&gt;
In anything from a few minutes to a few hours you can set up a nightly build, analysis, test cycle could save a whole lot of trouble and which can be incrementally improved to make life easier.&lt;br/&gt;
&lt;br/&gt;
I plan to write some blog posts on how to do this, just need to find the time.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-3727116221672201082?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/3727116221672201082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=3727116221672201082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/3727116221672201082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/3727116221672201082'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/continuous-integration-moving-beyond.html' title='Continuous Integration - Moving beyond the build'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-1398038488459759091</id><published>2009-03-13T22:00:00.001Z</published><updated>2009-06-09T10:59:00.911+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2009 Conference Day 3</title><content type='html'>&lt;span style="font-family: arial;"&gt;
Today was the 3rd and final day of QCon London this year.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Pimp my Architecture &lt;/span&gt;&lt;a href="http://dannorth.net/"&gt;with Dan North&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
Dan has a great presenting style, and during this presentation he emphasised the importance of the team Shaman, the team story-teller - and I think he proved himself to be one of the best through this presentation.&lt;br/&gt;
&lt;br/&gt;
I really enjoyed this presentation, as it emphasised the importance of the oral tradition within a development team.  And I do feel that is important, the best teams I have worked in have always had this, it meant that new team members came up to speed quickly on the quirks and history of a project, and really helped build the team.&lt;br/&gt;
&lt;br/&gt;
I also enjoyed his 'Shanty Town' pattern - as opposed to the 'big ball of mud'. The truth is as he rightly points out, you just can't rush in and bulldoze, the people have to live somewhere - but you can work to improve it, piece by piece.  You can build scaffolding or temporary architectures in the process of rebuilding the town.&lt;br/&gt;
&lt;br/&gt;
Too much to convey it all or even a fraction, but I must say if you get the chance to hear Dan speak it is worth it, his energy and passion are contagious.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Thoughts on the Generic vs the Specifc Tradeoff&lt;/span&gt; &lt;a href="http://www.innoq.com/blog/st/"&gt;with Stefan Tilkov&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
Stefan's talk was great, in particular my favourite snippet from his talk was:&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-style: italic;"&gt;The wise architect ... &lt;br/&gt;
    question: *&lt;br/&gt;
    answer:   It depends.&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
And its so true.&lt;br/&gt;
&lt;br/&gt;
Summing up his talk is difficult, as the two sides tend to cancel out, i.e. it depends.  But it was good and he covered a lot of good specific versus generic examples.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Strategic Design&lt;/span&gt; &lt;a href="http://domaindrivendesign.org/"&gt;with Eric Evans&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
Another really good talk, Eric covered some interesting perspectives on dealing with legacy systems, and the approach you could take in a pragmatic and progressive way.  And along the way discussed various issues you need to deal with.&lt;br/&gt;
&lt;br/&gt;
The strategic design comes from, making sure the most important parts of the system are well designed.&lt;br/&gt;
&lt;br/&gt;
Some good points he made ..&lt;br/&gt;
&lt;ul&gt;&lt;li&gt;One irresponsible programmer will keep any 5 top-notch programmers busy cleaning up after them.&lt;/li&gt;&lt;li&gt;The quality of the code is equiv to the second worst programmer on the team.  (Not the worst, he is watched like a hawk)&lt;/li&gt;&lt;li&gt;Remember, the core domain is what makes the system worth writing.&lt;/li&gt;&lt;li&gt;Heroes work in the core domain (they make the system features the business needs and wants).
&lt;/li&gt;&lt;/ul&gt;Why do irresponsible programmers so often become heros?  Because they don't waste their time making other people more productive, they don't clean up other peoples mess, but they do produce new capabilities no matter the impact.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Five Considerations for Software Architects&lt;/span&gt; with &lt;a style="font-family: arial;" href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.html"&gt;Kevlin Henney&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
Well today turned into a treat, Kevlin was another good presenter, with a lot of information and some good techniques covered.  The presentation was based around a visit to a pub where he and a couple of others (poor memory, cannot remember their names) and tried to distill 5 things every architect should take into mind.  These distilled down to:&lt;br/&gt;
&lt;ul&gt;&lt;li&gt;Economy - economy in code, in design and in architecture
&lt;/li&gt;&lt;li&gt;Visibility - understanding not just the end product but how it came about
&lt;/li&gt;&lt;li&gt;Spacing - the interesting thing is the space between the components not necessarily the components themelves
&lt;/li&gt;&lt;li&gt;Symmetry - makes things easier to understand and maintain
&lt;/li&gt;&lt;li&gt;Emergence - understand the emergent properties of the problem and the solution&lt;/li&gt;&lt;/ul&gt;
&lt;br/&gt;

Finally I attended the interview track for Stefan's interview of Ian Robinson and Jim Webber about REST and using the Web as an Integration platform. It was good to hear their views on REST and the pragmatic use of the web for machine-machine integration - I guess good because I agree with them.&lt;br/&gt;
&lt;br/&gt;
A good day, and a good conference, I really enjoyed it - my brain is still soaking in a lot of what I heard - just need to let the &lt;span style="font-style: italic;"&gt;R&lt;/span&gt;-mode chew on it a while :)
&lt;/span&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-1398038488459759091?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/1398038488459759091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=1398038488459759091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1398038488459759091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1398038488459759091'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/qcon-london-2009-conference-day-3.html' title='QCon London 2009 Conference Day 3'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-551748959850731732</id><published>2009-03-12T09:31:00.008Z</published><updated>2009-06-19T21:29:20.919+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2009 Conference Day 2</title><content type='html'>&lt;span style="font-family: arial;"&gt;
Today was the 2nd day of the conference proper.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Transforming Software with Web as a Platform&lt;/span&gt; - &lt;a href="http://web2.socialcomputingmagazine.com/"&gt;Dion Hinchcliffe&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
This was the morning keynote.  It was in a well presented style, however was primarily a 'state of the nation' kind of talk.  Some of the interesting points for me included how building social networks around your site/product is very effective and beneficial for various reasons, including an almost off-loading some of the product support and testing into that community.&lt;br/&gt;
&lt;br/&gt;
Dion covered how the biggest technology companies were hardware, then progressed to software and now were data companies.  His mention of how the desktop was one of the last areas where we have "commercial software" I think this was slightly off, I think Open Source has made considerable progress and is making more all the time in that area - I think it is the Mobile desktop which is now the commercial software sweet spot - thanks to the likes of the iTunes AppStore.&lt;br/&gt;
&lt;br/&gt;
He also covered cloud computing and how he felt we were at risk of falling into a very small number of large players that we trust with our data.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Agility: Possibilities at a Personal Level&lt;/span&gt; &lt;a href="http://www.lindarising.org/"&gt;with Linda Rising&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
I chose to go to Linda's presentation as a couple of people had recommended listening to her speak if I ever get the chance.  And I must say that I am glad that I did, not just for the content, but also for her relaxed and engaging presentation style.&lt;br/&gt;
&lt;br/&gt;
So it was mainly a discussion about drugs, well caffeine, the worlds drug of choice, nothing else comes close with apparently around 90% of the worlds adult population consuming it daily in some form or other.&lt;br/&gt;
&lt;br/&gt;
The talk (I feel) really centered around the Industrial Age and how we are still behaving and living in a manner consistent with that time.  A lot of interesting facts, I knew about the drinking of beer due to bacteria in the water, but never put it together that accurate time pieces and tea/coffee became readily available at the same time - the time of the industrial revolution.  And the process of making tea/coffee of course required boiling the water.  So people needed to wake up for their shift at the factory, and instead of beer they would have tea/coffee which because of the boiled water was safe.&lt;br/&gt;
&lt;br/&gt;
Linda spoke a lot about caffeine and its effects on the human body, some I knew, some I didn't - I certainly wasn't aware of the half-life of the effect on metabolism.&lt;br/&gt;
&lt;br/&gt;
Another interesting snippet was that 80% of us think we are above average.&lt;br/&gt;
&lt;br/&gt;
During the question time there was talk about adjusting work rythmns to suit peoples make up - morning person, evening person - indeed adjusting entire teams to work in this manner.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Forging ahead - Scaling the BBC into Web 2.0&lt;/span&gt; with&lt;a href="http://www.bbc.co.uk/pressoffice/pressreleases/stories/2008/01_january/17/gulik.shtml"&gt; Dirk-Willem van Gulik &lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
This talk I was looking forward to for a variety of reasons.  But I must admit I felt let down, Dirk spoke very quickly and the presentation style was not great.  A lot of detail was covered, but the interesting points I felt were lost.&lt;br/&gt;
&lt;br/&gt;
The challenge was not just the technical one of moving from static webpages to a fully dynamic personalised Web 2.0 platform - but also the challenge of doing it in a timely and agile manner.  There was coverage on how human and logistics do not scale, but no real description of how that is overcome.&lt;br/&gt;
&lt;br/&gt;
There was a good point about how the BBC was funded and the impact that makes, being TV License funded more web traffic means essentially each request has to become cheaper to be done on budget.&lt;br/&gt;
&lt;br/&gt;
Something that really made me think is the statement that "Content is our core business - not IT" which left me wondering why it all hadn't been outsourced, most organisations focus on their core business and bring in the experts to do the things they don't consider core.&lt;br/&gt;
&lt;br/&gt;


The rest of the afternoon got whitewashed, as I bumped into Jim Webber and got talking about various things we were joined by Ian Robinson for a short while and then Martin Fowler.  I was also then introduced to &lt;a href="http://blog.whatfettle.com/"&gt;Paul Downey&lt;/a&gt; and had a interesting conversation about various things including Standards and Standardisation, Open Source development, company culture and the workings of the web.&lt;br/&gt;
&lt;br/&gt;
I missed a session about Functional Programming I was keen on, but am glad I can catch it up online.&lt;br/&gt;
&lt;br/&gt;
Another good day, looking forward to tomorrow.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-551748959850731732?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/551748959850731732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=551748959850731732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/551748959850731732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/551748959850731732'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/qcon-london-2009-conference-day-2.html' title='QCon London 2009 Conference Day 2'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-2484049233331076261</id><published>2009-03-11T15:43:00.006Z</published><updated>2009-06-09T11:01:54.900+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2009 Conference Day 1</title><content type='html'>&lt;span style="font-family:arial;"&gt;
Today was the first day of the conference proper at QCon London 2009, an interesting day all around and again a lot to chose from.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Opening Key Note &lt;a href="http://en.wikipedia.org/wiki/C._A._R._Hoare"&gt;by Tony Hoare&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
A contrast on Computer Science and Software Engineering - for me it was very interesting as I've often internally and occasionally externally debated as to whether what I do is really Engineering.  I hold a degree in Electronic Engineering, but I have always worked in Systems or Software.  A lot of what we do can be considered craftsmanship - and it was good to hear Tony say that this is part of the early life-cycle of an Engineering discipline.&lt;br/&gt;
&lt;br/&gt;
Too much info to cram into this and I know it will be up on the QCon site in the near future if you are interested. &lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;SOA &lt;a href="http://iansrobinson.com/"&gt;with Ian Robinson&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
Really good insight into starting a big project especially in an already running system - good to see SOA talked about as SOA (the approach) and not SOA as a vendor pitch to buy their latest golden hammer.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Scala &lt;a href="http://jonasboner.com/"&gt;with Jonas Boner&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;

Very interesting JVM based language with very good integration with Java.  Provided an elegant mix of OO and Functional programming - and so provided a clean path to move towards more functional models.  The session went through some of the language features, but one of the most impressive things shown was a demo of a web chat system written in 30 lines of code.&lt;br/&gt;
&lt;br/&gt;
A really nice concept of Traits which could be added at either class or instance levels - so much information that I have no hope of conveying it.  But has inspired me to take a closer look.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Clojure&lt;a href="http://clojure.org/"&gt; with Rick Hickey&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
A "Lisp" Functional Language that runs on the JVM.  Was a very interesting presentation and the language has some really interesting features including how it dealt with concurrency.  Again too much information to try and convey.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Building for Performance and Scalability with &lt;a href="http://qconlondon.com/london-2009/speaker/Alois+Reitbauer"&gt;Alois  Reitbauer&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
Outlined the cause of many performance issues, and very high level ways of detecting these issues - but there was nothing new here, and no practical demonstrations of the methods, and no hard data.&lt;br/&gt;
&lt;br/&gt;
This is an area I am quite familiar with having spent time 'in the trenches' dealing with these problems, and having spent time developing ways to help mitigate them.  So I was disappointed - I felt there is so much more on this subject, particularly how easily steps can me made to introduce ways and means of detecting performance deviations early on in the process.  Big expensive tool-sets are not necessary to begin this process (or at all in my view).&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;REST-based Integration Architecture for a Financial Business Service &lt;a href="http://www.innoq.com/blog/pg/"&gt;Phillip Ghadir&lt;/a&gt; &lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
This talk interested me as it was about moving from WS-* to REST and using the likes of ATOM/ATOMpub.&lt;br/&gt;
&lt;br/&gt;
Must admit that brain fry had begun to set by now and I didn't take it all in.  But was interesting to hear Phillip's view on - use REST at the interface boundary but don't try and use it internally as the latency cascade will bite you.&lt;br/&gt;
&lt;br/&gt;


Unfortunately I missed the evening Key Note - but no doubt it will be available online soon.&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-2484049233331076261?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/2484049233331076261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=2484049233331076261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/2484049233331076261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/2484049233331076261'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/qcon-london-2009-conference-day-1.html' title='QCon London 2009 Conference Day 1'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-7394439469407498109</id><published>2009-03-10T18:49:00.004Z</published><updated>2009-06-09T11:26:33.637+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2009 Tutorials Day 2</title><content type='html'>&lt;span style="font-family: arial;"&gt;
So today was my second day of tutorials at QCon London 2009 - another tough choice as to what to go to - as much as I wanted to learn more about Erlang I chose instead to attend Advanced Ruby and Behaviour Driven Development.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Advanced Ruby&lt;/span&gt; &lt;a href="http://sam.aaron.name/"&gt;by Sam Aaron&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
I thought I was being a bit ambitious selecting to go to a tutorial on Advanced Ruby given my Ruby knowledge is quite limited, i.e. only just above zero.  But it turned out to be very good and quite insightful.  It was the first time I had been to a Language tutorial that didn't in anyway get bogged down in syntax.&lt;br/&gt;
&lt;br/&gt;
The tutorial covered the Language from different approaches of coding, such as prototype, class based and functional.  It was useful to learn how Ruby handled inheritance, closures, creating methods on existing classes, detecting missing methods etc.  It also provided to me a chance to reflect on the other languages I use and understand them better.&lt;br/&gt;
&lt;br/&gt;
Must admit I felt a bit for Sam having &lt;a href="http://ola-bini.blogspot.com/"&gt;Ola Bini&lt;/a&gt; in the room - but he handled it really well.  Ola did provide some further insight into Ruby's internals which was good.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Behaviour Driven Design&lt;/span&gt; &lt;a href="http://dannorth.net/"&gt;by Dan North&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
This was a session I was really looking forward to, and Dan didn't disappoint, his passion and energy for this stuff really shows through.  It was interesting to hear his views on how Agile is progressing beyond things like XP - in a way its become more pragmatic and seasoned I guess, and it really got me thinking how to step beyond TDD or as he rightly pointed out "Code By Example".&lt;br/&gt;
&lt;br/&gt;
There was a serious amount of information in the session and it was very engaging.  It was great to go back to some reasoning as to why we work well in small teams (our brains are hardwired to work well in groups up to about 10 people - pre-history family group size perhaps?).  It was also good to discuss things like why it is hard to introduce change, and how to reduce the likelyhood of falling back into 'the old ways'.&lt;br/&gt;
&lt;br/&gt;
Trying to summarise Dan is almost impossible and its worth hearing him talk on the subject if you get the chance.&lt;br/&gt;
&lt;br/&gt;
It was also refreshing for someone to say about their own work, 'this is really just the beginning, lets see where we go from here'.&lt;br/&gt;
&lt;br/&gt;

All in all another good day, tomorrow the conference proper starts.&lt;br/&gt;
&lt;br/&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-7394439469407498109?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/7394439469407498109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=7394439469407498109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7394439469407498109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7394439469407498109'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/qcon-london-2009-tutorials-day-2.html' title='QCon London 2009 Tutorials Day 2'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-2092995442390719965</id><published>2009-03-09T19:47:00.007Z</published><updated>2009-06-09T11:27:47.957+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><title type='text'>QCon London 2009 Tutorials Day 1</title><content type='html'>&lt;span style="font-family:arial;"&gt;
So today was the first day of the QCon tutorials, and was a good day... we'll leave aside what TFL did to my oyster card, I don't want to get into a rant - lets just say if you buy Oyster online, don't try and get a travelcard and prepay on the same card.&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;GET Connected: A Tutorial on Web-based Integration&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;&lt;br/&gt;
&lt;br/&gt;
First tutorial was with &lt;a href="http://jim.webber.name/"&gt;Jim Webber&lt;/a&gt; on using the Web as an Integration platform.  Jim was in his usual self-deprecating mood, keeping things light hearted with the ocassional rant.  (I've known Jim a while, and I nicknamed him Mr.Angry, whilst he nicknamed me Mr.Grumpy - but thats for another post)&lt;br/&gt;
&lt;br/&gt;
It was actually a great session, my only disappointment was that it wasn't a full-day as there was certainly enough material for it, Jim had to skim through the last third to the most important points.  The presentation for me though was especially good, as it gave me a chance to reflect on what it really means to leverage the web - it also gave me some ideas on solving current problems by using ATOMpub to handle some eventing stuff.&lt;br/&gt;
&lt;br/&gt;

&lt;span style="font-weight: bold;"&gt;Domain-Driven Design - a complete example in a current technology stack&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;&lt;br/&gt;
&lt;br/&gt;
This session wasn't as good in my view, the choice for the example I thought was pretty good, but I didn't find it engaging.  It lacked something, and the code examples I felt could do with some more work.  It didn't help that the first thing brought up in the IDE was a WSDL, something that sends a shiver down my spine - especially when you've just had a session on using the web and talking about hypermedia aware restful interfaces.&lt;br/&gt;
&lt;br/&gt;
However one of the best parts of the day was at lunch being introduced to &lt;a href="http://www.michaelnygard.com/"&gt;Michael Nygard &lt;/a&gt;author of one of my favourite books, ReleaseIT.  A very interesting guy though I must admit I felt stumped on what to talk to him about aside from "love your book by the way".  Thanks for the "FanBoy" comment Jim - at least I only bought the book once ;)&lt;br/&gt;
&lt;br/&gt;
I met &lt;a href="http://ola-bini.blogspot.com/"&gt;Ola Bini&lt;/a&gt; - one of the Guys behind &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; and &lt;a href="http://ioke.org/"&gt;Ioke&lt;/a&gt; - interesting guy to say the least.  Also met &lt;a href="http://sam.aaron.name/"&gt;Sam Aaron&lt;/a&gt;, another Ruby guy and who will be running the Advanced Ruby session I am going to tomorrow.  Had an interesting discussion with him and Michael about Ruby, SmallTalk, MetaClasses, Secret Classes and some other stuff that went over my head with my limited knowledge of Ruby and even more limited knowledge of SmallTalk.&lt;br/&gt;
&lt;br/&gt;
A good day, and am looking forward to tomorrow.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-2092995442390719965?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/2092995442390719965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=2092995442390719965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/2092995442390719965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/2092995442390719965'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/qcon-london-2009-tutorials-day-1.html' title='QCon London 2009 Tutorials Day 1'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-1117474497550467270</id><published>2009-03-07T20:26:00.011Z</published><updated>2009-06-09T11:39:14.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Test Driven ...</title><content type='html'>&lt;span style="font-family:arial;"&gt;
In the past I have been guilty of not testing enough (who hasn't).  I went through a phase of code first and test as late as possible, then code first and write tests - the old idea of unit testing.  However this always ends up in testing getting left behind as time pressures push the demand towards just getting the code done.&lt;br/&gt;
&lt;br/&gt;
I was then introduced to Test Driven Development, it made sense, but I struggled with it.  Even when I thought I was doing it right I would find as time pressures increased that it would slip, and it wouldn't be long before I was back in the old style of unit testing.&lt;br/&gt;
&lt;br/&gt;
I used to grapple with design, either in my head or on paper, then write a test against that design and then try and code that design.  The problem being, that the design was never quite right.  Some requirement was always missed or not considered, or even worse non-required features would slip in because they seemed like a good idea.  Going back and changing that design, meant going back and changing the tests.&lt;br/&gt;
&lt;br/&gt;
The other problem was that the tests were always biased towards that vision instead of testing the requirements, increasing testing became a matter of just adding more and more tests, a lot of them testing the same thing and of dubious value.&lt;br/&gt;
&lt;br/&gt;
So as a result things never flowed, there was always a discontinuity - and that leads to turbulence and drag.  Drag means wasting energy, there in the temptation to ditch that perceived drag, the testing, instead of the real drag, a bad design.&lt;br/&gt;
&lt;br/&gt;
I then had the pleasure of working on a project with some really focused guys (&lt;a href="http://jim.webber.name/"&gt;Jim&lt;/a&gt;, &lt;a href="http://www.thekua.com/atwork/"&gt;Pat&lt;/a&gt;, &lt;a href="http://apcj.blogspot.com/"&gt;Alistair&lt;/a&gt; amongst others), those who knew what TDD really was, and how to really do it, how to use the tools in the right ways.  To them it was just natural, everything flowed, there was no drag.&lt;br/&gt;
&lt;br/&gt;
The 'click' was the realisation was not that I didn't know how to write unit tests, nor was it that the test had to be written before the code, but the test had to be written before the design had crystallised.&lt;br/&gt;
&lt;br/&gt;
Now, I am not saying that the secret is no design.  Indeed design is very important, but now I tend to do enough design when and as its needed.  The final design emerges as I test, code, test, refactor, test.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-1117474497550467270?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/1117474497550467270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=1117474497550467270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1117474497550467270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1117474497550467270'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/test-driven.html' title='Test Driven ...'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-1442160018565525371</id><published>2009-03-05T10:15:00.007Z</published><updated>2009-06-09T11:40:39.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='Macports'/><category scheme='http://www.blogger.com/atom/ns#' term='SSH'/><title type='text'>ssh'ing rsync out of proxy hell...</title><content type='html'>&lt;span style="font-family: arial;"&gt;I had a situation last week where I needed to install macports but due to local proxy behaviour I could not get rsync to work.&lt;br/&gt;
&lt;br/&gt;
However I did have ssh working through the proxy, and I had access to an external system which didn't have the proxy issues... so I created a tunnel.&lt;br/&gt;
&lt;br/&gt;
Now this has to be done as root, as it needs to create a listening port below 1024.&lt;br/&gt;
&lt;br/&gt;
First I changed the &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;/opt/local/etc/macports/sources.conf&lt;/span&gt; &lt;span style="font-family: arial;"&gt;to point to the localhost&lt;/span&gt;
&lt;br/&gt;
&lt;span style="font-family: courier new;"&gt;
#rsync://rsync.macports.org/release/ports/ [default]
rsync://localhost/release/ports/ [default]
&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-family: arial;"&gt;Then I created a tunnel through my external system using ssh&lt;/span&gt;&lt;br/&gt;
&lt;span style="font-family: courier new;"&gt;ssh -L 873:rsync.macports.org:873 user@my-external-system.com&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-family: arial;"&gt;On that ssh connection I did the following to keep that session active:&lt;/span&gt;&lt;br/&gt;
&lt;span style="font-family: courier new;"&gt;ping -i 60 localhost&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-family: arial;"&gt;
Now macports quite happily rsync'd away oblivious to the plumbing I had to do.  Gotta love ssh.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-1442160018565525371?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/1442160018565525371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=1442160018565525371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1442160018565525371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/1442160018565525371'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/sshing-rsync-out-of-proxy-hell.html' title='ssh&apos;ing rsync out of proxy hell...'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-7745345461928957285</id><published>2009-03-02T21:01:00.026Z</published><updated>2009-06-09T11:41:40.158+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><title type='text'>Using Groovy and GUnit to test Java 'privately'</title><content type='html'>&lt;span style="font-family: arial;"&gt;
Normally if I am writing a class and find I need access to a private field in order to test correctly then I take it as a smell - something not quite right with the design.  But every now and then I fail to find a way to change the design without corrupting its intent.&lt;br/&gt;
&lt;br/&gt;
Now I know you can use reflection in Java to access private fields, but its a bit clunky.  But recently I have been reading about Groovy, and found that it gives you full access to all your Java objects, but allows you to ignore private specifiers.&lt;br/&gt;
So as an example, say I have a counter class, one which allows users to get the next value of the counter, but cannot provide anyway of altering the counter for that would invalidate its purpose.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;
&lt;pre class="brush: java"&gt;
package net.usersource.example;

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
   private final AtomicInteger counter;

   public Counter() {
       counter = new AtomicInteger(0);
   }

   public int getNext() {
       return ensuringValueDoesNotRollIntoNegativeValues(counter.incrementAndGet());
   }

   private int ensuringValueDoesNotRollIntoNegativeValues(int value) {
       if( value &lt; 0 ) {
            if( counter.compareAndSet(value, 0) ) {
                return 0;
            }
            else {
                return getNext();
            }
        }
        return value;
    }
}
&lt;/pre&gt;

&lt;span style="font-family: arial;"&gt;
Now, how do I test this without calling getNext() until it reaches Integer.MAX_VALUE?  Do you know just how big MAX_VALUE really is, and how long that will take?  Thats not really an option - so I need somehow to change the underlying counter.&lt;br/&gt;
&lt;br/&gt;
Now I could do that with reflection, but I can do it much simpler using Groovy (which if you look closely, especially the way I have written it, looks like java) ...&lt;br/&gt;&lt;/span&gt;
&lt;br/&gt;
&lt;pre class="brush: groovy;"&gt;
package net.usersource.example

import org.junit.Test;
import org.junit.Assert;
import java.lang.Integer;

public class CounterTest {
    @Test
    public void verifyFirstObtainedCounterValueIsOne() {
        Counter c = new Counter();
        Assert.assertEquals( c.getNext(), 1 );
    }

    @Test
    public void verifyThatAtMaxIntTheNextValueIsZero() {
        Counter c = new Counter();
        c.counter.set(Integer.MAX_VALUE-1);
        Assert.assertEquals( Integer.MAX_VALUE, c.getNext() );
        Assert.assertEquals( 0, c.getNext() );
    }
}
&lt;/pre&gt;

&lt;span style="font-family: arial;"&gt;
This was TDD'd so I only knew the solution thanks to the test.&lt;br/&gt;
&lt;br/&gt;
Unfortunately I have found some issues with the Eclipse Groovy Plugin - its auto-completion is a bit zealous in someways (wants to try and match everything bringing your machine to a crawl) and ignorant in others (not matching in imports).  Also the GUnit results were reporting exceptions the line above the line with the issue - which caused me some confusion initially, and I need to investigate that further.&lt;br/&gt;
&lt;br/&gt;
But to me this is a neat way of testing Java code, by stepping out of Java to something that makes it easier, whilst staying on the JVM.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-7745345461928957285?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/7745345461928957285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=7745345461928957285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7745345461928957285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/7745345461928957285'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/03/using-groovy-and-gunit-to-test-java.html' title='Using Groovy and GUnit to test Java &apos;privately&apos;'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-682301790034286492</id><published>2009-02-28T16:06:00.005Z</published><updated>2009-06-09T11:42:19.599+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Names'/><title type='text'>Is JUnit Named Right?</title><content type='html'>&lt;span style="font-family: arial;"&gt;
When JUnit first appeared, it was perfectly named, however as time has moved on so has its use.&lt;br/&gt;
&lt;br/&gt;
Jim Webber's recent blog post (&lt;a  href="http://jim.webber.name/2009/01/30/83fba2cc-d1a5-4271-86a4-55e7f6b51c06.aspx"&gt;here&lt;/a&gt;) made a very valid point about when a Unit Test is not really a Unit Test.  Test and Behavioural Driven Design push JUnit into an area that is not adequately described as unit testing.  Driving a design through testing in this manner means you aren't (at least initially) writing unit tests.&lt;br/&gt;
&lt;br/&gt;
I've also used JUnit in the past to do things which are decidedly not unit testing, its a useful framework to control other sorts of testing.   And on more than one occasion have had to explain to a member of management why I used a free unit testing framework instead of using their big expensive shiny testing metaframework thingy.&lt;br/&gt;
&lt;br/&gt;
I am not suggesting that &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Erich_Gamma"&gt;Eric&lt;/a&gt; should rush out and re-release their work under a different name.  It was (to me at least) interesting to reflect on naming, and how things progress over time, so once perfectly named entities may gradually slip to the almost perfect.  And it is also a reminder that not quite perfect risks gradually slipping to the not relevant at all.&lt;br/&gt;
&lt;br/&gt;
What the perfect name would be today, I don't know, I think the name is still perfect enough.&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-682301790034286492?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/682301790034286492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=682301790034286492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/682301790034286492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/682301790034286492'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/02/is-junit-named-right.html' title='Is JUnit Named Right?'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1050311087092043047.post-5802026899193250991</id><published>2009-02-20T15:03:00.007Z</published><updated>2009-06-09T11:42:47.518+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Why the term "Sprint" Irks Me</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;
Apart from being inherently lazy, there are other reasons why the term "Sprint" irks me....&lt;br/&gt;
&lt;br/&gt;
Agile development is supposed to be about sustainability - in fact the &lt;a href="http://www.agilemanifesto.org/principles.html"&gt;Principles of the Agile Manifesto&lt;/a&gt; states ...&lt;br/&gt;
&lt;br/&gt;
&lt;span style="font-style: italic;"&gt;Agile processes promote sustainable development.  The sponsors, developers, and users should be able to maintain a constant pace indefinitely.&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
The term Sprint in my mind does not describe a constant pace, it conjures up that desperate dash to the finish line, giving it your all in one go.&lt;br/&gt;
&lt;br/&gt;
The argument is however that "sprints are short", however they are repeated.  Do we expect the Olympic 100m runners to do a 100m dash, and then do it all over again, and again, and again?  All in a relatively short time frame, after all how long do you rest between week long Sprints?&lt;br/&gt;
&lt;br/&gt;
The other argument is "its just a name", however software development is in a large part about naming.  Writing clean code is more often than not seeking the right name, something that describes &lt;span style="font-style: italic;"&gt;intent&lt;/span&gt; - so why should we strive for anything less in naming our processes and their elements?&lt;br/&gt;
&lt;br/&gt;
So until I find something better I will continue to prefer &lt;span style="font-style: italic;"&gt;iteration&lt;/span&gt; as to me it better describes the intent of repeated time-boxed work.&lt;br/&gt;
&lt;br/&gt;
&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1050311087092043047-5802026899193250991?l=glen-ford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://glen-ford.blogspot.com/feeds/5802026899193250991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1050311087092043047&amp;postID=5802026899193250991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/5802026899193250991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1050311087092043047/posts/default/5802026899193250991'/><link rel='alternate' type='text/html' href='http://glen-ford.blogspot.com/2009/02/why-term-sprint-irks-me.html' title='Why the term &quot;Sprint&quot; Irks Me'/><author><name>Glen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_FXuJhOiZZGM/TPJSYQ8jYjI/AAAAAAAAAAM/6LgfJYroF9Y/s1600-R/deb63df76a59bc6911b12c07d811e72c.png'/></author><thr:total>0</thr:total></entry></feed>
