Blog Posts

  Working in Interesting Times: Generative AI as Disruptive Tech in Software Development

Blog post authored by AI - with a little prompting.

  Iteration Zero - the first iteration

Iteration Zero - the understated and undervalued iteration

  Kilpse Blogging

Adding interactive code snippets to articles using Kilpse.

  User-defined build settings for Bazel builds

Adding your own custom command line arguments to your Bazel build for a cleaner interface.

  Text fingerprints

Creating text and document fingerprints that can be used to find similar documents or group text by similarity.

  Installing built binaries locally with Bazel

Building and installing locally with Bazel. A simple rule example.

  Go and Bazel to build containers

Working with go projects using Bazel. Builing in and out of a container.

  Technical Health over Technical Debt

Prefer technical health over technical debt as a metaphor for developer practice changes for better code.

  Of Languages And Containers

Run production on a workstation or embrace a new way of working…​

  Orchestration And Choreography

Orchestration and Choreography are often confused. This is how I think of them.

  Quantifying Commit Risk

All change carries an element of risk but not all changes are equal.

  The path to a million (loc)

How do projects get to a million lines of code.

  Builder anti-patterns

The Builder pattern has become very popular over the last few years but there is a growning tendency to use it everywhere. Here are some of the problems and alternatives that you might find a better fit.

  Commit History Metrics

What can your commit history tell you about the health of your project?

  Defending the Domain Model

Keeping a domain model is hard. Implementing a anti-corruption layer with the right separation of concerns can help.

  Testing Logging

Logging - one of the most crucial aspects of any system. But how well is your logging tested?

  Templated styles

A clean/DRY way to style content based on model data

  Emacs es-mode - REPL experiences for ElasticSearch development

I don’t usually write reviews but I was so deleted by es-mode for emacs that I felt compelled to share. If you have worked with REST APIs and ElasticSearch in particular you probably have had similar experiences of using something to develop queries. Coding in one of the client libraries does not provide the interactive experience you need to develop quickly and it often becomes a frustrating exercise. es-mode takes away a lot of that pain.

  Dependency Inversion - Applying the principle

Another look at a classic OO pattern

  The Value in value types

Value types are an oven often overlooked OO and DDD technique. Here is why I think they are an undervalued technique

  Build Analytics - better development understanding

Working with small teams is a lot of fun and I find it fairly easy to keep track of what is happening with version control and build systems. Errors and failures don’t come up that often and when they do they can quite often get solved there and then. On larger projects or working in a large organisation it’s impossible to keep track of everything. There are too many moving parts and changes. Incidents are more frequent and their impact much larger. A broken build or build system can affect 10s or 100s of people. For these larger development projects I find I have to collect and chart data, looking for tends and anomalies and then delve deeper into the data if and systems if there are problems.

  Service IoC containers

How can we get the benefits of IoC containers at a higher level - the services that we deploy into environments? Typical service tiers are implemented with a fronting load balancer that allocates servers to satisfy requests. Applications or services that need these services are give domain or IP information of the load balancers and the load balancers are given details of the servers running instances of the services that they need. Essentially each system with dependencies news an instance of its dependencies. Inverting this dependency requires a container but it leads to some interesting advantages.

  Container-less web apps

In his keynote ‘This is water’ Neal Ford talks about “Yesterday’s best practices become tomorrow’s anti-patterns”. This seems to be the case for application servers like WebSphere, WebLogic and JBoss.

  Team Distribution Models and Conways Law

If Conway’s law applies the how we set up and organise teams should either be aligned to the architecture of the applicaiton or system being developed or application/system architecture will shift to match the team structure.

  lazybuilder v0.3

The idea for lazybuilder came up during a recent coding dojo doing code kata. We were using Vim and a separate terminal to run the tests. Switching back and forth between two windows when trying to move quickly seemed like a waste of time.

  CODE keyboard

After a long wait CODE keyboards are available again and I received mine last night. I have to confess that I am a bit of a keyboard junkie. I am reluctant to count them all but I am edging into double digits :(.

  Cling A C++ REPL?!

Browsing some blogs recently I came across some interesting C++11 lambda code and thought it would be cool to try it out for myself. The idea of spinning up a project or even putting a new test in an existing project did not feel right. Wouldn’t a C++ REPL be useful for just these occasions?

  Boost program_options

I have been spending time recently writing command line apps in C++11. Each time I wanted a way of handling command line arguments flexibly. I chose to use the boost::program_options library. The documentation is pretty good but there are some assumptions (aliased namespace) and the example code is broken up with paragraphs of text explaining what the code does.

  Java build tools 2013

I am about to embark on a new Java project so I thought I would take a look at the current state of build tools for Java projects. First I thought I would draw up some assessment criteria to use as a loose guide. This is what I came up with:

  ci console 0.0.2 released

I like to commit code frequently when working on a project. I also like to use the command line for building, testing and committing code. So I thought it would be nice to have a way to check the build status from the command line. I have been wanting to write something in C++11 and a small lightweight command line tool seemed like a good opportunity.

  Zero Down-time - relational databases

Continuous Deployment is the act of automatically deploying an application every time the build is successful. I am currently working with a development team that is working towards continuous deployment as part of their continuous delivery adoption plans. The system involves several internal web services which seemed like a good place to start working on not only automating the deployments but maintaining a very high degree of up-time during those deployments. Automating deployments involves both development and techops groups so I thought I would search for some worked examples that would help illustrate the techniques and steps required. I found several blogs and articles talking about different approaches but no worked examples.


Following up on the next_permutation from a couple of weeks ago word finder uses next_permutation to find words in character sequences. Uses the aspell C api to look up each permutation. Searching for 3,4,5 and 6 character words in a 6 character sequence takes about 200ms.

  What's in a name?

Graham Brooks: Architect, Software Engineer


Working on a small program recently I found a quirk in next_permutation. The prorgam read a sequence of characters from the command line and then tried to find words by testing each permuation. For a sequence of 3 characters there are 6 permutations.

  Emacs Sharing

I like Emacs. Some people like VI(M) but emacs has been in my toolbox for a long time and I feel very at home working with it.


Quotes: Things that inspire and be remembered

  All truth

“All truth passes through three stages. First, it is ridiculed. Second, it is violently opposed. Third, it is accepted as being self-evident.”

  I can't believe I missed this!

Just over 20 years ago Jack W. Reeves wrote an article in the C++ Journal entitled “What is Software Design?” and I missed it. Not only that but no one thought to point out that I was missing a very important article. An article that challenged and changed/clarified my mental model of software design and construction - 20 years after it was published. A copy of the original article can be found here. I guess it is better late than never and it demonstrates that some things stay relevant and important. Sometimes they remain controversial.

  DRYing out code

Removing duplicate code is a great way to improve the internal quality of your application code. Duplications mean that you have more code than you should and are often the source of more subtle bugs of the “I’ve already fixed that ..” variety.

  Integrating GPUs in Application Development - From Concept to Deployment

This post is a little overdue :(

  Automated refactoring for library updates

After watching Clang MapReduce – Automatic C++ Refactoring at Google Scale I was struck with the idea that this could help with the upgrade problem. Almost every application uses libraries. Those libraries need to be updated from time but each time they are updated all the code using those libraries also needs to be updated. For development teams finding time to upgrade to the latest libraries against competing functional updates is challenging. What if as part of the release a set of refactoring commands or programs accompanied the libraries. These refactoring scripts would automatically update the consuming application code to use the new libraries saving time and money.

  Metrics based Refactoring for cleaner code

Refactoring is a key practice to improved code hygiene. Making refactoring part of your next project is one thing but if you have just joined a team or project with a significant amount of debt how do you work on making things better? Over the last few months I have been assessing a number of code-bases and speaking about technical debt management. While preparing for these engagements I realized that combining two code and project metrics could be used to help focus efforts on code that would deliver the most benefit. Toxicity is a combined measurement of static code analysis metrics. Volatility a measure of changes made to files within a code-base over time. By combining these two measures we can create a source file scatter chart correlating toxicity against volatility.

  Oh My ZSH shell productivity

oh-my-zsh is framework for managing zsh configuration. The default configuration adds some interesting enhancements.

  AgileDC - Introduction to Continuous Delivery

Yesterday I presented a talk entitled Introduction to Continuous Delivery at AgileDC. The audience was great and the room packed which is always a recipe for success. I really enjoyed talking about Continuous Delivery and there were some really interesting questions.

  Agile DC

I am really syched about talking at AgileDC tomorrow. The topic of my talk is an Introduction to Continuous Delivery

  Encapsulating Databases

Small systems grow with success. As these systems grow they often take on more and more functionality either directly into the main system component or into sub-systems. As the systems grow in complexity and responsibility their database requirements grow at a similar rate become more and more complex.

  Insulating against failure using Caching Reverse Proxies

Reverse proxies have been around for a very long time and depending on your application either interesting additions or a key element to your architecture.

  asciidoc experiments

I have always been interested in text processing systems. This is probably rooted in the time that I discovered computing and programming. At that time the state of the art was ROFF (T)ROFF and a whole family of plain text processing engines that produced nicely formatted output.

  Open Source project durations

During a recent discussion about open source development we wondered how long these projects lasted. In particular if there was a rapid drop off in activity.

  Stabilizing Velocity

I came across this post by Michael Norton and thought I would reference it here: Stabilising Velocity Michael makes some keen observations on both causes and effects of unstable velocity.

  Rake db:migrate MySQL gem dependency

If you have already added gem 'mysql2' to your Gemfile but get a message saying that it is missing when you try to migrate

  Create MySQL database with Capistrano

I was playing about with Capistrano over the weekend. I wanted to automate the deployment of a Rails application to my server. The server was (I thought) just about ready to accept the app but I did not want to go through another manual deployment. I thought I would take the opportunity to script the deployment. The first task I set myself was to create a production MySQL database. Searching for how to do this threw up lots of interesting information about building and deploying database.yml files, but not much about configuring MySQL. The first set of tasks I came up with were:

  Five Ws sitting on a bench

Over the past year I have been involved in preparing quite a few documents, proposals, presentations etc. I have also been asked to review quite a few of these documents. As an author or reviewer I like test what I am working on against 5 Ws and one H to see if the important aspects have been covered. The Wikipedia article provides a good background and history, including the 1902 reference to Rudyard Kipling Just So Stories.

  The new Mac App Store

When Apple announced the new App Store for OS X I have to say I was a little underwhelmed at the prospect and did not think the new store would hold much interest. After all I have been pretty happy with finding and installing apps. I could see the point for the iPhone and iPad but for my laptop?

  Pulse Camp 1.0 and RHoK

One of the great things about working at a consultancy is that I get to meet a wide range of interesting clients with interesting problems that need solving. One of the most interesting for me was Pulse Camp 1.0, a 3 day event to start defining a system framework that can help NGOs and other groups make better informed decisions based on real-time data.

  Progressive Enhancement

Progressive Enhancement is a web development technique or pattern. The basic premise is that a web site should be accessible to all users and then to overlay additional functionality based on the client’s capability.

Web technologies and good web development practices over the last few years had encouraged this approach. Popular web sites delivery semantic HTML to allow screen readers and other client devices to understand the content of being delivered. Advances in both browser capabilities and CSS have encouraged this and the use of inline styles has reduced over time. The advent of JavaScript libraries that hide browser compatibility problems have made the development of progressively enhanced content easier to achieve.

  Emacs Package manager

I have a long history with text editors and I have always been facinated with the different flavours of interfaces and capabilities. After working my way through ED and then VI Emacs was a bit of a revalation. I found myself idle for a few minutes this morning and thought I would do some editor maintenance and install haml-mode into my copy of Emacs. While surfing around I came across the Emacs Lisp Package Archive which made the installation a breeze and I then found myself installing all sorts of other additions that might be useful in the future.


Haml is a markup language for generating xml and other markup - most popularly HTML. Over the past few weeks I have been writing a few Ruby on Rails applications and chose Haml as the templating language. For someone who has traditionally avoided positional languages this was a strange choice. Having written a few simple applications I find that the writing HTML in Haml is both straightforward and intuitive. Good HTML is naturally hierarchical and having this structure both encouraged and enforced in Haml feels right.

  Watching the white horses on the Hudson ...

Watching the white horses on the Hudson today and wondering why I am flying on a day like today.

  A good day of discussions in Chicago tod...

A good day of discussions in Chicago today. Although I should say yesterday given the time.

  Test Driven Talks

Taking a leaf out of the XP book and in particular test driven development I have had some successes in using this idea when doing a presentation. I have dubbed the idea ‘Test driven talks’. The basic idea is to quickly canvas the audience for things that they would like covered during the presentation. Once these have been captured on a whiteboard or flip-chart.

  Testing - what to test when

After tweeting that I wanted to have suggestions for blog entries I got a single reply asking for my thoughts on DAO and unit testing – essentially asking should DAO be unit tested.

  Technology Synergy

I started writing this post quite some time ago but never got around to wrapping up the loose ends. The article is really a summary of what I learnt during a pretty intense media web site development project. Since pictures equate to 1000s of words here is my effort to express how technologies can work symbiotically to delivery value that is more than the sum of their parts.

  Fighting layout bugs

Finding problems in the layout of web pages is just plain hard. But fighting layout bugs seems to hold a glimmer of light for web developers. Definitely something to check out. Michael Tamm presenting his brainchild is available

  Eben Bayer: Are mushrooms the new plastic?

Fascinating TED video on using mushrooms to create materials with plastic characteristics. It looks like Nature got there first...

  Dallas geek night

Last week I happened to be in Dallas for a client and was invited along to the Dallas Geeknight held at the ThoughtWorks offices there.

  Using a local Wiki for personal knowledge management

For sometime I have been wondering how best to manage all the information that collects in my laptop. I don’t even have to try to collect data it just arrives in an irregular stream of emails, instant messenger and other symptoms of this connected world. And then there are the other things I want to collect, data from websites, blog articles, eBooks, PDFs and other documents. Added to this meeting notes, observations, ideas for new projects.

  Agile Software Development and Golf

Golf putting

  Optimising build times

I just came across this post and want to remember it so posing here. I am most interested in the uplift in compilation time based on unused #includes and build reductions for SSDs.

  New BTree algorithms for virtual memory systems

This is a very interesting article which demonstrates that we should not take things for granted - including algorithms that have been around for a long time.

  Blogging from emacs

After installing WebloggerMode some time ago I had not gotten around to trying it out so I thought I would take it for a spin with this entry.

  Performance testing web applications

When performance testing a web application (as in raw operations per second) I have seem many people try to benchmark their new system against the agreed performance level right off the bat. The problem with this approach is that most applications need to be tuned to get the most out of them. Optimistically firing off 100s of requests will most likely cause the server to choke and if you are unlucky die in a gibbering heap.

  ReleaseIt partial review

I have been catching up on my reading recently and one of the books I have been trying looking forward to reading is ReleaseIt. I had heard very good things about the book and to my delight they are true. If you are a developer building almost any sort of application but in particular working on java based web applications you need to read this book! I wish it had been available years ago and that I had read it.

  7 days with the iPad

So it has been 7 days since buying an iPad. Has it been the life changing event promised by all the pre-launch advertising?

  Scraping Railscasts

I had a few moments today to get reacquainted with Ruby and Rails programming. It has been a while but I have found time to watch the occasional Railscast. I want to watch these videos while on the move but unfortunately the iTunes podcasts are not compatible with the iPad/iPhone. Downloading each one is tedious so I came up with the following:

  iPad and keyboards

There are some quirks to the way the apple bluetooth keyboard works with the iPad. Most of the keys work as you might expect and the pairing system works just fine. There is no real way to navigate around applications and the system that I have found using the a keyboard though so I find myself switching back and forth between screen and keyboard.

  iPad first day on the road

Today I took my new iPad for a day at work:

  iPad first impressions

There has been a lot of hype around the iPad and I have to confess that after watching the original advertisement I was hooked. But was all the hype justified?

  Post Redirect Get web interaction pattern

Post/Redirect/Get or Redirect after Post is an HTTP interaction pattern that can be used when developing web applications. I have been mentioning it quite a few times in my consulting work and thought I would take a stab a at diving a little deeper in the pattern and its benefits.

  Collaborating distributed teams

Internet Relay Chat (IRC) has been around for a very long time (1988) and Instant Messaging (IM) for even longer – although IM did not become really popular until the mid 90’s with the emergence of GUI clients. There are many similarities between the two systems but for this article I am concentrating on the differences, specifically around their use as a team communication medium.

  It always takes a second

Why do application developers think that adding more functionality is always a good thing for the user? When I first started working on GUI applications (Windows 1.0) we worked very hard to get sub-second response times. Now in theory applications running on multi-core 2+GHz processors should out strip 286 CPUs running in the MHz range. What seems to have append instead is that applications have maintained the same sort of response times (in general) taking 1 or more seconds to perform a task.

  Inclined Keyboard on MBP

Raising the MBP Keyboard

  Face to Face pairing

Since joining ThoughtWorks in 2004 I have enjoyed Pair Programming and my programming skills have improved significantly. Working on a problem with someone else full time is one of those practices that is difficult to convince people off until they have actually tried it. Laurie Williams at NCSU has done some pretty interesting research into the effectiveness of of pair programming, which is well worth a read.

  Server Rebuild - Part II

So after having the server nicely set up and ready for configuration I could not resist just ‘getting on with it’. I had grand plans to plan it out and record everything (good practice) but each step seemed so simple it seemed simplest just to get stuck in.

  Server rebuild – part 1

I have been running my own server for some time now but my requirements have changed and the current underlying VM architecture does not conveniently support what I want to do.

  Look after your tools

iStock_000007402056XSmall.jpg Look after your tools and they will look after you!

  Don't use application Zoom

A plaintive call to not over use the lovely zoom features in Excel and Word. The zoom parameters are stored in the document so when you receive them it is very unlikely that your zoom setting will match my zoom requirements.

  Age discrimination in technology

This article post ‘The painful truth about age discrimination in tech’ left me a little confused. Am I still considered a developer or have I given up the mantle and considered a statistic.

  The rise and fall of waterfall - on you tube

If you have been in software development for a while this might make you chuckle :)

  Switching back and forth - Intellij IDEA and Eclipse

I have to confess that I am an IntelliJ Idea fan. I will confess that the key bindings take a little getting used to - especially on a Mac but I find I am most productive using it.

  XP and the cost of change

I have found myself drawing the classic cost of change graph a few times recently so thought I would blog about it. The graph was popular a few year ago in explaining the differences between and eXtream Programming (XP) team cost and a waterfall team cost. XP Wall Graph.png

  Screen casting

There have been a number of threads recently talking about screen/podcasting and the software required to do a decent job so I thought I would blog about the setup I am using.

  Wordpress theme update failure

If like me you installed WordPress and added some themes before understanding that WordPress has a great way of adding themes through the UI then make sure that you have changed the ownership of the folders containing those themes.

  Web application testing - episode 1

This is my first screencast so all and any comments welcome!!

  Subway reading

Over the last month I have been reading Prmodoro Technique Illustrated a fascinating book detailing a technique to apply real focus to problem solving and work in general. One problem I have with almost any kind of reading is finding the time to actually read. But this book is nicely split up into bite-sized chapters which can be read on short journeys. I have taken to downloading books to Stanza an iPhone application which accepts epub format documents. The transfer is a little fiddly but once a URL to the book download is entered Stanza takes care of the download.

  Cross post: A Brief And Incomplete History Of Build Pipelines

Sam Newman has just published a Brief And Incomplete History Of Build Pipelines which makes interesting reading.

  Testing abstrations

These ideas were presented as at ThoughtWorks Agile Southeast conference in Atlanta. The idea for these diagrams came about after the first time I spoke about web test driven development at Agile East in Philadelphia and New York. I am striving to show how introducing a level of abstraction affects development costs.

  How the Pendulum Swings

Car parts in a box

  WebTDD at Agile East

Just a quick note to say thank you to everyone who attended my talk on Test Driven Web Development at Agile East this week.

  Prag Pro Wri Mo

I am going to take part in Prag Pro Wri Mo to find out if I have the inclination and capacity to write or if I am one of those people who would have liked to have written a book.

  Agile East WebTDD

On Thursday this week I will presenting a talk entitled ‘WebTDD’ at the ThoughtWorks Agile East conference in Conshohocken PA. It is the first outing for this talk and I have been working on the supporting software for some time.

  Wednesday evening in Seattle

Hyatt Regency

  Its Tuesday in Seattle

Not that I have seen anything of the city but I now find myself on the west cost after arriving on the east cost just over a week ago.

  The big apple

New York

  Another excellent talk on Ted

</param></param></param> </embed>

  Adium 1.4ß

I have just discovered that Adium - my favourite IM client for the mac has a new ß version available and now supports IRC so one less application to run every day.

  Ultimate agility?

The truly amazing Dan Osman

This has got to be one of the ultimate demonstrations of agility, confidence and poise.... </param> </param> </param> </embed>

  Shenandoah '06



Relaxing in ShenandoahAnother photo from the trip to Shenandoah. Yours truly taking time out…

  Java Properties handling - 1

I have been on a number of Java projects recently and one of the things I end up brewing for each of these projects is some enhanced management of runtime properties.