My year 2019 in review
This has been a year of Clojure (and DevOps). Since the beginning of the year, I have worked to persuade my team to adopt Clojure instead of (or rather in addition to) to the current mixture of Java and Groovy, argued to rewrite a key batch job in Clojure (thank you, Monica, for providing the business case!), and did all I could to spread Clojure knowledge and skill in the team and surroundings. It has been a success - the job has been rewritten, we have already benefited from it, and we are finishing a new, Clojure-based micro-service. I have learned a lot about Java vs. Clojure, about the value of business-level tests and "living documentation", about leveraging Spec and property-based testing, about core.async (and error handling). On the DevOps front, I have grown to really dislike Terraform (wishing repeatedly to have a proper programming language instead of the frustrating Terraform DSL and the hacks it requires, not mentioning the nightmare of upgrading providers and Tf itself; 🤞for CDK/cdk-clj), have spent more time then I ever wanted with Kubernetes (and am working hard on simplifying our infrastructure and replacing K8s with AWS Fargate and thus spending less time on operations and more on development), and fell more and more in love with Clojure REPL, whether embdded in a Java app, in an actual Clojure code, or opening the door (securely!) to a "serverless" container on Fargate.
I have released my first Clojure library, clj-concordion, a Clojure-friendly wrapper for a great Behavior-Driven Development / Testing tool. I have started contributing to the great documentation hub cljdoc, implementing a better search and making it possible to download docs for org.clojure artifacts into Dash (soon!). I have also helped to make Cryogen, the Clojure static site generator, more extensible and customizable. Of my other contributions, I am most looking forward to the next version of Clojure where "ctor" in error messages will finally be replaced by "constructor" :-) and I hope my spec and test.check patches will get merged and out.
I have read 4 great Clojure/FP books this year. The last one is still under creation - Eric Normand’s Grokking Simplicity - Taming complex software with functional thinking manages to articulate the thinking, principles, and values underlying functional programming in an accessible and attractive form, and makes you experience them through well-chosen examples and exercises. It provided me with the vocabulary and distinctions to better articulate and justify my design and decisions. Another book that deconstructs the values and principles of design is Zach Tellman’s Elements of Clojure - “It provides a framework for making better design choices, and a vocabulary for teams to discuss the software they collaborate on.”.
Clojure Applied: From Practice to Practitioner by Ben Vandgrift, Alex Miller (2015) delivers on its name and really manages to guide you from knowing the language to applying it and structuring and building applications. Even in 2019 it is still highly relevant and quite unique in its focus. It tackles f.ex. topics such as namespace organization, creating and connecting components, composing applications, handling configuration. Finally, Programming Clojure 3rd edition by Alex Miller, Stuart Halloway, Aaron Bedra (2018) is a handy, comprehensive reference. I still have things to learn :-)
Me and my colleagues have spent a few well-invested hours going through Eric Normand’s video course Repl-Driven Development in Clojure, taking (hopefully) our productivity to the next level. I have also learned useful details about core.async from Tim Baldridge’s Core.Async tutorials, while preparing for my guide Error handling in Clojure Core.Async. I have also purchased Eric’s Intermediate and Advanced Property-Based Testing with test.check and am looking forward to deepening my knowledge of the topic.
During our regular work "tech talk lunches" we have seen a couple of great talks, the best ones include Exploring four hidden superpowers of Datomic (our summary, links) and Eric Normand’s Testing Stateful and Concurrent Systems Using test.check (talk + transcript).
Falling in love with Rust has motivated me even more to learn the language, fill the systems programming gap, and gain a new perspective on a number of things. (Why Rust and not Go? For the same reason why Clojure.)
(More interesting stuff can be found at My top dev links of lately feed.)
This has been a fruitful year. You can see the list of my blog posts by month in the archives but I would like to highlight a few.
The "Clojure vs. Java" series builds on my experiences with our enterprise application built with Java and Groovy and compares it to a hypothetic Clojure application:
I have enjoyed the ClojuTRE conference - good talks, nice city, great opportunity to meet folks such as Martin Klepsch (cljdoc), Michiel Borkent (clj-kondo, babashka & more), Ray McDermott (the Clojure podcast defn), Alex Miller in the real life.
I have also finally moved my blog from Gatsby to Cryogen (and from Markdown to AsciiDoctor), getting rid of some long-term frustrations and opening new opportunities.
There are many people who helped me in the past year and I want to thank at least some of them, in no particular order: Sean Corfield for next.jdbc and support on Slack, Michiel Borkent (@borkdude) for babashka and Carmen La for Cryogen - all three especially for active help and rapid issue resolution. Erik Assum (@slipset) for advice regarding Functional Core, Imperative Shell, Alf Kristian Støyle for starting the bi-monthly Oslo Clojure lunches, August Lilleås for his inspiring Datomic talk, Datomic posts, and our chat on the topic. To the Prague Lambda meetup and Tieto Ostrava for having me and listening to my talks about Clojure and BDD. The supportive and helpful folks at the Clojurians Slack and ClojureVerse.
Last but not least, my great and inspiring colleagues that do so much beyond their work tasks - my teammates Anders Widgren, Håkon Antonsen (both especially for embracing Clojure!), Anders Wighus, and Benedicte Selmer; my former teammates and fellow Clojurists , Christopher Nicolaysen, Eirik Stien, Jakob Lind, Madjid Hajian. Tom Erik Sundal-Ask for being such a supportive and open boss, Petter Hagman for having done so much for "dev happiness" in Telia.