Erlang will replace Java in the next 2 years as the standard for Enterprise Applications
voodootikigod.wordpress.com
voodootikigod.wordpress.com
On a more serious note yes, but again that's a cultural thing. Languages like Erlang (and OCaml, and Haskell, and...), you spend more time thinking than typing. You don't (need to) write much code, and if you think of a better way you might completely overwrite yesterday's work. You might deliver a huge chunk of functionality in a couple of pages of code that took weeks of thought, but that looks like it was typed in a day (I have been in that situation). Functional languages don't fit big-company management comfortably. They don't look like "work" in the sense that most IT organizations are used to. Java will be with us for a long time.
Remember - the author is the smartest person who will ever see a given piece of code. The reader, even if it's the same person, will be dumber.
Programming isn't literature or poetry. No one ever had to add a mail reader to"Ode to a Grecian Urn".
Erlang really is easier than Java -- both to read and to write. I think people too often confuse "different" with "difficult".
For example, something like
let days_in_month m = match m with
| Jan | Mar | May | Jul | Aug | Oct | Dec -> 31
| Apr | Jun | Sept | Nov -> 30
| Feb -> if leap_year () then 29 else 28
It takes a small amount of context (all "| Val" sections without a -> ... side match together), but it's a pretty direct correspondence. public int days_in_month(month) {
switch(month) {
case JAN:
case MAR:
case MAY:
case JUL:
case AUG:
case OCT:
case DEC:
return 31
case APR:
case JUN:
case SEPT:
case NOV:
return 30;
case FEB:
if(leap_year()) return 29; else return 28;
}
}
Pattern-matching really shines when you need to destructure the argument, then do something similar to the result regardless of which case resulted in the destructuring. For example, compare red-black trees written in Java:http://www.docjar.com/html/api/java/util/TreeMap.java.html
vs. those written in Haskell:
http://www.cse.unsw.edu.au/~dons/data/RedBlackTree.html
The rebalancing code in Java is 80 lines long. The rebalancing code in Haskell is 6.
Maybe something like this (in pseudo-ML):
(* Look up order code for a Sci-Fi GadgetTM, units are in cm *)
let gadget_order_code width depth height color has_laser =
match (width depth height color has_laser) =
(* The original, simple code *)
| 5, 2, 1, Red, true -> "ZAP-X"
(* Most common width, color *)
| 4, d, h, Blue, true -> sprintf "ZAP-4-%d%d+" (str d) (str h) "+"
(* C for Custom Color *)
| 4, d, h, c, false -> "ZAP-4C-%d%d-%c" (str d) (str h) (color_code c)
(* Orange lasers are discontinued *)
| w, d, h, c, true when (w + d + h) < 15 and c != Orange ->
"ZAP-S-%d%d%d-%c" (str w) (str d) (str h) (color_code c)
| _, _, _, _, _ -> failwith "Unavailable"
That's a little complicated to determine with pattern matching or via a database, but doing it in a series of nested if statements would get mind boggling.Part of writing good code, whether two pages of brilliance or twenty of gradual brilliance, is conveying intent in the human-readable parts. The parser doesn't care if all the functions have names like doTheNextThing() or french_onion_soup, but it would be a slap in the face to any future maintainers.
Choosing informative names and separating a program along clear conceptual boundaries can be a greater aid to understanding than any syntactic redundancies. Well-placed comments help smooth things over, particularly notes on why a particular approach was chosen. The names themselves should be able to convey what is going on in most cases.
(For distilled wisdom along those lines, see _Thinking Forth_ by Leo Brodie, also online at http://thinking-forth.sourceforge.net/.)
It's not unusual now for some of my source files to be more comments than code, the comments explain my intent and the assumptions I have made.
I'm gonna call a function french_onion_soup tomorrow just for larks :-)
The biggest thing I learned from Forth is that if I'm about to add a comment inside a function because something needs clarification, I should probably try breaking it out and thinking up a descriptive name instead.
Also, while it may technically be a "functional" language by virtue of disallowing destructive update of values, it really reads more like a scripting language. Variables are dynamically typed, and the functions only have an arity, not a signature.
Programmers used to the expressive type systems and polymorphism of more "academic" functional languages like ML or Haskell, on the other hand, would probably chafe at Erlang's lack of support for any abstractions other than forking and message-passing.
Real rocket scientists, on the other hand, would probably like Erlang, since the semantics of the language are simple, and its fault-tolerance and concurrency features could be well-suited for high-availability systems like mission data collection. (Its lack of hard real-time features make it a non-starter for actual avionics.)
foo :: Foo -> (Bar -> Baz) -> Quux
hello :: IO
this :: Is -> Starting -> To Get -> Boring
Arguably the restrictions they are bound to are much stricter than with Java.But anyway, I don't think most Java programmers really "get" OO. So OO is not the reason they use Java -- there is something else. Probably a lot of marketing from Sun; constantly hearing about "certification" and whatnot makes the managers happy.
There has been way too much invested in both Java and conventional OOP for them to be displaced that fast. 2 years may be a long time in startup world, but in the enterprise world it's nothing.
Ruby has been growing rapidly for the last 3 years, and it's still nowhere as popular as Java. And Ruby's marketing has been way better than Erlang's.
It's actually not a long time in the startup world, either. The average life cycle in the valley for VC-backed startups from founding to exit is 7 years. There are always exceptions, of course. But two years isn't enough time, in general, for anything interesting to shake out--either in languages or in startup companies.
Not to mention the fact that there's only one language at this point that is inevitably going to grow really rapidly in popularity (JavaScript). (Others will grow, but none so fast as JavaScript.)
In my experience, it takes at least a couple of years to introduce a new technology to a large corporate (i.e. the ones that actually run enterprise apps).
Many large corporates will have multi-year enterprise licenses for things like IBM WebSphere. It might be years before they even consider a technology shift, let alone that shift becoming dominant.
The reasons are many and varied - resistance to change, need to prove the technology, integrating the technology with existing systems, changes required to methodology and process, instrumenting the new technology, vendor support, cost, skills availability, access to quality training, access to recognised certifications, tooling (dev/test/deploy), infrastructure, regulatory compliance... The list goes on and on.
Even when you take all of these... Nobody ever actually decommissions anything.
Cultural and methodology changes are massive in the enterprise space.
Certainly demand for Erlang programmers will increase over time...
Where are the plethora of libraries for Erlang that Java enjoy?
Java is great because you can stand of shoulders of people releasing brilliant libraries.
Who cares about Availability, Performance, Scalability ... if you can't ship?
That being said, there are some amazing libraries out there.
Google Guice, Google Collections Framework, struts2, BDB JE to name a few. They help me ship.
Lots of great software if you poke around.
This next part will probably some change over time. Erlang is slower than Java - even with the HiPE JIT compiler. Erlang's performance is more akin to Python. Plus, as much as I protest, "enterprisey" people seem to have a love affair with static typing. They also have a love affair for nicely UML-diagrammed objects and Erlang is functional.
But the most important reason why this won't happen is that the majority of "enterprisey" systems I know of are a ton less reliable than consumer systems. "Enterprisey" has become the term I associate with needing to have a programmer on call for. This might sound stupid, but so many programmers I know worry about job security - mostly because they won't upgrade their skill set. Something that obsoletes the need for them to babysit applications eats at that security.
Erlang will get (more) popular. Lots love the functional paradigm. It's really well implemented, reliable, etc. It just won't displace Java quickly, if ever.
He also argues that Erlang has "already penetrated the enterprise." Might seem that way if you work at Ericsson, but otherwise I can't imagine making this statement.
Not saying it couldn't happen, but the odds are highly against it.
Not sure how limited the concurrency model of Scala is by the underlying architecture though.