Blog
2025 in review
For a lot of people in tech, 2025 was a tough year. Mine was a mixed bag: a lot of good times with family, tempered by some significant work related stress1.
January 11, 2026
Build-time versus run-time costs
You have two axes to manipulate: build-time costs and run-time costs. The upper-right quadrant is the worst of all possible worlds. Most enterprise software lives here. The bigger and more dysfunctional the organisation, the more likely that they exist in this quadrant. In an ideal world, all software companies would operate in the lower-left quadrant. Things get built fast, and they cost next to nothing to run. Developers are happy, and the business is profitable, in theory if not in practice.
January 3, 2021
How to set up a development environment for Elm with Docker
I'll do almost anything to avoid writing JavaScript. So I've recently started playing around with Elm, a purely functional language which compiles to JavaScript. If you haven't heard of it already, you should defintely check it out, it's neat. Elm already has some pretty nice tooling around it, but what makes it even nicer is that it's really easy to set up a development environment using Docker. This means when you inevitably run out of time to play with Elm, you won't have yet another language runtime hanging around on your machine to be cleared out when you next have the time (read as: never).
August 1, 2016
How to mock a method so it returns the argument you pass it
While I was refactoring and adding tests for a pretty hairy method, I found that I wanted to mock out some methods on the object so that they just returned whatever value was passed into them. It turns out that's pretty easy to do, although it took me a little while to figure it out. To save you (and future me) the time, here's how. Given an instance [request]{.title-ref} with a method [complex_method]{.title-ref} which takes a single argument, replace [complex_method]{.title-ref} with a mock which returns the argument unchanged:
March 23, 2016
CukeUp! AU 2015 Highlights
Recently I was lucky enough to attend CukeUp! in Sydney. It's the first time that the conference has been run in Australia, and I hope it's not the last. I really liked the format, with morning and afternoon talks bookending workshops which ran before and after lunch. Technical conferences can sometimes become a strange kind of spectator sport. The workshops really helped me get out of that mode and get engaged.
November 30, 2015
Programming books I read in 2014
Practical Object Oriented Design in Ruby (Sandi Metz) This book was the best thing I read about software development all year. I had avoided reading it for a while because I'm not fond of Ruby, but decided to make a go of it after hearing Sandi speak on a couple of podcasts and conference talks she gave on the same topic. This book has made me much more conscious of the design decisions I make in my code, and how to write unit tests that are a help, not a hindrance. I'm looking forward to seeing how things evolve as I try to apply the techniques in production code.
December 14, 2014
On mixins and the testing thereof
I make pretty heavy use of mixins when writing Django code. Mixins are great because they allow you to share common behaviour across disparate classes (and projects) with very little overhead. Class based views make heavy use of mixins, and I use them in a similar manner to compose views and forms that do a lot with seemingly little code. On the other hand, mixins can be terrible because they can make it difficult to figure out exactly what a class does and what methods it provides. This is the source of many complaints about class based views. I've found that after I got over the initial learning curve, this style of composition has proved very powerful, and well worth the additional complexity.
August 10, 2014
Storing durations on Django models
I just released a package on PyPI: thecut-durationfield is a Django app that provides model and form fields for working with durations. The durations are stored as ISO 8601 compatible strings, and the model field returns dateutil.relativedelta objects. I've been using it for things like subscription models, where I want to figure out when a customer needs to be charged. The code is up on github, so take a look and if you have any problems, get in touch.
August 10, 2014
On private and public interfaces in Python
In Sandi Metz's excellent Practical Object-Oriented Design in Ruby there's a section on creating explicit interfaces. Here, I attempt to translate Ruby's public, private and protected keywords to Python-land. According to Metz, these keywords "indicate which methods are stable and which are unstable" and also "how visible a method is". Python doesn't have any direct equivalent to these keywords. All attributes and methods on an object are accessible by any other object. (This can be both a blessing and a curse.) However, we do have a convention that allows us to follow the spirit of Ruby's private and protected keywords.
March 9, 2014
How to make Django Debug Toolbar display when using Vagrant
Add the following to your development settings: INTERNAL_IPS = (127.0.0.1, 10.0.2.2) By default, Virtual Box sets up its networking such that all virtual machines networking goes through a gateway at 10.0.2.2. By default, Django Debug Toolbar will only be displayed if your IP is in the INTERNAL_IPS list.
January 18, 2014