I've been a JS Dev for the past 5 years specializing in Node and recently adding React with GraphQL as the data layer in the last few years.
It seems there are less fullstack jobs and even less Node jobs available which leaves me the option of writing frontend code full-time which I don't want to do.
I want spend the next handful of years specializing in a language with longevity in the industry the same way I did with JS.
My choices are Rust, Go or Python.
What do you recommend for an experienced developer to learn in 2020? I'm open to suggestion.
Python is definitely on an undeniable upswing, but you might find your mind more tingly taking a look at Elixir  with Phoenix-LiveView .
Here's a video that introduces the framework (April 2019): https://www.youtube.com/watch?v=8xJzHq8ru0M
It's based on Erlang which has always felt a little rough around the edges, but rock solid and very fast. With Erlang, service boundaries become a thing of the past and tangible state makes debugging a breeze. It's still on the upswing after 20 years in industry.
Elixir greatly improves Erlang's tooling and creature comforts and adds syntax that many find more enjoyable.
As a guy with web dev PTSD, I've been testing Phoenix and Live-View a bit lately and it really hits a sweet spot between Node's speed and evented nature and the simpler end of React's interactivity.
And jobs seem to be appearing too.
Plus Elixir is surprisingly simple to setup so you won't be spending all night fighting Python module dep issues. :)
There are basically zero Elixir jobs outside a few companies.
This is not true according to my inbox. There a certain few behemoths that keep their Elixir usage closer to their chest as they consider it a competitive advantage
Outside of the bay area?
The Financial Times: https://github.com/Financial-Times/tapper
Pintrest, who seems to really like it (note the highlighted comment): https://medium.com/pinterest-engineering/introducing-new-ope...
And looking on https://elixir-companies.com/en I see two in the UK, two in Brazil, Amsterdam, Ukraine, Canada...Plenty there.
FYI: Discord is in SFO. So is pinterest.
I'm finding the very concept, and separation, of frontend + backend thinking has changed fundamentally in the past few years. There used to be a silly perception of frontend work as being somehow less-serious than the "real programming" you do on a backend. I'm sure you've found more and more in your react w/ gql work how little that applies now. Treating a browser like some kind of thin presentation layer there purely server-rendered html is very limiting.
We've also seen a major trend in recognizing the importance of strict(er) types with the excitement around TypeScript. Functional programming is also seeing widespread adoption.
The language that is best suited for including the browser as a target, taking advantage of an excellent type system, and applying functional programming concepts is without a doubt Rust.
It has the steepest learning curve, but once you get the hang of a few concepts, you'll be amazed that you're writing a systems-level compiled language with perf comparable to C, because a lot of code is more readable than JS. People go on a lot about the performance because it's impressive, but that doesn't even break my top 10 reasons to use rust. Everything is so safe and thorough, it's one of few languages where I write non-trivial changes that actually work the first time I run them.
I think we need to start drawing a distinction between "backend" and "CRUD on top of a database". I've been full-stack for several years now, and I can assure you that the complexity of the non-CRUD parts of a live system generating significant economic value very often dwarfs anything you might deal with on a typical frontend.
It might be the location I've recently moved to (Baltics, Eastern Europe) but after all my technical interviews a few companies wanted to make me to make the choice between back or frontend.
I'll echo the rest of the people's comment and say Python. It's reasonably easy to pick up, and is really versatile. I personally use it for some backend work, and it's a joy to use. One language that I am intrigued by is C# and dotnet. I live in the Midwest, and there are way more dotnet jobs than there are Python, which surprised me at first, but then I figured most of the shops here would have been on prem installations. The tooling from Microsoft has improved a lot in the past 3 year. I myself will be looking at C# just to see how it feels to use.
Definitely learn Python. It’s extremely popular with data science but also makes for a great general purpose scripting language. For Web Devleopment with Python the most popular options are Django and Flask. Django is an opinionated framework (like Ruby on rails) and has a large setup while Flask is un-opinionated and very easy to start something from scratch (like Ruby on Rails).
If you are based on the US a lot of companies here that look for hire for C#/.NET and Java. Larger corporate type companies for .NET while Java is commonly used for high traffic sites (game engines, etc).
The whole thing of asking "which programming language" is not the good idea. As a programmer the main fundamentals to solve the problems in any language are somewhat same. For example I was developing native android apps using java and due to clear fundamentals I was able to pick up the dart language to use flutter within weeks.
I used to develop Perl at the start of my career, now there is no market for it. In my opinion, that makes stack important.
I appreciate what you're saying about fundamentals, but its not applicable to me.
So you did spend a few weeks learning Flutter. What if OP's question was "Which language should I spend my next few weeks on"?
I've been using PHP with Symfony and Laravel the last 5 years and the ecosystem development has been promising and PHP has been improving with each version. The freelance market is also great, though you have to pick the interesting projects as well (I usually don't do Wordpress or CMS-type stuff, but rather custom Web Apps or APIs).
I've also worked a lot with Vue.js and currently with Angular.
The two next big things I want to pick up are React with GraphQL and also Python (Flask and Django). I'm also very interested in longevity, and I think the mentioned technologies have good staying power (I've been burnt enough with AngularJS 1, bower, grunt, gulp, etc :-) ).
I worked on a Laravel/React native app a few years ago. The Laravel community is great especially Taylor Otwell and Jeff Way.
Personally it comes down to staying power and community. I really loved being a part of Node's and contributing where I could whether it be forums or open source projects.
Python is probably a good next language given that it's a very marketable skill right now. And it should be quite easy to pick up if you know JS already.
After that I'd probably learn Rust - it's kind of a longer term bet. Seems to be getting some critical mass so it'll likely be around for a while, but that's by no means a sure thing at this point. Still, there are lots of good concepts in Rust that are worth learning that would be transferable.
You might also look into ReasonML (https://reasonml.github.io/) a strongly-typed, functional alternative to JS.
My recommendations are Go or Python depending on your geographic market. In my area Python is there but not really desired where as Go is plastered everywhere. I personally haven't seen much in terms of Rust being a skill employers are looking for. I feel that the amount of stuff written in Go/Python is huge and those jobs won't being going away too soon so it should give you something to offer for some time.
I'm surprised that Node.js and full-stack jobs seem scarce. When I was last job searching in 2017, I was able to find numerous local (Indianapolis) and remote jobs for JS-based stacks. My two pieces of advice:
1. Rather than focusing on the language, you may get more satisfaction by pursuing a particular industry or sector in which you're interested (for example, podcasting or robotics) and then learning the stack needed to apply for jobs in those fields. If you're working in a problem space in which you're deeply interested, the language feels more like a means to an end rather than an end in and of itself.
2. To help with this, use AngelList (https://angel.co) to search for jobs with startups working in spaces that interest you.
Thanks, I think the scarcity is due to a lot of companies deploying Node in their stack as a microservice on lambda rather than using it for their entire backend. Its understandable.
In the same boat as the OP, kinda, but for me, I feel like the interesting problems at interesting scales are not being done in Node:
- I do 100% Node.js backend work and am a technical lead.
- I did a lot of Java in college, and tiny bits of Java over the past 10 years (servlets on websphere)
- I've gone through phases of doing Go in my free time, and really like it, but jobs seem scarce
- Before JS I spent ~2 year doing Python/Django professionally. I used to do all my whiteboard questions in Python but now use JS. (I've been paid to write Perl, C, & C# in addition to the languages mentioned above.)
I've looked at Elixir, Rust, & Go but none of those languages seem to have critical mass. Do I really need to learn enterprise Java to go up market in terms of money and scale?
I think PHP is also implemented in a lot of large scale apps, I've worked in some large e-commerce companies that use it as the main language. If you want to go for bigger companies, I think they do use a lot of Java or C#.
I think you will always have a job if you write PHP/Laravel. There it seems to be at least 2-3 shops in every city world wide that has a product built with that stack.
I think Go would be a good safe choice for you, if you want to be on the backend. It is popular to find job, used for backends / microsrvices and for infrastructure, which is a very good area of expertise to have as well. Go is a compiled static-typed language with goroutines, so it will be a different experience for you after Python.
Python is great, if you want to be a data scientist / data engineer. In my city for example, there are less web development positions in Python.
I like Rust and you would learn a bunch of interesting concepts, but I would not bet on it now regarding available jobs, particularly in Europe.
Thanks, it seems like the natural route after so many TypeScript, React, GraphQL, Node projects. As I and another HN member said, Node is only deployed as niche microservice within larger architectures.
The addition of multithreading in 12.. didn't seem to change much.
I'd say everyone should pick up languages that are good at different kinds of problems.
I like C for low level stuff.
C#/Java for stable higher level stuff.
Swift/Kotlin for apps.
Cordova for hybrid.
MEAN stack for server stuff.
There's plenty of reasons to do otherwise. There's good reason to switch from Cordova to Flutter, for example. Or Java to Kotlin. C to Rust looks like such an example.
But if it's only a 20% improvement, it isn't really worth it. If you are looking for a better web/full stack language, you should know what's best as an experienced dev. What does Go or Python solve better than what you already know?
Rust but purely because if you only speak JS you'll learn some rewarding new concepts that JS hides from you - both in language theory and how computers actually work under the hood.
Programming languages are to programming what foreplay is to sex - important but not the main exhibit, my point being that Python and (especially Go) are relatively simple languages coming from your background so you could realistically learn all 3 in a few months if you really wanted to.
> Rust ... how computers actually work under the hood.
A curious C++17 programmer, how does Rust teach you much about "how computers work under the hood?" I thought Rust wrapped most of the ugly bits in 'unsafe' and tried to keep programmers from them?
OP is coming from JS.
I'm not a rust guy myself (Fascinated by the memory/thread model but totally disinterested in the rest of the language) but to understand rust (or C++, D, blah blah) you do need to have some concept of a how a computer actually works. The really ugly stuff is hidden but in order to actually do work (thermodynamically rather than REST apis) you need to know what your code actually does (or acts like?)
"Under the hood" is far too complicated to learn from programming as soon as you go below the surface.
Ah, I was hoping for some kind of thing about concurrency or reference sharing. Like look out for dangling pointers or something. My brother if you want to learn how a computer works try writing a multithreaded C++ program, the compiler will not help you much if at all. And you will make mistakes. Everyone does, even google as a whole.
I forgot to mention my background is computer science and I wrote Ruby, Perl and Java for the first 3 years of my career before focusing on JS during the last 5. Thanks for your input, I'm leaning towards Rust or Go; hoping to get some input from the community on what is preferred and what is viable in the market.
> I'm leaning towards Rust or Go; hoping to get some input from the community on what is preferred and what is viable in the market.
If you care about work opportunities - Go, and it's not even close.
Thanks, I'll go through the docs and build a few toy apps over the weekend.
If you're experienced in Rust, what problem spaces are associated with Rust stacks?
Go is a solid choice since it sounds like you prefer backend work. Great language, crazy fast, tons of jobs.
I'm leaning towards Go, it seems like a good move over Python or Rust for me personally. I might be bias because a lot of the JS jobs I have been interviewing for have been using Go.
All 3... python you can probably learn in a day... Go another day or two and rust - the rest of the year
You're probably right, but I don't feel comfortable telling prospective employers I know a language without at least a few open source merges or at the very least some solid side projects.
for "a language with longevity in the industry", my 2cents:
- either a JVM based ( Java, Kotlin or Scala... ) or C# dotnet ( core/net-standard ).
- SQL ! understand joins and query plans.
I am asking the same question myself as someone with 8 years of experience in software development.
I've read this thread and went ahead and read a lot of comparison between languages and I have decided to go with Java.
For context I have been working mostly with Python for the last 4 years with a bit of C++ and the casual React/Js, before that a mix of VHDL and C.
In 2019 I gave a chance to Rust, Elixir, Golang and Clojure. I read at least a book on each, did all the exercises available in the books and did a small size project with Golang (around 5k LoC).
Clojure while cool doesn't seem to have a lot of jobs and I felt the ecosystem to be a bit immature (no big companies / projects behind it). Not only that but there's nothing I saw in Clojure that I thought -- wow Wish I could do that in Python! I also didn't come to some grandiose lisp revelation, maybe python has adopted enough of functional programming that it all seems OK-ish?!
Golang while cool gets under my skin to write anything bigger than a simple microservice. I feel the language doesn't have some OOP/functional constructs that I came to rely on. It really feels like the language makes me write "more dumb" code. I like explicit and simple constructs but it is a bit too much. I am cheering for Golang language evolution and hope it gets Generics/Exceptions.
Rust seems like a really cool idea! It has very cool concepts BUT it hasn't gained enough adoption yet for my taste. There aren't a lot of jobs or big projects using it. I am also only casually in the systems level programming space and I much prefer C/C++ when I get there because at least I remember the language constructs / syntax. Using Rust casually has been proven really hard as its syntax and concepts aren't mainstream yet and I always have to re-read the basics. Cargo is awesome. Cheering for Rust as well.
Elixir was super cool, really enjoyed going through the book I bought and doing the exercises. IMO it also lacks jobs and big projects using it. That said, it was the language that I enjoyed the most out of the new ones and had enough new concepts / a cool framework that it wowed me (unlike Clojure) ! Really cheering for Elixir to be more adopted!
Scala I gave up very early on, the amount of constructs / syntax and ways you can code are just too much for my pragmatic brain.
... so why Java?!
Java is very mature and has tons of well paying jobs. In the last 5-6 years it seems to have gained a lot of cool features that makes it much more pleasant to write. The community also seems to have changed its culture a bit on the AbstractFactoryFactoryFactory pattern.
But the best part is the ecosystem, the IDEs are top notch!
Start a project with Java + IntelliJ and it is awesome. It makes all the difference to have a very solid ecosystem and proven tools / projects that rely on it. After using Java with IntelliJ writing Go feels like you're going back a lot of years.
All these languages are battle proven and not going anywhere, they also look very similar to each other. I cannot stress how important it is for me that they look similar, if I am working 8h/day in a language I don't want to have to add cognitive overload to remembering how the syntax and language constructs work in Clojure, Rust or Elixir.
I would pick Go and Python. Rust seems interesting as a language and tech but their CoC  seems heavy handed and may be indicative of dysfunction in that community.
Learn Java! If you only know JS you have barely scratched the surface of Computer science. You should learn something different which Java is. Then continue with C.
> You should learn something different...
> ... which Java is.
True, but so are many other languages. Why Java in particular?
One possible answer: You'll learn the most from Java. I doubt this answer.
Another possible answer: There are a lot of Java jobs. This was definitely true 5/10 years ago. Is it still true?
Java has been leading the TIOBE index for 20 years. So, yes, there are still lots of Java jobs. Java uses static typing but not manual memory management so it's a good next step after JS.