Remix.run Logo
tombert 3 hours ago

When ChatGPT came out, I was beyond excited. I had a tool to generate config files, and bounce ideas off of, and help unblock me when I got stupid arcane logs I didn't understand. That didn't feel existentially depressing at all; it was just glorified Google in my mind.

When the vibe coding tools like Claude and Codex came along, I got into this kind of dread. I'm sort of required to use them for work (we are "AI-first"...), but even if I weren't the tools are useful enough to me that I kind of feel like I have to use them because if I don't I'll be left in the dust.

And now it kind of feels like a lot of my job has been converted into babysitting interns. I don't get to write a lot of code by hand anymore, because most of what I do ends up being yelling at Codex to automate most of what I used to do. It's not all bad; I never got any enjoyment out of the initial bullshit of getting the initial project and configurations set up or futzing with configuration files, but I did get joy out of writing the actual implementation of the code, and now I don't get to do that much anymore.

A silver lining though; I do get to think in higher levels now, which is kind of fun. A lot of what I get to do now is write stuff in TLA+ and/or Mermaid (depending on the complexity and how much fancy concurrency I want to do), feed that into Claude, and get it to implement that. That part is fun, but I fear that I'm an outlier and that kind of programming won't catch on because engineers love to take the fucking idiotic position that they "don't need to do math to do programming".

foolserrandboy 2 hours ago | parent [-]

Can you describe how you work in this higher level? Sounds like scratches a similar itch that traditional programming offers.

tombert 2 hours ago | parent [-]

Sure; for reference most of what I end up doing is concurrent and distributed systems, so that's more or less what I focus on. I don't know if this stuff translates to other domains.

Basically, when I have an idea for a project, I usually start drawing a diagram for how I think things should work. I usually draw it with draw.io first because it's easy and quick. After that, I usually translate this to Mermaid, primarily just to have a second draft, but also because having a text-based system makes it easy to copy and paste around, and that kind of stuff tends to translates well to state-machine based stuff that most distributed systems tend to morph into.

If what I'm working on is relatively simple, I feed the mermaid code into Claude or Codex, give it some surrounding context text about what I want, and get it to hack away.

For more complicated stuff, especially if I want to be more clever with concurrency, I will take my Mermaid diagram and manually convert it to TLA+. If I get stuck with the TLA+ translation, I will sometimes ask Claude for a bit of help but even then I almost always write 90+% of the TLA+ spec by hand.

After that it's basically the same. I feed the TLA+ spec, and provide context to it as well (e.g. how to translate a manual TLA+ mutex or channel implementation to whatever the language has built in).

Since I focus very heavily on the implementation, Claude and Codex generally don't have a huge issue with doing a one-to-one implementation.