Misconstrued Language Similarity Considered Harmful
Very frequently I come across posts of the form Language X for Language
Y programmers. It's not that there is anything wrong with them, but,
more often than not, the underlying tone of such posts is to highlight
some apparent (and often misconstrued) similarities between the two
languages.
Objects in Java and processes in Erlang have some
similarity in the sense that both of them abstract some state of your
application. But that's where the similarity ends - the rest is all
gaping differences. Objects in a class oriented OO language like Java
and processes in a concurrency oriented language like Erlang are miles
apart in philosophy, usage, implementation and granularity. Read Joe
Armstrong's Why OO sucks
for details. But for the purpose of this post, the following statement
from Joe suffices to nip in the bud any logic that claims objects in
Java are similar to processes in Erlang ..
"As Erlang became
popular we were often asked "Is Erlang OO" - well, of course the true
answer was "No of course not" - but we didn't to say this out loud - so
we invented a serious of ingenious ways of answering the question that
were designed to give the impression that Erlang was (sort of) OO (If
you waved your hands a lot) but not really (If you listened to what we
actually said, and read the small print carefully)."
Similarity breeds Contentment
It's
always comforting to have a base of similarity. It's human nature to
force find a similar base and transform one's thought process with
respect to it. With programming languages, it works only if the two
languages share the same philosophy and implement similar ideas. But
you can never learn a new language by pitching it against your own
favorite language and identifying apparent similarities. It is
these apparent similarities that tend to influence how you think of the
idioms of the new language and you will be misled into believing and
practising something that will lead you to the path of antipatterns.
Consider static typing and dynamic typing - a debate that has possibly
been beaten to death. But when you are making the change, learn to
think in the new paradigm. It's foolish to think in terms of concrete
types in a dynamically typed setting. Think in terms of the contracts
that the abstraction implemnents and organize your tests around them.
Ola Bini wrote a fantastic post on this in response to a twitter discussion that originated from me.
The
starting point should always be the philosophy and the philosophical
differences that the two languages imbibe. Haskell typeclasses may seem
similar in many respects to polymorphism in object-oriented languages.
In fact it is more similar to parametric polymorphism, while the most
dominant form of polymorphism in OO is subtype polymorphism. And
Haskell being a functional language does not support subtyping.
This post
relates pattern matching in Erlang and conditionals in Java in the same
vein. It's true both of them offer some form of dispatch in program
control. But the more significant and idiomatic difference that matters
in this context is between the conditional statements in Java and expressions
in the functional setting of Erlang. It's this expression based
programming that influences the way you structure your code in Erlang.
Instead of highlighting upfront the similarity of both constructs as
means of flow control, emphasize on the difference in thought process
that gives your program a different geometry. And finally, the most
important use of pattern matching is in programming with algebraic data
types, a whole new idiom that gets unveiled.
Ok, if you want
to write a post on language X for prospective programmers of language
Y, go ahead and highlight the differences in philosophy and idioms. And
then try to implement your favorite feature from language Y in X.
Misconstrued similarities often bias programmers new to language X the
wrong way.
From http://debasishg.blogspot.com
Debasish specializes in leading delivery of enterprise scale solutions for various clients ranging from small ones to Fortune 500 companies. He is the technology evangelist of Anshin Software (http://www.anshinsoft.com) and takes pride in institutionalizing best practices in software design and programming. He loves to program in Java, Ruby, Erlang and Scala and has been trying desperately to get out of the unmanaged world of C++. Debasish is a DZone MVB and is not an employee of DZone and has posted 13 posts at DZone.
- Login or register to post comments
- 1478 reads
- Printer-friendly version
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)










Comments
Rigel Kentaurus replied on Mon, 2009/09/14 - 9:35am
I was in a conference last week, and we were reviewing the latest features of the .NET platform, I know this is the java lobby but the example is really useful for this article. While reviewing LINQ and the closures of the .NET new version, someone raised his hand and asked what was all that functional language thing about (there's always one of those).
Sad to me, the instructor told him that it was only syntactic suger, another way of passing a method as a parameter, sort of a pointer. I definetely freaked up ... and didn't say a thing, but had to bite my upper lip otherwise I risk telling the instructor that's the dumbest thing I have heard in all month long.
And that's... what you get when you give functional-like options to OO-procedure people. It's bad enough people don't know any functional language but they are not willing to understand the basic philosophy around. It might have not won the language wars as we are using Java, OO PHP, OO Python, C# and such instead of Lisp and Scheme, but it is not syntactic sugar.