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
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.
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.
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.
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.
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 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
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 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.
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.
"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.
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
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
- 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.
Rust, companies are already investing heavily into it.
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
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.
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.
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.
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?
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.
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.
> 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!)
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?
Tech companies that hire for specific language/framework skills.. Probably short-sighted in other areas as well.
- 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.
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.
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.
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.
IMHO you'll be better off not just learning the language and libraries but do a deployment as well.
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.
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.
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.
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?
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.
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.
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.
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.
C is not obsolete. It's still used in many enterprise-level projects and is the de facto language for systems programming.
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.
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.
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?
Currently it’s either learning Rust or Elixir’s OTP framework.
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.
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).