Reflections on a decade of "working"

"Isn't it funny how day by day nothing changes but when you look back, everything is different."

-- C.S. Lewis

Last week, while discussing some random stuff at work, a colleague of mine randomly said... "Oh, so you've been working for 10 years!?". That's when it hit me that I indeed have been working for 10 years now. It never felt like this because I've only been programming professionally for like 5 years.

That conversation, coupled with a recent blog entry from Charity Majors on forty-year career and a recent writing workshop at work, made me reflect on my career so far.

Childhood and schooling

Freud's view of psychology says that childhood experiences guide personality development. It seems to be holding up for me as well. I've had a fairly outlier-ish journey in my entire career, and it started with school. I studied in a Gujarati medium school, in Mumbai. So my first language was my mother tongue, second language was Hindi, and English was my third(!) language.

My answer to "What language is your internal monologue?" slowly changed from Gujarati to English after leaving school, and I still don't know how to feel about that. People get stuck in their careers because of a lack of "communication skills" (HR-speak for English), so maybe it wasn't all bad after all?

The Internet was my first exposure outside of the shielded bubble of my school. My real schooling probably started when I got internet access. I distinctly remember browsing Wikipedia on Opera Mini browser using 2G internet speeds. I was practically "raised by the Internet". I'm still grateful for this schooling because my parents had to pay just ₹1000/$12 in fees for the entire year.

Rebel phase

I had sorta rough childhood, but overcoming all of that also made me way more resilient. My family was mildly religious, and there was a new wave of indoctrination going on by Swaminarayan people (a new sect in Hinduism). Religion and praying specifically didn't seem to be working out for me. At the same time, I didn't even know that the absence of belief is possible. The myths and stories didn't quite align with reality, and the more I read, the more my belief in a higher power withered away.

Eventually, I hit a low and decided to leave the religion behind at ~15 years of age. I don't remember any regression in my lack of belief. I was, and to a large extent still am, a "संस्कारी" kid. So my immediate family didn't care about this either.

I've tried to find the "meaning of life" by reading mythology, history, philosophy, and psychology. I don't think I've made any progress on this; I just wish it's not some form of mass psychosis.

I stopped caring about what people next to me thought, most of whom were clueless themselves and just parroting what other clueless people told them. The idea of a "समाज" where people who are born in the same caste organize themselves as a group and have a shared understanding of how everyone should live is absurd, and I am never going to be afraid of the opinion of such spineless people who can't think for themselves.

Polytechnic Life

I had many random inclinations in childhood. In hindsight, I believe most people are not equipped to make any kind of long-term career decisions at the age of 16. My decision was influenced by people around me and what was financially feasible for me. I opted for a Polytechnic Diploma in Mechanical Engineering, which is probably equivalent to an associate's degree.

Most of college education was a waste of time. I spent hours and hours memorizing shit for an exam or copying text verbatim from textbooks to "assignments". I still hate some of the professors with the burning passion of a thousand suns. My college had autonomy from curriculum regulatory boards, so they had no justification for their idiotic teaching practices other than their own gross incompetence and lack of vision.

Just like schooling, I'm still grateful for this college experience too. The fees were just ₹10,000/$120 for the entire year. Outside of college, I developed a deep appreciation for mastery learning. I truly loved learning different subjects in mechanical engineering and finding their real-world applications. NPTEL by IITs, OCW by MIT, and other videos on YouTube played a much bigger role than college.

Apprentice Life

My Polytechnic program required us to go through 1-year of internship, which is where my career officially began. My first internship was at ACG's R&D department, and I got to work on building CAD schematics for a new tablet press machine.

This internship was an interesting and challenging experience. I got to master CAD in 6 months, and I got to work on mechanical design problems with people who are experts in the field. I got to see the real impact of work in the same building where prototype machines were being assembled. My second internship was rather mediocre; I've written a post about how that helped me course-correct my career trajectory.

People often have this caricature of corporate life in their heads, where work sucks the soul out of you. But I've observed that even in the worst corporate hell-holes, you'll find a group of decent people who just want to do good work. You should try to find this group wherever you work.

Noob programmer phase

I don't quite remember when exactly I started taking programming seriously. If I had to guess, it started with learning to reverse engineer Android APKs and modifying them slightly. Those modifications were inconsequential, but they put me on a path to learn more... a lot more. I had no idea that trying to get "Temple Run" to work on my shitty phone would lead me into this rabbit hole.

I tried many different resources to "properly" learn programming. I tried C++, Java, Python, and even MATLAB(🤮), none of them worked out. CS50x, taught by David Malan, was the class that really worked for me. Programming without foundational knowledge of computer science is like running around like a headless chicken. CS50x taught me the basics of problem solving from a CS lens. I've since recommended this MOOC to everyone who wants to get into programming.

Even after learning to code, I didn't want to do it as a full-time job because of some naive idealism of my young age: "if I start doing this for $$ I won't like it". I mostly treated it as a fun hobby and a complementary skill that helped me automate quite a lot of my work.

What I am trying to ramble about here is... none of this is straightforward. You'll hold beliefs that feel comical in retrospect. What matters most is deep introspection on how things are going and course-correcting wherever required.

Independent autodidact phase

The end of college is when I truly gave up on the education system in India. I couldn't find any good pockets in this hellhole that actually cared about learning. Even if there were such places, they'd most likely be heavily gated and have fierce competition to get in. I could get the same education on YouTube, so why go through all these hoops? My financial situation wasn't exactly great, and with mediocre options for an undergrad degree, I decided to just start working without any degree. I knew this was going to be a blocker in my career progression, and eventually, I might have to get an undergrad degree.

I got hired as a junior mechanical engineer at Godrej Precision Engineering. This must've been pure luck or just taking the odd path helping me, because I had very little competition for the job. All the bright kids my age went on to do their undergrad degrees. I got "opportunity" to start working 3 years before them, which isn't all bad if you believe those degrees were a waste of time to begin with.

I started earning just enough to pay for my family and save something for the future. We went from barely surviving on a single mother's earnings to being able to afford an occasional meal outside. This is probably the first time in my life when I experienced true mental peace, and this is why I recommend that everyone should first become financially stable and independent before venturing into the wild.

Hitting the first major plateau

At Godrej, I got to work at the cutting edge of the mechanical manufacturing industry in India, so this job challenged me quite a bit for the first 1-2 years. I learned something new every day. I also found the pocket of a small group of decent people at this job. Over my 4.5-year stint at this company, I can recall only a handful of truly stressful days.

While my finances afforded me some peace after my first job, they weren't that great. I still struggled quite a lot with social anxiety and other problems in my personal life. Three hours of my day were spent just commuting to work, which left me with little time for anything else. I started slacking off on my autodidact ambitions and grew comfortable with "just good enough". It was inevitable that the bar for what I expect in life went higher again.

I was still learning programming on my own, and I took many MOOCs and learned all sorts of random skills. These classes helped me automate like 80% of my manual job. That freed-up time was invested back into more learning. Faced with this continuous dissatisfaction about long-term career prospects and how that hinders other parts of my life, I decided to bite the bullet and get an undergrad degree.

Getting that undergrad

I couldn't find any decent recognized remote degree program in India. I tried a couple of random undergrad degrees (Math, philosophy) but didn't find enough motivation to go through with them. Turns out, I wasn't quite the autodidact who can acquire all the knowledge from just books alone.

Luckily, this is around the same time when Coursera partnered with the University of London to offer a BSc in CS online. This was a ~3.5-year program that would easily fill the hole in my resume. I loved EdX and Coursera because of their wide range of high-quality MOOCs, so I instantly jumped on this program and joined the very first cohort of guinea pigs.

This undergrad was way worse than some of the MOOCs I've taken, perhaps my standards were too high, or perhaps it objectively just sucked ass. Anyway, it was the right fit for me because...

  1. It had an amazing international community of learners. I learned a lot from this community. Love you, #firstcohort.
  2. It required very little planned time commitment. Each semester had just two major deliverables - the midterm and endterm. I could easily balance this with my work.
  3. It accepted people based on performance in the first semester and had no artificial requirements for admission.

Getting a break

When I enrolled in that undergrad program, I spent ~1.5 years seriously learning CS fundamentals and other "job ready" skills. Once I felt comfortable, I started applying for jobs. I landed a couple of interviews, but neither went anywhere.

I had stumbled upon Frappe Framework a few years ago when I was trying to build an internal tool at work. I couldn't quite get it to work, but that was mostly because of my incompetence. I stumbled upon their career page and kinda admired the company, so I applied for a job there.

Frappe is a 100% open-source software company. When I joined, ERPNext was the flagship product and sole focus of the organization. My background in mechanical engineering provided me with an ERP user's point of view. That, coupled with programming knowledge, was enough to make me a good fit for engineering role in the ERPNext team. Odd path again helped me out here. I took a risk and joined Frappe at almost the same salary that I was making in my comfortable job.

Apprentice again

Frappe's culture was wildly different from Godrej's. Godrej was a ~120 year old corporate behemoth, Frappe was a ~12 year old company, but still pretty much operated like a startup. Frappe is a democratic workplace; there are no fixed working hours or even fixed working days 🤷. You are only measured on outcome, and there is no artificial inhibition against personal growth. People freely moved around inside the company to find the right fit and grow themselves. This cultural success can be attributed in large part to early employees, and mostly the founder, Rushabh. That said, my journey inside Frappe wasn't exactly smooth.

Firstly, they forgot to assign me a mentor at Frappe 😀. I reached out to a few people and sought the opinion of people whom I admired. In the early days, mostly that person was Gavin. Marica and Rohit also played a huge role in my success during the early days. New hires getting thrown to the deep end was pretty normal, though it was acknowledged, and efforts were made to make the onboarding process smoother.

I joined ERPNext's Stock/Manufacturing team. This decision was purely to play on my strengths and previous experience in the manufacturing industry. I, however, never limited myself to my own project. 20%-40% of my time was frequently spent on contributing to other projects, mainly Frappe Framework. I saw the company as a microcosm of the open source community where good ideas and contributions were accepted regardless of where they came from.

I tried to work aggressively on stability and "maintaining" the ERPNext modules. We were successful in bringing much-needed stability to the team and the codebase. I couldn't see any major pending work, and almost half of my time was now spent on solving "meta-problems" for ERPNext, which resided in Frappe Framework. The long-"seeded" idea that I should work on Frappe Framework and not ERPNext started making sense now, so I switched to the Framework team.

Feeling "peaked", getting into management for the wrong reasons

A few months into the Framework team, I started losing coworkers whom I loved to work with. One by one, everyone I admired had left the team to do something bigger/better, most still at Frappe. I led the team for a while, but I also started to feel like I'd "peaked" in my engineering career, especially inside Frappe.

That feeling of hitting a plateau and seeded ideas about taking up leadership made me consider a leadership role as a serious option. Leadership at Frappe is wildly different from the perception you might have about leadership in other organizations. There's very little structure, authority, or hierarchy to manage.

I have no shame in admitting that my first stint in "management" was mostly a failure. Sure, I shipped enough to justify my salary, but it could've been so much more, and the impact of my role could've been much wider.

In hindsight, I failed because:

Another plateau, sabbatical, and on to the next "peak"

After the end of the first year in "management", I realized I am not really cut out for this role and I don't like doing it either. So I went back to working on Framework as IC. I've just hit another plateau with Framework. None of the work seemed challenging enough. Whatever was challenging was also like whack-a-mole i.e. never-ending work. Perhaps it was just burnout setting in, or perhaps it was a continuous struggle with health.

I saw two star devs at Frappe burn out, go for a sabbatical, come back, and ship amazing engineering artefacts. The idea seemed enticing, and almost overnight, I decided I wanted to take a 6 month long sabbatical. This is one of the policies that every good company out there should adopt. If you want people to survive at your organization beyond the average of 2-3 years, then you need to plan long-term burnout management and have policies that encourage taking long breaks.

I had very little planning except my backup plan: I enrolled myself in OMSCS (Online Master of Science in CS). I again found myself in an environment where I was learning so much and so deeply. It almost felt like taking CS50x all over again, but with much higher depth and renewed interest in honing technical skills. I learned a lot about computer architecture, operating systems, and performance engineering. These 4 months of the first semester of OMSCS were the most dense learning experience in my entire life.

When I joined back, I didn't regress to the same work and instead decided to focus on one ambitious goal: make our software 2x faster in <1 year, and I finished that in 3-4 months. I shipped changes like never before, and the output was also very clearly measurable. Who knew that structure and focus help? I am once again at the same crossroads, thinking about what's next before I spend too much time on a plateau.

On to the next 10 years

I couldn't have sped up Frappe software by 2x with knowledge of reverse engineering APK files or even CS50; I had to hit multiple plateaus, spiral around so many random things, and progress to my current level. I can't imagine a straight linear path from where I was to where I am. So, I am making peace with this random, messy process.

The first 10 years were clearly spent chasing competence and excellence. I didn't want to be an average engineer on track to become an average manager in 10 years. I wanted to grow, and I wanted to grow fast as fuck with constraints that I had to just accept.

I have no idea what the future holds for me. Maybe there will be a time to go for that PhD in CS. Maybe it's time to focus on impact. Maybe it's time to spiral back into management again to help people around me make life-changing amounts of money.