Reflections after Five Software Engineering Internships

My last post was over three years ago, and the past three years have definitely been quite a whirlwind. Having finished my fifth internship and in a reflective mood, I thought that this would be a fitting time to share five of the random things I’ve learned over my past five internships.

  • Understanding what incentivizes someone and what their critical path is helps tremendously in understanding the deeper reasons behind their actions and how to best work with them.

I think this is so important that it warrants its own post in the future. Philip Guo wrote a great article on the notion of a critical path and it’s well worth a read.

  • Burn out is real, and it’s very easy to get stuck burning out when working in four (or three) month sprints.

Working on mentally challenging tasks day after day can lead to burn out if you are not mindful of how hard you push yourself. The short term nature of an internship can exacerbate this problem by making you feel compelled to put in extra effort despite knowing that you won’t be able to sustain it long term.

  • You learn and grow the most when you are uncomfortable. Finding the right amount of “uncomfortable” is helpful in keeping you learning while still being sane.

There is a lot of truth in the idea that you should “step out of your comfort zone.” I personally think it is one of the best ways to measure whether you are continuing to grow yourself and your skills. Though of course, the comfort zone is named that way for a reason; you’re often the most comfortable and by extension most productive when in the comfort zone. Striking the right balance between doing something new and uncomfortable versus something familiar is important in maximizing your growth. That way it keeps you sane, productive, and still willing to try new uncomfortable things.

  • Developing software on a team or as a part of an organization is very much a social problem just as much as it is an engineering problem. A large part of developing software as a team is getting others on the same page and having them agree with your approach. This can be about something as technical as the architecture of your system to something as pedantic as whether you’ll use tabs or spaces to indent your code.

Being able to communicate your thoughts succinctly, precisely, and accurately to your co-workers and superiors is a really important skill. I would even argue that this is true in any situation where you’re working on a team—not just in software development.

  • What you learn on an internship shouldn’t just be technical. A big part of getting to do a variety of internships is being able to get a first hand look at how different types of companies operate. It’s also about learning what each company’s values are and what they are opinionated about.

Almost every company operates at least slightly differently. One of the benefits of doing several internships is that you get a chance to experience these different operating styles in a short period of time. A great way to make the most of these experiences is to actively observe to learn about how the company operates. While it’s unlikely for any one company to have found the “optimal” way to operate, each company will have its own strengths in their approach and it is valuable to learn what they are.

In a similar vein, it’s well worth exploring the difference between smaller and larger companies. How do they build products? How do they make decisions? How do they hire? While it’s obvious that small and large companies are drastically different, I think it’s valuable to explore both types of companies to get a first hand taste as to how each of these questions are answered.

And that’s it for this post! Hopefully some of this has been helpful or at least interesting to read. I’m expecting to pick up writing more regularly again, so stay tuned for more posts in the near future.