Ask HN: Experienced devs, what language would you learn today?

22 points by uhtred ↗ HN
Question for experienced devs looking to stay fresh and relevant (and highly employable!)- if you were looking to pick up a new (new to you, not necessarily a new language) programming language today, what would it be?

Some constraints:

1. You want to work in a Linux environment

2. Your experience so far is in full stack web stuff (you enjoy back end more)

3. You dislike the tediousness of ExtremeOO languages (Java/C#)

74 comments

[ 4.6 ms ] story [ 127 ms ] thread
You've basically whittled the options down to Python. It's still an extremely popular and reliable language, not to mention relatively readable, and in use at the enterprise level. If you are feeling like you want to be on the bleeding edge you can give Go a try as well, not quite in use as much but still quickly gaining traction and no need to deal with endless packages that you need to install on each system.
Python is a good choice, not sure if I'd call Go bleeding edge. I'd be more likely to call Rust bleeding edge.
Rust was initially released July 7, 2010, Go was released around November 10, 2009, so if we are just looking at that they are actually on roughly equal footing. My understanding is Rust and Go are for mostly different purposes though depending on what your goals are as a dev, like Rust is more for systems level programming whereas Go is for developing portable application binaries with a focus on performance.
Rust was beta for many years and started becoming mainstream only 2-5 years ago. Go was in production almost its entire existence, it's specifically a simplified language.
Thanks for the additional background info, I stand corrected.
Go has always embraced a philosophy of not being on the leading edge
Yeah I guess calling it that was a foot-in-mouth moment.
I think “bleeding edge” is measured more by mind share than by release date. For example, Ruby was already 9 years old when Rails came out in 2004. That was when it became bleeding edge.
It might be my experience level/background at play here, but I’ve been seeing a lot of openings that are either requiring or desiring Go.
Could be different for application devs vs the infra work I do as a SRE. I just know during the last couple of months when I was job searching Python was a common denominator in a given tech stack and a safe bet. Go was a nice to have for the more forward thinking out there.
Python or Go if you want to have the easiest time finding a job. I'd probably pick Go among those two even with its vaguely OO design just because it's so much easier to deploy.

Clojure if you want to have a harder time finding a job but have more fun doing it! :)

Seeing "Java/C#" makes me think that you might not have taken a look at C# in a while
Coming from Python for 5 years and back into C# there are moments I miss the simplicity of Python.
Seeing Java/C# excluded makes me think the person is very inexperienced. Why ask then?
I'd wish I knew golang. My fortune100 employer is going all-in on kubernetes control plane solutions and I'm twiddling my thumbs as a shell script guy.

ghost edit: I could change my original response because employers often find my HN posts because of my login, but honestly, I'd rather just be honest

> I'd wish I knew golang.

You can start learning today. I picked up Go by porting my backend web projects written in different languages over, but my next task is to convert all my custom shell scripts into CLI tools using Go.

I suggest: Do "Advent of Code" 2022 using Go as an enjoyable way to start learning the language.

https://adventofcode.com

It starts tomorrow, I believe (also previous years are available). A new puzzle is released each day (until Christmas I think). You can use any programming language you like to solve them. The puzzles start pretty simple but get very good as it goes along.

You can race other people but when you're doing it for the purpose of learning a language, I'd take time to explore the language.

Personally, I'd complete each puzzle without looking at anyone else's solution, and then compare to solutions from others, hopefully you can find solutions from some experienced Go programmers. Since you'll understand the problem really well, you'll be able to focus on the different language decisions they made. Well, you do need to be a little careful, because people will use shortcuts that are fine for this but would be horrible in code you don't throw away.

(You might be able to tell: I'm intending to do this myself, with rust.)

I mean... it's not that hard to learn. Start a project this weekend, pick it up two hours a week, you'll be a wizard before you know it
It's very easy to pick up. The parts you might find weird are mainly:

1) The OO model (composition-over-inheritance, and the syntax may be a little unfamiliar)

2) Slices

3) Goroutines/concurrency

4) I guess multi-return and idiomatic error handling deserve a mention, though they're so minor and super easy to understand that they're not really like the other entries on this list.

... but if you can devote 2-3 hours to reading the official manual for each of those topics and working through an exercise or two for each, congrats, you're ready to work productively in Go. Maybe 20 hours total, at the outside, to get comfortable enough to use it productively. Possibly closer to 10. Assuming some prior familiarity with other similar-family languages, that is, which most developers have.

(comment deleted)
> Experienced devs, what language would you learn today?

The language that was required by the company I'm joining.

Experienced devs assumptions:

- Basic familiarity and can read the popular languages already (Java, TypeScript / JS, Python, Go, Rust, ...)

- If not the above, correct it. Spend a weekend getting up to speed on Rust syntax. When you're going through open source code and see something you don't understand, look it up.

So what's missing? Idioms, best practices, avoiding foot guns -- actually writing production code. This is on the job training since doubtful you'll get any of it with a hobby project by yourself without helpful code reviews.

Spot on. Experienced devs already know enough languages to cover most sides, so learn the one that fits the job.
I would still learn bash and python, but I'd probably not do Java/C# again and learn rust instead.
Go, Python. That all I do now. Quite frankly everything else is just pain.

I’ve been using python for about 20 years. That has longevity. Go has the same feeling around it.

I’ve got nigh on 20 years of c# experience and it has been nothing but pain and misery so yeah, stay away. I’m sure I’ll annoy everyone with this but wait until you’ve got to lug along and fix a project with three deprecated Microsoft frameworks in it after one of their schizophrenic direction changes. I spent more time delivering churn than ROI on .Net.

(comment deleted)
* Go for backends

* Typescript for Web and Mobile apps

Also learn SQL. Being able to structure data and write complex queries is a superpower I waited far too long to acquire.
Once you know how to program picking up a new language is just a matter of doing a project or two in it. Just go see what jobs are interesting to you and learn the language/framework they want over a weekend or two.
Flutter, Typescript

One of the few modern languages that have my (dev) comfort as one of their priorities. Even if not intentionally.

Go if you just want to build stuff that deploys reliably and has good performance. It's a simple language with good enough standard library that you don't end up requiring one of those "mother of all frameworks" (e.g. Spring). Downside is the boilerplate can be excessive at times.

Python is easy to develop with, but the packaging situation somehow only ever gets worse. I don't recommend it for large projects that have to support multiple platforms.

I love python, but thanks for reminding me :/
(comment deleted)
Go seems really popular now and a lot of jobs that pique my interest seem to involve it. I’m not a huge fan from what I remember (ofc I haven’t really used it before it’s mainstream success) but I’ve considered if it’s worth picking up.
I would go for either Rust or Kotlin.

Rust because it's a systems/native language and seems to be the go-to language for new projects that would have been started in C++ some years ago.

Kotlin because it's a nice modern language that can be used both on the frontend (Android and lately some iOS and Desktop, sometimes even web) and on the backend. Yes, it's a typical OO language that inherits some of the "ExtremeOO" properties from Java but it fixes some of Java's (former) issues as well. Having the whole Java/Maven library ecosystem available is also a big plus in my book.

You would recommend a language below Scratch and a language below COBOL (Kotlin) on the TIOBE index?
How is a language's ranking on an arbitrary list at all relevant?
You may disagree with the way the TIOBE index is compiled, but it's hardly "arbitrary."
If you are using a popularity contest to choose your tooling you are choosing your tooling incorrectly.

Also it seems it would be helpful for you to read this: https://blog.nindalf.com/posts/stop-citing-tiobe/

OP is asking specifically about being highly employable. In that context, popularity is pretty directly relevant.
Yes, I would and if you want to use the TIOBE index as a guide you can use the following reasoning to justify the choice:

Rust is the spiritual successor for #2 (C) and #4 (C++), while Kotlin is that for #3 (Java). All three of those are showing their age and in a downwards trend.

+1 to this and mostly because I'm getting more interested in more formal functional programming after 20+ years of mostly working with OOP - and both of these allow strong FP without requiring hard commitment to it like with Haskell

I've only heard good things about Rust and it seems to have all the LTS needed to actually improve life over C

Honestly I think something like LISP with a different CPU/GPGPU architecture is probably the future, or maybe a better way to say it is, we probably need computers to be more like lambda architecture than we have now if we want to fully utilize the power of large data architectures (I'm avoiding the term AI in purpose here).

Interesting, I was going to come here to say the exact same thing. Rust if you need the performance/low level features, Kotlin if not. I think Kotlin's niche overlaps with Go but just so much more pleasant to use, I really wish it were more popular.
High employable: JS High earning: Haskell, Clojure, Scala, Ruby, COBOL, whatever Stackoverflow suggests?

Personally I'd study clojure to get exposure to new things. Already studied Elm, Elixir and Haskell for FP, ruby, php, c#, java for OOP, go and c for imperative, I think clojure would be an interesting addition.

> Haskell

Who is even hiring Haskell developers for top-tier pay?

I didn't notice the formatting was broken.

I don't know, I remember reading on Stackoverflow they are well paid though.

Haskell is used in finances though

The current trends are Python, Go and Rust. Go is going to fade away when Google dies, but Rust will still be here, and Python will too unless there's another language that takes its share. (Python inherited its position from PHP, and Perl before that) And vendors keep churning out JS tools so that'll be a safe bet for a while.
> Go is going to fade away when Google dies

No way. There is way too much capital invested in Go projects at companies and open-source for that to happen. You would see a fork happen before Go would disappear.

Companies abandon tech all the time. If anything is certain it's that no software lasts very long. Where's all the companies choosing Ruby for their new projects? Or PHP, or Perl? Most tech stacks come and go. Only a very few last a long time. When a project is led by a corporate steward, and the steward leaves, so does the majority of its users. People just flock to what's popular, and Go was only ever popular because of a celebrity programmer and Google's gravitas. The projects using it will become legacy or sunset, and people will pick up something else, the same way it happened to other languages as Go arrived.

The languages that have lasted the longest are just institutional. Java is for enterprise, C/C++ is standards-driven and has many vendors and core use cases, ASM is just a basic requirement. Python is only popular because it's for scripting, and JS because it's the only thing for browsers. Go has no niche. Oh, you can statically compile it? Not new. Concurrency? Not new. "It's easy"? Not new. There are entrenched languages that can take up all its use cases quickly. Rust is quickly becoming the new C, so that will last basically indefinitely, probably. But Go has no future after Google.

I am extremely fortunate (like I assume most of the HN crowd) in being good at people picking and learning languages with reasonable ease (serious that was not meant to be a humblebrag but sure) depending on the use case.

One language I have been wanting to pickup for a while but haven't had the time is rust. The specific use case for me is high performing (with safety), mostly synchronous execution, and reasonable ease of use inside another web framework. My use case is something like building a rust version of tree-sitter.

I'll stray from the others and mention Unison Lang.

It's a whole new everything but has yet to prove itself useful for production code.

Its promises, if they pan out, could change how we design data-intensive applications. Its idea about code and data as content-addressable can help simplify some distributed workflows.

https://www.unison-lang.org/

Great summary here: https://jaredforsyth.com/posts/whats-cool-about-unison/

Thanks for the pointer -- looks like (OCaml/F#)++ with an effect system and some other niceties. I guess I'd rather go that way then enter the Scala effects mire. There are some obvious issues I didn't see up front (unless I missed them) - - How do content addressable fns and their codedabase integrate w/git (seems like it really has to for the time-being) - The usual: What's the execution model & perf characteristics? - I see it's written in Haskell, but don't know if it's interpreted or further transpiled, etc. - Debugger? Interop? - Type and efficiency of GC - Impl. of collection types - simple conses vs. HMAT or r/b trees, etc.

A strongly-typed pluggable effect system like this should really replace in a more structured and powerful way what Python does today, which is really just to proxy out to efficient external libs (often written in native code, like Numpy or various AI engines, etc.) If Python is used for actual compute, you're adding several 0's to your runtime.

So I'm curious if Unison is of that ilk, or can be used dependency-free for CPU-intensive (and in my case, non-numeric) workloads.

Rust and SQL.

Rust teaches you how to architect (memory management, async handling), SQL teaches you how to query (set theory, computational efficiency). Once you know those two things, everything else is just "translation".

I'll be honest and whatever brings me some level of personal joy

I'm experienced enough, I don't care a ton about the applicability. I don't need to stress financially if its going to be marketable. If its interesting and fun, I would be interested in learning it.

As (mostly) a web app developer writing Angular and Typescript (but having worked with ActionScript, python, a bit of Java and meddled around with c++)

definitely Rust! I already started a course on a MOOC / course site

> I already started a course on a MOOC / course site

Which MOOC is that?

I'd learn C# and avoid the "extreme OO" approach.

You can write C# in an almost functional style if you prefer, it's a very flexible language.

If you want to maximize employability, I'd say Javascript.

If you want to maximize enjoyability, for me the choice is clojure.

Advent of Code starts tonight; pick a language and try it on the AoC problems. The first few are usually extremely easy/straightforward and they ramp up in difficulty throughout the month.