by Jaymin Kessler (of Q-Games)
http://6cycles.maisonikkoku.com
@okonomiyonda
This one is for the kids, and I mean that in the least pedo way possible.
I like hanging out in the GDC career pavilion, and not just because it’s filled with companies giving away free shirts ( *ahem* like those awesome Insomniac shirts I would looooooove to get my hands on ). The career pavilion just has this energy to it that comes from being filled with soon-to-be-grads doing everything in their power to achieve their dream and break into a notoriously difficult to enter industry. Its human drama at its finest, and its all there: the exhilaration of getting your first industry job, the heartbreak of being rejected, the uncertainty, the camaraderie… Its the hopes and dreams of the next generation of game makers, and its all packed in to one room at the Moscone center.
But are these future gamemakers /really/ doing all they can to get hired? I dare say no. It all starts with one simple question: “so, got any demos?”
We get a lot of applications from new to the industry applicants here at Q, but we very rarely see any demos. If we do see demos, often they are the kind of demos that hurt our eyes and make us wish we hadn’t seen them. So whats going on? Personally, I don’t think everyone fully understands 1) what a demo is and isnt, and 2) why they are so damn important, especially for new grads with no professional experience.
Lets get this out of the way. A demo is _not_ proof that you meet some minimum eligibility requirement. Yeah, I am talking to you, guy who submitted the rotating cube. Good lookin’ out, B. Maybe you thought you were allaying some deep rooted fear we have that you might not know how to use GL immediate mode to draw a quad, but really all you did was make yourself look bad.
A demo doesn’t have to be a full game. In other words, please don’t feel the need to go out of your way to prove that you can do a wide range of things in a mediocre way. Sometimes its better to focus your attention on one or two things and put a lot of love into them. For example, you could write a really interesting multicore job manager and memory allocation system. There is no rule that says that all demos have to be graphics demos. Because not many college students are thinking about memory allocation or Data Oriented Design, doing stuff like that instead of doing the same bump mapping demo all your classmates are doing can be a great way to stand out! All my pre-industry demos were various non-graphics stuff written in VU assembly on PS2 Linux and I think it ended up helping me. Also keep in mind that code quality matters. Be meticulous. Definitely more meticulous than I am with my grammar and spelling. Even if your demo looks gorgeous, things like memory leaks all over the place, OOP, random unnecessary virtuals, and other horrific abominations might make the guy reviewing your demo think twice. It might mean the difference between hiring you or the other guy in some cases.
Takeaway: for me at least, the point of a demo is to make you stand out from other candidates (in a good way). We can’t hire everyone, so make us think you’re the one we’ve been waiting for. Show us something cool that other people cant do, wouldn’t normally think about, or don’t have the time to do.
That brings me to the subject of timing. An hour after the company you are applying at asks you for a demo is not the right time to start making one. I’d even go as far as to say a month before you start applying at places still isn’t good enough. Its hard to make a technically interesting demo and polish it to a high degree in a short amount of time. Really, you should have “labor of love” home projects that you work on, obsess over, and refine over long periods of time, and update/rewrite as you become a better programmer and learn new stuff. To put it more bluntly, I don’t care if you went to MIT, Caltech, Bergen Community College of Paramus NJ, or some crappy game specialty “school”. Reading books and articles, and trying stuff at home (and failing) is how you improve. If you’re about to graduate and you haven’t been doing this, there is a higher probability you are screwed. Of course if you are reading #AltDevBlog, you already are the kind of person who reads and learns on their own. Good for you.
A lot of people consider their school team projects to be demos. There is nothing wrong with that, per se, but it always raises doubt in my mind as to how much of the work was really done by the candidate. You can throw around impressive sounding phrases like “oh I was the gameplay lead on that project,” but what does that really mean? Its hard to look at a piece of code that was touched by 5 programmers and infer some idea of a candidate’s skill from it. Also, having school projects only and no personal projects is another big red flag for me.
EDIT: One last annoyance I forgot to mention in my original post. Of the demos that we do receive, a large quantity of them don’t actually work. We just can’t run them. Either they crash on boot for some unknown reason, some lib is missing that keeps it from starting, or the candidate assumes everyone must be running super-uber-premium-happy-lucky-family-Windows-2032-better-than-you-edition. Here at Q-Games, like many people in the world, we use Windows XP 32 bit and only use OpenGL. So please please please test your stuff not only on your own box, but also on friends computers running different OSs. Or as an alternative, include HD screenshots and videos of your demo. Since you will never guarantee it works for everyone, at least we can have an idea of how cool your demo would have looked if we were actually able to run it!
Some Quick Notes On Programming Tests
Cool, so you have an ill demo, but you still have to take the dreaded programming test. These range from brainteasers (which I think are an absolutely atrocious idea), to 30 minute quick tests, to 1 week tests, to non technical general knowledge tests. I’ll focus mainly on longer tests, although some of this applies to shorter tests as well to some degree.
When it comes to programming tests, there is no need to freak. Either you know the stuff or you don’t. Going back to home projects, the more the do at home, the more you increase the likelihood of having solved or at least seen one of the problems on the test. Maybe you can apply something cool you discovered in some cool new way for the test.
For me, the golden rule is “there are no simple questions.” When I say that, I don’t necessarily mean that my skill level is so low that even simple stuff is difficult for me, although there may be some truth to that. What I really mean is that an easy question is actually a golden opportunity to show off and do something different. Just because you /can/ answer it in a few minutes doesn’t mean you /should/.
I’ll say it again. A simple question is never a simple question. One of the things I love the most about the Q-Games programming test is that many of the questions are simple enough so that anyone can answer, but open enough to allow people to really go to town and do some interesting stuff. Many of the questions are of the type “lets say you want to do X. Think up an algorithm that does it but is within these constraints” or “come up with a data structure that can represent Y”.
One of my main reasons for writing this rant is that I got a little tired of people just not putting in the effort. Lets say the test asked you to write a doubly linked list. Its a very basic concept and we all saw them in college (except maybe for the game specialty school students). You could probably answer in under 10 minutes with the “standard” implementation. The question seems simple on the surface, but like I said before its really just an excuse to go crazy and consider lots of possibilities
Do you use sentinel nodes or not? Is the list ordered or not? When you add a node, do you add it to the front or back? Why? What does your node look like? Does it contain all the data, a pointer to the data, or some search key plus a pointer to the data? Which is more cache friendly and in which cases? Do you use pointers or indices into a node array? Does it even matter? What can you assume about how it will be used? If you don’t use intrinsically linked lists, will having to write a copy constructor or operator= be an issue? Do you preload the next node when searching? If you do preload, how do you deal with the possibility of the next pointer being null? How do you allocate nodes? Malloc? Fixed block allocator? All at once or one at a time as needed? Does it have to be safe to add from multiple threads? Does it have to be safe to remove from multiple threads? Should you throw mutex locks or lwmutexes around every function just to be safe, or can you come up with something more parallel? How about stating the problems with linked lists and coming up with a better solution that meets the problem constraints? What are the problem constraints?
See what I mean? Those are just a few of the things you can think about when answering. You can be the candidate who quickly regurgitates the standard implementation learned in school in a few minutes, or you can be that candidate that takes the extra time to really do something special and interesting. I highly recommend you go for the latter.
I look forward to reviewing your test :)
note:
the opinions expressed in this rant are entirely my own, and may not reflect the other test-reviewing tech team members who are undoubtedly shaking their heads in disbelief as they read this
I promise I will try to do a proper technical post next time. I just didn’t have the time to finish the post I wanted to do