Skip to main content

Command Palette

Search for a command to run...

I Shipped the Feature. I Missed the Product.

I completed the task. That was the problem.

Updated
7 min read
I Shipped the Feature. I Missed the Product.

My tech lead sat across from me, looked at what I'd built, and said something I wasn't prepared for.

"Think about this more like a product. Not just a side project you had to get done fast."

I smiled. Said okay. Went back to my desk.

And then I sat there for a few minutes, quietly frustrated.


The Setup

I had just started my internship — real company, real work, real stakes. My manager gave me a task: build a WhatsApp bot. Internal use case, so I won't go into specifics. But the scope was clear. A set of features, a target environment, a deadline.

I finished it in two days. Deployed it to AWS. Tested it myself. Walked over to my tech lead, genuinely proud.

She spent less than a minute testing it.

Then she leaned back and asked: "Would you trust this if the entire team started using it tomorrow?"

And then came the comment I couldn't stop thinking about.


The Moment That Actually Hit

My first reaction was defensiveness.

I'd spent two days building this thing. It worked. It was deployed. I had done exactly what was asked. Part of me wanted validation — a "good job," a thumbs up, something that confirmed I'd nailed it.

Instead, I got a lesson.

My second reaction — maybe thirty seconds later — was curiosity.

Because she wasn't wrong. And somewhere underneath the defensiveness, I already knew that.

She said something like this: "What you've built works great for one person using it exactly the way you intended. But think about it. People give different inputs. People have different mindsets. There are typos. There are edge cases. Users will use this in ways you never imagined. And I'm not even talking about the whole world — just think about our team."

That last part was the one that landed.

Just our team. A handful of people. And I hadn't really accounted for how they'd actually use it.


What I'd Actually Missed

Once the defensiveness faded, I started looking at the bot honestly.

I had never thought about what would happen if someone sent malformed input — a random string where the bot expected a specific format. It would just break. Silently, probably.

I had never considered what happens when two people message the bot at the same time. I'd built it assuming a single user flow. Concurrent requests? Not accounted for.

There was no retry logic. No monitoring. No graceful error handling. No logging that would let anyone debug a problem without going through the raw AWS logs.

It worked. In ideal conditions, with a patient user, doing exactly the right thing.

But real people aren't ideal. They type weird things. They move fast. They make mistakes. And a product that only works for the perfect user isn't really a product — it's a demo.

I hadn't shipped a product.

I'd shipped a demo.


The Ceiling of "Just Get It Done"

Here's the thing about finishing tasks quickly — it feels like a win. And in some ways, it is. Execution matters. Getting things done is a real skill. Don't underestimate it.

But there's a ceiling to that mindset.

When you think of yourself as someone who completes tasks, you optimize for completion. You move fast, check boxes, hand it over. Done.

When you start thinking like an engineer — like someone building something that has to survive contact with real humans — you start asking different questions.

Not "Did I build what was asked?" but "What happens when someone uses this differently than I expected?"

Not "Does it work on my machine?" but "Does it hold when ten people use it at once?"

Not "Can I add this feature?" but "Should I? What's the cost? What's the return?"

That ROI question was the one I'd never asked before. If a feature sounded useful, I'd build it — that was my entire logic. But building takes time, adds complexity, and costs money. If the value doesn't clearly outweigh those costs, why are we building it at all?

That's not a developer's question. That's an engineer's question.


The Same Lesson Applied to AI

Once I understood what my tech lead was really saying — that engineering is fundamentally about thinking before building — I noticed something interesting happening with how I was using AI tools.

Most people use coding agents the same way they'd use an autocomplete on steroids. Paste in a feature request, add some constraints, and let it go.

I used to do that too.

But if the lesson I'd learned was that thinking before building is the whole game, then using AI to skip the thinking was exactly the wrong move. I was outsourcing the most important part.

So I changed how I work with it.

Now, when I have a feature to build, I start by thinking through the approaches — two or three different architectural directions. Then I bring those to the agent, but I don't ask it to pick one. I ask it to ask me questions.

Specifically: "Before we start anything, ask me clarification questions — about architecture, scaling, the tech stack, edge cases, anything you'd need to know to make a good decision. Keep asking until you have what you need. Then give me an implementation plan."

The agent asks. I answer. It asks again. We go back and forth until the shape of the solution is clear and the decisions are deliberate.

Only then — after I've reviewed and approved the plan — do we write code.

The agent isn't doing my thinking for me. It's making my thinking more rigorous. It surfaces gaps I hadn't considered. It asks about constraints I'd taken for granted. It's the same lesson, applied to a different tool: slow down before you build.


What Changes When You Think This Way

There's a version of engineering that looks impressive from the outside but is actually quite shallow. You move fast. You ship things. You're always busy.

But speed without depth is just motion.

The question I now ask before touching any feature — even a small one — is: what would break if a hundred different people used this in a hundred different ways?

That question slows me down for about five minutes. And it saves hours of rework later.

The hard part is that this kind of thinking doesn't feel productive at first. It feels like overthinking. Like you're stalling while everyone else is shipping.

But here's what I've learned: the bugs you prevent by asking the right questions upfront don't have to be debugged later. The architecture decisions you make deliberately don't have to be reversed six months from now.

Fast thinking leads to slow fixes. Slow thinking leads to fast execution.


A Note for Engineers Early in Their Journey

If you're at the start — first internship, first real job, first project that actually matters — here's the most useful thing I can tell you:

The skill that will matter most isn't the framework you know. It's the quality of the questions you ask before you type anything.

Ask more than feels comfortable. Push back on specs that seem incomplete. Think about who's actually going to use what you're building — not the ideal user who does everything right, but the real one who types something weird and expects it to work anyway.

And if someone ever tells you that you're too focused on finishing and not focused enough on building — really listen. That's not criticism of your code.

That's an invitation to think at a higher level.


Looking back, my tech lead never criticized my code.

She criticized the assumption hiding underneath it: that software is done when it works.

In reality, that's where the hard part begins.

Completing tasks gets you noticed. Thinking about products gets you trusted.

The day I learned the difference was the day I started becoming an engineer.

C

Thankyou for sharing this valuable insight. Really enjoyed and learned from you experience.