To the trends you mention I would add one more, which IMHO explains them:
There is vastly more programmers (needed) than ever.
The amount of tasks which require or include programming is ever increasing, and in an even higher rate than the number of programmers. Nowadays there are several microchips in an average car. In 5 years there may be a chip in your fridge and your toaster. In 10 years, your underwear?... And someone needs to produce all that software to make these work. So there is every possible effort made to automate whatever is automatable, and to improve "productivity" (however it is defined). And more and more fresh brains are recruited.
This implies that the majority of today's active programmers are inexperienced and/or ill prepared for their job. It takes several years to get to an adequate level of experience and it takes constant learning to keep yourself there. The bottom line is, more and more of the programming jobs are becoming less and less challenging. But there is still enough challenges for anyone who is looking for them.
Let me play the devil's advocate against your points above:
Not taking time to implement best practices
A lot of people don't, a lot of people do. Tenish years ago when I first discovered unit testing and the agile approach, none of my colleagues had the slightest idea what it was. Nowadays it is almost standard material at universities, so many fresh graduates already understand it.
Using other's people code as much as possible (custom code as a liability)
As opposed to what? Reinventing the wheel? Or using other people's code to avoid that?
I think it is important to note that we are paid (mostly) to solve problems, and writing code is not the end, only the means to that. If a problem can be solved without writing a single line of code, it still makes the client happy. Especially if this way we manage to produce a more reliable solution faster and cheaper. I don't see any problem with that.
Using increasingly higher level languages to improve productivity
As opposed to coding everything in assembly? ;-)
GUI based development "tools" that greatly simplify "programming" and do not require people to understand the plumbing behind the code
IMHO any tool can be misused. Which is not to say that GUI builders were necessarily perfect or even good - most (or at least some) of them are usable within their limits. But if someone doesn't know those limits, is it a problem of the tool or its user?
In general, I believe (although have no evidence to prove it) that back in the punch card and machine code days, roughly the same proportion of existing code was horrible as now, just both
- the overall amount of code, and
- the chances of outsiders ever seeing such code
was much much less.
Now, with the Internet and the Daily WTF, we get exposed to the worst examples day by day. It's a bit like watching all the news about terrorism and earthquakes and divorcing celebs, and crying out how dangerous and immoral this world became.