Pete Hodgson

Software Delivery Consultant

Blog Archives

December 5, 2023

Expand/Contract: making a breaking change without a big bang

The expand/contract pattern is the key to zero-downtime deployment, replacing nail-biting stop-the-world rollouts with a series of incremental changes that can be made at a leisurely pace.

March 2, 2023

Five Minutes to Feature Flags

Add feature flags to a node service in no time using OpenFeature, the open vendor-netural standard for feature flagging.

May 19, 2022

OpenFeature - a standard for feature flagging

OpenFeature is a new open standard for feature-flagging. Why we need an open standard for what's essentially a glorified if statement? Let me explain...

June 24, 2021

Explaining Variable

An Explaining Variable is a code-level pattern which reduces the need for code comments, making your software a little more self-documenting.

June 17, 2021

Patterns of cross-team collaboration

Almost every company feels pain when it comes to organizing work that spans multiple teams. Let's look at different patterns for code ownership amongst teams, and code collaboration across teams.

January 28, 2021

Your Platform is a Product

Successful platform teams understand that they're building an internal product, one which is competing for adoption with other internal and external products. To be successful and gain adoption, platform teams need to embrace a product mindset.

January 18, 2021

Engineering Values and Architectural Principles

As startups scale, engineering tribes form. Defining a shared set of Engineering Values and Architectural Principles keeps tribalism in check, helping teams to make coherent decisions while preserving nimble autonomy.

December 1, 2020

Tech Debt Walls

Every engineering team I've met would like to get better at managing their technical debt. The first step in managing something is making it visible. A Tech Debt Wall is a simple, effective way to make tech debt visible.

October 29, 2020


Product teams should plan their work like a family plans a roadtrip. They zoom the map out when they need to understand the big picture, then zoom in for precise directions on what's coming up soon. They also hold off on making detailed plans until they're approaching a destination.

September 25, 2020

Service Templates and Service Chassis

Smaller services built by autonomous teams can mean multiple inconsistent implementations of the same basic technical plumbing. Engineering organizations can use Service Templates and Service Chassis to avoid this.

February 9, 2020

Testing a feature-flagged change

Some strategies for safely verifying a feature flagged change, without turning it on for all our users.

January 9, 2020

Creating and sharing Strategic Architectural Initiatives

Strategic Architectural Initiatives help align autonomous teams around a technical strategy. We'll learn techniques for co-creating an SAI and ensuring that it's widely understood.

December 9, 2019

Delivering on an architecture strategy

Achieving sustained architectural progress at scale takes a clearly articulated strategy, a strong product/tech partnership, and empowered teams.

October 4, 2019

Hello, production

Deploying something useless into production, as soon as you can, is the right way to start a new project. It pulls unknown risk forward, opens up parallel streams of work, and establishes good habits.

August 8, 2019

Story Tests - clear, expressive testing for redux reducers

We explore a powerful unit-testing technique for validating the high-level behavior of a redux reducer, by using a true redux store as a test harness.

August 7, 2019

Testing redux reducers - leveraging selectors

We look at various options for validating expectations within redux reducer unit tests, and discover that using selectors leads to tests which are both expressive and resiliant to change.

July 15, 2019

A nice way to test redux reducers and actions - part I

Treating redux reducers and actions as a cohesive unit leads to clear, succinct unit tests.

June 4, 2019

Day-One Deploys

Requiring new engineers to deploy to production on their first day isn't crazy, it's a neat shortcut to enabling robust Continuous Delivery practices.

May 10, 2019

6 Practices for Effective Pull Requests

A simple set of practices which allow teams to reap the most benefit from Pull Requests, while avoiding some of the inefficient side-effects of PR-based code review.

February 8, 2019

Mission Command: enabling autonomous software teams

empower software teams to make self-directed, strategically-aligned decisions within a rapid feedback loop

March 8, 2018

Advice for the Founding Engineer, part 3

Accelerate delivery of your MVP by choosing boring, safe technology and only building what you absolutely have to.

November 6, 2017

Continuous Delivery for Static Sites

Applying straightforward Continuous Delivery techniques to static sites. Remove the human processes so you can move fast and not break things.

August 14, 2017

Advice for the Founding Engineer, part 2

We introduce the second of three maxims which can guide the decisions of a founding engineer: Optimize For Iteration.

April 23, 2017

Advice for the Founding Engineer, part 1

We introduce the first of three maxims to guide the decisions of a founding engineer: You'll Never Know Less Than You Know Right Now.

March 29, 2017

The JS testing ecosystem needs a standard matcher library

November 20, 2016

The Symbol-Keyed State Accessor pattern

December 3, 2015

DIY stir plate for homebrew yeast starters

June 21, 2015

The Ultimate Traveler's Coffee Kit

September 2, 2014

video for my different.js talk

August 27, 2014

optimizing 3rd party JavaScript loading

May 15, 2014

Rails as an SOA Client

March 28, 2014

the 5 rules of an awesome dev toolchain

January 17, 2014

Microstatic: radically simple static microsites

September 13, 2013

Assertions in Page Objects

August 24, 2013

introducing rack-flags

August 6, 2013

iOS Unit Testing Workshop

May 7, 2013

Using Travis CI and xctool to build and test iOS apps

February 24, 2013

Test-driven Backbone.js - Part Three

January 23, 2013

Test-driven Backbone.js - Part One

January 23, 2013

Test-driven Backbone.js - Part Two

January 22, 2013

Deploying to Heroku from CI - the gory details

January 21, 2013

Deploying to Heroku from CI

November 18, 2012

Writing iOS acceptance tests using Kiwi

November 6, 2012

Cookie-based feature flag overrides

October 16, 2012

Frank with CocoaPods

September 6, 2012

Towards Frank 1.0

August 20, 2012

Introducing PublicAutomation

August 9, 2012

marker branches in git

August 2, 2012

Octopress deployment pipeline

July 22, 2012

Running Frank as part of iOS CI

July 11, 2012

Using the UIAutomation private framework

June 24, 2012

writing your first Frank test

June 16, 2012

Lowering Frank's barrier to entry

June 9, 2012

The Birth Of a Domain Object In Ruby

May 9, 2012

Feature Flags in JavaScript

February 8, 2012

Moving from Blogger to Octopress

February 6, 2012

Class-less javascript

September 2, 2011

Testing Mobile Web Apps With WebDriver

July 2, 2011

Javascript Promises

May 8, 2011

retroactive quality metrics with git

May 1, 2011

Inspect the state of your running iOS app's UI with Symbiote

April 19, 2011

Tutorial screencast on Frankifying your app

January 4, 2011

Working with Indirect Input and Output in Unit Tests

November 20, 2010

Creating and publishing your first ruby gem

November 20, 2010

timestamped-scenarios, a custom Cucumber formatter

October 12, 2010

Objective C memory errors pt II - Dangling Pointers

October 11, 2010

Common Objective-C memory management errors, Part I

August 7, 2010

Podcast about Frank and test automation on iOS

July 23, 2010

Frank: Automated Acceptance Tests for iPhone and iPad

April 22, 2010

TDD, Emergent Design, and Punctuated Equilibrium

April 5, 2010

Introducing Noguchi

April 3, 2010

Stormcloud will watch over the unicorns.

March 9, 2010

TickTock: A dirt-simple stopwatch class for actionscript

March 7, 2010

Why do we estimate effort?

February 22, 2010

Primitive Obsession obsessions

February 19, 2010

Encapsulating user interaction events in Flex

February 18, 2010

Ruby Facets: the mash method

February 3, 2010

Partial commits with git

January 31, 2010

an inverted include? for ruby

January 17, 2010

Flex Patterns: Presentation Adapter

November 17, 2009

How much code did I just delete?

November 16, 2009

Introducing Gimme: a lightweight ruby Registry

June 28, 2009

Adding hamcrest-as matchers to mock4as

June 14, 2009

Presentation Model Pattern

April 19, 2009

REST: 'There aren't enough verbs'

April 2, 2009

mock.willExecute(...) in mock4as

April 1, 2009

fun with Symbol#to_proc

March 23, 2009

Liberal Mocks