After a few weeks on my first internship, there are some things that either I’m glad I happened to know, or that I wish I’d known earlier. Targeted primarily toward my fellow students and aspiring programmers, this post is basically a brain dump of everything I wish people would’ve just bluntly told me up front. It’s targeted primarily at programmers, but hopefully others can also get something out of it :)
Other programmers aren’t mythic coding ninjas sent down from the heavens to grace your project with legendary source code the likes of which you’ll never be able to write. Before getting any professional experience, I had this concept in my mind that no matter how good I was at coding, “those professionals” were leagues better and, quite frankly, I was nowhere near as skilled as them. You know that epiphany you get at some point in your childhood when you realize that adults are really just, y’know, people? Same thing. Don’t get me wrong, that guy with a decade of experience really knows his stuff, he’s got plenty of neat tricks, etc. But that doesn’t mean that you’re some ineffective n00b and your mere presence is a plague upon beautiful, godly source code.
You can code just fine. In fact, you’re probably better than you thought! There are some things you’ll only learn with time, but as long as your fundamentals are solid, you’ll do fine. Relax. You can hack it. However, there are some things you just won’t know until you start working. Every company and every project is going to use a different set of tools, a different development environment, a different work flow… don’t expect to walk in and be a master of every tool in use. Nobody expects you to be.
Furthermore, go in with the understanding that it takes time to adjust to a new team and a new project. When you work on school assignments, they’re generally of a small enough scope that you know exactly who to ask about some subsystem or piece of code you don’t understand, particularly as you’ve likely been on the project from start to finish. When you’re jumping into an already-started project, though, there’s a big ol’ code base staring you down, possibly with dozens of hands that have touched it. Don’t sweat it. You’ll eventually learn that you should ask those two guys about AI questions, and these three pretty much made this part of the project, and… well, you get the idea! Then once you start to comprehend that section you need to change or add on to, you need to work within the new project’s coding standard, and ideally with the general style of code that’s already there, and then you’ll learn that you shouldn’t have actually changed that file, you probably should actually stick something here, and did you know we do code reviews for each commit into the code repository? Better keep up!
You’ll feel overwhelmed, at least at first. That’s normal, and completely okay. You’ll get the hang of things. Just keep at it.
Learning Your Trade
Read your textbooks. Seriously, if you just paid $50-$100 USD for that thing, why not? You’ll learn a lot more than just what was covered in class by sitting down and reading. Particularly if you get bored easily in class and are looking for an easy way to push beyond “just the basics,” the rest of that book that doesn’t get covered in class probably teaches some useful stuff.
Furthermore, read more than your textbooks. Whether it’s an incredibly interesting technical book, or even just some other programmer’s blog, read! By coming here, you’re off to a good start. Now that I’m working on an unannounced project, I’m glad I know how to read Gamasutra regularly, so even though I don’t play every new game that comes out, I can relate to and understand what my coworkers are discussing from both a gamer’s viewpoint and from the industry observer’s perspective, and why that game they’re discussing is actually a really big deal.
What I’m saying is, keep learning new things. Converse about your discipline with others. Check out some blog posts. Keep up with industry news. Little tips and tricks will come up more often than you think, and knowing good principles to follow will save you some huge headaches later.
While you’re in school…
While you’re in school, there are some steps you can take to treat your projects more like professional ones. Learn to estimate how long tasks will take. Break down your tasks and figure out how long you’ll need to finish each one. It’s a skill you’ll need, so why not learn it while there are no repercussions to being wrong? While you’re at it, you might want to experiment with different forms of project organization. Try different group setups. Experiment with bug tracker software. Figure out what works and what doesn’t – you’ll learn a whole lot more from failure than success.
Furthermore, push yourself outside your comfort zone. You’ll broaden your skills incredibly. Learn a new language, work in a new OS, teach yourself to code using vim and MinGW instead of Visual Studio… something. If nothing else, get some Unix experience. It’ll come in handy eventually, even if it’s only basics like navigating through directories and changing file permissions. That way, when someone tells you to use SSH, you know they don’t mean “quiet, nooblet, you’re disturbing my presence!”.
Of course, to do all of that, you need to code something. Work on a pet project. Take on an independent study. Make an arcade game, perhaps. The only way to learn is by doing! But make sure that you learn from it. Reflect on your mistakes, and keep pushing yourself.
Just code something. You need to be smart, but you also need to be able to get things done. That will only come from experience.
Never forget that you’re always learning. Technologies are always changing, and the latest and greatest thing could very well be irrelevant in five years if not earlier.
Always push yourself. Go farther than you thought was possible. And while you’re at it, always try to exceed expectations. You’ll go far.