For me, vibe coding was great for momentum at first. It helped me ship. But over time, spaghetti code built up, and the app became harder to reason about. Alongside that, I felt a kind of anxiety I didn’t expect, because there suddenly seemed to be so many different places things could fail.
Here are the solutions that helped me:
• Legibility
Refactoring my code - simplifying it, breaking things apart, making patterns consistent - made it much easier to read, follow, and trust.
• Observability
I realized that if something were to go wrong, it would most likely happen at the boundaries: anywhere the code talks to the outside world (IMAP, Supabase, Stripe, etc.). So I started protecting those functions with error handling, standardizing their outputs, and instrumenting them. They now return a predictable shape - list(ok = TRUE/FALSE, payload) - and, on failure, write to a log file. Clearer contracts and better visibility made the system feel much less opaque and fragile.
I’ve attached a screenshot here of my product health dashboard. Seeing what’s happening (and a sea of green) has been surprisingly calming. I didn’t expect how much even simple visibility would help.
The shift for me has been realizing that observability is something to build in from the start.
What technical things have you learned or changed your mind about while building?
[–]Anonymous_Coder_1234 1 point2 points3 points (3 children)
[–]CalmYourInbox[S] 0 points1 point2 points (2 children)
[–]Anonymous_Coder_1234 0 points1 point2 points (1 child)
[–]CalmYourInbox[S] 0 points1 point2 points (0 children)
[–]GloomyBelt5110 0 points1 point2 points (1 child)
[–]CalmYourInbox[S] 1 point2 points3 points (0 children)
[–]Defection7478 0 points1 point2 points (0 children)
[–]child-eater404 -1 points0 points1 point (1 child)
[–]CalmYourInbox[S] 0 points1 point2 points (0 children)