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