⚠Update – I've since changed how I think about this topic, but I'm leaving it up for posterity. See this article for my more recent thoughts.
How's that for a grandiose title, eh? Hopefully it's not an entirely unassailable goal for the following article, though. At the time of writing I am approximately halfway through a yearlong software internship at Rare where I've been working on the recently-released Kinect Sports: Season Two for the Xbox 360. In theory, then, everything I've done to get here should be fresh in my mind. And hopefully some of it will be of use to other budding game programmers out there.
Disclaimer: This is aimed specifically at programmers and not artists/designers/penguins, etc. I also make no claim to being an expert on the subject, but the following is what worked for me.
Disclaimer Two: What follows are my own personal views and opinions, none of which in any way reflects the views of my employer or anybody else.
Step One – Fall In Love #
Do you love programming? Do you gladly code away in your spare time? Does programming fill your soul with a burning sense of something or other? If not, you should probably turn back now. I'm not just talking about games programming specifically either. If you don't enjoy problem solving, architecting code, debugging (to some extent), working to specifications, working in a team; all that great stuff â€" are you sure a career in programming is for you?
Just because you enjoy games as a consumer doesn't mean a career in the industry will be all fun and games (sorry). My experience so far is that the games industry is a fantastic place to work. But that wouldn't be the case if I didn't enjoy what I was doing on a day-to-day, hour-to-hour basis: programming. Naturally it's not always easy to tell if you really love something until you've spent a large chunk of time doing it, so that's exactly what I advise you do! (See Step Two).
If you're going to discover that programming isn't really what you want to be doing, isn't it better to do so sooner rather than later? The dropout/transfer rate for my University course is unusually high precisely because lots of people don't know what they're getting themselves into. Only after spending thousands of pounds on tuition fees do they discover that they'd rather be doing something else. That's a thought that scares me greatly.
As for specific languages, C++ is still the mainstay of the games industry, so you're going to want to be nice and competent with that. But it's worthwhile pursuing other languages as well. C# is a common choice for tool programmers, while Lua (and other scripting languages) are increasingly being used for gameplay code. Whether or not you want to specialise in those (or other) roles, you'll be a more versatile (and arguably more valuable) programmer if you don't limit yourself to a single language/tool/platform/paradigm.
Step Two – Make All The Things #
With all that in mind my most important piece of advice is to constantly be making things. Learning enough of a programming language (even your first) to start doing interesting things is trivial with the resources available online and elsewhere. The more valuable effort is to be constantly using and improving those skills by creating things. It doesn't matter if you build absolute rubbish of no practical value – even that can be worthwhile if you learn along the way (which you will).
I'd also recommend making things that you're passionate about. Pick projects that will provide you with enough motivation to actually finish them (a very handy skill to have). You don't always have to make games either. Little applications which you might use in your day-to-day computer-centric lifestyle can serve as great side projects. Chances are you will want to make games, though, and that's great – just bear in mind that even simple games can prove to be surprisingly hard work.
If you're just starting out, simple clones of Space Invaders or Breakout are classic "Hello World" games to try your hand at. I highly recommend trying to finish and polish little projects like these. Don't stop after you've got the basic mechanics in place. Add menus, an in-game HUD, a high score table, sound effects, a couple of brand new features of your own, etc. Even something as simple as Space Invaders can prove to be a nice little portfolio piece if you polish it up enough.
If you choose to study programming at University/elsewhere (see Step Three) it's important to continue to make things in your own time. Employers tend to place more value on personal projects than coursework because they demonstrate valuable qualities such as self-motivation and passion. In fact, my application for an internship at Rare mandated that I include the source code for at least one project (a Ray Tracer, in my case) that was not coursework.
Step Three – Get Qualified? #
Breaking into the industry is definitely easier if you have a degree under your belt, or if you are at least moving towards acquiring one. Not just because it will (hopefully) teach you lots of useful skills, but because it can help provide a foot in the door. Almost any job application for a programming/engineering role (even at the entry/graduate level) will likely mention the need for previous industry experience, or work on a shipped title. A delightful catch-22!
What's the solution? Internships/placements! I like to think that I'm a reasonably capable programmer, but would I be working the industry now if I hadn't gone to University? Doubtful. I might have been able to teach myself a lot of the technical knowledge I'd need, but I'd still be under-qualified for even entry-level positions. For better or worse, most internship schemes are only accessible to current/recent students, but I cannot recommend them enough.
Having a degree will also make your life easier later on. Working abroad or (should you ever decide that games aren't for you) moving to another industry will be much smoother if you have that piece of paper in your back pocket. It's not a decision I suggest anyone rush into blindly, though. Tuition fees (in the UK) are now higher than ever which should make any prospective students think very carefully about why they want to pursue higher education and what they want to get out of it.
As for what you should study; the jury is still out on that one. Many employers recommend a standard Computer Science degree which teaches you the fundamentals, while you delve into games programming in your own time. I would definitely recommend steering clear of games courses that aren't programming-specific. However, I opted for a Computer Games Programming course because I decided I would be more motivated and successful by doing so. Your results may vary.
My advice for anyone picking a degree: really look into the syllabus beforehand. The more challenging and varied your workload, the better off you'll be. I'd suggest you look for a mix of high-level programming assignments (C++ and C#, etc.) as well as mid/low-level (C, assembly language) computer science-y ones. If you're going for a games course (or even if you're not), make sure you also have a maths module or two covering linear algebra (vectors and matrices).
In the second year of my course (before my internship) I: created a 3D software renderer from scratch using C++; developed a graphics/game engine foundation based on DirectX; created two relatively complete games (one solo, one in a team of mixed disciplines) using the Unreal Engine; squeezed a technical demo based on L-Systems into 4KB for the PlayStation Portable; coded a MIDI sequencer using MIPS assembly language; and more. It was tough but rewarding work.
Step Four – Get Yourself Out There #
So you're now a wizard/ninja programmer, you love what you do, and you're ready to land yourself a job/internship. The problem is you're not alone; not by a long shot. Competition to get into the industry is fierce, and no matter how good you are, chances are someone out there is better. Oh, and they're probably applying for the same position as you to boot. You're going to need to make sure employers take notice of you, which means you can't be shy about advertising.
Start a website (like this one!) and chuck your best work on it voila! You have a portfolio. Tart your code up a bit if need be and chuck that up as well. Provide videos and screenshots of your projects alongside source code and some written descriptions. Make sure there's something for every kind of person (busy and on a deadline, free to peruse in more detail, etc.) visiting your site. Guarantee that nobody can leave without seeing (and hopefully remembering) something about you.
The same goes for your CV. Put your best work and grades on there but keep things succinct without being vague. Don't just explain that you're an expert at X; prove it by quickly describing how you used X while working on project Y (which is available on your portfolio). Awards and entries into competitions such as Microsoft's Imagine Cup or Game Jams and their ilk are also great embellishments that can help set you apart from your peers/competition.
I'd also recommend a blog (like this one!) to go alongside your portfolio. You might be the most technically gifted pmerogrammer in the history of forever, but if you can't communicate clearly, your usefulness as part of a team is greatly diminished. Prior to an interview, a blog seems to to be one of the best ways of letting a potential employer know "Hey, I can explain my thoughts and ideas clearly. No worries!" If you're not the best communicator then work on it just like you would with any other skill.
Step Five – That'll Do, Pig #
It might seem a little premature for me to be offering this sort of advice given that I am but a humble intern of five and half months, but this post is exactly the sort of thing I remember myself looking for a few years ago. Hopefully that means there's some useful advice in here for anyone who stumbles upon it. Some of what I've written is probably disputable, but it's all true from my perspective and it as the very least an accurate reflection on the steps I took to worm my way into the industry.
Good luck! 🙂