So a bit about my background. I’ve been a software engineer for about 16 years. I started out in Perl, and then went to PHP, and then picked up Java in 2001’ish and have been doing that ever since. I’m not any kind of technology nazi. I learned Java for two reasons: #1 is was growing like crazy and there were jobs, jobs, jobs, #2 I had been bitten by dynamically typed languages and spaghetti soup and I wanted something safer.
Since then I’ve come to appreciate static typing, mostly because of the tooling it makes possible. Things like refactoring, instrumentation for profiling and root cause detection, auto completion, and all that good stuff are really hard to come by in dynamically typed languages. Hitting ctrl-space and getting every method every known to man, doesn’t really help me. I view the compiler as my friend not enemy, especially when it comes to long build cycles, complicated unit testing, and hard to reproduce integration issues, its just another tool in my toolbox.
I’ve dynamically generated Java, and compiled it from a webapp (don’t ask), I’ve instrumented it, I’ve used reflection to access private methods when I’ve needed to, I’ve generated byte code on the fly, I wrote a classloader than could load vendor provided classes over the wire so client code didn’t have to include them, I even once modified java.lang.String to solve a problem until I read that was a violation of the Sun license. Having taken Java as far as I think a person possibly can, it was time to branch out.
I tried out Ruby. There’s a lot of things I really like about Ruby. They are probably more related to Rails, then the language. I like how when they find a good way of doing something they make it the Ruby way (with the exception of package management, there seems to be a new way every time I turn around). They found a nice medium between strong typing and dynamic typing. But in the end, Ruby dependency nightmares, dynamic typing, weird threading model (maybe that is better now?), and the fact that it is interpreted, just don’t do it for me. I feel like I’ve been there already with Php and Perl. Yes, the language has some really nice constructs, and Rails is a really good framework. But I’m thinking 5 years out, and it just isn’t enough for me.
Groovy just makes no sense to me. Its like people took some of the best things about Java threw them out the window, because they wanted things to be less verbose. Great so you can not define types and pass hashmaps all over the place, and mysteriously pull things out of them using key names that I guess your mother in law has written down on some piece of paper tucked under her pillow. I just don’t really get it. A lot of the grails plugins are half ass maintained. I read somewhere that if the creator of Groovy knew about Scala he would have never have written it. Which I don’t really understand either because Groovy seems nothing like Scala, other than it runs on JVM and shares some syntax. Maybe he just realized he created a big steaming piece of poo and feels bad about it now. To me, it seems like Groovy has had its hey day, at this point if you like what Groovy is about, why wouldn’t you just pick up Ruby?
A co-worker dropped Scala on my lap, and it made me curious, I started reading more, and starting really liking a lot of what I discovered. It runs on the JVM, operationally, that is great. You can call Java apis from it, awesome, I can re-use what I know. Multi-threaded, performant, garbage collection, monitoring, root cause detection tools, thread dumps, heap dumps, and the operational good stuff that I’ve come to rely on, are right there for me. A lot less verbosity than Java, lambas, multiple inheritance, built in singletons, and lots of mysterious functional goodness intrigued me.
My exposure to functional languages has been quite minimal. In school we learned ML for like a few weeks. I think things like XSL and SQL are functional in nature, and I’ve got those under my belt. I’ve always had a code style of trying to break things into smaller pieces. My favorite feature of IntelliJ is the refactor->extract method option. Every time a method starts taking up a large part of my screen, I know its time to invoke that thing. So with the naive perspective, I started my journey.
I had no idea my whole world was going to be challenged. We will get to that in time…