It looks like I might have a busy summer. A recent article on InformIT.com discusses what languages are worth knowing – if you are out to know languages. The premise being that you will become a better programmer, and learning new languages will become easier, as well as it provides you better framework for understanding how systems are built and why they work they way they do.
I’ve often explained in classes (remember that most of my students are IST students and not necessarily heading towards software engineering) that learning how to program is imperative to their ultimate success. It’s hard to imagine that any position they take wouldn’t require some level of programming – even if it is in the form of configuring – since computer science, and programming in particular, has been the foundation on which systems have been designed.
While languages don’t explicitly give rise to the machines, nor do machines explicitly give rise to languages, there is a natural cycle to their relationship: A language enables a machine to do specific types of tasks. We observe that the machine could do the tasks better (e.g., multitask) but there is a shortcoming in the language. Languages are created -or evolve – to solve the shortcomings and, in turn, machines are designed to better accommodate the new features of the language.
A simple example of this would be multiprocessor systems (we naively lump the newer multi-core processors here as well). Current production languages don’t effectively model the power of these systems. Even if a language supports threading, how concurrency is achieved depends on how the language is transformed for execution on the local processor and further how the local environment handles the delegation of the threads to the processors (affinity, etc.). In the end it may be that true concurrency is not achieved since processes may end up being the defining level for processor affinity. The point is the decisions for true concurrency are made outside the programming language. The article mentions Erlang as perhaps spearheading the movement but it’s not a production language yet.
But I digress.
So, why is learning new languages is beneficial? It provides new ways of envisioning and formulating solutions to problems. It’s also not enough to learn languages in the same family, you need to look for languages with varied syntax and support for different paradigms (i.e., function-oriented, object-oriented, component-oriented, logic, functional, declarative, etc.). It is also worth looking at techniques that are layered on top of these languages; for example, visual approaches such as Model Drive Development.
I recently was discussing the benefit of learning new languages, such as Spanish or German, with a colleague. He said in his reflection on the point of such an endeavor, aside from cultural appreciation and acquisition of a tangible skill, he deduced that learning a new language requires you to really think about what you are going to say. In your native tongue you can approximate your point and say things like, “You know what I mean.” Not having a command of a language means you can’t confidently assume another “knows what you mean”. The literal translation of a phrase in one language to another may not have any meaning.
Such awareness of expression only serves to further your ability to clearly describe complex topics to those with less experience. Being able to communicate anything in a clear, concise and coherent manner is a skill cannot be emphasized enough and is key to success.
As the article asserts, it’s not so much fluency with the language that counts but a reasonable understanding of its grammar and philosophy. A deeper understanding is a definable, marketable skill but if sharper problem-solving skills is what you are after, learning a new language is one of the best exercises available.
How do I rank with respect to the list? Unfortunately, low. I know of the languages but only have any real experience with one. It looks like I might have a busy summer.