
Learn more programming languages, even if you won't use them - ingve
https://thorstenball.com/blog/2019/04/09/learn-more-programming-languages/
======
dxbydt
Learn more ? I'm actively trying to unlearn a bunch of languages at this
point!

ofcourse, when I was a wageslave in the bay area, its nice to know python,
java, javascript, scala etc. - got me jobs every 2-3 years & put food on
table.

now that i'm in academia, its completely upside down. literally everybody is
way more productive than me in just about any task. The other day I as
supposed to program a poisson clock, it took forever. Meanwhile my advisors &
classmates with zero industry experience chug thru these tasks effortlessly.
Lately I've confirmed its because they know exactly 1 language , but they know
it so well & in so much depth, they know exactly where to look, the right mcmc
library, the right slice sampler, the right optimizer, that's what matters.

There's no point programming the same bloody front-end & back-end in a dozen
different languages just because of industry constraints. That's like eating a
spaghetti with a fork, a spoon, with chopsticks, with your fingers...its the
same fucking spaghetti. cook something else, not just rotate dish-ware.

~~~
klibertp
It's perfectly possible to know several languages in-depth. It just takes a
lot of time and effort. Moreover, it gets easier with time and practice.
Knowing N languages makes learning N+1 language just a bit easier. For me the
turning point was around N == 10, since when learning a new language - and
yes, in-depth, including idioms, stdlib, some external libraries, maybe some
framework (if needed), and also some facts about the implementation and its
inner workings[1] - takes a week at most, and for simpler cases a weekend is
enough.

OTOH, it took around 15 years to get there. I understand that this kind of
dedication may not be possible or worth it for everyone.

[1] Because there is very, very little unique features to each language.
Unless you go to the fringes, you're bound to see the same concepts applied
again and again and again, which gets really disheartening after a while. If
you don't believe me, try naming any "new" feature which was added to your
favorite (EDIT: I meant _mainstream_ \- TIOBE top 10 or 20 - lang here!)
language recently - and I'll show you that same feature implemented 10 or 20
years ago in another language(s).

EDIT: more neutral wording.

~~~
blub
I don't doubt it's possible.

What I do doubt, is that it's possible to know several languages in-depth and
at the same time be at least very good in a specific domain (webdev & mobile
apps are not domains), have good algo and problem-solving skills, have decent
to good soft skills, know at least a little bit of PM and also be a good
conversation partner and well informed citizen of the world, while also being
a good husband/wife/dad and being reasonably competent at some hobby that is
hopefully not related to computers.

Learning and keeping up to date with the N+1th language takes space from
learning the many other interesting things this world has to offer.

~~~
klibertp
Yeah, it's a matter of personal choice.

My choice was to forgo any hobbies unless they are somehow useful for
programming, ignore most of being "well-informed citizen of the world", ignore
the whole mating and breeding business and to focus solely on programming at
first, then on programming-related fields that picked up my curiousity. I'm
still competent enough in other programming- and work-related areas - at least
I've never been told otherwise - but, indeed, half of what you write about is
nonexistent in my life.

Actually, if there was a monastery for programmers, with ascetic lifestyle and
good broadband connection to the Internet, I'd go there in a heartbeat.

OTOH, I don't think you'd need to go to such lengths normally. As a
programmer, you'll be working for 40 years at least, right? 30 minutes of
reading a day will eventually get you to the respectable N (if you choose this
particular field), it'll just take longer.

The OP said the fact that he learned multiple languages makes him fall behind
his peers in coding tasks. I'm saying that he would have no such problems had
he learned these languages in-depth and it's perfectly possible to do so. I
admitted immediately that the effort needed for this is at least substantial,
no disagreement here - I just pointed out that, after that initial effort of
consistently learning N languages for 2*N years, the following languages
become very easy to pick up. That's it :)

~~~
Retric
Even then, I don’t think you can ever really learn even one mainstream
language in depth. For something as ‘simple’ a C every compiler is slightly
different and includes different flags and run on different CPU generations
and this stuff is constantly evolving. A language like Java has a giant and
evolving standard library plus multiple compilers etc. And that’s ignoring any
simply popular libraries etc.

Really learning what you can safely ignore in whatever context is the most
important part, everything past the basics is domain specific.

Having said that, I have read several language specifications which can be
useful for general understanding. But, that’s simply the tip of the iceberg.

~~~
klibertp
You're moving goalposts a bit here, I think. Or maybe it's my fault, I should
have defined 'in-depth' more precisely.

Anyway, I specifically mentioned knowing "some facts about the implementation"
instead of "knowing the implementation inside-out". The same is true for
tools, libraries, and frameworks - there is no need to remember every
function/method signature and every class name in a library - as long as you
know the most important parts and can quickly and accurately find the relevant
documentation for the rest.

To me, 'knowing in depth' (as a language user) means that no matter the
question, you know where to search for the answers. There's no need to
remember the answers themselves, although it kind of happens naturally with
repetition anyway.

On the other hand, it's also important to know which questions are not worth
answering. It's exactly as you say:

> Really learning what you can safely ignore in whatever context is the most
> important part

So, to sum it up: if you can do both these things, then, to me, you have in-
depth knowledge about the language (or actually any other field). The next
step - ie. actually knowing all the answers by heart - is mostly useless for
language _users_ and only matters for (and is best left to) language
implementers/advocates/nerds.

> A language like Java has a giant and evolving standard library plus multiple
> compilers etc. And that’s ignoring any simply popular libraries etc.

Java stdlib is only "huge" in comparison with C, where stdlib is non-existent.
The popular libraries may be ported from other languages or even directly
called via FFI. And if the library is really good, it will be ported to other
languages, too, which means you'll have an easier time using these languages
in the future.

Even without all that, though, if you know more-or-less what's where and can
quickly search for the details - you're good. It's not that easy to learn this
- you need to remember the structure of the docs at least - but it's much
easier than actually learning and remembering all of the stdlib, etc.

------
gfodor
I mean sure, if you have limitless time then feel free to learn a bunch of
programming languages as well as everything else you could want to learn. But
real humans have opportunity cost. If you are a software engineer, the time
you spend on skill development can already cut across many, many dimensions.
Additional programming languages is just one, and I'd argue a fairly narrow
one after you've touched on a few key language paradigms.

What about:

\- Architecture

\- Software Delivery

\- Networking

\- Project management

\- Interaction design

\- Visual design

\- Human factors/Social systems

\- Graphics/Art (2D/3D)

\- Market validation

\- Sales & Marketing

\- Business planning and finance

\- Application domain knowledge

\- Operations and Monitoring

\- Data infrastructure

\- Analytics

\- Machine Learning

\- Machine Vision

\- Computer Graphics

\- Simulation

\- Game Engineering + Design

\- Information Retrieval + Recommender Systems

\- Embedded systems/Control theory

\- Optimization

\- Scientific Computing

I mean there is basically an endless list of areas you can reach into in the
limited time you have time focused on skill development as a software engineer
beyond "on the job" training. Building a strong, broad "stack" of skills seems
like a good investment. Learning new programming languages is a niche within a
niche depending on how expansive a scope you set for yourself as a person
creating software for the world to use.

~~~
arvidkahl
I would argue that for software engineers, the fields you mentioned would be
adjacent fields, while other languages would give deeper insight into the
tools of the very trade you're in.

In a time of people going for T-shaped careers, another language is deepening
the vertical bar, while another field enriches the horizontal bar.

In that sense, learning a new language and learning a new field are
complementary, but different in essence.

~~~
vtange
Learning a new language doesn't necessarily deepen the vertical bar if the
language cannot really be used to improve productivity/innovation on top of an
engineer's current toolset. Learning TypeScript on top of Javascript can be
thought of as vertical, but learning say Lua or C# on top of JS is probably
better described as horizontal unless you're already intending to do some
really specific desktop application.

~~~
arcticbull
Learning different concepts from other languages can make a big difference.
For instance I learned about the value of composition over inheritance by
learning Rust, then applied it to my life as an Objective-C developer (prior
to Swift). It forces you to break out of your well tread paths, and take the
best of other systems and fold it into yours.

------
gilbetron
At this point I have almost 20 languages that I've used for at least two
years, which is what I consider an decent bar for "knowing" a language.

The problem I now have is that I don't know if I'll ever be able to master any
language anymore. Mmmmaybe C, since I've used that fairly consistently, albeit
on-and-off for 25 years.

But whenever I get to an "if" or "for" or function declaration, I often have
to look at an example real quick because I have too many fighting memories: is
it "if () then {}" or "if then:" and is it "else if" or "elif"? Do I need
parens around the clauses? Is it "&&" or "and"?

Mostly I've found that the difference between two languages isn't the
difference between two cheeseburgers, but rather the difference between a
cheeseburger and lasagna. There's absolutely personal preferences (I still
despise Python's whitespace-as-scope, even though I love the language), but
they all get your belly full.

~~~
dajohnson89
I'm this way with foreign languages: Spanish and french. I know french very
well, and learning/speaking Spanish is significantly harder because I'm always
using french words by mistake. sure it'll get better with practice, but
interlingual dyslexia is real.

~~~
gnclmorais
Interesting, I feel like I have the opposite issue. Coming from Portuguese,
learning Spanish was a breeze and I can usually surprise French speaking
people with “hard” words in my basic French sentences — just because I reached
out to a Portuguese word and “frenchyfied” it.

~~~
wwweston
Spanish and Portuguese seem to be unusually close. Studying one helps me with
the other.

Portuguese and Japanese on the other hand...

~~~
pushpop
The OP wasn’t talking about Japanese. They were talking about European
languages- many of which share a common heritage

~~~
saagarjha
Not all of them do, but the ones mentioned were all very similar Romance
languages.

~~~
pushpop
I’m aware not al of them do. This is why I said “many” and not “all”.

There are roughly 3 main groups of European languages: Italic (or Romance as
you described it) for Western Europe, Germanic which is predominantly Central
Europe, Scandinavian countries and the UK; and Balto-Slavic for Eastern
Europe. Generally speaking of course.

However there is still a fair amount of cross pollination even with the
Germanic and Italic languages, not to mention shared characteristics (not
least of all a shared alphabet) that doesn’t exist with Japonic languages such
as, well, Japanese.

------
cnasc
In case anyone isn't familiar with them, these two books[1][2] from the
Pragmatic Programmer are great for doing just this. They offer a guided intro
to 7 different languages each, and they're a whole lot of fun.

[1] [https://pragprog.com/book/btlang/seven-languages-in-seven-
we...](https://pragprog.com/book/btlang/seven-languages-in-seven-weeks)

[2] [https://pragprog.com/book/7lang/seven-more-languages-in-
seve...](https://pragprog.com/book/7lang/seven-more-languages-in-seven-weeks)

~~~
macintux
The first book led me to discover Erlang, which literally changed my life.
Great resource.

~~~
byebyetech
Could you please elaborate on how it changed your life? I am interested in
learning Elixir and wondering if you can give some words of encouragement,
assuming it changed your life positively :)

~~~
macintux
Falling in love with Erlang led me to create a Twitter account to share
information about it, which helped me find and land a job with Basho, which
was by far my favorite job, even if the company ended badly.

So, that part is difficult to replicate.

Setting that aside, Erlang finally helped me understand what functional
programming is about (I'd tried and failed to grasp Lisp on a few occasions),
taught me the value of immutability and asynchronous message passing, really
opened my eyes to the fact that there's a vast world outside the tired Algol
family tree.

Sadly, pattern matching and immutability have made it very hard for me to
enjoy programming in other languages. Most of my development work after that
has been in Python, which is not only the least exciting language I've used in
a very long time, but also lacks most of what I came to appreciate about
Erlang.

Erlang's constraints (primarily immutability in this context) makes it so much
easier to reason about and troubleshoot code.

It's also a good language for helping get opportunities to talk at
conferences. People keep hearing about it without knowing much about it, so
those talks tend to be well-attended.

Elixir is a perfectly acceptable language, although the syntax and other
design choices turn me off, personally. Erlang is a very concise language and
helps me _think_ in Erlang; anything that looks like Python/Ruby/C/Java/etc
just feels wrong now.

------
Lowkeyloki
I spent a lot of time learning Haskell early in my career. I doubt I'll ever
write an actual program in Haskell. I probably won't write so much as a single
line of it that will ever see production. (Thank goodness. Haskell is far from
perfect, despite its many zealots.) But learning Haskell has changed the way I
write code in any language. It's helped me to write better, more testable,
more readable, more maintainable, more bug-free Javascript. I wrote a lot of
Clojure for a while a few years ago and being familiar with Haskell dropped
the learning curve of Clojure down to almost nothing. I personally adore Lisps
more than Haskell, but Haskell unlocked the world of functional programming
for me. It also showed me the true power strong typing has at a time when the
only strong typing I was aware of was the dismal type system of Java. (Like
late 90s Java at that!)

~~~
mark_l_watson
I also really like Haskell but except for one consulting customer I only use
Haskell for side projects.

Recently I started a side project with the deep learning part in Python and
the rest in Haskell. I ended up just week ago converting the Haskell part to
Common Lisp. Much faster dev, but I have been using Common Lisp since 1982.

------
leshow
I couldn't agree more, but if I could make a recommendation. If you already
know a mainstream OO language, you won't get much benefit out of learning
another in the same arena. Going from Java to C# you will learn less than
going from javascript to ocaml or Java to Haskell.

The best thing (for my own learning) I ever decided to do was learn Haskell. I
have never been paid to write code in Haskell but it gave me such a confidence
with languages that I don't think I've seen any language features in any other
language that has ever surprised me or that I felt like I couldn't learn.
Haskell and it's language extensions will expose you to many many different
ideas. It helped me learn Rust, I feel like I can read ocaml, any other
functional language doesn't feel like a stretch to read, etc

So, don't just learn many languages. My advice would be to pick languages
across paradigms and learn them. Don't waste your time learning 5 object
oriented languages.

~~~
empath75
Failing to learn how to program in Haskell made me realize that I had
absolutely no understanding of what I was really doing when I was coding and
sent me down a deep rabbit hole learning all the computer science concepts I
hadn’t ever learned as a self taught programmer.

~~~
brendanmc6
What would you recommended first? I'm also self-taught, just JavaScript,
typescript and react and a tiny bit of shell scripting. Job never asks for
anything more, but I want to get better at designing, engineering, and
building scaleable webapps. So more towards "full stack" I guess.

Haskell sounds super cool, but it seems like nobody really uses it to build
things on the web. They mostly just talk about how it "helped them think".

~~~
programmerdude
Haskell actually could help a lot with JavaScript. Functional programming,
writing stateless functions, function parameters, and generally manipulating
functions, are valuable and useful concepts in JavaScript and React, and
Haskell forces you to learn and understand them. Alternatively, F# could fill
that niche if you prefer its syntax.

------
nikhizzle
So I fully agree here because techniques from one language often lead to much
better technique in a language of a different paradigm.

For instance, I now use many of the functional techniques I’ve learned in
JavaScript to write less, easier to read code instead of more loc of
imperative code. I’ve also worked at a company that had many functional
patterns implemented in php, and frankly made the language quite decent.

In terms of the time issue, I spend about 15 minutes a day just before bedtime
learning new languages. I probably manage to do this 4 days out of every 7.

~~~
ambicapter
> I’ve also worked at a company that had many functional patterns implemented
> in php, and frankly made the language quite decent.

Oooh, got any examples?

~~~
slifin
Not OP but:

[https://phptherightway.com/pages/Functional-
Programming.html](https://phptherightway.com/pages/Functional-
Programming.html)

[https://github.com/mtdowling/transducers.php](https://github.com/mtdowling/transducers.php)

Don't forget putting a function into a function, gives you behaviour
polymorphism at runtime, without inheritance or class based dependency
injection

------
aphextron
My suggestion is Objective-C. It's just so _weird_ to anyone who's never coded
in it, that it will force you out of your comfort zone into new ways of
thinking. The NS framework is probably the most well designed stdlib of any
language ever, and the whole thing is inspired directly from Smalltalk.
Protocol Oriented Programming [0] was also a real revelation for me, and I
still apply those concepts anywhere I can. It's also a great introduction to
lower level concepts like pointers and memory management that is a lot more
forgiving than C/C++.

[0] [https://www.sicpers.info/2015/06/protocol-oriented-
programmi...](https://www.sicpers.info/2015/06/protocol-oriented-programming-
in-objective-c/)

~~~
blub
Obj-C will always be a dear example to me, because after people praised it so
much on HN in contrast with C++, Java I expected it to be something at least a
little bit special. When I actually had the chance to use it, I found a
mediocre and pretty error-prone language. And then the cherry on top, Apple
unceremoniously flushed it down the drain...

This taught me to take any programming language recommendations from HN with a
_huge_ quantity of salt and also mostly ignore Kay-style OO purists.

~~~
saagarjha
I'm sad to see that you feel that way about the language; since I had exactly
the opposite experience. Objective-C is a beautiful (if syntactically verbose)
language, and I prefer it to C++ as an "object-oriented C". I'm actually
curious what you tried doing with the language, because

> I found a mediocre and pretty error-prone language.

makes it seem like you didn't get a chance to dive down into the runtime and
how the message-passing model works. FYI,

> Apple unceremoniously flushed it down the drain...

this is not true at all. Most of the code that Apple themselves writes is
Objective-C.

~~~
jcelerier
why would you supoose that C++ is an object-oriented C ? the primary paradigm
in C++ is generic programming, not OO.

~~~
pjmlp
Modern C++ kind of.

Gang of four book was written with Smalltalk and C++ examples.

Back in the 90's we had Mac OS PowerPlant, CSet++ on OS/2, OWL/VCL/MFC/ATL on
Windows, Motif++ on UNIX, Telligent, and a myriad of ORM, distributed
computing, image libraries and what not written in OOP C++.

Then came Java, took the best practices out from OOP C++, and two decades
later 90's C++ is known as Java OOP and people act as if C++ OOP never
happened.

------
gexla
I feel the highest good I get out of playing with alternatives is that I hit a
higher rate of "hits" on picking up on things previously invisible to me.

Playing with a different editor gives me ideas for different workflows and
shortcuts which my main editor already supports. Playing with a different
programming language shows me how powerful X is which I never touched in my
main programming language.

The focus on learning and exploring an alternative is more powerful for me
than mastering that alternative. I get the greatest benefit with a relatively
smaller investment that way.

Maybe instead of learning more programming languages, just pick small bits of
something to explore.

This might make for an interesting app (which won't make money.) Create a sort
of "useless but interesting facts" type of app for programmers. Allow people
to submit "cards" with something on it and then up/down vote on the card. The
snippet could be a term, clever code, or anything bite size. The programming
equivalent of "how to say __ck in Klingon. "

------
goto11
It is really fun to learn new languages and you certainly should know a
language in each of the major paradigms. But beyond that I think learning
languages might have diminishing returns compared to tackling other "axes" of
difference, e.g. learning new platforms, frameworks or environments.

The conceptual differences between a desktop GUI app, a command line app or a
web app are much bigger than between say functionally similar web apps
implemented in three different programming languages. A business app based on
a relational database is fundamentally different from say a game, even if the
language is the same.

~~~
yomly
This is true, though if you've only ever built a web stack in Rails with JS,
then trying to build a stack in Haskell will be quite educational both back
end (how you deal with side effects on Haskell and how purity leads to
different code architecture) and on the front end (stream-based event driven
UI instead of stateful spaghetti)

------
usgroup
I think there's a bit of a threshold with language learning. When you know a
handful (or just theo necessary ones for your job), there is probably a bit of
tendency to be religious about your "stack". When you know a few more than you
need, then you're driven to pick between them for any given thing. Then, you
start picking languages you don't know and learning them to do some thing you
need done, and so on.

I wrote some data automations recently for a client. Here are the languages
and DSLs that ended up in the mix: cron, Makefile, bash, sed, regex, jq query,
python, R, sql, nginx conf.

I think especially if you're a vertically scaling kind of gal, and you have a
fondness for conciseness, parsimony and efficiency; you'll just end up
attracted to many language solutions. I just think there is no better way to
write less code or keep the semantics of your language more relevant to the
task in hand.

~~~
gdy
"Here are the languages and DSLs that ended up in the mix: cron, Makefile,
bash, sed, regex, jq query, python, R, sql, nginx conf"

And also anyone who could replace you will have to know all these languages.
Nice approach to job security.

~~~
schwurb
> cron, Makefile, bash, sed

For a programmer with a minimal amount of linux experience, it likely takes a
week to catch up to what the codebase is doing with these.

> regex

There are good tools to destructure regex.

> python sql jq query

I consider those as "given" or "learnable good enough in a week"

> nginx conf

Don't know this.

Overall, "knowing all these languages" seems overblown in the choice of words
for me. Java, Python, Prolog and Clojure? Hell yeah that would take quite a
developer to replace! But the above? There is 1 proper general-purpose
language in there, the rest are well-known tools with great examples online.

~~~
marcosdumay
> There is 1 proper general-purpose language in there

That will depend on what the GP has done with SQL. Also, JQuery implies in
Javascript. There are up to 3 general-purpose languages in there, one of which
nearly any developer will know.

There should be plenty of people capable of taking the codebase, but it's not
a trivial single language case. The upside is that good developers will be
overrepresented when compared to the population that knows one of Python or
Javascript.

~~~
schwurb
> That will depend on what the GP has done with SQL.

I am sure they built their UI with SQL - as opposed for example simply doing
some queries, or some joined procedures at best.

> Also, JQuery implies in Javascript.

With uttermost likelyhood, they did not only dynamic changes of some html-
documents there, but also their backend and crypthography.

Enough with the snark... ("Language" is such a fuzzy term anyways. You could
go as far as to label any interaction with a computer as one - there will
always be a protocol according to which the interaction happens.)

> There should be plenty of people capable of taking the codebase, but it's
> not a trivial single language case. The upside is that good developers will
> be overrepresented when compared to the population that knows one of Python
> or Javascript.

I still stand by my point. As far as the cost of polyglotism is concerned,
that is a one-general-purpose-language-codebase and the rest being DSLs
(apparently R too). There are other codebases where there are _really_ 2+
languages. I.e. some functional lang on top, some performance critical code
hand-written in C, some logical programming language to do some constraint
programming. Each of those 3 takes quite a lot experience.

~~~
pjmlp
You can actually build your UI with SQL, e.g PL/SQL.

~~~
schwurb
I had a gut feeling you could ;) Interesting.

~~~
pjmlp
Check the history of Oracle Forms and APEX products.

------
CuriouslyC
Frankly I've never understood the desire to be a polyglot. The time spent
learning new syntax and a new standard library could have been spent learning
libraries, algorithms, data structures, etc, so I don't think it's the most
productive way to improve yourself as a programmer. I'm more interested in
learning a new language because it lets me do something I couldn't do before.

~~~
jcora
It should be qualified that you should learn languages that are actually
conceptually different. You could easily learn 20 languages that are
practically identical as far as the actual concepts are concerned. The
difference, to you as a programmer, between C and Python, is much smaller than
between Haskell and either of those, or between Haskell and Idris.

Covering a larger volume of concepts is what should be the emphasis. That is
definitely useful, maybe even more useful than just memorizing stock
algorithms and data structures, especially if you engage with the mathematics
behind the languages.

~~~
badfrog
Agreed. For example, I spent a couple years using JavaScript as my main
language at work then changed jobs and learned OCaml. If I need to use
JavaScript again, I'll do it in a much different (IMO better) way than before
I understood functional programming.

------
tezka
But also learn one or two languages that fit your domain of work, really
really well. I have seen too many programmers that justify their lack of
skills in their main language they are supposed to know by bragging about
their knowledge of some hipster language they rarely use. "my code is way too
slow, but hey I know the syntax of dependent types in Agda..."

------
deboflo
I learned many languages for years and I received a poor return on time
investment. Later, I started learning AWS in depth and studying for certs. I
now know way more than I previously did about networking, envelope encryption,
messaging, infrastructure as code, pipelines, caching, CDN’s, networking
protocols, load balancers, dns, and designing highly available and scalable
systems. In summary, don’t forgo learning about systems to chase a hot new
language.

~~~
deboflo
Learn shell, a scripting language like Python, and a systems language like
Java, C, Rust, Go, etc. I think that’s all you need to know as a backend or
systems/DevOps Engineer.

~~~
hk__2
“That’s all you need to know” is very reductive. Never stop learning: add JS
and functional languages such as Clojure, Scala, OCaml. You don’t need to use
a language every day for it to be useful. Learning a bit of Objective-C taught
me a lot about naming variables. Smalltalk taught me about non-class-based
OOP. Forth taught me low-level stack operations. Prolog, Io, BASIC, Erlang
taught me a lot of things I use everyday, even if I don’t use the languages
themselves.

~~~
deboflo
The more languages you learn, the more you realize they have more in common
than not. At some point it’s time to stop learning 20+ languages and start
building stuff. I never said to stop learning, but be very careful what you
spend your time learning. If you can be world class at Python alone, able to
solve just about any problem with it, it’s better than 100% knowing many
languages. Knowing a language doesn’t mean you know all of the standard
libraries and third party libraries, much less solve challenging problems
efficiently.

~~~
hk__2
> The more languages you learn, the more you realize they have more in common
> than not.

That happens if you learn many similar languages, which is a waste of time.
You have to learn languages in different paradigms to learn new things and
discover languages that have nothing in common.

> At some point it’s time to stop learning 20+ languages and start building
> stuff.

You can’t learn a language without building stuff.

~~~
deboflo
“You can’t learn a language without building stuff” <—- the title of this post
implies not only that you can, but should. I believe it’s a waste to learn
without hope of applying what’s been learned. I’m learning TLA+ right now
because I plan on using it to build more robust systems.

------
vnorilo
Based on my personal experience, I'd say there are good "buckets" of language-
context pairs and you can pick one from each according to taste.

C/C++/Rust/Ada on bare metal or systems work for building abstraction
_upwards_ from the hardware.

Clojure/Scheme/Common Lisp/Racket: A good dynamic language that's extremely
composable, to build abstraction _downward_ from human logic.

ML/F#/Haskell: Powerful type systems that can layer abstraction on
abstraction.

I have no experience of the following, but I imagine at least cog and erlang
belong to similarly mind-expanding buckets.

~~~
vips7L
I've drawn slightly different buckets for myself / experiences:

A high performance systems language: Asm/C/C++/Rust

A garbage collected language (JIT or compiled): Java/C#/Go

A scripting language: Python/Perl/Ruby/Lua

I think one from each bucket and you'll be able to excel anywhere.

------
wintorez
Instead of learning more programming languages, learn more programming
languages paradigms. If you know OOP, try functional programming; if you use
dynamic types, try static types as well.

------
acroback
What a terrible advice.

Does author has trouble with discipline?

You don't get anything by learning more and more programming languages.
Programming languages are tools, be expert at 2 or 3 languages and that should
be enough. Learn anything more to solve a specific problem.

You understand the crux of a language by being expert at it not by "me too"
novice at it.

~~~
schwurb
> You understand the crux of a language by being expert at it not by "me too"
> novice at it.

Let's not pretend "knowing" a language well is akin to a 10-year-journey like
some arcane samurai art.

If you

\- could build an interpreter for a minimal version of the language

\- can expand most syntactic sugar into more minimal constructs of the
language

\- can reason about the language in usual PL terms (call-by-value/call-by-
name, pure/not-pure, strictly/dynamically typed, ...)

\- know the 5-10 most important milestones in the history of that language

\- know the standard libraries so that you don't repeat code that is written
there,

then what use is there to master a language further? If someone is experienced
in language learning, the above can be accomplished for nearly any language in
idk, a year? At that point of mastery, it makes much sense to learn another
way of thinking instead of memorizing the official language specification
verbatim.

A programmer with 3 completely different paradigms to think in will be much
more effective than one with just one paradigm to think in. Time is _much_
better spent learning new paradigm than to gain that last bit of mastery.

------
stephc_int13
I dislike this reasoning with passion. I tend to think the pleasure of
learning a new programming language is rarely productive, except for newbies.
I also think that our world would be a better place with fewer languages, we
really have a lot of useless redundancy.

What we need, most of the time, is a good library tailored to solve a specific
problem (string manipulation or complex maths could even be done in BASIC or
asm with a powerful dedicated library)

Creating a new language is like forking a code base.

------
kureikain
I cannot agree more.

Because of knowing many language helps me a lot. Example, the import module
system of Python is amazing. I'm not a fan of it at all but I really like how
it were design. When I come to Ruby, I think Ruby need some love for its
module.

Or JavaScript binding? Even if arrow function, it does has place you cannot
avoid writing `.bind(this)` and you ask a question why we have to do this?

Then come pattern matching of Elixir/Erlang and it blows my mind and I just
want to have that ability every where.

Then come Elm/Hashkell or any language that use `whitespace` instead of
commma/parenthesis and I just love how natural these language read.

``` hello(username, country) ```

compare with

``` hello username country ```

The more I learn those languages, the more I appreciate the people who
invented these and always thinking of different way to do thing.

------
codr7
Word, especially the seemingly alien and/or ancient ones such as C, Forth,
Lisp, Smalltalk, Haskell, APL etc.

And once you know enough different languages; design and build your own [0],
even if no one will use them.

[0] [https://github.com/codr7/g-fu](https://github.com/codr7/g-fu)

------
overgard
I’d add make sure you’re learning languages in very different fields. IE, you
won’t get much out of learning Ruby after Python (some, but not much). But C
or Haskell? Definitely. Also don’t automatically be afraid of old languages.
People still write a lot of new things in FORTRAN for instance (really!). And
you can make better COBOL jokes if you read it’s wikipedia page at least.
Also, languages for describing hardware or FPGAs can be mind bending (Verilog
or VHDL), and GPU languages are an excellent thing to have in your toolset
whether it’s just for making pretty pictures or doing machine learning. Also
learn at least one assembler/bytecode, even if it’s just a vm one. Whatever
language you learn make sure it adds something to your toolset you couldn’t do
in another language.

The whole “10x programmer” thing probably is based on warped ideas for the
most part, but I would guess that if you have a colleague that’s ten times
more productive than the rest of the team it’s because they understand and can
reason about parts of the stack and machine others can’t

------
theonemind
I learned just some rudimentary Haskell. It tends to force you into a kind of
bottom-up-test-as-you-go approach, which can work pretty well when you have no
hidden state. The next time I wrote a shell script, I did it like that, and
started writing much better shell scripts. It also surprised me how much
easier that flow worked with the shell than with Python, even with Python's
REPL. To do the equivalent thing in Python, testing functions nearly
interactively, I had to do something like import module; reload module; from
module import * over and over. At the shell prompt, I just kept hitting the up
arrow to source the script I had just saved so I could try out the new
function.

I wrote a trivial amount of Haskell, and it still changed how I write shell
scripts, which I didn't expect at all.

------
jakeinspace
Given my limited memory abilities, I have doubts that I'll ever have a master
level or even very strong grasp of more than 2-3 languages at any point in
time. C, C++, python, Clojure, and Java are usually in that circular queue
(both when I was in school and now in industry), but I find myself humbled
every time I come back to one after 6+ months. I imagine that if I were to
truly sink 10 years into a single environment, especially a nearly stagnant
one like C, I'd carve out some deep pathways in my brain.

~~~
koala_man
Did you find yourself writing Java differently after writing Clojure?

~~~
jakeinspace
I find myself not writing Java now thankfully :)

My day job is embedded systems programming for aerospace, so it's almost
entirely C/C++ with some tooling in Python.

------
viburnum
I just make everything like Smalltalk anyway so what’s the point.

~~~
marcosdumay
Well, it's not a problem, but if you ever want to "fix" it, just take some
problem so solve by writing Smalltalk in Prolog.

~~~
klibertp
See Logtalk: [https://logtalk.org/](https://logtalk.org/)

Works with many Prologs, too.

------
raviolo
I mostly agree with the article but for the reason that I did not see clearly
reflected in it. I think knowledge of multiple languages (and technologies in
general) is important not from a perspective of trying to be an expert in many
things (which I think in general is counterproductive) but because it helps
one to be better (and, arguably, much better) within their domain.

Few examples to illustrate my point:

\- Having some experience with strongly typed language makes Python developer
a better and safer programmer. Compare with Python developer who is not even
aware of the weak vs. strong typing issues and all the related gotchas. Well
worth the investment.

\- Having seen the ease-of-use and power of some data structures (e.g. Python
dicts) not natively available in C may suggest to C developer to look for
libraries that implement something similar. 10 minutes playing with Python may
end up saving countless man-days on a large C project.

\- Having even minimal experience with NOSQL DB may suggest to a DB admin that
handling unstructured data on their Oracle cluster may not the best way to go.

\- Having seen FPGA latencies may suggest to a Java developer not to bother
with the software that will be competing on latency.

The list is endless. I guess my main point is: even _approximately knowing_
what's out there helps you make much better decisions, where decisions may be
anything from picking the right approach in your area of expertise, or picking
up a different tool if you need to, or telling your boss to hire the right
person, or even not starting on the task due to lack of right expertise.

------
teddyh
“ _LISP is worth learning for a different reason — the profound enlightenment
experience you will have when you finally get it. That experience will make
you a better programmer for the rest of your days, even if you never actually
use LISP itself a lot._ […]

 _It’s best, actually, to learn all five of Python, C /C++, Java, Perl, and
LISP. Besides being the most important hacking languages, they represent very
different approaches to programming, and each will educate you in valuable
ways._

 _But be aware that you won 't reach the skill level of a hacker or even
merely a programmer simply by accumulating languages — you need to learn how
to think about programming problems in a general way, independent of any one
language. To be a real hacker, you need to get to the point where you can
learn a new language in days by relating what's in the manual to what you
already know. This means you should learn several very different languages._”

— [http://www.catb.org/~esr/faqs/hacker-
howto.html#skills1](http://www.catb.org/~esr/faqs/hacker-howto.html#skills1)

------
kjgkjhfkjf
I don't think it's worth studying many programming languages just for the sake
of doing so. It's very rare that you get to choose the language to use on a
project. If your goal is to be a great software engineer, your professional
development time would likely be better spent working on domain knowledge and
skills complementary to coding such as communication and leadership.

~~~
hk__2
> I don't think it's worth studying many programming languages just for the
> sake of doing so. It's very rare that you get to choose the language to use
> on a project.

Studying languages help you way more than just providing you one more choice
for the language of the next project. That’s precisely what this blog post is
about.

------
finndark
Learn Prolog - everything else is an extension.

"One [language] to rule them all."

~~~
koala_man
The great thing about Prolog is that it's so radically different, without
being intentionally difficult or obscure.

There's not that much value in learning yet another imperative object oriented
language. If you want to put the field of programming into perspective, Prolog
is even more alien than Haskell.

------
agumonkey
It may depend on the person. So don't take it a simple idea. Some will find
languages that fit their brain so much more they'll be very happy. But only if
they can make a living with it. Going back to Java <8 after Ocaml or Prolog is
a chore. Plato's cave and all that.

That said it will probably enbroaden your mind tenfold.

------
alkonaut
This. It’s not about learning language A and B because you need it but because
learning language B makes you a better developer in language A.

If you have thousands of hours doing language A, you need several thousand
more to meaningfully improve your competence. It’s basically just battle scars
from experience at that point.

But if you spend just a few hundred hours on learning a completely different
language, that gives you a completely different set of brain tools for working
in your day to day language. It’s not a luxury for a js programmed to be able
to spend a hundred hours on trying rust or Haskell. It’s a cheap way of
becoming a better js programmer without having to spend a thousand hours more
on js.

------
StreamBright
Learning Clojure opened my eyes big time. Since I have done that I can pick up
other languages much more easily than before. The only problem I got is with
Java, I could never grasp the different concepts of OOP but I do not actually
mind that.

------
Jedd
The author is describing the oft' maligned and perhaps misnamed Sapir-Whorf
hypothesis -- or linguistic relativity if one prefers to eschew eponymous
hypotheses.

That is language influences (weak version of the theory) or determines
(strong) how you think. A perfectly cromulent proposition.

Ineluctably leads to arguments around the relative benefits of deep
specialisation versus a T-shaped skill set, which in turn invites bureaucrats
to make us all uncomfortable by injecting regrettable phrases like
'generalised specialist' into the vernacular.

------
another-dave
Would love to see a list of sample projects for each common language that
plays to its strengths.

Often if trying to pick up a new language in my spare time, I can get to a
stage of learning the syntax, but if I do it by following a "101" tutorial,
I'll end up building another To-do app or whatever — it's very hard from an
"unknown unknown" position at the start to find the path into idiomatic "X"
that will show you the unique features and paradigms of the language.

~~~
noobly
I too would really enjoy some sort of “Build X in Y” type of resource for
this.

------
kazinator
Why should anyone learn the reference manual of a man-made tool they suspect
they won't use, when there are yet unlearned reference manuals for tools they
will use?

Should people also read the instruction manuals for appliances they have no
intent of buying?

An applicance maker should do that, to find ideas to steal. That's about it.

When it comes to learning for the sake of learning, there are more wortwhile
things in the world. Learn a foreign language, for instance.

------
0n0n0m0uz
As a totally self-taught and advanced-beginner in bare bones R, Python, CSS,
VBA, etc What can you recommend as the #1 thing I can do to improve my
approach to programming? Not talking about syntax p,which I can easily
reference when needed, but high-level paradigms and thought-patterns. Is there
a favorite book, school of thought etc? Much appreciated. I know it’s a broad
question.

------
kccqzy
As someone whose preferred language is Haskell, I've been told in a tech
interview feedback that "I naturally and unconsciously avoid OO idioms as well
as objects with internal state" even when I'm using an OO language. That's the
extent I was influenced by Haskell's thinking. They didn't give me an offer.

------
thanatropism
Enaml ([https://github.com/nucleic/enaml](https://github.com/nucleic/enaml))
is a declarative component-based GUI library for Python that more or less has
the same driving philosophy and feel of React. There's even a (parallel
project) Enaml-web.

------
macando
If you are entrepreneurial and already know one functional and one strongly
typed OO language, the following will significantly improve your career more
than learning another programming language. Learning to:

\- sell.

\- design.

\- write better.

\- tell a good story.

\- get along with people.

\- do proper SEO.

\- speak another natural language.

\- model and query data.

\- understand ML/AI.

This is coming from somebody who though himself 10+ programming languages.

------
thomasfedb
Learn different _kinds_ of languages. Cross a paradigm, dip your toes in an
exotic type system.

Learning Elixir has opened my OO-biased eyes to the new and interesting world
of FP. Knowing the theory isn't enough, you have to code it to grok it!

------
bigred100
As someone in academia, I refuse to learn even the programming languages I do
use

------
senderista
How about: learn new programming paradigms, and be very picky about the actual
languages representing those paradigms that you choose to learn. Life is
short, and programming languages are a dime a dozen.

------
Insanity
I find this to be quite true. I love playing around with new languages for the
insights they give me. You can sometimes use ideas across languages.

But the main reason I do it is because I think it's just good fun :)

------
javinpaul
Nice write-up. I think the most valuable advice for a programmer, "Learn a new
programming language every year", I read it somewhere in the book but don't
remember which one :-)

------
tvural
Learning new languages in-depth is an incredibly taxing thing, because there
are whole jigsaw pieces of syntax you have to learn at once. But worth doing
the right way if you have time.

------
purplezooey
It's been said already, but a man's got to eat. Ain't nobody got time for
this.

------
gitgud
JavaScript is one of the _must learn_ programming languages. Server side code,
_client-side_ web app code, npm links it all together... Well it seems cliche'
but also true...

~~~
preordained
It never should have escaped the browser. It's brought the suck to everything
now...

~~~
tonyedgecombe
It should have been replaced in the browser.

------
techsin101
I want my idea to lookup code from stack overflow

------
picacho
the point is never to learn more, but to learn the essence. there's only one
basic language must to be learned by every top-notched engineer is assembly.
After that, it's just another layer of abstraction. The concept is just stack
+ pointer to memory on heap, period. Then, learn whatever language that you
are currently need to use. Life is short, don't waste learning something that
doesn't matters.

------
adrianhel
Choose the right tool for the job!

------
Veen
Off topic, but if you’re going to justify body text, at least turn on
hyphenation.

------
carapace
Learn Prolog.

~~~
johnisgood
Or Erlang, which is historically Prolog. They still share some similarities.

------
zcw100
I’m getting tired of this. Yes I see the benefit of knowing multiple languages
but let’s look at the other side of that coin. There’s the dev that is
familiar with a dozen languages and writes terrible code in all of them.

When exactly are we supposed to be learning all these languages? Nights and
weekends that effectively has you working 24/7? Or more likely some developer
that has a personal relationship with the CEO and can do no wrong reads a blog
post on language X and catches the fever. Well, he needs some practice and
he’s not working nights and weekends so now we are rewriting things or working
in a mixed environment. He knows just a smidge more than the rest of the team
so he’s in charge but can’t be seen as anything less than an expert so they
pretend they are. He leans on dogma and best practices as he bullies the team
as they screw things up left and right.

Anyone who is stupid enough to say that we should have stayed with what they
had been using will be labeled as not a team player and blamed for the
failures.

Those failures will be used as proof that our hero is as amazing as he says he
is as he becomes a 10x programmer by kneecapping the rest of the team and
valiantly struggles to pull and incompetent team forward.

Next thing that happens is the good developers leave and the rest are forced
out or fired assuring our hero developer a fresh crop of devs who don’t know
the history of the project cementing the myth that our developer is a genius
in our new language.

~~~
orangeshark
>When exactly are we supposed to be learning all these languages?

Some argue that as a professional, you should be spending time outside of work
learning to improve your career. You can't expect your employer to give you
time to learn.

I find it can be difficult though, especially when you want to spend your time
outside of work on other things like family and hobbies.

~~~
zcw100
I didn’t say you shouldn’t spend personal time on those things but you should
expect to be compensated one way or another for it. It’s interesting how
people in IT separate their skills from their compensation. If my lawyer or
doctor is working weekends I guarantee one way or another they are making damn
sure they’re getting compensated for it.

~~~
mcguire
Most states require between 20 and 50 hours of continuing education for MDs
per year. ([https://www.boardvitals.com/blog/cme-requirements-by-
state/](https://www.boardvitals.com/blog/cme-requirements-by-state/))

Most states seem to require between 8 and 15 hours of CLE per year.
([https://www.lawline.com/cle-requirements](https://www.lawline.com/cle-
requirements))

You'll find that with most actual "professions".

