知道的诅咒,或者说:修复一切
The curse of knowing how, or; fixing everything

原始链接: https://notashelf.dev/posts/curse-of-knowing

作者描述了一段旅程,从最初用代码解决问题的单纯快乐,到后来沉迷于修复一切的强迫症。从简单的脚本和别名开始,程序员对软件缺陷的感知度越来越高,每一个不便之处都变成了对不作为的控诉。这导致了无数个人项目的诞生,都源于“我可以做得更好”的信念。然而,这些项目往往变成了空空的牢笼,建造它们的初衷早已迷失。 作者与软件的持续熵增作斗争,当事情崩溃时感到内疚。永久解决方案的幻觉逐渐消散,取而代之的是,编程变成了一种情绪调节的方式,在不可预测的世界中追求掌控感。这种不断修复事物的需求导致了倦怠,其根源在于认为自己有道德责任去解决每一个低效之处。 最终,作者寻求摆脱这种循环,学习放下修复一切的需求。真正的技能不在于技术上的精通,而在于情绪上的清晰,知道何时该构建,何时该离开,接受有些事情会一直处于损坏状态。这种克制成了一种独特的人类技能。

这个Hacker News帖子讨论了“知道的诅咒”——程序员倾向于不断修复现有系统中感知到的缺陷。它探讨了无限改进事物的满足感和陷阱,这往往源于对控制的渴望或情绪调节。评论者们都感同身受,体会到了重写软件的冲动、修复损坏技术的责任感,以及在完美主义和实用主义之间取得平衡的挑战。他们讨论了最终完成的幻觉,了解何时“放任其损坏”的重要性,以及过度负责如何导致倦怠。该帖子还涉及到变化的环境和依赖性对软件寿命的影响。一些人建议专注于个人价值观并学会优先考虑,而另一些人则找到了应对机制,例如拥有其他爱好或家庭。讨论最终强调了自我意识的重要性,以及需要在修复一切的冲动与健康的接纳之间取得平衡。

原文

It starts innocently.

You rename a batch of files with a ten-line Python script, or you alias a common git command to shave off two keystrokes. Maybe you build a small shell function to format JSON from the clipboard.

You’re not even trying to be clever. You’re just solving tiny problems. Making the machine do what it should have done in the first place. And then something happens. You cross a threshold. You look at your tools, your environment, your operating system—even your editor—and suddenly everything is fair game.

You could rebuild that (if you wanted to).
You could improve that (if you wanted to).

Then someone challenges you. As banter maybe, perhaps jokingly but also with a dash of hope. Then the air in the room changes.

It suddenly becomes something else. It becomes:

You should.

And from that moment forward, the world is broken in new and specific ways that only you can see.

Technical Capability as a Moral Weight

Before I could program, broken software was frustrating but ignorable. For years I’ve simply “used” a computer, as a consumer. I was what companies were concerned with tricking into buying their products, or subscribing to their services. Not the technical geek that they prefer to avoid with their software releases, or banning from their games based on an OS.

Now it has become provocative. I can see the patterns that I wish I couldn’t, find oversights that I can attribute to a certain understanding (or the lack thereof) of a certain concept and I can hear what has been echoing in the head of the computer illiterate person who conjured the program I have to debug.

I notice flaws like a good surgeon notices a limp.
Why the hell does this site send ten megabytes of JavaScript for a static page?
Why is the CLI output not parseable by awk?
Why is this config hardcoded when it could be declarative?

Those things are not just questions, they are accusations. And, unfortunately, they do not stop.

Now that I’ve learned to notice, my perception of software has changed in its entirety.

Every piece of software becomes a TODO list.
Every system becomes a scaffolding for a better one.
Every inconvenience becomes an indictment of inaction.

One Must Imagine Sisyphus Happy

Like Camus’ Sisyphus, we are condemned to push the boulder of our own systems uphill—one fix, one refactor, one script at a time. But unlike the story of Sisyphus, the curse is not placed onto you by some god. We built the boulder ourselves. And we keep polishing it on the way up.

I’ve lost count of how many projects I have started that began with some variation of “Yeah, I could build this but better.”

  • A static site generator because the existing ones had too many opinions.
  • A note-taking tool because I didn’t like the way others structured metadata.
  • A CLI task runner because Make is cryptic and Taskfile is YAML hell.
  • A personal wiki engine in Rust, then in Go, then in Nim, then back to Markdown.
  • A homelab dashboard because I don’t like webslop.

The list continues, and trust me it does continue. My dev directory, as it stands, is nearing 30 gigabytes.

If you ask me, I was solving real, innocent problems. But in hindsight, I was also feeding something else: a compulsion to assert control. Every new tool I built was a sandbox I owned: No weird bugs. No legacy constraints. No decisions I didn’t entirely agree with. Until, of course, I became the legacy.

Kafka once wrote that “a cage went in search of a bird.” 1 That is what these projects can become. Empty systems we keep building, waiting for purpose, for clarity, for… salvation? I’m not sure how else would you call this pursuit.

Entropy Is Undefeated

Now let’s go back. Back to when we didn’t know better.

Software doesn’t stay solved. Every solution you write starts to rot the moment it exists. Not now, not later, but eventually. Libraries deprecate. APIs change. Performance regressions creep in. Your once-perfect tool breaks silently because libfoo.so is now libfoo.so.2. 2

I have had scripts silently fail because a website changed its HTML layout.
I have had configuration formats break because of upstream version bumps.
I have had Docker containers die because Alpine Linux rotated a mirror URL.

In each case, the immediate emotional response was not just inconvenience but something that moreso resembles guilt. I built this, and I do know better. How could I not have foreseen this? Time to fix it.

If you replace every part of the system over time, is it still the same tool? Does it still serve the same purpose? Do you?

The Illusion of Finality

I think we lie to ourselves.

“If I just get this setup right, I’ll never have to touch it again."
"If I just write this one tool, my workflow will be seamless."
"If I automate this, I’ll save time forever.” 3
“Write once, run everywhere.” My ass.

It is, I admit, a seductive lie. It frames programming as a conquest of sorts. A series of battles you win, or challenges you complete. But the imaginary war never ends. You don’t build a castle. You dig trenches. And they flood every time it rains. The trials are never complete.

Technical Work as Emotional Regulation

On the theme of filling this post with literary references, let me quote the Stoic Marcus Aurelius.

You have power over your mind—not outside events. Realize this, and you will find strength.

But programming lures us into believing we can control the outside events. That is where the suffering begins. There is something deeper happening here. This is not just about software.

I believe sometimes building things is how we self-soothe. We write a new tool or a script because we are in a desperate need for a small victory. We write a new tool because we are overwhelmed. Refactor it, not because the code is messy, but your life is. We chase the perfect system because it gives us something to hold onto when everything else is spinning. This is the lesson I’ve taken from using NixOS.

I have written entire applications just to avoid thinking about why I was unhappy. Programming gives you instant feedback. You run the thing, and it works. Or it doesn’t, and you fix it. Either way, you’re doing something.

That kind of agency is addictive. Especially when the rest of life doesn’t offer it. We program because we can, even when we shouldn’t. Because at least it gives us something to rebel against.

The Burnout You Don’t See Coming

Burnout doesn not just come from overwork. It comes from overresponsibility.

And programming, once internalized deeply enough, makes everything feel like your responsibility. The bloated website. The inefficient script. The clunky onboarding process at your job. You could fix it. So why aren’t you?

The truth you are very well aware of is that you can’t fix it all. You know this, you always knew it regardless of your level of skill. But try telling that to the part of your brain that sees every inefficiency as a moral failing.

Nietzsche warned of gazing too long into the abyss. But he didn not warn what happens when the abyss is a Makefile or a 30k line of code Typescript project.

Learning to Let Go

So where is the exit? Is this akin to Sartre’s depiction of hell, where hell is other people and how they interact with your software? Or is it some weird backwards hell where people create software that you have to interact with?

The first step is recognizing that not everything broken is yours to fix.
Not every tool needs replacing.
Not every bad experience is a call to action.

Sometimes, it’s OK to just use the thing. Sometimes it’s enough to know why it’s broken—even if you don’t fix it. Sometimes the most disciplined thing you can do is walk away from the problem you know how to solve. There’s a kind of strength in that.

Not apathy, no. Nor laziness. Just… some restraint.

A New Kind of Skill

What if the real skill isn’t technical mastery? Or better yet what if it’s emotional clarity?

  • Knowing which problems are worth your energy.
  • Knowing which projects are worth maintaining.
  • Knowing when you’re building to help—and when you’re building to cope.
  • Knowing when to stop.

This is what I’m trying to learn now. After the excitement. After the obsession. After the burnout. I’m trying to let things stay a little broken. Because I’ve realized I don’t want to fix everything. I just want to feel OK in a world that often isn’t. I can fix something, but not everything.


You learn how to program. You learn how to fix things. But the hardest thing you’ll ever learn is when to leave them broken.

And maybe that’s the most human skill of all.

联系我们 contact @ memedata.com