Language fluency, on the other hand, does exist and is very valuable. It shouldn't be a prerequisite for a full-time hire, but not everything about a platform can be inferred from first principles. Understanding the idioms and pitfalls of your tools comes from practice and experience.
You are absolutely right. For my current client I had to pick up C# very quick. Before that I had only created a couple of "toy programs" to play with the language. But I already knew a lot of the concepts behind C#: Inheritance, delegates, properties, lamda expressions, ... so learning the new language was really easy and I completed the first programming tasks within the first week.
Unfortunately some recruiting agents only do simple pattern matching and they won't forward you CV to a client when you do not have $language_name skills :(
I noticed this, too, about recruiting agencies. Funny thing was when they were looking for 10 years of experience in C# before it was 6 years old.
I have heard a small legitimate argument for strong familiarity with specific tools: although you may know how to program very well, you may not be familiar with C# libraries, and that can mean implementing code already available in a canonical way.
Word. Agree completely with your comments georgie.
Although there are high level abstract programming ideas that are beyond any particular language, the only true way to learn about them in any practical/actionable sense is to program in a language that can express those ideas.
It's very hard to understand recursion or closures without expressing them out through a language. I don't remember who said it 'but programming is understanding.' Likewise how do I know you understand object oriented programming unless you can program idiomatically in an object oriented language like Smalltalk, Self, or Ruby?
Or how do I know you can program functionally unless you can program idiomatically in a functional language like Scheme, Haskell, or Erlang and not in some hackish, crude way but idiomatically? But in order to program idiomatically and elegantly in the respective languages requires learning libraries, learn the constraints of the language, its quirks, its opinions,etc.
Hmm.... "I am skilled at object-oriented programming." Seems grammatically correct, everybody knows what I mean, there's no particular ambiguity in it... compare with "I am skilled within object-oriented programming." which as a native speaker I find clearly wrong. What exactly are you saying?
I'm starting to split hairs here, but I'd say the skill lies mostly in the action of programming, and not in the methodological use of object-orientation. That is, you are a skilled programmer within that paradigm.
Nobody but recruiters care about "Programming Languages Skills"
And if that's the case, at the beginning of the year I thought I could get a PHP job, but I didn't have that skill, in fact, it served me to remind me how much I hate PHP.
My "programming skills test" was to create an auth system for PHP, stuff are pretty broken in that language IMHO, I just couldn't during the time frame they gave me even though I do understand all (and a lot more) concepts behind PHP. I got confused with simple stuff like "chaining methods" something I just take for granted in other languages simple didn't work.
I think people need to understand core concepts of the field, but honestly, you will do fine in most jobs if you don't use certain concepts, ever.
Say, decorators. Or metaclasses. Lots of those are hairy little edge features of a language (where some are quite useful features you should be teaching to new people in your shop if they don't know them already).
After several years, I find that programming languages are so similar that I can pick up the language aspect (syntax) of a new programming language in minutes, maybe hours, but spend time weeks learning the library. So I agree with the author.
Does knowledge of standard libraries on a language platform count? Not really. It means you're good at learning libraries. It says nothing about your programming skills.
I strongly disagree with this bit. What are programming skills if not the ability to effectively get things done? How is domain knowledge not, therefore, directly tied to programming skills?
I agree with what I think your broader point is, that classes of knowledge (e.g. imperative vs. functional) are more important to note than, for example, particular languages. However, when it comes down to it, deep knowledge of the platform is the difference between clean code that's working quickly and spaghetti messes that take forever. I say this as someone who has written plenty of spaghetti. ;-)
It's true that having knowledge of libraries is valuable, because as you say, how will you get anything done otherwise?
However, there's a certain type of learning that only occurs once, typically when you're first learning to program.
For example: you need to download data from a web page and parse it. If you're a total newbie, you first need to understand that there's a protocol (HTTP) involved, and that libraries exist to parse the markup language (HTML).
Just knowing that those libraries should be available in your language (standard or otherwise - another piece of knowledge) is valuable. But once you've done it once in one language, you'll know the approach for all other languages.
Another way to put it is that it's all important, depending on which problems you're trying to solve. But putting all your eggs in one basket is problematic and does not necessarily guarantee programming skill.
I'm not sure. You can have a lot of knowledge of a domain without knowing how to program. You can have a lot of programming skill and not know anything about a domain. The two ideas aren't necessarily going to be joined at the hip.
That being said, I agree with your broader point. Having both domain knowledge and programming skills are key to being effective on a project.
I should point out that by "domain knowledge" I meant the domain of a particular language and/or platform. For example, having a deep understanding of what is available in .Net in C#, or STL + Boost in C++, or CPAN in Perl.
Real-world domain knowledge is somewhere between helpful and vital, depending on one's role.