For a long time I never described myself as a software developer. I was a sys admin, a DevOps kind of guy. I kept things running. Developers were the other people, the ones who wrote the software I had to look after.
It wasn't until my days at BuildingIQ that I started to question that.
It turns out I had been writing code all along
Looking back, I had been writing code of some sort since my early teens. First it was 68000 assembly, entered as raw binary. Then Z80 assembly. Then, when Linux arrived, C and C++, because back then you needed to be self-sufficient if you wanted anything to work.
None of it came through the normal channels. No degree, no courses, no bootcamp. Everything was self-taught, learnt by reading, breaking things and fixing them again.
So when people at BuildingIQ asked me about it, I still didn't recognise it. This was despite the fact I had written, and was maintaining, more than 50 Puppet modules along with all the Ruby code that went with them. That is software. I just didn't call it that.
Eventually I gave in.
Once I accepted it, everything got better
Something changed once I stopped fighting the label. Things got better, easier and more efficient. Instead of putting up with outdated system admin tools, I started writing UI apps in VueJS to replace them. I stopped seeing a problem and reaching for a workaround, and started seeing it as something I could build my way out of.
Today my stack is VueJS on the front and Go microservices behind it.
Microservices are not the problem, the old paradigm is
A lot of people give microservices a bad rap. I think that is because most of them are still looking at microservices through the old paradigm.
Remember when VMs became a thing? Everyone did the lift and shift. Take the physical server, turn it into a VM, job done. It worked, but it came with a whole set of issues that didn't go away until the systems were re-architected for what a VM actually was.
Microservices went through the same thing. When I started, it was very much a lift and shift. Containers with fat operating systems underneath them, and all the problems those operating systems bring with them: patching, packages you never asked for, shells and tools sitting there waiting to be used against you.
That is one of the main reasons I settled on Go. A Go service compiles to a single binary. I can take the operating system out of the question entirely and concentrate on the real issues, the code that actually does the work.
Replacing llama.cpp in Marvin
Which brings me to what I have been doing for the last two days: building a replacement for llama.cpp in Marvin's architecture.
This is not because llama.cpp is bad. It isn't. It is just not suitable for my situation.
I build with security in mind. I need to know there isn't a legacy OS sitting under a service that is going to bite me, or another php2shell style hole waiting just around the corner. Every extra layer is something else I have to check, patch and trust.
The result:
- Roughly 6G cut from the set of things in my system I need to check
- A 12.3M CUDA LLM engine for my Qwen models
- CVE scanning is now just a single binary
- No web chat or any other access that isn't needed
- TLS or mTLS for connections inside my cluster network, plus API keys
That is the difference between lift and shift and actually re-architecting. The engine does one job, and there is nothing else in the box.
More to come
There is more to go. I have a few ideas I want to try for running a 27B model on an 8G GPU while keeping a good token rate. If they pan out, that will be its own post.
And yes, after all these years, I think I can finally say it without the question mark. I am a software developer.

