TL;DR

When talking about development skills, we encompass many different yet important things (languages, libraries, frameworks...). Those buzzwords used on CV or job postings have real world signification, but when we say that someone is skilled in the Spring framework, what do we mean ?

About development skills

As stated before, we are convinced that software development departments and companies have only one asset: their developers, and the skills they possess. But before talking of identifying or analyzing skills (or about which skills are the most important today - and tomorrow), we need to go back one step unto the definition itself. What are development skills? While examples are aplenty, the definition is not so easy to make in a clear and pragmatic way.

When you said from a colleague or yourself that (s)he's skilled in a specific technology, what do you mean?

The Resume Buzzword Game

On of the place where the skills identification and presentation is the most abused is the resumes, and the inevitable (?) long list of buzzwords and three letters acronyms. Here are some examples (from randomly picked resumes) :

  • J2EE, Maven, Eclipse, Spring, Hibernate, Tomcat, JSP, XML, UML, SQL, Java, JavaScript, JBoss, CSS, SOA, PHP, Windows, Architecture, Struts, JSF
  • C, C#, C++, .NET, VS.NET 2005, ASP, ASP.NET, JavaScript, HTML, XML, ASP.NET, Web Services, XSD, XML, Html, JavaScript, XSLT, CSS, WCF, ASP.Net AJAX, AJAX Control Tool kit
  • PHP (5, 4 and 3), MySQL, XHTML / HTML, JavaScript, CSS, Zend Framework, Drupal, PEAR, Smarty Template Engine, SVN (user and Admin), CVS, MVC, SQL, Apache Web Server, Sendmail and Qmail Setup and Config, Cold Fusion 5, Perl/CGI

You probably saw that the first line is from a Java/J2EE developer, the second from a .NET Web developer and the third one from a PHP developer. It should be equally easy to understand the concrete capabilities of those three people, or at least it should, as those lists are probably the first thing used by HR or body-shoppers.

More importantly, those are the terms that most non-technical people (project managers or others) may use to match people with project or job positions. Developers skills does not concerns only other developers, so some kind of common language is useful.

Typology

If we want to make those kind of information useful (I'll consider it correct, putting aside the fact that it may in addition be totally invented, deprecated or exaggerated), a first step would be to classify those in coherent categories. Based on the above list (disregarding things not directly linked to development), we could make something like this:

Programming languages

A first group is simply the knowledge of various programming languages (Java, C#, PHP, JavaScript), not forgetting the more declarative/GUI (HTML, CSS) and the various XML offspring (XML, XSD, XSLT).

Programming tools

This one need subcategories: IDEs (Eclipse, Visual Studio...), Version Control Systems (CVS, SVN, git).

Databases

Various providers, with sometime the specific versions (Oracle 10g...).

(Web)-Servers

Various application servers: Apache, IIS, Tomcat...

Patterns

Programming is not only about language, in the same way writing is not only about grammar - style and construction matters. The word patterns was popularized by the "Gang of Four" book, and has helped a generation of software engineer to talk about precise things in less words (e.g. A Singleton - A class that can be instantiate only once). MVC is probably one of the most popular.

Framework and libraries

I less and less ask people if they "know Java". Large (and not so large) projects in most language ecosystems use a massive amount of libraries or framework, whether they are a part of the platform itself (java.util, ...) or packaged separately. Those things make a good part of a developer "list" (Hibernate, Spring, Drupal, Zend, .NET, J2EE, ASP Ajax Control Toolkit).

Meaning

While some of the points may be binary (know/do not know), when it comes to most important points, you cannot stop at "knows/do not knows". I've outlined some options for specific points below, but would be most interested in your take on this:

Languages

What would be measure or indicators of a skill in a programming language:

  • grammar (can write code without syntax errors)
  • use of languages constructs (anonymous inner class in Java, closures in Ruby, delegates in .NET)
  • convention (naming, indentation ...)
  • style (best practices: declaration of variables, iteration, documentation... )
  • patterns (can use and recognize typical constructs such as a Decorator, a Singleton)

Framework or librairies

What could we define behind the "knows Drupal" (or Spring, or ASP.NET)

  • specific classes/functions
  • modules (for large frameworks such as Drupal or Spring: knows about Spring Security)

Expertise

Now that the skill is identified, not everyone knowing Drupal Token module has the same level of expertise in this one. What would be a good way to specify this expertise (I'm quite fed up with the "junior"/"medium"/"senior") thing? Levels could be useful, if we can attach concrete meaning to them, but what would be good indicators?

What is your take on this matter? What do you mean when you say that you're "proficient" in a given technology? What do you need to know about someone skills to know if he's the right person for the job?