I'm curious. For you people who are developers, and especially for you people who are project managers and such hiring people. When do you say you "know" a language? Some people say they know C++ after taking a semester of it in a class at a university, but that class (unless it was a software engineering course) probably went over the computer science side of things which doesn't touch the standard library usually. Can you really say you "know" a language without learning its standard library? Further on this side of things, people have said that learning 1 language from the OO paradigm (C++/Java/Python/etc.) teaches you basically every language. Is your definition of "knowing" a language just that the person understands the main paradigms the language uses? Now going on the stricter side of things, can you only say you "know" a language once you're able to use most if not all of the language's built in capabilities without referencing any books or websites? Can you only say you "know" a language when you can code a certain program in that language within a certain time limit? Can you only say you "know" a language after you've mastered the language, its standard libraries, and most of the common 3rd party libraries people have written for it? When you hear someone say "I know <some programming language>," what do you assume about their knowledge? When you say "I know <some programming language>," how much knowledge are you referring to? How much do you have to "know" about a language before you put it on your resume? Do you make a distinction between "knowing" a language and "having mastered" a language? If you do, at what point have you "mastered" a language?
If you know just a syntax and some of the main std libs - you are a beginner. I'd say after 2-3 years of active usage, developing best practices in that language you can say you know it. Learning an OO language does not teach you any actual programming. You can know a language's syntax, std libs, how to write a working program, but if you can't even explain the pros and cons of single and double linked lists you can't call yourself a developer. Also you should know how that language actually functions. E.g. if you say you know c#, you should be able to explain how the garbage collector works. You can say that you mastered the language then you can pretty much compile it in your head. I've been using C for ~6 years now and I still can't remember 80% of standard libraries (but then again, I usually don't have a luxury of an OS or space to even fit a full implementation of printf).
Soft Eng and computer science are the same program in term of programming classes. To know a language, it's not about knowing the syntax only, or doing a class. It ACTUALLY doing a project, working with it. That is what companies like to see on your resume (school/university projects they don't care at all, except from your phD, and research of course). Doing a project, especially a "complex" one (for your skills), shows that you know how to work with it. But it will take easy 10-15years of working on it, to start actually knowing a language. But based on your career experience, the interviewers knows what you mean by "I know your C/C++" or wtv language.
If you can sit down with a project idea, turn it into pseudocode, then write out that pseudocode in your chosen language only checking on the internet for function definitions or the like, then you 'know' the language, IMHO. Usually this level of fluency comes after doing an actual project in that language and understanding some of the ins and outs of the language. I wouldn't consider knowing all of a standard library to 'know' the language itself - I can build almost any program in C++, with only a small knowledge of the C++ standard library. Ask me about bitsets or stringstreams and I will probably go off to C++ Reference to figure out what you are talking about. Once I have actually used that said library feature, I can add it to my digital repertoire of C++ knowledge. Instead of judging programming knowledge through the use of the language itself, I find it much more useful to ask if a person 'knows' a library for that language. I do not 'know' OpenGL, even though I consider to 'know' C++. This would make me unsuitable for a game developer using C++ and OpenGL (setting aside the fact that I am not working age yet). On the other hand, I have used boost::asio a few times, and I consider myself to be about halfway through 'knowing' it. I can recall some base classes and functions, but beyond that I would need the reference. The whole reference idea also adds another bit onto the notion of 'knowing' a library. If you still often need to read the reference pages to figure out what each function/class does, then you are just starting to learn the library. When you can remember most of the functions/classes, but still need the reference to verify some of the function calls, then you are at an intermediate level. Being able to create a program without the constant use of a reference, then 'knowledge' has been attained. It is when you do not need the reference at all (this almost never happens) then you can consider true proficiency of the library. Therefore, knowledge of a library is in a state of flux, with infinitely many possibilities. Absolute 'knowledge' is almost impossible, so we have to be content with having a reference page close to hand As for the OOP paradigm - I do not think that just knowing the general syntax of a language can be attributed as knowledge of the language - knowing the ins and outs of each particular language is very important. Also, libraries. See above.
Those are all awesome responses. In the past 3 replies it's pretty obvious that you guys don't believe syntax knowledge or paradigm knowledge is enough to attribute language knowledge to someone. I do want to highlight one part of my question that's getting a bit ignored though: At what point in learning a new language did you decide "this is going on my resume" or "I can say to my interviewer that I know this language"? Is that the same point that you defined above as "knowledge" of a language? Or is it a different point? This question was meant to move this discussion a bit in the practical direction. So beyond just your idea of what "knowledge" of a language is, how do you apply that idea to your life?
I think if you have a working knowledge of a language (enough to write whatever you want to write) then it's good enough to put on your CV. Don't be afraid to put stuff like "rudimentary" or "a working knowledge of". This is what I put on my CV when I was applying to do work experience placement at a games developer: Looking back on it I would probably write something different now, but you get the general idea.
I would almost say it's when you know the syntax and could create a rather simple program using the language. It is slightly more than that but you get the idea. Much past that and you are just getting more knowledge about the language.
When I feel comfortable enough that I can write on a white board that language for my interview, I mention it. (P.S: know your data structure very well. It's THE main class in Soft Eng and Computer Science, if you come out with a B- or lower, I would suggest to re take it, or self study it again... You can be sure at 100% your interviews, especially at a large company, will be mostly based on that. Another important class is Operating System, while it won't help you for an interview, you'll need it for when you program, as you need to know how O.S works).