#A letter for new programmers
I originally wrote this letter to a grade 12 student (no programming experience) who was thinking about getting into game development and was wondering whether to go to university. He was considering enrolling at either University of Manitoba or Red River College (two schools in his city).
My background is that I'm a programmer from Canada with about 4 years of casual game development experience. I'm a third-year Computer Science student at the University of Waterloo, and am currently partway through a 4-month internship at Microsoft.
Please be aware that this letter is based entirely on my personal experiences and opinions and is not based on research. While I hope you will learn something new by reading it, remember that not everything that worked for me will necessarily work for you. If you have career and education questions about programming, consult as many people as you can. Two online forums I recommend are http://www.stackoverflow.com (for technical questions) and http://programmers.stackexchange.com/ (for non-technical programming questions).
If you have questions for me after reading the letter please reach out at firstname.lastname@example.org. I can answer questions about computer code you're writing or about career/education choices.
I want to give you the best perspective possible so I'm going to try to explain in general how the programming world works, after which I will address any specific questions I missed.
###Reputation Programmers are judged by their peers and by employers largely based on demonstrated skills and experience. Someone with a bachelor's degree in computer science but no real-world experience is worth nothing to an employer compared to a high school grad with a slew of cool projects on his resume. If you don't go to school, and spend the next three years studying game development and becoming an expert on your own, game companies would rather hire you than an MIT graduate. I know this from experience: I spent the last four months working at a game development company in Silicon Valley (paid internship) that hired me before even confirming with my university that I was a student. What they did care about were my skills and experience, which they verified and tested extensively before hiring me. Think of it like hiring an artist - nobody cares where you came from. They only care what your art looks like.
Take-away: Whether or not you get a degree, if you want a good programming job you must personally ensure outside of school that you are an accomplished programmer that has completed cool projects.
###Learning to Program You should not depend on any institution to teach you how to program. The reason for this is that if you meet the standards at school, at best you're on-par with thousands of other students. To separate yourself from the pack you need to work on your own to become proficient beyond what any school can offer. You may learn some things at school, but you will learn nothing that you couldn't learn easily on your own, and there is a lot that you won't learn at school that you should learn if you want to be a good programmer.
Programming is the most accessible and beginner-friendly field in the world, because so many programmers understand the internet and thus put helpful information on it (wikipedia.com, stackoverflow.com, cplusplus.com, etc). You should exploit this to become proficient outside of school. If you do this and go to school you will probably hate school because you will already know everything they teach you by the time you learn it. But that's okay because you will graduate as an expert with a degree instead of a novice with a degree.
I cannot emphasize the disparity between these outcomes enough: The difference between $15/hour programmers at local IT companies and $75/hour programmers at Google in California is that the $75/hour programmers spent an enormous amount of time teaching themselves how to be really, really good at programming before they went to Google.
Take-away: Learn to program on your own regardless of whether or not you're enrolled in school. You'll be surprised how far you'll go :)
###The Importance of Mathematics
It is possible to become a very good programmer without touching any math concepts at all. However if you don't develop a strong mathematical skillset you will find yourself feeling vulnerable whenever math is required for a programming task - and it's sometimes hard to predict when that will be.
For example, suppose you want to write a computer program to figure out what the main colors are in an image. This seems like it shouldn't require much math right? Well, after some searching on the internet, you'll find that the best way to do it is to sort the pixels into clusters based on their color, and the best way to do that is with Gaussian Mixture Models (GMMs). Further research will show that GMMs are an extension of multi-variate gaussian distributions which generalize gaussian distributions - a tool in statistics. If you keep reading you'll see that to write efficient code that uses GMMs you will need to understand concepts from several areas of math at an undergraduate level.
In fact you'll find that many super cool areas of programming (for example machine learning and artificial intelligence) require a very strong handle of statistics, calculus, and linear algebra. Luckily there are fantastic free online courses you can take to develop skills in those areas: http://coursera.com, http://udacity.com, http://khanacademy.com, and http://ocw.mit.edu/ .
If you're still not convinced, be aware that a weak math background will limit your employability severely. You won't be able to work in the games industry and in general most employers will be hesitant to hire you if they feel your lack of math skills makes you less versatile.
Take-away: Learn some math!
###Going to School You should go to post-secondary school for two reasons. The first is that if you don't go to school, you will never be able to work as a programmer in the US (where almost all of the cool jobs are) or in most other countries unless you already have citizenship there. Ask a lawyer if you don't believe this. Second, one of the best ways to increase your programming street cred (very important) is to get internships, and most companies recruit through schools. Here is basically how it works: If you're not in school, companies will consider you only for full-time employment, which you won't be eligible for due to lack of experience. But if you're in school, they can't hire you full-time so they consider you for an internship which is easier to get and helps build your resume (and gives you experience). Then later you'll get hired full-time because you have internship experience.
Note that in order to get work visas, your degree must be a 4-year degree in Computer Science. So make sure you get a legitimate University Degree from an accredited university (like U of M). For example I would not recommend that you go to Red River.
Take-away: If you don't have US citizenship, you must go to school - end of discussion. Otherwise, go to school anyway to get internships, and then maybe quit once you feel that your resume is impressive enough to get a job.
###Getting Internships While you're at school, you have a very unique opportunity to jump-start your career incredibly quickly if you can snag impressive internships (say for example, a startup company in Silicon Valley, or a well-known company in Canada). Employers are well-aware that students who've learned to program on their own are as valuable as full-time employees, so they pay accordingly. As such it's not uncommon for internships (especially in the US) to pay $5,000+ per month for students who know enough to contribute at the same level as a full-time programmer.
There are two things you must do to get good internships:
Seem impressive. To do this, you should have an array of personal programming projects that you have completed. Perhaps games, websites, simulations - whatever you can do to seem interested, interesting, and proficient. You should probably put up a simple website to show off your portfolio (don't bother hiring a website designer - use a website template from a site like http://themeforest.com/ - it's cheaper and faster and still looks great).
Be good at interviewing. This comes with practice (so get lots of interviews your first time around if possible) but you should be comfortable answering soft questions ("describe a time you had conflict in the work place", "tell me about yourself", etc) and hard programming questions. To get good at answering programming questions, you should scour the internet for example problems and practice them until you feel like you've seen them all.
Some schools, like the University of Waterloo have integrated internship programs where you do at least one internship per year, starting in first year. This is ideal. U of M doesn't start their program until 3rd year or so if I recall correctly, but you should seek out an internship for your first summer after first year anyway. You'll want to start applying around January (the internship will start around May) so that means you should start sharpening your skills and resume immediately.
Take-away: The main benefit you get from school is that you can get really cool programming internships. Make sure you get some.
###Make sure you enjoy it There are some fields in which you can maximize your proficiency by largely focusing on excelling in school. For example teaching, mathematics, etc.. With programming, because it's possible to excel so much more if you learn and work on the side, some people will do it and if you don't you'll constantly feel left behind. So I would not recommend programming as a career unless you enjoy it since it requires a lot of extra-curricular commitment. On the other hand, if you do like programming, your life will be awesome because you'll spend lots of your free time dong something you enjoy, and because of that you will have an amazing career.
####Final take-away: Go to an accredited university for a Computer Science degree, get good internships, and don't skimp on math. Also constantly work to become a better programmer on your own.
###In terms of game design, which language(s) would be the best to learn first?
Right now, for game development the two languages I would recommend are:
Actionscript 3.0. This is the language you can use to write flash games. The great thing about flash games is that just by submitting them to various gaming websites (like newgrounds.com and kongregate.com), thousands of people will play your games over the course of several days and they'll give you feedback. To see this in action, check out http://www.newgrounds.com/games/browse and notice how many of even the amateur games that were just submitted have hundreds of views.
C++. 90%+ of hardcore games (console games, triple-A PC games etc) use C++, so if you ever want to get into that kind of game development you should learn C++. Also you should learn C, because it's used for a lot of game engines, and understanding how C works is instrumental in understanding how C++ works.
Other good ones:
- C#: Good to know because it's used for Microsoft's XNA game development environment. So you can use it to write Windows games and Xbox 360 games.
- Java: android games.
- Objective C: Iphone games.
- Python: easy to learn.
To start, I would just pick a language and run with it. Learn the language, learn things about game development. There's a lot of debate about which languages are good to start first, but the only wrong option is to not start at all. Pick a language and start today!
###Should I be thinking U of W or Red River College? (Or somewhere else for that matter)
If you're going to university this coming Fall, you already have acceptance to certain schools (probably U of M and U of Winnipeg) so you should go to U of M and not waste a year applying elsewhere. U of M is gaining a decent reputation as a CS school and has a co-op program that starts in 3rd year.
However, if you're going into grade 12 next year, you can apply to other schools. The schools you want to apply to are University of Waterloo (first choice; full disclosure: I'm biased because I'm going here), and University of Manitoba (second choice).
UWaterloo (UW) is fantastic because it has one of the best internship programs in the world (they call it co-op). UW has a job board exclusively for UW students that makes it much easier to get co-op jobs, and has a great reputation in North America and in other parts of the world. If you look into Waterloo you'll notice that you can apply for acceptance into either Software Engineering, or Computer Science. I recommend CS for two reasons (full disclosure: I'm a CS student). First, the courseload is lighter so you can spend more time developing as a programmer. Software engineers waste a lot of time on irrelevant courses like management and chemistry that they must take as part of their engineering requirements. Second, the lighter courseload means there's more flexibility, so if you want to take certain math courses in CS you're free to do that. Software engineers do not have that option.