The value in learning yet another programming language
Like many developers I constantly find myself taking up new programming languages. The learning process is often refreshing and challenging as a result of novelty and it has many times served as a relaxing break from work and studies. At the same time I’ve always associated this curiosity with shame. Instead of diving deeper into what I already know something new grabs my attention and drives me further from a pipe dream of deep knowledge. Lately my feelings have shifted and the shame that I once felt has turned into a feeling that learning new programming languages actually carries a lot of value.
When I started my studies I found a lot of peers were quite shocked with how the courses constantly jumped between languages. Our programming 101 course was taught in Scala and then we immediately jumped to Java for the second course causing a bit of panic among the beginners. For people like myself with some prior experience it actually felt natural, our professors simply chose the language they deemed most appropriate for the subject. In the end, programming languages are merely tools independent of the real engineering we are being taught. Whilst I still believe in this separation, observing my beginner friends has made me reconsider my view on programming languages.
Every language was conceived for a reason, oftentimes introducing a fresh approach to a common problem. Matsumoto created Ruby because he was missing an easy-to-use, object-oriented language; Erlang was conceived to simplify the development of highly available and concurrent applications; Rust wants to bring safety and guarantees to systems programming and so forth. The most interesting aspect is how the languages are designed to solve their intended problems. Why do developers find Ruby easy to use? How does Erlang achieve such high availability and effortless concurrency? What properties does Rust have which lets it guarantee safety? When learning for example Erlang we are not just picking up a tool for building concurrent applications; we are learning about the actor model, message passing, and green threads. These underlying approaches are the truly valuable parts of the language, knowledge which usefulness extends far beyond Erlang itself.
To summarize, there is a great deal of thought and domain knowledge behind every programming language. Most languages were designed to address a need and every one brings novel approaches and solutions to problems their designers faced. When learning a new language we are taking part of this expertise behind every single design decision. By focusing on the motivation and story behind design patterns, learning a new language can become one of the most enjoyable and efficient ways of improving as an engineer.