5 Lessons from the Mistakes I Made in My Software Engineering Career
In my software engineering career spanning over 10 years, I made several blunders that had long-lasting impact on my career. Some of those mistakes were even counter-intuitive. This article aims to share the lessons I learned from those mistakes and what I could have done differently in hindsight. If you find yourself in a similar position, I hope these insights will help you avoid the same pitfalls.
1. Choose the engineering stream wisely
The biggest blunder I did in my career, and perhaps my life, was not choosing Computer Science and Engineering (CSE) as my engineering major. Despite my aptitude for computers and programming, I opted for Electronics and Communication Engineering (ECE) instead. Looking back, several factors influenced this decision:
- The repercussions of the 2008 economic slowdown and its impact on IT jobs was still in the air. People (who related CSE to IT jobs, including teachers and close relatives) advocated strongly against picking CSE and ECE was trending at #1.
- My interest in exploring new fields led me to believe I already knew enough about programming, which I mistakenly thought was all about CSE 🤦♂️.
- Naively, I thought studying electronics would enable me to build a computer, combining my knowledge of programming and electronics.
This decision caused me to miss out on several crucial CS concepts, which I still struggle with today.
Lesson: Try to get an early pulse on what excites you and pick a stream that aligns with the job that you want to do.
2. Understand the concepts that were missed early in the career
By the time I started my first job in TCS Research, I realised that Software Engineering was my true calling and I already regretted not taking CSE as my major. Regret was one thing, call for action could have been another. I still had the opportunity and time to course correct, spend some time to get a clear understanding of the foundational concepts that I missed. But I chose to go with the flow, learning what matters to the immediate job in hand.
By the time I realised this mistake, I was already expected to know the core concepts and the gap started impacting the quality and velocity of my decisions. From my experience, clarity on at least the below listed topics is necessary to be a mid-level/senior software engineer:
- Networking foundational concepts
- Data structures and basic algorithms
- Object oriented programming concepts
- Database, OS foundational concepts
I was not good with any of these and even now struggle most times. What could I have done differently? Earlier in my career when I had more time, I could have focused on learning the foundational concepts. Instead, I tried to master several programming languages and platforms.
This gap proved to be the most challenging aspect in my interviews for top-tier companies including Amazon, where I work now. I had to steal a great deal of time from my work to learn some of these core concepts later in career, and still I am not fully done with those.
Lesson: Anything you missed in college, it’s still not late. Try to identify the gaps and learn early in the career.
3. Get relevant certifications (sponsored if possible)
Even when I was spending significant time learning technologies and programming languages over core concepts, I never invested in getting certified for those efforts that I put. I always believed certifications were not necessary and focused on the practical knowledge gain. But I was terribly wrong.
There are two major reasons how certifications would help:
- When aiming for a certification, you are less likely to drop the learning in the middle, which I must confess I have done many times. Enrolling for a certification would give a commitment to the learning.
- Validation of knowledge — most certification would involve assignments and tests, giving you a chance to validate the knowledge gained, and sometimes help course correct too.
- Quick-catch for recruiters — recruiters are more likely to shortlist someone with a certification when they are looking for skills in LinkedIn. I landed my current job at Amazon through a recruiter who reached out to me through LinkedIn, and AFAIK it’s the leading channel for top tier companies.
Most organisations would have employee discounts or altogether free certification programs for employees. You could make use of these to get the certifications at minimal cost. In my later phases of my career, I did get a few certifications. But in the hindsight, I could have got many more.
If you are looking for a career in software development, I would recommend the following certifications:
- Developing/architecting on AWS (or any alternate cloud provider)
- Machine learning/Deep learning foundational certifications — These are immensely helpful to have a broad understanding on AI, given it’s penetration in all aspects of software engineering.
- Java/other programming language certifications
Lesson: Whenever possible, get relevant certifications.
4. Start competitive programming practice early
Personally, I do not believe in the usefulness of competitive programming skills in day-to-day software development work, but many tops firms do. Many companies rely solely on competitive programming skills as a cut-off criteria. Most sought-for companies like Amazon, Microsoft and Google have multiple tests/interview-loops based on competitive programming questions. So it would be an absolute must for changing jobs, particularly if you’re aiming for the top notch.
Since I never believed in the merit of competitive programming skills, I never invested myself in practicing those. Moreover, I was over-confident on my innate skills to solve tough problems. Although I am still not convinced of competitive programming skills’ role in accessing the competency of an SDE, practicing that would better the data structures and algorithms knowledge, which in turn could have some impact on the work we do. By the time I was convinced of the importance it has in the job market, I was already way behind. Even landing a job in Amazon was sort of borderline luck for me.
There are a few goto resources for acquiring good competitive programming skills like LeetCode and HackerRank, which you could make use of for preparations.
Lesson: Competitive programming skill is a force-multiplier, if not essential, for landing good SDE jobs in top-tier companies.
5. Quit when learning stops
This is by far, the most important lesson I learnt. In my opinion, it doesn't matter where you currently work, what you work on etc. as long as there is continuous learning and self-improvement. The moment learning becomes stagnant, the career is granted to be heading towards a downspin. I myself did the mistake of staying in the same job for too long, and that pushed me at least 3–4 years back in the career.
When I joined TCS Research, I felt like I am making the impossible into reality. Such was the learning that I had in the initial 2 years. I stuck on to the same job and there was nothing significant I was learning and I gained enough expertise that I could do most of the job in my sleep. I used the spare time that I had learning different technologies and enjoying life outside work to the extend it reached boredom. I then had certain personal issues too that took me long to bounce back. Finally when I decided to go for a role change within the same org, I soon faced financial constraints that forced me to look for job elsewhere. That lookout would have been lot easier had I not left the learning stagnant for too long.
When I finally changed my job, I lacked the technological skills required at the level I was looking for or as per my experience in years. In the last three years, I could learn significantly more than what I got to learn in the five preceeding years. I am still trying to make up for the years I lost.
Lesson: Continuous learning is the most important aspect of any job, especially in engineering. The moment learning becomes stagnant, be prepared and seek job change.
Side-note: Be mindful about the standard remuneration in the industry
One key factor that made me do my initial switch was a delayed realisation of the pay disparity in the industry. My friend circles were mostly within TCS and a few service companies that time that I was literally unaware of the scale of pay elsewhere for the same set of skills. It was partly my then salary being insufficient for my updated financial scenarios that made me seek and evaluate the pay outside of TCS.
One aspect that could help is having a diverse friend circle working in different organisations, and preferably around the globe, so that you have a close account of the pay variations among different companies and regions.
Conclusion
Mistakes and bad decisions are inevitable, but they are not insurmountable. It’s never too late to course-correct. This blog post is my attempt to share what I’ve learned from my mistakes in the hope that it helps others avoid similar pitfalls. If you have similar experiences or differing opinions, please share them in the comments. A diverse forum can help us all learn and grow.