Clojure at GO-JEK

By Rajnish Dashora

“You can reach a point with Lisp where, between the conceptual simplicity, the large libraries, and the customisation of macros, you are able to write only code that matters. And, once there, you are able to achieve a very high degree of focus, such as you would when you are playing Go, or playing a musical instrument, or meditating. And then, as with those activities, there can be a feeling of elation that accompanies that mental state of focus.” — Rich Hickey

GO-JEK is the largest startup in Indonesia, offers 15+ services centred around transport, logistics and payments and affects life in Indonesia on a daily basis.

At GO-JEK, Clojure helps our ~20M customers and ~250K drivers discover each other. Allocation, our internal nomenclature for the system that matches customers to drivers, has evolved into a set of Clojure microservices over a period of two years.

Such a high scale demands concurrency. Being a Lisp, Clojure gives you focus on the significant aspects of code. Speaking of advantages of Clojure, it is worth highlighting better language abstractions lead to a fewer accidental bugs and downtime. A functional programming language bundled with loads of benefits like laziness, immutability, code as data and the list goes on and on. More mature libraries and JVM based ecosystem makes Clojure a great language to play with. Better support for monitoring, debugging, profiling and generative testing catches many holes in implementation pre-emptively. With Clojure we have been able to achieve higher confidence while making changes, leading to faster release cycles.

Clojure has an enthusiastic, fast-growing community which makes it a great experience working with. We have observed a higher level of satisfaction amongst the developers using Clojure. Development is isolated from real world to send or consume traffic along with feature toggles to selectively stop real effects and run experiments with life.

We do face challenges with Clojure, such as longer warm up time, longer testing time, higher memory usages and sometimes a slower developer on-boarding time due to non-functional mind-sets. Though we are doing great with respect to what we have achieved with Clojure so far and looking forward to be able to keep it up and contribute back to the Clojure community which has been a great help through out the journey.