Beyond the Classroom: Lessons from a Real World Software Engineering Internship

I’ve heard the complaint from more than one full time developer, recruiter, or classmate: modern computer science degrees don’t fully prepare students for a job as a software engineer. This is partly by design; especially at large research universities like UVa, a BS program emphasizes theory and broad exposure to different subdisciplines in the field. In an academic setting, it’s difficult to keep up with the latest trends in a fast-changing industry, so sticking to tried-and-true curriculum is a safer bet for equipping students with a foundation to succeed.

However, many CS students are seeking software developer positions but lack experience developing outside of the academic sandbox. This is where internships can train students in the practical skills needed to become an effective software developer.

So what is there to be learned beyond the classroom? This post only skims the surface of some real-world lessons I learned at Fluencia this past summer.

1. Use agile development to facilitate teamwork and take small bites out of a big project

The mere mention of group work at school can elicit exasperated sighs when each group member has to balance a full course load, multiple extracurricular responsibilities, part time job(s), job searches, and more. In the real world, the whole team is located in the same room all day and readily available to work toward a common goal. Using scrum at Fluencia has made working in a team even more effective, by breaking our large goals down into manageable tickets and keeping the team flexible to respond to user or product owner feedback.

2. Learn with one-on-one attention from experienced full time developers

With a whole class of students vying for the attention of a much smaller group of instructors and TAs, getting frequent one-on-one attention is often not possible at a big university. During my internship on Fluencia’s small team, I was been able to receive individual mentoring to hone my coding skills. With code reviews required for every pull request, I improved my ability to think through a problem end-to-end, execute my solution cleanly, and prove that it works with thorough test coverage, thanks to feedback from full time engineers. The opportunity to pair program with more experienced developers also exposed me to useful workflow tips and approaches to solving problems.

3. Develop good habits to make life easier down the road

Unlike at school, where a project’s lifespan is usually a couple weeks to months and the result can be abandoned at the end of the semester, in the real world, you’re committed to your code. Both getting oriented in the team’s existing code and returning to code written by myself earlier in the summer drove home the importance of writing code that is meant to be read. To produce code that is maintainable and easy to understand, I learned to favor clarity over ‘clever’ syntax and write useful names and comments for my branches and commits.

4. Stop reinventing the wheel

Some assignments require students to code classic data structures in order to learn how they work, their strengths, and their limitations. In a real world project, the goal is to spend less time creating things that others have already created, and instead leverage the plethora of libraries and APIs that already exist to build something new. Working with a full time team has given me insight into the decision process of whether to add dependencies and which libraries to use, and forced me to get comfortable learning how to integrate those libraries into my own work.

5. You’re not alone! Join the community

My college habit of lonely, late nights sifting through StackOverflow have given way to a much more exciting method of learning from other programmers: getting involved in the community. The team at Fluencia encouraged me to attend local meetups and hackathons, and set an example to aspire to by presenting talks in front of the DC community of developers. They pointed me to some great online resources for learning and continue to grow the Fluencia engineering online presence. One aspect of software engineering that keeps me engaged is that it is constantly evolving, and keeping pace with other developers using the same languages and tools makes the job exciting - and often easier!


6. Make an impact

Many school projects involve an imaginary client or user; but the work I did at Fluencia this summer has reached millions of real people. For me, one of the most rewarding parts of taking on a real world development internship is being able to take all the theory and practice from school and turn it into something valuable. At Fluencia, I’ve developed a sense of accountability for my work, because I know that what I’m working on matters beyond a school assignment’s deadline.

Are you a student or recent grad making your first forays into software development in the real world? What kinds of things have you learned off campus?