This year, I had the pleasure of participating in an internship at Xerris for 2 months during the summer. During my time here, I’ve learned so much through working in a variety of different fields, and I’ve grown as a developer, architect, and team member. In honor of the team that supported us throughout our time working at Xerris, I named this blog post following their sprint naming convention, with the name of a pasta dish.
In the first phase of the internship, I spent 5 weeks working on a project as a developer, and there, I was introduced to many new concepts in web development (Microfrontends) and used many libraries for the first time (mobx-state-tree, TailwindCSS, Apollo Client). Furthermore, I worked on a team for the first time, learning everything about how a scrum team operates. In the second phase of the internship, I learned about a variety of different other roles, learning about the job of a cloud architect, the theory behind machine learning and how machine learning is integrated into large-scale projects, and a deep dive into the life of a scrum master.
To give some background information about myself, I’ll talk about some of the experiences I had going into the internship. In junior high, I was introduced to programming, learning how to make websites in HTML, CSS, and Javascript. I worked on a few small projects, including a hangman solver with a basic UI and a personal website, both written in raw HTML, CSS, and JS. From there, I expanded my knowledge by working on a variety of projects in different languages, including a stock market simulating discord bot in Java, a language learning tool desktop app in Java with Swing, a website with React, and an app in Dart+Flutter. In addition, I started to become more experienced with backend development, starting to self-host my website on an old computer converted into a Linux server.
Frontend Development
Going into the internship, I had a vague idea of what to expect, but I was amazed on my first working day. I participated in two scrum ceremonies: daily stand up and estimation, and was initially mystified by both the project I was assigned to work on, and the scrum framework. While I had read about the Agile methodology in the past, being able to actually participate in it completely subverted my expectations. Moreover, the experience of working on a project of such a huge scale for the first time was simultaneously thrilling and perplexing: instead of each page of the app being a component, each page was its own project, complete with its own repository.
When I first got started, I distinctly remember the struggle of just trying to comprehend the project structure. Basic things like finding files to edit and to use as a reference were suddenly a challenge. Moreover, the added complexity from learning new libraries (such as mobx and TailwindCSS) only added to the confusion. However, despite these initial challenges, I eventually settled in, becoming accustomed to the scrum ceremonies and becoming familiar with the project. I learned how to use libraries that I previously didn’t even know existed, and these additional challenges only increased the satisfaction I got after figuring out how to accomplish something.
The greatest technical challenge I faced during the internship was a story that I decided to work on while working as a developer. It required me to display additional information on many components. Without getting too technical, the first part of the story involved getting raw data from two existing GraphQL queries, and reusing existing functions to transform that data into a new mobx model. The second part of the story included querying the configuration, mapping that configuration to the raw data, and using that mapped configuration with the raw data to display data on the page. Before implementing my final solution, I thought through multiple potential ways of solving the problem. Despite warnings not to burn myself out, I couldn’t stop myself from thinking of how to solve the issue after work officially ended. While it was the most challenging thing I did in the project, it was also the most fun to work on, and was the task that gave me the most satisfaction after completing it.
One of the biggest takeaways from my time as a developer was the amount of trust each individual has in their teammates and, as a result, the amount of responsibility one has. When working alone, there are minimal consequences to accidentally breaking a component of a project: just make a quick commit to fix whatever broke, and you’re done. However, when working on a team, small oversights (such a missed null check) can result in breaking the app for others and lost productivity. Moreover, everyone is relying on others to be mindful of the consequences of the code that they write. While working on the project, I accidentally broke someone else's ticket (that was in QA) while working on my own without thinking through the consequences of what would happen. It felt awful to accidentally break something that someone else had worked on, and luckily, it was a quick fix to resolve both issues. Finally, and perhaps the most importantly, I realized that team members have faith in their teammates to write code that will be easy to read, modify, and extend in the future, and significantly, I realized that the job of each individual developer is not only to make something work now, but also work in the future and anticipate any future modifications that might occur. While working on the project, I felt pressure to write clean, robust, extensible code for the first time, which was a huge step in my development as a developer.
After 5 weeks of focusing on the role as a developer on the project, the focus of the internship shifted to learning about the roles of other individuals who work in the tech industry. We spent 1 week learning about cloud architecture and machine learning, and 1 week learning about being a scrum master.
Solutions Architecture
In our solutions architecture practicum, we spent 3 days dedicated to learning about AWS, how infrastructure can be expressed through code, and the job of a cloud architect. We learned about some of the most commonly used AWS services, including S3, DynamoDB, Lambda functions, and IAM. Additionally, we learned about the job of a cloud architect and the process of designing cloud infrastructure.
My favourite part about the solutions architecture practicum was the feeling of empowerment I got after learning how to use AWS effectively. After learning how to programmatically create services using infrastructure as code tools such as Serverless and AWS CDK and becoming comfortable with reading documentation for AWS services, each service became a little lego brick that I could combine with others to build anything I imagined. With our newfound knowledge, the other intern and I used Serverless to create a basic API which would call a Lambda function and return the results.Additionally, we also each created an architecture diagram during our week dedicated to system architecture. For my architecture diagram, I wanted to design the backend for a file server that would allow a user to store and organize files in the cloud.
After learning about AWS, I set up a basic S3 bucket to store photos for my family. Additionally, I created an IAM policy that would allow them to view and modify the contents of the specific bucket, and created users for my family members. In the future, I would like to implement at least the basic portion of the backend (with the S3 bucket, DynamoDB database, API Gateway, and Lambda function) and create a basic frontend with React that I and my family can use to organize our photos.
Machine Learning
In our machine learning practicum, we spent two days dedicated to learning about some of the theory in machine learning, and how machine learning is integrated with cloud services through pipelines to use it at large scales. First, we briefly went over the theory behind machine learning, learning about error functions, activation functions, and gradient descent. Next, we learned about the steps involved in the creation and training of a machine learning model, and learned commonly used techniques along the way such as various forms of feature engineering and cross-fold validation. Finally, we learned how these steps are achieved in the cloud through pipelines.
During the practicum, Papa (the other intern) and I used the Keras Python library to create a basic CNN with the famous mNIST dataset. We learned how to customize layers, train and test our model, and measure its performance on various metrics.
During my time on the machine learning practicum, I found new research of an application of machine learning in a field called materials informatics. The field uses elemental properties to predict the properties of chemical compounds, and additionally, attempts to discover new materials for applications such as batteries and superconductors. After reading some papers, I was able to train a random forest machine learning model that could predict the enthalpy of formation for various chemical compounds.
Scrum Master
Finally, we spent the last 2 weeks of the internship learning about the role of a scrum master. During our time there, we learned detailed information about the roles of each individual on a scrum team, how to lead scrum ceremonies, and the specifics pertaining to each of the artifacts involved in scrum. For the same team that we were developers on, we prepared to run scrum ceremonies, and created updates for the scrum of scrums.
The most challenging part of the last 3 weeks of my internship was preparing for and running the scrum ceremonies. Initially, I spent lots of time trying to anticipate the potential scenarios of what could happen in the meetings, but I realized trying to anticipate everything was counter-productive. Even though I wrote down notes of what needs to happen during each meeting and planned for potential situations that could happen, each meeting still had a large degree of uncertainty. I realized that while planning is important, it was necessary to be adaptable and to deal with things on the fly. While I was initially nervous about running meetings, as I became accustomed to each scrum ceremony and leading meetings, I gained confidence and became comfortable with the role of a scrum master.
These past 2 months at Xerris have been incredible. During my time here, I’ve learned so much as a developer, cloud architect, data scientist, and scrum master. Going forward, I would like to gain more experience working with backend development. During my internship, I spent nearly all my development time working in the frontend. When learning about system architecture, I was introduced to large-scale backend design, but was only able to implement a small backend system due to time limitations. In the future, I would like to be able to implement a larger backend using AWS to deepen my understanding of servers and cloud services, and I want to deepen my understanding of the integration between backend and frontend services, learning more about REST APIs and WebSockets.