Some friends recently saw my resume and asked about the 40+ languages that I claim to have written code in. Essentially, they asked why I have that claim and questioned if it was even factual. I have that claim because many employers want someone who knows ‘Special Language X’ in addition to all the other qualifications. In any interview, I usually explain this as follows: “I want to make it clear that no matter what odd wrinkle you have in your system, I know enough about languages and programming in general to tackle your special case.”
Still, 40 sounds like a big number. How, exactly, did I arrive at that figure? First off, understand that many of the languages I have programmed in have had little more than two weeks of the following:
- Learn the language. This involves finding a good tutorial and burning a day getting conversant. The language choice was frequently driven by either class work, larger system requirements, or “this looks like fun”.
- Write the application. Again, this might be “deliver a PHP web page,” an assignment, or an interesting experiment.
- Deliver the application.
I have used enough of these to know that learning a new language is something that one can do in a day or two. Mastering a new language and its toolset still takes some serious time-I would guess about 3000 hours of full time use prototyping, developing and debugging in that language. Many folks tend to learn a language by learning just enough to get by. In mastery, I would say that the person also actively tries to understand the language grammar, libraries, and how the language interacts with the systems it runs on. 3000 hours just getting stuff done will not allow for mastery.
With that in mind, I’ve probably only mastered a handful of languages:
- Visual Basic (3.0à6.0)
For another set of languages, I’m just at the intermediate level. I define the intermediate level as this: the user can write moderately complex systems with minimal access to reference material. Code can be debugged, augmented, and generally ‘read’ with little to no difficulty. This encompasses a larger set of languages-some of which are cheating but included since I see so many places where things like each XML technology counts as a separate ‘language’:
- Basic (think QBasic and its relatives)
- DOS Batch programming
- Ladder Logic (programming Programmable Logic Controllers/PLCs)
- Visual Basic.NET
- x86 Assembler
Finally, there are the languages I’m a beginner in. Let’s define beginner as a language one can read and write with the assistance of the Internet and a good reference book. At some point, I have written at least a small application (~2 weeks of effort) in these languages:
- Bash shell
- Motorola Assembly
- Objective C
Is this a long list? Sure. But I also know of many folks who know far more than this. Consider any language designer or language geek. Many of these folks have actually mastered more languages than I’ve gotten to beginner on.
Finally, I want to take note of one recent observation. In the past 5 years, I have slowed down the pace at which I learn new languages. This is happening largely because C# and .NET are providing many of the facilities I would normally need to be more productive. C# 3.0 has added functional language features in the form of LINQ. Its libraries are surprisingly rich. .NET provides so many other features that I’m finding that its pace of innovation is keeping me busy enough without needing to look elsewhere to get the productivity gains I used to look for in other languages. .NET adds wonderful libraries, language features, and more at such a pace that I don’t have time for learning language X when technologies like WPF and WF are beckoning to me.