Advice to a High School Student about a Career in Programming

A few weeks ago I was emailed by a student in grade 9 about a career in programming. She had some great questions and I thought I’d share my answers, in case you know any students considering a career in programming or software development.

What subjects/ courses were the most beneficial to you in preparing to become a computer programmer?

Math is kind of the most important subject for preparing to be a programmer, but maybe not for reasons you might expect.

Most programmers don’t use “math” very often in their everyday programming lives, at least not directly. So, you don’t really do calculus, or trigonometry, or really anything like that in most day-to-day programming.

But you do learn a few key things from math (which, by the way, were never clear to me in school! it was only much later in life, looking back, I kinda realized “Oh hey! that’s what’s so great about math!”)

  1. Math is abstract

    Numbers don’t “really” exist in the world: they’re something humans invented, as a model, for understanding quantities of things. So we take a concrete thing, like a bunch of bananas on the ground, and we create an abstract concept of “6” bananas so we can think about them without needing to necessarily always have that many bananas handy. Same goes for trig and calculus too. Planets don’t actually orbit around the sun according to the laws of Newtonian integral calculus, but we use calculus as a way to represent concrete things in an abstract form.

    This is pretty much what programming is! Programming is all about abstractions.

    In one sense this means one piece of code can output different things depending on what you input to it (like, Google will show you different search results for different searches, but it’s the same code that does it).

    In another sense, this means you can think about things at different “levels” of abstraction, depending on what’s useful. For example, if you make an app that saves a jpeg to your computer, your code doesn’t have to think about how that “works.” Your code for saving the file is the same whether you’re saving on a normal harddrive, or a USB thumbdrive, or saving to Dropbox or whatever. That stuff is abstracted away from you as a programmer, which is very useful!

  2. Math uses its own notation

    Math kind of has it’s own “language” (x, y, square root symbols, matrices, integration symbols, etc). Programming kind of has its own language too, “code.” Code uses its own symbols (most of which are different from math), but just like it’s helpful to “think” in the language of math, it’s helpful to “think” in the language of programming (also like math, this takes practice!).

  3. Math is probably the closest thing we have to breaking problems down (but it’s not super great at this)

    Kind of like my point about abstraction above, math is useful as a way for breaking problems down into smaller parts, which is something you do all the time in programming. In math, you might do this when you’re asked to “show your work” but in programming, you use it more as a “divide and conquer” strategy.

  4. Math teaches some logic (but not a lot)

    Logic can be pretty important in programming (although sometimes overrated, some programmers are “too logical” and forget how to be humans). But logic helps you reason about how programs should work. Logic helps you say “I know it’s impossible for the program to produce incorrect results” (but, haha, you will often find human logic is faulty. A lot)

And depending on what sorts of things you program (the field is very broad!), you may actually use some forms of math.

If you do any kind of programming that involves putting something on a screen (like making apps, making webpages, etc), you’ll probably use some basic geometry from time to time (you can think of a computer screen as a grid: X pixels wide by Y pixels tall, so being able to think of a screen like a Cartesian plane is useful).

If you do 3D graphics (video games, computer animation, etc) you’ll probably use a bit of calculus, and a lot of linear algebra (which I’m not sure if they teach it in high school, I only learned it in university—it was like the only math class I actually liked!). But anyway, pretty much all 3D graphics you ever see are the result of doing stuff with matrices and vectors.

If you want to do things like artificial intelligence or “machine learning” (both of which are big topics for search / social network companies (e.g., advertising companies) these days), algebra and statistics are pretty useful too.

BUT! It’s programming really isn’t all math. There’s a bit of it, but it’s mostly foundational (which is lucky, because I’ve always been pretty bad at math; also it turns out computers are pretty good at math!).

Other subjects are quite useful too. A scientific mindset is useful because of its emphasis on investigation and scepticism. Graphic design / art is very useful if you want to make programs people use directly (apps / websites, primarily), because things shown on a flat 2D surface like a screen needs graphic design just as much as posters and magazine layouts do, too. Oh also English is great because well, you’ll still need to communicate with lots of humans when you work with them! Being able to read + write well is always useful, especially if you’re good at arguing for things with essays.

Around how many languages do you have to learn? Which ones are the most important?

(I’m assuming you’re talking about programming languages here, and not human spoken languages. If you’re talking about human spoken languages, English is pretty much the lingua franca of programming, but I suspect knowing Chinese and/or Hindi might be good ideas for the future too!)

The neat thing about programming languages is there are many of them, and which one you use depends on what kinds of programs you need to make (or, how you want to make it).

For example, if you want to make iPhone apps, you pretty much need to know either “Objective C” or “Swift” (these are the languages I use every day at my job). If you want to make websites, you pretty much need to know Javascript (you may also need to know others for web programming, but you definitely need to know Javascript at a minimum).

The good news is, once you learn one programming language, most others are pretty easy to learn, because at a fundamental level, all programming languages work pretty similarly. And while you’ll probably become a pro with a few languages, it’s never a bad idea to eventually become familiar with a bunch of them (not something you need to do when you’re starting out, of course, but good for down the road). Although all programming languages are essentially equivalent, many let you program in a different style, which often means you-the-programmer are thinking in a different mindset.

It’s kind of like with human spoken languages: each language has its own metaphors, it’s own way of expressing concepts. In some languages, it’s really easy to express some ideas but hard to express others.

What degree is needed to be successful?

The neat thing about programming is you don’t need a degree to be a programmer. The vast majority of programming jobs don’t require degrees, most are interested in experience (but there are loads of jobs for beginners too). If you want to work at Google, maybe they’ll require a degree, but the vast majority of jobs don’t.

That doesn’t mean you shouldn’t get a degree, of course! There are lots of benefits to getting one (or many!) but I just wanted to point out it’s an option.

The most common degrees for programmers are Computer Science (this is what I have) and Computer Engineering (if you do this degree in Canada, where I’m from, you’re legally considered an Engineer, you get a ring and everything). They’re kind of similar, but I’ll explain each a bit:

Computer Science: This varies depending on which school you go to, but at a fundamental level, Computer Science (CS for short) teaches you a lot of theoretical stuff about how computers (mostly software, but some stuff about hardware) work. You will learn programming, but CS won’t really teach you how to be a good programmer necessarily (that is, CS usually isn’t about on-the-job skills.. you mostly learn those making programs on your own, or, actually at a job!).

CS will teach you things like “how does logic work” (you’ll take classes like Discrete Mathematics where you’ll learn how to do logic and proofs), you might take courses on computer graphics (like how to program 3D things), you might take courses on computer networks (like, how does information get from one computer / device to another over the internet, across the whole planet?), algorithms and data structures (like, I have a lot of information, how do I put it in a format the computer can work with quickly? this is the sort of thing Google is made of).

CS will also leave you with a feeling of “oh my god how does any of this stuff actually work and not break all the time???” Which is both awesome and terrifying. Like, how do wifi signals work, through the air, invisibly, and so fast??

Software Engineering: I know less about this because I did a CS degree instead. But, SE is more focused on the “engineering” aspects of making software: things like reliability (how do I ensure my program won’t break?), doing specifications for clients (the government needs us to build them software, we need to figure out precisely what they need), that sort of thing.

Both CS and SE involve programming, and both do overlap a little bit.

I’d also like to suggest, though, thinking about different degrees (and yet, still being a programmer!). So as I mentioned, you don’t strictly need a degree in CS or SE to become a professional programmer. You will learn some programming in those degrees, but you won’t end up being a great programmer just because of those degrees. Like most things, being good at programming is usually a result of just lots of practice / experience.

But so anyway, I’d suggest at least exploring the possibility of other degrees too, because they’ll give you different perspectives on the world, which I think are desperately needed among programmers (self-included!). For example, most programming languages today are considered to be “object oriented” languages (which basically means every part of your code is a self-contained abstract object that represents a thing. You might have an object for a Person or a Dog or a Rocket or a Feeling.. basically anything!).

Anyway, the concept of making “object oriented” programming languages came not from someone who studied computer science, but from someone who’d studied biology (Alan Kay). Alan thought about making programs act kind of like cells in our bodies (self-contained, independent, but communicated amongst themselves).

My point here isn’t “do biology instead of CS” but consider taking something else because it will give you different perspectives while programming.

So, biology is a neat example (as are most of the sciences). The humanities are another idea, because, well, humans are important! Also having a degree that forces you to read a lot of books means you’re going to be exposed to a lot of ideas and perspectives.

What is your favorite aspect of programming?

My favourite aspect of programming is its potential to have vast and monumental positive impact on the world.

From a certain perspective, programming has already done this! Computers (laptops / phones / etc) are everywhere, and they’re connected through pervasive networking. And that’s super, incredibly amazing! As a consequence of this, information is much, much more accessible to all those connected (Wikipedia, Google, even looking up things on Youtube! And, I’m a little biased because I work for them, but Khan Academy is pretty great too!). Communication is more or less effortless: within seconds you can be texting or calling or emailing or video calling (!) anyone else on the planet (!!). None of this would be possible without programming, and that’s really, really cool.

But from another perspective, I think there’s a lot more positive impact programming can have on the world. You can look at programming as a “way to make things” (like apps, websites, etc) and it definitely is a way to do that. But you can also look at programming as a way of thinking, which is something we don’t really do very often with it.

For example, when we learn to read and write human language, we do so for a few reasons.

One reason is so we can record ideas: I can put my idea down on paper (or an email or whatever) and then later, someone (maybe even future-Me) can read it and understand my idea (and of course, the invention of writing revolutionized humans when that happened! yay!). This idea-recording is good for all sorts of things, like remembering stuff (like, I can write something down and my ideas will live on after I die, that’s cool!), communicating (like this email!), or expressing ideas (like novels or essays which make arguments).

But another reason we learn to read and write (and I think one we don’t so often talk about) is because when we write, it changes the kinds of ideas that we have. Like, the very act of writing something down changes the way we think, the way we express ideas. Writing an essay isn’t just recording words you would have otherwise said aloud; writing an essay uses language in a more structured way than if you were just speaking the words. And writing an essay lets you make an argument in a bigger way too: probably nobody will listen to you speak aloud an argument for an hour (and it’d probably be very hard to make a coherent argument that way, anyway!), but they can sit and read through a written essay.

Likewise, programming can be (though these days, it often isn’t) used to record ideas, too. And similarly, these ideas are different kinds of ideas than if you were just thinking them in your head, or saying them out loud, or even writing them down.

While writing lets you put down an idea word after word, one thing leading to the next, in a very linear way, programming can have ideas that aren’t just one thing after another, but are complex. And programming lets you simulate ideas too, so you can play with them and explore them (think about reading about how cities and traffic work in a book, vs playing a game of Sim City, where the city is simulated by a program. It’s not just dead words, but active, moving things you can poke around at and play with).

This is the kind of thing I love about programming!

I imagine a world where everyone knows how to program, not so they can become professional programmers, but so they can learn how to think about complex things (like, how does the ecosystem work? how do cities work? how do viruses like HIV or the flu spread?). Just like we teach everyone to write, but we don’t necessarily want everyone to become a novelist or journalist, I want everyone to learn programming too.

I have been looking into the topic of women and minorities in the field and discovered there haven’t as many in recent years. What do you think has contributed to that?

I think there are a few reasons, but I think the biggest one is there is unfortunately a lot of sexism (and other forms of excluding POC, etc) in the programming industry. Luckily there are a lot of amazing people working very hard to correct this in our industry. It absolutely will not happen overnight (and sadly, sexism and other forms of oppression aren’t just in programming), but there are good efforts being made by really good people.

Another reason, related of course, is programming is often something portrayed as “for boys / men” and not for “girls / women.” (Which I will come right out and say is a load of crap! There is absolutely nothing about a person’s gender / ethnicity / ableness / etc which would make them less good at programming). Again, there are awesome people working on this. There’s the Goldiblox line of toys, which are designed as engineering toys for girls (this isn’t strictly related to programming, but it doesn’t hurt!). There’s also Hopscotch (a company I used to work for), founded by two women who wanted to make programming for girls and boys.

So yeah, unfortunately the industry has a sexism problem, that lots of people (myself included) are trying to help, but that’s probably the reason why there aren’t as many women / POC / etc.

So there you have it, I hope my mountain of text is useful to anyone considering becoming a programmer. Software development has its challenges, both technical and social, but it’s still a wonderful field, and it’s improving every day.

Speed of Light