Fergus On:

Software Engineering. Drawing on over a decade of experience working in SaaS environments, I write about design patterns, concurrency, and architectures that survive real use.

My testing workflow: mixing TDD with BDD for a unique blend

Strict TDD can leave you with a brittle test suite and some odd design decisions. I prefer a lighter touch: a few unit tests where the logic’s genuinely tricky, and Gherkin specs up front to lock in behaviour without boxing in the implementation.

Automating Code Generation With Docker

Code generation across a team leaves everyone on slightly different versions with fragmented workflows. I wrap generation tools in utility Docker images instead: consistent tooling, no local installs, same output every time.

Go: Easy data transformations via composition

Go's struct embedding cuts out the convoluted data transformation layers you'd write in other languages. I compose structs to filter properties, merge data sources, and control memory—without extra abstraction getting in the way.

Go: Implicit Interfaces and being an Englishman Abroad

Go's implicit interfaces look underwhelming until you define them at the consumption point, not the implementation. I've watched developers new to Go miss this entirely by forcing familiar OOP patterns. Keep interfaces small and local—cleaner architecture, no boilerplate.

You should probably learn how Git works.

Most developers know enough Git to get by, then hit something ugly and panic. Learning reflog, bisect, and hooks properly turns Git from version tracker into actual leverage—fewer mistakes, faster fixes.