[Note: I wrote this a long time ago and it may not be as applicable now that there are gamedev programs at universities. You can tell it’s dated by the references to Windows XP and Playstation 2…]
So, you want to get into game programming, and want to know which universities offer game programing courses?
My advice: go into Computer Science. Universities don’t need to offer degrees in game programming any more than they need to offer degrees in writing spreadsheets or writing word processors. Games are a type of program. Learn to program well, and you can program games.
Be careful when you learn things that will be obsolete in five years (DirectX 9, Windows XP, Playstation 2); try to focus on the main ideas instead of the specifics. You don’t want to spend your efforts learning something that will be obsolete by the time you get out of school.
I found most of the courses I took in Computer Science to have some relevance to games:
- Introduction to Programming
- Learning to program is easy. Learning to program well is not. A good introductory course should teach you how to approach and solve programming problems. Given a problem, you first have to find the computer science equivalent. (This is also true in math, where you first turn “word problems” into symbolic equations.) You then solve the problem in the computer science domain, and translate it back into the real-world solution. You need to know what your tools are -- things like scripting, various programming languages, debuggers, libraries, editors, data structures, algorithms, and so on.
- Programming Languages
- You’ll most likely want to learn C++. However, many top universities don’t teach C++ at first. They teach “weird” languages like Scheme or Haskell. Why is this? It’s because these weird languages are easier to learn, and they teach you to really think about the problem instead of the program. When you can think about problems instead of programs, you can pick up new programming languages easily, and the details of the language don’t matter so much. When you learn many different languages, you’ll learn about different ways of approaching the same problem, so that you’ll be able to pick the best one when you have to solve real problems. A more direct application is that these high level languages often have constructs that are very useful in game scripting languages.
- Data Structures & Algorithms
- Data structures and algorithms are key to solving many problems. You’ll want to learn about arrays, linked lists, binary trees, general trees, balanced trees, hash tables, heaps, and so on. You’ll also want to learn algorithms that operate on these data structures, like partition, depth-first traversal, tree rotation, merge sequence, and find-median. Using these basic algorithms, you can define more useful ones, such as quicksort, mergesort, subsequence search, and binary search. You’ll want to know how to decide which data structure and algorithm is best for your problem. In addition, you’ll learn how to combine data structures and algorithms to build task-specific objects, like stacks, queues, priority queues, sets, bags, and maps. Just about all of these are useful when writing games.
- Understanding compiler techniques will let you understand how code is compiled into assembly. This is really helpful when writing fast code. In addition, compiler techniques like tokenizing, parsing, and code generation are useful if you’re going to write a scripting language. Techniques like garbage collection aren’t only useful for memory management; you can use them to save game data. You can also compile sprites, textures, 3d commands, shader commands, and all sorts of other data that doesn’t look like a programming language.
- Operating Systems
- A good OS course really gives you insight into how the software side interacts with the hardware side. Like a compilers course, an OS course can give you good knowledge about how to write fast code. You’ll learn about file system organization (and you often want to write your own to access data off of CD-ROM, or to provide persistent object data), the use of threads (from low level issues like locking to high level issues like when threads are useful), and network communication (multi-player games!).
- A good graphics course will give you theory of graphics instead of just programming libraries. In this day of 3D hardware, you might wonder why you care about learning graphics theory. When you understand the theory, you’ll understand why certain things work better than others. Also, some algorithms (like BSP, oct-trees, object collision, camera angles) are going to be written by you, not by the graphics library.
- Computer Architecture
- Like an OS course, a computer architecture course will give you insight into how the hardware works and how to optimize your code to take advantage of it. In particular, you’ll want to learn about disk vs. memory vs. cache vs. registers, about latency vs. bandwidth, and about CPU pipelining.
- Artificial Intelligence
- Despite the growing popularity of multi-player games, artificial intelligence is becoming more and more an important aspect of games. A good AI course will introduce you to a large set of techniques (heuristic search, planning, genetic algorithms, neural networks, bayesian networks, natural language parsing) so that when you design an AI for your game, you’ll know your options and what the tradeoffs are.
- Especially in multi-player games, it’s helpful to know how to store shared data, search it quickly, and deal with concurrency issues. A good database course should teach you all of these.
I’ve found that I can be a better game programmer by being a better programmer, and I can be a better programmer by understanding a little bit about each aspect of computer science. As you learning something new, think about how it could be used in a game, and write a game that explores that part of computer science.
If I recommend not learning specific technologies, how are you ever going to be able to use them? I recommend not taking classes for them. Instead, learn them on the side. Use the university classes to learn things that will be true for a long time; work on side projects on your own time to learn things that will change. I was always working on a game on the side while in high school and college, and I learned a lot by doing that. Not only did I get to apply the things I learned in class, I also got to learn things that would never get taught in a class.
Don’t limit yourself to computer science. Learn math (vector algebra in particular is useful for 3D games, calculus lets you handle continuous motion more efficiently, and other kinds of math are useful too), writing/communication (good communication is essential when you need to convey information to the user), drama (storytelling is common in games), economics (especially for strategy games), physics (object motion and collision is straight from physics), and whatever else seems interesting. College is a good time to be exposed to a wide range of ideas.You never know which ones will be useful to you in the future.