What I'm learning
Table of contents
Even though software will mostly be built by AI soon, I still have a curiosity to learn these languages:
TypeScript
Python
Rust
Elixir
Ruby
Why?
To me, each one of them specializes in certain domains that I can learn from.
TypeScript
TypeScript is just JavaScript with types, and learning TypeScript means learning JavaScript so that's what I'm going to talk about now.
Whether you like it or not, JavaScript powers the web. If you want any sort of client-side interactions to make your website's UI more snappy, you have to reach out for JavaScript (I know WebAssembly can do this too but more on that later). In general though, I see JavaScript as a true Web language and as a curious developer who likes to look under the hood of the tools I use, I am constantly fascinated by the endless tooling around it. To me, its biggest weakness became its greatest strength.
People will tell you JavaScript is not a real programming language. I agree. JavaScript wasn't designed to do anything other than user interactions. At its core, there are many idiosyncracies and we've all seen the memes. Even JavaScript's single-threadedness was never an issue since it was designed for simple client-side interactions.
Furthermore, JavaScript's runtime environment is not made by the people that define the language. This makes it very different from the other languages on my list. They all have a website you can go to. For example, I go to python.org to get the Python interpreter; I go to rust-lang.org to get the Rust compiler. Where do I go to get the JavaScript interpreter?
In fact, as of this date, of all the languages on my list, JavaScript is the only one for which Wikipedia links to a specification; every other language has a link to its respective home website.
In this respect JavaScript is very special because everything about it is made by a third party. In that way, JavaScript is close to C since the standard compiler for it (GCC) was made by a third party as well. A lot of tooling had to be developed in order to make JavaScript a viable language that competes with other "real" programming languages. This is its biggest weakness but also its greatest strength since there is constant innovation. The most ground-breaking of them all is the V8 engine.
This is why I like learning JavaScript. If you're curious enough it introduces you to a lot of different concepts and, as an engineer, I'm constantly fascinated. For example, you get to learn about JIT compilers and how Google invented the V8 to improve the performance of applications like Google Maps and Gmail, how Ryan Dahl incorporated V8 into Node.js to make JavaScript run outside the browser, how Cloudflare is using V8 to simplify deployments in the cloud. Another cool technology is TypeScript. You get to learn about how compilers work.
Learning JavaScript not only gives you the ability to make interactive websites but it can lead you to learn several new technologies and concepts as an engineer. You get to witness the evolution of a programming language in real-time.
Learning JavaScript is exciting. There is never a dull moment.
Note: I know you can use WebAssembly to make interactive websites (eg., Figma) but I'd like to reserve WASM for use cases where performance is critical.
Python
Python is the language I choose to learn ML, Data Science, and Scientific Computing. Not much needs to be said here. Its clean syntax allows you to focus on a problem domain instead of the language and there are several libraries to write applications for these areas.
It's also the best language for me to learn Data Structures and Algorithms before I use them with other languages. As a first step to absorbing difficult concepts, Python is hard to beat. Becoming the most popular language for introductory computer science courses is evidence of this fact.
Rust
Rust is a great way to learn low-level programming. Initially, I wanted to learn C as a way to do this. However, looking at how flexible Rust is in its domain space, its excellent support for WebAssembly, and its approach to eliminating a whole class of memory bugs common in C programs, I decided to learn it instead. It is an option for me when performance is critical.
You can even use it to build cross-platform libraries for mobile apps.
Interestingly, Rust is becoming intricately linked with the JavaScript ecosystem and the web in general with its first-class support for WebAssembly. Projects like Deno and TurboPack both use Rust to improve the JavaScript DX. Then there is also Lunatic which is aiming to build a runtime like the Erlang VM for WebAssembly applications. It's a great project to learn about concurrency and WebAssembly.
Investing in learning Rust can yield great results if you want to understand how systems work.
Elixir
Speaking of Erlang, learning Elixir has introduced me to several new concepts around distributed computing. Here is where I first heard of terms like message passing, the Actor Model, and green threads; terms that I now see in many places: the Chrome browser, Go, Rust, Tokio, Ray for Python (which powers ChatGPT), and even Java with Akka and Project Loom. Therefore, learning Elixir (and about the Erlang VM) is a great investment to learn about distributed computing. Elixir is also a great candidate to build applications where concurrency and networking are critical such as real-time chat applications like WhatsApp and Discord. Plus, with the Phoenix MVC framework, you have all the tools you need to build a backend-heavy application for the modern web.
Elixir is also functional so it forces me to think differently about my programs.
Ruby
Finally, about Ruby. Why learn it when its popularity is on the wane?
Something about Ruby on Rails just clicked for me. I don't know why but it did. It made sense to me after working through Michael Hartl's tutorial. I still recommend this tutorial to anyone curious about Ruby, Rails, or MVC.
Ruby is a true object-oriented programming language. For all its drawbacks, I find OOP fun. I could have chosen Java to learn this since that is how I was first introduced to OOP. However, Ruby gives me the benefits of OOP while staying out of the way. My project is not drowned out by syntax. Furthermore, the Ruby ecosystem is where I hear a lot about interesting programming and architectural practices. For example, this is where I became aware of modular monoliths. For a long time, I thought monoliths and microservices were the only options with nothing in between.
I'm not saying Ruby is the only way I can learn these concepts (for example, I found a talk about modular monoliths in Java too). However, I have noticed that Ruby has exposed me to interesting concepts that have made me a better programmer in other languages as well. I think Ruby values simplicity and so it emphasizes certain patterns. Spending time in its ecosystem gives me ideas about how to structure large applications while trying to maintain simplicity. I get to learn a lot from people who are really good at it. Plus, Ruby is fun to code with.
Honorable mentions
Java
Java is a great language to make programs with and the JVM is an impressive piece of machinery. I've enjoyed programming with it before, mainly for Android and with Spring Boot, but I haven't had a need to use it much lately.
However, recently I've been very intrigued by Project Loom. I'm excited to see where Java is going and I look forward to try it out for some projects.
Kotlin
I want to learn Kotlin for Android development. I think it's also a good way to learn OOP without getting bogged down in syntax.
It's also useful for building cross-platform libraries for mobile apps.
Swift
For building native iOS apps.