Great topic and thanks for sharing your blog Sean! I've recently dipped my toes into the world of Clojure, started a development blog (
http://blog.milehighcode.com) and have had my excitement and interest in programming reawakened through Clojure.
Let me rewind to how I got started programming. I was a curious kid, a tinkerer, who liked to take things apart and see how they work. I grew up in an 8-bit world in the 80's and began dabbling in BASIC at the end of that decade on an Apple IIgs. My youthful forays into the world of code were not disciplined and jumping ahead I was also unfocused in college, so I ended up with a liberal arts degree although I still carried the dream of becoming a developer. In 1998 I began a career as a system administrator, learning all that I could about Windows, Linux, and Solaris systems. The rise of Linux in the workplace kept things interesting, but there was something fundamentally lacking in what I was doing. There just weren’t enough outlets for my creativity and although I got into scripting and taught myself Perl, AppleScript, and some VBScript, it was primarily to automate repetitive systems management tasks and I craved to learn more about the fundamentals of development. Oh, how I wished I would have applied myself more in college and achieved that CS degree, I would lament. I just wasn't able to discipline myself to balance my career and personal life, while also delving deeper trying to become a "real programmer".
The end of 2007 changed all this, when I was offered a real life development position. I was a "web engineer" contractor for a fortune 500 company at the time and asked if I would consider a position as a developer, supporting some of the applications I had worked on. I didn’t consider myself a developer, more a scripter if that even, CVS confused me, Perl references were a mystery to me, but my quick ability to pick things up and learn on my own showed through as well as what I brought to the table with my nine years of systems experience. The fact that I truly cared about the applications I was working on as a web engineer also helped. So I was hired on as developer support for a couple of legacy apps in Perl and Java. This was a great position to be in, since it meant there wasn't a lot of coding required of me to start with, and I was on a team that was growing where there would be limitless opportunities to further my coding skills. Career-wise this was the most exciting turn of events I could have dreamed for and I took full advantage and jumped with two feet in.
The first few months had a steep learning curve, it is hard to explain to someone who understands version control management, branching, and merging how confusing this all was to me. I was in a new world. No longer was I overrun by mission critical system failures and help tickets, now I was in the land of research and development. Well, I added the research part, but having a little room to breathe gave me enough time to research and learn as well as be a productive employee. I also made the switch from Vim to Eclipse and I remember when I first looked at this new fangled graphical editor, I thought, "Wow, that’s a lot of buttons and stuff!".
I began to really dig into Perl that first year in 2008 and read the Learning Perl, Intermediate Perl and Programming Perl series from O'Reilly. It was so much fun, but then suddenly I hit this wall when I picked up Damien Conway's, Object Oriented Perl. The first few chapters weren't bad, in fact I loved the complexity of the subject, but then somewhere along the first quarter of the book, I became lost and my procedural brain, just wasn't able to wrap itself around OO programming, especially not in Perl.
At about that same time I was becoming lost with Perl OO, I was put on a product development team charged to develop a multi-threaded Java application, which took data feeds and loaded them into databases. Talk about steep learning curve! It took me the better part of a year to feel comfortable with Java and the concepts of OO programming, at least to the point where I could intelligently look at code and see what was going on. Going through all of these learning curves, I've begun to develop a thick skin to things that are completely foreign and being in a state of non-comprehension. I know that if I stick with them long enough, the new concepts do eventually get soaked up by my synapses, like what happened with version control and Perl references, which were by now my good friends.
The O'Reilly Head First Java series really helped me along the Java learning curve, as well as Mehran Samahi's Programming Methodology lectures from Stanford (
http://see.stanford.edu/see/courseinfo.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111). Yet it was still slow going and particularly difficult trying to ramp up on a team that was developing a complicated multi-threaded piece of software, which made heavy use of databases, stored procedures, persistence, XML, on and on the libraries went.
I began to latch onto this idea that I needed to learn more about OO design
patterns, to help me understand what people where talking about in these architecture and design meetings. So again I became lost as I tried to understand design patterns and had not yet fully grasped OO design in its own right. I was reading the Head First Design Patterns book, and not yet having a strong understanding of OO principles I gave it up. It was mind blowing and enlightening, I was even able to apply what I learned to parts of my code and better understand things my peers were implementing, but somehow I also felt horribly lost and more confused than ever before. I had to take a step back from how I was trying to learn design patterns and realized I wanted to learn patterns by discovering them, not through rote memorization and that would give me this deeper understanding, which I so desperately sought.
That's when I came across the Structure and Interpretation of Computer Programs lectures and began reading about how people raved about this course, if you could stomach the math involved and difficulty of the topic as well as learning a new language, which you likely wouldn’t use in the real world. I started the Abelson and Sussman lectures and also discovered Brian Harvey’s CS61A lectures from Berkeley, which seemed a little more accessible to my already muddled brain, but it didn’t last. Shortly after I hit the A&S lecture on the wonderful lambda, and not having much incentive to use scheme in my day to day work, I lost my drive and gave up.
I took me the better part of a year before I came back to SICP. I was prepared to discipline myself and get through these SICP lectures and the exercises over the course of a year. And that is what brought me to Clojure recently. I really liked Scheme, but I wasn't sure which version to use, there were so many variants. A member of my team had been coding his unit tests in Scala earlier this year, so I began to see what other languages people were using to do the SICP exercises and if Scala would work. Maybe I could find something more modern that would still allow me to gain the knowledge of the wizard book and be practical. Enter Clojure! The more I read about Clojure the more excited I became. Wow, a Lisp dialect that runs on the JVM like Scala, has a great community following and the eclipse plug-in was more mature than what I had seen in earlier tests I’d done with Scala. Why hadn't I known about this language before?! I began to read more about Clojure and I really liked the elliptical syntax, it made sense to me, unlike Scala, which reminded me of when I first saw came across Perl. Clojure had a little syntactic sugar here and there, but fundamentally it was a Lisp and I found out I could "dumb it down" to its roots and use it as a tool to go through the SICP lectures. Plus other people were doing the same thing!
So that is where I'm at with Clojure for the moment. I'm reading Stuart Halloway's, “Programming Clojure”, after having starting Fogus and Houser's, “Joy of Clojure”, and learning it was a little beyond my current grasp of functional programming. I've also recently begun a blog (
http://blog.milehighcode.com) to chronicle my brain on development, which was born from my excitement on discovering Clojure. I’ve written a few introductory articles on my experiences using Clojure with Brian Harvey's CS61A SICP class along with other miscellaneous development topics.
I'm not itching to use Clojure in the real world yet, so it is academic for me at the moment, but I am excited that it will become something I will use in the real world. I wouldn't be able to say that if I were learning Scheme. I'm a slow learner and I'm in this for the long haul, but I've already seen benefits learning functional programming in my Java and OO practices. Concepts that were difficult before are becoming easier to digest. (Perhaps anything is once you go down the functional path.)
I'm excited to learn more about programming and OO from the bottom up using a functional language and Clojure is a fine supplement to my current Java work. The Clojure community also is active and exciting, because there are so many people, who are well...excited! Just last night I discovered Anthony Grimes blog (
http://blog.raynes.me/) and can't wait for his Meet Clojure book to come out from No Starch Press. He is a great writer and an inspiration. The Meet Clojure book will be available online for free once it is released and is stated to be similar to the popular, “Learn you a Haskell”, book. It’s a big new polyglot world out there and I’m taking it all in, one step at a time.
-Joshua