In my few years of programming, I've toyed with everything from Ruby to C++. I've done everything from just learning basic syntax (Ruby) to completing several major (for me) projects that stretched my abilities with the language. Given this variety (and the fact that truly learning a language never stops), when can I say I know (or have learned) a language?

We're looking for long answers that provide some explanation and context. Don't just give a one-line answer; explain why your answer is right, ideally with citations. Answers that don't include explanations may be removed.

12

I think the word you're looking for is "mastering" a language, "learned" in this context is a bit strange.
–
Pieter BJun 29 '12 at 14:20

7

"Words are for meaning: when you've got the meaning, you can forget the words." - Zhuangzi
–
jfrankcarrJun 29 '12 at 15:12

9

when you don't have to ask this question, you will have learned what you need to know ...
–
Jarrod RobersonJun 29 '12 at 17:27

1

@JarrodRoberson Is this Zhuangzi who said that too?
–
jadkik94Jul 4 '12 at 20:37

2

According to LinkedIn there is very low bar to put up a programming language on your skill resume... According to my LinkedIn people who've seen Java code before apparently feels comfortable listing it in their skills section.
–
Chris DaleJul 6 '12 at 9:25

9 Answers
9

At what point can you say that you've "learned" a language like English or French? I think most people would accept that you've learned a language when you can use it to communicate. You don't have to know every word or understand every idiom, but you should know most of the (rather small) subset of the language that people use in daily conversation. Having "learned" a language to that extent, you can continue to learn more as you use the language daily and expose yourself to more and more of it. By the time you die, you still won't know all there is to know about the language, but nobody will say that you never "learned" the language.

So it is, I think, with computer languages. You can say that you "know" a language like C++ or Ruby when you can write useful programs in it. If you need to quantify the degree to which you know the language, use the same terms that you'd use for a human language. Say "I know a little C++" or "I know conversational C++" or "I'm fluent in C++" to mean that you know just enough to scrape by, enough to get useful things done, or that you're an expert, respectively.

The terms conversational and fluent are rather subjective and while appropriate to natural language, it is difficult to see what they mean when applied to a computer language. Although still subjective, functional and idomatic may work better. Functional implies that you know the syntax well enough to write useful constructs, while having an idiomatic knowledge implies that you not only know how to write in the language but also know it well enough to use the idioms of the language, such as using using in C# or b, a = a, b and generators in python. Otherwise, +1.
–
Mark BoothJun 29 '12 at 15:16

12

@MarkBooth Any description short of a score on an exam will be somewhat subjective. The point is to use the familiarity that most people already have with levels of knowledge of human languages as a rough guide to knowledge of a computer language, and to do it in a friendly way that invites further investigation. Conversational C++ is shorthand for "I'm familiar with the basics, but you may need to help me with advanced, obscure, or tricky code."
–
CalebJun 29 '12 at 15:31

3

While I think you're mostly right, I think a lot of people wrongly assume they have learned a natural language when they still have a miserable level. And it applies also to people who say they've learned programming languages.
–
haylemJul 1 '12 at 13:26

I think your answer is perfect, it even shows how much it's impossible to quantify language knowledge. Indeed, while fluent means you can talk about most anything, with about as much explanations as a native speaker would require, this does not address the fact that most native speakers don't possess a tenth of the language knowledge good old writers have (no, not harry potter or dan brown, real old style hard to read stuff). How would you address that, when in fact nobody has bothered addressing it for languages ? and when in fact it does strongly impact productivity in programming ?
–
Morg.Aug 23 '12 at 12:54

1

@Morg. What utter rubbish. Programming is as much about communicating with future programmers (including yourself) as it is with telling the computer what to do. Sure, simple write one code might not need to be communicated well, but in the real world making your intentions clear to future maintainers of the code is far more important than getting the computer to do the right thing. Anyway, these comments are no longer serving to help improve this answer, so I would suggest that we take this to Programmers Chat if you want to discuss it further.
–
Mark BoothSep 5 '12 at 12:14

The person who asks propably has a certain idea what level of skill is expected from someone who says that he has "learned a language."

Basically, i encountered two archetypical scales, by which people judge the answer to the question "have you learned X?"

For most nerds it is a trick question to weed out posers
This is already demonstrated by the other answers to your question ;).
If you say you learned it you fail in seeing the scope of the task, which is implicitly "perfection", and, much worse: you fail in humility.

For most bosses, you "have learned it", if you can solve their problems, a criterion oftentimes already met if your code compiles. Answering his question in a humble way will lead to him assigning the task to a poser who may also be a relative.

In interviews, you know it if you know it. In the workplace, you know it if Google knows it.
–
asfallowsJul 6 '12 at 14:07

2

In interviews, it's "i know it" if the interviewer wears a tie, and it's "please define 'to know'" if he does not ;). To be fair, most interviewers ask if one "has experience with", to which i am more easily inclined to answer with "yes"
–
kepplaJul 12 '12 at 15:17

I think people are focusing on the finality of the word "learned" being perfect tense it means you're finished learning. And as everyone noted, programming languages are living entities just like spoken languages. For example someone who had complete mastery of C# 2 would look at C# 3 with LINQ, Lambdas, var keyword, object/collection initializers, and extension methods and find that a lot has changed from what he learned for the previous version. The same is happening with C# 4 with await, async keywords and other new language constructs.

And we're just talking syntax here. We forget that most languages are paired with a framework. C# has the .NET framework, Java has it's own framework, as does Ruby, C++, PHP, and PERL. Think of the framework for a language as the vocabulary and the language itself is just syntax. Knowing the language means you know how to make a sentence in the language. Knowing the framework means you can express yourself well in the language. Finally, once you know the syntax and vocabulary, you need to learn the idioms so that you write code as a "native speaker".

I'd say there are several levels of learning.

Hello World (you can write the most rudimentary programs.)

Proficient (you can write basic programs but need to consult online help regularly)

You can rarely say you've learned a language. That implies you're done learning about it, which is... foolish.

Saying you know a language is fine when you can write code that isn't blatantly breaking idioms in the language (maybe after a week of de-rusting the knowledge) without referring to a syntax reference.

Idioms change, styles vary from one place to another, and indeed languages themselves change over time. If you can't say that you "know" or "have learned" a language like C++ until you're done learning about it, then there are very few people indeed who can claim to have learned C++.
–
CalebJun 29 '12 at 14:46

This is more of a opinion based factor. In all technical terms "Learned" would mean having a complete knowledge of, as in you would be expected to know EVERYTHING of the language.

However in the world of programming I believe it's more about if you can program fluently in the language to complete a objective/task. It also probably means if you're comfortable with the language. Sure you could go out there and get a degree after years and years of college, but that's only to get noticed? You define when you can say you've learned a language.

When you start noticing its flaws. Once you start learning a language you are usually still busy learning now to do stuff or are much involved in it to notice where it fails (of course, this is unless you start learning it from a negative point of view just to see how worse it is compares to your favorite language so far). I'd say you don't truly know a language until you are acutely aware of the areas where it fails.

I can't agree with that. It may be true for the first language or two you learn — you may simply not know what to look for, so even the most bletcherous design failures are indistinguishable from the right way to do things. Once you've learned a few languages, you should start to be able to see language flaws soon after you start learning a new one. But then for a while in your development, you will erroneously equate "different" with "wrong." Until you learn a few languages of each major type (procedural, OO, functional, declarative...) your immediate judgements will be suspect.
–
Warren YoungJul 2 '12 at 23:56

At the point when your application or component can read mail, i.e. Zawinski's law, which states:

“Every program attempts to expand until it can read mail. Those
programs which cannot so expand are replaced by ones which can.”
Coined by Jamie Zawinski (who called it the “Law of Software
Envelopment”) to express his belief that all truly useful programs
experience pressure to evolve into toolkits and application platforms
(the mailer thing, he says, is just a side effect of that).

This was updated when RSS became popular to "... can read RSS feeds" and probably could be updated these days to "... can read Twitter feeds". ;-)

I think you have learned a language when you don't see it. You don't see the for cycles and data accesses, but the workflow of the algorithm.

You don't play tricks with parameter passing and array processing, magic macros. You don't think of your code as a self marketing material to show to your friends and teachers, but to express your understanding of a problem, and your will to the computer the most readable way.

You have habits that help you avoiding lots of mistakes just by following them, like: use {} code blocks and () in expressions even if you are absolutely sure that "it will be only one line" or "I am no fool and know operator precedence order".

You stop counting how many classes, patterns and framework APIs you know. This is what intellisense, the references and tutorials, and the Google is for. But when you look at a problem, you immediately know what parts it can be split, and with what tools and algorithms you will solve them.

What you do works, is elegant and small. You enjoy coding and easily find your bugs. Yes, masters also make bugs because they are humans - but they find them quickly because their code structure leads them to the right place.

And finally realize: you have learned to think, analyze and solve problems; compared to them, the actual language is secondary, just the current box of rules and tools.