Misconstrued Language Similarity Considered Harmful
Join the DZone community and get the full member experience.
Join For FreeVery 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.
Opinions expressed by DZone contributors are their own.
Comments