I often see many fellow software engineers learning new programming
languages every now and then, in the hope that they are increasing
their "marketability". They seem to think that the more programming
languages they know, the better. C, C++, Java, Javascript, Python,
Perl, Ruby, Groovy, Scala, C#... the list goes on and on. These chaps
are the first to get swayed by PR of companies marketing these
languages (Microsoft for C# and .NET being a prime example). Hell, I
talk as if I have been a saint, no, even I used to be in this - "Run to
learn the latest language" club.
But over time, I have figured
out that learning a language is never accomplished without using it in
and out, in all sorts of ways, in all complexities, in various
projects. What's the average length of a code example in a book?
Roughly 100 lines. And what's the average size of code bases? 1000s and
1000s of lines. Unless you use the language to create something, you
are not using the language at all. After all, a programming language is
just a means to an end. It's a tool in your hand to create an
application, a service, something concrete and tangible.
Having
come over to the Java world 2.5 years back, I have this habit of
looking back on the code that I had doled out when I was new, and
compare it with the code that I churn today. I find such a huge
difference. The code that I produced 2.5 years back, is down right
laughable in some places. Being at Sun, I was able to work with some
very very smart people and hone my skills as a programmer (there is still a huge scope for improvement, as my recent experiences in the NetBeans land have told me). The code
reviews have taught me a lot and continue to. I have been fortunate
enough to work with some real wizards of design and Java platform and I
am always in awe of such people and their ability to assimilate
complexity and I try always to study their approach to problem solving.
It gives you lots of pearls of wisdom and improves you as a programmer.
Even after this, when I feel that I write much better code than I used
to, there is still a long long way to go for me in the world of Java. I
still don't know the little things which one gets to know when he is
aware of the Java Language Specification. I still haven't really
decompiled a Java class, and tried to understand the byte code. I still
am baffled by the whole area of memory management. I haven't ever done
a performance analysis or improved performance of code written by a
different programmer. Never used NIO, still need to go slow when
dealing with multi threading.... the list goes on and on. As Bharath
Ravikumar (my former colleague at N1 SPS development team) rightly
pointed out when I discussed this with him, it's a matter of spending
time gathering these experiences. I should try and work on all sorts
of things in Java, and when your day job cannot satisfy such a quest,
it's best to turn to open source to satisfy your creative hunger.
You can make out the difference between someone who has just learnt the language and someone who has made better use of the time to
work on projects in that language.
Now some readers may say that knowing just Java is not good enough, some languages are much better suited for certain applications. I totally agree. But, knowing a low level language (C), a middle level language (Java) and a dynamic language thoroughly, should be good enough for most, if not all, applications.