A Guide to Higher-Education for Aspiring Game Programmers
October 11, 2011 10 Comments
DISCLAIMER: I wrote this piece for a South African Game Development Magazine prior to leaving South Africa. It has been some time since I send the piece in for copy-editing and have heard nothing back regarding it so I’m simply going to post it here. The topic is a matter of some debate and the below article is simply my personal opinion! It was mentioned during the initial review by the game development magazine that certain sections of this article are rather inflammatory and we had agreed to remove them from the final piece. Seeing as this is my personal blog I figured I might as well post the entire un-edited version.
Once Again this is simply a personal opinion and should be taken as such!
When asked to write an article for a local game dev magazine, I was initially apprehensive as writing is not exactly a strong point of mine. It was only once I realized that the article might actually benefit some prospective game programmers that it was well worth the effort. That being said trying to find a topic for the article proved quite challenging. My initial plan was to write a brief article describing the basics of vehicle steering and waypoint following. That idea got scrapped once I built a simple test bed and I realized that I don’t know nearly enough about physics of car motion to write an in-depth article on the topic.
While I was still deciding on a topic, huge discussions (read arguments) started popping up in various game dev communities I followed, all based around the same theme - education:
There seems to be quite a lot of debate on what prospective game programmers should study as well as what current college curricula should include. The most common questions still being asked by prospective game programmers are: “What do I need to study to become a game programmer?” and “What do I need to do to help me land a game industry job as a programmer?”. It is these questions that I wish to address in this article.
Now before I carry on, I guess I should provide a bit of background on myself and why that might qualify me to have an opinion on the topic. I’ve been in academia for around 9yrs. I spent my first three as an engineering student, before I decided to pursue my dream of becoming a game programmer. It was then I swapped over to computer science and completed three degrees in the field. All the while I was studying, I was working full-time first as an enterprise software consultant and later on as a senior web developer. The last year and a half of my professional career, I’ve spent teaching graphics programming at one of the leading colleges in South Africa – The University of Pretoria. During my period in academia, I have been actively involved in various subfields like computational intelligence, pattern recognition and image processing. I am now moving onto a job as a game programmer at IO Interactive (Hitman, Freedom Fighters, Kane & Lynch) in Denmark.
I’m lucky enough to have been exposed to the enterprise software industry, the game industry as well as academia. Which I think gives me a broad perspective on what is required of potential game programmers as well as programmers as general. I do need to stress that this is just my own personal opinion and that this topic (as I mentioned before) is quite a hotly debated one.
Game Programming is Hard!
The first thing that I need to say is about game programming is that game programming is hard! It is by far one of the (if not the) most challenging software development fields. As such game programmers (and game developers in general) are a separate breed. Game programmers are not in the industry for the money, in fact game programmer salaries are usually quite a bit lower than those found in enterprise space. Nor do people become game programmers for the comfortable work environments: crunch time is an unfortunate fact of life in the game industry. During periods of crunch you are expected to work 60~80hr+ workweeks for several weeks at a time. Furthermore, the game industry can be rather unstable, layoffs and project cancellations are common as are employee burnouts. At GDC this year, I was told the average lifetime of a game programmer in the industry is around 7yrs, I don’t know how true that is but it’s something that I can believe. In addition to all this, the game industry is also notoriously difficult to get into, especially for fresh graduates.
Now I’m not trying to scare anyone away but this is the truth of the industry. So why the hells would any sane person want to work as a game programmer. Well, the first and most important reason is simply passion. Game programmers love what they do and would not want to do anything else. So far I’ve only mentioned the negatives of the industry but in fact game development is one of the most exciting, innovative and personally rewarding industries in the software development field. Unlike the majority of enterprise development which is repetitive and mundane, there are always new challenges with each new project. Game programmers are by their nature problem solvers and thrive on the constant challenges that they are presented with. Personally, I cannot see myself ever working in enterprise software again.
From a technical perspective game programming is extremely challenging. Game programmers are often tasked with the impossible: creating a high fidelity 3D virtual world with realistic characters and sounds and all in 33ms or less. As such, game programming (particularly in the AAA space) tends to be extremely low-level work and requires that programmers be comfortable with concepts like advanced math, data structures, memory management, some optimization techniques and a basic understanding of OS and hardware architectures. Just because you hacked together a quick game in XNA doesn’t necessarily mean that you are cut out for a career in game programming.
Irrespective of education, programming isn’t something that can really be taught. Just like everything else in the world, programming requires a fair amount of natural talent and a brain that works well with concepts like math and logic. If you struggle with math, that’s probably a good sign that programming is probably not a good career choice for you. If that’s the case then don’t despair, there are numerous other non-programming positions in the game industry like game design, art or production that may be more suited for your talents.
Now before I carry on with study options, let’s briefly discuss the various positions available within the game programming field. While generalist (jack of all trades) programming positions do exist, they are few and far between. The large majority of game programming positions are specialized within a single area of expertise e.g. graphics, physics, AI, sound, tools, network, etc.
So how are you, with no experience in any of these fields, supposed to choose one and specialize in it? How do you know that you will enjoy it or that you will be good at it? Well, I feel that you really shouldn’t make that choice without actually trying each of these subfields first. It is due to this, that I feel the way I do about what constitutes a good game programmer education.
Get to the good stuff: What should I Study?
So I guess the central point of this article is the ‘what should I study?’ question. Well, simply put the answer is Computer Science. As with any other programming field, game programmers are expected to have completed at least a bachelor’s degree in Computer Science. Luckily Computer Science (CS) is a pretty standard course which most universities will offer a degree in.
So why a CS degree? Well, mainly because it will give you a great foundation in mathematics, programming and computer systems. As with any tertiary degree program, CS degrees will vary across universities and in most cases offer some degree of flexibility with regards to subject choices/specializations. At the very least a good computer science degree should cover the following fundamental subjects:
- Linear Algebra
- Discrete Mathematics
- A C/C++ programming course
- Data Structures
- Design Patterns
- Operating Systems
- Software Engineering
- Concurrency / Parallel programming
In addition to these fundamentals you will usually have a choice between specialization electives such as the following:
- Computer Graphics
- Artificial Intelligence
- Compiler Construction
- Network Programming
- Computer Security
In some cases, as in the US colleges, students will be presented with a single course called something along the lines of Computer Science 1, or fundamental of computer science, etc. These kinds of courses are usually a single semester or a year course that will act as an umbrella for several of the above courses. For example, the University of Cape Town (UCT) has such courses e.g. CSC1015 (Problem solving and algorithm development; object orientated program design using Java; number systems) whereas the University of Pretoria (TUKS) has separate modules for each topic (http://www.cs.up.ac.za/courses/list).
With so many options and varying degree programs, how should you choose what program to take? Well, my first piece of advice is to choose the computer science degree program which allows you to take the most math modules. This is good metric of the quality of the degree program, CS degrees that are light on math are usually of a low quality. So to reiterate, try to take as many math electives as you can, as they will be essential later on especially for game programming.
Game programming is pretty much one large math problem. For example, computer graphics is heavily reliant on a good understanding of calculus and linear algebra. Artificial intelligence (AI) concepts are based on the first order logic covered in discrete math courses. Other key computer science concepts like data structures, graph theory, combinatorics and sets are also covered in discrete math courses. Other math subjects like numerical methods, mathematical modeling and statistic will also be useful in your future career as a game programmer. If you have the choice and think you may be interested in physics programming, take a physics module or two as well, they are a lot of fun. In addition to the standard course load, most colleges will let you take additional non degree subjects as well and you are also able to simply attend the lectures for other subjects without actually enrolling in them.
Wow what about electives? Well, I’d advise taking all the C++ modules available and the compiler construction module. Furthermore choose a degree program which offers courses in computer graphics, AI and networks. This may prove a bit tricky since, for example, computer graphics courses are not taught in a lot of computer science degrees in South Africa. Try to take electives that have similar fields in the game industry, they don’t have to be identical just similar enough. For example, network programming might not focus on creating game server but you will definitely learn about client/server architecture and much, much more. Past that, it’s your own choice to take whatever seems interesting to you.
You need to think of college as an opportunity to be exposed to and experience as many different subfields as possible. Don’t think of college as place to specialize, especially not in an undergraduate degree. Think of that degree as an opportunity to learn more about yourself, your talents and your potential interests (especially ones that you never knew you had). The only way to find out if you will enjoy something or have a knack for it is to try it so be smart and make full use of the opportunity college provides you.
In South Africa (and as far as I know the UK, Australia and Canada), we have a postgraduate honors degree, which is similar to a US master’s degree, in that it consists of multiple specialization modules (graphics, AI, etc.) as well as a mini-thesis. It is only a one year degree unlike the US masters which is two-year but content wise, the degrees are quite similar. It is advisable that you do your honors as well if it is an option, once more giving you an opportunity to explore various fields.
Having a master’s degree or higher is not essential for the game industry, in fact I don’t think it really matters. In fact, I don’t actually think your academic background is a key point for getting into the industry. I’m sure it helps but there are way more important things which I will discuss later on. Personally, I completed my master’s degree because it allowed me to spend two or more years researching a game oriented topic while also leaving me a lot of free time in which I could improve my skills, do research on various other game programming topics I was interested in (animation, engine architectures, AI, etc.) and most importantly learn more about the industry. This is a personal choice, and as I mentioned not really essential.
Once you’ve graduated with a CS degree and have hopefully had exposure to most of the various subfields present in the industry. You should also know more about your personal skill set as well as which of those subfields you really enjoy working in. For example, early on in my degree I found out that I really hated things like networking and computer security but I really enjoyed AI and graphics. Conversely a friend of mine went in with a gamedev (in his case graphics) interest, did the security module and got hooked. He now works for one of the leading computer security firms in the world. That for me is the greatest selling point of doing a general computer science degree, the fact that in exploring various fields it might spark a passion for something that you never knew you had. Furthermore, a CS degree will quickly show you whether you are cut out to be a programmer or not.
My advice is to study a standard computer science degree, with as many math and game sub-field related subjects as possible. Once again, if you do find yourself struggling with the math course then I do not advise pursuing a career in game programming. If that does happen, then I would advise you stop and consider your personal talents and what you’d want to do. Try researching one of the other game dev career options maybe you’ll find a more suitable field. In some cases, an average game programmer might have made an exceptional game producer or game designer but they never stopped to think about what their specific skill set is best tailored to and just ran the course of a CS degree. Trying to change career once you start working is exponentially more difficult than simply swapping your course at college.
So yeh, computer science… “But wait, I just saw that ‘University XYZ’ is offering a course in ‘uber game programming’, wouldn’t that be a better option since it like says game programming and stuff?” Well, my opinion: NO! In fact, I feel that specialized degrees do way more harm than good.
Specialized Education: more harm than good?
Recently, a local university, the University of the Witwatersrand (WITS), announced that they will be starting a degree program in game design (they state they have a game design and a game programming degree as well). This is in addition to another local university, the University of Cape Town (UCT), already having a game programming/design degree program as well. In the US there has been an explosion of colleges that are now offering specialized game development oriented programs, most notably: The Digipen Institute of Technology, Full Sail University and Savannah College of Art and Design. It is important to note, that all of the above options are accredited universities and you will graduate with a bachelor’s degree.
It’s important to note that in South Africa, there doesn’t seem to be the distinction between game design and game programming/development degree programs. Game design degree programs are aimed at creating game designers and are similar to a BA degree, whereas a game programming degree should just be a specialized computer science degree. So take this into account when researching your options.
In addition to these accredited universities, there are also numerous “fly-by-night” online courses/college on game development available, such as viCampus, GameInstitute and Train2Game. There are some local options as well: AD Courses. My advice with this whole group of “colleges” and I use this word loosely, is to avoid them like the plague. You will often walk out of these “colleges”, after wasting a ton of money and time, with a diploma that isn’t worth the paper it’s printed on. If you are serious about studying a specialized game development course do so at an accredited university.
Now I’m going to go off on a little rant about specialized degrees, so please bear with me. I’m not saying that all specialized degree programs are bad but rather that you should really do your research before enrolling is such programs.
So what’s the major problem with specialized game development degrees? Well for me, the root of the problem comes in with the strange idea that it is a college’s job to train you for your future career. I think this sort of perception is completely backward. A college’s role is not to train you but rather to prepare you for your future career. What’s the difference between training and preparing? Training implies learning how to do a specific task and only that task. There isn’t a single job out there where you won’t receive some sort of onsite training in the first few weeks you are there. Every company works in a different manner, and there is no way to train you for that. What a college should do is provide you with a fundamental set of skills with which you can understand the onsite training.
Furthermore, I think that specialized degree programs can’t provide as solid a foundation as what a general CS degree can. What these game degrees offer is specialized courses in certain fields often presented at the cost of excluding other core CS modules. For example, I’m curious to know how many of the specialized game programs will teach key computer science topics like compiler construction, functional programming, databases, computational intelligence, etc.
There is also the problem with specialization of key topics like graphics or AI. For example, game AI courses normal don’t cover techniques like evolutionary algorithms, particle swarms, etc. While game graphics courses don’t usually cover offline rendering techniques like ray tracing or other physically based rendering techniques. What these degrees try to do is teach you a small subset of techniques that they feel are relevant to the current game industry and this is my biggest problem with these degree programs! The game industry is constantly evolving and by limiting students to only a small subset of techniques you are stifling the potential for innovation in the industry in the long run.
Pretty much all of the techniques in use in the game industry today were not originally developed for the game industry. In fact, they only became popular in the game industry after some dev went against the industry standard, took a risk and actually used them in a game. For example, compare the popularity of behavior trees (BT) before and after Halo 2, I think you will find that BT wasn’t a common technique whereas now it’s pretty much a game AI fundamental. Particle swarm optimization is another technique that is not covered in game AI courses and yet it is a technique that has been proven to be extremely useful for the offline training of racing game AI systems. I feel that having someone in academia deciding what is and isn’t relevant for the game industry is a very, very bad idea. Just because they can’t see the applicability of a technique doesn’t meant that it doesn’t exist. I feel that the result of such specialized programs will be students with very specialized skillsets, not unlike what an electrician is to an electrical engineer.
The issue I have with colleges creating game oriented courses is one of experience. Most college lecturers teaching game courses (of course not all of them) have never worked in the game industry. So what qualifies them to make decisions regarding what should and should not be included in the curriculum for a game AI course? The AI game programmers guild (of which I’m a member) recently had a huge argument regarding this very topic. If actual game developers, with a dozen shipped titles and years of experience, can’t agree on what’s relevant for a game AI course then how can you expect a college lecturer with no game industry experience to make that same decision? If you can, try and research the background of the lecturers presenting the courses. Most good colleges will have that information on their website. If there is no industry connection or if none of the staff have any industry experience then you are better off finding another college offering a similar specialized program.
Furthermore, speaking from experience, it’s often the case in academia that lecturers are assigned courses in which they have no background nor experience in. So the lecturer will usually pick some textbook that seems to cover the course content, go through the textbook, makes some slides and teaches the textbook content as fact. While this approach works for fields like mathematics, computer science theory, law or medicine. It’s a little different when trying to teach something like game engine architecture, whereas there is universal agreement as to what a queue is or what a singleton pattern is, I’m pretty sure there isn’t any universal standard for game engine architecture. What lecturers will end up teaching is, like this article, just an opinion and last time I checked opinions were not science. Colleges are trying to teach the components instead of the building blocks used to build the components. It’s like teaching a chef that a club sandwich has mayonnaise on it, but never actually teaching them what mayonnaise is or how to make it.
This is an even bigger problem with trying to teach specialized game development degrees in a country where the game industry is, for all intents and purposes, non-existent. Firstly, the reasoning behind offering game oriented degree programs when there is no local demand for such skill sets is beyond me (obviously apart from making money off of naïve students). The second problem with these degree programs is that they are being designed and presented by lecturers with no game experience what so ever. For example, the degree head for WITS game design degree stated on a blog post that she has no experience in game design but because she is a “lecturer”, that qualifies her to structure the degree program and present game design courses. I’m sorry, but does that mean I can go and structure a degree program in accounting because I too was a “lecturer”? I personally don’t think so.
Considering the fact that there is no local game industry to accept these graduates, this assumes that the target market for these graduates is international, then lecturers should try to keep track of what the international trends are. For example, having a 3D animation course within a game development degree is a great idea but then having the course serve as an Adobe After effects tutorial (http://www.wits.ac.za/files/resc48b056eecbe4ac2a21d25697769ce9a.pdf) is pointless.
A 3D animation course should cover things like skeletal animation, animation blending, inverse kinematics and so on. Presenting what is essentially a film editing course under the guise of a game oriented 3D animation course is simply dishonest. This is a great example of the problems with these specialized degree programs, and note this isn’t only limited to South Africa and is a problem all over the world.
Now, I’ve gone on a bit of a rant regarding specialized education but that’s not to say that all specialized degrees are bad. For example, colleges like Full Sail and Digipen are great options because their teaching staff either has actual industry experience or are in fact industry professionals. If you take a look at Digipen’s RTIS (Realtime interactive simulation) degree program, you will see that it includes:
- 6/7 math courses
- 4/5 physics courses
- Both high level and low-level programming courses
- Numerous graphics courses
- AI courses
- A 3D animation course that teaches, wait for it, 3D animation
In fact, the Digipen course is more strenuous than a lot of computer science degrees offered at present. Anyone graduating from the Digipen RTIS degree will not have a hard time finding work in any development field. The problem is not everyone is in the US and not everyone has $100,000 lying around. It’s also very important to remember that Digipen and Fullsail are the exceptions not the rule.
In general, I’m skeptical of specialized degree programs but they aren’t all bad, you just have to be very careful and do your research before enrolling in such programs. Compare these programs with a standard computer science degree and if you notice a large discrepancy between the two programs especially when it comes to math or C++ modules then be very wary of those specialized degrees.
There is also one more consideration with regards to specialized degrees. What happens in the unlikely event that you find that the game industry is not your thing and you want to transition to enterprise? Having a BSc Game Development may end up limiting your options as the HR filtering process in the enterprise is quite brutal. An HR clerk has been told that they want Computer Science graduates, how are they to know that a BSc Game Dev is pretty much a BSc Computer Science? That is also something to keep in mind.
If you are still unsure about your choice, try to get hold of a game developer either via twitter or email and see if they are willing to give you some advice. In my experience, game devs are quite a friendly bunch and are more than willing to answer a few questions.
Portfolios and Side Projects
Okay this article has gotten ridiculously long so I’m going to keep the next section quite short. Now to blow your mind: at the end of the day, what you studied is pretty irrelevant when it comes to getting a job in the game industry. Having a PhD in UBERGameProgamming is not going to make you a better candidate that some other guy with a high school diploma that wrote a real-time ray tracer in his garage. The game industry is all about skills and being able to demonstrate those skills.
A degree is a great way to filter applicants but it is your portfolio that will get you an interview. If you have an outstanding academic record and nothing to show at the end of your studies apart from a degree, don’t expect a call back. Being a programmer, it’s a lot harder to create an impressive portfolio than let’s say if you were an artist. So try to play around with things that interested you in your college class at home. If something in class caught your attention, go home and try it. Firstly, it’s a great way to build up a portfolio of demos and secondly, it’s the best way to actually understand a technique. I started a tiny tech blog to just keep track of all the things I’ve been mucking around with in my spare time and you know what, that tech blog has actually become my portfolio.
Remember that there are hundreds of other guys just like you that are applying for the same job, some of which probably have more impressive academic records than you or went to better schools than you. On paper these candidates look better so you need to make yourself stand out from the crowd and say: “screw my resume! This is who I am as an engineer!” Do something weird or unusual; show the company that you can think out of the box. Don’t just fire up UDK and slap together another shooter mod and send than in.
It’s also not a good idea to hand in group projects or class assignments as portfolio pieces. Companies want to see what you can do and they want to see stuff that’s slightly more advanced than something that was made so that entire class was expected to be able to complete. College assignments are usually set so that the weaker students can still complete them to some degree and therefore make very bad benchmarks of your individual skills. Group assignments also allow you to claim greater credit than is actually due to you and so are usually disregarded.
Another problem, at least for me was that I hadn’t specialized when I was looking for a job. I was doing my masters in AI and yet I was teaching graphics. My blog is more graphics oriented than game AI and yet I was applying for AI positions. This was a point of confusion for most of the callbacks I got, and I got asked numerous times which field I preferred and why. If you know what you want to do, focus on that and tailor your portfolio with that in mind. So obviously, don’t do something like sending in a ray tracer project for a networking position.
In the game industry, so far my experience is that talent is king. There are lots of amazingly talent game programmers that are self-taught and don’t have any college education (for various reasons). They didn’t get their jobs because of their education rather despite it. They got their jobs because of their skills BUT I think if you asked them, the general consensus would be that getting a college education is a good idea.
So now, taking all this into account, why did I spend such a long time discussing education if it’s not that relevant? Well, as I said your education won’t train you but what it will give you is a set of tools which you can then use to learn and improve. The worst thing for me was seeing programmers spend a day trying to solve what is essentially an already solved problem. These programmers are so proud of their solutions and are often oblivious to the fact they’ve simply re-invented the wheel (usually their reinvented wheel is kind of squarish). They have wasted a massive amount of time doing so because they had gaps in their fundamental education and didn’t know that a solution already existed. I myself often identify areas in my own background that are rather “swiss-cheesy” and so I try to fill them whenever I get a chance. For example, I never took a compiler construction course during my degree and now that’s starting to bug me, so reading up on compiler construction is definitely something I’ve added onto my todo list.
As a programmer your education will never end, there will always be things that you may not know and have yet to learn, new technologies to master and so on but it is essential that you know the fundamentals. Just like building a house, you need to ensure that the foundations are strong before you start building upon them. Just like a bad foundation will make a bad house, bad fundamentals will make a bad programmer.