Skip to content

Write a blog in 2026 without sounding like ChatGPT

Dev blogs are drowning in generated prose. Here are five rules to write with actual voice before readers learn to skip yours on sight.

· 5 min read

In today's rapidly evolving landscape, developers must leverage cutting-edge tools to remain at the forefront of their field. This post will delve into the key strategies for building robust, scalable systems that meet the demands of modern software engineering.

That paragraph was generated in about four seconds. You have read its exact shape on at least forty dev blogs in the last year, probably more. The words are not wrong, exactly. They are worse than wrong: they are frictionless. Nothing sticks. Your eyes move across the surface and retain nothing, because there is nothing to retain.

This is the problem. Voice is now the only moat left.

Why voice became the moat

A year ago, the volume of AI-assisted content was high enough to be annoying but low enough that good writing still surfaced cleanly. That window closed. Search indexes are now saturated with structurally correct, semantically hollow content. Readers have adapted faster than the algorithms: within two sentences, most people can feel the absence of a real mind behind the prose, and they close the tab.

The tell is not vocabulary or even grammar. The tell is the shape of claims. AI-generated dev writing tends toward the conclusory: it states that something is scalable, production-ready, elegant, or powerful without specifying the mechanism that makes it so. The reader's brain, pattern-matching on thousands of similar paragraphs, recognises the emptiness and files the piece as noise.

Personal voice works differently. A person who has actually run Postgres on a single t3.micro through a traffic spike writes about it in specifics: what the connection count hit, which query started timing out, what config change bought them another six months. That specificity cannot be faked without the data, and it is what makes the piece worth reading. Voice is not stylistic flourish, it is the trace of genuine experience rendered in words.

The practical implication: if your writing reads the same whether or not you actually did the thing, you are competing with infinite generated content at zero marginal cost. You win that competition only by writing things that cannot be plausibly faked.

Five rules

1. Banish the em-dash.

The em-dash became the typographic signature of generated text around mid-2024, and by 2026 it is the single fastest reader signal for AI output. Ironic, since it used to signal intelligence. Now it signals autopilot. If you find yourself reaching for it, stop and ask what the sentence is actually doing. Usually you have two independent thoughts stapled together without justification. Separate them into two sentences, or commit to the logical connector: "because", "but", "so", "which means". The em-dash hid lazy thinking. Its absence forces you to know what the relationship between your clauses actually is.

2. Lead with the mechanism, not the conclusion.

"It's faster" is not a sentence worth writing. "It's faster because the cache warms on deploy, so the first request after a cold start hits memory instead of Postgres" is a sentence that earns its place. Every performance claim, every architectural recommendation, every opinion about a framework should carry its reason. Not as a hedge ("this might be faster in some situations"), but as a specific causal chain. Mechanism-first writing also self-corrects: if you cannot name the mechanism, you do not understand the thing well enough to be writing about it, and the draft is doing you a favour by stalling.

3. Name things. Do not hedge into generality.

"A managed database solution" is not a thing. Neon Postgres is a thing. "A state management library" is evasive. Zustand is not. Naming specific tools, services, and libraries serves two purposes: it grounds the reader in something real, and it signals that you made an actual choice with actual tradeoffs. Generality is the refuge of writing that was never tested against reality. If you do not want to name something because you are not sure it is the right call, that uncertainty is itself worth writing about: "I used Neon Postgres here, but the connection-pooling behaviour on serverless has bitten me before, and on higher traffic I would reach for RDS Proxy."

4. Local idiom is a differentiator, not a liability.

There is a tendency among non-native English writers to sand down every regional trace from their writing, flattening it into what they imagine to be neutral international English. The result is prose that belongs to nowhere and therefore resonates with no one. Writing from this part of the world has its own cadence: shorter declarative bursts, a directness that does not apologise for itself, a tendency to state the practical implication before the theoretical framing. That is not broken English. That is a different but coherent style, and it reads distinctively in a field full of prose trained on the same Californian tech-blog corpus. Do not flatten it out. Let the cadence show. Readers who recognise it will trust you more, not less.

5. Cut the closing frame. End on content.

"In conclusion", "to summarize", "I hope this was helpful" are all signals that the writer ran out of things to say and reached for scaffolding to fill the space. A piece of writing that has a real ending does not need to announce that it is ending. If the last sentence of your post is a restatement of the opening thesis dressed in slightly different words, that sentence is the problem, not the solution. Delete it. If deleting it leaves the ending feeling unresolved, the paragraph before it was not doing its job. End on content: the last sentence should carry a specific claim, not a handshake gesture.

Before and after

Here is the archetypal form. You have seen it hundreds of times.

Before:

When building modern web applications, developers often face the challenge of managing state effectively across complex component hierarchies. By leveraging a robust state management solution, teams can ensure a consistent and maintainable codebase that scales with the needs of the business. It is important to evaluate the available options carefully and choose the one that best aligns with your team's goals.

Nothing happened in that paragraph. No tool was named. No tradeoff was stated. No decision was made. The advice is to "evaluate options carefully", which applies to literally any choice in any domain.

After:

Global state in a Next.js app starts simple and gets expensive fast. Once you have three or more components subscribing to the same value across different subtrees, prop drilling costs more than it saves. Zustand handles this with a single create call and no Provider wrapper, which matters when you are adding state to an existing app and do not want to restructure the tree. Context API works, but every state update re-renders the entire subtree below the provider unless you memo aggressively. Zustand avoids that by default.

The second paragraph names a tool, states a specific problem it solves, explains the mechanism (no Provider, targeted re-renders), and compares it directly to the alternative. You could disagree with it. The first paragraph you cannot disagree with, because it said nothing.

Closing

Write the sentence that only you could have written, about the specific system you actually ran. Everything else is just text.

Written by

Faiz Kasman

Software engineer in Kuala Lumpur. Payments, multi-tenant SaaS, and inventory infrastructure. Currently building the Shell Malaysia ParkEasy app.

Keep reading