I did my undergraduate in Civil Engineering and pursued my career in software. This blog would be the story and the specifics of what a lot of people have asked me over the years, about how I made the switch and some things that you can use too, if you're interested in the same

I'll keep a major part of this blog very generic to the topic "switching streams" in general and then I'll add a section, at the end, about things I did.

Continuous learning is the name of the game

Today, learning anything is completely possible, at any given point, if you're willing to put in the work.

A lot of times we're under the notion that only a few people can learn a skillset based on the course they're "officially" enrolled in or some background experience they've had. I don't believe so. I think, that in this all-knowing YouTube and ever-improving-chatGPT era - anyone can learn anything from the Internet - for free, at their pace and convenience and from tonnes of world leading tutors.

Here are some pointers that might help you:

  1. There is no magical playbook - to learn anything, it takes a lot of time and persistent effort of finding the right material for yourself and creating a roadmap for improving in the skill. So it's fine if you're not having a clear path to start with. There are a couple of channels that can give a clear path, but I think, that just starting from a Google or YouTube search about the topic name is a good place to start.
  2. Taking notes really helps - Even if it's rough screenshots, scribbling random thoughts while learning or just copy-paste's of youtube videos - it works. I'm currently exploring YouTube video summarizer plugin in ChatGPT for this purpose. What's even better is revising and refining notes - for smarter reference later. It's like creating a power pellet from your learnings that you can consume at any point in the future to catch up on the skill super-fast. I used Notion for organizing whatever I've learnt into easily reference-able notes.
  3. Motivation is 2/3rds of the game - Dedicate a fixed time slot for learning and keep struggling to make the most of it. Have very little ego. Initially you might suck - that's cool. But after breaking your head for about 1-2months, you'll not even realize but you'll naturally start seeing patterns and connections. That's the next level.

You shouldn't be afraid to suck at something new and give up if you struggle across even when understanding a paragraph of a new topic. Hell, when I was learning programming, it took me about 12hours to fully grasp and implement a 5 min youtube video about animation. But then, relentlessly pursuing on and on and on, I was able to condense 12 hr worth learnings into 5mins of revision through my notes. It's going to be hard, but if you just stick with it, it's going to be worth it.

The world is project-driven

We live in a fast paced world where most teams just look for how much value an individual can add to their team. If you've independently taught yourself and built impactful projects, no one really cares about your background coming from.

This can be harvested well to your benefit if you want to even your odds with those, who are already in the stream you like. Just build projects that rival with them. And these days YouTube has walkthroughs of any project across any stream for free - it's just so good.

Here are some key pointers to help you in this leg:

  1. Projects are strong applications of learning - Project can mean anything - a tiny robot, a sketch, a basic app, a research paper commentary, a spreadsheet,  a 5sec musical composition, a youtube video - anything. Point is - you're supposed  to have employed your learnings and you're supposed to have worked super hard. It will help grasp the reason of each thing you thought was dumb but you read anyways and help translate it into moving parts of something very impactful
  2. Start by copying other people's work - A good place to start is searching for existing projects on the internet and interpreting and recreating their work. Painters, musicians, writers, chefs - do it all the time while practicing - just patiently learning from the experience of others. This would help avoid pitfalls and learn best practices from your teachers. Again - don't just blind copy as they do. Refer - understand - try to recreate - fail - go back to refer- then understand - then try to recreate and so on.
  3. Add your own flavor to each project - Employ a personalized touch to your project so that its unique. In the early days, I liked reading so when I came to programming projects - I would just add quotes of my favourite personalities in them as my touch. Now for you, it can be anything you like, but once you do this, you just differentiate extremely well from every other person who's just blind-copying and give a polished overall outcome
  4. Tie the project to your ego - I get why this might be a double-edged sword but hear me out. Once you set a benchmark for the finished expectations from a project - tie it to the fact that it's something the world will see as a finished project from "you" and hence it can't fall below a certain quality threshold. For me, it used to motivate me to always push the project to completion and have it satisfy some baseline criteria.
  5. Learn and grow with stakeholders - Some projects, you might not do alone and hence the coolest thing would be to learn from your collaborators and ensure they have a good experience working with you. Believe it or not, people and team skills are still one of the most important virtues for any team. Have fixed meetings, track your progress, hit your metrics and note down and share - what each of you learnt from the project. Projects offer collaborative opportunities and hence you can learn much beyond the books and the internet - you learn from people and in a lot of ways - what you learn will surprise you.

The more you passionately employ your learnings into real-time applications the more strongly your education will stick to you.  

How to sell yourself

The next step after building projects is to share your work with the world and capitalize on it.

Few pointers on this are:

  1. Have an online gallery - Every time you learn something, it would really help if you could maintain a online browsable gallery of your work. Be it your GitHub page or Dribbble gallery or LinkedIn profile or blog page. Just everytime you wrap up learning something, create an online snapshot for the world to view your thinking, approach, knowledge depth etc.
  2. Look for interesting people and DM them: I used LinkedIn. Each time I found a person with interesting work - I would DM (Direct Message) them on LinkedIn and if possible, even get on a call to understand how they thought and learn from them. Seriously, it helps so much to get other people's feedback on your approach. Beyond this, there are obviously interesting conferences that you can just boldly sign up for, attend and be the newbie who talks and learns from everyone.
  3. Confidence is free: In the early days in this new stream, you'll often feel imposter syndrome and underconfident - so start pretending otherwise. With time, it will grow into something more solid and with the knowledge and experience piling on, it would just compound. Confidence also helps express passion and clarity for the subject matter so the more you are confident about your projects and subject matter, the more people would value your work

I guess that about sums it up - in a nutshell - randomly search for ways to learn, iteratively keep sucking till you get better, build toy projects that make you happy and confidently talk about them on platforms. Rest, I'm 100% sure, the journey you take will help you figure out.

My story

Alright, now I'll be more specific about my story and things I did. I grew up in a middle-class family in India, thinking that a good college, a good job would be the only salvation. So naturally, once I got into the 4 year Civil Engineering program at IIT Madras, I thought that this would limit me from pursuing anything lateral. But in this internet-learning driven age, that's hardly the case.

To find what I liked - for a year, I dated a lot of career options - photo and videography, standup comedy, automotive engineering, consulting, designing, architecture and many countless others - mainly through hanging with different clubs of students in my college.  Once I stumbled upon "software startups" I've just felt an irresistable pull to it, that stands to this day. Obviously there are a lot of days where I've doubted it too, but if it's your calling, some part of you always knows and gets attracted to it.

Now the specifics okay. I'll make it pointwise and list specific instructors and courses so that you can maybe check them out:

Disclaimer: You don't have to do it like me. Just read my opinion and do it the way most apt to you :)
  1. I learnt the basics of programming in C Language from the hard copy book - How to C, by Prashant Kanetkar. It took me 4 months with my other college work helps understand the foundation of how a piece of code is designed, written, interpreted and executed.
  2. Next 4 months, I learnt web development (HTML, CSS, JS) from DevEd, WebDevSimplified and Brad Traversy. I also use Laith Harb for time to time learning of new skills. Also, I used to build a lot of toy projects that these youtubers would post walkthrough videos of - this udemy course of 20 projects with Javascript is pretty sweet - link. Also learnt Git during this time
  3. I used to also pursue first 2 hrs of any random long 7-8hr videos from FreeCodeCamp's youtube channel - anything from Data Structures and Algorithms to CyberSecurity to even color designing. I even did a bit of digital illustrations from from Gary Simon.
  4. After this, I was consuming content and courses very fast. In the next 2months I learnt NodeJS,  React and TypeScript, GraphQL, Docker and other misc topics. These are the most common industry technologies in use these days.
    I even learnt basics of Data Structures and Algorithms and some Systems Designing from Algoexpert. A good place to start learning the basics of literally anything programming or computer related is Fireship - who does amazing 100second video intros of a tech.
  5. From time to time, I've flirted with Machine Learning and AI courses from DeepLearning, ZeroToMastery and random blogs and projects and stuff. But these 2 sources are very strong for it
  6. Next up, I was having trouble deploying apps and understanding large scale software so I studied systems designing from Gaurav Sen since it helps fall in love with the strength of computing. I also completed certifications from AWS, Google and Microsoft with the help of Stephane Mareek's amazing content
    In fact, I feel that Stephane Mareek's course on Cloud Computing is a must-do for any software engineer to appreciate the beauty of internet and all cloud services that become the strong backbone of it. Just do this course, trust me.
  7. Yeah and after that I got into generalist mindset and I was brushing up on everything from Figma for designing to Flutter for app development and was tinkering with over 10 frameworks and DevOps products at any given point for building great software.
  8. To start getting more professional experience, I used to always offer myself up as a cheap developer to startups. I remember cold reaching out to 200+ engineers and founders (not HR since they have less of a say in hiring than actual engineers who lead teams) on linkedin over 4 months before I landed my 1st internship.
    In startups,  I could learn a lot everything about businesses - in the high-growth-vacuum environment that startups offer. Plus I made some money, re-invested that back in random tech-courses and business-books that I used to pick like a kid at a candy store and kept building and building a 2nd brain of mine in Notion.
  9. I kept up my spirit and did create projects entirely from scratch on my own right after the 1st 6months even though they felt shitty and didn't work as well. Some, I couldn't even afford to keep running cause I would have to enter credit card details and I didn't have one back then. So I created YouTube videos or blog posts and shared the code as I sunsetted each project deployment. You can find a log here - link. Point is just keep trying honestly.
2nd brain in Notion

Yeah and after that I tried to run my own software startup, made some money and I failed to run it long term (here's the story of it - link).

I balanced all this work with college. Fun thing is, once you do projects, everyone wants to give you a shot - be it professors looking for programmers or startups looking for part-time developers.

A lot of times, people ask me how I managed my time or remembered so much. I do not. I just used "Google Calendar" and practiced using a lot of tools to keep reminding me to meet my goals and do my things. Every night before I go to sleep, I plan my next day's calendar for 10mins to be a good student, programmer, student-club head, brother, son, friend or any role that I feel is important dedicating my time to. Recently I even started to take Mondays to plan 3 to 4 most important things I wanted to achieve in each sphere of life in that week - like learning to cook, or reading a book, finishing an online course, deploying a project, teaching my mom about tech or even learning to play squash or salsa dancing with my friend - I tracked it all so I knew if I was missing out on time for any of my commitments.

My academics did take a hit no doubt - but I knew that I wasn't giving enough time to it and why I wasn't so it was cool.
Recently, I ended up applying to Carnegie Mellon University.

It took me a lot of research and advice - and I made this document to put down my thoughts, goals and opportunities - link. This was the single most important thing I did before choosing what I wanted to do next. I showed this doc to my seniors, people I knew and respected, family and friends and finally collated their advice into a decision.

For applying, here's all I did:

  1. I gave the GRE test (325/340 with 4.5 in essay writing) and TOEFL test (111/120) though I didn't think GRE would have much weightage now. People say you gotta take paid courses and prep for 5 months and I don't believe it. Just mark your calendar. Go through this free material I aggregated in 2022, for GRE and TOEFL and you'll be able to get it done sooner.
  2. Next, I talked a lot about my projects in my SoP. I wrote about majorly, creating impact through startups and software, you can give it a read - link.
  3. My CGPA in academia was 8.01 out of 10 in my undergraduate college. I willingly didn't study as much in class or in pen-paper exams. But I pursued projects passionately and that's where I caught up on.
  4. For Letters of Recommendation - 1, I got from the CEO/Founder 1st startup I worked with for 9months. Next, a letter from a Computer Science professor in my undergraduate whom I helped for free as a DevOps engineer on his logistics project, back in my 3rd year. I got my 3rd reco letter from my favourite Computer Science professor who had taught me 1 course (and that too I didn't score that well XD), but he just looked at my profile and work and decided to give me a shot. And yeah, that's where sometimes just asking gets you to. I just wrote him (and other profs too) an email and he called me for a 20min meeting and decided to help me out

I guess with all of that, I'm now headed for a Masters in Software Management to Carnegie Mellon Silicon Valley. I've messed up a lot. Have done a tonne of random things and kept exploring. Some of it worked. Most didn't.

In the end, I just have 1 advice - read a lot of opinions to expand your world view but at the end, internalize all that info with with what feels right in your heart, and trust me, just fuck it and do it.