Sunday, September 03, 2006

[Misc] Does it matter to know more than one language?

This weekend I've read two interesting articles. The first one from Joel Spolsky with the title “Language Wars” discuss the usefulness of the ever raging discussions between software developers about the “right” programming language. Besides that he admits that this kind of discussion is definitely fun, but if you want to develop a production quality system the decision depends on the maturity of the language (and tools) and the skills of your team.

The second article is from Luke Plant titled “Why learning Haskell/Python makes you a worse programmer”. He describes his experience of using concepts of not so common languages at daily work. His conclusion is, that, not surprisingly, it comes to very bad results if you use as example sophisticated functional language idioms inside code which does not support the underlying concepts.

In the real world, knowing a lot of languages gives you definite advantage. But, and this is my question, is this so clear for programming languages?

Learning a language needs a lot of time and most of all, it needs practice. Most professional software developers only use one (or at most two) languages for their daily work and they speak them fluently (that's why they are called “profession” ;-). In our days, this are Java and sometimes C#, a decade ago this was mostly C/C++. The tides change so it is out of discussion that a developer learns more than one language in his life (at least I know one who knows someone who knows Fortran). Today, there are a lot new languages on the surface, some really new, such as Ruby, some rediscovered, such as Erlang or some which were around us but nobody noticed them (Python). There are also a lot of mere academic languages, such as the upcoming Fortress and Scala. And there are all the rumours about Domain Specific Languages.

New languages may have features you want to use, which are so sophisticated and elegant that you never want to see braces, but makes it sense for your daily work, and the quality of it, to learn one of them? There a to different views to this: for geeks and developers, it makes absolute sense to to this, learn new concepts, write little and shiny programs and have some fun to explain your knowledge to the “unliterated”. But for your project and your company, it can make no sense at all, it can, as Luke Plant describes it, be a waste of time. As example, Java and C# have are easy to learn languages but to use them in a productive and professional way needs a lot of time, besides nobody will ever know all features of their frameworks. So for your daily work, it may be the best to practice what you already know, develop useful idioms and patterns and read about knew concepts in your language, such as Generics or LINQ, and learn to use them to build readable, testable and stable code. It may be possible that you are someone who is skilled enough to speak more languages fluently and you can practice, but most of us developers are not (mostly because of practice).

For me personal, it makes sense to learn other languages because they can teach you new ideas and concepts and it is at least possible to practice if your take part in some open source projects or build small tools for your personal use. On the other hand, at work you need every bit of knowledge you have to develop a good piece of software, so every experiment can be harmful.

 

3 comments:

Alexander Schatten said...

I think this is a very interesting question: I would like to mention two things:

First of all, we should distinguish between platforms and languages: This is again a probably nice topic for our BLOG: e.g. Sun "bought" a Ruby developer and wants to support Ruby (among others) to work within the Java VM.

I think this is an important thing (allthough nothing really new, see for exampe Jython or Groovy). However, it shows, that different problems might legitimate different languages.

The second point I want to emphasize are domain specific languages.

I personally believe, that this will become one of the next "big things": languages like Java are "general purpose" languages, but this also imposes too many options for a domain programmer. If a specialist develops a DSL for a specific domain, say, for developing persistence mechanisms for web-applications; the web-developer could use these high-level languages to solve the specific domain problem (persistence in that case) without the need to be aware of the specific libraries (e.g., Castor, Hibernate, Cayenne, ...).

Alexander Schatten said...

Additional comment to Joels article:

I more or less agree with most of his statements. However, I think he misses one very important point: the selection between e.g., Java and .net or Python is not only a matter of developer knowledge.

There are serious policies you have to be aware of. As soon as you enter .net you are "caught" in the Microsoft world. With all advantages but also serious disadvantages. You have to be aware of that.

Thinking of the other choices (particularly Java), you have a broad variety of available rather independent options (JVMs, frameworks, support companies...).
And most of the importnat tools and frameworks come with Open Source license.

So the basis for the choice is knowledge, available platforms and (very important from my point of view) the question if you want to be bound with your business or projects to the decisions of one company...

Alexander Schatten said...

I completly agree with Rupert. However, I think that there is a new movement on the way with systems like Open Architectureware:

Developers can here create DSLs "on the fly" as needed for a specific domain problem. This can help in partitioning problems to people with specific skills.

E.g.: The guy who has good platform knowledge can define the DSL and the required transformers, whereas the people who have good domain knowledge can use the DSL and need not worry too much about (platform) implementation details.