The code was the easy part

何益茂Felix He
发布于 Published 2026.09.22·约 4 分钟读完4 min read

My high school classmate runs a freight company in Shenzhen. I live in Canada now. Last May he asked whether I could help him stop losing paperwork in WeChat.

Four months later that question has turned into 1,364 commits, and every number his company has — every shipment, every cost, every yuan of commission — lives in something I write at night.

It did not go the way I expected, so I want to put down what actually happened.

Day four

The first version went live on day four.

Not a prototype. Live, on a server, with a login page, a shipment list, an edit form, user management, and a one-line deploy script. I know it was day four because the commits are still there: May 13 to May 16, ten of them.

That is the part everyone wants to hear about right now. I built it with Claude, and the speed is real — work that would have taken me a month took a weekend.

So I assumed the rest would go the same way.

Then June happened

It did not.

The shipment list was the easy half. The other half was money: what a job actually costs, who owes what to whom, what a salesperson has earned. I started that at the end of June. It is now late September. I am still changing it.

The commit history tells the story better than I can:

That jump is not me getting faster. It is the month the software stopped being about shipments and started being about money.

What was actually hard

It was never the code.

A double-entry ledger is a solved problem. You can look it up. What you cannot look up are the questions that ate the entire summer:

Nobody could answer these for me. There is no documentation for them. Every one got decided by being wrong first, on real money, and then arguing about it over WeChat at midnight my time.

That is the part I did not see coming. AI made writing the code roughly ten times faster. It made deciding what the code should do exactly zero times faster.

The false starts

This site is supposed to include those, so:

I ran several AI sessions in parallel to move faster. Two of them deployed to the production server from different copies of the project and quietly rolled back each other's work. It took a while before anyone noticed.

Another night I cleaned up a working directory that was not mine to clean. Thirteen files of work that had never been committed, gone, in a way git cannot undo.

And once I told my classmate his books were off by 1,562 yuan. They were not. I had written my own check for "has this already been reversed" instead of using the one that was already in the codebase, three lines away.

Every rule in my project handbook exists because of something like that. Only one person deploys. Every decision goes on a shared board. Anything that touches money runs the full test suite. None of those were written in advance — all of them were paid for.

The number I care about

The ledger has 20,447 lines in it now. Debits minus credits: 0.00.

That is the only number from this project I would put on a wall. Not the commit count, not the feature list. Four months of a real company's money moving through software written after dinner, and the books still close to the cent.

What I would tell myself in May

Build the boring part first. It is not the boring part.

And when someone tells you their software "just" needs to keep track of orders, ask them what happens to the money. That question is the whole project.

← All writing← 全部文章