Tuesday, August 19, 2014

Coding in the Real World

Tis the season of job hunting once again. Job listings are blossoming and us eager college students have begun to swarm. Resumes are being dusted off, and the sounds of keyboards implementing practice algorithms and data structures fills the air. 

In a previous post, I outlined my experience with the internship application process. I had spent several months embedded in it, and wanted to share what wisdom I had managed to scrape together. What I couldn’t share was the experience of the internship itself. What’s the point of all of this? Is an internship hard? Will I be able to handle it even if I get an offer?

It’s funny how overlooked those questions are. It’s almost suspicious that nearly the entire focus of the internship process is in the application. Amongst the Berkeley community, those who have withstood the trials of an internship seem to radiate this mythical aura from the perspective of those who haven’t. The kids today might describe them as “legit”. People want them in their group projects because they must know so much now.

This past summer I interned at a San Francisco startup called Endless that does really awesome stuff. I want to convey not only my experience, but the experience of several of my friends and colleges that also went through this mythical ringer. How “legit” did we become?

Well, it turns out that the answer depends very much in how you define “legit”. My friends and I are all walking away from internships with the same impression of difficulty: the application process was much more strenuous and challenging than the job itself. Don’t get me wrong, we faced a problem massive in scope and so to were the number of problems that came along with it. Problems of engineering, design, communication, marketing, you name it. It simply turns out that writing code in the “real world” is a very different experience than writing it in the classroom.

The problems you face in the professional world of software production will tend towards design, not concept. This is a very bizarre transition for someone who had learned to code in a college environment. Professors give skeleton code, leaving the details of implementation to us. Writing a program for them isn’t hard once you’ve grasped it conceptually. For example, implementing a modified tree data structure or optimizing matrix multiplication in a multi-threaded environment.

Production code seems to be the opposite. You’re given nothing other than a blank text editor and a list of requirements. Very rarely will you have to employ some mind blowing data structure or algorithm, and even if you do, it will be even more rare that you have to implement it yourself. It’s an exercise more akin to writing the skeleton code itself and then filling in the blanks with libraries and technologies, instead of student code.

The most valuable thing you’ll learn at a internship is simply the process of writing code in a productive way. How to effectively use tools like Git and GitHub. Collaborating with pair programming and code reviews. In school, programming is all about writing code. In the real world, programming is all about talking with other people, and then writing some code maybe.

What about all of those trendy technologies like Node.js, MongoDB, etc? What about APIs? Do you get to learn those? Yes. And they’re easy. Learning MongoDB or jQuery is nothing like taking a class in Databases or Web Design. These technologies are highly optimized to be as simple and magical as possible. They abstract out the difficulty. It’s why they’re popular!

There’s a phrase I ran into once that I think describes the situation very nicely. In school, the requirements of code are easy and the implementation is difficult. In the professional world, its the requirements that are hard and the implementation that is easy. A lot of my friends are intimidated by an internship because they see the difficulty of the interview process and believe that they have nothing to offer. Or, they believe that the difficulty of a computer science education is analogous to the work of a programmer. Forget about that. Getting an internship means that you are more than capable of handling the work.

This isn't to say that the work is easy. Most of us became interested in programming due to the challenges it so often provides us. As a student, you will be forced to constantly learn and grow and build upon your knowledge. Funnily enough, this doesn't change much once you leave college; it's just different. Conceptual rigor gives way to domain familiarity, and your obstacles become less about your intellectual limitations, and more so your willingness to plan ahead and become familiar with new tools.

With all of this in mind, my advice for a successful internship is this: be friendly, collaborative, inquisitive, and willing to learn. Don’t be afraid to voice your confusion or lack of knowledge. An internship is a training program in collaboration and software development. You aren’t expected to be a genius, or even know anything about their particular technology stack. Learn as much as you can. 

You won’t come back to college and destroy your compilers class because you’ve ascended into your planar coding form. Instead, you’ll be comfortable organizing the GitHub repo, know the best practices for organizing your code and keeping it readable, have intelligent and iterative code writing habits, be familiar with different coding models and project structures, be willing to review your friend’s code having confidence that you can help, and be a leader amongst your class project group.

If you’re at the point where you’ve got the offer and don’t know what to expect, relax, because you have nothing to worry about. If you’re still working on that offer, relax, because it’ll never be harder than it is now.

No comments:

Post a Comment