prose :: and :: conz

ÜberConf Day 2: Second expojure to Clojure

Day 2 for me at ÜberConf was the first day for many, as it marks the beginning of the meat of the conference. I didn’t love the first two sessions, but they lived up to my 3 of 5 stoke rating. While Kirk Knoernschild did a fine job presenting the modular architectures material, it wasn’t anything new to me. The refactorings he demonstrated to obtain a modular architecture to the code base just seemed obvious to me. I’m a fan of OSGi, although I don’t use it on any current projects. Hence I left that one quite underwhelmed.

For the second talk, I really took a liking to Nate Schutta. The topic of leading technical change described many behaviors I already exercise to stay abreast with the developments in our craft, such as reading blogs in down time, turning off the TV, etc. I thought the talk would be more about how to influence change in our organizations (although that piece was there a little bit). Despite all of that, I just thoroughly enjoyed Nate’s presentation style and the great points he made throughout. A great example of the sorts of things he said came out in an earlier talk I didn’t attend when he almost quoted Jason Tice from This Agile Life by stating “We’re not FTEs. We’re not ‘resources’. We are people. Treat people like people.” Needless to say, I shared that podcast episode with him.

(EDIT: In the original post, I completely forgot this talk)
The third talk I joined covered the Java type system. I don’t feel like getting much into it, but I came away realizing how much of a train wreck it is. Not trying to be arrogant here, but it really is a pain, especially with mutability ruining everything. Great talk, but the material was a little depressing if I think about having to go back to Java.

On to the second half of the day, the more compelling half of the day… As I’ve mentioned before on this blog, Clojure was the first functional language on the JVM I looked at. In that post I also expressed a renewed interest in Clojure, and now a little over a year later I finally took initiative and dove in. And when I say “dove in”, I mean I got violently barraged with Clojure. Neal Ford does not mess around when leading a Clojure workshop. He and Stuart Holloway made a conscious decision to make their intro to Clojure try to cover EVERYTHING and see what sticks with the audience. Firstly, I LOVED this approach. I always hated the snail pace of school… Like yeah, I got it the first time. Granted I didn’t understand half of what he showed, but the half I did understand is far greater than the quarter of the material I would have comprehended if given at a slower pace. So kudos for that.

I would have sunk in this workshop two years ago. I don’t know how any Java developers swam in those two sessions. If it wasn’t from the comfort level I’ve already built up for immutability, persistent data structures, code compactness, etc; there is no way I would have comprehended anything beyond "Hello, World!". I know, because I tried it before. I got to the REPL, entered (+ 1 2 3) enjoyed the echo of 6 and didn’t know what to do next. I think I’m actually ready to play in Clojure more now. I feel really torn tho because I am enjoying Scala so much at the current time, both at work and in free time.

So I thoroughly enjoyed this workshop, and I think I made a good decision forgoing my original plan to attend two JavaScript sessions. It also prepped me to be more comfortable with Matt Stine‘s use of Clojure in his Functional SOLID session. (EDIT: I’m a little ahead of myself here, as this talk occurred day 3) I’m starting to feel a LOT of pressure to spend more time in Clojure. I’ve noticed the Clojurians often point out the complexity of Scala’s syntax. Given how elegantly simple Clojure’s syntax is, I see where they’re coming from. Everything is just a list. '(1 2 3) is a list, (+ 1 2 3) is a list. A record is just a map, and it receives the benefits of all of the map functions. Scala on the other hand is frankly more like Java; there are these special things and those special things, etc. More so than ever before, I understand why Scala is often regarded as “just a better Java”. As I listen to some of these guys talk about the differences, there is a part of me that can’t stop thinking about some of the good points made.

And on that point, even if I were swept off my feet by Clojure, I still believe I made the best choice to set my team on our current course with Scala, Lift, Akka, etc. The tooling available for web application development is much more mature; Lift being the most outstanding web framework I’ve yet to experience. More importantly, I believe my team needs a gradual adoption of functional programming. There is no way I could have shut our shop down for a month while we learned a new language in hopes that we would catch up later. We needed to maintain productivity using our Neanderthal OOP skill set while we foster our still-budding functional programming skill set.

Yet a danger lies there. After the workshop, Neal and I had a great conversation about the merits of each Scala and Clojure. He described the situation as if we are standing in the OO/Java world looking at the distant functional programming world. Scala paves a wide parking lot across that chasm, allowing us to leisurely take our time reaching the functional programming world. Unfortunately, you can easily become complacent in the journey and set up camp somewhere short of functional programming. Clojure on the other hand is a narrow bridge straight to the FP world with no middle ground.

That last statement is arguably my greatest attraction to Clojure, with its elegant simplicity standing right behind it in second. Having been increasingly immersed in Scala over the past two years, I am now sold on functional programming. Now that it is clicking, I am done with the imperative paradigm. I crave referential transparency, which is arguably the greatest advantage of functional programming. I want immutability, and I want to tightly constrain side effects. I would love to spend more time in a more purely-functional language to see if I can finally defeat the last remaining footholds of imperative and object-oriented thinking.

I’m still a wee bit hung up on the dynamic typing. It won’t stop me from playing with Clojure, as I’d argue it is the most compelling functional programming language on the JVM (here, I don’t say Scala as it is a multi-paradigm language). I just think it is too valuable, throwing out the baby with the bathwater sort of thing. While I was talking to Neal, he said he felt that while static typing is valuable, it isn’t worth the cost. Matt shared a similar sentiment, lamenting that he quickly tired of fighting the compiler to run code that he knew would work. I’d like to see an example of this. In my experience, it didn’t compile because it was wrong. He even joked later on that in Haskell, if you can get it to compile then it works. Given how much Scala attempts to borrow from Haskell, this can hold true for it in many cases too. All of that aside, I see where static typing may not be appropriate for Clojure. It seems a bit dynamic in the way it likes to treat records as a map, and nearly everything else as a list.

So what’s next? I need to spend more time with the exercises Neal sent us home with. From there I need to find something to work on in order for me to stay motivated. As much as I love code, I only do well when there is a goal involved, particularly something to be built. I did receive a tweet inviting me to help with an OSS MongoDB driver wrapper. While that is moderately interesting, I’d love some other suggestions.

As if this wasn’t a long enough day, I wrapped it up by attending a make-up AngularJS workshop from Raju Gandhi. Even though we already use Angular at work, I was optimistic that I would learn some things that I’ve missed along the way. The main thing I came away with is a better understanding of how directives and such work. The best part of this one was meeting Raju and picking his brain on some of our developments with lift-ng.

I closed the day out by hanging out at the bar where I was fortunate to find many of the speakers and No Fluff Just Stuff organizers hanging out. I spent a lot of time talking to their lead developer (drawing a blank on his name at the moment). I’m certainly experiencing what others have told me about conferences: The sessions and keynotes are great, but the people you meet are the greatest part of the experience.

Leave a reply below, or send me a tweet.

Olde Comments
  1. […] last two days I hit some great sessions and some blah sessions. As I mentioned in my last post, my favorite part about this conference has been the people I’ve met and not the sessions as […]

Tagged with: functional-programming (31), polyglot (7), clojure (5), conferences (5), uberconf (4)