惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
人人都是产品经理
人人都是产品经理
月光博客
月光博客
V
V2EX
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
博客园 - 聂微东
博客园 - 司徒正美
博客园 - 【当耐特】
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
The Best Abstractions Arrive Late
Drew Marshall · 2026-06-14 · via DEV Community

One of the biggest mistakes I see developers make is trying to design the perfect abstraction before they've built anything.

I've done it myself.

You sit down to design a library, framework, API, or system and immediately start thinking about every possible future use case.

What if someone needs this?

What if they need that?

What if they need five different variations?

What if they need something I haven't thought of yet?

Before long, you're designing version five of a product that doesn't even have a version one.

The problem is that most good abstractions aren't discovered through planning.

They're discovered through friction.

The Temptation To Abstract Early

As engineers, we love patterns.

The moment we repeat something twice, we start thinking about abstractions.

Sometimes that's the right instinct.

Other times it's premature.

The challenge is that before you've built enough, you don't actually know what should be abstracted.

You only know what you think should be abstracted.

Those are not always the same thing.

Many abstractions begin as educated guesses.

The best abstractions begin as observed behavior.

Real Problems Reveal Better Solutions

Recently, while working on responsive layouts, I noticed myself thinking less about CSS and more about intent.

Not because I was trying to invent something new.

Because I kept running into the same friction.

The question wasn't:

"How should this element be styled?"

The question was:

"How should this content behave?"

That subtle difference led me toward an idea like:

<div content adapt="grid" mobile="stack">

What interested me wasn't the syntax.

It was the thought process that produced it.

The abstraction didn't come from a planning document.

It came from repeatedly encountering the same problem while building.

The friction exposed the pattern.

The pattern suggested the abstraction.

Most Frameworks Start With Solutions

Many libraries begin with solutions looking for problems.

Someone creates an abstraction because it feels elegant.

Because it looks clever.

Because it theoretically covers many use cases.

Then reality arrives.

Users do things the designer never anticipated.

Requirements shift.

Edge cases appear.

The abstraction grows.

Complexity accumulates.

Eventually the abstraction becomes harder to understand than the original problem.

We've all seen it.

Sometimes we've built it.

Friction Is Honest

The reason I trust friction more than planning is because friction doesn't lie.

Friction reveals what actually hurts.

Friction reveals repetition.

Friction reveals complexity.

Friction reveals awkward workflows.

Friction reveals where developers are spending mental energy.

When the same pain appears repeatedly, that's usually a signal.

Not that a feature is needed.

That a better abstraction may exist.

The Difference Between Discovery And Invention

I've started thinking about abstractions less as inventions and more as discoveries.

The pattern already exists.

The abstraction simply gives it a name.

Good abstractions feel obvious in hindsight.

You see them and think:

"Of course."

The reason they feel obvious is because they were already present in the problem.

Someone finally noticed them.

Libraries Develop Languages

One of the most fascinating parts of building libraries is watching them develop their own vocabulary.

Not because you planned every word.

Because certain ideas keep appearing.

Certain concepts keep returning.

Certain solutions keep proving useful.

Over time, the library starts developing a language.

A language of patterns.

A language of conventions.

A language of intent.

The best parts of that language are rarely designed in isolation.

They're discovered through use.

Let The Work Teach You

I've become increasingly skeptical of designing large systems entirely from diagrams and planning sessions.

Planning matters.

Architecture matters.

Vision matters.

But eventually the work itself becomes the teacher.

You build.

You struggle.

You notice.

You refine.

Then you build again.

Every cycle reveals something new.

The abstractions that survive those cycles are often the ones worth keeping.

Build First, Abstract Second

This doesn't mean avoiding abstractions.

It means earning them.

Build the thing.

Experience the friction.

Identify the pattern.

Then create the abstraction.

Not because it looks elegant.

Not because it feels clever.

Because reality has demonstrated that it deserves to exist.

I've found that the best abstractions rarely arrive at the beginning of a project.

They arrive later.

After enough mistakes.

After enough repetition.

After enough friction.

That's why I've started believing that the best abstractions arrive late.

Not because they're delayed.

Because they've been earned.