During last 60 some years after computer was invented, there have been hundreds, if not thousands, programming languages. If we include domain specific language (DSLs), which accorinding to Martin Fowler may include regular expression, spreadsheet, etc, the number can be even bigger, not to mention more programming languages continue to emerge.
This would be a big burden if we have to learn all of them. Luckily, we don’t have to. In fact, most of us just need to learn several most popular ones. Even better, these popular languages may look very similar in syntax. As a result, the total efforts to learn them are not proportional to the numbers.
Lost VMs or Containers? Too Many Consoles? Too Slow GUI? Time to learn how to "Google" and manage your VMware and clouds in a fast and secure HTML5 App.
Like everything else, it’s hard, if possible, to define “enough.” There is no absolutely “enough,” but relatively “enough” to what you want to achieve. If you are embedded system programmer, C alone, maybe assembly sometimes, is most likely enough. It surely is not enough for application developers who need application languages like Java, C#, PHP, etc.
In general, a programming language is not very useful without its standard libraries. The latter becomes more and more important in modern languages, and represent bigger chunk of time in learning a new language.
To be really productive, you also have to familiarize yourself with extra APIs and frameworks, for example, Java Servlet APIs for developing Web applications. Some of them are really needed, but more are not in the sense that applying these frameworks does not buy you much but cost you more. The hard truth is that until you learn and sometimes try them out, you don’t know whether they yield good ROI. I’ve seen so many over engineered applications with unnecessary frameworks/APIs. My principal in general is, “whenever in doubt, leave it out.”
After learning and practicing some programming languages by myself, I feel it’s becomes easier and easier to learn new programming languages because most programming languages are very similar even though they look different. At a certain point after I learned Fortran, BASIC, C, C++, Java, C#, Python, Perl, PHP, I stopped learning new languages for the sake of new languages. I only learn new languages when needed by project, for example, ActionScript for my work. After a project, I might forget it, just like an application unloaded from memory.
However, as a developer you got to have one programming language in memory all the time. In real world, it’s better for one to be an expert in one programming language than know several but specialize in none of them. So instead of learning more, it’s a good idea to become an expert in one of your existing general purpose language. After all, the good tricks/tips and best practices are transferrable mostly. Once you master them in one, you are likely practicing them in others. This does not imply that you should code C# like Java – always follow language specific conventions. For example, you use deposit() method name in Java while Deposit() in C#.