Skip to main content

About Brian Graham

· 2 min read
Brian Graham
Consultant

I've been in your shoes. Solo developer, 10-person startup, 1000+ person maze—I've worked across company sizes from individual contributor to manager-of-managers. Started programming at seven, spent over a decade in the trenches.

The technical problems are rarely the real problems. The real challenges are sociotechnical: building software with humans, creating teams that work together instead of against each other, aligning what we build with what actually matters.

The right way to email a git repository

· 2 min read
Brian Graham
Consultant

You're tasked with reviewing the code challenge of another candidate. You download the project.zip file, extract it, and it doesn't run. You can't tell what part of the code is auto-generating scaffolding, or what part is the complex part. You can't really get an idea of if the code would work, or was even written by the candidate. You don't even know if they did the entire project in one big commit or not. As long as there's nothing horribly wrong, you'll pass them.

Most companies have some kind of code challenge in their interview process. While you may like or dislike this practice for different reasons, one thing that can easily remove a bunch of headaches here is to stop asking for zip-files of that project.

Moneyball Teams

· 5 min read
Brian Graham
Consultant

If you search "We only hire the best," you'll discover that literally everyone only hires the best. How can 100% of businesses hire from the top 5% of the talent pool? What happens to the other 95% of developers?

The answer is simple: it's nonsense. Nobody hires exclusively the best, nor should they. We don't even have industry-wide objective metrics to measure developers consistently.

This post explores how to build strong teams focused on total throughput instead of hiring based on abstract criteria where you can only hope for the best.

What Slows Development Teams

· 6 min read
Brian Graham
Consultant
Historical Context

This article was originally published as a guest post for GitPrime in 2017, during the height of the Agile movement and the rise of DevOps practices. At the time, many teams were struggling with the transition from waterfall to iterative development, and developer productivity tools were primarily focused on basic metrics like commit frequency and lines of code.

Since then, the industry has evolved significantly with the emergence of DORA metrics, platform engineering, and more sophisticated approaches to measuring developer experience. However, the core challenges identified here around communication gaps between managers and developers, context switching, and misaligned incentives remain relevant today.

GitPrime Background

GitPrime was a developer analytics platform that provided insights into software development teams' productivity and processes. The company was later acquired by Pluralsight and integrated into their Flow product offering before being discontinued. This article represents thinking from the earlier era of developer productivity tooling, when the focus was primarily on code-based metrics rather than today's more holistic developer experience approaches.

Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law. – Douglas Hofstadter

Developers and managers both want scope and delivery time to align, but despite working toward a common goal, they rarely do. The gap is often so large that deadlines are missed, products become irrelevant, and teams face burnout.

Three major schools of thought explain why Hofstadter's Law persists in software development.

Serve a Static Website as a Unikernel

· 6 min read
Brian Graham
Consultant
What are Unikernels and Rump Kernels?

Unikernels are specialized, single-purpose operating systems that package your application with only the minimal OS components it needs to run. Think of them as extremely lightweight VMs that boot in milliseconds and use a fraction of traditional server resources.

Rump Kernels take a unique approach: they let you extract specific drivers and components from existing operating systems (like NetBSD) and run them in userspace or as unikernels. This means you can use proven, mature OS components without the overhead of a full operating system. Your application gets direct access to high-performance networking, file systems, and other kernel services while maintaining strong isolation.

The result is applications that start faster, use less memory, have smaller attack surfaces, and can be deployed more efficiently than traditional containerized or VM-based approaches.

You'll learn how to use the Rumprun toolchain to build a unikernel that hosts your static website served by Nginx. This tutorial focuses on giving application and web developers practical steps to get running with Rump Kernel-based unikernels.

This assumes you're on a GNU/Linux or BSD system and familiar with command line basics.

Your Monitor Is Awful

· 4 min read
Brian Graham
Consultant

Your monitor is awful. Not because you bought the wrong one, and not because it lacks enough pixels. Computer displays have evolved dramatically since the days of punch cards and blinking lights on supercomputers, eventually progressing through oscilloscopes to today's flat, lightweight panels with high resolution and millions of colors.

Yet despite these advances, we've hit a wall.

The Lost Art of Internet Protocols

· 7 min read
Brian Graham
Consultant
Historical Context (2025)

This post was written in early 2012, when the internet landscape was quite different. At the time, websites were becoming increasingly bloated with Flash content and heavy JavaScript, mobile responsiveness was still a major challenge, and SOPA/PIPA legislation threatened internet freedom. Social media was dominated by Facebook and Twitter, and "Web 2.0" was still a meaningful term.

Since then, many of the author's concerns proved prescient. We've seen the rise of platform monopolization, continued protocol stagnation despite technologies like WebRTC and HTTP/2, and growing awareness of how much the modern web's complexity costs users. The recent interest in decentralized protocols (ActivityPub, IPFS, Nostr) and the push for simpler, faster web experiences echoes many arguments made here over a decade ago.

A long time ago, on an operating system far, far away...

It was a period of protocol war.
Raw text connections sent
over the internet had
gained a strong following.

During this time, greater
needs and complexity arose
eventually leading to the
wide adoption of the hyper
text transport protocol

Knowledge of how the web worked
on these lower levels soon
vanished. It is up to you to
learn the old ways and restore
freedom to the internet...

There's something we lost when HTTP became the only game in town. Before the web browser dominated everything, the internet was a diverse ecosystem of protocols, each designed for specific purposes. We had telnet for raw connections, Gopher for clean content delivery, and text-based worlds that fostered creativity in ways the modern web struggles to match.

Understanding these "old ways" isn't just nostalgia. It reveals how much richer the internet could be, and why our current web-centric approach may be holding us back.

Project Euler 001 The Hard Way

· 8 min read
Brian Graham
Consultant
Historical Context

This is a rewrite of an article I wrote in January 2012 where I discover the hidden complexity of a simple programming problem.

Problem 001​

On the popular programming challenge website Project Euler, the first problem seems quite trivial. However, with deeper examination we can discover layers of complexity as we try to generalize the problem.

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.