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).