maybe I should compose an official list: Foone's Symptoms of A Programming Environment That Hates You

1. Factors completely outside your control break the code periodically. This is anything that's an add-on, usually. The browsers changed something, the sites changed something, the game changed something... It's a project that can never be finished, can never be put away. It will just break on some random day because some people in a different organization with different goals changed it

this doesn't include the time my website broke because a subcontractor unexpected renamed columns in the database on a saturday. that's just a massive fuck-up
but any environment where shit changes periodically and have to change your code to fix it? easy burn out. you're not feeling like dealing with that app you wrote 3-20 years ago, but that doesn't matter, it suddenly needs attention or it will just stop working
2. third-party authorization before code can run.
The more steps there are between you writing code and that code actually running where it needs to be ran, the less enjoyable it can be for my specific style of fast-iteration-loop ADHD-fueled programming, sure, but the worst is delays where you need to wait on other people, people outside your organization.
nothing kills my motivation to fix problems and add features like knowing that even if I spend all day hacking on this, no one can see my changes until Wednesday (if I'm lucky. it might be Friday...)
this is why my personal projects are all on platforms like the web (where I run my own hosting, or use very simple free hosting) or scripts/binaries I can just throw up on github or my own site, and people can download and run them on their own machines.

3. Environments where you can't do it "the simple way". This is usually a security thing, but it can be other problems (licensing, approved software lists, etc).

Basically any scenario where there's a simple and easy way to solve your problem, but that can't be done, and a much more complicated solution must be done.

"security" itself isn't a bad thing, but sometimes the way it interacts with programming is terrible, and results in there being two ways to do something:
1. the obvious simple way
2. the much more complicated, but secure way
and some environments enforce you doing #2, even if this is only a test that you're doing on a local machine
this is especially bad when you're iterating: Maybe you just need to see if loading this file and then running it through the module will work, and then it turns out you gotta make three source files and set up a FileContentsProviderBean to just load the text file, and UGH this was just to test!
or when browsers decide you can load index.html off the localhost, but it's not allowed to do a JSON.get("file.json") because that's HTTPS only, and file:// doesn't count
and obviously this is important to help secure the browser against users getting tricked into downloading files and then the file JSON requests their bank account's router password and blah blah blah I know what I'm doing stop protecting me from my self
so now you can't just test your HTML+JSON website on your localhost without first spinning up a web server, which just adds another layer of friction to your development cycle
and provides you with absolutely nothing. Of course it'll be on an HTTPS site when it goes live! but right now, it's not, and apparently my browser can't tell the difference between "production" and "my own machine"

so you set up a simple local webserver (python has a oneliner from the command line for it! python -m http.server, or python -m SimpleHTTPServer if you're on 2.x), but then it turns out you can't use some specific feature because chrome decided to arbitrarily limit it to HTTPS to help push the web towards encrypted pages, and canvas fingerprinting means you can't download a PNG off the page...

and now you need a more "real" local server, with valid TLS certificates...

and this is a whole fuck ton of extra friction that just isn't needed for development, but is being pushed on you to make a completely different environment (the open web) more secure.

and the thing about that friction is that you remember it? you internalize how annoying it is to do development on this thing.

so the next time you might have some motivation to work on it, that gets lessened by the reminder that you gotta make sure your node-based HTTP mini-server is correctly installed (you updated Node for another project, maybe that broke it?) or if the certs expired or your new browser didn't accept them

a big part of what helps keep projects going after a long time is minimal friction to getting back into them, you can just pick them up and start coding.

The more that feels like a slog, the less likely you are to keep up working on it

I think maybe all three of these rules can be simplified down to "there's too much shit you gotta do before the thing you want to do"
like if I go "I should add feature X to my program, or fix bug Y", the best way to productively do that is if there's minimum friction between me deciding to do that, and actually getting to work on feature X/bug Y

We all have limited time, limited energy, limited focus, limited patience.

and the more of those limited resources are spent on other things, like upgrading/repairing the environment before you can get to coding on the feature, the less you have to spend on the feature itself

maybe I just feel this so strongly because with my ADHD, all those are more limited than they might be for a nuerotypical programmer

the only other way I can think of to quickly burn out a programmer on a "fun" project:

4. Your changes don't seem to matter.

either you're fixing something and the bug remains, with no evidence you're affecting it, or your new feature can't be tested for whatever reason.

lack of feedback in general

this can both be immensely frustrating (I've rewrote all five modules that integrate with the TextBox module, and the Spellchecker bug STILL HAPPENS INT HE SAME WAY! AHHHHH COMPUTER GOES IN LAKE NOW!)

or just demotivational, because you're not getting the whole "yay, I did a thing!" dopamine hit

(that second one is very much an ADHD thing: I don't really get the satisfaction at a job being completed, so I substitute it with feedback, from users, from other developers, etc)

but even if you've not got my particular broken brain...

if every time you work on something, there's no reward for that work, you're not going to want to do it. Your brain recognizes this is not a reliable path to reward, so why bother?

and this situation can easily happen accidentally. An environment with broken caching, with weird and complex rules for when code gets invoked, it's easy to accidentally end up with a coding project where the outcome doesn't seem to change as you make changes

a tip for this that'll help, if you're doing something that's not going to result in an obvious change?

make it change something.

set up performance metrics, unit tests, integration tests, whatever.

Now the reward is "I got formatText() down to 7ms on The Bee Movie Script!" or "I finally fixed that bug where octupley-nested brackets would segfault the parser"

this isn't a "free" solution, and like all coping mechanisms it has a cost you're paying: you have to set up that framework

which can feel exactly like friction before you can code.

but if you can get that set up so you have a visible goal, it can really help

one strategy you can sometimes do that'll help with friction is to sometimes work on the project solely to make it easier to work on the next time

like if you've got a lot of manual steps you have to do as part of the build/test process, see if you can find time/energy/motivation to spend some time just streamlining that.

Even if it doesn't give you a new feature or bugfix now, it'll help with future ones

and doing it in a separate session from feature/bugfix work means it doesn't feel like friction.

this is basically a "clean up your room, put away all your tools" kind of maintenance. It doesn't advance your project itself, but it lessens the friction for your next development session

so yeah. quick summary on the common features of Development Environments That Hate You:

1. Third parties break your code (regularly)
2. You can't deploy it without third party approval that could take days
3. You can't do anything "the easy way", even as a test
4. Your code changes don't seem to matter

my advice is to avoid doing personal projects in these kinds of environments if you can avoid it, and to limit professional involvement as much as you can. Getting paid helps with getting burnt out on development, but that's all, it only helps. You will still burn out eventually.
and when you recognize you're in one of these environments, try to find ways to mitigate these problems.
for third parties breaking your code, you can set up tests on nightly versions of programs, you can monitor patch notes, you can try to anticipate these changes.
There's a lot you can't avoid in this area, but that doesn't mean the impact it can't be lessened.
third party approval is hard to work around for obvious reasons.
sometimes it can be streamlined, or you can simplify how much new code needs to be verified
not being able to do things "the easy way" can be worked around by building your own utility libraries for development. make a development-only function that takes a filename and gives you the file source, who cares if it leaks memory if you're only using it to develop, you can replace it with the real version once you've prototyped it
and your changes don't seem to matter? find ways to make them matter, so you get clear feedback

and the final tip for these problems, the one I mostly use?

Don't work on platforms that hate you and don't respect your time.

If you can avoid it, DO. Develop somewhere that doesn't feel like you're fighting the system just to get your code working.

you don't want all the programming you do to be unfun bullshit. that is a one-way express ticket to burnout town
at the very least, mix in some fun programming. the part of your brain that's a scared animal trying to figure out what will hurt it puts up with "programming is a mixed bag, sometimes fun, sometimes a bit of a slog" WAY better than it pus up with "programming is never fun, because of bullshit"
when I was working at the government (a highly concentrated form of all 4 of these complaints) I also wrote tiny games on the side. That helped keep me from burning out on programming immensely.

btw a general guideline for longterm projects:

try to structure them so that working on them is a lot of relatively short sessions, with positive feedback at the end of each

because if it's a project where it's going to take a bunch of development sessions and then you only get positive feedback at the end, that's a delayed reward. delayed rewards don't work as well as instant rewards, especially with the ADHD
so like, say, you're making a game.
Instead of thinking about it as "I just need to sit down and code on it for 5 hours a day, and after 40 days it'll be done!", maybe structure it like "I'll work on it for 5 hours, and then I post a screenshot of my progress on social-whatever"

so then after each session you get likes and comments and such on what you've done this time.

This makes working on it feel more obviously good, because you know there'll be some dopamine at the end of that session, not just at the end of the project

(obviously this won't work for you if you're not as feedback-motivated as I am, but you can find other rewards)
like, I have severe ADHD, I've mentioned it several times. this makes it very hard for me to work on projects over a long time, right?

A great example:
I have been working on The Death Generator for OVER EIGHT YEARS.
It has approximately 270 games in it.

https://deathgenerator.com/#gallery

The Death Generator

The Death Generator

that is a HUGE time investment! a ton of individual sessions of development.

I absolutely could not have done that as a single "sprint", even if you paid me well for it

but I structured it so that even generator is a separate task. Most of the time I don't have to touch the main code, I just work on each generator in isolation. So It's not a single huge task with a reward at the end, it's a bunch of little ones.

and my trick to further help with development on "big generators" (ie, ones that take more than a single development session) is to live-blog them while I'm working on them.

This means I get feedback while I'm still developing the generator, so I'm more motivated to come back and work on it.

anyway It's easy to get into a state where your pain-tolerance level for programming is really high (mine certainly is), and this is fine and all and you can pull off some amazing feats, but you really gotta think about making sure that you're not always in pain.

chronic pain, even programming pain, can and will burn you out.

so before that happens, think about how you can avoid it.

because it's a lot easier to slow down and change your environment and your habits and tools to avoid burnout, than it is to do all that after you've already burnt out.
@foone hell yeah to this whole thread. Also severe ADHD brained and put into words a bunch of stuff that I have definitely felt and only half could put into words.
@foone If I only would accept partial results as progress to show others...

@varbin yeah, that one can be hard to figure out if you're a perfectionist (I certainly am)

trying to break it down into smaller chunks mentally can help. You're not showing off an incomplete game, you're showing off one specific completed feature for your upcoming game!

@foone How Scrum is supposed to be but basically never is.
@foone Easy in theory, but hard in practice, no?
@foone This is where I've found using something like a kanban system helps. Write up the major milestones, break them down into small pieces, however that maps into the ticket manager, and then you can cross off each one as you do it, and not forget about anything you'd intended to do.