<?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: Dat Nguyen</title>
    <description>The latest articles on DEV Community by Dat Nguyen (@dat_nguyen_e0f3780236d684).</description>
    <link>https://dev.to/dat_nguyen_e0f3780236d684</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3876353%2Fa33c6078-07ef-4892-8039-8073b0112581.jpg</url>
      <title>DEV Community: Dat Nguyen</title>
      <link>https://dev.to/dat_nguyen_e0f3780236d684</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dat_nguyen_e0f3780236d684"/>
    <language>en</language>
    <item>
      <title>How we learned to log bugs properly</title>
      <dc:creator>Dat Nguyen</dc:creator>
      <pubDate>Thu, 30 Apr 2026 17:56:44 +0000</pubDate>
      <link>https://dev.to/dat_nguyen_e0f3780236d684/how-we-learned-to-log-bugs-properly-57o7</link>
      <guid>https://dev.to/dat_nguyen_e0f3780236d684/how-we-learned-to-log-bugs-properly-57o7</guid>
      <description>&lt;p&gt;We weren’t slow at fixing bugs — we were slow at understanding them&lt;/p&gt;

&lt;p&gt;In our previous post, we talked about a simple realization:&lt;/p&gt;

&lt;p&gt;We weren’t slow at fixing bugs.&lt;br&gt;
We were slow at understanding them.&lt;/p&gt;

&lt;p&gt;That led us to a deeper question:&lt;/p&gt;

&lt;p&gt;What does a “good” bug log actually look like?&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Most bug reports fail before debugging even starts&lt;/p&gt;

&lt;p&gt;A typical report looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“It’s broken”&lt;/li&gt;
&lt;li&gt;“Webhook not working”&lt;/li&gt;
&lt;li&gt;“App doesn’t respond”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a user’s perspective, that’s completely reasonable.&lt;/p&gt;

&lt;p&gt;But from a developer’s perspective, it’s missing everything we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where did it happen?&lt;/li&gt;
&lt;li&gt;What did the user do before that?&lt;/li&gt;
&lt;li&gt;What failed exactly?&lt;/li&gt;
&lt;li&gt;Can we reproduce it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the real process becomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Support asks follow-up questions&lt;/li&gt;
&lt;li&gt;Devs try to guess&lt;/li&gt;
&lt;li&gt;Time gets lost before any fix even begins&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem isn’t debugging.&lt;/p&gt;

&lt;p&gt;It’s the input we start with.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;A useful bug is not a message — it’s a reconstructable event&lt;/p&gt;

&lt;p&gt;After running into this repeatedly, we started thinking differently.&lt;/p&gt;

&lt;p&gt;A bug report shouldn’t be something you read.&lt;br&gt;
It should be something you can reconstruct.&lt;/p&gt;

&lt;p&gt;At minimum, a useful log should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where did this happen? (URL / screen)&lt;/li&gt;
&lt;li&gt;What failed? (request, error, response)&lt;/li&gt;
&lt;li&gt;What led to it? (user actions, event sequence)&lt;/li&gt;
&lt;li&gt;Under what conditions? (device, browser, network)&lt;/li&gt;
&lt;li&gt;When did it happen? (timestamp)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have that, debugging changes.&lt;/p&gt;

&lt;p&gt;You’re no longer asking:&lt;/p&gt;

&lt;p&gt;“What might have happened?”&lt;/p&gt;

&lt;p&gt;You’re asking:&lt;/p&gt;

&lt;p&gt;“Why did this specific sequence lead to failure?”&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Why user-reported steps are not enough&lt;/p&gt;

&lt;p&gt;One of the most fragile parts of debugging is reproduction.&lt;/p&gt;

&lt;p&gt;We usually rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;or support teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to describe steps.&lt;/p&gt;

&lt;p&gt;But by the time that happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;details are forgotten&lt;/li&gt;
&lt;li&gt;steps are incomplete&lt;/li&gt;
&lt;li&gt;or slightly inaccurate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small differences can make a bug impossible to reproduce.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Reproduction should come from the system, not memory&lt;/p&gt;

&lt;p&gt;So we stopped asking users for steps.&lt;/p&gt;

&lt;p&gt;Instead, we derive them from the actual session.&lt;/p&gt;

&lt;p&gt;We look at what really happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;page navigation&lt;/li&gt;
&lt;li&gt;clicks and interactions&lt;/li&gt;
&lt;li&gt;network requests&lt;/li&gt;
&lt;li&gt;state changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that, we reconstruct a simplified sequence of events leading up to the issue.&lt;/p&gt;

&lt;p&gt;Not a perfect script — but usually enough to trigger the same failure again.&lt;/p&gt;

&lt;p&gt;That turns reproduction from guesswork into something much closer to replay.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Bugs are rarely universal&lt;/p&gt;

&lt;p&gt;Another thing we kept seeing:&lt;/p&gt;

&lt;p&gt;The same issue doesn’t affect everyone.&lt;/p&gt;

&lt;p&gt;Sometimes it only happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on a specific browser&lt;/li&gt;
&lt;li&gt;on a specific device&lt;/li&gt;
&lt;li&gt;for a specific user&lt;/li&gt;
&lt;li&gt;under certain network conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that context, bugs feel random.&lt;/p&gt;

&lt;p&gt;With it, patterns start to emerge.&lt;/p&gt;

&lt;p&gt;That’s why environment data matters just as much as the error itself.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;What we actually log now&lt;/p&gt;

&lt;p&gt;Over time, our logs evolved into something closer to a structured issue.&lt;/p&gt;

&lt;p&gt;For each bug, we capture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The failure itself&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;request URL&lt;/li&gt;
&lt;li&gt;method&lt;/li&gt;
&lt;li&gt;status code&lt;/li&gt;
&lt;li&gt;response body&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Where it happened&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;page URL&lt;/li&gt;
&lt;li&gt;screen / feature&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;What led to it&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;sequence of user actions&lt;/li&gt;
&lt;li&gt;navigation flow&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;The environment&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;browser&lt;/li&gt;
&lt;li&gt;OS&lt;/li&gt;
&lt;li&gt;device type&lt;/li&gt;
&lt;li&gt;network conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;When it happened&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;precise timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Reproduction context&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;a reconstructed path to trigger the issue again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, a bug stops being a vague report&lt;br&gt;
and becomes something you can actually work with immediately.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;What changed for us&lt;/p&gt;

&lt;p&gt;The biggest shift wasn’t logging more.&lt;/p&gt;

&lt;p&gt;It was logging the right things.&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we had errors&lt;/li&gt;
&lt;li&gt;but no context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we have context&lt;/li&gt;
&lt;li&gt;and the error becomes obvious&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We spend less time asking:&lt;/p&gt;

&lt;p&gt;“What happened?”&lt;/p&gt;

&lt;p&gt;And more time on:&lt;/p&gt;

&lt;p&gt;“How do we fix it?”&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;What we’re still figuring out&lt;/p&gt;

&lt;p&gt;Even with all of this, it still feels incomplete.&lt;/p&gt;

&lt;p&gt;There are still cases where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;everything looks technically correct&lt;/li&gt;
&lt;li&gt;but the outcome is wrong for the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No error. No exception.&lt;/p&gt;

&lt;p&gt;Just a mismatch between what the system did and what the user expected.&lt;/p&gt;

&lt;p&gt;Those are harder to capture.&lt;/p&gt;

&lt;p&gt;And it raises a bigger question:&lt;/p&gt;

&lt;p&gt;What does a truly complete bug log look like?&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;If you’ve run into similar cases, I’d really appreciate your perspective.&lt;/p&gt;

&lt;p&gt;We’re still building this and learning from real-world usage:&lt;br&gt;
👉 &lt;a href="https://flashlog.app" rel="noopener noreferrer"&gt;https://flashlog.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>We weren’t slow at fixing bugs — we just didn’t understand them</title>
      <dc:creator>Dat Nguyen</dc:creator>
      <pubDate>Wed, 15 Apr 2026 11:21:08 +0000</pubDate>
      <link>https://dev.to/dat_nguyen_e0f3780236d684/we-werent-slow-at-fixing-bugs-we-just-didnt-understand-them-4h99</link>
      <guid>https://dev.to/dat_nguyen_e0f3780236d684/we-werent-slow-at-fixing-bugs-we-just-didnt-understand-them-4h99</guid>
      <description>&lt;h2&gt;
  
  
  Most bug reports are useless. So I built this.
&lt;/h2&gt;

&lt;p&gt;I used to think building an AI customer support chatbot would help reduce bugs. The idea was simple: if users could report issues easily through chat, we wouldn’t miss anything.&lt;/p&gt;

&lt;p&gt;And at first, it actually worked. We started receiving bug reports faster, fewer things slipped through the cracks, and it felt like real progress.&lt;/p&gt;

&lt;p&gt;But after a while, a different problem showed up.&lt;/p&gt;

&lt;p&gt;Most of the reports… weren’t very useful. Users would say things like “it’s broken”, “button not working”, or “app doesn’t run”. We knew something was wrong, but we had no idea what they did before, where it happened, or how to reproduce it.&lt;/p&gt;

&lt;p&gt;I remember one time our team spent almost 2 hours just trying to understand a single bug before we could even start fixing it. And it wasn’t a rare case.&lt;/p&gt;

&lt;p&gt;Even worse, many issues were only reported after users got frustrated and left. By the time we saw the problem, the damage was already done.&lt;/p&gt;

&lt;p&gt;That’s when it clicked for me. The problem wasn’t that we were slow at fixing bugs. We just didn’t understand them early enough.&lt;/p&gt;

&lt;p&gt;Once I saw that, everything changed. We were already working with AI — chatbots, context handling, trying to understand user intent. So I started wondering: what if we applied the same idea to bugs?&lt;/p&gt;

&lt;p&gt;Instead of waiting for users to describe issues (poorly), what if we could capture what actually happened?&lt;/p&gt;

&lt;p&gt;So I built a small internal tool. It watches for errors in real time, captures the context around them, and turns that into something developers can actually act on — not just logs, but something closer to a ready-to-fix ticket.&lt;/p&gt;

&lt;p&gt;The first time we ran it, it caught bugs before users even noticed them. More importantly, when a bug happened, we didn’t have to guess anymore. We knew what happened.&lt;/p&gt;

&lt;p&gt;That’s how Flashlog started.&lt;/p&gt;

&lt;p&gt;We’re still building and testing it with early users, improving it based on real-world feedback.&lt;/p&gt;

&lt;p&gt;If you’re dealing with similar issues, you can try it &lt;a href="https://flashlog.app/?utm_source=dev_to&amp;amp;utm_segment=startup&amp;amp;utm_campaign=kickoff&amp;amp;utm_content=trial_feedback" rel="noopener noreferrer"&gt;here&lt;/a&gt; and let me know what you think.&lt;/p&gt;

&lt;p&gt;Any feedback, brutal or not, is super valuable at this stage.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>product</category>
      <category>devbugsmash</category>
      <category>flashlog</category>
    </item>
  </channel>
</rss>
