Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: How do you decide which language/tech stack to learn?
93 points by thisiswrongggg 3 months ago | hide | past | favorite | 83 comments
Hi, I'm a senior dev who currently found himself working with C. On one hand I love it as it is familiar to me and I "get" it. OTOH I'm afraid it is regressing my future prospects as many consider it obsolete language and I'm in a market dominated by web dev and java enterprise.

So I'm thinking of investing in learning a more contemporary tech stack to stay relevant and employable. Doing mostly systems work (performance matters which is why we write in C) I was thinking maybe rust is a natural step for me but then again I worry that it won't get much traction in companies (lots of pushback from devs and management invested in older stacks, learning curve, not time tested etc).

Anyway. The real question is how you decide where to invest your time/energy next? I don't know of any method to attack this problem other than let the circumstances choose for me.


The short answer is - there is no good answer. The best thing that worked for me was to just pick a popular stack that can help me achieve specific some goal. And, possibly one with wide adoption and a thriving community and ecosystem, especially if you are looking for career prospects.

Spend a little bit of time with a couple of stacks to understand what you feel comfortable with.

When I was looking to transition from legacy technologies (think mainframes) while working at an established financial company, I had an itch to build a specific product on the side. To be able to build it, I had the option to choose any modern stack at that time (around 2012), and I chose the Java-Spring-Jquery. I could have chosen any other similar stack for my purpose (PHP, C#, etc on the backend and plain JS or any other library on the front end) that were widely used and had big ecosystems. I tried to build some basic functional products with both Java and PHP based stacks, and decided to go with the Java-Spring stack. These days there are even more options, so it boils down to trying a few and settling on one that excites you.

I would choose a language that effectively combines multiple paradigms and is modern. Using that as a headstart, it is very easy to learn other languages.

Typescript is a great language for this purpose because it has a rich type system, is ergonomic and actually used extensively in the wild.It also supports multiple programming paradigms, object oriented, procedural, functional programming, async code, everything is there.

Is it a perfect language to use in production? Not always because it transpiles to Javascript and that might not be good enough due to performance or the platform. However, I would argue that for a senior developer, it should be a great stepping stone to jump to Java or C# or some other popular language, in case it is needed for a job.

Rust in contrast is an excellent language to learn how to write reliable and performant software. Its design, supposing you don't ignore the compiler by abusing unsafe, helps you develop useful programming patterns that transfer very well into systems programming and all kinds of programming. Its patterns and strictness however mean there's a steeper learning curve and at the same time, may not fit sloppier environments like business applications, where reliability is often sacrificed for iteration speed.

What languages would you say maximize development speed? Fastest time from initial need to mvp deployed and working (working well enough at least).

I'll further constrain my overly broad question by saying this is for back-end business logic heavy code or even embedded code with few dependencies on databases or frameworks. So just pick up a language and its available libraries and/or bindings and go solve X.

Python springs to mind, maybe julia. C# maybe?

I'm most productive in matlab but deployment is kind of an issue, so I usually write it again in c++ or cuda.

Python seems really easy to do anything in, and unless I hit a performance shortfall I can't fix with calls into native, I'm done? Julia seems like a write once thing, but I'm still trying to find a sane workflow for julia between the repl and an editor. Ideally I'd be able to try stuff in the repl then easily copy the text that worked into a module. But copying from the repl isn't terribly easy for blocks of atuff, and then clearing that stuff out so ut doesn't conflict.

> Ideally I'd be able to try stuff in the repl then easily copy the text that worked into a module. But copying from the repl isn't terribly easy for blocks of atuff, and then clearing that stuff out so ut doesn't conflict.

For copying stuff from the REPL, `pickandcopy()` from DoctorDocstrings.jl is pretty nifty. [https://miguelraz.github.io/DoctorDocstrings.jl/]

There's also other options: you can send code line by line (or by whole blocks, or sections of code) from the VS Code editor to the Julia REPL if you have the VS Code plugin [https://www.julia-vscode.org/], so you can interactively build your code in the editor itself while trying it out piecemeal. Pluto is another option, where you get REPL like feedback, and because of its reactive nature, you get rid of conflicts as you write new code. And Pluto notebooks are just Julia code files (with extra markups for notebook functionality that don't affect the execution).

Which of these works for you depends on what suits your workflow and which tools you prefer, you can give them a try and decide for yourself.

For development speed my vote would be on Ruby, along with Rails it is still unsurpassed by any newfangled stacks

Interesting! Ive never given it a look before. I always assumed it was a "web language" and as none of my work has ever been even peripherally related to web stuff I ignored it. I like the syntax, though the "everything is an object" makes me nervous. I dont like opinionated languages. I use OO when it makes sense for me.

People keep saying that, and I guess it must be rails making things like Auth, seeting up an ORM, sessions, etc easy right?

Because ruby itself, I find to not be a productive language. The lack of types means that the discoverability of methods is poor (especially when combined with the fact that gems can modify standard library classes, and rails takes full advantage of this); the lack of types also means I have a slower debug cycle because I'm bound to make silly mistakes (indexing with symbols into a hash with string keys, or typos).

So again, is it really rails that makes producing MVPs easy, or is it ruby, the language?

The short answer is you want to learn a language that helps you achieve your short-term goals and that ideally positions you to achieve your long term goals. Focus more on the goal, and select a popular tool (so you get support) that has a good chance of solving your business problem.

To give some perspective, in a 22 year career, I started out learning Visual Basic, C++, SQL, Java, and databases because those were “hot at the time”, and it was fairly easy to get jobs building out apps with these kind of technologies.

As the web started to gain momentum, I found that again I chased short term goals of doing web development by working with HTML, CSS, and JavaScript.

After business school, I started to refocus on longer term opportunities. I learned about predictive models, R, Python, Docker, Hadoop, Spark and TensorFlow and applied all of that to data science and machine learning engineering.

These days, I am building a business that teaches people what I have learned over the years with current technology. So here, I have come full circle and have done a lot of React, Node, and Tailwind work to build a website (https://www.whiteowleducation.com) that teaches people how to data visualizations using Python, C++, and Unreal Engine.

Hope this helps.

Rust is fine and useful and has plenty of traction. You can build stuff with it that's more annoying with c and reach groups of devs that don't use c much.

Just learning other languages makes it much better to learn others making you a lot more flexible and faster to spin up. There's a certain amount of brain bending that happens as you encounter new paradigms in different languages which honestly is the hardest thing to learn. After that languages are relatively easy.

I focus on areas I'm curious about, it doesn't matter whether or not it's super applicable at the time. The most important thing about hobby work is that it's about fun and edification.

Keeping four languages in my back pocket is my safety net: one to pay the bills (C++), one for automation (Python), one for intellectual curiosity (Ada), and one for a possible job at a future date (Rust). I've also done deep dives into Ruby and Haskell just to see what's there.

> mostly systems work

Ada is a weird choice that really teaches you to think about the intent of what you're doing and has a tool called Alire that makes getting a toolchain up and running easy. There's a lot you can do on the low level (easily bind to C, make custom memory allocators, bit manipulation, etc.) but the syntax is straightforward enough I can walk away for months and then jump back into it with no problem. Since you're coming from C, it should feel like a strongly-typed C.

As a software engineer, doing hobby work in Ada significantly improved my ability to think through the intent and design of what I'm doing.

If you're sticking with systems programming, Rust is the way to go IMHO.

If you're doing server-side app programming, especially, in k8s, then golang.

Web apps, you would do well with TypeScript.

Data & AI: Python.

Just my 0.02p worth on the matter

The good news is that this list very closely describes the job market. Even better news is that at least Python and golang are trivial for experienced people because they are just a subset of a Java/C++-like big boy language. From what I understand Rust and TypeScript would require more effort for developers not familiar with modern languages.

But this answer doesn't cover frameworks at all. React and PySpark come to mind, many people say golang doesn't require more than its standard library. Depending on your background those are at least as time consuming to learn. It would be interesting to know what other people think about it.

I would say rust for all except Data/AI; for now.

Unless you want to leverage Arrow heavily in your data engineering pipeline, then Rust can replace Spark.

Do you have any further reading or crate recommendations? I have slowly been getting into rust but haven’t really used it for data engineering.

Polars and data fusion

Not really my domain, but the arrow2 crate seems to be high quality work.

Re: web apps - is yew production ready? Searching about it gives some ambiguous results.

I find I'm most efficient learning a tool if i have a project i can conduct while learning the new tech. So i look for projects and attach tech rather than the other way around.

I find this is what helps me convert from potentially learning 10 things (but going through with nothing) to learning 1-2 things actually.

Unless it's a joke tech you pick up it will surely enhance your "employability / market value".

I work in Deep Learning. Whatever I do on my work or remotely related to my work can be done with Python.

I focus primarily on three things before learning a new language and/or stack:

1. How easy it is to get started and start using it, and how quickly can I get value out of it? This is how I learned flask, and used it many times in production.

2. Intermediate to long term alignments with interests- even vague ones. I never did Edge AI professionally. But I tinker on my own. There are many cookie cutter solutions where you can just plug in your trained model with some constraints. But I learned proper C to handle the low level stuff if I need. I also plan to learn flutter because, I think using tflite with flutter is going to look good. Dangled with Unity for making custom environments for training Deep RL models.

3. Horizon expanding and sheer interest: I like the feeling of being a beginner, and learning new things. I like when I am learning something that is very new to me and expands my mind. I read The Little Schemer for this. Now I am learning the J language for fun. I learned some Clojure for this. I also plan to read Nature of Code. I also did the EPFL Coursera course on Scala by Martin Odersky for this.

This is pretty much how I decide.

I don't understand the concern that language X won't get enough traction. If you were advising a group of a thousand developers then sure, you need at least a few thousand jobs using language X (assuming people get rejected). But for one person, how many jobs do you need available? Realistically somewhere on the order of a couple dozen. Are there a couple dozen companies that use Rust? Sure! Do I think there will be a couple dozen companies using Rust in the next few years? Sure!

Now there are languages where this question is a little more pressing. OCaml and Haskell may not have a couple dozen jobs open. But for Rust? You can find something.

Sure you only need one job, but if there's 2 developers for every 1 job half of them are getting left out. Plus those that do get jobs get paid less. If the ratio is reversed then you get a pick of jobs plus a higher salary. Much better situation.

Do you get paid less? I’ve been working with Rust in my last couple jobs and I think I’m being paid very competitively, especially for my experience level.

Usually I learn whatever interests me and I also make project decisions (in personal projects) based on that[1]. I generally try to get jobs where I can learn what I want to learn, not "the other way around", if that makes sense. Not sure if that's useful for you though. I'm a junior so expectations are probably a lot different in your case. Plus, maybe my interests just kind of align with what's demanded right now.

"Senior C dev" doesn't sound like a bad prospect to me though? I was always under the impression that there was a solid layer of C openings when I looked for jobs.

[1] Okay, sometimes I make pragmatic decisions or someone else makes me work on something using currently popular tech. And I did gain a lot of "employment-relevant" skills from that I think.

I think that if you are obsolete (and that's a big if), it's not because of languages you don't know, but because of jobs you can't/won't do. For me personally, that was writing (web) UIs. Learning JS/TS + React was the best thing that ever happened to me. The best decision I ever made. It basically enabled me to crush all such thoughts (about being obsolete) that I had. I no more have to rely on someone else in order to "talk to the world" (express my ideas with software/UI). Now I can market my ideas on a whole different level, even when they are backend/systems ideas. And I was astonished by how much "real programming" there is on the frontend.

I was in a similar position. I have completely switched stacks every handful of years, like 5 C#/.NET stuff, then 5 usual full stack web stuff, then again with pure embedded C (which was my favorite tbh), and now back to web. It never caused any problems, in fact I played into ability to learn/switch stacks as an ability in interviews and it seemed to work.

if nothing else, dont think of specializing in c (or any non hipster native code really) as obsoleting yourself. think of how much the next wave of cobol maintainers are going to make and times that by c's huge foundational reach

If I could give myself advice as a younger programmer it would be to focus more on C or even lower level paradigms. Once you learn some Python and Javascript it’s no big issue to jump around, get rusty, or move to something else higher leveled. It would be even easier if I were more experienced at the C level. Hope that helps.

Consider switching to mobile :). Language anxiety doesn’t exist here, you either work in Swift (maybe some ObjC) or Kotlin (maybe some Java). New APIs come out, new patterns develop, but languages are quite static.

How does something like react native fit in the mobile world? Are there cases where it could be used instead of straight swift or kotlin?

RN has generally used in situations where the company/project is small and they don’t have much or any native talent and this kind of makes sense for awhile… or a manager makes a play for “efficiency”. All the big players who have tried it eventually went back to native for various reasons.

I mean, Discord didn't, and Discord is not a small player any more. Are you saying they are the exception to the rule?

It's a niche thing people who don't know any better try to use and then get stuck, not wanting to re-write their codebase.

For the most part, every dev shop has separate iOS and Android devs.

I'd say give one of the broad categories a try, instead of languages/tech stacks. I don't know if you're employed and if you can either switch companies for this sake/choose within your current company or you do independent consulting. But whatever it may be, try web apps for a year you'd automatically learn JavaScript, HTML, CSS and some good enough framework, maybe try mobile dev for year along the way learning Swift/Java for Android or try enterprise projects in Java and learn a bit of spring/akka or something like that.

My story started a little similar to yours, I was a C++ developer working on modems and drivers, then worked on AngularJS in 2014, then rode the initial Big Data wave and learnt Hadoop, Apache Spark and a little bit of Scala (very scared even now), then went full on enterprise Java building batches, services, message daemons etc. for quite a long time. And now for a year and a half back to JavaScript after half a decade on a mammoth React based project, very surprising to see how much JS ecosystem has evolved. I enjoyed developing pretty much all the projects I worked on, learnt quite a bit of Java, JavaScript, small amounts of Python and Scala.

On the question "How to decide?", I went by 1. hype, 2. interesting and colourful stacks, 3. make me good money. Went just head straight into one of these based on what I felt that year/period

I have two criteria:

- languages that are foundational or continually in demand: C, C#, Java, Golang, Python, Ruby, JavaScript

- languages clearly gaining traction: Rust, Elixir, Typescript, etc

The languages listed and the categories I listed aren’t exhaustive, just the ones I thought of.

I try to keep some of the foundational ones fresh-ish. Then I’ve got a couple of the interesting ones fresh just because I find the space interesting.

Right now, my foundational languages are C, Golang, and Ruby. Exciting ones are Rust and Elixir.

Beyond that, I don’t try too hard. Just want to keep familiar with ideas.

> So I'm thinking of investing in learning a more contemporary tech stack to stay relevant and employable. Doing mostly systems work (performance matters which is why we write in C) I was thinking maybe rust is a natural step for me but then again I worry that it won't get much traction in companies (lots of pushback from devs and management invested in older stacks, learning curve, not time tested etc).

Rust, companies are already investing heavily into it.

The world will require competent c programmers for many more decades, if not for the rest of your life. Being an expert in c will probably pay far more dividends in the future than any of the “modern” languages.

That said, if you’re worried you can’t write web software or develop an app with the latest stack, then try one, I’m sure you’ll excel at it. Pick up python or Go and start writing something, you’ll be surprised how easily it will come to you

Languages (both spoken and programming ones) are a bit like pokemon.

You start by wanting to catch them all. Then you realise that not all are powerful or worth the effort to upgrade. By the end you realise that the ones in the "starter pack" are probably some of the best in the stack, and there's only a handful of exotic ones that are worth also having on the side.

They also both tend to have similar names.

Well, you say it yourself: the reason you work in C is for the performance; make performance your specialization, while leveraging what you know in some of these more modern languages and frameworks.

I primarily work in C/C++ for the performance as well. I've leveraged this to create solutions not otherwise possible in these more modern or institutionally entrenched tools. For example: 1) using Python for easy developer access, while many components are implemented in C/C++ for multi-threading, multi-processing plus the performance; 2) extending the MS Office suite with access to high compute analysis without reliance on a cloud service; 3) embedding high performance servers and exposing REST APIs within your projects without reliance on a cloud service - essentially an intranet cloud, or a full blown SaaS if ya want; 4) hosting the latest ML/DL models in a higher performant application than anyone not working in C/C++/ASM/WASM; 5) integrating Cosmopolitan into your stack and all your work becomes OS independent.

Choose what fits your field. If you're doing ML you probably want Python. If you're doing web you probably want JavaScript. If you want fast native apps then Go, Rust, C++, C, and the rest based on what libraries you think you'll need and what you enjoy the structure of most.

I personally have had a career in Python for over 10 years at this point. What made me choose Python as my go to language was my friends and peers making fun of me using PHP for server side web development. Ruby and Python (Rails and Django) were the cool kids. So peer pressure could also help you with your decision as it did mine!

At this point in my career I care less about my language and more about what libraries are available as those determine how fast I can have an MVP. I'd determine what you are trying to build and come up with a list of requirements and see what libraries are already available for you to build off of.

Open source pet projects are a great starting point for learning. Come up with an idea, even if it's been done before, and build it.

> The real question is how you decide where to invest your time/energy next?

I pick languages which seem interesting for one reason or another. Idris and Lisps seem interesting to me now.

What you should learn depends entirely on what you want to achieve. Do you want a stable career at your current employer? A shot at a lot of money? Or perhaps you want to learn something enlightening?

For me, a language or tech stack is not more than a tool box to achieve a higher goal, namely solving specific problems. While I do enjoy building software, "writing code" or mastering a particular tech stack is only one component of several things that make software engineering enjoyable.

One of these other things is understanding the kind of problem I want to solve and its environment, by collaborating with stakeholders and domain experts. As soon as I understand their expectations, I decide on the tech stack.

That being said, if I want to make an estimation which tech stacks are likely to be relevant in the long run, I would start with understanding which business requirements will be relevant. Based on that (and maybe more), I can assess which stacks could be a promising fit.

And if I'm wrong, don't neglect the experience I make mastering or learning a tech steck.

Your question is interesting to me. As a software architect, I study various tech stacks and programming languages. I concentrate mostly on open source and microservice architectures. I usually start with implementing the same feature identical rudimentary news feed microservice. Over time you start to see the similarities and differences between the various implementations. I blog about this over at https://glennengstrand.info and the source code can be found in https://github.com/gengstrand/clojure-news-feed

You are looking for a decision on what programming language and tech stack to learn next based on career mobility. Here are some questions to consider.

What kind of company are you most interested in working for? Think about the size of the company. Is it in a growth market or is profitability more important? Is it a technology company? Does the CEO view technology as a profit center or a cost center? Do they have a CTO? If they do, then who does the CTO report to, the CEO, the CIO, or the COO?

What kinds of programming languages and tech stacks are on the career pages for the kinds of companies that you are most interested in? Different kinds of companies tend to cluster around different tech stacks. There are other factors to filter for such as how deeply do they embrace remote work or commute distance to where you currently live or are willing to move to.

These are lagging indicators. They are going to be more accurate than leading indicators but that also might indicate that whatever you learn next based on these factors might have a shorter shelf life.

Finally, you should ask yourself what about your current programming language do you like? Try to pick something that you would also like. The Go programming language was originally invented as a better C and is enjoying some marketability right now. Maybe that would be something to look at.

I'm currently working as a web dev and slowly gaining interest in Rust as I see it as a contender for C/C++/Java/C# and other established languages. When I started about 10 years ago I was convinced that browser ecosystem will be respectable due to it's cross-platform and flexible nature. At this stage of my career I'm looking for a solid 2nd choice and so far I see Rust as an emerging power. Also I have prejudice about Microsoft, I dislike OOP, I think of C++ as too complicated, C is king of embedded but I'm not looking at that direction, so for me it crosses out some of the more popular options. TypeScript is a good reason to look in the direction of web dev, everything else is up to discussion as it also depends in what field one is interested in.

I usually wait 5 years. If the tech is still there (and it's stable) and devs are using it, then I start learning it.

> The real question is how you decide where to invest your time/energy next?

Just learn whatever you think it's fun. It's not that you are going to learn 1 single tech in a whole... decade? I usually spent around 3 months with new tech. That's like 3 or 4 new techs per year, so don't worry about picking up something you like that is not that much relevant in the industry. Also, playing around with something for 3 months is enough for applying to jobs that require such tech (only if you have solid fundamentals, otherwise work on them!)

Pick what I like and work on that. As long as there are operating systems, there will be work for C developers. Nobody's going to rewrite Linux in Rust within our lifetime. Or if they do, it'll take long enough that we can learn along with it.

By looking at HackerNews, Reddit etc to get a feel where the community (or bubble) is going. Then validating these information against what is actually happening in your company. And then it is mostly whatever you decide what you want to chose.

So for me Rust was the main contender so I read stuff about it. But also Ocaml, F#, Zig or Nim are interesting to me.

I think in the end my way to chose things is:

Are there good libraries for the language I would want to learn? Does the language fit into my current workplace and would my colleagues be able to adopt the language as well? Does it fit into the culture? What is the operating risk to continue supporting the tools I chose for a team/company, If I were to leave the company?

I'm always learning new languages but when job searching I end up in the same language I always used because those skills match my employment experience. What is your plan on moving stacks? Make your resume generic and hope for a take home test?

I learn what's needed for the task I'm doing.. On the side, whatever suits my fancy.

Tech companies that hire for specific language/framework skills.. Probably short-sighted in other areas as well.

My viewpoint:

- C, C++ = Mandatory, Foundational and all encompassing. You can program anything and everything from 8-bit MCUs to what-have-you.

- Erlang/Elixir = Made for Distributed, Reliable, Fault-Tolerant Systems (which is the norm nowadays). Do the System Architecture/Framework using these and drop down to C/C++ as needed.

- Python = Common, popular and all purpose easy to use scripting language used everywhere.

- JavaScript = For anything Web related using a single environment for both Frontend and Backend development eg. MEAN/MERN stacks

Anything else only learn as needed.

> The real question is how you decide where to invest your time/energy next?

No next one, all the choices have done. I picked Common Lisp because I want to write an AI, possibly ASI or AGI. Other Lisps are installed on my machine as well. The reason to pick this or that kind of activity for me is just to do what is the coolest one. But regarding to my possibilities of course and not regarding to what Gigachad use to prefer. Reach within you.

Learn fundamentals.

Learning C is good as it's very fundamental.

Learning a scripting language is fine as that's fundamental. Any of Python, Ruby, Perl, Tcl, etc. are fine. I chose Python over Perl moons ago, but the scripting languages are mostly equivalent. Python has the most momentum for now so I'd probably default to that unless you particularly like something like Ruby, for example.

Learn something that makes your programming different: Lisp/Scheme, Rust, Go, Ada, Clojure ... what's interesting about these is that if you learn them, you will find that, for example, your C programming will also change radically. Functional programming will teach you to use much less global, mutable state no matter the language. Rust will teach you the difference between stack and heap solidly. Go will teach you to think about concurrency differently. etc.

Web programming always annoys me. Pick the fundamentals out of this--generally things that are older and yet still popular. Learn SQL and PostgreSQL so you understand fundamentals about databases. Being solid at SQL can often save a ton of programming in your server language. If you're into front-end stuff, you'll have to learn Javascript and probably one of the neo-Javascripts (likely Typescript). Learn HTML and CSS.

Beyond that for web and you start getting into "frameworks" and things get a lot dicier as to being "fundamental". Consequently, I avoid webby programming as much as possible. I'm a bigot on "Javascript shalt not contaminate the server" but that is by no means either a popular or proven position. But, I also still prefer Django for web stuff (mostly Django REST Framework even more than straight Django) until somebody shows me that it isn't really feasible. Note that both of these positions are quite old and fusty. But, then, so am I.

Phone programming, on the other hand, is something I LOATHE because the knowledge seems to have a half-life of 12-18 months. It decays even faster than web programming. Don't learn it without a solid reason.

Avoid C++ like the plague unless you have a specific goal in mind. Game programming being one of them.

Finally, community matters. A below average solution with a good community beats a perfect solution with a crappy community.

Hope that helps.

> The real question is how you decide where to invest your time/energy next?

Everyone is going to say they have X or Y good reason and their choice reflects the deep thoughts they have put into carefully weighing pros and cons, while coming up with this decision.

I picked the next language I learned by looking at the hype. Rust was the most beloved programming language of the year when I started learning it. That was it.

And how did that work out?

Very very well. I don't think I'll ever regret getting into Rust. The whole development experience is a great delight !

I'm now an sort of evangelist for data-heavy projects that want to use more Rust instead of Python.

Ideally you'll have some problem to solve or something that needs built. Pick the tool that is right for the job and learn it.

Pick a popular base system. Node.js, python (flask or similar), maybe .NET core. all of them are easy to learn for a C programmer. The real learning curve is the surrounding deployment systems and package managers. npm, pip and nuget etc.

IMHO you'll be better off not just learning the language and libraries but do a deployment as well.

100%. If you can't deploy, you can't deliver.

> a market dominated by web dev and java enterprise

Which also means there are a ton of web devs and java enterprise programmers. If a technology is ubiquitous, the number of people doing it is also ubiquitous. A technology being too niche can be a problem, but a technology being too commoditized can cause other types of problems.

I think this is the wrong question actually. Say I wanted to learn machine learning. It might be counterproductive to Google “what language/toolkit is used for ML” because then I would just be an expert in Python/SciKit/etc. It might be more helpful to narrow down the area first - neural networks, ML ops, voice assistant, etc. - and the language/tools will naturally follow.

Per your actual question, you can’t go wrong with enterprise Java systems in web dev (backend/ops). I would caution against Rust for web dev at this moment because the trendier stuff will have very few offerings compared to legacy stuff, just by nature. Once you can consider a technology “boring,” it will probably be stable enough to be the default stack in a lot of shops.

There will rarely be one stack or tech stack for life or that’s the best.

It’s best to get started with something and don’t stop moving or learning. Avoid chasing shiny new techs and things, they are usually not stable or reliable. Spend time experimenting and learning something deep enough.

Get good at shipping. Anything that helps you do that faster and often is best for you. Customers and users generally don’t care what you code in, they just want a good experience and that is something you can do.

Most languages and frameworks are pretty decent with their pros and cons.

See it more as where you’ll begin and leaving it open to where you may end up. Transferable skills and learning how to learn is the most valuable skill.

If you’re starting off it’s hard not to look to what others are saying. A lot is personal preference and interpretation.

Depending on way you are building there may be things easier to learn with.

The languages I like working with I generally do not recommend, because creating a beginner who doesn’t stop learning how to code is more important. Im not using anything hard but if your goal is to have marketable and valuable skills that you can use to access opportunity to improve your life, I can share what I have mentored both peolel with and without any software development background.

First, it is completely possible to be self taught and a self directed learner. In fact, it is a valuable skill over formal education in that you get a track record and experience of shipping solutions. Having both is a magnifier.

Here’s the advice I give:

If I was starting out today, I would learn vanilla JavaScript first (JavaScript in 30) and help it to show me the benefits of libraries and frameworks. Lately there isn’t much you can’t do with JavaScript.

Once you have vanilla is, you learn about why libraries are important and helpful. In JS but any language.

Libraries will teach their complexity too, and that sheds a light on why there are frameworks and so many of them.

This would naturally lead me towards building website, web apps or hybrid mobile apps with JS. Massively transferable skills and keeps your options broad. Learning to connect and work with APIs is critical.

Beyond this the other thing I would learn immediately is Flutter. Luckily the syntax of its language dart is similar enough to JavaScript.

Two other technologies that can’t be ignored are webassembly and Rust.

There’s a lot of other great stuff going on. Python will come into your life sooner or later, as will others.

In my opinion you are senior once it doesn't matter what language is used. Until then you need to learn paradigms that are unfamiliar to you so that everything becomes familiar and you feel comfortable working with anything.

Here's a gander.

Just picked up netlify CMS (a static site cms that stores its data in Md files on the same version control your app is stored) because it fills a perfect use case. That lead to me getting a handle on Markdown, showed me into some git merge conflicts I've never experienced , (I mostly work solo). I just built my first edge function in netlify. Basically a tool lead me on a pretty interesting learning path.

In the past I took a Java masterclass that taught me a litt of everything about Java. Guess which language I have no intellectual interest in?

Everything is contextual. If you want to do webdev you could learn JS or PHP or something. If you wanted to do data science then Python or R would be a good step. If you like the idea of exploring languages for shits and giggles go with elm or Clojure or Haskell or something. Really depends on what you want.

Rust seems like an interesting choice for you since it's a system language but also gets used by web devs in some situations. Go might be another good choice.

Again though, it all depends on what you want to do with your time.

1. Figure out which kind of job you want.

2. Look at job ads for those kind of jobs.

3. Learn the languages/libraries/… most frequently mentioned in the job ads.

4. Use your acquired knowledge to get one of those jobs.

I was a C++ dev, I went to Java first which syntactically was similar but with "Clean Code" and Spring everything was completely upside down and took a long time to learn. I did a bunch of Python for Datascience which is nice but I dont love it. I'm doing a lot of front end Javascript right now and I think this is actually a great place to learn. Lots of WTF moments in Java are now clear that they're copying JS and are easier to learn in JS.

JS is everyone’s favorite language to diss, but I actually find it quite pleasant these days. In nearly every other language I tinker with, I find myself missing some aspect of JS.

I never thought I’d see the day. I wonder if it’s Stockholm syndrome.

Me too, I've avoided it as much as possible but now really love it. Apps can be done without any real server side work now too so is really a great platform.

What do you want to build? I wanted to train ML models for Kaggle so I picked up Python (even though I disagree with pretty much all the design choices of the language lol)

Considering tech outside of an application context feels weird to me. Like yeah it’s hard to choose with no requirements or constraints.

That said, Rust is probably here to stay. Linux, V8 and some other high profile systems are adding first class support.

As hobby, whatever is hot, need to form an opinion, even if superficial.

At work, platforms dictate the choice of language, when picking a platform for a specific project, only the languages that have direct support without needing to install extra IDE plugins, custom build steps, manually writing bindings,....

Projects are already complicated enough without adding extra fun to them.

> many consider it obsolete language and I'm in a market dominated by web dev and java enterprise.

C is not obsolete. It's still used in many enterprise-level projects and is the de facto language for systems programming.

I just went with whatever but if I had to do it again I would prioritize the community first and the documentation second.

I learnt on PHP. It allowed me to learn the full stack of web development very easily. Deployment is dead simple. You couldn't ask for a better intro into web development.

There will always be a time and place for C/Rust. If you like embedded/firmware, or HFT stuff, I think rust would be a great level up.

Which ever seems fun.

I have worked in couple of Big Techs and they don't care what languages are you proficient in. All that matters is if you're comfortable in the domain they are hiring. Learning languages and frameworks are easier.

So pick a domain you want to explore, like working with services, or mobile, or mobile architecture, web etc

I personally started my journey with Python for back-end and I still love it and do my micro projects in Python.

In industry, I've worked with C#, Java, Golang, Python and concepts I learned during my exploration were super useful in my work. These concepts were handling of data, caches, running services, scaling them up, cloud etc etc

I'm sure there is similar story for mobile and web.

So TL;DR, pick a domain you want to explore and pick a language you're comfortable in. Build expertise in the domain and not the language/framework.

Not that expertise in language/framework doesn't matter, I just personally feel from my experience in industry that domain knowledge is valued more.

Is it more useful than what I already know for the problems I (might) want to solve?

How many people can help when I face a problem?

How good are the ecosystem/libraries etc...?

Is it enjoyable to work with it?

Is it in-demand?

I always try to diversify into 1 area I am not familiar with, as a hedge to my own career trajectory.

Currently it’s either learning Rust or Elixir’s OTP framework.

Whatever my company tells me I need to learn (or see that they are looking at, then I get a head start on it).

I would learn the one that gets you a job at a place that will support you learning more/other stacks.

For most of my career it would be when a sales person tells a client that I already know it.

Personally, I'd check out language popularity indexes for a very general and vague idea of what's popular in the industry (the individual spots don't matter, just the overall scene).

For example, consider the top 20 out of these:

  - https://pypl.github.io/PYPL.html
  - https://www.tiobe.com/tiobe-index/
Alternatively, look at developer surveys, like these:

  - https://survey.stackoverflow.co/2022/#section-most-popular-technologies-programming-scripting-and-markup-languages
  - https://www.jetbrains.com/lp/devecosystem-2021/#Main_programming-languages
Additionally, maybe look at which languages are popular on GitHub:

  - https://madnight.github.io/githut/#/pull_requests/2022/1
  - https://octoverse.github.com/#top-languages-over-the-years
Also, look at local/remote job boards and try to gauge which languages are the most popular for positions that you might be interested in.

After going through all of that, you should have about 10-20 languages to consider, which then becomes largely an issue of just filtering that selection down, grouping those languages and getting started with them, based on the domain that you want to work in.

For example, if you wanted to work in full stack webdev:

  - a language to use for the front end, probably JavaScript or TypeScript
  - most likely a language with managed memory but pretty performant runtimes, like Java or C#
  - maybe a language that lets you iterate on ideas a bit faster or is popular in additional domains as well, for scripts/utilities etc., like Python, Node, Ruby, Go etc.
  - probably SQL, or an alternative for interacting with databases or other data stores
  - probably a shell scripting language like Bash for the stuff outside of your application
And then just explore the most popular frameworks/libraries in each and go from there. Eventually once you have Java under your belt, then you can move on to C#, or similarly go from Java into Kotlin which is still nice, similar but also a bit more niche.

Note: the particular languages to try and use will probably also be affected by your locale, or wherever it is that you'd like to work. Those choices would also be different for wanting to work on mobile apps, or on embedded software etc.

Furthermore, picking the most popular languages won't always mean the "best" ones, typically just those that have ample documentation and tutorials, have been around for a bit and thus have shown that they'll survive for many years yet and also have proven and supported ecosystems for most use cases.

The only thing I consider is whether it is needed for my current project.

Here's how I've decided what to learn over the course of my life:

1. Learn "how to program" at all: C++. It was 2006 and C++ was basically just The Real Programming Language

2. College, learning different paradigms and still "learning to program at all": now sprinkled in C, Java, and Lisp.

3. Trend: around 2011, Ruby and Ruby on Rails was HUGE. I learned that and was grateful that I did as it showed a new way to program and that languages and frameworks could be made to make the programmer's life easier. I also learned that high-level interpreted languages are great for things like web, but fall over for things like cpu-intensive math.

4. Real Work: I then joined my first job and for the next 5 years would be doing web development with JavaScript (vanilla, Dojo, and jQuery) and Java (J2EE, Spring) and Perl (Mason).

5. After doing web-dev enough, I wanted to hop on the app side as I saw apps were beginning to overtake web traffic in terms of % of site visits. Java works for Android, so I was good there. I needed to learn Objective-C, so I first refreshed my familiarity with C and then learned Objective-C. I'm very glad I did the C refresher first. Kotlin and Swift were growing, but weren't yet fully established and my company lags behind in trends (see the Perl above).

6. A mix of trends and for fun: at this point, I'm fully covered in terms of "working" languages. I'm strong in JS and Java, solid in Objective-C and Perl, and decent in C, C++ and Ruby. At this point I've also established that I can pickup, learn, and even teach others languages very quickly.

At this point, I pursued languages that would expand my knowledge. I wanted a deeper and higher understanding, so I looked into Lisps. I started with Common Lisp (as I felt it was "low-level" and "high-level" at the same time). From there I pivoted to learning Clojure. I especially liked that Clojure runs on the JVM, so my Java knowledge was relevant, and ClojureScript compiles to JS, so my JS knowledge was also relevant, and it was a Lisp, so I was learning something new. Read through the SICP and every Clojure book I could find.

I enjoyed having learned Lisp / Clojure but it wasn't very practical or hirable.

Around this point I also got familiar with Python and Go. They're very, very easy languages to learn and in very high demand, so figured I'd add those to the toolbelt as well. (This would later pay-off immensely!!)

7. Back to the resume: at this point, I felt I had a full breadth of languages (from C to JS/Java to Lisp) under my belt and decided to turn to depth. I'm constantly reminded of the saying "dance with the one that brung ya'" and turned to really master JS and Java. For JS, I learned React and Node. They weren't used much at my company, so took some courses. For Java, really went into Spring and other "microservice" stuff.

8. Need for Speed: that said, at this point, I'd also been struggling at work with the mismatch between Java and AWS Lambdas. The cold-start issue was really hampering our ability to effectively use Lambda. So then, I started looking into languages with better startup and runtime performance: Python, Go, and Rust. I knew Python and Go from before and they were each beat out by Rust's performance, I started learning Rust this year.

9. Interviewing: at this point, my team wasn't looking good and I started interviewing. I realized that while Java is my #1 language, I found that Python was 10x better for interviews than Java by having easy to use tuples, lists, defaultdict, sets, lambdas, and heaps. Even with 10 years of Java experience, Python was just made for interviews, especially since so much of Java's verbosity is offset by IDEs, which you don't get to use in interviews.

So, to recap: here's my toolbelt:

- For 90% of real work: Java and Javascript

- For apps: Java for Android and Obj-C for iOS

- For interviews: Python

- For elucidation: C and Lisp

- For performance: Rust? Go?

Now I'm joining another company in a few weeks that mostly uses JS (MERN) and Go. I'm still not sure if I'll be able to use Rust (or if it's even a good fit). But I definitely am attracted to the language. Overall though, it seems like Go beat Rust to the "cloud microservices" niche.

The Rust learning curve is very real, but the compiler is really there to help you find real tough bugs before you even build (rather than debugging them in prod months later).

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact