I ship things I don't understand. So can you.

I enjoy playing around with self-hosting, there’s something very satisfying about being completely in control of some automated service without relying on the whims of an external tech company. A few years ago, whenever I dived into self-hosting, it was fun solving the problems along the way to get it working. However, what definitely was not fun was picking up the project a year later. Not only have you nearly completely forgotten how it works, there are multiple dependencies that require updating, some of them break other things inadvertently and in the end you get frustrated. The project immediately goes on the “to do later” pile, otherwise known as “I will never look at this again”.

Now LLMs have stepped into the picture. I don’t even need to know how things work anymore, I need to know what working looks like. Part of this is letting go and trusting the result. The skill that matters is recognising done.

I’ve learnt that I can keep working on something for a long time as long as the first usable version is completed quickly. I’ve always had small half-finished, or more accurately half-started personal projects, but I was terrible at finishing anything. The list is long: AcuRite sensors feeding a Bluetooth receiver, logged into ClickHouse, displayed in a Grafana dashboard. A year ago that would have been three weekends of fighting dependencies before I lost interest. Now it’s a Saturday. With LLMs, it’s ridiculously easy to get a basic prototype in days or even hours. It may look like hot garbage, have bugs and crashes, but the feeling of bringing something to life is enough to keep going.

Part of the problem of getting from zero to one previously was there are a lot of blockers. Particularly if you’re trained in software engineering, there’s a nagging thought in the back of your head that I really SHOULD write tests for this. These matter less now. You can ask AI to review your code base, tell you where it thinks you should unit test, then spend 10 minutes reviewing what it’s suggesting and bang, your tests are written. I never practiced TDD previously, but now I have LLMs write a failing test before making a change or implementing a feature. Working this way previously involved days of painstaking work, now there’s no excuse not to work this way.

Anything where you can describe the result is now LLM territory. Your job is knowing what the result should be.