<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Deorwine Infotech</title>
    <description>The latest articles on DEV Community by Deorwine Infotech (@deorwine).</description>
    <link>https://dev.to/deorwine</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F464033%2Fbb63f0ac-8234-4e74-af66-7530101b5f7f.png</url>
      <title>DEV Community: Deorwine Infotech</title>
      <link>https://dev.to/deorwine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deorwine"/>
    <language>en</language>
    <item>
      <title>We built the wrong product for 6 weeks. The client never complained and that was the problem.</title>
      <dc:creator>Deorwine Infotech</dc:creator>
      <pubDate>Wed, 17 Jun 2026 10:07:58 +0000</pubDate>
      <link>https://dev.to/deorwine/we-built-the-wrong-product-for-6-weeks-the-client-never-complained-and-that-was-the-problem-17an</link>
      <guid>https://dev.to/deorwine/we-built-the-wrong-product-for-6-weeks-the-client-never-complained-and-that-was-the-problem-17an</guid>
      <description>&lt;p&gt;This is not a post about tools, frameworks, or productivity hacks. It's about the time we confidently built the wrong thing and the uncomfortable truth we had to sit with afterward.&lt;/p&gt;

&lt;p&gt;A healthcare client came to us with a clear brief: "build a patient booking system." We asked some questions, nodded, and started sprinting.&lt;/p&gt;

&lt;p&gt;Week 6. We're doing a progress demo. The client goes quiet halfway through. Then: "This is great. But… our nurses aren't the ones who book appointments. The insurance coordinators are. And their workflow is completely different."&lt;br&gt;
We had built a beautiful, well-tested, on-time piece of software for the wrong human being.&lt;/p&gt;

&lt;p&gt;Nobody lied. Nobody miscommunicated. We just never asked who was actually going to touch this thing every day.&lt;/p&gt;

&lt;p&gt;The question we skipped&lt;br&gt;
After that project, we started doing something embarrassingly simple at the start of every engagement: we ask to watch someone do the thing we're about to automate. Not a demo. Not a screen recording. Actually sit next to the person, in their environment, doing their real work.&lt;br&gt;
In that healthcare case, if we'd done this in week 1, we'd have noticed the insurance coordinators were copying data between 3 systems using a spreadsheet they'd built themselves. That spreadsheet was the real product. We could have replaced it in 2 weeks instead of 6.&lt;/p&gt;

&lt;p&gt;The most expensive line of code is the one that solves the wrong problem. It's not the code that crashes. It's the code that works perfectly and quietly for months before anyone realises it was never needed.&lt;/p&gt;

&lt;p&gt;Mistake 2: we let "good enough" ship as "done"&lt;br&gt;
There's a version of this everyone recognises: technical debt. But I'm talking about something subtler - experience debt.&lt;br&gt;
We shipped a mobile app for an on-demand service. The booking flow took 11 taps. Our QA team signed it off. Our PM signed it off. The client signed it off. We launched.&lt;br&gt;
The conversion rate was 23% lower than projections. We looked at the heatmaps. Users were dropping off at tap 7. Nobody in our entire review chain had done the booking as if they were tired, or on a slow connection, or doing it while standing in a laundry room holding a basket.&lt;br&gt;
We rebuilt the flow to 5 taps. Conversion jumped. The 11-tap version was never broken, it was just built by people who already knew how it worked.&lt;br&gt;
Before you ship anything user-facing: hand your phone to someone who has never seen the product and ask them to complete the main action. Don't explain anything. Just watch. The silence where they hesitate is your bug list.&lt;/p&gt;

&lt;p&gt;Mistake 3: confusing "the client approved it" with "it's right"&lt;br&gt;
Clients approve things for reasons that have nothing to do with quality. They're busy. They trust you. They don't know what they don't know. Approval is a social act, not a technical one.&lt;br&gt;
We got into a habit of shipping things because the client said yes not because we genuinely believed it was the right call. This is a slow-moving form of dishonesty. You're outsourcing your professional judgment to someone who hired you specifically because they don't have it.&lt;/p&gt;

&lt;p&gt;If you wouldn't put your own name on it and show it to someone you respect, "the client approved it" is a cope, not a defence.&lt;/p&gt;

&lt;p&gt;The fix isn't to override clients. It's to be explicit when you disagree. "We'll build this because you've asked for it, but we want to flag that we think X will cause Y, can we note that in writing?" That sentence has saved us from post-launch blame-shifting more times than I can count.&lt;/p&gt;

&lt;p&gt;Mistake 4: treating deployment as the finish line&lt;br&gt;
We used to celebrate deployments. Now we celebrate the first 30 days after deployment. There's a difference.&lt;br&gt;
One platform we inherited had no error monitoring, no alerting, and no on-call rotation. It had been "live" for 4 months. When we looked at the logs, there were 400 silent errors a day that nobody knew about. Real users hitting real failures. Just... silently.&lt;br&gt;
js// The three things we set up before every launch&lt;/p&gt;

&lt;p&gt;// 1. Error tracking (we use Sentry)&lt;br&gt;
Sentry.init({ dsn: process.env.SENTRY_DSN, tracesSampleRate: 1.0 });&lt;/p&gt;

&lt;p&gt;// 2. Uptime alert — 5-min check, PagerDuty or even just email&lt;/p&gt;

&lt;p&gt;// 3. A single dashboard: error rate, p95 latency, active users&lt;br&gt;
//    If you can't see these three numbers, you're flying blind.&lt;br&gt;
Deployment is when the real information starts arriving. The users who break things in ways you never imagined, the edge cases your tests didn't cover, the performance cliff that only shows up at 3am when the cron job runs. You need to be watching.&lt;/p&gt;

&lt;p&gt;Mistake 5: the documentation you write for your future self&lt;br&gt;
A senior developer left one of our projects midway. We had a good handover doc. Or so we thought. The new developer came back three days later: "I can see what the code does. I have no idea why any of the decisions were made."&lt;br&gt;
That distinction — what vs. why — is almost everything in documentation. The code tells you what. Comments tell you what the code does. What you actually need is a decision log: why did we choose Postgres over Mongo here? Why is this API endpoint structured this way and not the more obvious way? Why does this weird workaround exist?&lt;br&gt;
We now keep a plain DECISIONS.md in every repo. One entry per architectural choice. Date, context, options considered, decision, and the person who made it. Takes 10 minutes per decision. Has saved us hundreds of hours of archaeology.&lt;/p&gt;

&lt;p&gt;The through-line&lt;br&gt;
None of this is revolutionary. It's just easy to skip when you're moving fast. And we've skipped all of it at least once.&lt;br&gt;
Most project failures aren't technical. They're conversational. They're the question not asked in week 1, the concern swallowed in week 4, the handover that assumed the other person knew what you knew.&lt;/p&gt;

&lt;p&gt;What's yours? Drop the mistake your team keeps making even though you know better. Genuinely curious whether these patterns are universal or if we're just uniquely bad at this.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
