The curse of knowing how, or; fixing everything by Lunar5227
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 be
57 Comments
diwash007
nice
arlyle
we wont fix things by adding but deleting
bflesch
This resonates
Nevermark
I have spent some percentage of my life attempting to rewrite all software from first principles up.
Software is so spectacularly broken. Applications that don’t let me adjust the position of a little button for my work habits. Why is that impossible!?! A global software and commerce system, where you can buy candy or transfer $ billions, both with cute warnings like “Please, oh, please, sir! Please don’t hit the back button!”
I can sum up the results of my quest quite simply: “The rewrites continue…”
Is this chasing windmills? The case for that seems solid on the surface, but…
It is true that every rewrite of a specific set of features, or a platform for enabling better support for efficiently and correctly commingling an open class of features, inevitably runs into trouble. Some early design choice is now evidently crippling. Some aspect can now be seen to have two incompatible implementations colliding and setting off an unnecessary complexity explosion. Etc.
But on the other hand, virtually every major rewrite points to a genuinely much improved sequel. Whose dikes keeping out unnecessary complexity hold up longer with less finger holes to plug, for a better return. Before its collapse.
Since there must be a simplest way to do things, at least in any scoped area, we have Lyapunov conditions:
Continual improvement with a guaranteed destination. A casual proof there is a solution.
It’s a dangerous phantom to pursue!
——
It would be interesting to compile a list from the heady 90’s, when corporations created boondoggles like Pink and Cyberdog, and had higher aspirations for things like “Object Linking and Embedding”.
You just don’t see as many romantic technological catastrophes like those anymore. I miss them!
throwanem
Welcome to your thirties!
esjeon
> Knowing which problems are worth your energy.
This, but with proper balance. TBH, you can live a happy life if you just stop caring about every technical problem, but that would make you unimaginative and passive. Just make sure your pick a hole (or two) you're gonna die in.
maephisto666
Amazing piece of text. Honestly, I saw myself in everything you wrote. The struggle, the attempt to write a single line of code to make it perfect, durable, etc. it never works at the first try…but man the joy of having the control over fixing things… And I also relate with the personal chaos that maybe we tend to fix by fixing our software… I see a lot of this "unfinished" behaviour with other things in my life as well… Cleaning the shed, finishing videogames…. Sometimes even the feeling of having the challenge is enough…I don't even try, because I know it will take time to make it right
abhisek
So true. I have tried building from scratch so many times for specific use-cases with my own opinionated experience only to recreate the bloat over time. That’s actually good. The alternative was building something based on momentary spark of creativity that no one, not even me end up using.
abstractspoon
Can't disagree with any of that
atoav
Some truth in there, but I have to admit that most simple static generators I have written I wrote out of fun and curiosity and not because I thought all existing ones had flaws (even if they did).
It is okay to do things and abandon them later, that is how we learn. We programmers are multipliers, which gives us special responsibility. If we create a shit tool with a shit workflow that wastes time, we waste time multiplied by the number of users of our software. If we save time or bring joy, the same is true. That can be beautiful and devastating.
But every software needs to be maintained somehow and maintainability is a technological choice as well. I have an embedded project running for well over a decade without a single maintenance step of either the hard- or the software. I could have built that project also with more dependencies to the outside world, or in more sophisticated ways with more moving parts, but I wanted to not deal with the consequences of that. This choice isn't always easy, but it is a choice. Ask your sysadmin which things worked for the past decades without having to touch them and investigate. Typically it is boring tech with boring choices.
Another aspect the article does not tackle is that if you know to repair or build many things, people will naturally also come to you asking you to do precisely that. But that again produces maintenance work and responsibility. This is why I like working in education, you can show people how to do it and then it is their project.
Melkaz
I'm seeing myself in the text, but one aspect that doesn't seem to be covered enough is the ego.
I find joy in receiving praise from my colleagues when they have good experiences with my tools.
dmichulke
Wow, great piece.
We are playing software factorio and the winning move is not to play.
EZ-E
There is the curse of knowing how, and maybe more importantly there is the curse of other people knowing you know how.
walterbell
> I can fix something, but not everything.
ajuc
Great article. I know it's not the main subject, but I really liked this part:
> Technical Work as Emotional Regulation
Men are taught to do that in most societies. You are unhappy – don't bother talking about it (men don't cry), do sth for the society – you'll receive praise in return and your pain will go away for a while. Even if nobody'll praise you – you'll think better of yourself. Same thing that makes our fathers obsessively fix any minor inconveniences around the house instead of going to the doctor with their big health problem.
Men often laugh at women talking for hours instead of fixing the damn problem (and it is frustrating to observe). But we often do not fix THE damn problem either – we fix other unrelated problems to feel better about the one we fear thinking about.
What's more tech-specific IMO is the degree to which our egos are propped by our code. Code is the one thing many programmers had going for them when they grew up. It's what made them special. It's what was supposed to pay for all the bullying in school. It's what paid their bills and made them respected. It's very hard not to make code your main source of value.
People praise "ego-less" programming, and most programmers adhere to the rules (don't get overly defensive, take criticism, allow others to change "your" code, etc.) But that's not actually ego-less programming, it's just hidding your ego in the closet and suffering in silence.
If you procrastinate when programming – it's because you feel your code reflects on your worth as a human being. It's all ego. Changing what you do won't change that. You need to change what you think.
arjvik
These days, knowing that instead of spending hours artfully crafting a solution to something, GPT could code up a far-less-elegant-but-still-working solution in about 5-10 minutes of prompting has all but solved this.
nyanpasu64
There's a… sad comparison of this article about over-responsibility, and https://www.benkuhn.net/blub/ about the value of learning about the stack you use (the more you know about the workings of bugs, sometimes the more they gnaw at you).
d4rkn0d3z
I think about this from the perpective of change management. Every defect I hope to fix entails a change, which has a certain probability of creating another irksome deficiency or incompatibility. When building complex systems I try to design them with the end state, that you describe very well, in mind.
Each time you set about to make a single change ask what is the probability (p) that this change results in another change, or track this probability empirically, then compute 1/(1-p) this will tell you how much change you should "expect" to make to realize your desired improvement. If you have n interacting modules compute 1/(1-np). This will quantify whether or not to embark on the refactor. (The values computed are the sum of the geometric series in the probability which represents the expectation value)
So this is about how we manage change in a complex system in order to align its functionality with a changing environment. I suggest that we can do so by considering the smallest, seemingly innocuous change that you could make and how that change propagates through to the end product.
In the end, a solution may be to make systems that are easy and painless to change, then you can change them often for the better without the long tail effects that drag you down.
figassis
I too suffer from this, but as I learned, Nature built an elegant solution to this. Have a family and kids. Your choice when you have time off of work will be reduced to hacking or playing with your child that you have been neglecting due to a crunch at work.
You’re welcome.
pmkary
This was something I really enjoyed reading, having suffered greatly from the same conditions. It made me realize I’m not alone, and for that I hugely thank you, and everyone else in this thread who commented.
Barbing
raf: from grins to smirks, thank you for repeatedly putting the smiles on my face. You know me so well considering we’ve never met. Ever so salient; thanks for (hopefully) course correcting any of my remaining years :)
mgaunard
Letting go means stopping to care. That's a slippery slope to coasting.
kookamamie
It's good to remember it's a marathon, not a sprint and that everything rots over time.
daliboru
I see a similar issue in 2025, but with vibe coding.
It all boils down to the 3 key factors: speed, quality and cost. And you can't have it all
Know your trade-offs.
foobahhhhh
Glad I'm low enough on the bell curve to not have this problem. If a tool is broken I shrug. Maybe someone will fix it
erulabs
Software engineers, I love yall. To see the light at the end of the tunnel. To see some glorious perfect paradigm that maybe could be. I envy you.
I grew up in a datacenter. Leaky air conditioners and diesel generators. Open the big doors if it gets too hot.
Everything, everywhere, is greasy and lousy and half broken. Sysadmins, we accept that everything is shit from the very beginning.
sapht
I'm compulsively drafting ideas along these same lines, but now I don't need to fix that. Wonderful, brilliant text, thank you raf.
anthk
Well, with OpenBSD:
– Updates often don't break things
– Remind for notes
– Gopher as my main site
– Multimarkdown+git for a wiki
– A web/blog without RSS is not worth your time
– Nvi can be good enough against vim, entr+make do magic
– mbsync/msmtp/slrnpull and so work in batch mode, fire mutt and forget
I don't hack my tools any more. I don't distrohop. CWM, XTerm, MuPDF, GV and friends like Bitlbee do everything well since years. Now I'm focusing in Forth, because in a near future low power microcontrollers and laptop will say a thing or two.
thewisenerd
https://archive.is/2xEGK
PixelForg
Hopefully the future me is able to relate to this, because I really feel like I'm in a rut when it comes to working on personal projects.
I have many ideas that I want to build, but I'd have to learn new languages, yet I just can't sit and go through the documentation every day like I should. Still haven't finished the rust book.
The other way is start building already, and if you come across a block, then learn about that thing and move on, but I feel uncomfortable having gaps in my knowledge, AI exists but I don't want to use it to generate code for me because I wanna enjoy the process of writing code rather than just reviewing code.
Basically I'm just stuck within the constraints I put for myself :(, I'm not sure why I wrote this here, probably just wanted to let it out..
throw_away_0613
As I'm getting older, I want things to be as standardized as possible, and just don't worry about the details. I have learned from my mistakes
The script I made for deployment, because existing solutions didn't "feel" right, required a lot of work and maintenance when we later had to add features and bug fixes.
Another script I made for building and deploying Java applications, because I didn't like Maven and Puppet.
The micro service I rewrote because I wanted to use my own favourite programming language. I introduced a lot of bugs that were already fixed, missing features and another language for my co-workers to learn when they inherited the application when I left.
GardenLetter27
This is well-written. I think LLMs can help a bit here too – the other day I was watching a rare, old film with my wife and the subtitles kept de-syncing. I.e. the frame-rate was slightly different as well as a fixed offset.
So I explained it to Claude and made it write a Python script where I could manually set a few fixed times and it would adjust the SRT file, and it worked perfectly.
I literally paused the film and did that in under 5 minutes. It was amazing.
So fixing a lot of small things has become easier at least.
lightyrs
Having kids is an excellent solution to this feeling.
Besides occupying any time you used to have for unnecessary work, they have an uncanny ability to remind you just how little you actually control.
However you get to the end of the OCD tunnel, the journey is often very worthwhile.
howtofly
Serious software development is rarely an individual endeavor; most issues should be resolved through collaboration. In other words, they should be addressed through management. What the author needs to overcome, in my view, is essentially a form of extreme individualism.
davnicwil
Fractal complexity.
It's not only that solutions decay, though that's true, but also that the search for improvement itself becomes recursive.
When you identify something can be improved, and fix it, your own fix and every individual step of it now become the new thing that can be improved. After the most fleeting of pauses to step back and appreciate your work, this becomes your new default.
Indeed I often look back at my own solutions and judge them more harshly than I would ever judge anyone else's. Why? Because as the article says, I know much more about how it works. Cracks increase surface area by a lot. I know about a lot of the cracks.
I wrote a blog post [0] about this mindset getting in the way of what you care about in product development which you might enjoy, if you enjoyed this article.
[0] https://davnicwil.com/just-build-the-product/
brador
The next step is burn out, then keeping everything default and just living with it. I know of no steps after this.
A_Stefan
Thank you for sharing your personal journey. I too have (too) many ideas floating around, getting ready to fix everything I see broken, ignoring what's really important. So I whole-heartedly agree with "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."
moconnor
> I believe sometimes building things is how we self-soothe.
> I have written entire applications just to avoid thinking about why I was unhappy.
I think this is true too. The prefrontal cortex is inhibitory to the amygdala/limbic system; always having a project you can think about or work on as an unconscious learned adaptation to self-calm in persistent emotionally-stressful situations is very plausible.
I wonder how many of us became very good at programming ~through this – difficult emotional circumstances driving an intense focus on endless logical reasoning problems in every spare moment for a very long time. I wonder if you can measure a degree of HPA-axis deregulation compared to the general population.
And whether it's net good or net harmful. To the extent that it distracts you from actually solving or changing a situation that is making you emotionally unhappy, probably not great. But being born into a time in which the side effects make you rich was pretty cool.
metalman
This is very amusing, and evocative of what creative makers go through in many other fields….and as an do it my self absolutist, got me mired in attempts to pick up programing as another side gig/hussle in a life that is wildly over subscribed.
So reluctantly I am letting go of a bunch of stuff that lingers, Presque vu skills, always almost, and never enough time to push up and over.
The bonus is that I have focused on things that I did level up on, and can now do with ease, and a bit of flare……and perhaps more importantly give others a bit of joy to watch and see, "hey! that doesn't look so hard now!"
One of the things I picked up.along the way was, audio engineering, live and studio sound, where when it kicks in, it's pure misery, and every mistake and buzz, ruins all music listening, fingers twitching for sliders that are not there, griping like a back seat driver…..the better the stereo, the worse the experience, especialy with heavily produced studio work…..at least with live recordings, all the mistakes are honest and oten the recovery is where the magic happens.
dusted
This resonates a lot with a thought that I've had for a long time..
A computer is not a tool, it never was, it never will be..
It's a workshop.
pknerd
The site is down
codelikeawolf
> 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 really got to me because I've been doing this without realizing it for as long as I can remember.
smallflykkoo
[dead]
dandellion
I really can relate with the article. Also, it doesn't just apply to software but to lots of other things. It's the same mentality as being into cars and always tuning or restoring old ones. Being into woodworking or craftsmanship and fixing and building stuff around the house, etc.
jeffreygoesto
/.ed :(
sylware
"SSL error"…
naabb
Anyone else unable to access the site? I get a connection refused.
mrheosuper
My most useful hobby project is the one i just "hack and find out".
I make a matrix led clock that can sync time through network, using Arduino and esp32. Due to time constraint, the coding standard is horrible(magic number, dynamic allocation, no abstraction between module, etc), but hey, it works, at least for 7 years now. The code took me 3 days to finish, and i would never write such code in production FW.
There is a bug that may makes it unable to connect network, but it can be fixed by turning off then on again, i never bother to debug or patch it.
Perfect is the enemy of good.
shiandow
https://archive.ph/2xEGK
manduz
[dead]
mentalgear
Link is broken, maybe someone has a backup archive.
dc96
Link is down. Archive link: https://web.archive.org/web/20250506062631/https://notashelf…
z3t4
Modern software is like sand castles, you can go there every day to maintain it, but one day it will be completely washed away. Everything that is beautiful will start to rot. After something have reached perfection it will change or die. It doesn't have to be that way though, you can put the OS in a virtual machine, so every time you work on your beautiful software it will feel like you are carving rune stones.
ferguess_k
I believe after a certain age the most valuable skill is know how to remove things from your life instead of piling things up. Things that other people believe to be so crucial that your action of removing them from your life is going to offend them.
thedanbob
I used to never finish personal projects. Then I realized that the biggest thing preventing me from finishing them was (perversely) my sense of duty to get them finished. Once I decided that I was under no obligation to anyone to work on them, not even myself, I had no trouble finding the motivation to get them done. So now side projects are a strictly "just for fun" affair. I work on them when I feel like, no deadlines, and once they're "in production" I maintain them because I like tinkering.
The only problem with this approach is I've gone from hating the thought of programming after work to coming up with side projects at work.
bobrobpr
It's like you went inside my brain and heart and divulged my feelings. Well done! Now, back to feeling worthless.
napolux
It's funny how it's returning a 503 :(