The curse of knowing how, or; fixing everything
notashelf.dev
notashelf.dev
For example, as an actor, you learn your lines by rote (they become habit), then you gain an understanding of the character's motivations (remembering the lines becomes easy, because of course that's what your character would say), then you work to tune your performance so the audience shares in the emotion and unspoken meaning of the lines (that's beautiful/art).
As this relates to software, I think it goes something like: you learn the magic incantation to make the computer do what you want (solving a hard task becomes habit), then you learn why that incantation works (solving it becomes easy), then you figure out better ways to solve the problem, such that the original friction can be removed completely (you find a more beautiful way to solve it).
I've come to a less pleasant way of putting a similar workflow. If something hurts(in the sense that you dread doing it, even though it needs to be done), make it hurt as much as possible and keep doing it until it doesn't. Along the way you'll find the ways to make it easier, faster, more efficient, etc but if you put it off every time until you can find the fortitude to embrace the suck then it's never going to get noticeably better.
Most of the time this is business process related, especially when inheriting legacy systems. Ideal outcome is that you understand it enough after really digging into it to cut out or replace entire swathes of the processes without losing confidence that it will continue to operate smoothly.
Paraphrasing a virtuous music band reflecting on their discography: "the first album was about what we could; the second one was about what we should"
It also aligns with Gell's philosophy of art. Here's a wikipedia exerpt:
> Gell argues that art in general acts on its users, i.e. achieves agency, through a sort of technical virtuosity. Art can enchant the viewer, who is always a blind viewer, because "the technology of enchantment is founded on the enchantment of technology"
Funny enough, when you apply this to software it becomes the pejorative "second system syndrome" (Brooks, 1975)
In a similar context, Bruce Lee said about martial arts that "martial" is to discover the dangerous animal within us, and the "art" is to be able to tame that animal.
I'm assuming (hoping?) that this was supposed to be "tame"? If not, I've got some questions about Bruce Lee.
Also known as "Make it work, make it right, make it fast"
Here's my personal submission for "UI problem that has existed for years on touch interfaces, plus a possible solution, but at this point I'm just shouting into the void":
https://medium.com/@pmarreck/the-most-annoying-ui-problem-r3...
In short, an interface should not be interactable until a few milliseconds after it has finished (re)rendering, or especially, while it is still in the midst of reflowing or repopulating itself in realtime, or still sliding into view, etc.
Most frustratingly this happens when I accidentally fat-finger a notification that literally just slid down from the top when I went to click a UI element in that vicinity, which then causes me to also lose the notification (since iOS doesn't have a "recently dismissed notifications" UI)
This happened to my just the other day; I was purchasing something online with a slightly complicated process, from my mobile, I didn't want to f* up the process, and I was tapping occasionally to keep the screen awake while it was doing "stuff"; needless to say, something popped up, too fast for me to react, I have no idea which button I tapped if any, or if I just dismissed it, to this day no idea what it wanted but I know it was related to the payment process.
I've seen this solved in dialogs/modals with a delay on the dismiss button, but rarely; it would also make sense to delay a modal/dialog of some kind by a couple hundred milliseconds to give you time to react, particularly if tapping outside of it would dismiss it.
I find myself using Notification History on Android more and more often, but a lot of the time it's not even notifications, it's some in-app thing that's totally within the developer's control.
iOS does not!
You're not going to be able to do it. They're not on facebook, you can't just link to the video, you're going to hold the phone carefully but the bared fraction of their palm will register with the screen, or the page will refresh, or the screen (now 27 feet deep in the doomscroll) will scroll all the way to the top of the screen.
And you'll end every iMessage with a b. b
The one I don't quite know how to solve is when I'm tapping a device to connect to -- whether a WiFi router or an AirPlay speaker or whatever -- and I swear to god, half the time my intended device slides out from under me a newly discovered device enters above and pushes it down. Or sometimes devices disappear and pull it up. Maybe it's because I live in an apartment building with lots of devices.
I've seen this solved in prototypes by always adding new devices at the bottom, and graying out when one disappears, with a floating "resort" button so you can find what you're looking for alphabetically. But it's so clunky -- nobody wants a resort button. And you can't use a UX delay on every update or you'd never be able to tap anything at all for the first five seconds.
Maybe ensuring there's always 3 seconds of no changes, then gray out everything for 0.5 seconds while sliding in all new devices discovered from the past 3.5 seconds, then re-enabling? I've never seen anything like that attempted.
Just as I’m about to tap it, the other person ends the call and what I’m actually tapping is some other person on my call list that it then immediately calls. Even if I end the call quickly they often call back confused “You called, what did you want?”
Apple: PLEASE add a delay to touch input after the call screen closes.
It seems like a super easy fix.
(Honestly, I'm sort of with you on the medium thing, but I posted this years ago now...)
https://scribe.rip/@pmarreck/the-most-annoying-ui-problem-r3...
I consider UBO basically mandatory for browsing the web in 2025, too many sites are unusable and infuriating without it.
This also happens where sometimes the hotbar has three buttons, and sometimes four, and the worst apps are when buttons switch ordinal positions depending on if there are three or four buttons in there.
It feels very strange to get so agitated by these small behaviors, but here we are.
this has happened to me and i even clicked on the ad. It actually made me smile a little bit and reminded me of the "clever girl" scene in Jurassic Park.
> or worse, an ad has taken the place of the button
That's actually a dark pattern/perverse incentive I hint at towards the end of my blog post about it.
If an update is required, rather than just desired, freeze all input so the user knows it's about to update, this might be accompanied by a quick 'fade' or other color shift to indicate an update is about to be pushed and they should release and re-plan actions.
I was a console game developer working on UI for many years so I am deeply familiar with the problem when a UI should be responsive to input while the visuals are changing and when it should not.
You might be surprised, but it turns out that blocking input for a while until the UI settles down is not what you want.
Yes, in cases where the UI is transitioning to an unfamiliar state, the input has a good chance to be useless or incorrect and would be better dropped on the floor. It's annoying when you think you're going to click X but the UI changes to stick Y under your finger instead.
However, there are times where you're tapping on a familiar app whose flow you know intimately and you know exactly where Y is about to appear and you want to tap on it as fast as you can. In those cases, it is absolutely infuriating if the app simply ignores your input and forces you to tap again.
I've watched users use software that temporarily disables input like this and what you see is that they either get trained to learn the input delay and time their tap as tightly as possible, or they just get annoying and hammer inputs until it gets processed.
And, in practice, it turns out these latter times where a user is interacting with a familiar UI are 100x more common than when they misclick on an unfamiliar UI. So while the latter case is super annoying, it's a better experience in aggregate if the app is as responsive as it can be, as quickly as it can be.
Perhaps there is a third way where an app makes a distinction between flows to static context versus dynamically generated content and only puts an input block in for the latter, but I expect the line between "static" and "dynamic" is too fuzzy. People certainly learn to rely on familiar auto-complete suggestions.
UI is hard. A box of silicon to a great ape is not an easy connection to engineer.
I’m specifically thinking about phone notifications that slide in from the top – ie, from an app other than the one you’re using.
So we have two options: ignore taps on these notification banners for ~200ms after the slide-down (risking a ‘failed tap’) or don’t (risking a ‘mis-tap’).
I’d argue these are in different leagues of annoyingness, at least for notification banners, so their relative frequency difference is somewhat beside the point. A ‘failed tap’ is an annoying moment of friction - you have to wait and tap it again, which is jarring. Whereas a ‘mis-tap’ can sometimes force you to drop what you were doing and switch contexts - eg because you have now cleared the notification which would have served as a to-do, or because you’ve now marked someone’s message as read and risk appearing rude if you don’t reply immediately. Or sometimes even worse things than that.
So I would argue that even if it’s 100x less common, an mis-tap can be 1000x worse of an experience. (Take these numbers with a pinch of salt, obviously.)
Also, I’d argue a ‘failed tap’ in a power user workflow is not actually something that gets repeated that many times, as in those situations the user gets to learn (after a few jarring halts) to wait a beat before tapping.
All that said, this is all just theory, and if Apple actually implemented this for iOS notifications then it’s always possible I might change my view after trying it! In practice, I have added these post-rendering interactivity periods to UI elements myself a few times, and have found it always needs to be finely tuned to each case. UI is hard, as you say.
But when the system initiates it (eg. notifications, popups), then the prior interface remains active.
There's this paper studying this, and I think more work on it too.. https://dl.acm.org/doi/full/10.1145/3660338
I also considered the case when you're rapidly scrolling through a page- if a naive approach simply made things non-interactable if they've recently moved, that would neuter re-scrolling until the scrolling halted, which is NOT what people want
This is very true, but the app has to be explicitly designed around this e.g. by not injecting random UI elements that can affect the layout.
Unfortunately this seems to be regressing in modern app UX, and not just on mobile. For example, for a very long time, the taskbar in Windows was predictable in this sense because e.g. the Start button is always in the corner, followed by the apps that you've pinned always being in the same locations. And then Win11 comes and changes taskbar layout to be centered by default instead of left-adjusted - which means that, as new apps get launched and their icons added to taskbar, the existing icons shift around to keep the whole thing centered. Who thought this was a good idea? What metric are they using to measure how good their UX is?
> However, there are times where you're tapping on a familiar app whose flow you know intimately and you know exactly where Y is about to appear and you want to tap on it as fast as you can. In those cases, it is absolutely infuriating if the app simply ignores your input and forces you to tap again.
I agree with both of these, but I think that such a thing would work better with keyboard-oriented interfaces. However, when using a mouse or touch-screen, these are still good ideas anyways, although the situations where you will know and should expect what comes next is less when using the mouse, still it can be important because unexpected pop-ups etc from other programs, just as much as, when using the keyboard, pop-ups that take keyboard focus are as significant for this issue. Since this can sometimes involve multiple programs running on the same computer, that do not necessarily know each other, it cannot necessarily be solved from only the program itself. (I think that it will be another thing to consider in the UI of my operating system design.)
To the original author's point, the consternation arises when you as a programmer just know there is an animation time, or a delay time, etc. that is hardcoded into the app and you can't adjust the value. The lack of interface and inability to have that exposed to the user is at least one major frustration that could help OP.
Open a tool window, subsequent keystrokes should be sent to that too window, even if it takes a second to show. The "new/modern" interface on my CNC is both show and doesn't properly buffer input, and its hugely painful.
EDIT: I realize you specified touch, which isn't "desktop", but my CNC control is touch based and the same applies.
Since you can't go back in-time, what I suggest to arrange for the event (if it occurs slightly after the redraw) to be applied using the old display model (instead of dropped). If the redraw occurs slightly after the event (and you're right) I'd prefer delaying the redraw instead of delaying the tap.
I think a interface shouldn't be even visible, if the elements will be jumping around until they are done validating and loading.
And should an interface be interactable for a few milliseconds longer, after it has disappeared?
In the latter case, you could quietly disable buttons after a layout shift, but this can cause problems when users attempt to interact with an onscreen element only to have it mysteriously ignore them. You could visually indicate the disabled state for a few hundred milliseconds, but this would appear as flicker. If you want to be very clever you could pass a tap/click to the click target that was at that location a few tens/hundreds of milliseconds prior, but now you've got to pick a cutoff based on average human response times which may be too much for some and tool little for others. That also wouldn't help with non-click interactions such as simply attempting to read content -- while not as severe, trying to read a label that suddenly moves can be almost as frustrating. Some products attempt to pause layout shifts that might impact an element that the user is about to interact with, but while this is possible with a mouse cursor to indicate intent it can be harder to predict on mobile.
Some of these ideas are even used in cases where a layout shift is necessary such as in a livestream with interactive elements. However, the general consensus is to use content placeholders for late-loading content and avoid rendering visible elements, especially interactive ones, until you have high confidence that they will not continue to move. That's why most browsers provide penalties for websites with "cumulative layout shift", e.g. see https://web.dev/articles/cls
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..
I've written a lot of Rust. I've read less than half of the Rust book. Your competence in Rust is a function of how many lines of Rust you've written; getting to the point you can start working with it is more important than completing the book. Jon Gjengset's videos were really critical for me there, seeing how he worked in Rust made it possible for me to develop a workflow. (I broke down what I learned in more detail at one point [1].)
Rust is an example I've honed in on because you mentioned it and I related to it, but this is broadly applicable. Dare I say, more broadly than just programming, even.
(Also, note that I'm a giant hypocrite who shaves yaks and struggles with perfectionism constantly. I learned Rust 5 years ago to start a project, and I've written 0 lines of code for it. If I sound critical, that's my self criticism leaking through.)
The discomfort of having gaps in your knowledge is not a flaw. It’s a sign of integrity. But perfectionism disguised as discipline can become a cage. You’re not stuck because you lack ability — you’re stuck because you’ve built a narrow path and called it the only way forward.
There is another way: give yourself permission. To build messy. To learn sideways. To follow joy, not obligation. To trust that your curiosity is enough.
You wrote this here because something in you is ready to shift. You’re not asking for advice. You’re asking to be seen. And you are.
I don't understand why so many people suddenly started to insist on taking this all away, and they totally seriously proposed to become a janitor of a hallucinated output of some overhyped tool. That's the most frustrating thing one can imagine about programming, yet people insist on it.
Understanding why I feel this, when I have, has always proven enlightening. I find it never has to do with the gap or what would fill it.
There is two things I validated from reading Barbara Oakley and Kató Lomb is that a) it's okay to be a slow learner b) it's okay to learn differently.
Just do your thing.
This happened to me when I was going through a similar transition as the OP is highlighting. At first, creating software was difficult and novel. Then after getting over that first learning hump, I spent a pretty long time feeling drunk on the power of being able to get computers to do exactly what I want. But familiarity breeds contempt, and eventually it felt more like "this is it?" and the pure act of creation for creation's sake lost a lot of its appeal.
I think this is a pretty common transition! For me, the path out of the doldrums is two fold: 1. I have a lot more going on in my life now that has nothing to do with computing (mostly family, but also other interests), and 2. I'm a lot more focused on what I'm creating and why it's useful than in the act of creation itself.
This almost certainly not what you want to hear, but this is why the quickly developing gen AI tools are increasingly exciting to me. I believe they open up the world of what can be created within a given time constraint. They also definitely (at least for me) make the act of creation itself less enjoyable, and I lament that. I'll probably always feel nostalgia for how I felt about the craft of programming a decade or two ago. But my perspective has just shifted from the "how" to the "what".
I heard someone say "epistemic humility" the other day to mean fallibilism [0] and the conversation got interesting when we moved on to the subject of "what one can and should reasonably claim to know". For example: should cops know the law?
Not every programmer needs to be a computer science PhD with deep knowledge about obscure data-structures... but when you encounter them it's a decision whether to find out more.
Integrity is discomfort with "hand-waving and magical" explanations of things that we gloss over. Sure, it's sometimes expedient to just accept face-value and get the job done. Other times it's kinda psychologically impossible to move forward without satisfying that need to know more.
Frighteningly, the world/society puts ever more pressure on us to just nod along to get along, and to accept magic. This is where so much goes wrong with correctness and security imho.
Why? Why, specifically, do you "have to learn new languages"?
So, sure, I can see that, for some product, you might need to learn a new tech (say ... some specific AWS/GCP/Azure service), or perhaps a new configuration language (YAML, TOML, whatever).
And, sure, for some ideas (for example a mobile phone app) you're forced into that specific ecosystem.
Other than the mobile exception above, why do you need to learn a new language to build your idea? There is nothing stopping you from implementing your idea in (for example) Python. Or Javascript. Or Java, C#, C++, etc.
A programming-language-barrier absolutely does not stop you building your idea.
You gotta make the call - are you interested in building $IDEA, or are you interested in learning $NEWLANG?
I've been there for a decade or more. It is part of my recent burn-out…
The trick is to prioritise and not care too much about too many things, to avoid the choice paralysis in choosing what to do next. Unfortunately I've not mastered that trick yet, or even come close. In fact I'm increasingly of the opinion that dropping tech projects completely, accepting that is no longer a hobby and no longer something that will ever bring me joy again in future, is the prioritisation I need to perform, so I can instead have more mental capacity for other hobbies (and, of course, commitments in life).
You are far from alone in this trap!
Once I was okay with maybe doing things wrong and just hacking things together, it really unlocked my productivity. In my case, my perfectionism ended up being an excuse to procrastinate and avoid the pain of failure, but once I was okay with failure, everything else got easier. Even if I don't know how to do something, I'm more confident that I can plow ahead and figure out how to handle unknowns later.
Momentum is a big thing as well. Once you start having bits and pieces of your idea working, you'll quickly find a way to overcome knowledge gaps because you are hugely incentivized to see more of your vision become a reality. If you don't have anything working yet, it's much harder to motivate yourself to just read up on how some tech works because it doesn't necessarily translate to something immediately working.
That’s not a bad thing - just find out which part you actually want to do
For me, it’s brought back the joy of coding and building things: I feel like I was in a rut for years before that
Also, finding people to share the stuff with helps a lot too. Even if they are personal projects, it’s nice having others to show it to, appreciate it and give feedback
Even if you need to really shoehorn a component of the system in, just make a note about it and keep building. When you're done, you can go back and focus on replacing that one piece.
My view is that you learn a lot through the process of building this way.
In my experience the best way to learn is by doing; that “uncomfortable having gaps” is there for most folks to some degree. That mild discomfort is a good indicator that you are in the growth zone, maybe you can shift your perspective to perceive it as a positive signal.
AI is also great to ask questions and accelerate the process of learning a new language, but if you’re doing this for the craft then you are free to choose the constraints and rules that make it fun.
Say, you have to use a new IDE and don't know how to use it, ask the LLM the steps to perform whether action your want to take.
The worst you can do is nothing at all.
With AI there's nothing to be ashamed of as it is "what you can dream of, you can get today". There's not much left in programming in most of the projects (that are just repeated code, output, what not over and over) after AI , tools are just too powerful today.
- Build a local storage web app that can track my responses to the Sino-Nasal Outcome Test over time to journal my ongoing issues with chronic sinusitis.
- Build a web app that grabs Northern Colorado houses for sale, presents them on a map, and lets you search and browse them, with everything being cached for use offline in local storage. The existing site, coloproperty.com, has severe issues if you are out looking at houses and have spotty Internet connectivity, it's effectively useless.
I've been developing software for 40 years, but I'm not really a frontend guy. The first one Claude Code was able to basically one-shot, and then I asked for 3-4 refinements. The second one took me probably 40 back-and-forths to get going, but eventually was a fully working prototype using Codex.
It's the difference between using hand saws and chisels and planes, and using power tools. Hand tool woodworking is an amazing craft, but the right power tools can let you build nice things quickly.
I grew up in a datacenter. Leaky air conditioners and diesel generators. Open the big doors if it gets too hot.
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.
Everything, everywhere, is greasy and lousy and half broken. Sysadmins, we accept that everything is shit from the very beginning.Then you see the real world and you think it must be because people are stupid, the bosses are pointy-haired, they don't understand, they don't value elegance, they are greedy, they etc. etc. But once you spend enough time on your own projects, and they evolve and change over the years, they turn more and more into a mess, you rewrite, you prioritize, you abandon, you revive, and you notice that it goes much deeper than simply laziness. Real solutions depend on context, one caching algo is good when one medium is x times faster than another, but not when it's only y times faster. It makes sense to show a progress bar when downloading a file if the usual internet speed is X but not when it's Y. Over years and decades the context can shift, and even those things can change that were only silent assumptions of yours when you made the "perfect" program as a young'un, looking down on all the existing "messy" solutions that do a bunch of unnecessary cruft. It's an endless cycle...
I don't really agree with this. Yes, it gets outdated quickly and breaks often if you build it in such a way that it relies on many external services.
Stuff like relying on "number-is-odd" NPM package instead of copy-pasting the code or implementing it yourself. The more dependencies you have, the more likely it will break.
If your software works locally, without requiring an internet connection, it will work almost forever.
Now, if you want to keep developing the software and build it over a long period, the secret is to always keep all dependencies up-to-date. Is there a ExternalLibrary V2 just released? Instead of postponing the migration, update your code and migrate ASAP. The later you do it, the harder the migration will be.
There are certainly horizontal slices of every stack that can be written to remain stable regardless of the direction the business takes, but those are rarely the revenue drivers that the business cares about beyond how much they have the potential to cause instability.
So - your HelloWorld written 10 years ago suddenly stopped working after CPU you run it on got too fast.
> ExternalLibrary V2 just released? Instead of postponing the migration, update your code and migrate ASAP. The later you do it, the harder the migration will be.
Is, to me, almost the same sentence as
> Every solution you write starts to rot the moment it exists
This doesn't mean we shouldn't try to make it as good as we can, but rather that we must accept that the outcome will be flawed and that, despite our best intentions, it will show its sharp edges the next time we come to work on it.
Kublai Khan does not necessarily believe everything Marco Polo says when he describes the cities visited on his expeditions, but the emperor of the Tartars does continue listening to the young Venetian with greater attention and curiosity than he shows any other messenger or explorer of his. In the lives of emperors there is a moment which follows pride in the boundless extension of the territories we have conquered, and the melancholy and relief of knowing we shall soon give up any thought of knowing and understanding them. There is a sense of emptiness that comes over us at evening, with the odor of the elephants after the rain and the sandalwood ashes growing cold in the braziers, a dizziness that makes rivers and mountains tremble on the fallow curves of lhe planispheres where they are portrayed, and rolls up, one after the other, the despatches announcing to us the collapse of the last enemy troops, from defeat to defeat, and flakes the wax of the seals of obscure kings who beseech our armies' protection, offering in exchange annual tributes of precious metals, tanned hides, and tortoise shell. It is the desperate moment when we discover that this empire, which had seemed to us the sum of all wonders, is an endless, formless ruin, that corruption's gangrene has spread too far to be healed by our scepter, that the triumph over enemy sovereigns has made us the heirs of their long undoing. Only in Marco Polo's accounts was Kublai Khan able to discern, through the walls and towers destined to crumble, the tracery of a pattern so subtle it could escape the termites' gnawing.
However, like every other solution built by Nature, this one also works through pain, suffering and death. Nature doesn't care if you're happy, nor does it care if you're suffering. And it especially doesn't care if your suffering is a low-burn, long-term pain in the depth of your heart.
So yeah, having kids will force you to make choices and abandon frivolities, in the same way setting your house on fire will free you from obsessing over choices for unnecessary expenses :).
My free time is to be spent on other things, I get paid to fix issues and that pays my bills, I don't want nor need to be thinking about these issues outside of paid hours, you know too much to the point where you know how much effort it will take to fix something that might look innocuous, innocent, but definitely has deep tendrils of other related issues to tackle. It's not worth it, not if I'm not being paid for it or it isn't part of a personal project I'm really passionate about.
So I learnt to not care much, I help my colleagues, deliver what I tell I will deliver, and free space in my mind to pursue other more interesting stuff to me.
But then I look at my son, and say "screw it, they couldnt pay me enough to care out of hours and give up play time"
I, for example, would perhaps not be a bad parent, but very likely at least one who does not obey the social expectations of how to raise a child.
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.
I also think there is a profoundly non-linear relationship (I don't want to say negative-exponential, but it could be), between:
- The number of lines of code, or distinct configuration changes, you make to the defaults of an off-the-shelf tool
- The cognitive and practical load maintaining that personalized setup
I'm convinced that the opportunity cost of not using default configurations is significantly higher than we estimate, especially when that environment has to be shared across multiple people.
(It's unavoidable or even desirable in many cases of course, but so often we just reinvent hexagonal wheels.)
It is a rare and wise insight which only becomes crystal clear with age. Choose your battles very carefully.
This is a golden nugget up there with "time flies". I never understood that as a kid but really hits hard with your mid-life crisis.
Listen carefully little grasshoppers.
What I always find comedic, is that the rate I can do work is rarely gated by how fast I can interface with a computer. Even if I had a perfect brain/computer interface I think my productivity would maybe increase by 5-10%.
What is a real force multiplier is working on the RIGHT THING, not tweaking your vimrc config for the 50th time or creating your own build system because you are tired of Makefiles.
I use this really annoying, poorly supported terraform provider. I've written a wrapper around it to make it "work" but it has annoyances I know I can go to that repository and try to submit a patch for it to fix my annoyance. But why? This is "good enough," and IME, if you sit on things like this long enough, eventually someone else comes along and does it. Is that a good attitude for everyone to have? Probably not, but now it's been a few years of using this wrapper module, I have 2-3 viable alternatives now that didn't exist before that I can switch to if needed.
I could've turned it into a several week project if I wanted, but why? What purpose does it serve? As you grow, you realize there is very rarely, if ever, a "right" answer to a problem. Consider the way you think it should be done is not the only "right" way and you'll open more doors for yourself.
> They'll spin their wheels solving some insane problem no one asked them to do because it's "better" while ignoring the larger scope and goals of the project.
> But why? This is "good enough," and IME, if you sit on things like this long enough, eventually someone else comes along and does it.
Can't think of a bigger reason to avoid volunteer work on free and open source software than what you just said. Being a "wheel spinner" who cares too much about stuff is foolishness. People hate you and simultaneously take you for granted.
> Consider the way you think it should be done is not the only "right" way and you'll open more doors for yourself.
Absolutely.
To not be annoyed? How is that not a worthy goal in itself?
Things that I’ve learned (through much difficulty) for myself that feel relevant:
* Boundaries: not all problems are mine to fix. It’s okay to say no, even if someone else doesn’t like it.
* Acceptance: perfection is an illusion, there will always be an endless list of problems to work on, human time and energy have real limits, I am allowed to have different desires and motivations today versus yesterday (or an hour ago!)
*Emotional maturity: humans are emotional beings, it’s okay to get annoyed / upset at something, including particular issues with software. The root cause of an emotion often becomes clear much later than after the initial trigger, which usually is only slightly connected to the deeper issue.
*Wisdom / self-love: it’s ok to rest. It’s okay to not finish a project. It’s okay to say no. Human lives are immensely complicated, we will always make mistakes, and change happens always. Words like need and should are are directives springing from the shifting, hidden narratives we have imbued our lives with. We can understand and reshape these narratives.
If I had more time I would have a written a neater, more concise, and more complete list :)
As someone who is very much on the optimizer side of things, and experiences the struggles described in this article, the lesson I take to heart is that while satisficers tend to be happier, optimizers get more done.
Your optimizer tendencies make you into an expert, they open up new opportunities for learning and growth, they have the potential to have real consequence in the world. Be thankful for them, even as you guide them to their appropriate application.
But are those really different classes of people? Isn't everyone a maximizer up to a point where they think "good enough"? Where that limit changes between people, and for each person probably depending on area of interest, area of expertise, and so on?
I don't _think_ it is accurate. I think burnout comes from putting energy into things that don't have meaning. Case in point, this article: as you realize that fixing everything is a never-ending game with marginal ROI, you end up burning out.
If overresponsibility alone caused burn out, I think that every parent out there would be impacted. And yes, parental burnout is a _very_ real thing, yet some of us may dodge that bullet, probably by sheer luck of having just the right balance between effort and reward.
Throw this tradeoff off balance, and most parents just burn out in weeks.
That'd mean that people who are burned out all did so because they did stuff that didn't have meaning? Ultimately, I think you can get burned out regardless of how meaningful it is or isn't. People working at hospitals (just as one example) have probably some of the most meaningful jobs, yet burn out frequently regardless.
More likely that both different people burn out because of different things, and it's a mix of reasons, not just one "core" reason we can point at and say "That's why burnout happen, not the other things".
* That can come from overresponsibility if you have a value that says you should fix things that you see are broken.
* It can come from meaningless bullshit jobs if you have a value (which almost everyone does) that says your effort is meaningful.
* It can come from isolation if you have a value that it's important to be connected to others.
It can probably arise from any other value you might hold as long as you're forced to strive and yet can never reach it.
Honestly, I feel like values are deeply underconsidered in our current culture's thinking around psychology.
Doesn't often come from a lack of meaning though? Or maybe the meaning is more micro in this instance, and you wonder what the point is of telling them to pick up their dirty socks for the... 327th time.
“Calvin: Know what I pray for?
Hobbes: What?
Calvin: The strength to change what I can, the inability to accept what I can't, and the incapacity to tell the difference.”
—Bill Watterson (1988)> 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.
Problem solving is easier than listening and empathy.
For one, there are many, many directions you could take at any given moment, but you have to choose only one. You have no choice but to triage. That's not a moral failing, just the nature of agency and existence.
I do have some perfectionistic tendencies, which might be behind some of this. But a long time ago I graduated to a deeper perfectionism...
The problem with simple perfectionism is that you can only achieve a level of perfection in a simple and superficial way, often to the neglect of more interesting goals... after you "perfect" something, you look deeper and inevitably see more problems. You can pursue those, but you then just look deeper again and repeat. At some point you'll realize you're spending a lot of time on something that is only meaningful to an arbitrary standard that exists only in your own head (that you only recently invented).
So I moved on to "perfecting" the balance across the relevant competing concerns and constraints. Since there's rarely a perfect balance, no closed-form answer, and since your attention is certainly one of the factors to balance, real perfection requires that you can find something "good enough" given the circumstance to move on to something else.
Put another way, if you can't find satisfaction of your perfectionist impulse in finding something good enough, you could be doing "perfection" better, and should probably work on that.
This is why so many open-source maintainers burn out: they create something that people find useful and suddenly, almost inadvertently, incur the obligation to keep users happy. That is both the best part and worse part of creating software.
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.
After 25 years - I'm over it. But the flip side of that is that I can't un-see the fact that so much of the tech shit in my life is broken and it has practically become a second job trying to manage it and / or fix it. Thankfully I don't do it by trying to code replacements like the author seems to. Instead I try to come up with workarounds or find replacements.
Nevertheless the weight of the curse is about the same I figure.
Life becomes way lighter when you realize other people are also smart and what you’re “fixing” can very likely be:
- something so unimportant that no one felt it was worthy working on
- something that was supposed to work like that, and you simply don’t agree and want to make it your way
Or not. It can be the struggle of having higher than average standards.
Sadly, your list is incomplete without:
- something someone didn't bother to put any effort or thought into at all.
Programming is the closest humanity has ever gotten to godhood. We're creating entire structured universes out of unstructured bits. The system reflects the understanding of its creator.
We're all pretending to be gods, warring over the system's design.
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.
This really got to me because I've been doing this without realizing it for as long as I can remember.
Low tolerance for frustration. Starting something is easy. 20% of the work gets 80% of the results. It's beautiful to see. Then you gotta do the last 20% and you see the 80% of the job ahead of you. Seeing it through quickly gets frustrating. It turns into a job. How to get away from this? Just start a new project...
The only way to build solid things is to start with the POV that they need to exist and be stable long-term. You have to give a shit about simplicity, stability, performance, backwards compatibility, etc. You have to teach people what you know and form professional opinions around why you do or do not go with the crowd (and stand behind them, even under pressure from those who don't "know how").
If you commit to that (and I mean commit long-term, not for a year but decades), you can build things that don't break constantly, don't require constant maintenance, and don't drive you insane.
Ah yes, seems like you’ve discovered Clojure, and it’s bastard child ClojureScript.
> 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.
Every day I keep looking at everything that's broken and thinking I should find a way to fix it. Then I finish my work day and have zero energy to do anything useful and it all becomes guilt over the inaction, the feeling of not being productive at all times.
Very well written my friend.
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.
Additionally, one of the most unsettling things I find about LLMs is the (now well-observed) phenomenon of hallucinations. As someone who is terrible at memorization and has gotten by life thus far in large part to mental models - I didn’t realize until their popularization that I may or may not have regularly “hallucinated” things my entire life - especially when forming opinions about things. … makes you think …
Great article!
edit: I also find that the type of abstract thinking reinforced by writing software regularly, is addictive. Once you learn how to abstract a thing in order to improve or increase efficiency of the thing, it starts a cycle of continually abstracting, then abstracting your abstractions ad infinitum. It’s also a common bug I see in young CS students - they are fantastic problem solvers, but don’t realize that most (all?) of CS isn’t a thing - it’s the thing that gets you to the thing. Which is (I believe) why we have a generation of software engineers who all want to build platforms and marketplaces with very few applications that ACTUALLY DO SOMETHING. They haven’t taken enough humanities courses, or gained the life experience or something - to find the “REAL” problem they want to solve.
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.
E.g. you figure it'll take a minute to take the trash out and wash your hands. But on the way you discover you run out of trash bags, and while washing your hands you run out of soap, then as you pick the refill bottle from storage some light items fall out, and you need to put them back into a stable configuration, then you spilled a bit of soap during refilling so you need to clean up, but you just run out of paper towels, and...
This is not true - one day you will be dead. Hopefully that day is a long way away but it will eventually come around.
It is good to keep this in mind and spend some time coming to terms with this. If you do, the problem this article talks about will naturally fall away.
Realise and acknowledge the limitations to your ability to act. Then consciously make a choice as to what you spend your limited time on and don’t worry about the rest.
Bold of you to assume that being dead also means the trials are complete. I imagine it as the beginning on the next set of trials.
Genuinely, I think the best antidote to this is to refuse to do this until you personally feel about 80% confident you really understand how to work with the thing from the inside out.
Don't try to rewrite Vim until you've already read and annotated a copy of Practical Vim and drove it daily for a few years, for example. Don't try to rewrite SQLite until you've started hitting up against use cases even the common advice online can't help you with.
This means you will probably do very few rewrites. That's intentional - focusing your effort on making new software that solves new problems is, for all those who trash talk it, really much more valuable. And if you ever do a rewrite in earnest you'll walk in with intimate knowledge of what exactly you're trying to do here.
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.
I find joy in receiving praise from my colleagues when they have good experiences with my tools.
(takes one to know one here)
Since I started using Nix flakes to build everything and pin to specific versions this largely stopped being a problem for me. I happily run things I last touched many, many years ago without worrying about stupid stuff like this ^
> Burnout does not just come from overwork. It comes from overresponsibility.
I remain unconvinced by this, and the more years I rack up, the more I recognize the pattern of burnout having a direct relationship to alienation of labor.
It only solves the "Libraries deprecate" part. APIs (at least the internet ones) still change, hardware still changes, problems you're trying to solve change, all outside of your control. Nix doesn't solve any of those.
Tons of software relies on bodges to get things to work. If you tried to "fix" everything you'd go mad and never be finished... and then someone else will come along and want to "fix" it.
Definitely avoid staring into the abyss.
But like Camus' Sisyphus, we often have to smile in these situations and carry on with our work. Dwelling on the absurdity of it all gets us nowhere.
I've had great fun writing little daemons, deployment and config management systems, my own tcp networking protocols, process management, and using these tools to "build my own k8s" more or less. It's more fun for me to build and understand these relatively simpler systems than pick up all the tech debt of some more established ones.
And, given enough time, it can be very stable, fast, and tailored to my specific needs.
I can feel their presence. Pretty much all the bugs I write now are intentional "will focus on this later" kind of thing. I know exactly what I'm neglecting, why I'm neglecting it and when is the right time to address. I can write bug-free code if appropriate though it takes longer to do and not always possible in a company environment where there are deadlines.
It is a burden to see all the issues and complexity and not being able to address it fully.
One of the most important skills that I've learned, through writing ship software, is "Knowing what 'Done' looks like."
There's a point, where -even though there's still stuff that I have to do- I need to declare the project "done," wrap it up, slap a bow on it, and push it out the door.
There's always a 2.0.
Writing in an iterative manner (where I "discover" a design, as I develop the software), makes this more difficult. One thing about "hard" requirements, is that there's no question about what "Done" looks like.
This reasoning (which I can easily identify with) is a slippery slope towards OCD anxiety and depression when you refuse to acknowledge that you can't fix everything.
You need to be realistic, set your priorities within a limited, defined context, take decisions and actions based on those, and forget about the stuff that didn't make your priority list.
That's not not-caring. That's focusing on what really needs your care.
Wish I was better at it though.
The post describes grasping tension, the blessing and curse of the powerful.
Grasping tension highlights the value of work -- the difference between the end/telos model and the actual - or "execution" in business -- and the fundamental priority of time as a value: opportunity matters most. Yes, you do need skill and resources, but they're useless without opportunity.
So, at a minimum, stop polishing turds.
But the main thing about opportunity is that it's a value to someone else. Yes scratching your own itch might end up helping others, but that's incidental luck.
So the solution to this curse might not be perfecting your own craft or impedance-matching your emotions, but really to focus on solving other people's problems.
The really nice thing about this solution is that it enables you to work with a lot of other people. So long as they're acting in good faith to solve the same problem, you'll minimize any coordination costs and enjoy all their strengths without having to do it all yourself. And when your work is needed by others, there's no time or need to worry.
Is that not happiness, to make yourself useful?
One thing that has changed in the industry, I think due to a combination of labor force expansion, DevOps, and greater reuse, is software engineers have increasingly become users of software. It’s… less fun. Where have all the sysadmins gone? Oh wait, we’re the sysadmins now. :-/
> But programming lures us into believing we can control the outside events. That is where the suffering begins.
Isn't it the opposite? We're not surprised if someone who grew up amidst criminals also does crime. I'm not sure that I can choose whether to feel attracted to men instead of women. I can't control my mind, but I can choose what people to stay with and what media to be exposed to. I can adjust everything except for my mind: my hands write code, my feet take me elsewhere, I can tune into different media, I can choose to not speak agitatedly when a service rep. is following corporate policy, etc., whereas my mind moulds or reacts in response to those inputs (I'll still feel irritated by that corporate policy and be influenced by advertising)
If anything, I could see an argument for that you control neither, because obviously your control of your hands is coming from a combination of your mind's outputs and the physical laws of our environment
The key is to enjoy what you are doing. If anything becomes a drudge, search for something else that matches your talents and is enjoyable.
I don't come here that often, but when I do, I usually end up getting stuck in what is often a borderline off-topic discussion of life challenges I'm dealing with.
This morning, I started out trying to use NotebookLM to solve my "what would a meaningful life look like for me" problem and ended up spending over an hour on this thread (mostly reading/thinking). I only came here as a symptom of procrastination when the friction I encountered with that main goal became too much.
Similar with software. I always tell my clients “yes I can do that” because, well, I can. But then I end up juggling too much, working nights and weekends, and not having time for the tree work and haircuts I have to do at home.
The same burden of moral responsibility can be applied to any systematic dysfunction. Those that know how to fix institutions, economies or governments are feeling this pretty strongly right now.
And even in the places where I’m not even sure how to fix it like the radicalization or both genders, or various ethnic groups into hating each other…
In my downtime my brain annoyingly tries to tackle these problems until I’m overwhelmed by the conclusions I’ve arrived at - many times the inevitable result is that things will continue to get _much worse_ before they get better.
Maybe I should take up crosswords.
We are playing software factorio and the winning move is not to play.
I think learned people have this sort of feeling of moral weight about a lot of things, it's why they're less happy than uneducated people.
The funny thing is that actual engineering _requires_ being resilient in the face of unpredictable external events.
And his quote "You run the thing, and it works. Or it _doesn’t_, and you fix it." shortly after is fundamentally the difference between coding, and engineering.
And maybe that is the true curse of our profession. We call ourselves engineers, but we never behave like it. Engineering isn't "scratching the itch to build". It is defining requirements well, building something that fulfills the requirements, and then leaving well enough alone.
And my drive to Solve All The Problems was not making me happy. At all. It was just a way to exert control over a difficult life, and by being terminally distracted by the easily-solvables, I was avoiding the big problems I genuinely needed to confront.
It’s gotten better but in the past I would :
- happily spend weekends exploring what possible with QMK (consistently tweaking and re-programming my keyboard; diving into the depth of QMK docs)
- spend hours building various neovim tools for myself and playing around with different configs
- building various bash scripts
I’ve recently quit my software dev job to pursue building online products and my friend said something that sometimes being an engineer going into business can be a detriment - because you feel that you can build anything…and you can end up building forever. Whereas a business person would leave it at a “good enough to sell” state and move on
This deep desire to affect change in a controllable way...
This infinite desire for self value defined by external validation.
It's not sustainable. Perfection can only be obtained by observation of perfection of combined self through self and other.
It's okay to discard parts of yourself to balance yourself with your counterpart. A willing violation is no longer a violation.
Not observation of one or the other on a pedestal, but accepting that both are vital parts to the system and observing the perfection that comes from co-iteration.
Essentially turning a binary system quantum.
In addition, I find when I start these projects from a place of hubris ("there couldn't possibly be a reason we transfer 10MB before every build"), I find myself consistently humbled. It's Chesterton's Fences built out of other, smaller Chesterton's Fences. The shape of the system is arbitrary but not meaningless.
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.
This same thing happened to me this past weekend, and I used Vercel v0 to fix it. https://v0-captions-adjuster.vercel.app/
Not shilling my solution; this is nowhere near actually good yet, but it was "good enough" to fix the problem for me too. Only posting it as proof that I had the same thing happen to me, and maybe it can help others too.
Sounds like we're making excuses for a world left far behind. Not all of us do this for the paycheck. This world is in some deep shit.
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!
Yes. Well, "tilting at," jousting specifically. The figure relates to the comical pointlessness of such an act; the windmill sail will in every case of course simply remove the lance from the rider and the rider from the saddle, and turn on heedlessly, as only a purblind or romantic fool could omit trivially to predict.
> You just don’t see as many romantic technological catastrophes like those anymore.
The 90s were a period of unparalleled economic surplus in the United States. There was more stupid money than at any other time and place in history, and stupid money always goes somewhere. Once that was tulips. This time it was this.
> I miss them!
I miss the innocence of the time, however amply undeserved. But I was young myself then.
In terms of accessibility though, I'd recommend Forthkit (https://github.com/tehologist/forthkit), Miniforth (https://compilercrim.es/bootstrap/), Sectorforth (https://github.com/cesarblum/sectorforth), Sectorlisp (https://justine.lol/sectorlisp2/) Freeforth (https://github.com/dan4thewin/FreeForth2 contains an inlining cross-compiler for MSP430)
The problem with forths is that they don't seem as scalable as say lisp, from a social perspective. At a larger level, Project Oberon (https://projectoberon.net/) builds from the base CPU on FPGA, and A2 (https://en.wikipedia.org/wiki/A2_(operating_system)) show what can be done to scale up.
Steps (https://github.com/robertpfeiffer/cola/tree/master/function/...) also was supposed to do this, but the available code is rather disjointed and not really easy to follow.
- 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.
Once a company grows beyond a certain point it no longer needs to keep a razor focus on the core business, and a disproportionate amount of effort gets redirected to creating sometimes useful but often completely pointless and gratuitous internal tools. That way every middle manager gets to justify an ever growing number of reports and make his mark in the organization.
Some people will have to go through the burnout phase and reach rock bottom to learn this advice, I'm afraid. Only from there can they see the consequences of not leaving everything broken, and decide to do something else.
Well, that's the serenity prayer, isn't it?
"God grant me the serenity to accept the things I cannot change; courage to change the things I can; and wisdom to know the difference."
The classic form of this is people hacking EMACS.
The other side of the problem is when you're building on a base that's broken and needs more maintenance than it is getting. Much open source is like that. With too few eyes, all bugs are deep.
If you can't do it all, you have to choose. How to choose? Come up with a way to assign value to each, and do the most valuable first.
The value metrics depend on the system / outcome desired.
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.
ok... I mean great.
There's also a chance it's probably just fine. Leave it alone if it's not causing problems.
My humble broken words to the humans who read this, "You can't control everything. The one thing you can control is your action. Master it."
Slow down, you crazy child
You're so ambitious for a juvenile
But then if you're so smart
Tell me why are you still so afraid? Mm
Where's the fire, what's the hurry about?
You'd better cool it off before you burn it out
You've got so much to do
And only so many hours in a day, hey
But you know that when the truth is told
That you can get what you want or you can just get old
You're gonna kick off before you even get halfway through, ooh
When will you realize Vienna waits for you?
Slow down, you're doing fine
You can't be everything you wanna be before your time
Although it's so romantic on the borderline tonight, tonight
Too bad, but it's the life you lead
You're so ahead of yourself, that you forgot what you need
Though you can see when you're wrong
You know you can't always see when you're right
You're right
You've got your passion, you've got your pride
But don't you know that only fools are satisfied?
Dream on, but don't imagine they'll all come true, ooh
When will you realize Vienna waits for you?
Slow down, you crazy child
And take the phone off the hook and disappear for a while
It's alright, you can afford to lose a day or two, ooh
When will you realize Vienna waits for you?
And you know that when the truth is told
That you can get what you want or you could just get old
You're gonna kick off before you even get halfway through, ooh
Why don't you realize Vienna waits for you?
When will you realize Vienna waits for you?
"Vienna" by Billy Joel
https://www.youtube.com/watch?v=3jL4S4X97sQIt is probably full of node_modules/, venv/ and target/
Sometimes you just need to use it as a reminder to maintain your own vehicle.
Think too hard about why you are unhappy and you'll find yourself entering politics like I did.
Yes dumb, bad things exist. But often they are simply compromises. If you were to rewrite things you'd often just make different compromises.
In that light, there is no 'moral imperative' or some such thing. You can start to look at _why_ decisions were made and probably find subtlety you missed at first glance.
You might think this is foolish optimism and you know better but think about every refactor you've actually taken a part of instead of theorized and how much complexity shook out.
It all boils down to the 3 key factors: speed, quality and cost. And you can't have it all
Know your trade-offs.
This is a lovely point, and probably why a lot of technical people like to take on tactile hobbies outside of work. Follow these woodworking steps and at the end you have a properly built cabinet. Or why doing the dishes can sometimes be soothing, etc.
(the saying goes that every man sooner or later grows.. into buying new socks instead of darning the holed ones. That i have accepted, but my question is, Shouldn't that apply to other things too?)
Handle of fridge broke? Well.. no-such-thing-as-buy. Fix it - or replace it - with a rope (from some gift-bag handle actually). Uncountable toys being fixed and overflowing the wardrobe.. No way Throwing (almost) working things.
Pfft. Same thing as these hudreds of Makehells^b^b^b^b^bfiles, or that proper rename tool [1] which after 10years has become a swiss-army-knife and i still find more use cases to add :/
A cage looking for a bird.. vs learning when to leave things broken...
Maybe that last one is like learning to pick your battles. Seems the hardest life lesson that can only be self-taught, sigh.
Thanks for the revelation.. maybe one day i'll write mine :/
[1] https://github.com/svilendobrev/svd_bin/blob/master/filedir/...
I believe computer programming is the closest humanity has ever come to godhood. We're creating entire universes out of unstructured bits. It's addicting. I feel this deep need to remake everything in my own image, to have the entire system reflect my own understanding.
I often feel like I'm insane for thinking there's a better way. Surely someone much smarter than me would have thought of it, right? I must be stupid and missing some crucial fact that proves me wrong. Then I do it and it actually fucking works. What a rush.
I only regret the fact I'm a mere mortal with just one lifetime and whose days have just 24 hours which must be carefully allocated. Real gods have infinite time and are capable of infinite effort. Just look at the universe. It's a deep religious realization.
> Your once-perfect tool breaks silently because libfoo.so is now libfoo.so.2.
... Solution: get rid of libfoo and do it yourself. Now when it breaks you only have yourself to blame.
Yeah, I know... At some point it becomes pathological. It can still be an immensely fun activity if you're curious and have way too much free time on your hands.
> Sometimes, it’s OK to just use the thing.
Also okay to just complain. No, you don't actually need to send in the damn pull request. It's alright.
It's popular. It appeals to some profiles: The leader who doesn't understand why the worker is taking so long. The worker who doesn't understand why the coworker is redoing his stuff.
If you let a popular saying guide your life, then why live at all? You got to experience those things first hand to understand.
If you never went through the process of trying to make something better, you will never understand the cost.
That's why managers who say this kind of stuff are often despised. They demonstrate to know the sayings but not the experience of living through it. When they do, they are respected.
That is also why the product manager and the technical lead are often two distinct roles. The product manager can't make those calls, it only cares about whether the final product matches expectations. The technical lead can make those calls about technical investment cost, but no calls about the project direction. It keeps a good social dynamic that prevents automatic popular sayings and "I heard that..." stuff to override human behavior.
-- Unknown
My mind has argued, and won to some extent, the opposite, but within a boundary: if you are responsible, why not do it better, if you are not doing it better, what is the point of it all?
is this one of knuth's 'premature optimizations'?
I find the key is to have a purpose that would be less pursued if time is spent poorly. Combined with getting exceedingly honest with your estimates and internalizing https://xkcd.com/1205/ you can avoid throwing the baby out with the bathwater.
In other words, y’all got way too soft at shitposting.