<?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: Om Keswani</title>
    <description>The latest articles on DEV Community by Om Keswani (@omieee_24).</description>
    <link>https://dev.to/omieee_24</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%2F2818796%2F11a7a3d1-e8b4-45a7-9cfd-39cd1ea65fee.jpg</url>
      <title>DEV Community: Om Keswani</title>
      <link>https://dev.to/omieee_24</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omieee_24"/>
    <language>en</language>
    <item>
      <title>The "Let's Take This Offline" Trap</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Sat, 27 Jun 2026 12:10:04 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-lets-take-this-offline-trap-3l2j</link>
      <guid>https://dev.to/omieee_24/the-lets-take-this-offline-trap-3l2j</guid>
      <description>&lt;p&gt;It was a Wednesday morning standup, the kind where everyone's camera is on but nobody really wants to be there. Maya, our backend lead, mentioned she was blocked on the payment service schema. She'd posted a proposal doc five days ago. Twelve comments. Four emoji reactions. No decision.&lt;/p&gt;

&lt;p&gt;"Let's take this offline," our engineering manager said, with the practiced ease of someone who'd said it a hundred times. "We don't need to solve it here."&lt;/p&gt;

&lt;p&gt;Maya nodded. I nodded. The standup ended thirty seconds early. Progress.&lt;/p&gt;

&lt;p&gt;Except there was no progress.&lt;/p&gt;

&lt;p&gt;Over the next week, the doc grew like something feral. Fifteen comments became thirty. Someone added a "TL;DR" that was itself too long to read. Someone else proposed a completely different approach in the margin of comment seventeen, and nobody acknowledged it. The thread didn't converge. It branched, tangled, and then went quiet. The last comment was a thumbs-up emoji from Dan, our staff engineer, posted at 11:47 PM on a Friday. We all interpreted it as agreement. Maya later told me she interpreted it as exhaustion.&lt;/p&gt;

&lt;p&gt;Two sprints later, the schema still wasn't decided. We were coding against a temporary interface that someone had built "just to unblock things" and that temporary interface was now serving real customers. The payment service had no official owner. The decision hadn't been postponed. It had evaporated.&lt;/p&gt;

&lt;p&gt;I remember sitting with Maya after an incident review—something had broken because the temporary schema didn't handle edge cases—and she said, quietly, "I don't even know who's supposed to decide anymore. Everybody's too polite to just say 'this is what we're doing.'" She wasn't angry. She sounded defeated.&lt;/p&gt;

&lt;p&gt;That was the moment I understood what we'd built. Our team wasn't async-first. We were conflict-avoidant wearing the costume of good process. The docs, the threads, the carefully worded Slack messages—they weren't making decisions easier. They were making it possible to never make one at all.&lt;/p&gt;

&lt;p&gt;The fix wasn't what I expected. We didn't abandon writing things down. We just stopped pretending that written debate alone could close a loop. We started scheduling what Maya later called "decision windows." Fifteen minutes. No status updates. No screen sharing a half-finished document. Just the three people who actually had context, sitting in a call, with one rule: someone has to leave that call having typed the decision into the doc.&lt;/p&gt;

&lt;p&gt;The first one was awkward. We disagreed. Someone had to say "I think we should go with A, and here's why I'm not going to wait for more data." There was a pause, and then the decision got written down. It wasn't perfect. It was done.&lt;/p&gt;

&lt;p&gt;What surprised me was what happened to the async discussions after that. They got sharper. People stopped writing essays designed to impress nobody in particular. They laid out trade-offs like adults who knew a real conversation was coming. The doc became a pre-read, not a destination. And Maya, who had been silently carrying the weight of every unmade decision, started looking less exhausted.&lt;/p&gt;

&lt;p&gt;The "let's take this offline" habit didn't disappear overnight. But now when someone says it, there's a follow-up question baked into the team culture: "Great—who's scheduling the window?" If nobody steps up, we all know. We're not being thoughtful. We're just letting the thing die politely.&lt;/p&gt;

&lt;p&gt;It turns out a decision isn't a document. It's a moment. And moments don't happen in comment threads. They happen when two people look at each other—on a screen or across a table—and one of them says the thing that's been waiting to be said out loud.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Blameless Postmortem That Still Blames You</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Thu, 18 Jun 2026 13:08:13 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-blameless-postmortem-that-still-blames-you-3bdc</link>
      <guid>https://dev.to/omieee_24/the-blameless-postmortem-that-still-blames-you-3bdc</guid>
      <description>&lt;p&gt;You’ve been in that retro. The slide already says &lt;em&gt;This is a blameless postmortem.&lt;/em&gt; Someone pastes a Slack timeline, a facilitator reminds the room to focus on systems not people, and a fresh Jira epic swallows the action items. You nod along, camera off, and you think the same thing you’ve been thinking for six months: &lt;em&gt;I still feel like I’m being written up.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We got fluent in the vocabulary of psychological safety years ago. Nobody asks “who broke this?” anymore. We ask “what allowed this failure mode?” and we mean it. Yet for a lot of engineers — especially the ones quietly absorbing operational chaos — the postmortem has shape-shifted into something uglier. It’s become a surveillance document that wears a learning-opportunity mask.&lt;/p&gt;

&lt;p&gt;Here’s how it actually works. The incident timeline lands in a shared folder, and an innocent question floats up in the thread: &lt;em&gt;“Was the alert acknowledged before the escalation policy triggered?”&lt;/em&gt; Sounds factual. But it’s really a timestamp with your name on it, and it’s sitting there while your manager drafts quarterly feedback. The system doesn’t have to point a finger. It just has to record who touched what, and when, and let a well-trained imagination fill in the rest.&lt;/p&gt;

&lt;p&gt;The kicker is that nobody set out to build it this way. Teams genuinely believe thorough postmortems prevent recurrence, and thorough means &lt;strong&gt;attribution&lt;/strong&gt;. Who logged in. Who merged. Who approved the rollback. The document collects all of it without malice, then quietly hardens into a competency paper trail. Come calibration season, a pattern of “always being in the timeline” — even if you were the one who caught the bug, stayed up, wrote the fix — gets read as a pattern of &lt;em&gt;being close to incidents&lt;/em&gt;. And that’s a pattern that costs you.&lt;/p&gt;

&lt;p&gt;I’ve watched people game this in real time. They learn to never be the last person to touch a config change. They make sure the incident commander role rotates away before the retrospective. They write action items so vague no single human can be tied to their completion. This isn’t laziness; it’s survival. When “blameless” means &lt;em&gt;we won’t say it out loud but we’ll sure remember&lt;/em&gt;, smart people stop volunteering for the pager shadow rotation. They stop saying “I’ll own the fix.” They stop caring about the system and start caring about their paper trail.&lt;/p&gt;

&lt;p&gt;The real giveaway isn’t what happens in the meeting — it’s what happens three weeks later, when a senior engineer quietly asks to be moved off on-call and leadership treats it like a motivation problem instead of a trust problem. Or when the action items that emerged from the incident aren’t new runbooks or circuit breakers, but a private coaching note: &lt;em&gt;“Improve response time under pressure. Communicate more clearly in Slack during degraded state.”&lt;/em&gt; That’s not a system improvement. That’s a performance review bullet wearing a postmortem hoodie.&lt;/p&gt;

&lt;p&gt;Real blameless culture doesn’t live in a meeting template. It lives in an institutional refusal to let incident timelines become résumé lines. It means postmortems celebrate the person who showed up five times in the log, not flag them as “risk exposure.” It means the overwhelming majority of action items are about automation, not about coaching conversations. Until that’s true, the word “blameless” will just be the new “we’re a family” — something you hear right before the part that hurts.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Standup Theatre</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Sun, 14 Jun 2026 11:21:28 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-standup-theatre-49gm</link>
      <guid>https://dev.to/omieee_24/the-standup-theatre-49gm</guid>
      <description>&lt;p&gt;It’s 9:15 AM. You’re holding a coffee you didn’t want yet, listening to the fourth person in a row say, “Yesterday I worked on the API integration, today I’ll continue the API integration, no blockers.”&lt;/p&gt;

&lt;p&gt;Nobody’s fooled. Everyone knows the API integration has been “continuing” for six days. But we all nod anyway, because the real goal of this meeting is no longer coordination. It’s performance.&lt;/p&gt;

&lt;p&gt;Somewhere between the agile manifesto and the daily grind, standups stopped being about unblocking work and started being about proving you’re working. The audience shifted. People aren’t talking to their teammates anymore. They’re talking to the manager, the tech lead, the person who might whisper something in a one-on-one. Without anyone saying it, the three questions became a tiny audition. Can you sound productive in under sixty seconds?&lt;/p&gt;

&lt;p&gt;The cost of this theatre is bigger than most teams admit.&lt;/p&gt;

&lt;p&gt;Real engineering is messy. You spend a morning falling into a rabbit hole only to discover the problem was a misconfigured feature flag from two sprints ago. But “I traced a bug to an old flag and have no fix yet” sounds like you did nothing. So you paraphrase: “Making progress on the checkout issue.” That sanitised sentence protects you, but it buries crucial context. Your teammate who fixed that flag last month never hears about the fallout. The team repeats the same mistake next sprint because the truth never made it onto the board.&lt;/p&gt;

&lt;p&gt;Then there’s the help that never arrives. A standup is supposed to surface blockers. But in a performative standup, admitting you’re stuck feels like saying you’re incompetent. So you don’t say it. You go back to your desk, open the same undocumented internal library, and spend another afternoon staring at the screen alone. The ten-minute conversation that could have saved you never happens, because you learned that the safest thing to say is “on track.”&lt;/p&gt;

&lt;p&gt;And management loves it. Every day they hear a chorus of “on track,” and they walk away feeling secure. That’s the most dangerous part. A smooth standup isn’t a sign of health; it’s often a sign that problems are being hidden just well enough to blow up spectacularly three days before the sprint ends. The standup becomes the very thing that hides reality from the people who need to see it most.&lt;/p&gt;

&lt;p&gt;I once worked on a team where a developer spent two weeks struggling with a flaky deployment pipeline. Every standup he said, “Still working on the deployment stuff.” Nobody asked follow-ups, because the standup was a status broadcast, not a conversation. Two days before launch, the pipeline collapsed entirely. We scrambled, people cancelled weekends, and the fix ended up taking a pair of engineers four hours. If one person had said, “Hey, that sounds painful, let’s look at it together after standup,” the entire crisis would have been a non-event. But the format didn’t invite that. The format invited performance.&lt;/p&gt;

&lt;p&gt;How do you break out of it?&lt;/p&gt;

&lt;p&gt;I’ve seen one trick work more often than any other: talk about the work, not the worker. Instead of going around the room person by person, walk the board from right to left—closest to done first. Ask about the tickets, not the humans. “What’s stopping this from shipping?” It becomes much harder to perform when the question is about a specific card. You can’t polish a stuck ticket into sounding like progress. You just have to say, “The payment service dependency hasn’t responded,” and suddenly that’s not a personal failure. It’s a fact. And facts invite help.&lt;/p&gt;

&lt;p&gt;Another thing: let standups be awkward. A good standup occasionally has a moment of silence where everyone stares at a problem and realises they don’t have an immediate answer. That’s okay. If your standups never feel slightly uncomfortable, you’re probably not surfacing the real stuff. The goal isn’t a clean, reassuring daily ritual. The goal is to make invisible work visible, and invisible work is rarely tidy.&lt;/p&gt;

&lt;p&gt;I’ve also seen teams kill standups entirely and replace them with asynchronous Slack threads. That can work, but only if the team already has enough psychological safety to be vulnerable in text. Otherwise, you just get polished bullet points instead of polished monologues—same theatre, different stage.&lt;/p&gt;

&lt;p&gt;The standup isn’t the problem. It’s a neutral container. It becomes theatre when people learn that honesty has a cost and performance has a reward. Fix that, and a 15-minute circle can still do its real job: making sure nobody fights the monster under the stairs alone.&lt;/p&gt;

&lt;p&gt;So tomorrow morning, when someone says “no blockers,” maybe pause and ask, “Really? Even that nasty logging bug from yesterday?” You might just find that the show is over and the real work begins.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Slack Dependency: How Instant Messaging Replaced System Design</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Sat, 06 Jun 2026 09:37:07 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-slack-dependency-how-instant-messaging-replaced-system-design-1gnc</link>
      <guid>https://dev.to/omieee_24/the-slack-dependency-how-instant-messaging-replaced-system-design-1gnc</guid>
      <description>&lt;p&gt;A new engineer joins the team.&lt;/p&gt;

&lt;p&gt;On their first day, they ask a simple question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Why does this service call that API before writing to the database?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nobody knows.&lt;/p&gt;

&lt;p&gt;The documentation doesn't mention it.&lt;/p&gt;

&lt;p&gt;The architecture diagram is two years old.&lt;/p&gt;

&lt;p&gt;The code doesn't explain it.&lt;/p&gt;

&lt;p&gt;Eventually, someone replies:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Search Slack. I think we discussed it last year."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After twenty minutes of scrolling through old threads, buried between emoji reactions and unrelated conversations, they finally find the answer.&lt;/p&gt;

&lt;p&gt;And that's when they discover a strange truth about modern software teams:&lt;/p&gt;

&lt;p&gt;The most important documentation isn't in the documentation.&lt;/p&gt;

&lt;p&gt;It's in chat history.&lt;/p&gt;




&lt;p&gt;Most organizations believe they have a documentation problem.&lt;/p&gt;

&lt;p&gt;Many actually have a dependency problem.&lt;/p&gt;

&lt;p&gt;Over time, Slack, Teams, Discord, and other messaging platforms become the unofficial source of truth for technical decisions.&lt;/p&gt;

&lt;p&gt;Why was a service split into two?&lt;/p&gt;

&lt;p&gt;Search Slack.&lt;/p&gt;

&lt;p&gt;Why is that database query intentionally slow?&lt;/p&gt;

&lt;p&gt;Search Slack.&lt;/p&gt;

&lt;p&gt;Why can't we remove that feature flag?&lt;/p&gt;

&lt;p&gt;Search Slack.&lt;/p&gt;

&lt;p&gt;Critical engineering knowledge slowly migrates from systems into conversations.&lt;/p&gt;




&lt;p&gt;At first, this feels efficient.&lt;/p&gt;

&lt;p&gt;A quick message gets a quick answer.&lt;/p&gt;

&lt;p&gt;No need to update a document.&lt;/p&gt;

&lt;p&gt;No need to schedule a design review.&lt;/p&gt;

&lt;p&gt;No need to maintain a knowledge base.&lt;/p&gt;

&lt;p&gt;Just ask the team.&lt;/p&gt;

&lt;p&gt;The problem is that conversations solve today's question while creating tomorrow's confusion.&lt;/p&gt;

&lt;p&gt;Every answer delivered through chat disappears into an endless stream of new messages.&lt;/p&gt;

&lt;p&gt;The team gains speed in the moment but loses memory over time.&lt;/p&gt;




&lt;p&gt;The result is a hidden form of technical debt.&lt;/p&gt;

&lt;p&gt;Not code debt.&lt;/p&gt;

&lt;p&gt;Knowledge debt.&lt;/p&gt;

&lt;p&gt;The system becomes increasingly dependent on people remembering things.&lt;/p&gt;

&lt;p&gt;The architecture exists in someone's head.&lt;/p&gt;

&lt;p&gt;The deployment process exists in a private conversation.&lt;/p&gt;

&lt;p&gt;The reasoning behind critical decisions exists in a Slack thread from fourteen months ago.&lt;/p&gt;

&lt;p&gt;As long as the right people stay on the team, everything appears fine.&lt;/p&gt;

&lt;p&gt;Then someone leaves.&lt;/p&gt;

&lt;p&gt;And suddenly nobody understands why certain parts of the system exist.&lt;/p&gt;




&lt;p&gt;This is one reason onboarding feels so painful in many engineering organizations.&lt;/p&gt;

&lt;p&gt;New developers aren't learning the system.&lt;/p&gt;

&lt;p&gt;They're learning how to navigate years of fragmented conversations.&lt;/p&gt;

&lt;p&gt;Instead of reading clear documentation, they're performing digital archaeology.&lt;/p&gt;

&lt;p&gt;Every answer requires digging through old channels, forgotten threads, and messages written for people who already understood the context.&lt;/p&gt;

&lt;p&gt;The organization hasn't lost knowledge.&lt;/p&gt;

&lt;p&gt;It's simply buried.&lt;/p&gt;




&lt;p&gt;Ironically, most teams don't intend for this to happen.&lt;/p&gt;

&lt;p&gt;Chat tools are designed for communication, not long-term memory.&lt;/p&gt;

&lt;p&gt;But because communication is easier than documentation, the path of least resistance wins.&lt;/p&gt;

&lt;p&gt;A five-minute Slack message replaces a thirty-minute design document.&lt;/p&gt;

&lt;p&gt;A quick explanation replaces a written decision record.&lt;/p&gt;

&lt;p&gt;Eventually, the conversation becomes the system.&lt;/p&gt;




&lt;p&gt;The danger isn't that Slack contains useful information.&lt;/p&gt;

&lt;p&gt;The danger is when Slack becomes the only place that information exists.&lt;/p&gt;

&lt;p&gt;Because chat history is not architecture.&lt;/p&gt;

&lt;p&gt;It is not documentation.&lt;/p&gt;

&lt;p&gt;And it is not a reliable way to preserve institutional knowledge.&lt;/p&gt;

&lt;p&gt;A healthy engineering organization treats conversations as the beginning of documentation, not the replacement for it.&lt;/p&gt;

&lt;p&gt;Otherwise, every technical decision eventually turns into a scavenger hunt.&lt;/p&gt;

&lt;p&gt;And every new engineer inherits the same challenge:&lt;/p&gt;

&lt;p&gt;Building software while searching thousands of messages to understand why it works in the first place.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Every "Quick Fix" Eventually Becomes a Core Dependency</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Sat, 06 Jun 2026 09:34:52 +0000</pubDate>
      <link>https://dev.to/omieee_24/why-every-quick-fix-eventually-becomes-a-core-dependency-5g69</link>
      <guid>https://dev.to/omieee_24/why-every-quick-fix-eventually-becomes-a-core-dependency-5g69</guid>
      <description>&lt;p&gt;A production issue appears at 4:52 PM on a Friday.&lt;/p&gt;

&lt;p&gt;Customers are affected. Alerts are firing. Leadership wants updates. Nobody has time for a perfect solution.&lt;/p&gt;

&lt;p&gt;Someone suggests a workaround.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Let's patch it for now. We'll clean it up next sprint."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Everyone agrees.&lt;/p&gt;

&lt;p&gt;The patch goes live.&lt;/p&gt;

&lt;p&gt;The incident ends.&lt;/p&gt;

&lt;p&gt;The team moves on.&lt;/p&gt;

&lt;p&gt;And that's usually the moment a temporary fix begins its journey toward becoming permanent infrastructure.&lt;/p&gt;




&lt;p&gt;Most engineers assume technical debt is created by poor engineering decisions.&lt;/p&gt;

&lt;p&gt;In reality, some of the most stubborn technical debt starts as a completely reasonable decision made under pressure.&lt;/p&gt;

&lt;p&gt;The quick fix wasn't reckless.&lt;/p&gt;

&lt;p&gt;It was practical.&lt;/p&gt;

&lt;p&gt;It solved the immediate problem, reduced business impact, and allowed everyone to sleep that night.&lt;/p&gt;

&lt;p&gt;The problem is what happens afterward.&lt;/p&gt;

&lt;p&gt;Nothing.&lt;/p&gt;




&lt;p&gt;The next sprint arrives, but priorities change.&lt;/p&gt;

&lt;p&gt;A customer request becomes urgent.&lt;/p&gt;

&lt;p&gt;A new feature gets scheduled.&lt;/p&gt;

&lt;p&gt;Another production issue appears.&lt;/p&gt;

&lt;p&gt;The cleanup task quietly slips into the backlog.&lt;/p&gt;

&lt;p&gt;Then it slips again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;Eventually, nobody talks about it anymore.&lt;/p&gt;

&lt;p&gt;The workaround survives long enough to become part of the system.&lt;/p&gt;




&lt;p&gt;This is where software systems develop a strange kind of organizational memory.&lt;/p&gt;

&lt;p&gt;New engineers join the team and see the workaround already in place.&lt;/p&gt;

&lt;p&gt;To them, it isn't a workaround.&lt;/p&gt;

&lt;p&gt;It's simply how the system works.&lt;/p&gt;

&lt;p&gt;Documentation starts referencing it.&lt;/p&gt;

&lt;p&gt;Monitoring dashboards depend on it.&lt;/p&gt;

&lt;p&gt;Other services integrate with it.&lt;/p&gt;

&lt;p&gt;New features are built around its behavior.&lt;/p&gt;

&lt;p&gt;Without anyone making a conscious decision, a temporary patch becomes a core dependency.&lt;/p&gt;




&lt;p&gt;The most dangerous part is that quick fixes rarely create immediate problems.&lt;/p&gt;

&lt;p&gt;If they constantly broke production, teams would remove them quickly.&lt;/p&gt;

&lt;p&gt;Instead, they usually work.&lt;/p&gt;

&lt;p&gt;Not perfectly.&lt;/p&gt;

&lt;p&gt;Not elegantly.&lt;/p&gt;

&lt;p&gt;But well enough.&lt;/p&gt;

&lt;p&gt;And "well enough" is often all a system needs to survive for years.&lt;/p&gt;

&lt;p&gt;The temporary script created for a one-time migration becomes part of every deployment.&lt;/p&gt;

&lt;p&gt;The emergency API endpoint becomes a business-critical integration.&lt;/p&gt;

&lt;p&gt;The shortcut database field becomes essential for reporting.&lt;/p&gt;

&lt;p&gt;What was once considered technical debt slowly transforms into infrastructure.&lt;/p&gt;




&lt;p&gt;Years later, someone finally proposes removing it.&lt;/p&gt;

&lt;p&gt;The response is almost always the same.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Are we sure nothing depends on it?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nobody knows.&lt;/p&gt;

&lt;p&gt;The engineer who created it left two years ago.&lt;/p&gt;

&lt;p&gt;The original ticket is long gone.&lt;/p&gt;

&lt;p&gt;The documentation is incomplete.&lt;/p&gt;

&lt;p&gt;And after years of integrations, assumptions, and hidden dependencies, removing the fix suddenly feels riskier than keeping it.&lt;/p&gt;

&lt;p&gt;So it stays.&lt;/p&gt;

&lt;p&gt;Not because anyone believes it's the right solution.&lt;/p&gt;

&lt;p&gt;Because nobody can confidently prove it's safe to delete.&lt;/p&gt;




&lt;p&gt;The irony is that quick fixes are not the enemy.&lt;/p&gt;

&lt;p&gt;Every engineering team needs them occasionally.&lt;/p&gt;

&lt;p&gt;Production incidents don't wait for perfect architecture.&lt;/p&gt;

&lt;p&gt;The real mistake isn't creating a shortcut.&lt;/p&gt;

&lt;p&gt;It's failing to assign an expiration date to it.&lt;/p&gt;

&lt;p&gt;Because software has a habit of preserving yesterday's compromises long after everyone forgets why they were made.&lt;/p&gt;

&lt;p&gt;And if a temporary solution survives long enough, it stops being temporary.&lt;/p&gt;

&lt;p&gt;It becomes the system.&lt;/p&gt;

&lt;p&gt;The next time you hear someone say, &lt;em&gt;"We'll fix it properly later,"&lt;/em&gt; remember:&lt;/p&gt;

&lt;p&gt;Later is where most core dependencies come from.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Most AI-Generated Code Never Survives a Production Incident</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Fri, 29 May 2026 11:21:55 +0000</pubDate>
      <link>https://dev.to/omieee_24/why-most-ai-generated-code-never-survives-a-production-incident-okg</link>
      <guid>https://dev.to/omieee_24/why-most-ai-generated-code-never-survives-a-production-incident-okg</guid>
      <description>&lt;p&gt;&lt;em&gt;The code was perfect. Until production met reality.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few months ago, a developer on a team I knew fixed a bug in under ten minutes.&lt;/p&gt;

&lt;p&gt;A quick prompt to an AI assistant. A clean-looking solution. Tests passed. Pull request approved.&lt;/p&gt;

&lt;p&gt;Everyone was impressed.&lt;/p&gt;

&lt;p&gt;Three weeks later, the same code helped trigger a production incident.&lt;/p&gt;

&lt;p&gt;Not a dramatic outage. The worst kind.&lt;/p&gt;

&lt;p&gt;Some users were affected. Others weren't.&lt;/p&gt;

&lt;p&gt;Logs looked normal. Monitoring dashboards were green. Support tickets slowly started piling up.&lt;/p&gt;

&lt;p&gt;The engineer who merged the change opened the code and started reading.&lt;/p&gt;

&lt;p&gt;Then came the uncomfortable moment:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I know this works. I just don't know why."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's when I realized something.&lt;/p&gt;

&lt;p&gt;AI has made writing code easier than ever.&lt;/p&gt;

&lt;p&gt;But production incidents were never about writing code.&lt;/p&gt;

&lt;p&gt;They're about understanding systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Between Coding and Owning
&lt;/h2&gt;

&lt;p&gt;Most software feels brilliant on the day it's merged.&lt;/p&gt;

&lt;p&gt;Production doesn't care.&lt;/p&gt;

&lt;p&gt;Production introduces weird customer behavior, forgotten edge cases, network failures, outdated dependencies, and assumptions nobody remembers making.&lt;/p&gt;

&lt;p&gt;That's why the most valuable engineer during an incident usually isn't the person who wrote the most code.&lt;/p&gt;

&lt;p&gt;It's the person who understands how everything connects.&lt;/p&gt;

&lt;p&gt;They know which service tends to fail first.&lt;/p&gt;

&lt;p&gt;They remember why a strange workaround exists.&lt;/p&gt;

&lt;p&gt;They can look at a symptom and trace it back to a cause.&lt;/p&gt;

&lt;p&gt;That knowledge doesn't come from generating code.&lt;/p&gt;

&lt;p&gt;It comes from living with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Confidence Problem
&lt;/h2&gt;

&lt;p&gt;The biggest risk with AI-generated code isn't that it's wrong.&lt;/p&gt;

&lt;p&gt;It's that it looks right.&lt;/p&gt;

&lt;p&gt;The code is clean.&lt;/p&gt;

&lt;p&gt;The variable names make sense.&lt;/p&gt;

&lt;p&gt;The structure feels professional.&lt;/p&gt;

&lt;p&gt;And because it looks convincing, it's easy to skip the hardest question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I actually understand what this is doing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of the time, that question doesn't matter.&lt;/p&gt;

&lt;p&gt;Until production breaks.&lt;/p&gt;

&lt;p&gt;Then it matters a lot.&lt;/p&gt;

&lt;p&gt;Because debugging isn't about reading code.&lt;/p&gt;

&lt;p&gt;It's about understanding behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Is Where Context Wins
&lt;/h2&gt;

&lt;p&gt;When systems fail, the answers are rarely sitting inside a code snippet.&lt;/p&gt;

&lt;p&gt;They're hidden in things AI can't easily see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A decision made six months ago.&lt;/li&gt;
&lt;li&gt;An undocumented dependency.&lt;/li&gt;
&lt;li&gt;A customer workflow nobody considered.&lt;/li&gt;
&lt;li&gt;A "temporary fix" that became permanent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Production systems are full of history.&lt;/p&gt;

&lt;p&gt;And history doesn't fit neatly into a prompt.&lt;/p&gt;

&lt;p&gt;That's why incident response feels less like programming and more like detective work.&lt;/p&gt;

&lt;p&gt;You're gathering clues, testing assumptions, and trying to explain something that shouldn't be happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Skill
&lt;/h2&gt;

&lt;p&gt;AI will continue getting better at generating code.&lt;/p&gt;

&lt;p&gt;There's no reason to pretend otherwise.&lt;/p&gt;

&lt;p&gt;But the engineers who stand out won't be the ones who can generate code the fastest.&lt;/p&gt;

&lt;p&gt;They'll be the ones who can explain why a system behaves the way it does.&lt;/p&gt;

&lt;p&gt;Because when a production incident starts at 2 AM, nobody asks:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Who wrote this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They ask:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Who understands this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And those are two very different skills.&lt;/p&gt;

&lt;p&gt;The future may require fewer keystrokes.&lt;/p&gt;

&lt;p&gt;But it will always require understanding.&lt;/p&gt;

&lt;p&gt;And production has a way of exposing the difference.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Myth of “Ownership”: How Ambiguous Responsibility Quietly Breaks Production Systems</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Thu, 14 May 2026 08:15:02 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-myth-of-ownership-how-ambiguous-responsibility-quietly-breaks-production-systems-c4</link>
      <guid>https://dev.to/omieee_24/the-myth-of-ownership-how-ambiguous-responsibility-quietly-breaks-production-systems-c4</guid>
      <description>&lt;p&gt;Everyone talks about ownership in engineering teams.&lt;/p&gt;

&lt;p&gt;“We need stronger ownership.”&lt;br&gt;
“Who owns this service?”&lt;br&gt;
“Take ownership of the issue.”&lt;/p&gt;

&lt;p&gt;But after working on real production systems, I’ve realized something uncomfortable:&lt;/p&gt;

&lt;p&gt;Most systems don’t actually have owners.&lt;br&gt;
They have &lt;em&gt;temporary caretakers&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And that difference quietly breaks production more often than bad code does.&lt;/p&gt;




&lt;p&gt;A few months ago, our team had a production incident that looked simple at first.&lt;/p&gt;

&lt;p&gt;An API started timing out randomly. Nothing catastrophic — just enough to frustrate users and flood Slack with alerts.&lt;/p&gt;

&lt;p&gt;The strange part? Every team involved believed the issue belonged to someone else.&lt;/p&gt;

&lt;p&gt;Backend thought infrastructure caused it.&lt;br&gt;
Infrastructure thought the database team changed something.&lt;br&gt;
Database team pointed toward networking.&lt;br&gt;
Networking team said traffic patterns looked normal.&lt;/p&gt;

&lt;p&gt;For nearly four hours, everyone investigated the problem while simultaneously avoiding responsibility for the system itself.&lt;/p&gt;

&lt;p&gt;Eventually, we found the root cause:&lt;br&gt;
a “temporary” retry mechanism added by a former engineer months earlier.&lt;/p&gt;

&lt;p&gt;No documentation.&lt;br&gt;
No monitoring around it.&lt;br&gt;
No clear owner.&lt;/p&gt;

&lt;p&gt;Just production code sitting silently until traffic exposed it.&lt;/p&gt;

&lt;p&gt;And honestly, that’s when I stopped believing most companies understand ownership at all.&lt;/p&gt;




&lt;p&gt;In theory, ownership sounds clean.&lt;/p&gt;

&lt;p&gt;One team owns one service.&lt;br&gt;
Responsibilities are defined.&lt;br&gt;
Problems get solved quickly.&lt;/p&gt;

&lt;p&gt;Reality is messier.&lt;/p&gt;

&lt;p&gt;Production systems evolve faster than org charts do.&lt;/p&gt;

&lt;p&gt;Engineers switch teams.&lt;br&gt;
Priorities change.&lt;br&gt;
Services get copied, renamed, partially rewritten, or abandoned halfway through migrations.&lt;/p&gt;

&lt;p&gt;Over time, systems become shared territory where everyone can deploy changes, but nobody fully understands the consequences.&lt;/p&gt;

&lt;p&gt;That’s where dangerous failures start.&lt;/p&gt;

&lt;p&gt;Because unclear ownership creates a psychological loophole:&lt;br&gt;
“If everyone is responsible, nobody feels responsible enough.”&lt;/p&gt;

&lt;p&gt;And the scariest production issues usually grow inside that gap.&lt;/p&gt;




&lt;p&gt;The biggest misconception is that ownership means writing the code.&lt;/p&gt;

&lt;p&gt;It doesn’t.&lt;/p&gt;

&lt;p&gt;Real ownership means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding operational risks&lt;/li&gt;
&lt;li&gt;maintaining documentation&lt;/li&gt;
&lt;li&gt;cleaning up old decisions&lt;/li&gt;
&lt;li&gt;responding during incidents&lt;/li&gt;
&lt;li&gt;saying “this system is unhealthy” before it becomes an outage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those tasks are invisible work.&lt;/p&gt;

&lt;p&gt;They don’t appear in sprint demos.&lt;br&gt;
They don’t impress stakeholders.&lt;br&gt;
They rarely help promotions.&lt;/p&gt;

&lt;p&gt;So teams naturally optimize for visible progress instead.&lt;/p&gt;

&lt;p&gt;New features get celebrated.&lt;br&gt;
System maintenance becomes “later.”&lt;/p&gt;

&lt;p&gt;And “later” eventually becomes a 3 AM production incident.&lt;/p&gt;




&lt;p&gt;What makes this worse is modern engineering culture loves distributed responsibility.&lt;/p&gt;

&lt;p&gt;Microservices. Platform teams. Shared tooling. Internal frameworks.&lt;/p&gt;

&lt;p&gt;Individually, these ideas make sense.&lt;/p&gt;

&lt;p&gt;But combined carelessly, they create systems where critical behavior is scattered across five repositories and three teams.&lt;/p&gt;

&lt;p&gt;Now debugging production isn’t just technical work.&lt;/p&gt;

&lt;p&gt;It becomes organizational archaeology.&lt;/p&gt;

&lt;p&gt;You’re not tracing requests anymore.&lt;br&gt;
You’re tracing accountability.&lt;/p&gt;




&lt;p&gt;The hardest lesson I’ve learned is this:&lt;/p&gt;

&lt;p&gt;Most outages are not caused by a single catastrophic mistake.&lt;/p&gt;

&lt;p&gt;They happen because small unanswered questions accumulate over time.&lt;/p&gt;

&lt;p&gt;Who maintains this?&lt;br&gt;
Who reviews risky changes?&lt;br&gt;
Who gets alerted?&lt;br&gt;
Who understands failure modes?&lt;br&gt;
Who cleans up legacy behavior?&lt;/p&gt;

&lt;p&gt;If those answers are unclear, the system is already unstable — even if everything looks healthy today.&lt;/p&gt;

&lt;p&gt;Because production reliability is less about software architecture and more about clarity.&lt;/p&gt;

&lt;p&gt;And clarity is surprisingly rare in growing engineering teams.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Feature Factory Problem: How High-Velocity Teams Accidentally Kill Good Software</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Tue, 05 May 2026 10:26:53 +0000</pubDate>
      <link>https://dev.to/omieee_24/the-feature-factory-problem-how-high-velocity-teams-accidentally-kill-good-software-4i25</link>
      <guid>https://dev.to/omieee_24/the-feature-factory-problem-how-high-velocity-teams-accidentally-kill-good-software-4i25</guid>
      <description>&lt;p&gt;There’s a moment in almost every fast-moving tech team when productivity starts to feel… off.&lt;/p&gt;

&lt;p&gt;Releases are frequent. Sprint boards are always full. Metrics look great on paper. But underneath that velocity, something quietly breaks: the product itself.&lt;/p&gt;

&lt;p&gt;This is the Feature Factory problem.&lt;/p&gt;




&lt;h3&gt;
  
  
  Shipping More, Thinking Less
&lt;/h3&gt;

&lt;p&gt;In a Feature Factory, success is measured by output—how many features shipped, how fast tickets are closed, how packed the roadmap looks. It feels efficient. It &lt;em&gt;looks&lt;/em&gt; impressive.&lt;/p&gt;

&lt;p&gt;But here’s the catch: shipping features isn’t the same as solving problems.&lt;/p&gt;

&lt;p&gt;Teams stop asking &lt;em&gt;why&lt;/em&gt; a feature exists. Instead, they focus on &lt;em&gt;when&lt;/em&gt; it will be delivered.&lt;/p&gt;

&lt;p&gt;Over time, this creates software that feels bloated, inconsistent, and strangely disconnected from real user needs.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Slow Death of Product Thinking
&lt;/h3&gt;

&lt;p&gt;When velocity becomes the priority, product thinking becomes optional.&lt;/p&gt;

&lt;p&gt;Engineers stop questioning requirements. Designers rush through decisions. Product managers become backlog managers.&lt;/p&gt;

&lt;p&gt;No one owns the &lt;em&gt;outcome&lt;/em&gt;—only the output.&lt;/p&gt;

&lt;p&gt;Ironically, the faster the team moves, the less time they spend validating whether they’re building the right thing.&lt;/p&gt;

&lt;p&gt;And that’s how good software dies: not with a bug, but with a backlog.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Hidden Costs No One Tracks
&lt;/h3&gt;

&lt;p&gt;Feature factories don’t fail immediately. In fact, they often look like top performers.&lt;/p&gt;

&lt;p&gt;But the costs show up elsewhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increasing technical debt that no sprint seems to fix&lt;/li&gt;
&lt;li&gt;Features that overlap, conflict, or go unused&lt;/li&gt;
&lt;li&gt;Onboarding that becomes harder with every release&lt;/li&gt;
&lt;li&gt;Users who feel the product is “getting worse,” even as more is added&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system optimizes for speed, but accumulates chaos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why It Happens (Even to Smart Teams)
&lt;/h3&gt;

&lt;p&gt;No team &lt;em&gt;chooses&lt;/em&gt; to become a Feature Factory.&lt;/p&gt;

&lt;p&gt;It usually starts with good intentions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pressure from leadership to “move faster”&lt;/li&gt;
&lt;li&gt;Competitive fear—someone else might ship first&lt;/li&gt;
&lt;li&gt;Misaligned incentives (output &amp;gt; impact)&lt;/li&gt;
&lt;li&gt;Roadmaps treated as commitments instead of hypotheses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gradually, questioning slows down. Execution speeds up. And the balance tips.&lt;/p&gt;




&lt;h3&gt;
  
  
  Breaking Out of the Factory
&lt;/h3&gt;

&lt;p&gt;Escaping the Feature Factory doesn’t mean slowing down. It means building with intent.&lt;/p&gt;

&lt;p&gt;A few shifts change everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Measure success by outcomes, not output&lt;/li&gt;
&lt;li&gt;Treat features as experiments, not deliverables&lt;/li&gt;
&lt;li&gt;Create space for engineers to challenge ideas&lt;/li&gt;
&lt;li&gt;Prioritize &lt;em&gt;deleting&lt;/em&gt; as much as adding&lt;/li&gt;
&lt;li&gt;Regularly ask: “Would we build this again today?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good teams don’t just ship fast—they learn fast.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Real Goal
&lt;/h3&gt;

&lt;p&gt;Software isn’t valuable because of how much it does.&lt;/p&gt;

&lt;p&gt;It’s valuable because of what it &lt;em&gt;does well&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;High-velocity teams don’t kill software because they move too fast. They kill it because they stop listening—to users, to signals, to doubt.&lt;/p&gt;

&lt;p&gt;The best teams aren’t feature factories.&lt;/p&gt;

&lt;p&gt;They’re learning systems.&lt;/p&gt;

&lt;p&gt;And that difference shows up in every product you actually enjoy using.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Most Internal Developer Tools Fail (Even When the Tech Is Perfect)</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Sun, 03 May 2026 09:42:25 +0000</pubDate>
      <link>https://dev.to/omieee_24/why-most-internal-developer-tools-fail-even-when-the-tech-is-perfect-5dhd</link>
      <guid>https://dev.to/omieee_24/why-most-internal-developer-tools-fail-even-when-the-tech-is-perfect-5dhd</guid>
      <description>&lt;p&gt;There’s a quiet graveyard inside most tech companies. It’s filled with beautifully engineered internal tools—fast, scalable, well-tested… and barely used.&lt;/p&gt;

&lt;p&gt;On paper, these tools are perfect. In reality, they fail.&lt;/p&gt;

&lt;p&gt;Not because of bad code. But because of bad assumptions.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Illusion of “If We Build It, They’ll Use It”
&lt;/h3&gt;

&lt;p&gt;Developers often build internal tools the same way they build external products—focusing heavily on performance, architecture, and clean abstractions. But here’s the catch: internal tools aren’t judged by elegance. They’re judged by &lt;em&gt;convenience&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If your tool saves 20% compute time but adds 2 extra steps to a developer’s workflow, it’s already lost.&lt;/p&gt;

&lt;p&gt;People don’t adopt tools because they’re powerful. They adopt them because they’re easy.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Real Enemy: Friction
&lt;/h3&gt;

&lt;p&gt;Every extra click, every confusing config, every unclear error message—these are small cuts that slowly kill adoption.&lt;/p&gt;

&lt;p&gt;A developer under deadline pressure won’t explore your perfectly documented tool. They’ll fall back to whatever works &lt;em&gt;right now&lt;/em&gt;—even if it’s inefficient or outdated.&lt;/p&gt;

&lt;p&gt;The truth is simple:&lt;br&gt;
&lt;strong&gt;The best tool is the one that doesn’t feel like a tool.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Built Without the User in the Room
&lt;/h3&gt;

&lt;p&gt;A common pattern: internal tools are designed in isolation.&lt;/p&gt;

&lt;p&gt;Engineers imagine the workflow. They predict use cases. They optimize based on assumptions. But they rarely sit with the actual users—other developers—and watch how work &lt;em&gt;really&lt;/em&gt; happens.&lt;/p&gt;

&lt;p&gt;The result? A mismatch between design and reality.&lt;/p&gt;

&lt;p&gt;Real workflows are messy. They involve shortcuts, hacks, and habits that don’t show up in documentation. If your tool ignores that, it won’t survive.&lt;/p&gt;




&lt;h3&gt;
  
  
  Over-Engineering Kills Adoption
&lt;/h3&gt;

&lt;p&gt;Ironically, the more “perfect” the tech, the worse the adoption can be.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because internal tools don’t need to be perfect. They need to be &lt;em&gt;useful immediately&lt;/em&gt;. Over-engineering often introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex setup processes&lt;/li&gt;
&lt;li&gt;Steep learning curves&lt;/li&gt;
&lt;li&gt;Too many features nobody asked for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple script that solves one problem today will beat a sophisticated platform that promises everything tomorrow.&lt;/p&gt;




&lt;h3&gt;
  
  
  No Ownership, No Evolution
&lt;/h3&gt;

&lt;p&gt;Many internal tools launch with excitement… and then slowly decay.&lt;/p&gt;

&lt;p&gt;No one owns them long-term. Feedback isn’t prioritized. Bugs pile up. Eventually, the tool becomes just another thing developers avoid.&lt;/p&gt;

&lt;p&gt;Internal tools aren’t one-time projects. They’re products. And products need continuous care.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Fix Isn’t Technical
&lt;/h3&gt;

&lt;p&gt;You don’t fix this with better frameworks or faster systems.&lt;/p&gt;

&lt;p&gt;You fix it by changing how you think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with the developer’s workflow, not your architecture&lt;/li&gt;
&lt;li&gt;Reduce friction obsessively&lt;/li&gt;
&lt;li&gt;Ship small, useful improvements instead of big, perfect systems&lt;/li&gt;
&lt;li&gt;Treat internal tools like products—with users, feedback, and iteration&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;The uncomfortable truth is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A technically perfect tool that nobody uses is a failure.&lt;br&gt;
A slightly imperfect tool that everyone relies on is a success.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want your internal tools to survive, stop chasing perfection.&lt;/p&gt;

&lt;p&gt;Start chasing adoption.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Code Reviews Are Not Therapy: How Over-Politeness is Destroying Technical Quality on Your Team</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Tue, 28 Apr 2026 18:11:17 +0000</pubDate>
      <link>https://dev.to/omieee_24/code-reviews-are-not-therapy-how-over-politeness-is-destroying-technical-quality-on-your-team-ko1</link>
      <guid>https://dev.to/omieee_24/code-reviews-are-not-therapy-how-over-politeness-is-destroying-technical-quality-on-your-team-ko1</guid>
      <description>&lt;p&gt;We’ve all seen it.&lt;/p&gt;

&lt;p&gt;A pull request with hundreds of changed lines gets approved with:&lt;/p&gt;

&lt;p&gt;LGTM.&lt;/p&gt;

&lt;p&gt;And somehow that counts as a review.&lt;/p&gt;

&lt;p&gt;Weeks later, a bug shows up in production, and everyone wonders how nobody caught it earlier.&lt;/p&gt;

&lt;p&gt;Often, the answer is simple:&lt;/p&gt;

&lt;p&gt;People saw issues — they just didn’t want to sound too critical.&lt;/p&gt;

&lt;p&gt;When Politeness Becomes Avoidance&lt;/p&gt;

&lt;p&gt;Respectful communication is important. But many teams confuse respect with never challenging anything directly.&lt;/p&gt;

&lt;p&gt;Comments become overly soft:&lt;/p&gt;

&lt;p&gt;“Maybe we could possibly consider another approach…”&lt;/p&gt;

&lt;p&gt;when what they really mean is:&lt;/p&gt;

&lt;p&gt;This design has problems.&lt;/p&gt;

&lt;p&gt;That kind of over-politeness turns important feedback into optional suggestions.&lt;/p&gt;

&lt;p&gt;And optional suggestions are easy to ignore.&lt;/p&gt;

&lt;p&gt;Good Reviews Need Friction&lt;/p&gt;

&lt;p&gt;Great code reviews are not supposed to be effortless.&lt;/p&gt;

&lt;p&gt;They should include questions like:&lt;/p&gt;

&lt;p&gt;Why use this abstraction?&lt;br&gt;
What happens under edge cases?&lt;br&gt;
Does this create future maintenance pain?&lt;/p&gt;

&lt;p&gt;That friction isn’t conflict.&lt;/p&gt;

&lt;p&gt;It’s engineering.&lt;/p&gt;

&lt;p&gt;Without it, reviews become typo checks instead of quality checks.&lt;/p&gt;

&lt;p&gt;“LGTM” Isn’t Always a Review&lt;/p&gt;

&lt;p&gt;Sometimes “Looks Good To Me” really means:&lt;/p&gt;

&lt;p&gt;I skimmed it&lt;br&gt;
I’m busy&lt;br&gt;
I trust someone else reviewed deeply&lt;br&gt;
I don’t want to start debate&lt;/p&gt;

&lt;p&gt;That’s approval, not review.&lt;/p&gt;

&lt;p&gt;And there’s a difference.&lt;/p&gt;

&lt;p&gt;Direct Feedback Isn’t Rude&lt;/p&gt;

&lt;p&gt;Strong feedback doesn’t need to sound harsh.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;❌ This is bad design.&lt;/p&gt;

&lt;p&gt;Try:&lt;/p&gt;

&lt;p&gt;✅ This may couple concerns too tightly — can we rethink it?&lt;/p&gt;

&lt;p&gt;Clear feedback improves code.&lt;/p&gt;

&lt;p&gt;Vague feedback protects comfort.&lt;/p&gt;

&lt;p&gt;Only one improves systems.&lt;/p&gt;

&lt;p&gt;Final Thought&lt;/p&gt;

&lt;p&gt;Code reviews were never meant to be therapy sessions where nobody risks discomfort.&lt;/p&gt;

&lt;p&gt;They exist to challenge ideas and improve software.&lt;/p&gt;

&lt;p&gt;Sometimes that means saying:&lt;/p&gt;

&lt;p&gt;This shouldn’t merge yet.&lt;/p&gt;

&lt;p&gt;And that’s not being difficult.&lt;/p&gt;

&lt;p&gt;That’s doing a proper review.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Context-Switch Hangover: How Daily Interruptions Destroy Code Quality</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Mon, 20 Apr 2026 16:00:52 +0000</pubDate>
      <link>https://dev.to/omieee_24/context-switch-hangover-how-daily-interruptions-destroy-code-quality-4p5m</link>
      <guid>https://dev.to/omieee_24/context-switch-hangover-how-daily-interruptions-destroy-code-quality-4p5m</guid>
      <description>&lt;p&gt;It’s 10:07 AM and you’re finally locked in.&lt;br&gt;&lt;br&gt;
Your editor is full screen, the bug is loaded in your head, and for once the whole system actually makes sense. You can see the fix, the refactor, the clean path forward.  &lt;/p&gt;

&lt;p&gt;Then Slack pops.  &lt;/p&gt;

&lt;p&gt;“Got a sec?”  &lt;/p&gt;

&lt;p&gt;You alt‑tab, type a quick reply, check one more notification while you’re there, and jump back to your code… only to stare at it like someone shuffled the puzzle pieces. What was that edge case again? Why is this function even here? You’ve just met context‑switch hangover.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The “Quick Question” That Quietly Costs 20 Minutes
&lt;/h2&gt;

&lt;p&gt;Most interruptions are disguised as harmless:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Quick one about that endpoint.”
&lt;/li&gt;
&lt;li&gt;“Can you just jump on a five‑minute call?”
&lt;/li&gt;
&lt;li&gt;“Mind checking this log real fast?”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But your brain isn’t switching tabs, it’s unloading one mental model and loading another. Studies on knowledge work and software engineering keep landing in the same range: it often takes around 15–25 minutes to fully regain focus after an interruption, even when the interruption itself is just a minute or two.&lt;/p&gt;

&lt;p&gt;So that 30‑second Slack reply quietly rents 20 minutes of your attention. Do that 10–12 times a day and your “eight‑hour” workday contains only a handful of real deep‑work windows, sliced into pieces too small for hard problems.&lt;/p&gt;

&lt;p&gt;You don’t feel the cost right away. You just feel slower, more easily annoyed, and weirdly tired for the amount of “actual” code you shipped.  &lt;/p&gt;




&lt;h2&gt;
  
  
  How Your Code Gets Dumber (Even When You Don’t)
&lt;/h2&gt;

&lt;p&gt;When you’re deep in a feature or bug, you’re holding a fragile model in your head: how data flows, which calls matter, where the failure might be. Every interruption pokes holes in that model.  &lt;/p&gt;

&lt;p&gt;Research on breaks and code quality shows that when developers are forced into frequent or long gaps, they forget key details about the codebase—intent, assumptions, edge cases—and that forgetfulness shows up later as defects and maintainability issues. Under heavy context switching, you’re more likely to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patch symptoms instead of fixing root causes.
&lt;/li&gt;
&lt;li&gt;Leave weird naming or inconsistent behavior because you re‑enter the problem mid‑thought.
&lt;/li&gt;
&lt;li&gt;Ship code that “works today” but quietly grows technical debt.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teams that look at their own workflows often find a clear connection between constant interruptions, more bugs, and slower delivery—even though everyone feels maxed out all day.&lt;/p&gt;

&lt;p&gt;It’s not that you suddenly forgot how to code. You’re trying to write production‑grade software while your brain keeps rebooting.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why Your Day Feels Busy but Empty
&lt;/h2&gt;

&lt;p&gt;Time‑tracking studies on developers show a pattern that will feel familiar: once you subtract meetings, chat, and context switches, the actual hands‑on, focused coding time often shrinks to just a few hours.&lt;/p&gt;

&lt;p&gt;That’s how you end up going home with this strange mix of:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I worked non‑stop,” and
&lt;/li&gt;
&lt;li&gt;“I didn’t really &lt;em&gt;do&lt;/em&gt; anything.”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s easy to internalize that as “I’m slow” or “my focus is terrible,” but research on developer productivity and burnout keeps naming interruptions and fragmented days as major culprits. The system you’re working in is hostile to deep work by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shrinking the Hangover (Without Being That Developer)
&lt;/h2&gt;

&lt;p&gt;You probably can’t fix your company’s culture this week, but you can make your own day less brutal. A few things that actually help in real teams:  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Batch your replies instead of living in Slack.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pick two or three specific times to clear messages—say 11:30 and 4:00—and let non‑urgent pings stack up until then. You’re turning a dozen tiny context switches into a couple of intentional ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Make focus time visible, not secret.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Block “deep work” on your calendar and set a clear status like “Heads down on checkout bug, checking Slack at 11:30/4:00.” Teams that normalize visible focus time tend to interrupt less and respect those blocks more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Group similar work together.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re doing feature work, triage, and interviews, try not to mix them every hour. Reviewing three PRs in a row is cheaper for your brain than bouncing between a PR, an incident call, and a totally different codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Leave breadcrumbs for future you.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Interruptions will happen. Before you switch, take 20 seconds to write a one‑line “NEXT:” note in your editor or scratchpad, and when you return, re‑read the last few lines and that note before typing anything. Even simple re‑entry rituals help you rebuild context faster and avoid mistakes.&lt;/p&gt;




&lt;p&gt;You’re never going to have a perfectly interruption‑free job as a developer. There will always be pings, “quick” calls, and surprise fires.  &lt;/p&gt;

&lt;p&gt;But you don’t have to accept a workday that guarantees a context‑switch hangover. Protect a couple of real focus blocks, batch the noise, and leave better breadcrumbs for yourself.  &lt;/p&gt;

&lt;p&gt;The work you’re proudest of—the elegant refactor, the bug you finally crushed, the design that just &lt;em&gt;clicks&lt;/em&gt;—almost always comes from those rare quiet stretches where nobody bothers you. The more you create those on purpose, the more your day starts to feel like engineering again, not just endless tab‑switching with a side of code.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Onboarding Hell: 30 Days in a Broken Dev Environment</title>
      <dc:creator>Om Keswani</dc:creator>
      <pubDate>Mon, 13 Apr 2026 16:43:19 +0000</pubDate>
      <link>https://dev.to/omieee_24/onboarding-hell-30-days-in-a-broken-dev-environment-2ni6</link>
      <guid>https://dev.to/omieee_24/onboarding-hell-30-days-in-a-broken-dev-environment-2ni6</guid>
      <description>&lt;p&gt;On my first day on this team, the code compiled before I did.&lt;br&gt;&lt;br&gt;
The laptop arrived, the Slack pings started, and then reality hit: no onboarding doc, no setup guide, just a half-joking “shout if you get stuck” in a crowded channel. Within hours, I was deep in dependency hell, trying to piece together a working dev environment from half-remembered comments and year-old threads.  &lt;/p&gt;

&lt;p&gt;By the end of week one, I’d written exactly zero meaningful lines of product code. I &lt;em&gt;had&lt;/em&gt;, however, cloned five repos, broken three local databases, and learned that “it works on my machine” is apparently an approved troubleshooting strategy. And the worst part? This isn’t rare. Many companies effectively accept that a new engineer will spend weeks just figuring out where things are instead of building anything useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1–7: Fighting the Environment, Not the Problem
&lt;/h2&gt;

&lt;p&gt;In a healthy team, your first week is about understanding the product, the architecture, and the people. Here, it was about understanding why nothing worked the same way twice. The official “setup guide” was a stale README, last updated three CTOs ago. Half the scripts referenced services nobody could explain. One command casually dropped the entire local database if you ran it with the wrong flag.  &lt;/p&gt;

&lt;p&gt;Most days started the same way: pull latest, run the bootstrap script, hit an error, paste it into chat, wait. Senior devs would answer in shorthand or point to yet another internal link that assumed you already knew how everything fit together. It wasn’t that people were hostile; they were just too busy shipping to step back and notice how much time and morale the broken onboarding was burning. Research suggests new developers can spend a huge chunk of their first months just wrestling with their environment instead of writing code, and I was living proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero Documentation, Maximum Guesswork
&lt;/h2&gt;

&lt;p&gt;No documentation doesn’t mean “no information.” It means the information lives in people’s heads, private Slack DMs, and random Notion pages you only discover by accident. Every question felt like a mini investigation: who owns this service, where is the config, why are there three versions of the same API spec?  &lt;/p&gt;

&lt;p&gt;The unspoken onboarding process was “just ask,” which sounds friendly but actually shifts all the burden onto the new person. You don’t know what you don’t know. You don’t want to spam senior engineers. You don’t know which answers are tribal hacks and which are actual standards. This kind of unstructured, undocumented onboarding is a hidden tax: juniors feel lost, seniors burn time repeating the same explanations, and the team as a whole moves slower than anyone realizes.&lt;/p&gt;

&lt;p&gt;What documentation did exist was often worse than nothing: outdated, contradicting reality, or full of “TBD” sections that were clearly never revisited. Outdated docs don’t just fail to help; they actively create confusion and erode trust. Once you’ve been burned a couple of times, you stop believing any doc you see and fall back to “just ask,” which is how teams get stuck in a perpetual cycle of interruptions and re-explaining. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Psychological Side: From Excited to Invisible
&lt;/h2&gt;

&lt;p&gt;There’s also a quieter cost. You join excited to contribute, to prove the hiring process wasn’t a mistake. After a couple of weeks of being blocked by missing access, broken scripts, and conflicting instructions, that excitement turns into embarrassment and doubt. You start apologizing for asking “too many” questions, even though the real problem is the system, not you.  &lt;/p&gt;

&lt;p&gt;Poor onboarding is one of those things leaders underestimate until they see the retention numbers. When your first few weeks are defined by confusion and chaos, it’s easy to mentally check out or start quietly browsing job boards. Studies and industry reports keep pointing out that ineffective onboarding is tightly linked to slower time to productivity, disengagement, and early turnover—sometimes within the first 45 days. &lt;/p&gt;

&lt;h2&gt;
  
  
  How I Learned to Survive the First 30 Days
&lt;/h2&gt;

&lt;p&gt;I wish I could say the solution came from some grand organizational fix, but it didn’t. It started with a mindset shift: if the system is broken, treat survival as a project. The goal for my first month stopped being “be fully productive” and became “reduce confusion for future me.”  &lt;/p&gt;

&lt;p&gt;Here are the tactics that actually helped:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create your own mini playbook.&lt;/strong&gt; Every time I figured something out—how to run a subset of tests, how to seed local data, which repo owned which endpoint—I wrote it down in one place. Not in ten stickies, not in random notes, but in a living doc I could search and share.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default to over-communication.&lt;/strong&gt; Instead of silently struggling, I started posting short daily updates: what I tried, what broke, what I think is blocking me. This turned “random questions” into a visible pattern of friction that my lead could actually act on.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor on one real task.&lt;/strong&gt; The turning point was getting a small, end-to-end task: a tiny bug fix that touched the front end, an API, and a database migration. That one task gave me a realistic path through the system that no diagram ever could. A lot of onboarding guides now explicitly recommend giving new devs small, meaningful tasks instead of vague “explore the codebase” homework, and I understand why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find a “shadow mentor,” even if it’s unofficial.&lt;/strong&gt; There’s always that one engineer who knows where the skeletons are buried and doesn’t mind screen-sharing for 15 minutes. I leaned on that person more deliberately—respecting their time, but also recognizing that those sessions were worth more than another day of blind stumbling.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If You’re a Dev Walking Into This
&lt;/h2&gt;

&lt;p&gt;If you’re about to join a team with a shaky onboarding process, go in with your eyes open. Assume the docs are incomplete. Assume the setup scripts lie. Don’t take it personally when you feel slow; you’re operating with missing context. Measure your progress not by how much code you merge in week one, but by how much invisible map you’re building: which services matter, who owns what, where truth actually lives.  &lt;/p&gt;

&lt;p&gt;And whenever you fix something confusing—whether it’s a broken command in the README or a missing step in an environment setup—leave the campsite a bit cleaner than you found it. Update the doc, add the comment, write the script. It feels small, but this is how onboarding debt gets paid down: one frustrated developer deciding that the next person should suffer a little less than they did.&lt;/p&gt;

&lt;p&gt;The irony of onboarding hell is that the people who feel its pain most acutely are the ones with the least power on day one. But if enough of us treat those first 30 days as an opportunity to document, to surface friction, and to insist on better, we slowly turn “this is just how it is” into “how did we ever tolerate that?”&lt;/p&gt;

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