Exactly a year ago (15th December 2021), I was sweating bullets because it was my first day at my first ever tech job. All I could think of was “They made a mistake and haven’t realized it, they’re going to find out that I can’t really code”. But wait, how did I get here? Just a year ago, I was in a lab, waiting for the autoclave to finish, so I could make my plates and go home (autoclaves are used to sterilize lab equipment).
I was pursuing a bachelor’s degree in Biotechnology. I joined Biotechnology because I loved studying biology and was fascinated by prospects of gene editing and Medical uses of biotechnology. As the course moved from focusing on theoretical knowledge to practical work, I realized that practical work wasn’t for me. There was a lot of waiting involved, the feedback loops were long, and I’m a generally impatient person. This wasn’t how I wanted to spend my life. Studying a subject versus working in the field can be completely different, and you can love one but hate the other.
A “life-changing” event was a workshop on computer aided drug design, it was 2 days long, and a hell lot of fun. We created new compounds, analyzed them, got rapid feedback, and quickly tested out different designs. I kept playing around with the software even after the workshop was over, and those were the happiest days I’ve had in a period where I was intensely frustrated with college. This was definitely a better option than working in a lab.
I looked up the skills I would need to succeed and saw python and data science listed. My college didn’t offer these courses so I had to learn python on my own. Learning python and building one-off scripts was exciting, my favorite was when I built a whatsapp messaging bot to win a spam war against a friend. He sent about 800 messages by hand, and I sent around 10,000. That was my first experience with leveraging a computer to do a manual task for me. I felt like a child that discovered a cheat code in a game.
Later that year, we had bioinformatics in the curriculum and it wasn’t as interesting as I had anticipated it to be. I decided to pivot and go into mainstream software engineering since I enjoyed python and could easily switch to bioinformatics later.
After watching a lot of computerphile videos, where a lot of videos are from the staff at the university of Nottingham, I decided to apply there. I applied to 4 other universities as well, got 3 rejections but then the university of Nottingham accepted me. This was a huge win for me, and I felt like my life was finally turning up, and changing for the better. The real reason I was in biotechnology was because I couldn’t make it into med school, I tried multiple times and failed, which made me question my intelligence. I felt dumb for a long time after that. It still comes to haunt me from time to time.
In retrospect, while I enjoyed biology and medicine, I wouldn’t have been happy working in the field. The reality of working in medicine is that you work long, grueling hours while being sleep-deprived. You spend significant energy convincing patients that what they read on that whatsapp message is incorrect. I don’t have the patience or energy to deal with all that. This is another example of the enormous disconnect between studying and practicing a subject. But medicine and computer engineering share similar aspects. Both involve complex systems that can fail in beautiful ways. The only difference is, engineering lets you build these systems. That is definitely more fun!
Sadly, the joy was short lived because covid hit and the world went into lockdown. The future was shrouded in uncertainty. So I deferred my admission.💔
I had nothing to do that year, so I decided to learn more python (it wouldn’t hurt), I built a blog in Django and then some other toy projects. I showed them to a friend of mine who is a dev at Amazon. He was quite encouraging, but he also gave me important feedback saying that these were scripts and not “real programs”. He jokingly added, “python wasn’t a proper programming language”. I asked him what I can build that is a “proper program”, and he told me to build a simulated library, and said it’ll teach me domain modeling and design patterns.
I took on the challenge, and I decided to do it in java, I spent a week learning java and design patterns, and the next five weeks building the simulated library. In those five weeks, all I did was eat, sleep and dream(literally!) about code. On demo day, he was shocked to see a GUI application with a database! He was just expecting a CLI application. He walked through the program and gave me feedback. Most importantly he told me that I was doing better than most students in Engineering school. While we still throw jabs at each other’s programming language of choice, he was the first person to give me the confidence that I could succeed in this field.
That was quite a month for me, I was on a different high. I wrote around 44,000+ (+26k added and -18k deleted) lines of code over the life span of that project (which is probably dead by now). While that was a highly-rewarding time, typing so much code lead to stress injuries and I couldn’t type for more than 5 minutes, my hands would start burning. I took a week off, then another week off but the pain still didn’t go away. I was physically incapable of doing what I loved, did my career end before it could even begin?
Thus began a low period of my life filled with lots of doctor visits, tests and frustration. I was genuinely afraid that I wouldn’t be able to type again. I had to rest to let my hands heal but this led to boredom. I stumbled upon Paul Graham’s essays. Soaking in all his essays about startups and lisp. He talked a lot about lisp macros and I wanted to know what are macros, and what makes them so powerful. If lisp was so powerful, why didn’t anyone tell me about it. I was mad and curious.
I decided to learn common lisp. I couldn’t get far, because at the back of my mind, I wasn’t motivated. I thought that this wasn’t going to enhance my career, I’ll never get to write common lisp in production. At that time, I was also considering retracting my application from the university of Nottingham, because I saw that I was capable of learning things on my own, and had made incredible progress. There were a lot of other people that made it in tech on their own without a degree. It was enticing to join that group of autodidacts.
Going it alone was a risk, but what convinced me was the huge debt I would have been in if I went to Uni. So I retracted my admission and decided to go it alone. I sort of lightly started preparing for interviews, my hands still hurt so I wasn’t ready to apply yet. I would write things on a whiteboard because I couldn’t type. It was a good exercise to compile things in my head. I was also half-heartedly studying common lisp when I discovered Clojure, a modern lisp and I thought “hell, one day I might be able to use Clojure in production”. That was how I got started with Clojure.
There were two aspects to learning Clojure, the language and functional programming. I read Clojure for the brave and true to learn about the language, but couldn’t really solve any problems or accomplish anything because it’s a different paradigm. Side by side, I started reading about functional programming, and python has constructs for functional programming. So, I reimplemented the solutions to my interview prep questions in python in a functional style. That’s how I got comfortable with map, reduce, and recursion. Converting functional-style python code to clojure code is as easy as shifting the parentheses to the left! I even wrote a python library called functionali where I implemented some of clojure’s core functions. This helped me understand how basic clojure functions were written. I also spent a lot of time on rosetta code seeing how algorithms were written in clojure, common lisp and scheme to get a feel for solving things the functional way.
At this point, my hands had gotten a little better so I could type a little bit. I would solve the problems on paper/whiteboard and then type it out and compile. The process of writing clojure on paper and thinking about code before I type it out was probably one of the reasons I learned it so fast.
A friend told me to get on twitter and it’s probably one of the my best professional decisions. I started sharing what I was learning about Clojure and soon people from the community started noticing and following me back. Until this point, everything I did was in isolation but now I had people to share stuff with.
At this point I wanted to prove to myself that I knew clojure well so I built Luna a regex DSL that got quite some attention, and it is still my most starred project. I also wanted to fully understand Macros (which is the whole reason I started learning lisp!), so I wrote about them, and that blogpost also become quite popular.
The first twitter friends I made were Asko Nõmm, Justin Frost, Peter Strömberg, and Faris. Who have since encouraged me, shared my blogs and even recommended me for jobs. Without their encouragement I wouldn’t have applied for jobs.
Among the 30+ companies that I applied to, one of them was Juxt, I was quite hopeful about Juxt because they were accepting engineers of all levels. Even though they declined my application due to timezone issues, Steven Deobald from Juxt recommended me to Baishampayan Ghose and 3 calls later, I had a Clojure job at TeamOhana. I had crossed the biggest hurdle in anyone’s career - the first job.
Applying to companies and interviewing is one of the hardest parts of tech. I didn’t hear back from most companies that I applied to. A few were quite rude, and wasted my time by showing interest at first, making me jump through hoops, and then saying I didn’t have enough experience. One or two were kind and gave me valuable feedback at the end of the interview process. Hiring is a tough process for both parties involved, kindness goes a long way. Ultimately, if you don’t have time to be kind when hiring, you don’t have time to hire a great team.
I was pretty close to giving up because a lot of Clojure companies were only looking for senior engineers. I have seen clojure jobs that have been vacant for an entire year because they couldn’t find a senior engineer. They might have been better-off hiring a mid-level engineer and helping them grow into the senior position. Since senior engineers aren’t born, they are made. But I am optimistic, as more businesses succeed with Clojure and grow bigger, there will be more jobs for juniors.
Working for a startup is hard, and the first 2 to 3 months were difficult and it felt like I was drowning, during that time I built snitch which helped me debug programs better, explore the codebase, and has since been a life saver for me throughout the past year. Some of my colleagues even use it daily. Even though working for a startup is hard, it also means you are given tasks that are above your experience and skill level, forcing you to grow. I have worked on diverse projects like adding support for bitemporality, google SSO, and even building a slack app in the past year.
I realize that I could only pull this off because the tech community doesn’t care very much about degrees, and I could show my work through my blog and github projects. It would be much harder to succeed in other fields without any formal degree. While I get to proudly call myself an autodidact (and yes, I am quite proud of it), I did miss out on a possibly great college experience at the University of Nottingham. The true value of college is not necessarily what you learn in the classroom, but the people you meet. That’s why it’s important to find a community, and meet new people. I wish I had known this much earlier.
Thank you for reading my story. In the end, it is about people. My journey started off in isolation but its much richer now because of all the people that I have met. I’m down to chatting with new people, just email me.