The Serial Intern

I worked at HubSpot for 7 months and have currently been working at Gem for almost 6 months. I have yet to graduate.

I, like almost every student at Northeastern University, am a serial intern.

Northeastern, like other co-op schools, sends students to work for 2-3 periods of 6 months within their 5 year stints as a ‘student’. Software engineering work and computer science study blend to perfect synergy. Looking past the mind-numbingly high price-tag of NEU, this medley of experience has been spectacular.

I think everyone should embrace the intern mentality - it’s learning at its purest.


Often the first few months at a job are the most stressful. But they also tend to be absolute catapult-periods in terms of knowledge and skill-acquisition.

You’ll almost certainly be

I feel a lot of discomfort in this stage. You are surveying a massive codebase, trying to add the little bug-fix your co-workers tossed you for your first commit.

Everything is hard. You are definitely not in your flow state, definitely not “editing, testing, repeating”. You are hitting environment errors, hitting language syntax & semantics problems, and you have 1,000,000 questions about the code. + You don’t want to look stupid.

Every line of code feels like it takes hours, every test feels like it takes two. You often just can’t wait to be a few months in to your job so you can cruise along, adding features and fixing bugs.

 The Employment Muffin Top

I think part of the reason we as engineers research new languages and frameworks is due to the simple fact that we are bored. We master a technique and want to move on. We are hungry for new knowledge… yet when we are struggling, we also yearn for stability and productivity.

The stress period is, in my opinion, a blessing. It is the best part about a new job. You are clawing every line into the codebase, and you are learning so much as you do. At HubSpot I was thrown on the Analytics team, where we used Java, Hadoop, HBase, and Kafka. I knew about ¼ of the things on that list - guess which one!

So my hurdles: learn what a Hadoop is and how an existential author relates to software engineering. Oh, and learn the codebase too. “What are you doing? Guice does this muuuch better.” My high school Java experience seemed liked Microsoft Paint compared the complexity of these systems. Talk about imposter syndrome.

But oh dear god did I learn. Every day I woke up, wondered if I was really meant for a path in software, then proceeded to slam my brain against a wall of code repeatedly for 8-9 hours. It was an uphill battle, and it took probably 2-3 months to not be a net-drain on the company. But after those months, I was cruisin’. The pipeline was engraved in my head - and ask me about why Apache Kafka is so damn cool (it is).

 Staying Uncomfortable

Sure, I got up to speed and became rather productive. But my learning-over-time graph went from exponential to linear. (I have no doubt after a year or so it would stagnate hard).

It’s difficult to stay uncomfortable. You drift towards stability. But learning occurs in periods of discomfort and instability.

If you’ve stopped being the dumbest person in the room, you’ve stopped learning. You’ve stopped growing as a software engineer. I think we all remember the mind-orgasms we’ve had after struggling with a hard problem, maybe talking to the bright guy / girl next to you, then figuring it out.

We should chase that feeling.

At Gem, the ramp-up period was about 1-2 months. I attribute this decrease in ramp-up time to my previous internship and prior experience with the language (Ruby). But I’ve learned an equal amount of fantastically different knowledge.

As an intern, I feel dumb all the time. It’s amazing, because I know I am learning all the time.

 Asking Questions & Respect

There is an art to being dumb. I mean dumb in a relative sense.

Let go of your damn ego. Computer Science students especially seem to think that the college hallways are some perversion of ‘the streets’ and they’ve got to prove themselves and ‘throw down’.

Yeah, that kid might know 100x more than you. And yeah, she might acquire knowledge faster than you. Maybe it’s inherent, maybe it’s learned. Either way, if those people are making others feel like shit because of their lack of knowledge or experience… fuck those people. They won’t be great engineers simply because they are insecure about their knowledge-bases - they will always have to feel superior to others instead of learning from them.

Once you embrace the fact that you are a noob and will always be a noob, the faster you’ll start learning (and the faster you’ll walk the path to greatness). That MIT grad you work with? All those silent, brilliant students in your class? Yeah, they can teach you stuff. Absorb it. Be a neophyte. Be confident in what you know but always be willing to learn more.

That being said, asking a good question is key. Working on your third task for 15 minutes, getting stuck, and exclaiming, “I’m stuck!” is the wrong way to do it.

Yeah, of course you won’t grok the code right away. It takes time and tweaking. If you get stuck, formalize the problem and your question. Often working on a formal way to state the question makes the question (and maybe the answer) clearer in your brain. Try a few solutions. It’s much better to approach your team lead with “I am having issues doing X. I think it has something to do with Y and Z. I tried A, B, and C,” than, “I’m STUCK!”

 It’s Like Cheating

I joined two different, amazing companies. I learned a ton about “big-data” in the first, and I’ve learned a ton about Bitcoin (!!!) in the second. The experience and smarts I’ve gained can’t be boiled down to a blog post. HubSpot and Gem are both magnificent places to work.

But think about that… yes I am not getting paid as much as I could, but being an intern has given me the opportunity to jump into a role just to try it out for 6 months. Enough time to learn the code, actually produce things, and make great friends. And let’s say I didn’t like any of the positions or the types of companies I worked at, I just gained that knowledge with no risk!

Even if you aren’t a position to become an intern, I think the intern mentality is key to feeling fulfilled as a software engineer. We all strive for challenges and cherish learning opportunities. Embrace the neophyte attitude. Don’t be afraid to NOT pretend like you know every CS concept that any of your co-workers mention. It will free you from your ego and it will make you smarter.

As for me, I look forward to going back to school and my third co-op / internship. I am grateful for the brilliant friends I’ve made along the way.


Now read this

Synthesis: Practical Byzantine Fault Tolerance

The Byzantine Generals Problem paper gave us the number of nodes a system must contain in order to deal with m faulty nodes (3m+1). The original solution assumes the following: Every message that is sent is delivered correctly. The... Continue →