Monday, May 6, 2013


A guide for prospective game programmers

While I was still deciding on a topic for this article, 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 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.
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 in general. I do need to stress that this is just my own personal opinion and that this topic is quite a hotly debated one.

Game Programming is Hard!

The first thing that I need to say is about game programming is that it is hard! It is by far one of 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; game programmer salaries are usually quite a bit lower than those found in the 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 to 80 hours a week 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 2011, I was told the average lifetime of a game programmer in the industry is around 7 years. 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 hell 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 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 sounds and eveything else in 33 milliseconds or less. As such, game programming, particularly in the AAA space, tends to be extremely low level work. It requires that programmers be comfortable with concepts such as advanced mathematics, data structures, memory management, optimization techniques and a basic understanding of hardware and operating system architectures.
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 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 such as: graphics, physics, AI, sound, tools, networking, 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 sub-fields first.

What should I Study?

The central point of this article is the “What should I study?” question.
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 rather standard course which most universities will offer a degree in.
So why a CS degree? 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 or specializations. At the very least a good computer science degree should cover the following fundamental subjects:
  • Calculus
  • 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
  • Databases
  • Computer Security
  • Microprocessors
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 Fundamentals 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. 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.
Now 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 what subjects seem interesting to you.
You need to think of college as an opportunity to be exposed to and experience as many different sub-fields 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. 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, and do research on various other game programming topics I was interested in (animation, engine architectures, AI,) 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 sub-fields present in the industry. You should also know more about your personal skill-set as well as which of those sub-fields 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 game dev, 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.

Beware of the easy method

Sometimes people say: “So yeah, 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?”
In general, I’m skeptical of specialized degree programs, but they aren’t all bad. You just have to be careful and do your research before enrolling in such programs. Compare these programs with a standard computer science degree. If you notice a large discrepancy between the two programs (especially when it comes to math or C++ modules), be wary of those specialized degrees.
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 programas 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.
On the other hand, there are also numerous “fly-by-night” online courses/college on game development available, such as viCampusGameInstitute 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.
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

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 Ph.D. in ‘UBERGameProgamming’ is not going to make you a better candidate than 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; means 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. First, it’s a great way to build up a portfolio of demos. Second, 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 that 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 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 send 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 talented 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 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 solution and are oblivious to the fact they’ve simply re-invented the wheel (usually their reinvented wheel is kind of squarish) and have wasted a massive amount of time doing so because they had gaps in their fundamental education and didn’t know a solution existed.
I 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 (I took microprocessors instead) and now that’s starting to bug me, so my next step is going to be reading up on compiler construction.
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.

No comments:

Post a Comment