This article generates lots of controversy since it touches on a constant dichotomy in programming: getting things done vs doing things correctly.
PHP is, by anyone’s criteria, the exemplar of “get things done”. The language has no consistency; it is simply a collection of hacks to get things done.
C#, on the other hand, is a fantastic example of “doing things correctly”. They have a rigid process for shipping updates to the language; since I started using .NET 1.0 almost ten years ago, I’ve only gone through three upgrades ( -> 2.0, -> 3.5, and -> 4.0). Each upgrade brought with it critical new features, and deprecated some existing features.
However, at each point in the process, if you were stuck with a program that depended on an earlier version, you could continue to run it using the older libraries. This is critical. C#, and .NET in general, has what can be considered a “stable environment” for revisions of the language.
Java, on the other hand, is far from a stable environment. There are dozens of competing implementations which have their own quirks. It has gotten better in general as people have gradually standardized on Tomcat, Glassfish, WebLogic, or JBoss.
Yet, Java has one problem that C# and .NET has managed to avoid: fragmentation of the namespace. As new features people want crop up, open source libraries jump in and begin implementing them. Nowadays you can browse MvnRepository and find dozens of competing standards for anything, which means that most programs explode in dependency usage over time. This can be resolved by an initiative to merge libraries into the Java core class system; but it’s tricky and steps on lots of peoples’ toes.