<?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: Manuel Garcia</title>
    <description>The latest articles on DEV Community by Manuel Garcia (@manuel_garcia).</description>
    <link>https://dev.to/manuel_garcia</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%2F4203419%2F0f061a29-3aef-4d63-a76c-cfc08837e974.png</url>
      <title>DEV Community: Manuel Garcia</title>
      <link>https://dev.to/manuel_garcia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manuel_garcia"/>
    <language>en</language>
    <item>
      <title>Error Messages Are Writing, Too</title>
      <dc:creator>Manuel Garcia</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:07:59 +0000</pubDate>
      <link>https://dev.to/manuel_garcia/error-messages-are-writing-too-2ao8</link>
      <guid>https://dev.to/manuel_garcia/error-messages-are-writing-too-2ao8</guid>
      <description>&lt;p&gt;Error messages are some of the most carefully read sentences in any piece of software. They appear at the exact moment the reader is stuck, often a little frustrated, and looking for help. Yet they are frequently written last, in a hurry, by someone thinking about the code rather than the person on the other side of it.&lt;/p&gt;

&lt;p&gt;The good news is that a useful error message follows a simple pattern, and it can be learned like any other kind of editing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three parts of a useful message
&lt;/h2&gt;

&lt;p&gt;A clear error message answers three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What happened?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why did it happen&lt;/strong&gt;, if that is known?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What can the reader do now?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most weak messages answer only the first question, and sometimes not even that.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Error: invalid input.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The date "31.02.2026" could not be read. February has no 31st day. Please enter a date in the format DD.MM.YYYY.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second version is longer, but every word earns its place. The reader knows which value was wrong, why it was rejected and what a correct value looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name the thing, not the category
&lt;/h2&gt;

&lt;p&gt;"Invalid input", "operation failed" and "something went wrong" describe a category of problem. The reader needs the specific case.&lt;/p&gt;

&lt;p&gt;Whenever the program knows which file, field, value or setting caused the problem, include it in the message. "Could not open config.yaml" is immediately useful. "Could not open file" sends the reader searching.&lt;/p&gt;

&lt;p&gt;This also helps when people copy the message into a search engine or a support request. A specific message leads to specific answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speak to the reader, not about the code
&lt;/h2&gt;

&lt;p&gt;Internal terms leak easily into error text: exception names, function names, abbreviations that only the team uses. They make sense to the author and to nobody else.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;NullReferenceException in UserProfileLoader.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your profile could not be loaded because no account is linked to this email address.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technical details still have a place. Developers debugging the problem may need the exception and the stack trace. Put those in logs, or below the human-readable message, clearly separated. The first line should be readable by the person who actually sees it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not blame, do not joke
&lt;/h2&gt;

&lt;p&gt;Tone matters more than usual here, because the reader is already having a bad moment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid blame.&lt;/strong&gt; "You entered an invalid password" sounds like an accusation. "The password does not match this account" states the same fact neutrally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid jokes.&lt;/strong&gt; A playful "Oops!" can feel friendly the first time and irritating the tenth time, especially when work has been lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid false certainty.&lt;/strong&gt; If the cause is only a guess, say "This may be caused by..." rather than presenting it as fact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calm, plain language works best. The aim is to sound like a helpful colleague, not a machine and not a comedian.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offer a way forward
&lt;/h2&gt;

&lt;p&gt;The most important part of an error message is the last one: what the reader can do next. Even when the program cannot fix the problem, it can usually point somewhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry later, if the problem is temporary.&lt;/li&gt;
&lt;li&gt;Correct a specific value, and show the expected format.&lt;/li&gt;
&lt;li&gt;Check a specific setting, and name where it is.&lt;/li&gt;
&lt;li&gt;Contact support, and say what information to include.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A message without a next step leaves the reader at a dead end. A message with one turns a failure into a short detour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review your errors like any other text
&lt;/h2&gt;

&lt;p&gt;Collect the error messages in your project in one list and read them in a row. This simple exercise reveals a lot: inconsistent wording, messages that say the same thing in five different ways, and messages that say nothing at all.&lt;/p&gt;

&lt;p&gt;Edit them as you would edit any other text. Check that each one names the problem, explains it where possible and offers a next step. They are short, but for the reader in that moment, they may be the most important words in the whole product.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>ux</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Your README Has One Job: Answer the First Three Questions</title>
      <dc:creator>Manuel Garcia</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:07:04 +0000</pubDate>
      <link>https://dev.to/manuel_garcia/your-readme-has-one-job-answer-the-first-three-questions-42pm</link>
      <guid>https://dev.to/manuel_garcia/your-readme-has-one-job-answer-the-first-three-questions-42pm</guid>
      <description>&lt;p&gt;Most READMEs are written by the person who knows the project best, at the moment they know it best. That is exactly why so many of them are hard to use. The author no longer remembers what it felt like to arrive with no context.&lt;/p&gt;

&lt;p&gt;A reader landing on a README usually has three questions, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is this?&lt;/li&gt;
&lt;li&gt;Is it for me?&lt;/li&gt;
&lt;li&gt;How do I get it running?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the first screen answers those three, the README is already better than most. Everything else can come later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lead with what it does, not what it is built with
&lt;/h2&gt;

&lt;p&gt;The opening line is the most valuable space in the file, and it is often spent on the wrong thing.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;A lightweight, blazing-fast, TypeScript-first, zero-dependency solution leveraging modern APIs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Converts Markdown files into a static website. Runs from the command line, needs no configuration for simple sites.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first version lists qualities. The second describes a result. A reader can decide in five seconds whether the second one solves their problem. With the first, they still have to guess.&lt;/p&gt;

&lt;p&gt;Adjectives like "lightweight" or "fast" are not wrong, but they are claims. Put them after the description, and ideally back them up with something the reader can check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say who it is not for
&lt;/h2&gt;

&lt;p&gt;This feels counterintuitive, but it saves everyone time. A short line such as "This tool is not designed for sites with more than a few hundred pages" or "Requires Node 20 or later" helps the wrong reader leave early and the right reader stay with confidence.&lt;/p&gt;

&lt;p&gt;Limits are information. Leaving them out does not make a project look more capable; it just moves the disappointment to later, usually into the issue tracker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the first steps copyable
&lt;/h2&gt;

&lt;p&gt;The installation section should be something a reader can follow without thinking. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real commands&lt;/strong&gt;, in code blocks, in the order they are run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One path first.&lt;/strong&gt; If there are four ways to install, show the most common one and link the rest further down the same file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A visible result.&lt;/strong&gt; End the section with what the reader should see when it worked, for example the expected output or the address to open in a browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the one most often missing. Without it, the reader finishes the steps and still does not know whether they succeeded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the order of the reader, not the order of the code
&lt;/h2&gt;

&lt;p&gt;READMEs often grow in the order features were added. The result is a file where configuration options appear before the basic usage, or a contribution guide sits between installation and the first example.&lt;/p&gt;

&lt;p&gt;A simple order that works for most projects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One-sentence description&lt;/li&gt;
&lt;li&gt;Who it is for, and key limits&lt;/li&gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;li&gt;A minimal working example&lt;/li&gt;
&lt;li&gt;Common tasks&lt;/li&gt;
&lt;li&gt;Configuration reference&lt;/li&gt;
&lt;li&gt;Contributing and licence&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read only the headings of your README. If they do not follow roughly the path a new user takes, reorder them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the example you would want
&lt;/h2&gt;

&lt;p&gt;One small, complete example is worth more than a long list of options. Complete means it can be copied, run and understood without reading anything else. Avoid placeholders that need explanation, such as &lt;code&gt;&amp;lt;your-thing-here&amp;gt;&lt;/code&gt;, unless the explanation sits directly next to them.&lt;/p&gt;

&lt;p&gt;If the example needs a file, show the file. If it needs a setting, show the setting. The reader should never have to assemble the example from three different sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review it as a stranger
&lt;/h2&gt;

&lt;p&gt;The best test is simple: give the README to someone who has never seen the project and watch where they hesitate. If that is not possible, wait a few days and read it again yourself, top to bottom, following every step literally.&lt;/p&gt;

&lt;p&gt;Each place you have to stop and think is a place a new reader will stop and leave. Fix those first. Polish can wait; clarity cannot.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>documentation</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
