This post was written by Alex Ozdemir in the fall of 2018.
I’ve been lucky enough to intern at Coursera not just once, but twice. While I had been an intern at other software engineering firms before, my experiences at Coursera gave me a fundamentally deeper understanding of software engineering than my prior internships did. In this blog post I’ll explore the work I did and the lessons I learned, and reflect on what it was about Coursera that made this learning possible.
My Path to Coursera
I care a lot about education. I did my undergraduate studies at Harvey Mudd College, a school known for high-quality teaching and high expectations of its students. While there I was very involved in tutoring, and even got the opportunity to teach a real course of my own. When senior year rolled around and I decided to apply to C.S. PhD programs in the hope of being a professor one day, no one was surprised.
But of course academics aren’t the only thing I enjoy, and as April 15th (the day grad school decisions are due) approached I realized I wanted one more year to explore the world. I knew that graduate school would train me to be a good researcher, but also that I would need other experiences to build a complete perspective on education. Motivated by a desire to explore education more holistically, I deferred my enrollment for a year and made arrangements to spend the summer as an intern at Coursera and the next academic year as a computer science and mathematics teacher at Loomis Chaffee, a high school in Connecticut.
I hoped that working at Coursera would provide an opportunity to learn more about online education. It certainly did that, but as I’ll explain below, it also was a wonderful way to learn about the many-faceted practice that is software engineering.
The First Summer: The Front Lines of Product Development
My first summer at Coursera was both busy and educational. I joined a team of engineers who were responsible for Coursera’s Degrees program, which meant they spent their time expanding the Coursera platform to enable universities such as the University of Illinois, University of Pennsylvania, and HEC Paris to offer online degrees. Coursera’s goal of supporting low-cost, high-quality degrees by providing a scalable technological platform was something I could really get behind. As a student who had just completed a very expensive college degree, it was clear to me that society would benefit from a more scalable educational platform.
My work that summer predominantly concerned the front end of Coursera’s website — all the code that runs in your browser when you visit coursera.org. I’m the sort of person who builds DSLs and reprograms old vending machines in his spare time, so doing front-end development was new for me. It was a ton of fun, though, and it was a great opportunity to learn about the state of React, Redux, Flow, GraphQL, and other front-end technologies used at Coursera. The summer passed quickly as we launched new features, improved our support for course assistants, and laid the foundation for team assignments on the Coursera platform.
In the final weeks of the summer I took a step away from an otherwise implementation-focused internship to work on a project that was just getting started. The idea was simple but open-ended: Since many students in degree programs use Slack to communicate with one another, we wanted to integrate Slack into the team assignment experience. My task was to investigate the Slack API and determine which kind of integration would be best. My daily work changed from hashing out specifications and writing code to discussing user desires and investigating the extent of Slack’s API. It was an interesting task, and by the end of the summer I had put together a rough proposal for how the integration should work.
Whether I was programming or designing, that summer at Coursera was a ton of fun. It gave me the opportunity to take ownership over features that were socially beneficial, critical to Coursera, and going to see immediate use. I appreciated that Coursera gave me the opportunity to work on important and user-facing work.
The Second Summer: A Heads-Up Attitude
After that summer at Coursera I moved out to Connecticut for a year-long teaching job. It was a fun, interesting, and rewarding year. While I could talk your ear off about it, I’ll refrain from doing so and instead fast-forward through the school year to the beginning of the next summer. Clearly remembering how enjoyable my summer at Coursera had been, I reached out to my mentor and asked her if I could come back for a second internship. Fortunately they had a spot available, and in early June I found myself back at Coursera, ready to build and learn even more.
Going into my second internship, I was thinking about what it was like to do the early work for the Slack integration project. I really enjoyed the experience because it had given me exposure to a new part of software engineering, and I was eager to continue to explore software engineering and software systems during my second summer. Throughout the summer I kept my head up, looking for interesting ways to learn more about Coursera and its software systems. My team was happy to let me do so, and over the course of the summer I worked on many different kinds of things, detailed below.
Infrastructure: The Sun Sets on Cassandra
Coursera had begun a migration from Cassandra to a more traditional data-storage system, and I spent my first few weeks working on a small part of it. The project served as a great opportunity to learn about Courral, Coursera’s in-house system for managing the relationship between data-storage services and the application layer. One of the most interesting parts of the project was learning more about the infrastructure team’s perspective on the company — the way in which they build tools and internal platforms to facilitate production engineering and guide developers toward patterns that are maintainable and robust.
Developer Experience: Accelerating Engineering, a Few Seconds at a Time
I’ve always enjoyed working on developer tools and build systems, and this summer I made a point of looking for opportunities to improve the developer experience. I did many small projects in this area, and I’ll describe just one of them here.
Coursera uses an in-house open source language called Courier to define data types in a way that generates data types and serialization code in multiple languages. Courier has an IntelliJ IDEA plugin that extends IntelliJ to provide go-to definition, find-usages, and other useful actions and analyses for Courier files. A few days into my internship I discovered a limitation in the plugin: While it allowed smooth navigation within Courier, it did not provide effective navigation between Courier and Scala. For example, there was no way to navigate from a generated Scala type to the Courier specification that produced it. After a day or two of learning about the IntelliJ plugin API, I fixed the problem by adding a new action to the plugin that let one go from a generated Scala type to its Courier definition. The action saves only a few seconds’ worth of time (however long it takes you to find the file manually), but developers at Coursera use it hundreds of times each day, so the benefit adds up.
Coursera Culture: Intern Make-a-thon
Coursera has a semi-annual tradition called “Make-a-thon” that brings the whole company together for three days of Wild West ideation and prototyping. Intentionally referred to as a “make-a-thon” and not a “hack-a-thon,” the event includes not just engineers but all of Coursera, and the ideas generated are similarly diverse. Unfortunately the summer intern cohort doesn’t get to participate because there isn’t a summer Make-a-thon, but given the importance of the event to Coursera’s culture, this year we put together a special “intern Make-a-thon” for the summer interns. During the two-day event about eight interns teamed up to prototype a new product idea. Everyone chipped in — seasoned employees from engineering and HR provided logistical support, facilities accommodated the unusual time and space demands, and one engineer even ran a special front-end tutorial for our (dominantly back-end) intern cohort.
All that support paid dividends — the event was a blast! It gave our intern cohort an opportunity to work together and traverse the entirety of Coursera’s stack in an independent way. Alas, the product that we explored is still in the pipeline, so I can’t say much more about it now…
Renewing the Cycle: More Early-Stage Investigations
I’ve walked you through a number of categories of work that I did this summer, but the final category is the one that took the majority of my time: a whole bunch of early-stage investigations into potential projects. Throughout the summer, my team would come up with a (somewhat hazy) idea for a product or improvement and ask me to look into it. As before, doing these investigations required many different skills: identifying stakeholders and product owners and understanding their needs, exploring Coursera’s infrastructure and its limitations, and always keeping an eye out for latent opportunity.
One of my investigations was a total deadend: It didn’t reveal any project ideas. Another led to an easy and impactful improvement to one of our core systems. However, in hindsight my favorite investigation was into Coursera’s email system, not because it led to a cool project for me to complete, but because it led to a cool project that helped somebody else get introduced to the Coursera stack.
The project idea was simple: move Coursera’s email templates out of version control (git) and into an (internal) online tool that allowed them to be edited by anyone at the company — not just engineers. When the fall interns arrived, the mentor of an incoming intern and I realized that this would be a great starting project for them, and so I got the opportunity to take on an advisory role as they turned the new workflow from an idea into reality.
Bringing It All Together: The Moral of the Story
All in all, my internships at Coursera have given me the opportunity to do all kinds of cool work. I’ve focused on quickly and accurately building new features, helped migrate data from one storage system to another, identified and remedied quirks in the developer experience, investigated potential projects, been an advisor to an onboarding intern as they worked on a start-up project, and played a part in bringing a fixture of Coursera’s culture (Make-a-thon) to the summer intern cohort. I’m extremely grateful to the company because this wealth of opportunities has given me a broader and more complete understanding of the practice of software engineering. While I’ve never been naive enough to think that being an engineer was all about writing code, prior to my time at Coursera I didn’t realize just how many kinds of infrastructural, investigative, cultural, and managerial work needs to be done to keep a software firm working well.
Why did I learn this here? What is it about Coursera that facilitates such growth? The answer is simple: Coursera gives their interns a daring amount of responsibility and independence. They provide excellent mentorship¹, and encourage you to be the best version of yourself. This is totally consistent with Coursera’s mission, because at the end of the day Coursera is about education — not only the education of millions of people distributed around the globe, but also the education of those few lucky enough to be a part of a small company in Mountain View trying to bring education to all.
Looking Forward: What I Think This Will Mean to Me in Ten Years
As I said in the opening section, my time at Coursera was always going to be temporary. I was scheduled to start a PhD in computer science this fall, and a few weeks ago I did exactly that. My hope is to be a professor one day, and as such I probably won’t get the opportunity to do all that much software engineering. So, the question is begged: “Does any of this matter?” And the answer is “Of course!” Even if I won’t be doing much engineering, no doubt my students will, and I’ll be better able to teach them about software engineering because of my experiences at Coursera. Will I, in the classroom, be able to provide a true impression of what it’s like to work at a software firm? Probably not, but I sure am excited about trying.
 Really, the mentorship is excellent. I’m deeply indebted to my two mentors: Holly Xu (first summer) and Daniel Shusta (second summer) as well as Priyank Chodisetti (my engineering manager for both summers).