All Articles

2025

Jul 2 - Kill Your Prompts: Build Agents That Actually Work

Jun 6 - Master Prompt Stacking: The Secret to Making AI Code Like You Do

Jun 5 - The Huge List of AI Tools: What’s Actually Worth Using in June 2025?

Jun 3 - Unlocking Real Leverage with AI Delegation

May 24 - How I Make Complex AI Changes

May 15 - Building AI Cheatsheet Generator Live: Lessons from a Four-Hour Stream

May 12 - AI: The New Dawn of Software Craft

May 6 - Hiring Startup Engineers: a field manual

May 1 - Why Graph RAG is the Future

Apr 24 - Introducing Kaijo: AI functions that just work

Apr 22 - Building the Future

Apr 14 - The Reality of AI Power Usage

Apr 7 - AI Therapists: Self Reflection With AI

Apr 1 - Always Be Unblocking

Mar 27 - Why Time Units Beat Story Points Every Time

Mar 26 - Startup Success Stories Are Flawed

Mar 25 - How To Get Clarity With a New Tech Team

Mar 7 - Coding with AI: How To Do It Well And What This Means

Feb 15 - How to Rebrand Your Mobile App (Without Breaking Everything)

Feb 10 - How To Avoid Bad Startup Culture

Feb 9 - Prompting Sucks (And What We Can Do About It)

Jan 22 - Founder mode is emergency surgery

2024

Dec 13 - How to Build a Robust LLM Application

Dec 6 - Why Hybrid Work Works

Dec 1 - The Job Is Not To Build

Nov 25 - Your Code Is A Liability

Nov 22 - The First Thing A Startup CTO Must Do

Nov 19 - Blogging again after a long hiatus

2017

Dec 30 - A new adventure

Nov 19 - Ealdorlight: A Kickstarter retrospective

Jun 6 - Ealdorlight’s Kickstarter is live at 4pm today

May 10 - How Ealdorlight’s story stands out

Apr 28 - Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released

Mar 31 - Introducing: Ealdorlight

Feb 22 - What’s next for Sol Trader and me

Jan 6 - How to lead your life

2016

Jun 28 - 5 ways I screwed up Sol Trader’s launch: a post-mortem

May 4 - Extreme YAGNI: How BDD nails your prototyping stage

Feb 9 - Gossip: the best new Sol Trader feature for ages

Jan 28 - The top 5 space games of 2015

Jan 25 - Sol Trader at EGX Rezzed: 7-9 April 2016

Jan 12 - The cunning plans of Sol Trader

Jan 1 - Full disclosure: Sol Trader conversation upgrades

2015

Dec 24 - The Sol Trader Christmas Eve update: moddable missions

Dec 2 - New Sol Trader beta: the science of blame and unforgiveness

Nov 27 - Modelling opinions and prejudices in Sol Trader

Nov 11 - Sol Trader combat preview

Oct 2 - Why (I hope) I will weather the Indiepocalypse

Sep 21 - Sol Trader Kickstarter now live!

Sep 18 - Three days to go

Sep 3 - Gossip as a game mechanic

Aug 19 - How to add live code reload to your game

Aug 1 - Why I wrote Sol Trader’s GUI code from scratch

Jul 22 - Sol Trader will be at EGX in September!

Jul 18 - 3 new screenshots of Sol Trader’s new interface

Jul 17 - Trailer: How it will feel to move around Sol Trader’s cities

Jun 24 - How Sol Trader uses information as currency

Jun 17 - The difference review and planning makes to indie development

Jun 10 - How to quickly add bloom to your game engine

Jun 3 - The huge difference a good Entity System could make to your game

May 27 - How tone of voice works in Sol Trader’s dialogue system

May 20 - Never, ever, ever, ever, ever give up

May 13 - How dialogue works in Sol Trader

May 6 - How face generation works in Sol Trader

Apr 28 - How I’m using Proxemics in Sol Trader’s game design

Apr 22 - Why I ditched all the build tools in favour of a simple script

Apr 15 - How to choose between realism and fun in game design

Apr 8 - Your abstractions are a liability

Apr 1 - How I doubled the speed of my game by giving up on C++

Mar 25 - 4 things every space game must have

Mar 18 - After a long journey, Sol Trader has been greenlit!

Mar 11 - Why video game coders don’t use TDD, and why it matters

Jan 7 - 7 things I’ve learnt in 3 years coding my first indie game

Jan 7 - New for 2015: Sol Trader now on Kickstarter

2014

Dec 2 - Why you can scale agile with the right attitudes

Aug 4 - Why BDD works solo, and why that matters for everyone

Jul 8 - How not to check in temporary code

May 7 - How to decide whether a tool is right for you

Apr 16 - 4 questions to discover if you’re really agile…

Apr 14 - How to layer context into your features using Real Narrative

Feb 12 - Make Cucumber features more readable with this one weird trick

2013

Nov 26 - How to give BDD a chance

Nov 19 - BDD Kickstart is dead. Long live…

Nov 11 - How I learned to stop worrying and love (some) detailed Cucumber features

Oct 7 - Use Markdown to send HTML email via Mutt: now working on iOS mail

Sep 19 - The toolchain of dreams

Sep 2 - Extreme isolation part 3: coding a CRUD app (with full example)

Aug 29 - BDD: How to deal stories into features

Aug 9 - Why Continuous Delivery and BDD play so nicely

Aug 6 - Introducing Card Pirates

Jul 16 - Extreme isolation part 2: separate the domain from the changes

Jun 17 - Rack::Usermanual - Cucumber features as in-app user manual

May 14 - Slides for “Leading software teams well”

May 9 - Extreme isolation in web apps: part 1

Apr 26 - Features are documentation, not tests

Mar 6 - BDD without tools: testing shell script

Feb 7 - The perils of curiosity

Jan 21 - “Project velocity is a useless metric.” Discuss.

Jan 16 - That’s not BDD, that’s just Cucumber

Jan 10 - Dependency injection != Inversion of Control

Jan 3 - BDD Kickstart: London and 2013 plans

2012

Dec 11 - Cucumber: keeping the build passing

Nov 23 - Scenarios are not Acceptance Criteria

Nov 15 - Cucumber: the integration testing trap

Nov 7 - Should we store state in our steps?

Oct 30 - How to write a great story

Oct 25 - The simplest Cucumber project ever

Oct 4 - Delegated tasks are a team anti-pattern

Sep 28 - Your framework is a liability

Sep 27 - OStatus: what I’ve learnt in 24 hours

Sep 26 - OStatus: like Twitter, but open

Sep 25 - Job titles are a team anti-pattern

Sep 21 - Introducing Morning Pages

Sep 20 - Never leave a failing test

Sep 19 - Cucumber isn’t a testing tool

Sep 18 - The power of good naming

Sep 17 - Showroom software

Sep 14 - Task assignment is a team anti-pattern

Sep 13 - The power of feedback

Jul 27 - Kickstart your team on BDD

May 15 - Waxing Lyrical on Pathfinding

May 14 - Attempting validated learning with Sol Trader

May 2 - Sol Trader now in Alpha

Apr 16 - A fresh take on DCI with C++ (with example)

Mar 23 - Sol Trader: a continuous deployment story

Feb 17 - On coding defensively

Feb 14 - Sol Trader: on lighting

Feb 2 - Effective bloom in OpenGL for Sol Trader

Jan 16 - Switching Sol Trader from Ruby to C++: one week on

Jan 8 - Why I switched from Ruby back to C++

Jan 3 - Introducing Sol Trader

2011

Dec 14 - A cache-busting http server script in ruby

Dec 8 - Feature writing: multiple actors

Dec 6 - How I’m testing iPhone apps: part 2

Dec 1 - How I’m testing iPhone apps: part 1

Oct 17 - Your tests are lying to you

Sep 15 - Layers of abstraction: writing great cucumber code

Sep 12 - Kanogo: vapourware to beta in 24 hours

Sep 6 - Pin in the map: customisable pin icons

Sep 5 - Layers of abstraction: combining BDD and UX

Aug 30 - e-petitions: handling traffic

Aug 22 - Work with me

Jul 29 - e-petitions: deconstructed

May 26 - Lean code: slides and feedback

May 17 - Don’t miss your greatest achievement

May 9 - The Principle of Scattered Work

May 6 - On Flow, and Katas

May 4 - On Office Politics

Apr 18 - Cucumbers with personality

Apr 15 - A formula of motivation

Apr 12 - Are apprenticeships scalable?

Apr 5 - The team is the atomic unit of success

Apr 5 - Certification: recommendation mass produced

Apr 4 - On the nature of time

Apr 1 - Pomodoros help you refactor

Mar 31 - Are coding katas really worth it?

Mar 30 - Learning to say Yes

Mar 29 - Truly indispensable people

Mar 28 - Pomodoros done (hopefully) right

Mar 25 - Eden Development has closed

2010

Nov 16 - How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber

Nov 2 - How I’m writing my book using Vim, Git and Ruby

Oct 18 - Call for coders: Children’s Future International

Jul 29 - My Polyphasic Sleep Experiment

Jul 22 - Card Of The Day: Actually Do Retrospective Actions

Jul 12 - 750words.com + GTD = Focus

May 23 - How to test your node.js app

May 21 - User Experience Is Everything

May 16 - Leancamp Report

May 12 - Every Ash Cloud Has A Silver Lining

Mar 29 - Announcing edash

Mar 22 - Multiple CI Joes with Rack and Passenger

Mar 22 - Radiating status at Eden

Mar 17 - Five things I learnt from Corey Haines

Mar 8 - Archivey the Robot

Mar 7 - Introducing Pushy - github notifications to google wave

Feb 21 - BBC Talk on A Philosophy of Software

Feb 11 - The Story Card Is Not The Story

Jan 27 - Pairing works for everything

Jan 15 - Driving out feature ambiguity

2009

Dec 29 - Old blog articles from yesteryear

Dec 23 - R.I.P. Web 1.0

Dec 20 - Snakes and Ladders Kata

Dec 15 - Craftsmanship vs. Apprenticeship

Dec 14 - Jekyll, the blog engine of kings

Dec 14 - Welcome

2006

Oct 24 - SVG Planner

Apr 11 - Spring Richclient ~ That’s a wrap

Apr 1 - Spring Richclient ~ A Journey

Mar 9 - Spring Richclient ~ Session Eight ~ Such a bind

Mar 2 - Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission

Feb 16 - TDD ~ The Tortoise and the Hare

Feb 10 - Spring Richclient ~ Session Six ~ The View

Feb 3 - Spring Richclient ~ Session Five ~ Applications, windows, views

Jan 28 - Spring Richclient ~ Session One ~ Beans, Shmeans and services

Jan 26 - Spring Richclient ~ Session Three ~ How did that work then?

Jan 24 - Spring Richclient ~ Session Two ~ Hello World

Jan 23 - Spring Richclient ~ Session One ~ Making Petclinic work

Jan 23 - Spring Richclient ~ Introduction