• Home
  • /
  • A Guide to the Internship Experience: From a Software Engineering Intern
September 16, 2020

A Guide to the Internship Experience: From a Software Engineering Intern

Farhiya Osman
Farhiya Osman

 

My name is Farhiya Osman and I am a student at Oregon State University studying Electrical and Computer Engineering. These past ten weeks I have been a software engineering intern on the Smartexam team at Bright.md. When I joined, I was inspired by the company’s mission to make healthcare accessible and convenient for patients. Along with that, I would receive the opportunity to witness the inner-workings of a startup and put the coding skills I learned in academia to the test. In this post I will share a little bit about myself, the Emerging Leaders Internship (ELI) program, my own experience as an intern, and my recommendations for what makes a successful engineering internship program.

Snapshot of the Smartexam Team
Snapshot of the SmartExam Team

 

For an engineering internship to be successful, I recommend that the program should be based around some of these goals:

  • Set up a development environment
  • Code review (or pair code review) a case completed by another engineer
  • Implement a case that was released to production instances
  • Experience several deployment cycles
  • Participate in deployment testing
  • Set up multiple mentors within the engineering department
  • Give feedback to mentors
  • Meet with at least one member of every department
  • Give an end of internship presentation on your experience to the company
  • Partake in the deployment of work you have merged

In addition, there should be frequent recurring meetings with supervising and non-supervising mentors, as well as easy-to-read technical documents to assist in onboarding new employees to the architecture of the software.

Emerging Leaders Program

“[Emerging Leaders] mission is to empower diverse talent to excel as professionals through opportunity and a supportive community. Emerging Leader (EL) is dedicated to improving racial and cultural diversity at the leadership level in Portland-area companies by providing pathways to leadership for traditional and non-traditional students of color and aspiring professionals.”

As I began my quest to find a summer internship, I discovered the Emerging Leaders Internship (ELI) program through an on-campus college event. I was drawn to ELI because of its mission to create a new normal by encouraging local companies to strive for a diverse workforce. In order to prepare me for potential summer internships, ELI hosted a mock interview process where I practiced answering typical behavioral questions, learned interview-day resources such as dress code and non-verbal communication skills, and how to prepare for technical aspects. I was matched with Bright.md, and the mock interview process and skills I learned prepared me for success.

ELI was a great program that really helped me find an opportunity in an industry I didn’t have a lot of connections to. Even during my internship, ELI supplemented the learning experience with professional-development sessions that worked to improve my internship experience and personal skills. Through these various professional development events hosted by Emerging Leaders, I was able to work on goal setting, networking, and advancing my professional portfolio–skills I will be able to translate into the workforce.

ELI made my internship at Bright.md–a prominent Portland medical technology startup–possible. I remember when I received the email that said I got the internship: I was excited and jumping with joy. I was ecstatic to have the opportunity to put my coding skills to the test!

Establishing an Internship Plan

I didn’t know what to expect when I first started my internship. I was initially introduced by my manager, (and the SmartExam team’s engineering manager) Katharine, and we collaborated on an internship plan. We started with describing and writing down what we both wanted to achieve throughout the internship while also acknowledging what was potentially possible with what the rest of the engineering department was doing. Taking Bright.md’s business goals and our goals for the internship into consideration, we aligned on our objectives and created an agenda with a timeline of things that we wanted to accomplish on a weekly basis.

Snapshot of our internship plan (Week #3-4)
Snapshot of our internship plan (Week #3-4)

 

Our overarching goal was to ensure I received an experience that provided not only insight into the work of a software developer, but also a realistic overview of startup culture. To achieve that, I collaborated with the engineering department on work that has business value and is also releasable as part of our product.

At a company that is consistently looking for new ways of thinking and ideas, an intern provides a fresh set of eyes and can bring new suggestions to the forefront. Here are a few things Bright.md was hoping to get out of the internship program:

  • Experience engaging and supporting diverse individuals within the work context
  • New perspectives on company projects and cultures
  • Opportunities to provide and receive constructive feedback
  • Opportunities to grow as supportive mentors
  • Experience creating a “brave space” (establishing a space where the mentee can be honest and feel valued and supported allows for a more relational, human-centered mentoring experience)

To meet my goals as well as Bright.md’s, we decided we wanted to accomplish the following by the end of my internship:

  • Set up a development environment
  • Code review (or pair code review) a case completed by another engineer
  • Implement a case that was released to our production instances
  • Experience several deployment cycles
  • Participate in deployment testing
  • Give feedback to mentors
  • Meet with at least one member of every department

We collaboratively created a week-by-week written plan based around those goals. This plan allowed me to keep track of what I set out to accomplish and allowed me to pace myself throughout the internship. This internship plan was intended to be flexible–a living document–so that as we discovered new things that might be interesting for me to experience we could update the plan accordingly. The creation of this plan, as well as its flexibility and alignment with my goals, provided a space for me to learn about software development.

Reflections

The internship was a great learning experience. There were many takeaways I gained through the experience. That said, I want to share five things that surprised me:

  • Academia vs. Coding in the Real World
  • The Importance of Version Control
  • Product Teams, Agile, Deployment, Legacy Codebases, and Asking Questions
  • The Importance of Code Quality
  • Deployment: How Does Code From My Editor Enter the Real World

Academia vs. Coding in the Real World

Coming into this experience, I wanted to gain exposure on how software development works in the real world. In the classroom, our assignments are usually structured with given parameters and set guidelines that you cannot deviate from without risking your grade. As I wrote my coding assignments in college, I always wondered when and how would I use these in the real world.

Once I started working at Bright.md, I realized that although parameters and set guidelines (or as they call it, “acceptance criteria”) were given to you, you were free to tackle problems using techniques that sometimes stepped outside of the box as long as it met the necessary (but limited) criteria. During my time here, I learned there is a difference between what is expected and how it should be completed. While completing cases at Bright.md, I learned that there are many ways to complete a case and meet our business needs, however each of these different ways have different pros and cons. It is through discussion and understanding the context around the cases that allows us to understand which solution is best suited for our particular problem.

The Importance of Version Control

In the first couple weeks, I jumped into setting up my virtual environment and learning how to use version control for the first time. Version control is a system that records changes to a specific file or files over time. Prior to this summer, I was unaware as to what version control was as well as it’s value in coding. I did not use it before my time at Bright.md because the majority of coding projects I worked on were completed on an independent basis. Version control targets an important aspect of development because it prevents conflicting changes, ultimately allows multiple developers to work on the same code simultaneously, and keeps records of all changes to the codebase.

Familiarizing myself with Git and Github opened a lot more opportunities for me at Bright.md. With my newfound understanding of version control, I was able to pull down our code from Github and start pairing with other engineers on code reviews they were doing. Throughout the internship, I needed to use Git and Github to complete my cases, and, later, to help with code reviewing cases for other engineers. From starting off observing someone drive a code review to being able to complete one independently really showcased my growth as an intern.

Product Teams, Agile, Deployment, Legacy Codebases, and Asking Questions

Product teams, agile, scrum, deployment testing … all of these things were new to me. As I inched closer to working on cases independently, I learned about how Bright.md engineering teams are organized, the agile methodology Bright.md uses, and how that fits into the overall way in which code that I develop gets released into the real world (a.k.a production).

Bright.md currently has four engineering teams with different managers. The team I was on is called the “SmartExam team” and managed by Katharine. However, all of these engineers are split into product teams that have members from other departments like Product and Customer Success. Each of these product teams has their own roadmap of things to work on. When I was initially onboarding, I was assigned work that was not from any of the product team’s roadmap to get familized with the development environment and process, however as we moved through the weeks, I was placed on a product team.

It was working on a product team, and being responsible for delivering a case, that really helped me understand what it takes to release code that I implemented into the real world. Most of Bright.md engineering teams work in two-week sprint cycles and use a blend of scrum and kanban agile methodology. For example, most teams track their cases through kanban boards but have some of the more typical scrum ceremonies like standups, sprint review, sprint planning, and sprint retrospective. As someone who was so used to due dates for assignments being a few weeks out this was something new for me. I came to understand agile methodology as a way to deliver usable products while continuously making improvements, and that technology startups typically embrace some form of agile methodology to organize their deployment efforts. From personal experience, I can tell you the two-week sprints go by in a blink of an eye.

During my time, I was able to participate in a range of cases that allowed me to understand a legacy codebase. In the past, all the code I had worked on was code I wrote myself that was, at most, an accumulation of one month of work. In the software development world, this is not the case: typically you are tasked with working with years worth of code. Understanding a legacy codebase was something I became familiar with as I began converting an older codebase to a newer one; we were converting our frontend from AngularJS to React. Through this process, I applied skills from code-pairing and academia, but one of the most valuable skills was asking questions. During my internship, I found that it was really important to confidently ask questions. Typically, my manager and engineering mentors are super supportive but busy. With a remote internship, it was sometimes not apparent when I was stuck or needed help in the moment. Bright.md created a space where I felt comfortable turning to other developers with questions, which truly supplemented my learning experience.

Code Quality

To ensure continuous code quality, a few software techniques such as code reviews, unit testing, integration testing, and exploratory testing are implemented. This was all really new to me as my courses did not expose me to the extensive nature and value of testing. I started learning the importance of code quality through code reviews. Observing someone drive a code review to being able to complete one independently was key in learning what it takes to ensure code quality. I was able to see how different engineers read and debugged code allowing me to learn and adapt parts of it to my own workflow. Being part of the decision making process of why different ways of approaching a problem was better than others was really insightful and helped me expand my understanding of what is possible in coding. Another aspect of code quality I learned was unit and integration testing. Once I gained familiarity with the code base, I started implementing cases where it was important to have both unit tests and integration testing (we use Cypress). The use of these unit and integration tests allowed me to learn that as you add new features its key to make sure all previous work remains intact. Being able to see other developers write tests and learn how to write them myself improved my understanding of the necessary steps to ensure continuous code quality.

Deployment

“What is DevOps?” “What is deployment?” “What does the Operations team even do?” Although I haven’t figured out the entirety of what all of those things mean, it was exciting to be part of the deployment process for a sprint. The culmination of all the work is deployment. This is where all the code merged to the codebase is released to users. Bright.md currently has a two-week deployment cycle and is moving toward continuous deployment. I was given the opportunity to sit in deployments and see the code I worked on in the sprint be deployed to real users of our product. This was the first time I saw the complete process of how code created becomes accessible to real users, and it gave me a lot of appreciation for all the steps that it takes to get there to ensure quality.

My Recommendations for a Successful Internship Program

In reflecting on my internship, in addition to the goals that we established early on in the internship, there are a few things that I would strongly recommend for a successful engineering internship:

  • Frequent Meetings with Mentors
  • Documentation for Interns
  • Setting up One-on-One Meetings
  • Start/Continuation of the Internship Program

Frequent Meetings with Mentors

As I began my internship program, I met with Katharine three days a week. As was my sole mentor, she helped me with onboarding and getting accustomed to the work environment at Bright.md, learning team processes, and finding experiences that would enrich my internship. During the middle of the internship program, we decided to add two additional engineers from the SmartExam team as my mentors. The additional two mentors allowed me to gain exposure to the day-to-day of a software engineer. This decision was mainly motivated by the desire to expose me to a variety of projects and coding styles, while also being provided with advice about careers in technology. Meeting with three different mentors each week allowed me to gain three different perspectives of software development and the opportunity to hear three unique paths to Bright.md.

Documentation for Interns

Bright.md has prioritized moving from a single monolithic application to microservices. As a new developer on the team, I think the use and interaction of different microservices takes a little bit of time to fully understand. To allow a future intern to gain a better understanding of the microservices and architecture of the codebase, I would suggest creating a centralized document about how they are all intertwined. I believe having documentation is key to onboarding a new intern and allowing them to gain a better understanding of the company’s codebase.

One-on-One Meetings

During my internship, I met with people from different departments to learn about their roles and day-to-day work. I learned about everyone’s unique path to their current roles, as well as the different experiences that made them find a passion in their careers. Hearing from members of different teams allowed me to gain a better understanding of how each department works and collaborates as well as what each member brings to the table in order to reach a common goal. When I met people from different departments, I could see they all had aspects of their job that made them tick, whether it was their love for number crunching, selling a product, or making someone’s life easier. They all entered their careers from a passion they found and continued to pursue.

Start/Continuation of Internship Program

I may be a bit biased, but I believe companies should offer internship programs (and that Bright.md should continue to offer internships in all departments). Internships give college students the opportunity to gain a better understanding of the software-development world and decide if it’s a career they want to pursue. This internship allowed me to understand the inner workings of a company, how different teams collaborate to reach a common goal, and put my coding skills fostered in academia to the test. When I arrived at Bright.md, the way I approached problems was narrowly focused–a strategy that worked in college. Bright.md not only pushed me outside of my comfort zone, but also provided the mentorship and resources necessary to succeed. As I end my internship, I take with me a deeper understanding of not only how to code, but also the skills to solve unique problems in a new light, with a new purpose. From this program I have gained an appreciation for the power of coding and the potential it has to impact people’s lives. This internship program has the potential to provide a similar experience to another individual–an experience that can only be taught outside of the classroom.

A Thank You

What a journey these past ten weeks have been for me! From setting up my virtual environment to landing my first case, I have gained experiences and knowledge that I will carry with me throughout my college journey. Although this was a virtual internship, it gave me an insight into the software development world. I was able to code and learn from many different people within the company in such a short time. My time here has really enriched my software development background. This fruitful summer fueled a passion for software development that I hope to foster in future internships.

Alongside coding, I had the opportunity to hear from others within Bright.md and learn about their roles and journeys on how they got to where they are today. During these past ten weeks, I have not only been able to discover what I want in a future career, but I have learned skills I can carry with me through the rest of my undergraduate career and into the workforce. I would like to thank Bright.md, all of the wonderful people from different departments I had one-on-ones with, the Engineering department, the SmartExam team, and Katharine for a great summer.

Finally, I would like to thank Emerging Leaders Portland for providing me with support throughout my internship this summer while also helping me create connections that will propel me in the future.

Farhiya Osman
Software Engineering Intern
Share on facebook
Share on twitter
Share on linkedin