Designing without scale: program like nobody will use it

May 6, 2021 • Reading time: 3 minutes

Since I left my job, I've tried to refocus myself on simple one-person projects that I can ship and (to some extent) forget about. Hopefully a few will see a modest profit, some others are intended to be open-source projects, and quite a few are just for my own amusement.

However, the biggest problem I've encountered so far is a stark reckoning with where my strengths really lie. I've spent ten years working full-time as a programmer, long enough that impostor syndrome shrank from a constant specter looming over me to only the occasional bout. I'd even gotten pretty comfortable calling myself a "senior software developer" with a straight face. The wakeup call for me has been leaving my work and attempting to do a junior's job again.

It turns out that I'm really good at designing at scale. I'm good at standing up in front of a whiteboard and drawing out a project's architecture, figuring out the components and which team handles what and where the possible failure points are and how to avoid race conditions and how to deal with geographical distribution and sharding and caching and race conditions and automated testing. And I enjoyed those ideation sessions a lot.

What I'm not good at is making a web page with a text form and a submit button. I can't build that page without getting sucked into thinking about where the data goes, what about uptime, what about maintenance, where do I host it, what about rate limiting or redundancy. I'm great at building "at scale". I've lost the ability to build without scale.

Well, that's not entirely true. I can do a decent job of hammering through programming exercises. I've actually completed a few projects that I'm using around home, kept my home automation system running along quite happily. The stuff that really genuinely doesn't matter to anyone but me is going just fine, thank you very much.

So my new challenge is to build like no one will use what I'm building. And that's hard. I think I'm making progress on expanding my comfort zone when it comes to unfamiliar technologies, but I hadn't expected to encounter such a nontechnical roadblock.

I would love to wrap this post up with some dramatic and life-changing insights, but those are still very much a work in progress. One important reminder for myself is that I'm good at refactoring, and I enjoy it. I'm good at seeing code that needs to be rewritten and rewriting it in a safe and maintainable way. And, importantly, I've also gotten pretty good at knowing when to leave well enough alone. So far, my best strategy is to reassure myself that I can and will come back and rewrite the garbage that I'm currently writing later on, so it doesn't actually matter. And it works a bit, but that's still an ongoing challenge.

So... watch this space for more? I hope one day I'll write a blog post about how I fixed all of these problems. For now, the most I can do is to document for posterity the pain points I'm encountering as I adjust to my new reality.