From CPA to Google

A Guide

Di Fan
13 min readSep 25, 2018

Note 1: I was a Certified Public Accountant licensed in Massachusetts from July 2016 to June 2018.

Note 2: I will use ‘programming’ and ‘coding’ interchangeably in places where I find the difference negligible.

If you are reading this article, you are probably like me, who did not go to college for a CS degree. Still, the CS graduates we have today cannot fully meet the ever-increasing demand for good software engineers, providing opportunities for people like you and me to start a new career.

For many reasons, a lot of people, especially women, never seriously consider software engineer a viable career option. While software engineering does have its own dimensions, I believe many people, regardless of their gender, race, education background, or proficiency in math, can make a good software engineer as well as a better living, after spending a reasonable amount of work.

So, what makes a good software engineer? Good software engineering demands dedication to the work product. Your users will rely on your work in their daily life, business or otherwise, and they likely rely on it for years, if not decades. Average software engineers simply build a solution that works, while good software engineer build solutions that can withstand the tests of time.

If you like solve problems and have a unquenchable appetite for excellence, then read on. I want to share with you my experience of switching into programming career, so you can decide whether it might be what you want.

0. About Me

I don’t know what I want to do for my life.

I majored in accounting in college, because I never went to the introductory class but still got a perfect score. However, I had no idea what an office job is like or what is a CPA.

Since the stuff made sense to me, I worked as a public accountant in tax for a year and so. Then I realize that the work I did on daily basis was so standardized that it can be described in a step-by-step process.

Here entered programming. From December 2016 to June 2017, I learned from scratch some VBA to work magic in Excels. I googled and Stack Overflow-ed everything, from what is a loop to how to open a file inside my coding environment (oh and what is an environment anyway?).

After a few months, I created my first program that can complete a standard tax reporting process in seconds; it would take an experienced tax associates 10 to 15 minutes to do the same thing while inevitably leaving some errors.

I was astonished by the power of programming. Programming is about trading time with space (or vice versa). Given that the only thing a person really owns is his/her time, programming has so much potential to improve the quality of one’s life.

As a result, I invested in myself by taking a coding bootcamp in NYC. By the beginning of 2018, I broke into the tech industry as a developer; six months later, I decided to move to California and very very luckily landed a job with Google.

I will go into details about the learning process soon, but first let me go over a couple reasons that you should learn programming. Feel free to jump ahead.

1. Why Should You Study Programming?

Many of my friends, after working a few years, all realize that their career prospect is not as promising as expected. Still, most of them do not seriously consider learning programming as a career alternative. Myths include “I am not smart enough for it” or “My math sucks”, which are simply irrelevant.

Many others already have a strong reason to learn programming: they have these ideas that they desperately want to make into reality. That’s what drove me. In the end, programming is a tool that helps you do something else faster, cheaper, or better.

EVERYBODY SHOULD LEARN CODING

Let’s face it. Everybody should learn programming. It is becoming as essential as English these days. Even though only 20% of the world population speaks English, 50%+ of Internet’s information is in English. (Efforts are also made to make Internet available to everyone in the world) Those who can speak English can then access a much larger body of information. It will soon be the same kind of scenario with programming: it will be everywhere, and not knowing it will limit what you can do and where you can go.

More importantly, it is something that you can learn. We are not talking about learning calculus or soccer or violin. Learning programing (not computer science) should not be so much 1) intelligently demanding, 2) expensive, or 3) exclusive. Everyone, with some work, can gain an elementary understanding of what programming is about, and resources are prevalent both online and offline to get you started. (Even so, this guide aims to show a path to become a professional programmer.)

MORE FREE TIME, a.k.a. HAPPINESS

Programming can potentially make you happier with your job; of course, it will depend on the personality / cultural fit. It is one of those jobs that you can create more output without necessarily spending more time, i.e. a software engineer does not write twice more codes or deliver twice more features when (s)he works twice the hours.

This makes working overtime, a notorious burden in financial service and other industries, senseless in software engineering. (NOTE: for programmers, they sometimes still work past dinner hours just to get something done in a single block of time, but working more in total hours is seldom helpful.)

That’s why work-life balance is not only encouraged but completely possible as a software engineer, and it goes without saying how important true work-life balance is to job satisfaction and performance.

THE JOBS ARE PRETTY GOOD

You might already know about the pay, benefits, and free foods at tech companies, but I think the best thing about getting a good programming job is this — you get a chance to work on products / services that really change people’s life. The product can be a really niche one that only serve hundreds or even dozens client, and it can be something that are relied by billions of users every day. Either way, your work will be actually impactful.

2. How To Learn Programming From Scratch

I would break down self-learning programming into three stages:

  1. Build a basic taste of what programming is about
  2. Practice as much as you can
  3. Form your own strategy of learning and working, and keep learning (Yes, this is a path of never-ending learning)

And of course, you want to at the same time:

  1. Choose a stack that would allow you to deliver end-to-end product
  2. Develop a holistic understanding what good software engineering is all about.

Online resources provide much detailed info on what exactly you could learn and how to learn them, but I would focus on the conceptual framework here.

Below I walk through how I would learn programming, while mentioning all the resources that I have personally used. Feel free to disagree or try something different, as long as it works for you. Some people will advise you to get a CS degree (college or graduate school) no matter what, but apparently it’s not the best solution for everyone for one reason or another.

The whole process is meant to help you:

  1. build a strong working set of technical skills that is job-ready
  2. learn how to learn (almost anything), by yourself (mostly), quickly (without compromising quality)

Or we can cut it down to one: how to quickly learn a working set of skills that would allow you to do your job. This is the reality of the tech industry, where new techs are invented everyday and business requirements keep changing. Mastering the skill of learning would prepare you for, IMHO, pretty much everything out there. Now, going back to what to learn:

THE FUNDAMENTALS

For total beginners, I think the important thing is to build a solid understanding of how program works. Concepts such as loop, conditional, variable, code block, statement would be the corner stones of this stage.

These ideas look extremely simple at first, but if a reader can apply them to whatever kind of work that (s)he is already familiar with, (s)he will likely find some powerful opportunities to automate his/her work at hand.

Because the sole focus right now is to get you started, I would recommend simply start with Python. It’s a cool language, and knowing Python would give you access to enormous great resources written in Python.

There are two resources I would use to learn Python.

1. Learn Python the Hard Way (1–2 weeks)

This is a typing exercise where you simply type in the exercises while trying to figure out what is going on. At the end of the day, programming is about writing (as well as reading) codes, and the only way to get better at coding is to write more codes. I like how this book naturally put you into the actual coding environment to use Terminal, Text Editor, and Stack Overflow, etc.

Some of the exercises can get boring by themselves, but hang in there. Your main goals at this point are: 1) to get comfortable with typing codes, and 2) to think about how these codes can be applied to the business scenarios that you are already familiar with.

2. Composing Programs (2–4 weeks)

This is the Python adaption of the famous programing textbook SICP. After getting comfortable typing some codes in the last step, now it’s a good time to build a strong conceptual foundation in programming. You will use Python as a tool to understand concepts from functions and scope to, brace yourself, OOP vs. FP. These ideas form the building blocks of codes, patterns, and languages, and it will prepare you for learning another language of your choice.

I encourage you to try all the projects as well. They are great exercises to apply the idea you just learned. Some of projects that come with this course come with a GUI (Graphic User Interface), so you can get a feel of what it is like to develop a backend of a graphic application.

Lastly, as always, skip parts that do not make sense at your own discretion.

2.5 Do Something Real with Python

Before moving onto to the next phase, this is a good time to create something ‘real’ with what just learned. Some people might prefer to make a game, think of 2048, minesweeper, or text-based games, etc. Others might want to create a small program that automate some work task, be it exporting data from spreadsheet or combining PDFs into one file.

What you have learned so far might not enable you to complete the job at hand all by themselves. Yet, this is the same reality all software engineers must deal with every day: they all try to solve problems that are at least partially new, while the completely repetitive stuff has been automated.

Whenever there is something that a software engineer has not seen before, (s)he first tries to find out if someone else has had the same problem before by asking Google / Stack Overflow. More often than you might think, the answer would be yes, and if that’s not the case, then you will need to formulate the best strategy to devise a solution for your problem.

Time to rollup your sleeves and practice some Google-fu.

DEVELOPING A STACK

At this point, you should think about what you want to learn next. Eventually you want to know a set of languages and tools that would allow you to deliver a product from end to end, i.e. so-called a ‘stack’. The stack will depend on what platform you will be targeting, e.g. web vs. mobile / native, and what language you would like to use, to the extent such choice is available.

In choosing what stack to learn, you want to ask yourself:

  • What kind of jobs / career / product do you want to work on?
  • What kind of languages / technologies you want to walk with?

To help yourself figure out the answer, you can try researching:

This is also a good time to reach out to software engineers and pick their brains.

Once you decide on to learn a stack, you can either 1) do it by yourself (cheaper at first look, would probably take 6 –12 months) or 2) take a coding bootcamp, if applicable (cost $10–20k, 3–6 months). Even if you decide to take a bootcamp, you will still need to spend a lot of time studying by yourself. It is never possible nor the intent for bootcamps to teach you everything you need for a job.

The value of paying for a bootcamp, in my opinion, is more about going through a structured learning experience, together with peers who are like you. The setup of bootcamp keeps you focused at the topic given in the curriculum, and force you to keep up with the pace of the class. It also gives you access to a group of peers to learn together, who might be able to help you later in your career.

Switchup is a site that compares different bootcamps. Word of mouth can also be valuable here.

One last thing to keep in mind while developing your stack: at the end of this stage, you should have some projects or work that can be put on your resume. After all, we were talking about developing a stack that would allow you to deliver work of such scale. Bootcamps usually put one of such projects into the curriculum; if you are learning by yourself, you should test your skills with some projects as well.

PRACTICE SMALL PROGRAMMING

By small programming I mean solving small coding challenges by coming up with and typing out the solution in a relatively strict time limit.

Most engineers would do small programming to prepare for job interviews, and you want to do it for pretty much the same reason that they do.

First, it helps you get familiar with the language you are using. For learning purposes, you might first try out the simplest question to get familiarized with the language features, e.g. how to tell if a number is even or odd. Gradually, you will find out how to do loop, conditional, closure, and recursion in the language of your choice, and more importantly, you will be able to code in your language quickly and confidently.

Second, it is a natural introduction to data structures and algorithms, which are the focus of (many, but not all) job interviews. Harder coding challenges require the use of certain data structures and algorithms to solve, or to pass a performance threshold.

There are a lot of websites for practicing coding challenges; personally, I have used Codewars, HackerRank, and LeetCode.

Codewars is the most entertaining of all, meaning you are more likely to do it for fun; it also shows other users’ solution once you submit your own, which helps learning. HackerRank has interesting system and question collection, but the way it expects you to process input is simply too much work. Lastly, the famous LeetCode is more heavily focused on interview questions, and its users discuss the approaches for each question on the forum.

KEEP LEARNING

As a self-taught programmer, your learning journey does not stop here. Yes, you can make something cool now, but you probably also start to feel the imposter syndrome. You would want to catch up on the more theoretical computer science stuff now, as it will help you understand how things work better, which in turn also makes you more confident.

TYCS (Teach Yourself Computer Science) is a good resource for that. It covers nine major subjects in computer science that a self-taught engineer should try to dig deeper into. For each subject, it gives several textbooks and online video courses that you can use to study.

If you happened to have some free time, and are between 18–30 in age, I highly recommend you check out 42 Silicon Valley. It’s a free coding school that has no faculty, and students code together in the lab and learn from each other. It provides free dorm (subject to application) and cheap meals ($5–6).

There are other programming retreats and meet-ups that you might find interesting as well. Check out what’s available in your local area.

Some book recommendations

The Imposter’s Handbook — For imposter syndrome, apparently.

The Clean Coder — Plus the other two ‘Clean’ books, on, you know, cleanliness.

Programming Pearls / Pragmatic Programmer — The classics.

Designing Data-Intensive Applications — This is becoming increasingly relevant with the rise of big data and cloud computing. The book is intense, but it’s worthwhile to skim through it.

Advanced Programming in the UNIX Environment — Also thanks for cloud computing, it is not acceptable if you do not know UNIX. Make sure you have learned C before trying this book.

P.S. The self-learning of programming boils down to ‘reading and coding’.

3. How to Get a Job in Programming

Sean Lee has a great talk about how to nail the job search process. Basically, there are only two parts to the job searching:

  1. Getting an interview.
  2. Cracking the interview.

For some, getting an interview will be the bigger challenge, as what they can showcase on the resume is relatively limited. For others, the technical interviews are where they more often stumble.

Non-CS background job applicants most likely do not have enough relevant experiences when looking for a developer position. However, the good news is that things can only go better from there; once you grabbed this first job in your programming career, rest will naturally follow.

To remedy the lack of work experiences, you can, uninterestingly, try to get as much other experiences as possible. For example, personal projects, Github contributions, and Hackathon participation all can be used to show your technical capabilities.

And what about getting into Google, which after all is mentioned in the title? I am glad you asked, and luckily I don’t have to answer!

Steve Yegge wrote a great blog post 10 years ago on how to get a job at Google. It contains all you need to know to prepare for an interview with Google; little has changed since then.

As for the resume round, I am in no position to say what would make your resume stand out from the rest, but I think learning the company’s mission, value, and culture would help you understand if it is for you.

Oh, and one last thing, to get interviews, you have to apply first. This is obvious, but it gets daunting very quickly. Hang in there, do it together with friends and cheer for each other.

-1. So…

It takes quite a lot of work to become a software engineer. It takes even more to be a good one, and it takes yet more to keep being a good one. There are many rewards to it too, which should encourage the hard work. I hope you will find the efforts worthwhile, as we (the species) need good software engineers to carry it forward, just as we also need good candidates in every other occupation. I hope you find this is something for you, and best of luck.

--

--

Di Fan

Traveler, Reader, Dreamer. Writing highly deletable codes.