Back to Blog

Summary

My career began as a QA doing manual testing for ~5 years. It took me ~10 years to realize that my true passion lies in software development. There are many factors that led me to that realization:

  • During a hackathon at work, everyone gathered into a group and no one needed my QA skills. I wished I was part of the cool kids.
  • Throughout my entire career, I've seen a couple of QAs worked so hard including myself and we never got recognized for employee of the month. QA never gets that level of recognition, unfortunately.
  • You are who you hang with. I made some good friends from work, mostly software engineers. Their ambition and always taking their career to the next level is contagious.
  • All of my developer friends built cool gaming apps on the side and as much as I love building gaming props and online board games, I couldn't build one myself.
  • Most software engineers I've worked with are so talented and their willingness to learn is inspiring. It makes me want to be like them and work with them directly.
  • All the companies I've worked for and wanted to stay with, I got laid off because my role is a QA. I came to the conclusion that QA is the least valuable and most expendable role.
  • Tech companies are evolving and a good number of them don't have QA departments. Even great leaders who I used to work with once believed in QA, now no longer believe in QA.
  • In the last few years of my QA career, I felt that my rate of learning is decreasing and passion for QA/Automation is dipping. Instead, my curiosity for software development increased at a high rate.
  • My goal awhile back was to have my own website and build an online version of board games. By being a software engineer, I can leverage my professional skills to easily build gaming apps.

I thought about going back for a Masters of Computer Science, but 2-3 years of not working with a heavy debt didn't make sense. I could go do a dev boot camp, but I already knew how to code. So I decided to do the self-taught route and learn everything on my own. Everything that I have learned is a near equivalent of a Computer Science degree and a dev boot camp curriculum. Below are the steps that I took to become a Software Engineer.

Step 1 - Learn to code

At Grubhub, my former boss Jessica Austin (another top-notch engineer) led the efforts to teach the QA department an accelerated Java course in one week. My 5 years of automation experience contributed to the coding fundamentals.

I have also taken a couple of programming 101 courses (on different languages) via Udemy. It's important to know the basic syntaxes. Books, online docs, online courses, and in-person courses are ways to get there!

These technologies are a pre-requisite in addition to coding and will help towards the interview:

  • Understand agile and how/why the core methodologies add value. Most people follow the process without understanding why it's useful.
  • UNIX: basic commands, VI editor, and file systems
  • Concepts of logging and how to sift through logs
  • Git commands and workflow
  • Write unit tests and writing enough tests to cover all scenarios including exceptions and boundary tests
  • Strong in at least one programming language and a dependency tool
  • Basics of API and implementation of web services
  • Basics of database and implementation of a database; SQL is a plus
  • HTML/CSS is a plus


Step 2 - Take online courses and build apps on the side

I took some online courses on a language/framework and built side-projects to apply what I've learned. The courses cost only $10 and if taught by a great instructor with high ratings and good reviews, the course, in my opinion, is just as effective as a boot camp curriculum. I took a course on data structures and algorithms and that helped tremendously!

I took a nano degree course at Udacity on how to build an Android app. I ended the course prematurely because they were teaching antiquated material and didn't allow me to use modern libraries for my capstone project.

I understood the importance of Javascript for front end development and how useful it is for many frameworks. I took it upon myself to learn Javascript and a front end framework React. I built tic tac toe to apply what I've learned. I ran into many hurdles and the ones I couldn't figure out were answered by Bryan Wain, Sr. Software Engineer.

I have also learned Ruby/Rails because many small Chicago tech companies I looked at is using that technology stack. After this course, I built my personal profile website, a great online marketing tool.



Step 3 - Core programming concepts

One of the common feedback I got from coding interviews is that I don't have good design concepts and it's not object-oriented enough. Many developers highly recommended Head First Design Pattern. It taught me good programming concepts like inheritance, polymorphism, and patterns that I can apply to simplify my code. After finishing this book, I have finally understood how to use abstract classes and interfaces.

I've also read Clean Code. It's a very useful book, especially for take home coding exercises (pre-screen).

Step 4 - Algorithms

Coding exercise
I know quite a number of engineers who have said Cracking the Coding Interview book has helped them obtain their next employment. It's a good book that gives a core fundamental to data structures and basic patterns to solve problems. I didn't do all of the problems since they are very time-consuming.

I have read chapters 1-4, 7-10. For the practice problems, I came up with my own solutions and then coded all of the book solutions until I understood them. Here are the problems I worked on for each chapter.

  • Chapter 1: All problems
  • Chapter 2: All problems
  • Chapter 3: 1-2
  • Chapter 7: 1
  • Chapter 8: 1, 3, 5

I did many practice problems on Leetcode. My goal was to strive for 100% for performance. If I had anything less than 90%, then I would redo the problem to get a better score. I would also look at the solutions and discussions to see how others solved it and try to understand how they came up with their solution. The more problems I've finished, the more tricks I had in my bag to solve problems. Sometimes, I even come up with random problems and try to solve them myself.



What one should know
All in all, I made sure I knew the following:

  • How to calculate O notation and the O notation for each data structure and search/traverse methods.
  • String manipulation, characters
  • LinkedList: single, double
  • Collections: primitive arrays, arrays, sets, hashmaps, queues, stacks
  • Sorting: bubble sort, merge sort, quick sort
  • Trees, graphs, binary trees, BST, creating/traversing/searching
  • Recursion


System Design
I also worked on system design which tests how well one architects a program before writing the code. I used a whiteboard and drew out the classes, methods, relationships, and workflow. The key thing here is not to go into details and coding, but to visualize how the files look like and cover all vital methods of the program. Use polymorphism instead of if-else statements. If I didn't feel confident on these exercises, I would have kept doing more problems.

  • Monopoly
  • Blackjack


Step 5 - Mentorship

Get a mentor! I recommend someone who has been doing it for 10+ years, is at least a senior and a full-stack engineer. They know what you should learn and how to put you on the right technical track. They also help give you confidence and uplift your spirit. I am very fortunate to have the Jake Battle, one of the most talented engineers I've ever known, my former boss, and my friend, as my mentor.


Step 6 - Talk to other engineers

Different engineers will give different advice. Talk to the ones who want to help and offer advice. Their advice is more in-depth, from the heart, and they will go the extra mile for you. Special thanks to these people - I wouldn't be here today without their words of wisdom. Here are some:

  • Reformat resume: Rewrite your resume to make sure it doesn't get tossed out if not formatted properly and make it legible and concise. I added my personal projects, courses, an objective to indicate that I am switching career, link to your leetcode profile, and in a S.P.A.R. format to shorten the bullet points while emphasizing the business value of my work. Take a look at my resume.
  • Make an online presence of your resume and profile: I posted my resume/built a profile on Indeed, LinkedIn job search, workatastartup.com.
  • Take online courses: If you need more examples on data structures or a test framework, online courses will provide a more update-to-date on the nuances, good examples, best practices. It cost only $10 and is only 5-20 hours long. Popular online courses include Udemy, Coursera, Udacity, and many others. -- David Zhou
  • Reach out to your network: Talk to all of the engineers and/or product person you have worked with. They can help get you a phone interview or even a referral to other companies/leads.
  • Learn all of the common data structures and algorithm problems: You never know which ones you will get tested on. -- Brian Gregg
  • Understanding how things work under the hood I am able to tie the O notation with each kind of search and traversals but never really understood how log (n) came about. The moral of the story is to really understand why things come about rather than to memorize a working formula. --Peter Aarestad
  • Persistence: Never give up. Keep striving for it and don't go for other roles because it's easier. On a tangent note, if you did bad on the coding exercise (whether it's on-site or take-home), fix it and resubmit it again asap. -- Landen Zachary
  • Build personal projects: This tells employers that you are eager to learn and is self-taught. Great resume boosters.
  • Avoid bad companies: I got an offer with a not so great company. I call it not so great because they were set in their own ways, used antiquated technologies, and didn't want to learn new things. A lot of colleagues advised against it because I wouldn't learn much and would be wasting my time. I ended up not working there.


Step 7 - Applying for jobs

Linkedin is one of the best sources to look for jobs. Applying through the companies website always seemed like a black hole. I made sure my profile is up to date with technologies and accomplishments listed out. I would ping internal recruiters, engineering manager, or head of engineer and ask for an opening. Even if they don't have a position open, they may open up one if you can prove that you are a go-getter or very motivated. I've had companies that opened up an entry-level position because I convinced them I'm good enough and demanded that they give me a coding test to prove my worth.

External recruiters can be helpful since there may be companies that you may never hear of and they have all of that in their folder. However, most of my jobs were found through networking, craigslist, direct messages via Linkedin.

I always do extra research to understand if the company is worth the while. Things to look for:

  • Look for engineers' reviews on Glassdoor.
  • In LinkedIn, look up all engineers and leaders who are currently working for the company. Anyone who has been there for 10 years is a red flag for me.
  • Do they have any fundings?
  • Google them. You never know what interesting facts you might find.
  • How are their stocks doing (if public)?
  • When did the company start? How long have they been in the field? This shows if they are a growing or a stagnant company.


Step 8 - Prepping for the on-site interview

Prep yourself:

  • Sharpen the programming language based on their tech stack or your strength.
  • Do your homework on the company! Know what the company does and its mission. Play with their app if possible.
  • Dress your best because it couldn't hurt. I wore a suit and tie.
  • Be humble and honest. If you don't know, say you don't know. They can smell the lies and it can count against you.
  • Prepare questions. You should be curious about the company and the department. It shows them your interest in the company.
  • Know what areas you desire to work on e.g. backend or frontend and what your ultimate goal as a software engineer
  • Figure out your salary requirement. Me personally, I let them decide on my salary because if I ask for less, they might give me less. If I ask for more, they may turn me down. The raises and promotions will come with the skills over the years.


Step 9 - Gather feedback through interviews

You get better as you work on more coding interviews. I gather feedback after an interview (take home, phone or in person) and figure out why I'm rejected. I take this as a great opportunity because it spells out your weakness and you can strengthen it. Here is a list of feedback from all the interviews I've taken:

  • Not object-oriented programming enough
  • Broke encapsulation
  • Missing a readme file on how to start the take-home coding exercise application
  • Failed to find and fix a bug during the live coding
  • Algorithm is not performant/optimal
  • Lack of web services knowledge
  • Lack of programming languages/framework knowledge
  • Not fluid enough in the language
  • Missing unit tests
  • Failure to unscramble a hairy codebase and refactor it
  • Not knowing each and every syntax despite knowing how to use the command or syntax


Step 10 - Keep your spirit up

Finding the first Software Engineer job is very stressful. From time to time, I wonder if I am qualified for a software engineer. Whenever I apply for a position or take a coding test, they always ask for something that I don't have and that is very discouraging. The worse is seeing a position that requires 1-3 years of experience. In conclusion, this is more of a user error. When applying for a position, look at the job description rather than the level of the title. If a post asks for > 0 years of experience, then they are looking for an experienced engineer. If they say they are open to 0 years of experience, then that is applicable.

Rejections always suck. After many rejections, I started to lose hope, started doubting myself, and started having a feeling of regret. I had a great SDET career, why am I starting all over again? Did I take the right path by choosing independent learning over boot camp and school? I turned down a couple of opportunities because it wasn't going to get me there; should I have taken it instead?

On a random day, I googled junior software engineers and stumbled upon a blog that brought my confidence back. I learned to take it as a growth opportunity. There is hope and it requires a combination of persistence, confidence, and hard work.

In one day, I got a response from 4 different companies: a job offer during the interview, an on-site interview request, a rejection from a resume submission, and a rejection after taking a take-home interview. It's a whirlwind and it means anything can happen!

I packed Selenium away on November 16, 2018. I opened the books for a ~year. I sent out resumes starting November 25, 2019. I found the perfect company and accepted the offer, both on December 16, 2019. I have finally achieved my dream goal of becoming a software engineer and I look forward to my new journey.