Skip to content(if available)orjump to list(if available)

The curse of knowing how, or; fixing everything

dpifke

There's a quote I learned when doing theatre, which I've seen attributed to either the stage magician Doug Henning or possibly Stanislavski, describing the process of art as taking something that's difficult and making it habit, then taking something that's habitual and making it easy, and then taking something that's easy and making it beautiful.

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).

Phlebsy

> 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.

talos_

Agreed on this view! Sharing some similar thoughts

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"

foobarchu

> "the first album was about what we could; the second one was about what we should"

Funny enough, when you apply this to software it becomes the pejorative "second system syndrome" (Brooks, 1975)

slt2021

in the world of music known as Sophomore slump:

  In the world of music, there is a common phenomenon known as the sophomore album curse/syndrome, where newly popular artists often struggle to replicate their initial success with their second album, which is often characterized by struggles in changing musical style

https://en.wikipedia.org/wiki/Sophomore_slump

adsteel_

In less poetic terms, the progression I talk about is "copy, choose, create". First, we learn to copy a solution. Later, we know enough solutions that we can choose the best for the situation and copy that one. Finally, we know enough to create our own solutions that are well adapted to the problem.

randito

For people wanting to dig into this idea some more, I'd recommend the book by Austin Kleon called "Steal Like An Artist." Also, there is some nuance in the book about copying and stealing, without being a thief.

begueradj

That quote is meaningful.

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.

gameman144

> the "art" is to be able to mate that animal.

I'm assuming (hoping?) that this was supposed to be "tame"? If not, I've got some questions about Bruce Lee.

null

[deleted]

owebmaster

> 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).

Also known as "Make it work, make it right, make it fast"

https://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast

3abiton

That was a beautiful quote, I can see some examples in my life where this applies.

null

[deleted]

scarecrowbob

"Kneel down and you will believe."

pmarreck

Oh wow. This hits hard in the feels.

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)

alias_neo

I've had this a few times, particularly on mobile, where you're doing something and some pop-up will steal focus, but of course you were tapping or swiping or something the exact instance it popped; it stayed just long enough for the after-image on your retinas to catch a single word and you realise it might have been important, but it's gone now, with no sign.

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.

pmarreck

The fact that Android even has a notification history is huge.

iOS does not!

aidenn0

TIL Android has a notification history. I've been using Android phones for over a decade and never new.

alias_neo

It's really handy, I just wish they'd add a search feature; sometimes I need to look for a notification from a particular app and it can't be done :(

Damogran6

I believe it's an INTENTIONAL BEHAVIOR in Facebook. Particularly the mobile web interface...want to show someone a video, but you're on the can, and really, it's going to be a minute while you wash up (or similar example lasting 40 seconds)

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

jamiek88

That’s ridiculous!

I end every iMessage with a(n) n

Hahaha

crazygringo

Yes, 1,000%.

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.

riggsdk

To me the BIGGEST annoyance is the iOS “End call” button.

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.

dunham

Confirmation before calling would be nice. I've accidentally made calls when trying to get more information about a missed call. (I've also had Siri pocket dial, but I e got that disabled now.)

pmarreck

My solution would account for this as well.

The solution needs to be global. Literally, if any part of the screen just changed (except for watching videos, which would make them impossible to interact with), add a small interaction delay where taps are no-op'd.

actionfromafar

There's a bigger design philosophy or lack there of at play here.

Why would the position where the end call button just was, be replaced by some other active area immediately after? It's just not right.

Damogran6

It's gotten better, but using navigation. It tells you which lane you need to----nope, calendar Appointment.

and the notification doesn't self-dissapear, so stressed navigation also includes a ham-handed reach and swipe up to make the appointment dissapear. Hope it wasn't important.

The screen is MASSIVE folks. SO MANY PIXELS. keep the GPS AND the calendar appointment.

whizzter

Happens to me far too frequently as well!

BobaFloutist

I also wish you could blacklist/permanently hide individual devices so that I could prune the list of 400 smart TVs, Bluetooth speakers, electric toothbrushes, other people's phones, smart fridges, etc that come up every time I try to link to my earbuds in my apartment.

It seems like a super easy fix.

pmarreck

I have never had to deal with this issue because my airpod pros auto-connect to whatever device I'm actually using /shrug

majewsky

I have another submission for most annoying UI problem: Trying to read a thing, but it's on medium.com. The sheer amount of popups and overlays I need to click away before I can actually read your thing, geez.

sevensor

The worst is when somebody has a custom domain, but it’s actually medium so I don’t know not to click on the link.

pmarreck

Reader mode is a thing, but if you can suggest a better (ahem) medium to repost it to, I'd be happy to!

(Honestly, I'm sort of with you on the medium thing, but I posted this years ago now...)

slt2021

github pages + markdown/jekyll ?

every single medium.com blog could be just github pages in my opinion

kagevf

Maybe substack?

monkeyelite

Sometimes you see reductionist comments about websites just being for displaying text - but for medium it’s true.

zzo38computer

Sometimes you can disable JavaScripts and that works (for that document on Medium, this works for me). Sometimes that doesn't work, but if you disable both JavaScripts and CSS, then it does work. Sometimes that does not work either.

ajot

I redirect to scribe, though that only works with medium posts

https://scribe.rip/@pmarreck/the-most-annoying-ui-problem-r3...

LeifCarrotson

The sheer amount is zero with an ad blocker enabled.

I consider UBO basically mandatory for browsing the web in 2025, too many sites are unusable and infuriating without it.

warp

I had two popups visiting that medium link with uBlock Origin. Perhaps it is possible to get zero with UBO, but default settings don't seem to be enough.

null

[deleted]

carlosjobim

Your browser should be set to open all pages in reader mode.

SoftTalker

Some sites seem to be able to disable reader mode. I'm not sure why browsers allow this but it happens often enough, reader mode just isn't an option on some sites. In firefox you used to be able to do something like:

   about:reader?url=https;//www.example.com
But seems that doesn't work anymore.

prometheus76

Oh man. This makes me want to throw my phone against the nearest brick wall sometimes. The UI is loading, I reach for the button I want to hit, but it moves and a different button takes its place because the app/page is still loading, or worse, an ad has taken the place of the button.

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.

chasd00

> or worse, an ad has taken the place of the button.

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.

pmarreck

It's like getting poked hard in its annoyance level, right?

> 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.

mjevans

If a user is interacting, DO NOT UPDATE the list / models / etc.

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.

pmarreck

It seems related to "debouncing", where you delay a lookup (to autocomplete, etc.) until a certain delay after a user stops typing

ziml77

It's not just a touch issue. Desktop environments have toast notifications and dialogs that can pop up unexpectedly (neither of which are remotely new problems). You can be trying to click something at the corner of your screen and have it intercepted by a notification or you can be pressing enter and have it activate the default action on a dialog that just popped up. Especially in the dialog case you often just have to hope that it wasn't actually something you needed to see or select a different option on.

mgoetzke

Or apps like Skype which popup a dialog while you are typing, and when you where in the middle of pressing space while that happens, then you auto-answer a call you didn't know existed a second earlier.

munificent

> In short, an interface should not be interactable until a few milliseconds after it has finished (re)rendering

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.

cal85

These are great points. But I would debate the 100x point a little. And I think there are some cases where ignoring fast taps is clearly preferable.

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.

munificent

> 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’).

Yeah, notifications are an interesting corner case where by their nature you can probably assume a user isn't anticipating one and it might be worth ignoring input for a bit.

> 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.

You'd be surprised. Some users (and most software types are definitely in this camp) will learn the input delay and wait so they optimize their effort and minimize the number of taps.

But there are many other people on this planet who will just whale on the device until it does what they want. These are the same people who push every elevator and street crossing button twenty times.

oldandboring

I am 99% sure the NY Times Games app on Android is blocking input until fully rendered on its 'home' screen where all the games are listed, and it drives me nuts. I tap on the element I want and nothing happens, I have to tap again. Maybe some kind of overlay or spinner would help signal that it's not accepting input would help? Arg.

blainelewis1

I wonder if a good distinction is user initiated actions versus system initiated. If the user begins the action, the changes are immediate and buffered to the interface that appears next.

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

zzo38computer

This is not the only distinction, but it is one of them, and I think that one is a good idea. Another distinction is the results of the user initiated action, of whether the result is expected or unexpected, and that distinction is not always so clear.

pmarreck

Great point, and I suspected the problem might not be as easy as it appears at first glance. (Because of course it isn't...)

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

brulard

While your use case is valid, it's nowhere near as annoying to have to wait 1 second for a button to enable than it is to call random person from your contacts because his name appeared under your fat finger. Maybe there can be a distinction between expected layout change and ad-hoc elements appearing, like notifications, list updates etc. I would probably go too far asking for a setting of "time to enable after layout change"

int_19h

> 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.

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?

zzo38computer

> 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 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.)

CrimsonCape

I've become obsessed with how Visual Studio Code or Helix editor gives a great big JSON settings/properties file for tweaking values. SO much so that I despise other apps for their lack of "set-ability".

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.

VladVladikoff

This has a name, it’s called CLS (cumulative layout shift) and Google actually penalizes SERP rankings for pages with bad CLS. More info on it on lighthouse.dev (if I recall the domain correctly).

tdpvb

Google is an annoying example! Especially on mobile the search bar shifts around between mainpage, search field edit-mode, and results page, but shifts only a half second after loading a static version. End up clicking into a blank new search page because the doodle jumps to right under your fingertip.

VladVladikoff

Rules for thee but not for me! Google also abuses their power of controlling Gmail to do special tricks in their email campaigns which regular senders cannot do. Using these they force white backgrounds on users who have dark mode enabled (because their default auto dark mode CSS is absolutely awful and makes emails look like crap).

pmarreck

that domain doesn't work :(

I did find this though, and I think I will add it to my medium post: https://web.dev/articles/cls

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..

maxbond

I like to say programming is about knowing which rabbit holes to plunge down and which to step over. There's too much to know to go depth-first down every rabbit hole. Go breadth first and accept gaps in your knowledge - everyone has them. If something never comes up and never causes an issue you need to look into, and the project gets done, it doesn't matter. There's always an improvement that could have been made, but done is better than perfect because perfect never gets done. But the projects never getting done or even started - speaking for myself, that is corrosive to my motivation.

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.)

[1] https://news.ycombinator.com/item?id=38020654

PixelForg

Thank you for your comment, especially for this

> I've written a lot of Rust. I've read less than half of the Rust book.

Just knowing that there's someone out there who has worked like this or has been in the same situation gives me enough confidence to go through it!(the just write code part)

I've gone through so many resources (including the book) and I never managed to finish any of them. But I think now I need to get comfortable with having gaps and just start writing code and not be afraid of writing non-idiomatic rust code, atleast for now.

ChrisMarshallNY

I've -literally- been writing Swift, every day, seven days a week, 52.4 weeks a year, since June 2, 2014 (the day it was announced), yet, I still have huge gaps in my knowledge of the language.

I speak it without an accent, but not at Ph.D level.

As to home projects, that's pretty much all I do, these days, ever since I "retired"*, in 2017.

I'm quite good at what I do, and generally achieve every goal that I set, but, since I'm forced to work alone, the scope needs to be kept humble. I used to work as part of a worldwide team, doing some pretty interesting stuff, on a much larger scale.

But what's important to me, is that I do a good job on whatever I do. Everything I write, I ship, support, and document, even if it isn't that impressive. The bringing a project to completion, is a big part of the joy that I get from the work.

* Was basically forced into it

sanderjd

By the way, I fear I'm harping on "AI tools can be really useful" here, but I really find that learning new things is my favorite way to use these tools.

You said that you don't want to use them to generate code and just be a reviewer. I definitely feel that! But you can instead use them like a tutor helping you learn to the code yourself. "I'm trying to do xyz in Rust, can you show me a few techniques for that?" Then you can conversationally ask more questions about what's going on. Maybe eventually you can go read relevant sections in the book, but with the concepts better motivated.

I do this all the time when learning new things. It's not a canonical source of information, but it can be a useful guide.

speleding

Another approach that may help you, that worked for me. I was not familiar with rust so I wrote an initial proof of concept in another language (Go in my case). Then I asked Claude AI to translate it to Rust. It compiled on the first try, the only bugs being problems in the source file I gave it. Then I iterated a bunch of times by saying "please make this more rustacean style".

I only tend to use AI for assistance, but for me at least it's easier to get started this way than to start with an empty source file.

dijksterhuis

> I've gone through so many resources (including the book) and I never managed to finish any of them. But I think now I need to get comfortable with having gaps and just start writing code and not be afraid of writing non-idiomatic rust code, atleast for now.

i was in the same boat. i’d probably gone through the first half of the rust book and made actual hand written notes several times over the last 5 years. started rustlings. started “100 exercises in rust” (can’t remember actual title). never finished them. never felt like i was going to be “ready” to handle rust.

6-9 months ago i had the time to start learning a new language. was between rust or go. decided on rust. avoided it for a month. recently released my first library crate (with another on the way).

my tips/experience

- don’t worry about the borrow checker to start, just be aware it’s a thing. clone() everything if you need to. i had to just get comfortable writing rust code first. “i wrote some rust” was the goal each day. just working on getting it to compile somehow was all that mattered. confidence building is a thing.

- i started with simple CLI binary doing stuff like “package the files in these directories as a release/dev build setup”. basically copy paste /symlink files with clap. simple but useful [0]

- start with an ide that hooks into the compiler and shows you errors. ideally one like theia or rust rover which shows you the documentation of the error when you hover over it. i’ve now switched to nano and compiling manually after like 7 months. i see fewer errors these days and usually i expect some of them.

- keep it simple. don’t worry about being idiomatic. it will come as you read other people’s libraries and code over time. i’m still not there yet.

- if you are really struggling with the compiler just wont let me do this one bloody thing why won’t you let me do it it’s so simple in language X —> you are either fighting against the type system or the borrow checker. pause. take a moment. figure out which. it’s time to figure out what you’re not understanding. accept that you might have to completely change the approach of what you were doing. it’s okay, it’s part of learning.

- i would read all the outputs of `cargo clippy` and change each one by hand. i don’t use `cargo clippy —fix` ever. repetition helps me learn. doing enough boring repetition forced me to remember basic stuff that makes my code more idiomatic. i cannot emphasise how useful this was to make my code more idiomatic up front.

- commit your changes. then use `cargo fmt` and read through the diffs. again, helps to work out what rust code is supposed to look like while writing it (eventually without needing to use `cargo fmt`). i cheated with formatting compared to clippy (see above). it’s just formatting, you can probably rely on cargo fmt and be lazy tbh.

- you don’t have to start your rust journey with hardcore systems/hardware level coding. i felt like i was cheating / doing it wrong because i wasn’t doing that. but a lot of crates are nothing to do with systems level stuff. just because it’s a systems programming language doesn’t mean you have to be that hardcore to start with. see 2nd bullet point.

- generics might be my favourite thing about rust. realising how they work and how to apply them blew my mind. once i had that ‘mind blown’ moment with something — i was hooked. i don’t wanna go back to python now!

[0]: i need to change perms. apparently i set code viewing to private somehow? wtff. https://gitlab.com/dijksterhuis-arma3/vn-mf-builder

maxbond

That's awesome, best of luck to you.

vanjajaja1

> I like to say programming is about knowing which rabbit holes to plunge down and which to step over.

I like this a lot. I told someone once I avoid documentation like the plague and it just didn't have the same poetic ring as this line.

Sometimes you need to dive in, other times you need to hobble together something to step over

jerf

I think another important view is to consider how much you've already covered. As a young developer, I recommend spreading a bit wide. Try many technologies. Play with a new language every year. Focus on things you haven't done before, like, don't go from Python to Ruby, go from Python to C# or C++ or something.

But as you get older you want to shift from exploration to exploitation. It is hard to make progress on anything, both professionally and personally, if it first comes with another couple of person-weeks of learning something new, let alone person-months. Even though I find learning new things easier than ever because of the breadth of things I have covered, I find myself having to be ever more skeptical of what I will invest in in that way, because unlike a fresh developer with no skills who has little better to do than learn their toolset, I have skills that can be exploited to good effect. As a mature developer, I need to trade off not so much "what might this be useful for in the future versus the effort of learning now" but "what could I be doing right now with the skills I have rather than learning something new".

Particularly when the "something new" is a variant of a skill I've already picked up. It'd be great if I never again had to learn a devops deployment system. I've already had to learn three. Unfortunately I doubt I'm going to get away with that. It'd be great if I didn't have to learn another scripting language to do something, but I doubt I'll get away with that either. Your mileage will absolutely vary but it'll be something.

I know there's a memeset of the "old fogey who doesn't want to learn", but I really do see the learning costs now as the opportunity cost of using that time to exploit the ones I already have, rather than just grumbling about learning in general. At the moment the things I can't escape even if I try have been plenty to keep my learning skills well-honed.

So bear in mind that as you round out your skills, as you cover "scripting" and "static language" and "database" and "HTML" and "devops deploy" and "shell scripting" and "functional programming" and all the other categories you may pick up over time, it is natural and desirable to pivot to exploitation being more of your time than learning.

After all... what is all this learning for, if not to exploit the skills to do something, not just learn the next skill, then the next, then the next?

liefde

What you're feeling is not laziness. It's the quiet ache of misalignment between your values and your current energy. You love the craft. You want to savor the process. But the weight of “shoulds” — finish the book, learn the language, do it the right way — has turned your joy into pressure.

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.

shoemakersteve

Damn, not only is this great wisdom but your writing is honestly beautiful... Are you a writer by any chance?

syruphoarder

I like it too, but when I looked into their posting history I did come to the conclusion this was probably generated by an LLM. How that impacts your appreciation is up to you but I thought readers would care to know. Readers who want to reach their own conclusions are advised to enable showdead.

kunley

Very well said, to enjoy the process of writing the code.

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.

CivBase

I don't want an AI to write my code. Coding is one of the only things I enjoy about my job and I barely get to spend any time doing it right now.

6LLvveMx2koXfwn

And even if it is correct output from said overhyped tool it still detracts from the enjoyment of building/fixing stuff. I used to love going over the code I wrote to fix a specific issue, now not so much as half of it was written by AI so half of the satisfaction has gone too.

null

[deleted]

throwanem

> I feel uncomfortable having gaps in my knowledge

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.

wonger_

Same. For me, I think the discomfort comes from perfectionism, and anxiety about job-hunting ("I need to fill in all my weaknesses"), and fear of missing out on some cool niche.

funkydata

Don't be hard on yourself. We're in the same boat.

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.

sanderjd

Hey! I relate to this! And thank you for sharing.

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".

nonrandomstring

You have "epistemic integrity'.

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.

[0] https://iep.utm.edu/fallibil/

lelanthran

> I have many ideas that I want to build, but I'd have to learn new languages,

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?

PixelForg

> There is nothing stopping you from implementing your idea in (for example) Python. Or Javascript. Or Java, C#, C++, etc

Except there is, my brain :), that's one of the constraints I'm talking about, I'm a frontend web dev and I only know JS/TS, and like some frontend web devs, I'm enamored by Rust because it seems so different. I already use JS/TS at work so I want to use something else for my personal projects. So I definitely would have to learn something new.

> You gotta make the call - are you interested in building $IDEA, or are you interested in learning $NEWLANG?

If I was only interested in building my idea, I'd have just used what I know and used AI to accelerate the process. However for me the journey is also important, I want to enjoy thinking and writing code (and this project is something only I'd use, so there's no hurry to release a prototype). The problem is I want to start writing code right away, but that has the issue that I've mentioned above (gaps in knowledge).

Nobody is at fault, other than me for setting these constraints for myself. I know the solution is to just suck up and go through the rust book, read a chapter daily and eventually I'd have all the concepts in my head that I can then just focus on writing the code. But whenever I go about doing this, my mind always persuades me that there must be a better way, or it finds some flaws in my current approach and so on. So I need to learn how to not listen to my mind in such cases, and stick to the goal that I set.

Edit - After reading a reply to my comment, I've decided to just start writing the code and not worry about having gaps, anytime I start having doubts again, I'd go through this comment thread

lelanthran

> I know the solution is to just suck up and go through the rust book

No. The solution is to skip Rust and choose Java, C# or Go. Rust has a steep learning curve and if you project can tolerate a GC, there is next to no return for using Rust.

Instead of spending the next 6 months (for most people it's longer) to learn Rust, spend the next week getting to grips with C# (or Go, or Java) instead.

jaapz

I personally try to follow the method of "make it work, then make it nice". You build something that works, it does what you need it to do. After that, you probably already know where the code rubs you the wrong way, so you know where to look to improve and learn.

wofo

Good luck in your adventure! By the way, I think many people here on HN (myself included) would love to help you out if you get stuck / are struggling to get started / want a code review / want to chat about programming. Just shoot any of us an email ;)

dakiol

I guess it depends. If they have been developing mobile apps, and now want to develop a web app, then they definitely need to learn something like PHP, or Go or Python kr Java. On the other hand if they have been doing web development and now want to develop a native app, they must learn Java/Kotlin/Swift. Same for databases (perhaps you never worked with one, then you must learn sql). Even html+css must be learned if you never used them before.

skydhash

There’s react native and cordova, if all you want is to build the usual mobile apps and you only know JS. And Java, Kotlin, and Swift are used for web development if you’re going the other way.

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.

   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.

bonoboTP

This is quite hard to grapple with fresh out of school, where you worked mainly on pristine implementations of eternal algorithms, proven to be optimal in multiple ways, elegantly crafting each loop and feeling accomplished by expressing the algo with even higher clarity, reading and idealizing Knuth etc.

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...

XCSme

> Software doesn’t stay solved. Every solution you write starts to rot the moment it exists.

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.

Phlebsy

To me the point of the saying is more that the assumptions and environment that the software was written with are almost always going to change. Meaning the business and requirements rather than the technical implementation choices. Software doesn't exist in a vacuum, but rather to solve a certain set of business requirements that have the potential to shift out from under you depending on the industry, legislation, and your leadership. The things that you have negligible control or foresight over, rather than knowing that there's going to be another major framework update next quarter.

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.

ajuc

I remember when Turbo Pascal 7.0 programs started failing with Division by 0 error cause Turbo Pascal runtime does calibration loop at the start to calculate how many no-ops to sleep for 1 millisecond.

So - your HelloWorld written 10 years ago suddenly stopped working after CPU you run it on got too fast.

XCSme

Yes, if you change hardware, the software can break (a lot less often now than before though, as hardware changes are a negligible and they usually think about backwards compatibility).

int_19h

I remember that bug. I also remember that there were generic patchers that could fix any random .exe compiled with Turbo Pascal without even having to recompile it.

chamomeal

That sorta supports the point the article was making though:

> 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

XCSme

I mentioned updating is only necessary if you plan to keep developing the software.

If you build it once, and the existing functionality is enough (no plans to add extra features ever again), then you can remove all external dependencies and make it self-contained, in which case it will be very unlikely to break in any way.

As for the security aspects of not updating, with the proper setup, firewall rules and data sanitization, it should be as secure 10 years later as any recently developed software.

0x1ceb00da

> Every solution you write starts to rot the moment it exists

Not if you work on temple os.

galbar

I have said many times to teammates: the only code that is perfect is the one that hasn't left our minds. The moment it's written down it becomes flawed and imperfect.

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.

moffkalast

I'm sure some mathematicians would disagree.

bonoboTP

Math can be greasy and messy. Definitions can be clumsy in a way that makes stating theorems cumbersome, the axioms may be unintuitive, proofs can be ugly, they can even contain bugs in published form. There can be annoying inconsistencies like optional constant factors in Fourier, or JPL quaternions.

Yes, prototypical school stuff like Pythagoras are "eternal" but a lot of math is designed, and can be ergonomic or not. Better notation can suggest solutions to unsolved problems. Clumsy axioms can hide elegant structure.

pjc50

I think applied mathematicians started to encounter this reality of the impure world the first time someone taped a dead moth into the logbook of the Harvard Mark II.

gnawing_termite

your comment made me think of a passage in Italo Calvino's Invisible Cities:

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.

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.

TeMPOraL

Parent here, can confirm Nature solved this elegantly.

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 :).

isolli

Nature has another elegant solution, often applying both in conjunction: aging. As I age (and, yes, take care of my kids), I find myself more and more on the side of exploit in the exploration–exploitation dilemma. This will most likely endure after the kids have left.

noisy_boy

Sometimes kids do make one feel that the house is on fire though I think I won't be looking forward to be hugged every evening by a burning house excited to see me.

piva00

Or just have another hobby not involving programming. I got into this from being my main hobby as a kid, the passion thing I did when free time was available, I learnt a lot (enough to build it into a career), I had lots of fun but that time is gone.

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.

aleph_minus_one

> Or just have another hobby not involving programming.

This can actually make things (much) worse:

Since you have now another topic you are insanely passionate about, you see a lot of additional things in the world that are broken and need fixing (though of course typically not via programming).

Thus, while having a very different additionally hobby (not or barely involving programming) clearly broadens your horizon a lot, it also very likely doubles the curse/pain/problem that the original article discusses.

brulard

I agree with this. My hobbies tend to completely take over my thoughts and then it is difficult to switch to work context. It's much simpler for me if my hobby overlaps with my day job. If I get better in my hobby, that helps at job and vice versa.

yuppiepuppie

This is a great comment, as it hits far too close to my heart. Im currently trying to get my team to rethink how they are building the APIs for certain services in our product, and focus really on design and craftmanship. To the point where Im ready to start breaking it apart myself and coding up the solution on my off hours.

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"

aleph_minus_one

Not everybody who is a great programmer is a great parent. :-(

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.

phito

Same. Also I have absolutely no interest in having them.

brulard

This may change with age

globular-toast

You don't need kids, just a partner who has a "normal" job and likes to do stuff on the evenings and weekends is enough. If you have a partner who also does thought work and tends towards the workaholic then things might be more difficult...

dacke

I'm far from ready for being a parent yet, but this is honestly one factor I've noticed over and over again as a difference between my childless peers and the parents I encounter in work situations. Parents are just much better at prioritizing their time and energy and avoid perfectionism and trying to fix everything.

matheusmoreira

Indeed. Marriage alone led to a complete reevaluation of my priorities in life. I still want to make cool stuff but my hobbies are so far down my list of priorities right now I would have to be actually getting paid in order to justify spending time on stuff.

optymizer

Perfectionist here. I'm on my third child. Can confirm - this person speaks the truth.

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.

DavidPiper

Totally agree, standardisation makes everything so much more legible, even if there are problems with the standard.

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.)

Aeolun

While I have experienced both sides of the equation here, I find it much more pleasant to have things specialized instead of standardized. Yes, you spend a bit of time maintaining the functionality, but all that functionality (and maintenance) is there in support of your goal.

Using standardized software often leads to spending half a day just trying to find a way to work around the limitation you face. The next level there is that you realize you can just fix it, spend half a day crafting the perfect PR, and then submit it into the void, leaving it hanging for half a year before someone gets to it.

clan

I hope many people read this and take it to heart.

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.

null

[deleted]

__turbobrew__

Becoming comfortable with a stock computing environment is a powerful ability.

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.

JohnMakin

This just sounds like perfectionism. I believe it is a curse, because I hate working with teammates like this. 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. I've tried to coach people out of this mindset, because I used to have it very early in my career, til I realized the sheer impracticality of it.

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.

bigstrat2003

Like most things in life, there's a balance to be struck. If you always accept "good enough" and move on, things will be low-key crappy forever and never get to the point where they are actually good. If you never accept "good enough" and move on, you will never get anything useful done because you're going to always find some "one last thing" to polish. The best path is to pursue excellence when you can, but accept that sometimes you have to let things go.

fragmede

There's a difference between picking up on some esoteric detail.in your company's product and making it your only mission to solve it, ok the detriment of everything else vs taking Friday afternoons for a month to fix a Terraform provider for the world. There are two kinds of lazy. The kind that makes us good programmers and the kind that makes us bad programmers. If you're gonna be the second kind of lazy and just wait for someone else to do it for you, you might as well become a manager at work and take credit for their work while you're at it.

JohnMakin

It's not laziness though. I have dozens of competing priorities at any time. It is far from the most efficient use of my limited resources and time (and company time) to spend on a project that does not need doing that will inevitably be done by someone else anyway. It provides no business value whatsoever either. It's not "taking credit" for anything unless you count using anything open sourced as "taking credit" for the work done on that project. Yes I use jq, no I do not take credit for writing/maintaining it. Do you see the difference?

fragmede

In the abstract, fixing the root problem >>> maintaining a shitty internal wrapper that has to get reworked every time upstream gets fixed. Not fixing the wrapper repeated is absolutely business value, because not having a half assed fix of an implementation means fewer bugs in terraform plan and apply, which means less time messing about with CI because the stupid thing broke again.

This is of course in the abstract. I know neither the quality of the wrapper you wrote, nor how long it would take you to do clone a repo and write some code for any upstream fix, given all of your competing priorities.

My underlying point is that not fixing things properly has a cost all its own, and wasting time with a half assed solution can cost more than is immediately obvious.

It's impossible to say in the abstract if it is more efficient to actually fix the root problem and be of more business value vs shitting out some wrapper script, it depends on the downstream effects of said wrapper. But I've definitely avoided doing an upstream fix and wasted countless company resources getting a wrapper working when I could have rolled up my sleeves, done said upstream fix a year or two earlier and overall saved the company money.

matheusmoreira

> I hate working with teammates like this.

> 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.

Gracana

I feel like Open Source is the perfect place to apply that sort of effort. Also hobbies. You don't owe anyone anything, so you can chew on a problem just as long as you like.

matheusmoreira

Open source just means you're being taken advantage of. You're working for free to make the lives of people who look down on you easier. They won't do it themselves, their time is too valuable for this worthless nonsense. Better to leave things as is until some unpaid perfectionist can't stand it anymore and fixes it free of charge.

Never forget the words of Zed.

https://web.archive.org/web/20120620103603/http://zedshaw.co...

> Why I (A/L)GPL

> I would actually rather nobody use my software than be in a situation where everyone is using my gear and nobody is admitting it.

> Or worse, everyone is using it, and at the same time saying I can’t code.

> I want people to appreciate the work I’ve done and the value of what I’ve made.

> Not pass on by waving “sucker” as they drive their fancy cars.

If you're gonna go down this route, don't ever do "open source", do free software. AGPLv3 on everything. No exceptions.

rustyminnow

I submitted a patch for an annoying terraform provider once. It took about a week to fix and almost 3 years for them to merge it upstream. I got to learn Go and gained a much more solid understanding of how terraform works. I gained more from undertaking the project than from the actual fix.

> Consider the way you think it should be done is not the only "right" way and you'll open more doors for yourself.

Absolutely.

JohnMakin

Had this exact experience and why I don't bother anymore and fork if it's absolutely necessary.

3minus1

Most people automate things just barely enough to work. The thing is, having a barely working script or process can save someone thousands of hours. It's actually hugely valuable. Trying to make it more robust/productionized/whatever may have diminishing returns.

eviks

> submit a patch for it to fix my annoyance. But why?

To not be annoyed? How is that not a worthy goal in itself?

ag101

i really agree with this

dwaltrip

Very good post. I’m happy the author has had these important personal insights.

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 :)

Empact

One of the ways psychologists classify people is between those who are maximizers/optimizers and those who are satisficers/stop when things are "good enough."

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.

roelschroeven

"The reasonable man adapts himself to the world. The unreasonable man persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." (George Bernard Shaw)

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?

airspresso

I see it much more being a mindset. Either you approach everything with the goal of improving it, or you approach everything with the goal of finding a works-and-is-good-enough solution. One is about maximizing quality and another about minimizing effort.

Since it’s a mindset, you can define it as different classes of people.

What I’ve observed is that the ones that are minimizing effort in the area you care about (tech as we talk about here), are doing it as a conscious choice to free themselves up for another area of life they value higher. Could be kids, could be something else.

leafmeal

As someone who sometimes thinks of themselves as an "optimizer", I feel the opposite take away. I spend too much time "polishing" trying to make something perfect, at the cost of actually getting things done.

jurgenaut23

> Burnout does not just come from overwork. It comes from overresponsibility.

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.

diggan

> I think burnout comes from putting energy into things that don't have meaning.

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".

jurgenaut23

I'd argue it actually makes things worse. When you can have a higher-purpose job (an ICU or ER nurse who is saving patient's life everyday) and you're spending most of energy on administrative overhead, the effect is just magnified.

Meaning is a subjective thing. That's why some people thrive in some environments and some may burn out. If you put your average IRS auditor in a hospital, they might actually find more meaning in filling forms than exchanging with patients.

SAI_Peregrinus

I think meaning can't be imposed externally. What society finds meaningful and what any individual finds meaningful can differ. And what an individual finds meaningful will vary over time. A meaningful activity, repeated often enough, can become routine and lose its meaning.

munificent

I suspect that if you dig deeper, the underlying cause of burnout being forced to spend a lot of effort over time and not being able to feel that you are living up to your values in return. You are running a marathon but never reach the finish line of the satisfaction of living according to your own moral code.

* 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.

Aeolun

> parental burnout is a _very_ real thing

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.

fendy3002

the meaning of `overresponsibility` in this case, IMO is taking / considering the matters as something that we take responsibility of. That way of thinking itself (taking the responsibility) is causing a burden on the mental health of OP. Being ignorant or able to let go relieve the burden, thus preventing burnout

walterbell

> I can fix something, but not everything.

  “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)

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.

Cthulhu_

To expand, code is a means, the core "habits" that programmers develop (at least speaking for myself) is twofold; abstracting, trying to reduce things to simple stereotypes; codifying / decision-tree-ing interactions, things like that. And problem solving, when someone mentions an issue, the gut reaction is to try and fix it. And it takes a lot of internet wisdoms and/or therapy to learn that you are allowed to let people stew in their problems, or that unless you're asked for a solution you don't need to offer one.

Problem solving is easier than listening and empathy.