Skip to content

Writings

These posts include memos, essays, and research. For case-studies and client testimonials, see ExtendedPlay.io.

My Decade with Oh My Zsh and Why I'm (Finally) Moving On

It’s funny how deeply ingrained some tools can become in our workflows. Back around 2012, I stumbled upon Robby Russell's Oh My Zsh, and like many, it felt like a revelation. Suddenly, my terminal wasn't just a command line; it was this vibrant, supercharged environment. It was the gateway drug for many of us into the rich Zsh ecosystem, and for that, I'm genuinely grateful. It made the shell approachable and, dare I say, fun.

For over ten years, Oh My Zsh has been a steadfast companion. But as with all things in tech (and life!), needs evolve, perspectives shift, and sometimes, the tools that once felt indispensable start to feel a bit... much.

A General-Purpose Python AI Development Environment

(Updated May 13, 2025)

I was watching popular AI-trending youtuber Matthew Berman build a local environment for AI development the other day. And it was amazing how issues like virtual environments, package mangement and versioned dependencies were huge pain points and hurdles.

It occured to me that with all the excitement about AI and tooling, that there's common issues that folks who aren't used to the command line may run into – and be stopped dead in their tracks.

Three maps better than a roadmap

"We need a roadmap, is there a template we can use?"

I see this request all the time. From clients to peers, developers to product execs.

The idea is that with the right template: you fill in the squares and your viola your roadmap is ready. I get it. A roadmap feels like such a great thing, its an artifact that says "this is what we're doing, and when we'll do it".

Most roadmaps look like this:

I love developing, again

I'm writing this today to remind myself: I actually do love developing. I do love the moment of sitting in my editor, with a challenge or idea, and writing an elegant solution to it.

Running an app on production – is a different beast. A nearly joy-less scenario. Its all remedial! Its scaling, bug-finding, performance tuning, conflict merges, security audits, etc. It's a lot of work. All the benefits come from that software's near-invisibility to the customer who uses it.

A "Motivation Model" of developer archetypes

An amazing and empathetic former boss of mine, Scott Blomquist, liked to talk about the different types of developers: Hackers, Engineers and Computer Scientists.

In the 15 years since, I've forgotten the exact qualities that formed these groups (help me out Scott!) but as the years went on, I never forgot the grouping and started to notice patterns of my own.

As an intrinsically-motivated individual, I started paying attention to what seemed to motivate the different developers who fall into these groups.

After a few years of thinking on this, I arrived at the following x/y grid:

Developer Motivation Model - a 2x2 grid with Artifacts vs Systems on the x-axis and Local vs General on the y-axis, showing four archetypes: The Hacker, The Programmer, The Engineer, and The Scientist

Value Expression

It's a given that developers write code. But when we think about an intrinsic value model, I think we can place developers on spectrum from "the code I write is valuable" to "the system created by such code is valuable". Another way to put this: do you enjoy that the code is a tangible expression of a system? Or do you enjoy that the system is proven by some tangible code?

Problem Space

The second criteria is the problem space. All developers are brilliant problem solvers. Some, however, are motivated by a solution that is more local than global and vice-versa.

You've seen this I'm sure – a developer who can't seem to be satisfied by solving the timezone-related issue on invites, without defining a new timezone system for everything.

Conversely there's the developer who breaks work tasks down into such small bite-size portions, that their pull requests always include 5-10 files or functions with laser-precision purposes. simple utilities on their own, but when combined, they solve the problem.

The Archetypes in Summary

Because of this contrived combination of spectrum, we can define 4 archetypes that represent each quadrant.

The Hacker

The hacker gets it done, and knows that its done because its... done. The button works, the payment processes, the game loads. It doesn't always matter how, or whether it can be repeated. But then again, why does that matter? We have the "thing" we needed, and now we can move on to the next thing we need. Without hackers, we'd have nothing that's "cool" – we'd just have a bunch of working, but boring apps. Its up to the hacker to create the "cow paths" that we then pave over with proper roads (and documentation).

The Programmer

The programmer is good. And they know it. We all know it too. Look at that code. Look at those STATIC TYPES. Its SOLID and DRY. Their APIs never overlook CRUD and their teams win at DORA. The programmer got into this field to do just that: write code, and do it well. They take pride in their abstractions and N+1 issues cause physical pain. The programmer has languages they would rather die than touch – and if your life is in danger, you better hope a programmer wrote the code on that life-saving device.

The Engineer

To an engineer, the model of the system is everything. In fact, lets define a domain-specific language to properly map this problem space ! The result: the business, the product, the team and the code – are all one – sharing one language, sharing one glorious purpose, in total alignment. There's nothing more jarring to an engineer than a constraint or requirement that shows up late and out-of-the blue. Psych ! They don't mind at all – they already accounted for those edge cases, and intentionally accounted for a degraded but functional experience, in favor of preserving the golden path.

The Computer Scientist

For the Computer Scientist, development is experimentation. Problems? Solution? These are all simply evidence added to the ongoing dialogue between man and machine. Motivated by knowledge and pushing boundaries, a Computer Scientist gets as much joy discussing an algorithm as implementing it.

The OODA Loop: How to repeatably identify and overcome the worst technical debt

Technical debt isn't always immediately obvious from a far, but easily recognizable when you touch it: it feels bad. Its a broken abstraction – a manual work-around. Its a burden. Its embarrassing. You scratch your head wondering how you got here and how to never get here again. It is often so woven into your particular workflow that off-the-shelf or external solutions don't seem to apply – its isolating.

A "necessary e-mail"

Setting up emails is still a silly, annoyingly technical task. Often, my clients don't anticipate just how many email systems are needed, even for a tiny saas business.

I'll walk through the four necessary categories of emails below and how they differ in setup.

Company Accounts

These are the @example.com email addresses. You'll need them, your team will need them, and you'll want to be able to create aliases and groups. Your domain registrar will say they offer this. Don't use it.

Tasks: - Setup a G-Suite account with your domain - Connect your domain to it via MX records

Transactional Emails

These are the emails that get sent as receipts or in conjunction with core user activity on your app. These shouldn't be conflated with your marketing emails. Send them separately through Postmark or Sendgrid. You want these to be delivered and the reputation to be separate from your marketing campaigns.

Tasks: - Setup a new domain name - Attach it to a transactional email service - Follow their onboarding rules and hoops, and give yourself time (sometimes weeks) to make it through their verification processes

Support Emails

This inbox will be where your customer support happens, so do yourself a favor and create a shared inbox. This can be a group or alias that goes to a shared G-Suite inbox, or a dedicated service like Intercom or HelpScout.

These emails require visibility so try to have multiple eyes on them !

Tasks: - Create a "group" in G-Suite that receives emails address to [email protected] - Add support team members to the group

Marketing & Sales Emails

You'll use one or more services for marketing emails and these domains have the highest risk attached. I recommend separating them from your transactional email domain and company email domain to better insure than any reputation issues that affect them don't impact the other channels.

Starting out, you'll also want to be smart about the "reply-to" address used in these emails. For onboarding drip campaigns: reply-to founders – this is product research. For others, make sure your reply-to lands in someone's real inbox. Customer's rarely reply to email blasts, but if they do – you want to know.

Tasks: - Sign up for MailChimp, ActiveCampaign, Customer.io, etc - Register a subdomain, email.example.com - Follow their onboarding process for verification (note: it may take days, or even weeks before you can begin sending en masse) - Begin sending slowly, an early misstep in sender reputation can be costly - Setup email security domain records: spf, dkim

Technical debt

Technical Debt

n. Inefficiency introduced to satisfy a requirement, because the resources (time, knowledge, solutions, funding) are not available.

I'm not sure where I saw this definition, but I loved it. It includes the motivations behind why we choose technical debt as humans.

You want a car, but you don't have $50,000 today. So, you take on debt and get the car today. Now you have the car, and you carry the debt. The debt doesn't actually hurt you. The debt only comes into play when you're making decisions.

Technical debt only hurts in a system that needs to make changes and respond to new priorities.

You need to get from point A to B.

You can build a bridge, or you can pay a toll.

You don't have time to build a bridge, or the right bridge-builder, or the steel at hand to build a bridge.

So you take the toll road – you’ve created technical debt.

That’s the debt, the cost of taking that toll now every time you need to get from point A to B.