This produces horrible code, of course, but since it sort of works and nobody knows any better, it's the norm. (Most programmers don't know programming. Why they want to be a programmer is beyond me, but it happens.)
The people that have a deep understanding of programming and know what they want to do and how to do it are not using Java or C#.
As for the programmers in those languages, I guess I'm one counterexample. My colleauges and I talk quite a bit about the "right way" to do things. We gripe a great deal about shortcomings in the .NET universe. I hate "best practices" (aside from trivialities like naming conventions), and prefer to evaluate practices on their merits. I've written frameworks of various sizes. I read cool blog posts to see what others are doing. Occasionally I'll try things to see if they'll work, not because some "expert" thought of it.
So, I'm at least one counter-example, and I know of numerous intelligent and erudite friends and bloggers who also fit this description. I wonder if you can perhaps provide some examples to support your claim that Java and C# programmers have no depth of understanding?
Maybe they don't want their coworkers to go nuts inventing new features and then be the ones that need to maintain them.
It reminds me of people who buy stackable shelves and drawers to store their crap and make some room. Sometime later, they buy vacuum-sealable bags to store things that they bought after they made some space. As time passes, they start digging for a new basement and add another floor as an attic to store more things.
Java vs C# programming sounds a lot like two hoarders of the kind described above, except one has enough room behind his La-Z Boy to recline to 120 degrees, while the other only gets to 100.