You can’t teach height. This piece of wisdom, attributed to legendary Celtics basketball coach Red Auerbach, has long been my guiding principle in the hiring of software developers. I’ve always tried to minimize the “required technologies” list that HR asks for and, if anything, have looked skeptically at candidates who qualify themselves as a developer in language “X.” I’m beginning to reconsider.

It’s not that mainstream programming languages have dramatically changed. Sure, dynamic languages have shaken things up, but object-orientation is still the dominant paradigm, and if you’re going to discuss the large-scale structure of an application, the odds are excellent that you’ll be speaking of classes and packages and objects.

You’ll also likely have a lot of discussion of libraries and support tools. It’s these that have dramatically changed and diverged in just the past few years. For one thing, the industry has embraced the idea of “opinionated” frameworks, such as Ruby on Rails or ASP.NET MVC, that produce large amounts of scaffolding. Although the scaffolding is often replaced over time, such frameworks create a starting point for development that is far from a blank page. If you are not familiar with that starting point, you’ll be fighting against the tide.

Another area where there has been remarkable divergence is in persistence. The acceptance of a large SQL database as the be-all and end-all of storage has dissolved. Developers of consumer-facing websites are rapidly realizing that they primarily deal with static or near-static data, and that the benefits of normalization (ad hoc querying, single point of update, storage optimization) are often outweighed by the costs (database connection bottlenecks, object-relational impedance mismatches, caching challenges).

While it’s fair to say that there are some general trends towards schema-less databases and caching infrastructures, each platform varies greatly, and a wrong assumption can lead to a nasty dead end (“Can we use LINQ with MongoDB?” Beats me, and I’d hate to guess wrong).

Similarly, the user interface of Web applications is rarely decoupled from the server-side implementation. AJAX, for better or worse, means chatty interfaces between the page (or is it a block with a Flash or Silverlight canvas?) and all that static data on the server.

So essentially, the common ground in all three tiers has melted away, leaving the generalist programmer on an increasingly untenable ice floe. Specialization is more common and more reasonable than ever in job descriptions. This is dismaying for several reasons.

For one, the old advice that a knowledge of C++ makes one universally portable across programming opportunities is no longer valid. (As I mentioned in a previous column, a knowledge of JavaScript has become a necessary, but not sufficient, skill for a development career.)