3

How many programming languages do you think a person can be proficient in?

 6 months ago
source link: https://lobste.rs/s/rrgyvm/how_many_programming_languages_do_you
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

How many programming languages do you think a person can be proficient in?

To be clear, I am talking about working proficiency. Able to create large, maintainable and “production ready” software that is understandable and idiomatic.

Most programmers will learn that once they’ve tackled picking up their second language, that picking up any amount of future languages is relatively easy. There are exceptions to that, of course, but broadly speaking you should be able to transfer the core concepts of programming between any number of languages. Going from OOP to Functional is an example of when that might be not so clear-cut, but as I say, there are exceptions.

So then, there is no real limit to the number of languages one can pick up. And it is likely for those who spend a career in software development that they will touch a lot of languages over the years, even if it’s only one time to adjust one line in some old project their company has been maintaining for a decade.

In the last three years, I have written something at least once in the following languages (off the top of my head):

  • Python
  • Elixir
  • JavaScript / TypeScript
  • Coldfusion

Despite that, I am not proficient in most of those languages. Mostly, I needed to make some changes and so looked up syntax as needed and got to work.

In the middle of last year, I had to work on a project for several weeks in Rust. I really enjoyed the language and was able to pick it up and right some reasonable code. My PRs were reviewed a bit more harshly than usual, but over the weeks I seemed to pick the language up well enough. Fast-forward to last week, when I decided I might start a person project in Rust - and it felt very uncomfortable. I was still familiar with the syntax, but I struggled to recall what was idiomatic in the language and which libraries were popular for various problems.

This got me thinking. Having broad experience is great, and I think makes one a better programmer. However, clearly it pays off to go deep in your learning of any tool you use to make money with. And so most of us (I believe) will only touch the surface of most languages, and go much deeper on just a few. And so, to the title of this post, how many languages do you think one person can be truly proficient in?

    1. varjag

      25 hours ago

      | link

      IMO it’s a bit similar to natural languages. The ones you use daily you get proficient with but if you ever stop using them they fade in memory. At the same time it’s really hard to get traction in a language that sounds fun to learn but gives you no opportunity to actually use it.

      I was really competent in at least 3 programming languages that I have thoroughly forgotten since. At any time tho it doesn’t feel like am proficient in more than a couple languages simultaneously, but maybe it’s just my tiny head. The concepts you learn however, the tricks and techniques still leave useful residue which is transferrable across the jobs.

      1. wrs

        24 hours ago

        | link

        I wonder if there’s also an analogy to “native” languages.

        I can be quite competent with a few languages at a time, but if I switch back to an old one I need some time to refresh. But I never seem to forget how to read and write C, even with a break of a few years.

        Now, maybe that’s just because there’s not a lot to C in the first place. But I first learned C at a young age and then used it intensely at school and my first professional job, so I sort of “grew up” with it. Maybe it’s my “native language” equivalent?

        1. At least for me personally, there’s something to this. 11 years ago I learned to program in Ruby, my first language. Since then I’ve written almost exclusively Go and Rust at my day jobs.

          I still feel like I “think” in Ruby. Code in my primary languages is idiomatic, and no one would pin me for a Rubyist by looking at it. But if I design an algorithm on paper, it definitely takes on the general shape of the pass-a-block/lispy style of Ruby that was popular when I learned. With some type annotations or pointer/deref operators added for clarity.

          I have no doubt I could sit down and write vanilla Ruby just fine.

        2. I’d say yes. There are videos of hyperpolyglots talking about language maintenance . I think it’s a strong analogy.

      2. At the same time it’s really hard to get traction in a language that sounds fun to learn but gives you no opportunity to actually use it.

        In a typical software developer career, the limit is certainly in the single-digits, but that’s not due to any hard limit in the human mind; it’s just because it’s extremely unlikely that an employer would pay a developer would get the opportunity to use a large number of languages nontrivially. If you did find some kind of dream job where using a wide variety of languages were part of your responsibilities, I’d imagine a skilled developer could get it up to 20, given that there’s a lot of overlap between languages on the same runtime, (Erlang, Elixir, LFE, for instance) or similar paradigms, etc.

      3. pushcx

        edited 23 hours ago

        | link

        I’ve had that similar feeling of knowledge fading out after a few years without regular use. I think it’s very similar to natural languages! I started using Anki about 10 years ago for ASL. That went so well I expanded into programming and other topics.

        For example, roughly once per year I inspect a sqlite db to debug something, and that’s just not often enough for the dot commands to stick, so I repeatedly had the frustrating experience of having to look up commands with the full knowledge that I have done so many times before. I made Anki cards for the couple commands useful in my debugging (.dbinfo, .schema, .dump, .recover, .mode csv) and now I always recall them when needed.

        I also make cards for languages and tools that I do work regularly in, mostly for features I use infrequently or corner cases that have led to bugs. I suspend cards when I’ve stopped using the language, and I delete the cards about a job’s proprietary tooling.

        Anki has primarily been a timesaver, the rule of thumb is that you’ll spend about 5 minutes studying a card over your life, so it’s worth making cards that you’d spend more time looking up. But it’s more than remembering, I feel I also design better systems because I have more concepts and tools comfortably to hand.

        1. I’m not sure why I’ve never considered using Anki for this kind of thing before. I’ve used it for (spoken) language learning to some limited success (limited due to my own efforts). I also used to way back when I was learning boolean logic for the first time, to great success.

          Using it for something like SQLite dot commands is genius. I think I would also benefit from using it for the more esoteric Linux commands I used infrequently enough to have to look up how to use them every time.

        2. What do your SQLite cards look like?

          1. pushcx

            23 hours ago

            | link

            The front is the thing I want to do, “export data in csv”, the reverse is the dot command, .mode csv.

    2. drmorr

      17 hours ago

      | link

      I am regularly switching back and forth between Rust and Go these days, with some python thrown in the mix as well. I would say I’m reasonably proficient in all three, but my goodness, when I have to switch back from a Rust codebase to a Golang codebase (or vice versa) it is very hard for the first little bit!

      1. Yes, this resonates with me. The context switching can be absolutely daunting sometimes. But when switching between either of them and Python, the language I’ve spent most time working with professionally, I find it a breeze.

    3. “Proficiency” is a bit of a sliding scale, isn’t it? I’ve met plenty of professional Python programmers who have been able to completely ignore huge sections of the stdlib (never mind the entire PyPi ecosystem) simply because their proficiency is sufficient for their domain. Move outside their domain and they’re quantifiably less proficient. I was one of these people for years, and got paid well for it, so I’m not knocking anyone, it’s just to point out that “proficiency” is kind of hard to define.

      I would say that it’s a 5 year, minimum, investment to reach my personal sense of “proficiency” in Python, where someone knows precisely what and why True and “Banana” or set() evaluates to, and has learned to reflexively import dis to check, and I’d assume roughly the same road for every dynamically typed, largely-OOP, imperative, and runtime interpreted language… so Ruby, Python, JS and Lua (as random examples) would cost you 20 years or, effectively, a career.

      At the end of those two decades I’m not sure you could be called proficient in all of them simultaneously (as I age I really note just how much forgetting happens when not actively using a thing, but also just how much even “stable” languages with strong backwards compatibility assertions feature drift over time) but you’d certainly have been able to make notable contributions to each of the communities in that time to where others would look at your code and see you as proficient.

      Anyway, lot of words, but it’s an intriguing thought… I’d say anyone can become functionally literate in probably a few dozen languages, so at least able to recognize syntax and semantics, but in my mind proficient means more than that, at minimum requiring a pretty wide (if not especially deep) working memory of the stdlib and awareness of the ecosystem and packaging and distribution of libraries, a good grasp of the current tools, and probably the ability to teach another up to at least the functionally literate point (given time, patience, and an actively interested student).

    4. spc476

      22 hours ago

      | link

      It’s hard to say. Can someone proficient in TypeScript also be proficient in JavaScript? What about the other way around? There are also language “families” to consider. Someone proficient in functional programming might be proficient in F# and Haskell, but not .NET or Java, while someone in proficient in OOP could be with Java and .NET, that type of thing.

      I say this because I’m proficient in assembly language for the 6809, 8086 and 68000 (although there’s not much use for these today). On one sense, they’re similar enough that concepts can transfer over, but different enough to maybe count as different languages. It’s hard to say. I’m familiar with other architectures that I can recognize 8080 vs. z80, 6502 code and ARM, but I might be hard pressed to see the difference between MIPS and Risc-V.

      Languages I’m proficient in, C, Lua, GNUmake and as I said, the various assembly languages. I could probably get back up to speed with PHP if I needed to, but it’s been over a decade since I last used it in anger. I should probably get around to learning Rust one of these days …

      1. F# is part of the .NET ecosystem. I’m not trying to nitpick. I mention it because the ecosystem of libraries and frameworks can be almost as important as the underlying language in terms of the effort required to learn and retain it. So, to riff off your example, learning F# would be much easier for a C# developer than, say, Racket. They may still have an idiomatic hurdle to jump, but they still get to use a familiar IDE and they’re still targeting the same runtime.

    5. eeue56

      11 hours ago

      | link

      I’m someone who likes to know lots of different languages, and uses them in different places for different problems.

      I would say the languages I’m most familiar with are Derw (since I wrote it), Elm, TypeScript, JavaScript, Bash, and Python.

      I then have enough experience with Go, Rust, C, C++, C#, Haskell, NetLogo to get things done. I rarely touch them currently, but don’t have too much of a problem jumping back into it. I generally keep up with release notes, looking out for interesting new features or changes.

      The model of the T-shaped individual describes what you’re referring to pretty well - where a developer might have deep experience in one particular language, but broader experience with other languages. Knowing other languages helps unlock new ways of solving problems in your main language, and can help you understand new concepts. Languages evolve over time, borrowing features from each other. Like did you know list comprehensions first became popular in Haskell, before ending up in Python, and a bunch of other languages?

      Smaller (in terms of feature sets) languages tend to be very easy to pick up and come back to, whereas those with a lot of different concepts and features are harder. For example, JavaScript, as a language, remains largely unchanged from a few years ago. Whereas Rust this year is different from Rust last year. It’s not uncommon to not know all the different features of a larger language, even if you work with it every day.

      Then there’s also all the meta stuff: like packaging, or tooling. That tends to change frequently even if the language itself remains stable.

      I actually wrote a post about my love of programming languages and their designs, which is pretty relevant.

    6. quad

      21 hours ago

      | link

      Two, maybe three languages. Hear me out…

      Any language after your first one is a choice— usually driven by non-linguistic concerns.

      • Do my friends and peers use it?
      • Is a language, its libraries, tools, and community helpful to solve the problem at hand?
      • Will I become a better programmer?
      • Will I make more money?

      Back to the original question: it takes time to learn a language, sure, and learning a new language gets easier with each one, sure. But, a programming language isn’t just it’s grammar, standard library, and (current) idioms. Each one is a whole active culture; don’t speak it for a year and you’re out of the loop, don’t speak it for five and you’re rusty … but speak it for twenty years and you’ll sound like a fuddy duddy boomer.

    7. skade

      10 hours ago

      | link

      Well, what means “proficient”? The topic of what “language proficiency” even means is open, even in general linguistics: https://en.wikipedia.org/wiki/Language_proficiency

      I have very broad programming language skills and know only a few very deep (Ruby, Rust and Java, chiefly, JavasScript, HTML, CSS[1], too). However, this stems from my previous endeavour: working close to databases and logging systems. This means that I need to know enough about almost any programming stack that a client could throw at me to made the database interaction work well.

      Also, I’m very interested in programming languages as an artifact in an by itself, which means I can probably also pick them apart on a higher level than needed for most programming tasks. So I have a broad experience with things I had tried out.

      Recall is another interesting thing: it works slowly, but recalling works much faster than learning afresh. e.g. if I were to pick up Haskell up against today, I have a model of how Haskell works. I however have probably completely forgot the exact syntax. But that only means I lack exercise. I can read Haskell just fine however.

      [1] Yes, both HTML and CSS are languages and I’d even pick a fight that they can be seen as programming languages - turing-incomplete languages have a lot of utility.

      1. Great question, I was wondering the same thing so I made my own definition. A TODO List.

        Maybe I’m not correct in my base assumption but a good starting point would be “I can make a TODO list”. For example, I’ve touched Node.js many times but it’s not my goto dynamic language. So … do I say “I know Node”? What does that even mean? So I’m tired of speaking like this so I’m just going to create TODO lists in every language I can.

        Pretty boring. I took notes of what I looked up etc as I did them. This repo is not current with what I consider in my toolbelt.

    8. jmtd

      16 hours ago

      | link

      I’ve started logging how many programming languages (and markup and data and etc) I write or “substantiallly interact with” every week. This is the first week I’ve done it so by the end of today I’ll see the results.

    9. hrafn

      15 hours ago

      | link

      Like with so many things it is probably highly subjective from person to person.

      For me personally there is only room for at most two to three languages I can be switching between on a regular basis while still feel like I am being productive.

      Then I know individuals that say they can do meaningful productive work using many more than that.

      At the end of the day, I would say that what matters is if meaningful and quality work is being done rather than in how many languages the work took place.

    10. Hmm. I’d consider myself truly proficient in

      • Python
      • Bourne shell

      though of course I dabble to varying degrees in other langs.

      The deal with the above is that they’re each addressing a different domain. I don’t write text editors in SQL and I don’t write glue scripts in C.

      There is a continuum on sh -> Python -> Go -> C for certain classes of problems.

    11. dkl

      7 hours ago

      | link

      In college and my early career I learned many languages and I tried to really span the gamut of OO, functional, logic, and so forth. I would do more or less what you’ve been doing. I really appreciated the perspective of different models of computation. But I often would reach a part in any program where I would go, this piece would be so much simpler in language X! But if I tried to rewrite the program in language X, sure, that part would be easier or maybe trivial, but other things would be irritatingly hard. I don’t mean to suggest that all languages are equal or it all comes out in the wash, but that I encountered this unexpected disadvantage to having the gamut of knowledge.

      About ten years in, I took the job I have now and my supervisor at the time was someone who did not have a CS background, but had nevertheless been programming for decades. In that time he had only really learned C and then Java and had basically switched entirely to Java early on. I developed a deep appreciation for his code, because he was a very methodical programmer. He understood Java extremely deeply but also never faced that inner turmoil I had about whether it would be better to use something else. To him, it was simply the raw material he had to work with to get anything done. It didn’t interest him much, the idea that other languages might be better.

      Since that time I have seen my knowledge of other languages diminish. I remember a lot of the superficial details that made them exciting to me, but I no longer have much time for side projects. Few new languages offer novelties that excite me enough to find the time to invest in them. Simultaneously, being stuck using one or two languages daily for my work has meant that I have developed a much deeper appreciation for them (Python, since my supervisor left). I often see code that can be improved at the level of a few lines, or at the high level, in terms of organizing a module. I share this with the other programmers as best I can.

      I would still like to become proficient at J, but it would be impossible without a deeper understanding of linear algebra, so it will have to wait until I can take some classes. Some languages are like that, they aren’t so general-purpose, they are motivated by certain domains. But I think if you’re not doing much number crunching, it won’t be much use just because it has a neat model of computation. Fortunately, I have started to encounter problems that do require some number crunching, so the interest in the language is finally being met by some problems that will suit it. But I’m unlikely to force this language on anyone else, it’s just a fun tinker toy.

      Anyway, I think my point is that your evolution is familiar to me and very natural. I also started to sweat this. But it turns out, as much as we may adore languages, they are ultimately raw material for solving problems. Knowing you can solve a problem with many materials is useful. But we ultimately have to succeed at solving problems, and our grateful users don’t care much about how we accomplish it, or which parts of it are tedious and which parts are enjoyable for us to see come together.

    12. I’d say 3. Out of 10, I think “a person” [1] has about 26 points to go around. Maybe 30+. You could write Python 8/10, Go 6/10, SQL 7/10, but only have ~5 points for all the rest. If 6/10 is “proficient”, then 3 seems reasonable.

      But I’m just making things up, obviously..

      [1] the average person, but perhaps you mean any single person, or every single person

    13. My native language used to be Java. I started to use Python in production about 6 months ago. It becomes my native language as my Java usage drop to zero. Other than that, I couldn’t imagine proficient in a few more without actually writing production code.

    14. alper

      12 hours ago

      | link

      I’m a Python main but as a manager I don’t get to ship any production code whatsoever so all my experience is mostly side-projects and dabbling. On a normal week I might write code in: Python, Typescript, Swift and Rust.

      Am I proficient still in any of these? Not quite sure. This style of programming also is not the type that coding interviewers like very much so let’s hope I never have to do one of those again.

    15. Languages and their ecosystems evolve quickly. I spent a good five years on Java two decades ago. I could probably get back to “production” level proficiency if everyone was still using Spring 1.0. But I rather doubt writing Java today looks anything like that.

    16. About one per decade you’ve been working.

    17. pyj

      edited 4 hours ago

      | link

      It would depend on how deeply you learn each language, the complexity of those languages, language conceptual similarity, the evolution rate, the language consistency, how much is explicit vs implicit in the code, and the tooling support, especially compiler and/or linter warnings. I’ve written code in a bunch of languages and shipped professional code in probably half of those, and most don’t appear on my resume. There’s a proficiency level of “can you make edits” versus “could you be responsible for building something from scratch with best practices?”

      There’s a language pyramid in my head of Syntax > Exceptions to the Rules > Idioms > Ecosystem > APIs.

      Rust changed a lot in the few years since I used it, but the new crate I’m about to release came together super quick since clippy does a good job recommending best practices. Using C++ with and without clang-tidy set up and heavy compiler warning settings is a day vs night experience. Every time I have to deal with JavaScript it feels like I’m relearning everything from the start since it seems every project’s ecosystem is different. Ada is very internally consistent, ISO standardized, very explicit, with good compiler warnings and it took less than a night to refamiliarize and update some old code. F# and Haskell were awesome to work in, but I have trouble remembering the symbology.

      There’s definitely latent learning that I can call upon when I switch back to a language I haven’t used in a while, but I think I probably max out at 3 or 4.

    18. stig

      5 hours ago

      | link

      Define “truly proficient” please :-)

      I’ve used Clojure as my primary language for close to 5 years, and would consider myself proficient (aka “competent”), but I would hesitate to call myself “truly proficient”.

      Since my first programming job in 2003 I’ve been paid to use 9 or 10 languages, depending on whether you count SQL. I never used more than 3 in each job, though, and probably no more than 2 concurrently. I would only count myself competent in Clojure and SQL today.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK