This is an update of a blog post I wrote in 2012. Be sure to look at a comment written by Daniel Azuma, who made a lot of excellent points of his own.

Here are some thoughts for students who are considering computing, including computer science and software engineering, as a career. While these tips are particularly geared for high schoolers going to my alma mater, Monta Vista High School, they can apply to many others.

What do I enjoy about computing?

Computers are capable of doing amazing things, but in reality, they’re really dumb. You have to give them precise instructions on how to do something. If you get it wrong, they can’t guess what you want them to do. Even the capabilities of AI systems are narrow — a speech recognition program can’t recognize images.

I find taking a task, breaking it down into smaller pieces, writing instructions to do those small tasks, and putting it all back together inherently satisfying. You get a sense of mastery by getting a sophisticated piece of equipment to do what you want it to do.

I also enjoy the fact that my work has a direct impact of millions of lives. Every time someone searches for something on Google, code that I have written is executed. I certainly feel like I am making a difference.

My typical workday

As a software engineer at Google, my day is not just about sitting in front a computer monitor, pounding out “code” (the instructions that tell the computer what to do). The image of the solitary hacker is a myth.

Before writing any new code, I need to consider how it will work with code that Google already has. It’s like building a structure — you could slap an addition onto an existing building, but that could destabilize the whole structure. Or you can carefully design your addition so that it integrates well with what is already there.

So I will meet with my colleagues to discuss the problem I’m solving and how I intend to solve it, either face-to-face or through e-mail. I may also write a design document that gives all of us something to refer to.

Sometimes I write code with a colleague, especially if the code is tricky. This process, called pair programming, lets one person type while the other looks up documentation or spot errors on the fly. It can be intense but also more fun, since you’re sharing your joy (and pain) with someone else. It also reduces distractions, since you can’t check your e-mail or social media while your partner is waiting.

Once I’m done writing a piece of code, I then need to integrate it with the existing code. But before I can do that, another software engineer must review the code that I wrote. They may (and probably will) point out bugs that I need to fix before integration. I also review the code of other engineers.

Our project team has short status meetings everyday, which last five to ten minutes. Our larger group has status meetings every week, which often last only fifteen minutes. I also attend other one-off meetings about design issues that affect our whole group, and I answer questions that other engineers may have about the work our team is doing.

So a lot of time is spent designing, reviewing, and communicating my ideas with others, not just programming.

Now you’re interested in pursuing computing as a career. How do you start?

Before College

Before talking about classes specific to computing, I should mention that your other classes are still important. Besides math and science, writing and speaking are the most useful skills in your computing career. If you can’t get your point across to your colleagues, your great ideas will never be accepted.

Perhaps the most obvious way to try out computing is to take AP Computer Science A in high school. Since the test uses the Java programming language, you may want to also take the Java programming class that Monta Vista offers, the year before taking AP CS A.

However, there is another class that Monta Vista offers that gives a broader perspective on computing. AP Computer Science Principles emphasizes basic concepts of computing, through projects such as manipulating color and sound, or collecting and analyzing data through sensors. Most of the work is collaborative, which is how the real world works. And the class does not require any programming as a prerequisite. A design-heavy class such as graphic design, journalism, or drama also qualifies. If computing intrigues you but you still have some doubts, I highly recommend this approach.

If you’re a motivated self-learner, there are plenty of alternative approaches to learning how to program, a fundamental skill in computing (but not the only one), which you can try on your own. You can also try these before going into AP CS.

There are lots of online resources for learning how to program, including:

There are several organizations that run programs for students in underrepresented groups to learn computer science and programming, including:

If you’d like to learn programming in the context of an interactive visual environment, Processing and p5.js are popular languages for creating visual art and animation.

Instead of Java, you could choose another language like Python, which has many conceptual similarities with Java but is less verbose. There are a few tutorials for learning how to program using Python, such as A Byte of Python or Learn Python the Hard Way (I have not tried either of these myself).

There are several systems that lets novice programmers create games and visual simulations. These include:

Tickle for iOS lets you write programs to control drones, robots, and other devices.

The key is to try these out, experiment, and have fun with it. It will take some time and persistence, but the rewards are well worth it.

College

Learning computer science in college is much more than learning how to program. You discover the breadth that CS has to offer, from the math that forms the theory to the electronics that actually do the work.

There is widespread agreement on the top four computer science university programs (in no particular order): Carnegie Mellon, MIT, Stanford, and UC Berkeley. However, there are plenty of great CS programs all over the country, including (but not limited to) Brown, Caltech, Cornell, Georgia Tech, University of Illinois at Urbana-Champaign, University of Texas-Austin, University of Washington, and University of Wisconsin-Madison. It’s hard to go wrong with any of them, so you should also pick a college based on your own personal preferences, such as small liberal arts school versus large research institution.

There are many different ways to teach computer science. For example, Carnegie Mellon, Harvey Mudd, and Georgia Tech are pioneers in designing their programs to attract and keep women and underrepresented minorities in computing, which the field desperately needs.

No matter where you go, I highly recommend doing summer internships. These are becoming more and more important for getting a job after college, or for getting into graduate school. Internships expose you to how different companies operate and give you some real world experience. While I was in college, I did two summer internships (IBM and Microsoft). You should start look for summer internships in the previous fall, in other words, right after starting the academic year. It’s tough to think about summer when school has just started, but there is a lot of competition for internships these days.

If you’re considering graduate school, I also recommend doing undergraduate research work if your university offers the opportunity. For example, Caltech has Summer Undergraduate Research Fellowships.

Graduate School

Unlike other science and engineering fields, getting a Master’s or PhD degree in computer science does not automatically mean you will be earning more money or have higher job status than those with a Bachelor’s degree. However, attending graduate school, especially a PhD program, gives you different types of opportunities than a college graduate.

Getting a PhD in computer science means you want to deeply explore a specific topic within a specialty of computer science. This means that the school you will apply to will depend on what specialty you want to go into, such as artificial intelligence or operating systems. For example, the University of Wisconsin-Madison is well known for databases, while the University of Utah is a leader in computer graphics.

By the time you get your PhD, you will know lots of leading figures in academia and industry in your specialty. Networking becomes a key skill that you learn. You also learn how to figure out what questions are still unanswered in your field, and address it in a way that no one else has before. It sounds a little daunting, but that’s what graduate school is for.

In fact, throughout graduate school you come to realize that there are lots of questions out there, and the real problem is how to pick a problem that you can reasonably answer in a few short years, so you can graduate. Persistence and endurance, more than sheer intelligence, is the key to getting a PhD.

Once you have a PhD, you have the opportunity to get a job where you can look farther out in the future than most people, especially if you become a professor or join a research lab at a company like Microsoft or IBM. These jobs are nearly impossible to get without a PhD. But at the same time, you will become “overqualified” for jobs that only need a Bachelor’s degree. So getting a PhD changes your opportunities, but it doesn’t necessarily broaden them.

Give it a shot

I hope you consider computing as a career. It’s rewarding and satisfying in its own way, and the fact that it’s also in high demand is just a bonus. Even if you decide to do something else later, the skills you learn in computing will serve you well. Good luck!