Ask HN: How do you decide which language/tech stack to learn?
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.
Thanks
86 comments
[ 0.23 ms ] story [ 161 ms ] threadIf 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
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 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".
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.
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 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?
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.
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.
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?
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.
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.
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.
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?
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
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.
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
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.
I'm now an sort of evangelist for data-heavy projects that want to use more Rust instead of Python.
"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.
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?
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.
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 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.