Recently, I've had a good number of friends ask me, both for themselves and on behalf of their friends (and their friends of friends, etc.), for advice on how to become a software engineer. Here were some of the reasons presented to me:
- I'm not satisfied with my current work and want something more intellectually stimulating.
- I feel stuck in my career and want an alternative.
- I started coding in my job and really enjoy it. Now I want to take it to the next level!
- I'm out of a job and am looking for stable work to support my family and kids.
- I'm not satisfied with my current income and want to make more money.
- I want the amazing benefits and invincible job stability that I don't have but my programmer friends brag about to me.
Yes, I have heard that last one too, but the invincible job stability part isn't completely true.
Whatever your reason might be, I want to share my experience on how I became a software engineer and paths that you can take to become one as well.
My formal education consists of a Bachelors of Science in Computer Engineering & Computer Science and a Masters of Science in Computer Science.
Upon graduation, I started my career in the realm of technical consulting. I figured–why not? While most of my fellow colleauges went off to the Bay Area for software engineering jobs, I thought I should have my try at something I've never heard of (like consulting) and am probably never going to do again after my youthful years disappear.
I had fun doing tech consulting, taking on a wide variety of data engineering and DevOps projects for different clients. Most importantly, I gained a lot of soft skills and business acumen much faster than I would have gotten at any software engineering job like the one I have right now.
But since my role was mostly client-facing, I spent a good chunck of my time in meetings and not as much time (as I had wanted) actually coding. That's when I decided to make the switch into software engineering so I can code more. I will also admit that my work-life balance was pretty tough–60-hour weeks were common, and sometimes I might even go up to 80-hour weeks.
So, I started applying, asking friends for referrals, preparing for my upcoming behavior and technical interviews, and eventually landed a software engineering position at Amazon, which is where I still work to this day.
What You Don't Need
I'll start with the disclaimers first. These are things that people think they need that they actually don't. Of course, they help, but aren't strictly required.
- A 4-year university degree or graduate degree in the study of computer science
- A graduation certificate from a coding bootcamp
- Experience with coding from a previous job
Computer Science Degrees
I loved college. I formed some of my most memorable experiences in school, and I learned a ton academically and about life.
However, I don't believe college is for everyone. It's drastically overpriced in the US (without scholarships or financial aid) and emphasises theory over practical knowledge. Some people thrive by diving into theory, but most students get lost quickly. I know this because I TA-ed for several different classes.
A 4-year undergraduate university degree in computer science will definitely equip you with a good amount of theoretical knowledge of how different layers of computing works.
But, it's not a guarantee that you'll be able to perform on the job.
One intersting thing to note is that I found my masters degrees to be even more useless than my undergrad one. I have both, and so I have the right to say this.
This came as a shock to me since I thought that by the nature of rank, it deserved more respect. Instead, here's what I learned:
- I found my masters classes to be far easier than my undergrad classes.
- Many of the masters students I encountered were completely incompetent.
Of course, not all masters students are incompetent. There are good ones here and there. But if you're expecting me to be impressed by a masters degree, it won't land you any points from me.
In the last decade, numerous coding bootcamps spawned, promising $100,000/year jobs upon completion, sometimes in just 3 months. All you need to do is pay the upfront $20,000 in tuition and attend their classes fulltime, meaning you'll probably need to quit your job or at least take an extended leave of absence.
I'm not surprised by their rapid rise–the demand is real, both for employers looking to fill these jobs and for employees to fill them. The economy is simply fulfilling this need.
However, basic human survival instinct should warn you that anything that sounds too good to be true often is.
Coding bootcamps are great for the following reasons:
- As long as you fulfill the basic requirements of the course, you will probably end up with a job upon completion. Not necessarily a good job that has the 6-figure salary or the amazing perks, but a job.
- If you find yourself without discipline or the ability to focus on your own, the structure of a coding bootcamp will help keep yourself from distractions.
- They also provide good portfolio projects that you can showoff to your prospective employers.
But–yes, there are several buts–here's what coding bootcamps don't tell you in their attractive advertisements:
- Only the top candidates get the good jobs that pay the $100,000/year job as advertised. But this is most certainly not the median. It might even be only one student ever. But this then gives them the right to advertise as such, because of the phrase "up to".
- You'll have to work really hard to learn new skills in a condensed amount of time (3-6 months).
- They won't teach you the complete set of theoretical knowledge (data structures and algorithms) you need in order to pass technical interviews. You will need to prep this on your own.
I've heard success stories from people who have gone to coding bootcamp. I've also heard horror stories from employers who hired a coding bootcamp grad to realize that they're totally incompetent.
I'll let you make the decision on whether or not the tradeoffs of going to coding bootcamp is worth it or not for you. Your mileage may vary.
On-The-Job Coding Experience
Similar to the patterns of the above, having on-the-job coding experience can make it easier to get a software engineering job. But it's also not technically required.
Some jobs that might provide you opportunitites to code on-the-job might be analysts, data analysts, business intelligence, any job that requires analytics in some form, any job that requires SQL, any job that requires Excel or spreadsheets, any job that is highly quantitative, etc.
I would say these types of quantitative jobs that have redundant and repetitive data-related tasks have opportunitites for some automation.
And if you'd like to learn some coding to start automating some of these tasks for yourself, I highly recommend the book Automate The Boring Stuff With Python.
The book will teach you how to manipulate Excel spreadsheets, CSV, email, and even mouse-clicking of keyboard-typing. I have a copy, and even as an experienced programmer, I found value in it.
This might be a gateway into getting coding experience on-the-job, even when it's not required in your job description.
Initially, people seem to incorrectly believe they are instantly disqualified without any one of the above. But that is simply untrue.
Again, I'm not saying that any of the above won't help you in your journey towards becoming a software engineering. If applied correctly, they can be great tools towards getting you there. But strictly speaking, they are not pre-requisites.
Some of my co-workers never went to school for computer science or a coding bootcamp, yet they are managing to do just fine. A good number of them actually outrank me and have progressed remarkably fast in their careers.
As Master Yoda famously said to the budding Jedi-in-training Luke Skywalker, "you must unlearn what you have learned". Eliminate all of your assumptions about what it takes to be a software engineer, because anybody with the right work ethic and some basic training can become one.
What You Do Need
Okay, now that I've destroyed all your assumptions about what it takes to get a software engineering job, let's get to the real stuff.
I put together a set of minimum requirements that you actually do need in order to get a software engineering job. If you are missing any of these things, you will
probably most certainly fail.
- Solid work ethic
- Fundamental computer programming knowledge
- Know data structures and algorithms really well
- Resume & Cover Letter
- Bonus: contacts that can refer you to software engineering positions
- Recruiter screen prep
- Technical interview prep
- Behavioral interview prep
Solid Work Ethic
Nothing worth achieving is ever easy.
If you're looking for the easy way out, I suggest you turn away right now because everything you read from this point on requires you to work hard, stay consistent, and keep trying, even when you don't see the fruits of your labor yet. This obviously applies to every reward in life, but especially if you want to become a software engineer.
Decide for yourself right now whether or not you want to commit yourself to this path. If you don't, simply stop right now and save yourself some time. But if you do, give it your all and don't quit. Delay your gratification until the end, and you will receive it.
Learn the Basics of Programming
Most universities will start their computer science students on an introduction to programming class. Coding bootcamps will also teach this, but they'll compress it into a few days.
If you're completely new to programming, I suggest you start with the Python programming language. It's easy to learn and is the programming language that most resembles English.
I won't teach you how to program here–there are several great tutorials out there for you to learn from. At the very least, even if you don't pick Python, be sure you understand the following:
- Variables and assignment
- Control structures (
- Comparison operators
- The difference between
- Arrays and indexing
- Characters and strings
- Iteration (
- Functions and classes
Then, make sure you know how to use these constructs to solve vague problems. You'll know you pass this test when you can:
- Create your own tic-tac-toe game
If you'd like a course to guide you, here are a few I recommend and have vetted:
These courses have all their study materials online that you can review at your own pace, which is nice.
Study Data Structures and Algorithms
After learning the basics of programming, most universities will offer a data structures course and an algorithms course. Most coding bootcamps will gloss over this and only give you the bare minimum, leaving much to be self-studied.
This knowledge is a must. All the technical coding interview questions will be based on this subject. You must be so familiar with this that you dream about this.
As a former TA, I've reviewed and vetted the following courses as being solid:
I'm going to
highly recommend mandate you take one of these. I'll warn you beforehand–the class is hard and is designed to weed out the weak. College students have dropped out of CS because of the difficulty of this class.
Scared? Good. Now you'll treat this subject with respect.
If you don't have a university degree, didn't go to a coding bootcamp, or don't have on-the-job coding experience, having a portfolio is mandatory.
Why? Because you don't have any former credentials and need a way to prove yourself.
And what better way to prove yourself than to actually build something and show it off?
A good way to start building your portfolio is to build a web application because it's simple to do and universally accessible by anyone with access to a browser. Mobile apps are also good as well. If you're inclined to go above and beyond to have a real back-end, consider using AWS as well.
Here are some ideas to get you started in order of difficulty:
- Build a tic-tac-toe game
- Build chess
- Build sudoku
- Build a diet-tracking app that logs all your workouts and meals
- Clone Twitter
- Build a news aggregator
- Build a blog from scratch (mimic Wordpress or Ghost)
The sky is the limit. In fact, if you get really good at building up your portfolio, people will start reaching out to you.
Resume and Cover Letter
I hate the word resume. Instead, treat this as a brag sheet.
Out of all your achievements in life, what's worthy of making it onto your brag sheet? Just kidding.
Here's what needs to go on your brag sheet:
- Contact info (name, email, phone, address)
- Work experience
- Projects/Portfolio items
- Languages/Technologies you've worked with
- Formal Education (if any). GPA, major, any distinctions or awards.
Here's an example of the resume I used when applying to software engineering positions:
And yes, you do need a cover letter as well. Boring as it might be, but it's just part of the standard process.
Here's my example of a cover letter:
Cold applying is good. Referrals are better. Here's why.
I will only choose to refer someone that I believe stands a chance. This is because I want to maintain my referring credibility. If I refer some random unqualified person, the company will not trust my future referrals.
That's why referrals are powerful–it gives the recruiters a filtered candidate. Compared to a cold application that hasn't been filtered, the extra layer of credibility means less work for the recruiter, which is always good.
Go ask your friends (or your friends of friends) about their company and a referral if possible. Your chances of hearing back from a referral are much higher than a cold application.
And if you don't like to socialize, then you're going to suffer for it. Welcome to the real world, where connections actually matter.
Preparing for the Recruiter Screen
Before the recruiter lets you move onto the rest of the interview, they want to make sure you are worth the company's time.
Here are some sure questions they will ask you:
- Tell me a little bit about yourself.
- Why do you want to work for Company X?
You will need to have a pitch for yourself and research the company you're interviewing for.
There is nothing hard about these questions. Just be honest and paint yourself in a positive light. Recruiters will only deny you if they don't think you're normal.
Just talk to the recruiter like a normal person. They are people too. Don't try to showoff and risk looking dumb.
And always ask a lot of questions about the company. Recruiters love talking about themselves and the company.
Preparing for the Technical Interview
If you obediently followed my instructions and took a data structures course, this step should be significantly easier because you are already armed with the necessary theoretical knowledge.
Now it's time for execution–when given a coding question under time pressure, can you solve it accurately and optimally?
Keep in mind that when you're in an interview, you won't have a computer with you, which means you need to write your code by hand on a whiteboard. So don't get too cozy with your editor and its auto-completes when you practice.
Perhaps the most famous prep book is Cracking the Coding Interview, written by a former Google engineer. I used that book to prep and can attest that it's a good start.
If you want more problems to solve at a higher difficulty, I recommend Elements of Programming Interviews. This book's solutions are really well-written.
Go through as much of both books as you can, and then start doing at least one problem per day on Leetcode. Don't worry about the hard problems–just focus on the medium problems.
You know you're ready once you're able to consistently solve random medium problems within 45 minutes with best runtime and space complexity (if you don't know these terms, go back and study your data structures and algorithms).
Preparing for the Behavior Interview
Even though it's a technical job, you will still be asked behavioral interview questions. Would you want to work with someone that can't collaborate?
Didn't think so.
Neither do the people at the company you're trying to get into.
Do any of these questions scare you?
- Tell me about a time when you handled a challenging situation.
- Tell me about a time when you made a mistake.
Fear not. Even these types of questions have a formula.
Allow me to introduce you to STAR:
I'll walk you through an example for the following question: Tell me about a time when you made a mistake.
- Situation: In one of my projects, I made an operational mistake that caused complete data loss in one of our database tables.
- Task: Thankfully, the mistake was not costly this time around, but the impact could have been much worse had we been live. I needed to make sure that this problem doesn't happen again.
- Action: I documented this specific edge case in our runbook (or Standard Operating Procedure) and explained that the impact of this mistake is data loss.
- Results: Post-launch, because we strongly enforced following our processes (runbook and Standard Operating Procedures), we didn't encounter this issue. Furthermore, because of this incident, I and my other teammembers developed a strong documentation culture of writing down every possible edge case that can lead to catastrophe.
The way to prepare for behavioral interviews is to look up a list of behavioral questions and prepare your responses.
Always make sure you talk specifically about what you did, not what your team did. And make sure to paint yourself in a positive light.
All in all, you should probably have about 5-10 stories that you can recycle for different variations of these types of questions.
Frequently Asked Questions
These are a list of questions I get most often. If there's a question that you don't see on here that you'd like me to answer, please feel free to get in contact with me and ask. I will continue to update this list as more questions come in.
If these questions have longer explanations, I'll provide a brief summary here and link the rest to another blog post.
If I've never programmed before, what language should I start with?
While the choice of programming language is mostly personal preference, if you're completely new to programming, I recommend Python to start.
Python is easy to learn, elegant to read, and will force you to indent your code properly. It's also really easy to setup, no matter what operating system you run (Windows, Mac, or Linux).
How many programming languages do I need to know before applying for a job?
Quality over quantity. If Candidate A knows 1 language really well and Candidate B knows 10 languages at a very shallow level, I would prefer Candidate A.
Point is, programming languages come and go over time. What's popular today might not be popular 3 months from now.
That said, I do recommend knowing 1 fairly well and knowing another 2 moderately. This language diversity should give you enough exposure such that you can pick up any new language with relative ease.
What are the most popular programming languages in the industry right now?
Not in any particular order, I will list out what I believe are the most popular programming languages used for different types of work.
Feel free to disagree with me on this–depending on your experience, I'm sure you'll have different opinions as well.
Python for scripting, data engineering, and data science.
Java and C# for web service development.
C++ in games, high performance computing, databases, and web servers.
C in embedded systems.
SQL for querying relational databases.
What computer do you recommend for me to learn programming?
If you already have a working computer that has at least 8GB of RAM, I recommend you simply keep it and use it to save on the extra expense.
If you don't or if you are looking for an excuse to buy a new computer, here are my recommendations.
If money is not an issue and you can afford this, I recommend the following: Macbook Pro with 16GB RAM.
The reason for a laptop instead of a desktop is because laptops are more portable, which means you can learn from anywhere.
The reason for 8GB RAM minimum is because modern applications consume a lot of memory, and I don't want you to suffer wait times that are too long.
The reason for a Mac over Windows is because the Mac operating system descends from BSD, which descends from Unix, whereas Windows is based on MS-DOS. I can write a whole article on why I prefer Mac over Windows.
Super Low Budget Option
If you're trying to go for ultimate affordability and are willing to sacrifice portability, I actually recommend the Raspberry Pi 4, 8GB version. It costs less than $100, but you'll need to buy a keyboard, mouse, and monitor. It's powerful and small, although not portable because of the tradeoff in cheapness. Still good though.
If you made it all the way down here, congratulations.
If you now have a burning desire to go do and learn all these things, even more kudos to you.
If you know someone else who wants to become a software engineer but doesn't know how to start, please pass this along to them!
The path to becoming a software engineer is not an easy one. But it's most certainly a rewarding one.
In addition, this is not the only way to become a software engineer. This is simply my recommended route.
I hope this article was helpful for you if you're trying to pursue the path to becoming a software engineer. Please comment below on which path you've decided to take and if there's anything I might have missed.
Every weekend I write about some thoughts, life lessons, and interesting things I came by for the week. I'd love for you to join.