Loading the good stuff
ChatGPTChatGPT
Gradient background

My wonderland from .NET to Clojure

Clarice Bouwer

Software Engineering Team Lead and Director of Cloudsure

Saturday, 23 November 2024 · Estimated 6 minute read

TL;DR

I started as a .NET developer, comfortable in my familiar bubble. But when my friend Len introduced me to Clojure, I decided to take a leap into an unfamiliar world—right around the time I was passed over for a promotion. It was challenging, humbling, and thrilling. I went from managing infrastructure at CloudAfrica to working in insuretech with Simply Financial Services, eventually moving to Mauritius.

Learning Clojure felt like transitioning from technical manuals to crafting poetry. It hasn’t been easy, but embracing its simplicity and the supportive community has been deeply rewarding. My advice? Don’t fear feeling like a beginner again—embrace the journey, celebrate your wins, and keep learning. The rewards are worth it.


I started my journey as a Microsoft .NET developer, deeply immersed in web technologies. I loved the curly braces, semi-colons, Intellisense, the Visual Studio IDE, the .NET framework, ReSharper, SQL Server—you name it. I was comfortable in my cozy bubble. Life was good, and I never imagined leaving the comfort of what I knew. There was really no reason for me to leave.

Then my awesome friend Len Weincier, now an Engineering Manager at Google in Ireland, introduced me to Clojure. At the time, I was a senior developer at MultiChoice, and Clojure wasn’t exactly a household name in South Africa. Would this be career suicide? The leap from .NET to an obscure Lisp seemed terrifying.

It was around the same time I was passed over for a promotion so I decided to entertain the idea. Len and I met at a trampoline park, and while his daughter bounced around, he taught me the basics of Clojure—right there on a napkin. Yes, Clojure is that simple to grasp! With a small core language, just a handful of constructs, and a powerful, simple standard library, Clojure lets you focus on solving problems instead of wrestling with language complexity. By contrast, .NET has a feature-rich ecosystem, high-level abstractions, and often requires more code to accomplish even basic tasks. There’s nothing inherently wrong with that, of course—it’s just not quite as napkin-friendly.

That informal learning session did something to me. It piqued my curiosity. Maybe a change was, in fact, as good as a holiday. So I took the leap—as intimidating as it was.

The Ramp Up

I’ll always have a soft spot for C# and .NET, but switching to Clojure turned out to be the best career move I’ve ever made. The start was rocky—I went from being an experienced developer to feeling like a complete novice. One of my early challenges was understanding how to navigate Linux. I was used to the comfort of Visual Studio, and suddenly I had to work with the command line and IntelliJ, which felt completely alien at first. I felt like I had lost all my skills. I struggled to build a simple webpage albeit I was trying out ClojureScript. Most days, I felt like I was climbing Everest with no guide. I had to let go of everything Microsoft: the comfort of Visual Studio, the familiarity of C#. Suddenly, I was facing GitLab, Linux, the terminal, cloud services, CISCO, the JVM, Datomic, Clojure(Script) and so forth.

It was humbling, and it was thrilling. Every day, I learned something new. The climb was steep, but the view was spectacular.

From VMs to Insurance

At CloudAfrica, I started by getting my hands dirty at a low level: programmatic server backups, firewall rules, networking configurations, breaking and restoring NATs on CISCO, migrating VMs, and creating data visibility with Prometheus and Grafana. While it was stimulating, the constant pressure started to wear me down. You know that icy feeling in the pit of your stomach when something goes wrong? It’s way worse when you’re tinkering with clients’ virtual machines.

When Pieter Koornhof mentioned that Simply Financial Services was looking for Clojure developers, I figured—why not give insuretech a shot? After spending time managing infrastructure and dealing with low-level configurations, I found the idea of building products and working in a more customer-focused industry appealing. It wasn’t like I woke up dreaming about working in insurance, but I felt that I needed to go back to web-heavy products. I ended up working with some big names in the industry, and just three months later, I was asked if I’d like to move to Mauritius to help with Cloudsure. Erm, obvs!

Starting Over—Again

Joining a new company meant a fresh start, complete with a whole new set of challenges—learning the life insurance domain, getting used to new tools like Mac, Emacs, GCP, and diving deeper into distributed architecture.

Five years later, the fascination still hasn’t faded. Reflecting on the journey, I realize that embracing change and the unknown has kept me engaged and continuously learning. One of the biggest draws of Clojure has been its emphasis on simplicity—taking the complex and making it beautifully functional. Whether I’m dealing with a new product launch, a data migration, or optimizing a distributed system, Clojure helps keep me engaged and curious.

Learning and Adapting

Recently, we launched new products after migrating underwriters for Simply Financial Services. Navigating that codebase was a bit like tumbling down the rabbit hole in Alice in Wonderland—some parts were mind-bogglingly frustrating, while others were sheer brilliance. It was also phenomenal to see junior developers quickly adapt and thrive.

Taking the leap into Clojure has been one of the most rewarding decisions of my career. It hasn’t always been easy, and I’m not here to tell you that Clojure is some kind of holy grail. But I’ve learned to appreciate functional simplicity, especially during those moments when co-pilot’s suggestions lead me astray, or when I’m in the middle of a chaotic merge conflict.

Learning Clojure felt like transitioning from writing dry technical manuals to crafting poetry. As for the brackets, they were like navigating a bewildering jungle gym. Now, armed with Paredit, I’m the proud gatekeeper of my parentheses. And REPL-driven development? It completely won me over—my trusty sidekick ever since.

The Importance of Community

The Clojure community has been one of the most rewarding aspects of this journey. From LinkedIn to Reddit and the Clojurian Slack, there’s always help around. I’ve even received DMs from icons like Danie Roux, Stuart Halloway, Bozhidar Batsov, Robert Stuttaford, and Dmitri Sotnikov. It’s humbling and encouraging to know that you’re not alone.

One particularly challenging time was when our Figwheel REPL refused to start with a cryptic "fat file, but missing compatible architecture" error. This issue was crucial because it blocked our development progress, and solving it taught me the importance of community resources and persistence in tackling obscure problems. I searched high and low until I stumbled upon an answer in the Clojurian Slack archives. It saved me, and you can check it out here.

Taking the Leap

Should you take the leap? It’s up to you 😄 Clojure is a fantastic choice to dabble in. If you’re considering it, here’s my advice: don’t be afraid to feel like a beginner again. It’s okay to stumble, to get lost in the brackets, to question your sanity. Embrace the learning curve—it’s worth it, and the community is there to help. Also:

  • Be patient with yourself
  • Celebrate all of your wins
  • Keep a journal of your progress and what you learn
  • Practice on a daily basis
  • Embrace the REPL
  • Don’t be afraid to ask for help
  • Find a mentor to guide you

Resources to Accelerate Your Learning

If you’re eager to accelerate your learning, here are some resources that helped me immensely:

  • Clojure for the Brave and True for a fun, beginner-friendly introduction that makes learning Clojure approachable.
  • Clojure Applied to understand how to solve real-world problems with Clojure.
  • The Joy of Clojure for a deep dive into the language that will expand your understanding of functional programming concepts.
  • Living Clojure for a structured, hands-on approach to mastering Clojure and applying it in real-world scenarios.
  • Eric Normand for insights on functional programming.
  • Lambda Island for tutorials and resources that will deepen your understanding of Clojure.
  • Join the Clojurians Slack, follow ClojureVerse, and attend conferences.
  • And find a mentor—trust me, it helps.

I’m grateful for the twists and turns that led me to Clojure. It hasn’t always been easy, but those challenges have made me a better and braver developer. If there’s one takeaway from my journey, it’s that embracing change, even when it seems daunting, can lead to incredible growth and opportunities.

Happy coding! 🚀

Share this article on…


Subscribe to my newsletter

Get notified monthly about any new articles, tutorials, and courses. I promise to keep the emails short and sweet, and never spam you.

By signing up you acknowledge the Privacy Policy. Please keep an eye out in your junk/spam folder for the confirmation email.