<?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: Dechive</title>
    <description>The latest articles on DEV Community by Dechive (@dechive).</description>
    <link>https://dev.to/dechive</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%2F3897598%2F705e6c9c-58dd-4046-85df-b3804702d917.png</url>
      <title>DEV Community: Dechive</title>
      <link>https://dev.to/dechive</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dechive"/>
    <language>en</language>
    <item>
      <title>AI Agents Need More Than Fact-Checking</title>
      <dc:creator>Dechive</dc:creator>
      <pubDate>Sun, 24 May 2026 05:07:08 +0000</pubDate>
      <link>https://dev.to/dechive/ai-agents-need-more-than-fact-checking-2mp4</link>
      <guid>https://dev.to/dechive/ai-agents-need-more-than-fact-checking-2mp4</guid>
      <description>&lt;h2&gt;
  
  
  When AI starts taking actions, developers need to verify direction, scope, reversibility, and responsibility.
&lt;/h2&gt;

&lt;p&gt;For a long time, verifying AI meant checking the answer.&lt;/p&gt;

&lt;p&gt;If an AI generated an explanation, we could read it.&lt;br&gt;
If it summarized a document, we could compare it with the original.&lt;br&gt;
If it gave a wrong fact, we could correct it.&lt;br&gt;
If the answer was incomplete, we could ask again.&lt;/p&gt;

&lt;p&gt;That kind of verification is familiar to developers.&lt;/p&gt;

&lt;p&gt;It is close to reviewing text.&lt;/p&gt;

&lt;p&gt;But AI tools are changing.&lt;/p&gt;

&lt;p&gt;They are not only answering questions anymore.&lt;/p&gt;

&lt;p&gt;They are starting to act.&lt;/p&gt;

&lt;p&gt;They can send emails.&lt;br&gt;
They can book meetings.&lt;br&gt;
They can edit files.&lt;br&gt;
They can run commands.&lt;br&gt;
They can open pull requests.&lt;br&gt;
They can trigger workflows.&lt;br&gt;
They can move from one step to the next without waiting for every instruction.&lt;/p&gt;

&lt;p&gt;That changes the problem.&lt;/p&gt;

&lt;p&gt;Because an answer can be reviewed.&lt;/p&gt;

&lt;p&gt;An action leaves a trace.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wrong answers and wrong actions are different
&lt;/h2&gt;

&lt;p&gt;A wrong answer is usually annoying.&lt;/p&gt;

&lt;p&gt;It may confuse someone.&lt;br&gt;
It may waste time.&lt;br&gt;
It may require correction.&lt;/p&gt;

&lt;p&gt;But in many cases, the damage can stop at the text.&lt;/p&gt;

&lt;p&gt;A wrong action is different.&lt;/p&gt;

&lt;p&gt;An email that has already been sent is in someone else’s inbox.&lt;/p&gt;

&lt;p&gt;A meeting that has already been booked has taken space on someone’s calendar.&lt;/p&gt;

&lt;p&gt;A file that has already been changed may affect other work.&lt;/p&gt;

&lt;p&gt;A command that has already been run may change the environment.&lt;/p&gt;

&lt;p&gt;Code that has already been deployed is now running somewhere.&lt;/p&gt;

&lt;p&gt;That is why AI agents require a different kind of verification.&lt;/p&gt;

&lt;p&gt;Fact-checking is not enough.&lt;/p&gt;

&lt;p&gt;When AI starts acting, we need action-checking.&lt;/p&gt;
&lt;h2&gt;
  
  
  What does it mean for AI to “act”?
&lt;/h2&gt;

&lt;p&gt;When people hear “AI agent,” they often imagine something dramatic.&lt;/p&gt;

&lt;p&gt;But the real shift is much more practical.&lt;/p&gt;

&lt;p&gt;An email assistant does not only draft a reply.&lt;br&gt;
It may send the reply.&lt;/p&gt;

&lt;p&gt;A calendar assistant does not only suggest a time.&lt;br&gt;
It may book the meeting.&lt;/p&gt;

&lt;p&gt;A coding assistant does not only suggest code.&lt;br&gt;
It may edit files, run tests, open a PR, or deploy changes.&lt;/p&gt;

&lt;p&gt;A research assistant does not only return search results.&lt;br&gt;
It may collect sources, compare options, summarize findings, and move the task forward.&lt;/p&gt;

&lt;p&gt;That is the practical meaning of an agent.&lt;/p&gt;

&lt;p&gt;It takes a goal, breaks it into steps, uses tools, reads intermediate results, and decides what to do next.&lt;/p&gt;

&lt;p&gt;This is useful.&lt;/p&gt;

&lt;p&gt;But it also means that the thing we verify is no longer only the final answer.&lt;/p&gt;

&lt;p&gt;We need to verify the action path.&lt;/p&gt;
&lt;h2&gt;
  
  
  The old verification questions are not enough
&lt;/h2&gt;

&lt;p&gt;When we verify AI-generated text, we usually ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this true?&lt;/li&gt;
&lt;li&gt;Is this accurate?&lt;/li&gt;
&lt;li&gt;Are the sources real?&lt;/li&gt;
&lt;li&gt;Is the explanation complete?&lt;/li&gt;
&lt;li&gt;Is the information up to date?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions still matter.&lt;/p&gt;

&lt;p&gt;But they are not enough when AI takes action.&lt;/p&gt;

&lt;p&gt;For actions, developers need a different checklist.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Direction: is the action serving the right goal?
&lt;/h2&gt;

&lt;p&gt;An AI-generated email can be grammatically perfect and still be the wrong email to send.&lt;/p&gt;

&lt;p&gt;The wording may be polished.&lt;br&gt;
The tone may be professional.&lt;br&gt;
The facts may be correct.&lt;/p&gt;

&lt;p&gt;But maybe the timing is wrong.&lt;br&gt;
Maybe the relationship needs a softer response.&lt;br&gt;
Maybe the user did not want to commit yet.&lt;br&gt;
Maybe the message moves the conversation in the wrong direction.&lt;/p&gt;

&lt;p&gt;Fact-checking cannot catch that.&lt;/p&gt;

&lt;p&gt;The question is not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this correct?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this action moving toward the goal I actually want?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For developers, this matters in code too.&lt;/p&gt;

&lt;p&gt;An AI agent may “fix” a bug by changing a larger part of the system than expected. The patch may pass tests, but it may not align with the intended design.&lt;/p&gt;

&lt;p&gt;So the first action-verification question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the direction right?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Scope: did the agent stay inside the boundary?
&lt;/h2&gt;

&lt;p&gt;Agents interpret instructions.&lt;/p&gt;

&lt;p&gt;That is useful, but it also creates risk.&lt;/p&gt;

&lt;p&gt;Consider these instructions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Clean up this folder.&lt;/p&gt;

&lt;p&gt;Fix this bug.&lt;/p&gt;

&lt;p&gt;Improve this component.&lt;/p&gt;

&lt;p&gt;Organize this document.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each one sounds simple.&lt;/p&gt;

&lt;p&gt;But each one has hidden scope.&lt;/p&gt;

&lt;p&gt;“Clean up this folder” might mean renaming files.&lt;br&gt;
It might also mean deleting files.&lt;/p&gt;

&lt;p&gt;“Fix this bug” might mean changing one function.&lt;br&gt;
It might also mean refactoring surrounding code.&lt;/p&gt;

&lt;p&gt;“Improve this component” might mean adjusting UI spacing.&lt;br&gt;
It might also mean rewriting its state logic.&lt;/p&gt;

&lt;p&gt;The problem is not always that the AI is broken.&lt;/p&gt;

&lt;p&gt;Sometimes it is doing what it thinks the instruction implies.&lt;/p&gt;

&lt;p&gt;That means we need to verify scope.&lt;/p&gt;

&lt;p&gt;Before letting an agent act, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is it allowed to touch?&lt;/li&gt;
&lt;li&gt;What is it not allowed to touch?&lt;/li&gt;
&lt;li&gt;Which files, tools, APIs, or users are out of bounds?&lt;/li&gt;
&lt;li&gt;Does the agent need approval before crossing a boundary?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second action-verification question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did it do only what it should do?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Reversibility: how hard is this to undo?
&lt;/h2&gt;

&lt;p&gt;Not all actions have the same weight.&lt;/p&gt;

&lt;p&gt;Saving a draft is not the same as sending an email.&lt;/p&gt;

&lt;p&gt;Running code locally is not the same as deploying it.&lt;/p&gt;

&lt;p&gt;Changing a private note is not the same as changing a shared document.&lt;/p&gt;

&lt;p&gt;Deleting a test file is not the same as deleting production data.&lt;/p&gt;

&lt;p&gt;When an AI-generated answer is wrong, we can usually edit it.&lt;/p&gt;

&lt;p&gt;When an AI action is wrong, we may need to undo a real-world change.&lt;/p&gt;

&lt;p&gt;That makes reversibility one of the most important checks.&lt;/p&gt;

&lt;p&gt;Before approving an AI action, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can this be undone?&lt;/li&gt;
&lt;li&gt;Is there a backup?&lt;/li&gt;
&lt;li&gt;Is there a preview step?&lt;/li&gt;
&lt;li&gt;Is this a draft or a final action?&lt;/li&gt;
&lt;li&gt;What happens if the agent is wrong?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third action-verification question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can this action be reversed if needed?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Responsibility: who owns the outcome?
&lt;/h2&gt;

&lt;p&gt;AI does not remove responsibility.&lt;/p&gt;

&lt;p&gt;If an AI sends an email, someone allowed it to send the email.&lt;/p&gt;

&lt;p&gt;If an AI deploys code, someone approved the deployment.&lt;/p&gt;

&lt;p&gt;If an AI deletes the wrong file, books the wrong meeting, or changes the wrong setting, the result still belongs somewhere.&lt;/p&gt;

&lt;p&gt;This is uncomfortable, but important.&lt;/p&gt;

&lt;p&gt;Automation changes how work happens.&lt;/p&gt;

&lt;p&gt;It does not make responsibility disappear.&lt;/p&gt;

&lt;p&gt;So before giving an agent more autonomy, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who approves this action?&lt;/li&gt;
&lt;li&gt;Who is notified when it happens?&lt;/li&gt;
&lt;li&gt;Who reviews the result?&lt;/li&gt;
&lt;li&gt;Who is responsible if it goes wrong?&lt;/li&gt;
&lt;li&gt;Where is the audit trail?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fourth action-verification question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who owns the outcome?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A simple action-verification checklist
&lt;/h2&gt;

&lt;p&gt;Before letting an AI agent take action, I want to check four things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Direction:
Does this action move in the right direction?

Scope:
Does it do only what it should do?

Reversibility:
Can it be undone if needed?

Responsibility:
Who owns the outcome?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a complicated framework.&lt;/p&gt;

&lt;p&gt;But it changes how we think about AI tools.&lt;/p&gt;

&lt;p&gt;We stop asking only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the answer correct?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And start asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this action happen?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Example: an AI coding agent
&lt;/h2&gt;

&lt;p&gt;Imagine an AI coding agent receives this instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the issue in the dashboard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A weak verification process might only check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the app build?&lt;/li&gt;
&lt;li&gt;Did the tests pass?&lt;/li&gt;
&lt;li&gt;Does the UI look okay?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those checks are useful, but incomplete.&lt;/p&gt;

&lt;p&gt;Action verification asks more:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did the agent fix the actual dashboard issue, or did it solve a nearby problem?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did it only change dashboard-related files, or did it modify unrelated shared logic?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reversibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can the change be reviewed and reverted easily? Is it in a branch or already deployed?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responsibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who reviews the PR? Who approves the deployment? Who owns the result if something breaks?&lt;/p&gt;

&lt;p&gt;This is the difference between checking code output and checking agent behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convenience moves judgment upstream
&lt;/h2&gt;

&lt;p&gt;It is tempting to think that as AI tools become more convenient, human judgment becomes less important.&lt;/p&gt;

&lt;p&gt;I think the opposite happens.&lt;/p&gt;

&lt;p&gt;Convenience moves judgment upstream.&lt;/p&gt;

&lt;p&gt;When AI handles more steps, humans may not need to make every small decision manually.&lt;/p&gt;

&lt;p&gt;But the remaining decisions become more important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What goal should be given?&lt;/li&gt;
&lt;li&gt;How much autonomy is allowed?&lt;/li&gt;
&lt;li&gt;Which tools can the agent use?&lt;/li&gt;
&lt;li&gt;Where should it stop?&lt;/li&gt;
&lt;li&gt;Which actions require approval?&lt;/li&gt;
&lt;li&gt;What should never be delegated?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more an AI system can do, the more carefully we need to define the boundary.&lt;/p&gt;

&lt;p&gt;Automation reduces manual effort.&lt;/p&gt;

&lt;p&gt;It does not remove judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should developers delegate?
&lt;/h2&gt;

&lt;p&gt;This is not an argument against AI agents.&lt;/p&gt;

&lt;p&gt;Many tasks should be delegated.&lt;/p&gt;

&lt;p&gt;Agents are useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the workflow is clear&lt;/li&gt;
&lt;li&gt;the task is repetitive&lt;/li&gt;
&lt;li&gt;the result is easy to verify&lt;/li&gt;
&lt;li&gt;the scope is limited&lt;/li&gt;
&lt;li&gt;mistakes are easy to undo&lt;/li&gt;
&lt;li&gt;the system has logs or review steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But we should be careful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the action affects other people&lt;/li&gt;
&lt;li&gt;the result is difficult to reverse&lt;/li&gt;
&lt;li&gt;the instruction is ambiguous&lt;/li&gt;
&lt;li&gt;the agent can touch sensitive data&lt;/li&gt;
&lt;li&gt;the task depends on personal or business context&lt;/li&gt;
&lt;li&gt;the outcome creates responsibility outside the tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can delegate work to AI.&lt;/p&gt;

&lt;p&gt;But you cannot delegate judgment completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The first phase of AI verification was mostly about answers.&lt;/p&gt;

&lt;p&gt;Can we trust this explanation?&lt;br&gt;
Is this fact correct?&lt;br&gt;
Are these sources real?&lt;br&gt;
Is this summary faithful?&lt;/p&gt;

&lt;p&gt;That still matters.&lt;/p&gt;

&lt;p&gt;But AI agents push the question further.&lt;/p&gt;

&lt;p&gt;Now we also need to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the direction right?&lt;/li&gt;
&lt;li&gt;Is the scope appropriate?&lt;/li&gt;
&lt;li&gt;Is the action reversible?&lt;/li&gt;
&lt;li&gt;Is the responsibility clear?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When AI makes answers, we verify facts.&lt;/p&gt;

&lt;p&gt;When AI takes actions, we verify consequences.&lt;/p&gt;

&lt;p&gt;Because answers can be read.&lt;/p&gt;

&lt;p&gt;Actions leave traces.&lt;/p&gt;




&lt;p&gt;Originally published on Dechive — an archive for verifying AI-generated answers before we trust them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dechive.dev/en/archive/when-ai-acts-beyond-answers" rel="noopener noreferrer"&gt;https://dechive.dev/en/archive/when-ai-acts-beyond-answers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>agents</category>
      <category>automation</category>
    </item>
    <item>
      <title>You Don’t Need to Try Every AI Tool to Keep Up</title>
      <dc:creator>Dechive</dc:creator>
      <pubDate>Sat, 23 May 2026 03:50:18 +0000</pubDate>
      <link>https://dev.to/dechive/you-dont-need-to-try-every-ai-tool-to-keep-up-gc4</link>
      <guid>https://dev.to/dechive/you-dont-need-to-try-every-ai-tool-to-keep-up-gc4</guid>
      <description>&lt;h2&gt;
  
  
  A practical note on AI tool anxiety, productivity pressure, and choosing better standards.
&lt;/h2&gt;

&lt;p&gt;Every developer feed has started to feel like a speedrun.&lt;/p&gt;

&lt;p&gt;Someone built an app with AI over the weekend.&lt;br&gt;
Someone launched a small SaaS.&lt;br&gt;
Someone connected a new model to an agent workflow.&lt;br&gt;
Someone tested the latest coding assistant and already has a thread about it.&lt;/p&gt;

&lt;p&gt;Then the quiet question appears:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Am I falling behind?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It does not always feel like failure.&lt;/p&gt;

&lt;p&gt;Sometimes it feels like absence.&lt;/p&gt;

&lt;p&gt;I am not necessarily doing something wrong.&lt;br&gt;
I am just not doing enough.&lt;/p&gt;

&lt;p&gt;Not building enough.&lt;br&gt;
Not testing enough.&lt;br&gt;
Not automating enough.&lt;br&gt;
Not using the newest tools quickly enough.&lt;/p&gt;

&lt;p&gt;In the age of AI, that feeling can become exhausting.&lt;/p&gt;

&lt;p&gt;But before we accept it as truth, we should ask a better question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What standard am I using to decide that I am behind?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two types of AI anxiety
&lt;/h2&gt;

&lt;p&gt;I think AI anxiety often shows up in two forms.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Productivity anxiety
&lt;/h3&gt;

&lt;p&gt;This is the feeling that everyone else is producing more with AI.&lt;/p&gt;

&lt;p&gt;They are writing faster, coding faster, launching faster, publishing faster, and turning small ideas into visible projects faster than before.&lt;/p&gt;

&lt;p&gt;The feed keeps showing a version of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I built this with AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if I am not building something too, it can feel like I am wasting time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tool anxiety
&lt;/h3&gt;

&lt;p&gt;This is the feeling that every new model, framework, agent, editor, or workflow needs to be tested immediately.&lt;/p&gt;

&lt;p&gt;A new model comes out.&lt;br&gt;
A new AI coding tool gets attention.&lt;br&gt;
A new automation pattern spreads.&lt;br&gt;
A new “best workflow” appears.&lt;/p&gt;

&lt;p&gt;Someone has already tried it.&lt;br&gt;
Someone has already compared it.&lt;br&gt;
Someone has already connected it to five other tools.&lt;/p&gt;

&lt;p&gt;So the question becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If I am not using all of this, am I falling behind?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both anxieties feel real.&lt;/p&gt;

&lt;p&gt;But both depend on comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying a tool is not the same as keeping up
&lt;/h2&gt;

&lt;p&gt;Here is the mistake I keep noticing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We confuse trying a tool with moving forward.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But these are different things.&lt;/p&gt;

&lt;p&gt;Trying a tool quickly is not the same as understanding it.&lt;/p&gt;

&lt;p&gt;Understanding a tool is not the same as using it well.&lt;/p&gt;

&lt;p&gt;Using a tool well is not the same as building something meaningful with it.&lt;/p&gt;

&lt;p&gt;The first person to test a new model is not automatically the person who understands it best.&lt;/p&gt;

&lt;p&gt;The person who connects many tools together is not automatically solving a better problem.&lt;/p&gt;

&lt;p&gt;The person who launches faster is not always moving in a better direction.&lt;/p&gt;

&lt;p&gt;In the AI era, activity can easily disguise itself as progress.&lt;/p&gt;

&lt;p&gt;That does not mean we should ignore new tools.&lt;/p&gt;

&lt;p&gt;Experimentation matters.&lt;br&gt;
Curiosity matters.&lt;br&gt;
Trying new models can reveal what is changing.&lt;/p&gt;

&lt;p&gt;But a tool is not a direction.&lt;/p&gt;

&lt;p&gt;A model is not a goal.&lt;/p&gt;

&lt;p&gt;A workflow is not a standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feed is not a good standard
&lt;/h2&gt;

&lt;p&gt;The feed is good at showing motion.&lt;/p&gt;

&lt;p&gt;It is not always good at showing meaning.&lt;/p&gt;

&lt;p&gt;It shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who launched something&lt;/li&gt;
&lt;li&gt;Who tried the newest model&lt;/li&gt;
&lt;li&gt;Who built a workflow&lt;/li&gt;
&lt;li&gt;Who automated a task&lt;/li&gt;
&lt;li&gt;Who shipped faster&lt;/li&gt;
&lt;li&gt;Who got attention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it does not always show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the tool actually solved a real problem&lt;/li&gt;
&lt;li&gt;Whether the workflow is maintainable&lt;/li&gt;
&lt;li&gt;Whether the output was useful&lt;/li&gt;
&lt;li&gt;Whether the project will survive next week&lt;/li&gt;
&lt;li&gt;Whether the person building it even needed it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why using the feed as a standard is dangerous.&lt;/p&gt;

&lt;p&gt;The feed can always move the finish line.&lt;/p&gt;

&lt;p&gt;After you try one tool, another one appears.&lt;br&gt;
After you launch one project, someone launches three.&lt;br&gt;
After you automate one workflow, someone shows a better one.&lt;/p&gt;

&lt;p&gt;If the standard stays outside of you, no tool will be enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better checklist before trying a new AI tool
&lt;/h2&gt;

&lt;p&gt;Before trying a new AI tool, I want to ask better questions.&lt;/p&gt;

&lt;p&gt;Not because tools are bad.&lt;/p&gt;

&lt;p&gt;But because attention is limited.&lt;/p&gt;

&lt;p&gt;Here is the checklist I want to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Why do I want to use this?
&lt;/h3&gt;

&lt;p&gt;Is it curiosity?&lt;/p&gt;

&lt;p&gt;Is it connected to a real problem?&lt;/p&gt;

&lt;p&gt;Or am I only reacting because everyone else seems to be using it?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What problem does it solve?
&lt;/h3&gt;

&lt;p&gt;A tool should be connected to a problem.&lt;/p&gt;

&lt;p&gt;If I cannot name the problem, I am probably just collecting tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What would count as a useful result?
&lt;/h3&gt;

&lt;p&gt;Before using the tool, I should know what “better” means.&lt;/p&gt;

&lt;p&gt;Does it save time?&lt;br&gt;
Does it improve quality?&lt;br&gt;
Does it reduce friction?&lt;br&gt;
Does it help me understand something?&lt;br&gt;
Does it help me build something I actually care about?&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What will I stop doing if this works?
&lt;/h3&gt;

&lt;p&gt;This question is important.&lt;/p&gt;

&lt;p&gt;If a tool does not change anything about how I work, maybe it is not actually useful yet.&lt;/p&gt;

&lt;p&gt;A useful tool should replace, improve, or clarify something.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Am I curious, or am I anxious?
&lt;/h3&gt;

&lt;p&gt;Curiosity and anxiety can look similar.&lt;/p&gt;

&lt;p&gt;Both can make us test tools.&lt;br&gt;
Both can make us write notes.&lt;br&gt;
Both can make us post screenshots.&lt;/p&gt;

&lt;p&gt;But they feel different internally.&lt;/p&gt;

&lt;p&gt;Curiosity builds judgment.&lt;/p&gt;

&lt;p&gt;Anxiety borrows direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical example
&lt;/h2&gt;

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

&lt;blockquote&gt;
&lt;p&gt;I need to try this new AI coding tool because everyone is talking about it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to test this tool because I spend too much time refactoring repeated UI patterns, and I want to see if it can reduce that friction without lowering code quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second sentence has a standard.&lt;/p&gt;

&lt;p&gt;It has a problem.&lt;br&gt;
It has a reason.&lt;br&gt;
It has something to verify.&lt;/p&gt;

&lt;p&gt;The goal is not just to use the tool.&lt;/p&gt;

&lt;p&gt;The goal is to find out whether the tool helps with a real task.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping up does not mean using everything
&lt;/h2&gt;

&lt;p&gt;Keeping up with AI does not mean using every new model, framework, agent, or workflow.&lt;/p&gt;

&lt;p&gt;It means building the judgment to decide what is worth using.&lt;/p&gt;

&lt;p&gt;It means knowing why we are trying something before we mistake the act of trying for progress.&lt;/p&gt;

&lt;p&gt;It means knowing what we are building before we confuse output with direction.&lt;/p&gt;

&lt;p&gt;AI can make us faster.&lt;/p&gt;

&lt;p&gt;But speed only helps when we know what it is serving.&lt;/p&gt;

&lt;p&gt;Without an internal standard, every new tool becomes a demand.&lt;/p&gt;

&lt;p&gt;Every launch becomes a comparison.&lt;/p&gt;

&lt;p&gt;Every post becomes evidence that we are late.&lt;/p&gt;

&lt;p&gt;With a standard, a tool can become just a tool again.&lt;/p&gt;

&lt;p&gt;Something to test.&lt;br&gt;
Something to use.&lt;br&gt;
Something to ignore.&lt;br&gt;
Something to return to later.&lt;/p&gt;

&lt;p&gt;Maybe falling behind in the age of AI is not always about using fewer tools.&lt;/p&gt;

&lt;p&gt;Maybe it is often about borrowing too many standards from the feed.&lt;/p&gt;




&lt;p&gt;Originally published on Dechive — an archive for verifying AI-generated answers before we trust them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dechive.dev/en/archive/am-i-falling-behind-in-ai-era" rel="noopener noreferrer"&gt;https://dechive.dev/en/archive/am-i-falling-behind-in-ai-era&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why WHERE phone = NULL Returns Nothing in SQL</title>
      <dc:creator>Dechive</dc:creator>
      <pubDate>Sun, 10 May 2026 15:33:56 +0000</pubDate>
      <link>https://dev.to/dechive/why-where-phone-null-returns-nothing-in-sql-m1j</link>
      <guid>https://dev.to/dechive/why-where-phone-null-returns-nothing-in-sql-m1j</guid>
      <description>&lt;p&gt;If you are new to SQL, this query can look perfectly reasonable at first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have a &lt;code&gt;users&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;Some users did not enter their phone number.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;phone&lt;/code&gt; column looks empty.&lt;/p&gt;

&lt;p&gt;So you try to find those rows with &lt;code&gt;phone = NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But the result comes back empty.&lt;/p&gt;

&lt;p&gt;The table is not necessarily wrong.&lt;br&gt;
The column name may be correct.&lt;br&gt;
The query may even look logical.&lt;/p&gt;

&lt;p&gt;The problem is that &lt;code&gt;NULL&lt;/code&gt; is not a normal value.&lt;/p&gt;

&lt;p&gt;To understand why this query returns nothing, we need to understand what &lt;code&gt;NULL&lt;/code&gt; really means.&lt;/p&gt;
&lt;h2&gt;
  
  
  NULL is not an empty value
&lt;/h2&gt;

&lt;p&gt;At first, &lt;code&gt;NULL&lt;/code&gt; looks like an empty cell.&lt;/p&gt;

&lt;p&gt;It feels similar to &lt;code&gt;0&lt;/code&gt; or an empty string.&lt;/p&gt;

&lt;p&gt;But in SQL, these are different things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0      -&amp;gt; a number
''     -&amp;gt; an empty string
NULL   -&amp;gt; an unknown or unrecorded state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;0&lt;/code&gt; is a value.&lt;/p&gt;

&lt;p&gt;It means the number zero.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;''&lt;/code&gt; is also a value.&lt;/p&gt;

&lt;p&gt;It means a string with no characters.&lt;/p&gt;

&lt;p&gt;But &lt;code&gt;NULL&lt;/code&gt; is different.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; does not mean “empty” in the same way.&lt;br&gt;
It means the value is unknown, missing, or not recorded.&lt;/p&gt;

&lt;p&gt;That difference looks small, but it affects comparisons, calculations, and aggregate functions.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why &lt;code&gt;= NULL&lt;/code&gt; does not work
&lt;/h2&gt;

&lt;p&gt;Look again at the original query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This condition asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is phone equal to NULL?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But &lt;code&gt;NULL&lt;/code&gt; means unknown.&lt;/p&gt;

&lt;p&gt;SQL cannot say that one unknown value is equal to another unknown value.&lt;/p&gt;

&lt;p&gt;Even this expression is not true:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is not &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is unknown.&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;WHERE&lt;/code&gt; only keeps rows where the condition is true.&lt;/p&gt;

&lt;p&gt;So when you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL does not find the rows where &lt;code&gt;phone&lt;/code&gt; is &lt;code&gt;NULL&lt;/code&gt;.&lt;br&gt;
The comparison itself does not become true.&lt;/p&gt;

&lt;p&gt;That is why the correct query is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want rows where &lt;code&gt;phone&lt;/code&gt; has a value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;IS NULL&lt;/code&gt; is not just another style of writing &lt;code&gt;= NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It asks a different question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is this value in an unknown or unrecorded state?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  NULL spreads through calculations
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; also affects calculations.&lt;/p&gt;

&lt;p&gt;If an unknown value is part of a calculation, the result is usually unknown too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- NULL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;-- NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes sense if you think about what &lt;code&gt;NULL&lt;/code&gt; means.&lt;/p&gt;

&lt;p&gt;If you do not know one part of the calculation, you cannot know the final result.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine this table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;item_id&lt;/th&gt;
&lt;th&gt;price&lt;/th&gt;
&lt;th&gt;quantity&lt;/th&gt;
&lt;th&gt;total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If &lt;code&gt;price&lt;/code&gt; is unknown, the total is unknown.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;quantity&lt;/code&gt; is unknown, the total is also unknown.&lt;/p&gt;

&lt;p&gt;The calculation is not broken.&lt;br&gt;
SQL is preserving the fact that something is unknown.&lt;/p&gt;

&lt;p&gt;Sometimes you may want to replace &lt;code&gt;NULL&lt;/code&gt; with another value.&lt;/p&gt;

&lt;p&gt;For that, SQL provides &lt;code&gt;COALESCE&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;COALESCE(price, 0)&lt;/code&gt; means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use price if it is not NULL.
If price is NULL, use 0 instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this should be done carefully.&lt;/p&gt;

&lt;p&gt;Replacing &lt;code&gt;NULL&lt;/code&gt; with &lt;code&gt;0&lt;/code&gt; is not just a technical fix.&lt;br&gt;
It changes the meaning of the data.&lt;/p&gt;

&lt;p&gt;There is a difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The value is zero.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We do not know the value.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL keeps that difference visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggregate functions treat NULL differently
&lt;/h2&gt;

&lt;p&gt;There is another place where &lt;code&gt;NULL&lt;/code&gt; often surprises beginners.&lt;/p&gt;

&lt;p&gt;Aggregate functions usually skip &lt;code&gt;NULL&lt;/code&gt; values.&lt;/p&gt;

&lt;p&gt;For example, imagine a &lt;code&gt;score&lt;/code&gt; column with these values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80, NULL, 90, NULL, 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now look at this query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="k"&gt;MIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SUM(score)&lt;/code&gt; returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;240
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does not treat &lt;code&gt;NULL&lt;/code&gt; as &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It skips the unknown values.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AVG(score)&lt;/code&gt; returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it calculates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(80 + 90 + 70) / 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does not divide by all five rows.&lt;/p&gt;

&lt;p&gt;That is important.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; is not zero.&lt;br&gt;
It is ignored by many aggregate functions.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;COUNT(*)&lt;/code&gt; and &lt;code&gt;COUNT(column)&lt;/code&gt; are different
&lt;/h2&gt;

&lt;p&gt;The most common mistake is with &lt;code&gt;COUNT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Look at this query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two expressions do not ask the same question.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COUNT(*)&lt;/code&gt; asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How many rows are there?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;COUNT(score)&lt;/code&gt; asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How many rows have a known value in the score column?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So if the table has five rows, but only three rows have a score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COUNT(*)     -&amp;gt; 5
COUNT(score) -&amp;gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both answers are correct.&lt;/p&gt;

&lt;p&gt;They are just answering different questions.&lt;/p&gt;

&lt;p&gt;This matters in real data.&lt;/p&gt;

&lt;p&gt;The number of users is not always the same as the number of users with phone numbers.&lt;/p&gt;

&lt;p&gt;The number of orders is not always the same as the number of orders with payment dates.&lt;/p&gt;

&lt;p&gt;The number of rows is not always the number of known values.&lt;/p&gt;

&lt;h2&gt;
  
  
  NULL is a record of uncertainty
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; is not just an empty space.&lt;/p&gt;

&lt;p&gt;It is a mark left by uncertainty.&lt;/p&gt;

&lt;p&gt;A user did not enter a phone number.&lt;br&gt;
A measurement was not recorded.&lt;br&gt;
A delivery address was not decided yet.&lt;br&gt;
A value was not known when the row was stored.&lt;/p&gt;

&lt;p&gt;That is why this does not work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is why this becomes &lt;code&gt;NULL&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is why these two counts are different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;column&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They all come from the same idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unknown values remain unknown until we decide how to handle them.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes we replace them.&lt;/p&gt;

&lt;p&gt;Sometimes we exclude them.&lt;/p&gt;

&lt;p&gt;Sometimes we leave them as they are.&lt;/p&gt;

&lt;p&gt;The database is honest about what it does not know.&lt;/p&gt;

&lt;p&gt;How we read that uncertainty is up to us.&lt;/p&gt;




&lt;p&gt;Originally published at Dechive:&lt;br&gt;
&lt;a href="https://dechive.dev/en/archive/what-null-leaves-behind" rel="noopener noreferrer"&gt;https://dechive.dev/en/archive/what-null-leaves-behind&lt;/a&gt;&lt;/p&gt;




</description>
      <category>beginners</category>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>We Do Not Teach Thinking to AI</title>
      <dc:creator>Dechive</dc:creator>
      <pubDate>Sat, 09 May 2026 21:39:00 +0000</pubDate>
      <link>https://dev.to/dechive/we-do-not-teach-thinking-to-ai-5d06</link>
      <guid>https://dev.to/dechive/we-do-not-teach-thinking-to-ai-5d06</guid>
      <description>&lt;p&gt;Most of us learned to prompt AI by &lt;em&gt;guiding&lt;/em&gt; its thinking.&lt;/p&gt;

&lt;p&gt;"Think step by step."&lt;br&gt;&lt;br&gt;
"Here's an example of how to solve this."&lt;br&gt;&lt;br&gt;
"First check A, then compare B, finally conclude with C."&lt;/p&gt;

&lt;p&gt;These techniques made sense — because we were working with models that needed a path. Without structure, they'd rush to a conclusion.&lt;/p&gt;

&lt;p&gt;But reasoning models shift this premise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thinking Comes Before the Answer
&lt;/h2&gt;

&lt;p&gt;General conversational models excel at producing natural answers quickly. For tasks where the direction is clear — brief summaries, simple explanations — this is sufficient.&lt;/p&gt;

&lt;p&gt;Reasoning models work differently. Rather than pushing problems straight toward conclusions, they're designed to &lt;strong&gt;compare conditions, trace possible paths, and hold problems longer&lt;/strong&gt; before forming answers.&lt;/p&gt;

&lt;p&gt;Models like Claude's extended thinking or OpenAI's o-series represent this direction — built to spend more computation on internal reasoning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A reasoning model isn't one that writes longer answers. It's one built to grapple with harder problems for longer.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  When Your Old Methods Get in the Way
&lt;/h2&gt;

&lt;p&gt;With general models, "think step by step" can be helpful. It forces intermediate steps rather than jumping to conclusions.&lt;/p&gt;

&lt;p&gt;But with reasoning models, the same approach doesn't always work.&lt;/p&gt;

&lt;p&gt;When you strongly specify an arbitrary sequence of thinking to a model &lt;strong&gt;already designed to break problems down&lt;/strong&gt;, you narrow the space for it to find a better path.&lt;/p&gt;

&lt;p&gt;The same goes for examples. Good examples show the standard for an answer. But overly detailed examples can lock the model into a specific solution method — even when a superior approach exists.&lt;/p&gt;

&lt;p&gt;This isn't about Chain of Thought being wrong. It's about using the same habits when your tool has fundamentally changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Specify the Goal, Then Step Back
&lt;/h2&gt;

&lt;p&gt;With reasoning models, sometimes saying &lt;em&gt;less&lt;/em&gt; is better.&lt;/p&gt;

&lt;p&gt;Rather than mapping out the process in detail, give:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear &lt;strong&gt;goal&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;criteria&lt;/strong&gt; for a good answer
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;output format&lt;/strong&gt; you need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then leave the middle steps to the model.&lt;/p&gt;

&lt;p&gt;The model doesn't need you to design its thinking process. It needs to know what counts as a good answer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is an excerpt. The full piece — including a side-by-side prompt comparison and when reasoning models are the wrong tool entirely — is at &lt;a href="https://dechive.dev/en/archive/prompt-reasoning-model" rel="noopener noreferrer"&gt;Dechive&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dechive is a quiet library for the AI age — a place to read slowly, think deeply, and ask why.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Artificial Intelligence Tells Lies</title>
      <dc:creator>Dechive</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/dechive/why-artificial-intelligence-tells-lies-1dp5</link>
      <guid>https://dev.to/dechive/why-artificial-intelligence-tells-lies-1dp5</guid>
      <description>&lt;p&gt;Before a Professional Industrial Hygiene Exam, I asked an AI to solve some past questions. It got the answers wrong. That part was fine. The problem was how perfectly it explained its wrong answers. It cited relevant laws, analyzed each option one by one, and laid out the logic of why its answer was correct. Confidently. Flawlessly.&lt;/p&gt;

&lt;p&gt;Suspicious, I told it the correct answer directly. The AI didn't back down. It insisted its choice was right and that the answer I'd given was actually wrong. At the end, I uploaded both the test sheet and answer key as files. Still wrong.&lt;/p&gt;

&lt;p&gt;This wasn't a bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not a Lie, But Certainty
&lt;/h3&gt;

&lt;p&gt;It's acceptable that AI produces wrong answers. Every system gets things wrong sometimes.&lt;/p&gt;

&lt;p&gt;What's hard to accept is something else: the AI doesn't know it was wrong.&lt;/p&gt;

&lt;p&gt;A lie means knowing the truth and hiding it. Hallucination is different. A model may not generate enough signals to itself that the answer is incorrect. It lacks any sense of being wrong. Because of this, wrong information doesn't look wrong. There's logic to it, evidence behind it, a stable tone.&lt;/p&gt;

&lt;p&gt;This is what sets hallucination apart from other kinds of errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Does It Speak Without Knowing?
&lt;/h3&gt;

&lt;p&gt;An LLM doesn't work the way humans understand text. It's closer to a machine that predicts the most plausible token coming next in a given context. The measure of "plausibility" isn't factual accuracy—it's what followed similar patterns in the training data.&lt;/p&gt;

&lt;p&gt;When asked "What is the workers' compensation standard for noise-induced hearing loss?", the model generates the most natural text that would follow such a question. If older standards appear more frequently in the training data, it confidently outputs the outdated standard instead of the current one. There's no way for it to know it's wrong.&lt;/p&gt;

&lt;p&gt;Even when you provide the correct answer, its stubbornness stems from the same source. The model holds two kinds of knowledge: the billions of parameters inscribed during training, and the information the user provides in this conversation. When these collide, context doesn't always win. Information the model learned strongly tends to override what the user says in the moment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How can we reduce these hallucinations? And what are the limits that prompts simply cannot overcome?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dechive.dev/en/archive/prompt-hallucination" rel="noopener noreferrer"&gt;Continue reading the full article at Dechive →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dechive is a bilingual digital library for deep thinking about AI, prompt engineering, and technology.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
