I think there's room for both in any group. I would love to have someone who's an expert in language001 but having someone who's flexible in several languages is awesome too.
Be expert in at-least one but always have a zeal to know new things.
Both, I think.
That is to say, you should (and will) always have your current "go to" language that you use for everything that doesn't already have a language or platform dictated. For me, that started as Perl and later moved to Ruby (I adore languages that treat regular expressions as first class citizens), and right now I'm sort of between languages as my current crush. You might even have a few "go to" languages depending on your interests (e.g. what you like to code when you're not being asked by somebody else). These are the things you will know deeply and the things you'll likely regard as your "master" skills. You may even be lucky enough that the languages you use for work coincide with those that you enjoy the most. This is where the depth of your knowledge will be the greatest.
And then you have your breadth of knowledge. I can also code in C/C++, Python, Go, Java, JavaScript, Elixir, Bash and a ton more I've probably forgotten about, but I'm not a "master" of these languages per se, and there are still things that elude me at their lowest levels because I've not yet needed or felt compelled to dig that deeply (where as I've read the source code for Ruby and I can think in terms of the VM as well as my own code that is running in it).
So, yeah, both. Be a jack of all trades, master of a few.
I think of it this way, find a language that you like (hard to choose I know). Get to know it on an expert level (there is a talk about ~5 years you can become an expert at anything...), and know the supplemental languages that go along with that language.
For example: If you are a Java or C# web developer, you should be an expert in the core language and also be moderately efficient at the supporting frameworks and languages (Javascript, HTML, SQL, NoSQL, Scripting, Angular, etc).
After you gain an expert knowledge base in a language, then the sky is the limit on what you concentrate after that. Once in the workforce, my primary language (.NET/C#) became almost boring so I've picked up a side framework for fun (NodeJS because Javascript is the language and I already have a modest knowledge in it). But I also have a beginners/intermediate knowledge in C/C++, Java, Python, and PHP.
The real key is this, if you engineer in a small set of languages day in and day out as a job, you will eventually become an expert in it. So choose something you like and can obviously find a job in. Then everything else is fun-time or mental growth.
In my opinion, being master in your field is necessary, but having general knowledge of other languages is a must.
Both. I'm thinking along the lines of being a "T-shaped professional":
Specialize enough in one area so that people know you are the "expert" or "go to person" for anything related to that area. This is the area people remember you for. But being broad across skill sets helps in working with others as well as having a broader perspective.
As others have mentioned, it can be a bit of a false dichotomy -- particularly if you stick within a particular class of related languages.
It's pretty easy to move between most of the several C-like languages, for instance, if you become an expert in one. In those cases, it's mostly just about noting the syntax differences and learning your way around the standard libraries but you'll hit the ground running, already better than half the people who claim to program in that language. Moving from there to something like OCaml or Scala is a more challenging.
I think that learning several paradigms is more important than multiple languages as it makes you a better programmer no matter which you are using. It's all about having the right tool for the job but that doesn't necessarily mean switching languages since most paradigms can at least be faked in a useful way in most languages.
Several modern languages let you play outside a single core paradigm and I personally think it's good to start with one of them. C# is probably one of the better examples of a broad multi-paradigm language. To be a true expert in it, you've had to learn imperative, declarative, object oriented, generic, reflective, dynamic, event driven, parallel, concurrent, cooperative (coroutines), functional (lambda calculus), relational (tuple relational calculus, like SQL), object-relational, expression oriented, generators and likely others I'm leaving out. If you branch out from the first-class language features you can get several more esoteric things like actor model and flow based (dataflow and reactive) as common add-on libraries. The broad base makes it easy to add things that feel like first class features -- for instance, I recently created a library using the aforementioned dynamic and expression functionality to add prototype-based programming just so I could better interface with scripts written in JavaScript. The point is, if you've learned all that then moving to OCaml won't be radically harder than moving to C++. Whether you'll ever need to is another question.
From someone that's been a fullstack all my programming life, I completely hate the concept of "jack of many programming", "jack of all trades", "fullstack", or any other names that referrer's to a person that those multiple things. I think it only benefits the the companies and never the developers.
Probably thats the reason we have so much bad code out there.
Now you are coding c++, 5 minutes later you are configuring AWS stuff (using terraform + ansible), after a while your coding PHP because some bug show up, later in the day you have to code some random language that you never seen before but the company uses it, so you go to stackoverflow and copy and paste some code, and after that you wash the dishes and you code some more python (because you the last time you coded python was 5 months ago for 5 minutes), and then happily you finish the day coding Go because the company is converting php to go.
Is not possible for anybody to learn anything like this.
It might be good if you want to fill up your CV in Linkedin full of random stuff that you did and that you don't know anything about it. (sometimes recruiters like that, "wow this guy is amazing he/she does so many things")
I also understand that sometimes you need to do several things, specially if your doing your own project, or you are in a startup in the first year (of the startup existence and there is only 2 or 3 people). But this should NEVER be the rule.
PS: Sry this touched a very sensitive point for me.
Both. It's a false dichotomy. I'm reminded of the relative value of different 'shapes' of people on a team (see link below). I value being a generalist, and I'm working on developing depth in a few areas. The more languages you learn, the easier it is to learn new ones. Languages roughly fall into different families. Learning something from each family seems like a good strategy for developing a breadth of knowledge. Where to focus learning in depth depends on what you are trying to accomplish. tcagley.wordpress.com/2016/06/14/productive-agileā¦
In my opinion both. Jack of many and master of few.
Knowing many languages widens your perspective towards possible solutions to a problem and a number of ways the problem can be solved efficiently. You know different paradigms and how those can be effectively incorporated in cross functional languages.
For instance if your favorite languages doesn't support closures (No native/ library level implementation present ) but, you got to know about them from some other language, you can implement them in your language to solve the issue more efficiently.
Computer science is not about learning lots of programming languages or mastering one language for the rest of your life.
It's about solving problems. One should be ready to learn whatever it takes to solve that problem. Different languages solve different problems. Some languages are created to solve particular problems, some problems can be solved by multiple languages.
Now the question is, what problem you are trying to solve? Knowing a language and not using it to solve problems is not very useful.
If you are working in front-end - Javascript
If you working in back-end - ( Javascript, Python, Java, Ruby ...... etc)
If you are working with database - ( SQL, CQL ... etc)
If you are creating something which is close to metal, need high performance - C++
If you are working on machine learning - Python, R ... etc
etc
Tip - Select a problem which interests you. Research which language solves that problem. If there are multiple languages then check out advantages and disadvantage of those languages and which on suites your problem. After that learn that language, solve that problem, if problem requires deep knowledge about that language, then master that language. It is simple, not easy.
One more thing, if you are master of X language and problem is requires Y language, your knowledge of X will be important because languages are syntactically different but conceptually most of the language are same. So concepts that you learned in X will be helpful for you to grasp Y.
I think it's important to be both, however you definitely should not be a 'master of none' - try to to master at least one thing.
Pascal, Delphi, C, C++, perl, Python, PHP, Java, JavaScript, Dart, Kotlin <- these are the languages I've built big systems in. That's approximately a new language every year and a bit.
Knowing a lot of languages helps you in picking up more languages pretty quickly, but it also means you only get to experience the language superficially.
When i started using Kotlin about a year ago, I decided to specialize for a change and only use Kotlin from then on. The result is that I write much better, cleaner and idiomatic Kotlin instead of just writing elementary Kotlin. I'm not an expert yet, but feel I'm making steady progress towards that goal.
Tl;dr; know a lot of languages, but choose one and specialize in it once you've figured out which one fits your style better - Jack of All trades, become a master of One.
I think it really depends on your job. At a startup type of environment, a jack is better but in a more developed environment, specialists skills are more necessary.
I am an agnostic but I've mastered some languages .... I think it's more religion than anything else and ofc what you want to do ....
If you're going for prototype development a broad knowledge of languages is what you need. If you're going for longterm projects a deep knowledge of a language helps a lot. But still you will refactor and learn every time ... and the most pitfalls are well documented.
There is no real answer but what you actually want to achieve ....
In my opinion, it's always good to be master of a few. However, keep an open mind, know what's going on around you and take informed decisions.
Master of few. When I started programming a year ago, I'd be swashed away with sparkly little things or big frameworks coming out from every which way and all the time. And in the haste, although I was able to understand the root / base problem in hand, I wouldn't actually do anything to encounter it. So it would be equivalent to cramming things up, even when I understood the basics of it, what use?
This kept happening in my job as junior dev. I looked for the source of this detouring to so many resources and never really learning anything. Turns out for me, it was a job where some colleagues weren't that excited to learn new things and propagate them through the teams in the company. I started feeling a little alienated (and partly because I don't talk much). Hence I quit.
Since I've quit, I've focussed on just two things, in doing those things two small projects came my way (actually 3).
My point with all these point being, that I've chosen to focus to build things with Javascript for time being, since there's so much that I do not know it nudges me and make me cringe to know and apply the things that solves problems (I did try Elm to make a web page once, but that was it).
As a hobby, I explore and make small animation thingies with Processing Programming Language.
There will be other programming languages that I'd eventually use to make somethings, but for now I've chosen to grasp just one.
Cliff Rowley
Thinker, Tinkererer, Dork.
Mark
I'm not sure these are opposites. In my experience, learning different languages helps you be better at all of them.
Between these people
I'd guess the first one is the better Java programmer.