Test-first thinking
Four years in QA taught me to write the failing case before the feature. Even when I'm not writing the test file, I'm sketching the edge cases in my head — zero, scale, the network blinks.
Nine years building software. Four with a tester's eye for what breaks; five more learning to build the thing that doesn't. I make products with React, Next.js, Node, and Python — and I try to leave them more honest than I found them.
9 years · react · next · node · python · Q jumps to contact

I didn't start in a bootcamp. I started in a QA chair, watching real builds break under real load. These are the four moments that bent the trajectory.
My first job out of Cần Thơ wasn't building anything — it was breaking things on purpose. I joined FPT Software as a manual tester on enterprise .NET projects, and for the first two years my job was to find what the developers couldn't see. I wrote hundreds of test cases, ran them by hand, then watched the same bugs slip into production anyway because we caught them too late in the cycle.
So I started writing the test plans earlier. Then I started writing the automation. By the end of that stretch the team had cut production issues by about 30%, and I'd quietly crossed over into the dev side of the room. I learned that quality isn't a phase at the end of a project — it's a way of reading every line you write.
I still open a new file the way a tester opens a feature: looking for the seam where it will fail.
The move to frontend started with a payment processing web app — Next.js, Gatsby, third-party APIs that had opinions about how money should move. The UI looked simple. The states behind it did not. A single failed webhook could leave a user staring at a spinner while their card was already charged, and there was nowhere to hide.
From there I joined a real-time push notification product where the UI had to keep up with thousands of events scrolling through Ag-Grid without dropping frames. I learned that performance is a feature and that "just rerender it" is the most expensive sentence in frontend. I started caring about render budgets the way I used to care about test coverage.
Frontend stopped being "the CSS part" for me the day a 200ms jank cost someone a transaction.
For two and a half years I worked on a talent acquisition platform trusted by more than a hundred global companies. The frontend was React and Next.js with Tailwind and shadcn; the backend was Node and Express, deployed in Docker against Postgres. I built the CV→PDF export, the PDF parser that pulls structured data back out, the Nodemailer pipeline that had to never send the wrong email to the wrong person, and the OAuth/SSO flows that keep enterprise tenants quietly separated.
Backend ownership changed how I think about features. A button I shipped on Tuesday became a queue job I was debugging on Thursday and a Postgres index I was adding on Friday.
The full stack isn't a resume line. It's the pager that goes off when any layer breaks.
In May 2025 I joined Penguin Secret Agency as a fullstack engineer. We're building autonomous commerce systems — ShopQuantum.AI, a storefront that operates without a human in the loop, and FangBot.AI, a virtual business with 59+ AI employees running sales, marketing, support, and ops.
My day-to-day is React/Next on the surfaces humans touch, and Python + Node on the runtime the agents live in. The new muscle I'm building: designing the seams where deterministic code hands control to a probabilistic agent — and the override paths a human takes back when the agent gets it wrong.
After nine years debugging code I wrote, I'm learning to debug decisions a model made.
“Every bug I fix in production is a test case I should have written first.”
— a rule I keep relearning
None of these are clever. They're what's left after nine years of shipping, breaking, and rolling back.
Four years in QA taught me to write the failing case before the feature. Even when I'm not writing the test file, I'm sketching the edge cases in my head — zero, scale, the network blinks.
A boring version in production tells me more than a perfect version on my laptop. I'd rather ship the small honest thing, watch real users touch it, and iterate from real signal than tune in isolation.
Future-me at 11pm fixing a Sev-2 doesn't want clever. I lean on readable names, plain control flow, and small functions you can finish in one breath. Cleverness is a tax the on-call rotation pays.
If I shipped it, I'm the one who reverts it. Feature flags, migration plans, and a clear undo path aren't process — they're respect for the people running on top of my code.
Five turns in the road. Click in for the case study, the outcomes, and the lessons I wrote down at the time.
Two products in the same agent runtime: a storefront that operates without a human in the loop, and a virtual business with 59+ AI employees.
Two and a half years building the hiring platform trusted by more than a hundred global companies.
A live notifications product where Ag-Grid had to render thousands of events per second without dropping frames.
Next.js + Gatsby for a payments product that integrated third-party gateways. Most of the work was the unhappy paths.
Started as a manual tester on .NET/Java enterprise builds, then crossed into development. The career corner that defined the rest of it.
I take on a small number of client projects each quarter. If your stack overlaps with mine and the work is interesting, I'd love to hear about it.
High-converting landing pages — Next.js, Tailwind, fast, SEO-clean, deploy-ready on Vercel. From copy to launch in days, not months.
Drop me into your React/Next.js + Node/Python stack. Ship the feature, debug the queue job, fix the OAuth/SSO flow that's bleeding revenue. 9 years on call.
I read your code like a tester reads a build. You get a written report on the bugs about to bite you, the perf wins on the table, and the bottlenecks blocking your team's shipping cadence.
Not sure which one fits? Tell me about the problem, I'll tell you which shape it is.
Short pieces about real bugs, real lessons, and the quiet parts of shipping. No listicles.
Inspired by nownownow.com. Updated by hand, not by a feed.
Once or twice a month I send a short note about something I'm learning — usually about shipping, sometimes about agents. No spam, unsubscribe in one click.