Back in 2014, I had never seen nor touched an IDE. I had never laid eyes on Java, SQL, AWS or even REST APIs. If you had told me that over the next 2 years I would go on to build and deploy my own web API, with the entire REST interface coded up in Java, backed by a PostgreSQL database, powered by a plethora of AWS and other similar services, I would have said you’re dreaming. It’s been a crazy 2 years. Here’s my story.
Quick note: This post was first written and published in 2016.
Even though I wasn’t a CS major, I didn’t start off as a total beginner when it comes to programming. I graduated from University with a Master’s degree in computer engineering (hardware), and spent 5 years working in pre-silicon verification. This basically meant that I had a lot of experience coding in languages like Verilog, assembly, C and C++.
However, this was all done in a very hardware specific context, as part of a team where everyone was a hardware engineer. None of my colleagues came from a computer-science background. As you can imagine, when you throw 100 engineers together, none of them with programming expertise, and have them build/maintain a code-base with with tens of thousands of lines-of-code, the result is absolute chaos. If I ever saw a function written with less than 50 lines of code, properly indented, I would have considered that a win.
We wrote all our code using vanilla text editors, like vim. I didn’t even know that things like IDEs existed, and spent half my time doing manual code traces using grep. Because of the nature of Verilog simulations, and our tech-architecture, running a single test took hours. Which meant that fast iteration was impossible, and hence, focusing on one task till completion was impossible. I had to simultaneously juggle 3-4 different tasks in order to fill the dead-time while tests were running.
Perhaps most stifling of all, I didn’t see an adequate outlet for my creative, constructive juices. I got into computer hardware because I enjoyed the feeling of building something, of architecting a solution. As a verification engineer, I didn’t feel like I was doing either.
After 5 years of this, I finally throw my hands up in frustration one day, and decided that I wanted something different.
I wanted something more fast paced.
I wanted something more cutting edge.
I wanted something more creative.
I wanted to be a software developer.
Back to School
Over the next few months, I spent my evenings and weekends teaching myself as much as I could about software development. I started off with a Coursera Algorithms & Data Structures class, where I learnt for the first time about data structures like Hash Maps.
I also encountered for the first time, and fell in love with Java and IDEs. The sense of magic that I experienced when using an IDE was indescribable. Code completion, suggested methods, diving into a method’s implementation just by clicking on it, single-click refactoring… it felt like I had finally left the dark ages and wandered into civilization. I couldn’t understand why anybody would still code in vim like I had been doing for the past 5 years.
Next, I took an online class from Stanford on Databases, which taught me everything I needed to know about Relational Databases, SQL and its core functionalities. As an introduction class, I was only expecting to learn the basic fundamentals. And yet, by the time I got done, I found that I knew more about transaction isolation levels, schema enforcements and triggers, than most of my friends who majored in Computer Science and actually worked as programmers.
Even more importantly, I was taking this class together with actual Stanford Computer Science majors … and was beating them on projects and exams. This gave me the confidence that I have what it takes to make a career switch to software development.
I also took a couple of MOOC courses on REST and web-services. This was the first time I had ever learnt anything about, let alone built, web services. Doing so turned out to be thoroughly illuminating. It seemed incredibly complex from a lay person’s perspective. But after spending a few weeks learning the concepts and working with a few demos, I felt like I was actually capable of building and deploying a simple web service myself.
Looking back, the plethora of free online classes was a godsend for someone like me. I was able to learn so much from them, and given more time, felt like I could have completed an equivalent computer-science degree just by taking online classes.
Hitting the Books
It wasn’t all online courses though. I did quite a bit of reading as well, to “relax.” I started off with a book on Design Patterns which really blew my mind. Until then, whenever there was a tricky problem that needed solving, I had always seen it solved using some hacky workaround. It was only while reading this book that I realized the careful thought, and design principles, that go into good software design. The fact that people would care enough to write an entire, carefully analyzed book about design patterns, instead of just hacking together a solution, inspired me a great deal.
At this point, I was starting to feel pretty confident of my ability to write awesome code… until I discovered this. This was one of the books that truly opened my eyes and changed the way I look at programming. It made me realize that there’s so much more to writing code than simply “does it work”. That your primary audience is not the computer, but rather, other people who will one day read your code. And that you should always write code with the goal of communicating your intent and design for the purposes of readability and maintainability. These simple concepts, along with the examples given in the book, completely transformed the way I programmed.
With all this under my belt, I decided the came had come for me to start interviewing with companies, for a job as a software developer. And that’s when I encountered the best software-interview-prep book and a highly addictive coding challenge site. I don’t know if they actually made me a better programmer, but they certainly made me a better interviewee. The fact that I nearly landed a job offer from one of the FANGs, speaks to how effective these resources were. Half the questions in my interviews sounded just like the questions in Cracking-the-Coding-Interview. And TopCoder was the perfect tool to practice writing fast code intuitively in an interview setting.
I spent many a Sunday afternoon sitting in a coffee shop, with my laptop and Eclipse, coding away challenges from these 2 sources. Very soon, I was also able to develop a high degree of comfort and fluency in Java, which helped me immensely in the coming year.
Hitting the Real World
All the hard work above paid off, and I soon found myself in a highly successful startup. There were only 8 software engineers, including myself, which was a huge change from the mega-corporations that I had always worked for in the past. And working here proved to be the best education and training I could have hoped for.
Taking a bunch of classes and reading books in your free time is great. But actually working as a software developer, 8 hours a day, 5 days a week, allowed me to truly practice and hone my craft. All aspects of it. Being around other brilliant software engineers, from reputed companies like Google and Amazon, and engaging them in software discussions, helped me to grow immensely through osmosis.
And most importantly, seeing what my team had built, with just 7 people, was inspiring. I had been conditioned through my past work experiences to think that if you wanted to get anything done, you’d need an entire department of people working on it. It was only once I joined a startup, and saw how fast and agile they were by making use of 3rd party tools and services, that I realized how simple and easy things really could be.
Caucus is Born
Once I came to that realization, it was only a matter of time before I tried my hand at building something myself.
It started off as an idea that came to me while lying in bed.
“Man, Reddit can be so frustrating… I wonder what would happen if they did…”
The idea grew into some skeleton code that I started writing just to see what it would look like.
“hmmmm, these are the database tables I would need to make that happen…”
The skeleton code incrementally got more and more fleshed out.
“ok, just a few more APIs here, and this functionality over there…”
More and more services started getting thrown into the mix.
“Now I just need some payment processing integration, an email service, a login authentication service…”
And before I knew it, I had something real on my hands.
Which is not to imply that building this site was easy or straightforward in any way. It certainly wasn’t. When I started, I had no idea about the many different things that I ended up having to learn (painfully) over the coming months. In fact, not only was I completely clueless, I was even clueless about my cluelessness.
And yet, through it all, Google and StackOverflow had always given me every answer I’ve needed. Anytime I found myself wondering how to tackle some problem, or the right way to build some solution, I would simply type my question on google and spend however much time I needed reading, until I understood the problem better, and found or came up with a solution. I don’t know how people coded in the 80’s, but in today’s world, there’s no such thing as an ignorant programmer. Only a lazy one. No matter what problem you’re trying to solve, or what concept you’re trying to better understand, if you’re willing to open your mind and go searching for a solution, Google and StackOverflow will have the answer for you.
All in all, building the entire Caucus back-end and infrastructure took me ~3 months of working evenings and weekends. Looking back, those were some of the most intense months of my life. I still remember waking up in the middle of the night, having dreamt of an idea I had for the site, and being so excited that I got out of bed at 4am and started coding away.
Most of Caucus was built in a flurry of 3 months… but the real journey started a year before that. And what a journey it’s been.