Coding for a living fundamentally means writing code whose purpose is determined by someone else, in ways determined by someone else, on someone else’s schedule. You’re renting out your body to a stranger who has structural incentives to mistreat it & no structural incentives to make genuine value.
Generally speaking, you’re writing code intended to be used by domain experts in a domain you have limited knowledge of, and you will never meet the users and find out if the code you wrote made their lives easier — but typically the answer is no, because users & customers are disjoint sets with different motivations. Basically, if you’re writing a tool for some field X, you’re implementing a marketing guy’s idea of what a different marketing guy at a firm that does X will want to buy, and the people who actually know how X is done have no power or voice. So you may well work on an extremely profitable but totally useless project.
If you’re very lucky, you’ll be surrounded by sensible people. But inevitably, you will be asked to do something that shouldn’t be done, and your choices are to either do it or find another job that may very well be worse. Most software engineers are employed exclusively to implement code that should not ever be written, in ways that are transparently perverse, to perform tasks that should never be performed in industries that should be abolished.
In this sense, we’re like workers in other industries.
We’re privileged because of the unjustified mystique (produced largely by unnecessarily poor tooling) surrounding programming: non-technical managers acknowledge that we know something they don’t, to a greater degree than other comparable domains, and so it’s possible for at least senior devs to manipulate the planned project away from really obviously bad ideas. But there are pretty strict limits to that. We’re trapped the same way as all other workers.