# Strava Engineering

Engineers building the home for your active life. - Medium

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Rain: A key-value store for Strava's scale

DevFeed: [Rain: A key-value store for Strava's scale](<https://devfeed.tech/articles/rain-a-key-value-store-for-strava-s-scale-26575.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/rain-a-key-value-store-for-stravas-scale-7f580f5b4848?source=rss----89d4108ce2a3---4>)

Author: Derick Yang

Published: 2025-01-24T18:02:11Z

Content type: article

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [datasets](<https://devfeed.tech/topics/datasets.md>), [Amazon S3](<https://devfeed.tech/topics/amazon-s3.md>), [Apache Cassandra](<https://devfeed.tech/topics/cassandra.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>), [Databases](<https://devfeed.tech/topics/databases.md>)

Tags: [caching](<https://devfeed.tech/tags/caching.md>), [cassandra](<https://devfeed.tech/tags/cassandra.md>), [data](<https://devfeed.tech/tags/data.md>), [data-pipeline](<https://devfeed.tech/tags/data-pipeline.md>), [databases](<https://devfeed.tech/tags/databases.md>), [deployment](<https://devfeed.tech/tags/deployment.md>), [key-value-store](<https://devfeed.tech/tags/key-value-store.md>), [maps](<https://devfeed.tech/tags/maps.md>), [memory](<https://devfeed.tech/tags/memory.md>), [performance](<https://devfeed.tech/tags/performance.md>), [production](<https://devfeed.tech/tags/production.md>), [s3](<https://devfeed.tech/tags/s3.md>), [scale](<https://devfeed.tech/tags/scale.md>), [spark](<https://devfeed.tech/tags/spark.md>)

### AI overview

Strava's Geo and Metro teams work with large, immutable datasets derived from map, GPS, and third-party data. The article describes the challenges of serving these datasets and the limitations of using PalDB and Cassandra, including slow deployments, duplicated memory usage, cost constraints, and schema inflexibility.

### Source excerpt

Much of our heatmaps are built on batch data outputs stored in Rain At Strava, we love maps -- some of our most loved features are nestled on map surfaces. My team, the Geo team, is focused on building and improving these products. On the Geo and Metro teams, we tend to work with large datasets: aggregations of open source map data via OpenStreetMaps, GPS data points from uploaded activities, third-party datasets for properties like elevation, and beyond. This aggregated dataset eventually turns into Geo features we know and love, like the global heatmap, Strava Metro, the routing product, route suggestions, elevation profiles, and points of interest. We perform these data aggregations in a rather hefty data pipeline, run on a regular cadence to ensure we're serving up-to-date geo data. One of the Geo team's key challenges is efficiently serving large, immutable (write-once, read-many) datasets produced by our pipeline. This is particularly hard for compute-intensive use cases like routing, where: Write-Optimized vs. Read-Optimized Conflict: Traditional read-optimized data stores struggle with large batch writes without impacting read performance or introducing significant operational complexity. Cost Constraints: Storing rarely accessed datasets in production databases can be prohibitively expensive -- especially for projects like Strava Metro, which are accessed sporadically. Schema Complexity: Defining schemas externally from the service that uses them can be costly and inflexible for developers. Previously Our previous solution to large writes used a combination of datastores: PalDB and Cassandra. PalDB is a binary data format ideal for small datasets. The README states that it is optimized for "side data", relatively small datasets you read "in passing" on your service. PalDB is unideal, however, for larger datasets. In our case, since each service deployment required downloading the key-value file from S3, our deployments were taking upwards of twenty minutes. S

## Scaling Challenge Leaderboards for Millions of Athletes

DevFeed: [Scaling Challenge Leaderboards for Millions of Athletes](<https://devfeed.tech/articles/scaling-challenge-leaderboards-for-millions-of-athletes-26576.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/scaling-challenge-leaderboards-for-millions-of-athletes-9ab09ef01381?source=rss----89d4108ce2a3---4>)

Author: Mike Kasberg

Published: 2024-01-18T17:01:41Z

Content type: article

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [Scalability](<https://devfeed.tech/topics/scalability.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Redis](<https://devfeed.tech/topics/redis.md>), [legacy](<https://devfeed.tech/topics/legacy.md>)

Tags: [implementation](<https://devfeed.tech/tags/implementation.md>), [legacy](<https://devfeed.tech/tags/legacy.md>), [programming](<https://devfeed.tech/tags/programming.md>), [redis](<https://devfeed.tech/tags/redis.md>), [relational-databases](<https://devfeed.tech/tags/relational-databases.md>), [scalability](<https://devfeed.tech/tags/scalability.md>), [sql](<https://devfeed.tech/tags/sql.md>), [system-design-concepts](<https://devfeed.tech/tags/system-design-concepts.md>), [systems](<https://devfeed.tech/tags/systems.md>)

### AI overview

A Strava Engineering blog post describes replacing a legacy challenge leaderboard system after rapid growth in monthly challenge participation caused recurring bottlenecks and scalability problems. The article introduces the scaling challenges of the old system, which was implemented primarily using Redis.

### Source excerpt

Strava challenges offer a fun way for athletes to compete against themselves and others! Back in 2020, our legacy challenge leaderboard system was running into bottlenecks and scalability problems on a regular basis, and we often found ourselves putting out fires to keep the system stable. In late 2020 and early 2021, I worked on a project to replace the old leaderboard system with a new one that could handle a much larger number of athletes competing in challenges. This blog post is about that project. I drafted most of this post when the project wrapped up in 2021, but didn't get it published before I went on paternity leave -- and then I forgot about it. I think the project was interesting and worth sharing, so I'm glad I finally remembered my draft (three years later 🫣) and found some time to put in the finishing touches and get it published! Enjoy! In January 2020, Strava's monthly 5K running challenge attracted more than half a million participants for the first time. This was a big milestone, doubling the participation from just a year earlier when we had only a little more than 250,000 participants in the January 2019 5K challenge. But we weren't done growing! Just 5 months later, our challenge participants doubled again and we broke 1 million participants in a monthly challenge for the first time with the May 2020 5K, where 1.2 million Strava athletes participated! In less than a year and a half, the number of athletes participating in Strava's monthly challenges had quadrupled. As you can imagine, the increase in challenge participation came with a significant increase in load on our systems. In particular, we were beginning to approach the limits of what our existing challenge leaderboard system could handle. If the number of challenge athletes participating in our monthly challenges were to double again, our challenge leaderboard system wouldn't handle it well. We needed to do something to improve the way our leaderboard system scaled with more challenge

## Building a Data Pipeline to Track Strava's Bad Events

DevFeed: [Building a Data Pipeline to Track Strava's Bad Events](<https://devfeed.tech/articles/an-eventful-summer-at-strava-26571.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/an-eventful-summer-at-strava-5692882e5f4f?source=rss----89d4108ce2a3---4>)

Author: Bisman Sodhi

Published: 2024-01-08T20:19:46Z

Content type: opinion

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [airflow](<https://devfeed.tech/topics/airflow.md>), [Amazon S3](<https://devfeed.tech/topics/amazon-s3.md>), [Python](<https://devfeed.tech/topics/python.md>), [Amazon Web Services](<https://devfeed.tech/topics/aws.md>), [JSON](<https://devfeed.tech/topics/json.md>), [dashboards](<https://devfeed.tech/topics/dashboards.md>), [Computer science](<https://devfeed.tech/topics/computer-science.md>)

Tags: [airflow](<https://devfeed.tech/tags/airflow.md>), [apache-airflow](<https://devfeed.tech/tags/apache-airflow.md>), [aws](<https://devfeed.tech/tags/aws.md>), [data](<https://devfeed.tech/tags/data.md>), [data-engineering](<https://devfeed.tech/tags/data-engineering.md>), [data-pipeline](<https://devfeed.tech/tags/data-pipeline.md>), [data-platforms](<https://devfeed.tech/tags/data-platforms.md>), [integrity](<https://devfeed.tech/tags/integrity.md>), [json](<https://devfeed.tech/tags/json.md>), [python](<https://devfeed.tech/tags/python.md>), [s3](<https://devfeed.tech/tags/s3.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [strava](<https://devfeed.tech/tags/strava.md>), [tableau](<https://devfeed.tech/tags/tableau.md>), [warehouse](<https://devfeed.tech/tags/warehouse.md>)

### AI overview

A software engineering intern describes building a daily Apache Airflow pipeline that extracts schema-invalid user behavior events from S3, decompresses them into JSON, and loads them into Snowflake. Staging tables protect production data from partial loads, while materialized SQL views and a Tableau dashboard improve querying and monitoring.

### Source excerpt

Hi my name is Bisman and I studied Computer Science at University of California, Santa Barbara. During summer of 2022, I had the most amazing experience working as a Software Engineer Intern on Strava's Data Platform Team. In the first fews weeks, I learned the tools my team uses and then spent the rest of the time working on my project. TRACKING BAD EVENTS For my major summer project, I created a data pipeline that pulls user behavior data out of external storage and persists it in our data warehouse. Strava uses a service called Snowplow to collect this user behavior data, like loading a club page or uploading a profile photo. Sometimes, this data fails to match the schema that we've set, and a piece of data that fails this schema validation is called a bad event. Previously, these bad events were temporarily stored in an Elastic Search. Persisting this data in Snowflake, our data warehouse, makes it accessible to a wider audience. It also makes it easier to incorporate the bad events data with other services used at Strava. To start my project, I created a directed acyclic graph in Apache Airflow, a scheduling framework, using python that extracts bad events data from the S3, AWS's storage service, buckets on a daily cadence. This data was stored as gzip files on S3 which I decompressed and stored the data as JSON blobs. As I was working with billions of rows of data, it was important to maintain data integrity and take measures in case data failed to load from S3. Therefore, I loaded data into a staging table in Snowflake. The staging table ensured that if loading from S3 failed, the production table would remain untouched. This data was then loaded into the production table free of any partial data. After all the data was loaded into the production table, I created six view tables because there were six different types of bad events stored in the production table. I collaborated with our stakeholders -- data analysts -- throughout this process to craft tables bas

## Counting Authorized Athletes for Strava API Applications at Scale

DevFeed: [Counting Authorized Athletes for Strava API Applications at Scale](<https://devfeed.tech/articles/ac-count-ing-for-scale-26569.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/ac-count-ing-for-scale-becf9c27b104?source=rss----89d4108ce2a3---4>)

Author: jana

Published: 2023-04-26T18:23:14Z

Content type: article

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [API](<https://devfeed.tech/topics/api.md>), [OAuth](<https://devfeed.tech/topics/oauth.md>), [Authorization](<https://devfeed.tech/topics/authorization.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [applications](<https://devfeed.tech/tags/applications.md>), [authorization](<https://devfeed.tech/tags/authorization.md>), [data](<https://devfeed.tech/tags/data.md>), [oauth](<https://devfeed.tech/tags/oauth.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [scale](<https://devfeed.tech/tags/scale.md>), [strava](<https://devfeed.tech/tags/strava.md>)

### AI overview

Strava's API & Platform team needed to enforce per-application limits on the number of athletes authorized to connect. The article describes using OAuth2.0 refresh tokens and unique athlete IDs as a proxy for counting connected athletes, while noting the scalability challenge of counting rows in a SQL database.

### Source excerpt

Tens of thousands of API applications interact with Strava's publicly available API, from small projects whose only users are the developers who created them to larger partners like Garmin, Zwift, Wahoo, or Peloton, who upload thousands of activities to Strava daily on our athletes' behalf. Recently the API & Platform team undertook a project to redefine the way that Strava supports API applications and allows them to interact with Strava data (read more about the updated Developer program here). As part of the effort to redefine the management of API applications, a main requirement of the project asked that we be able to assign and enforce a limit to the number of athletes who are allowed to authorize an application on their behalf, what we called an application's athleteCapacity. On creation of a new application, the default athleteCapacity is a single athlete -- the application owner. Developers can subsequently apply to have their limits increased. In order to enforce the assigned athleteCapacity we needed to know how many athletes had authorized any given API application to read and write data to their Strava account, what we termed as an application's connectedAthletesCount. When a new athlete attempts to authorize an application on their behalf (as pictured below), we wanted to be able to ascertain whether the authorization would cause the connectedAthletesCount to exceed its athleteCapacity. The prompt shown to an athlete to request their permission to authorize an external application to connect to Strava on their behalf. We planned to perform the check of an application's `connectedAthletesCount` against its `athleteCapacity` on click of "Authorize". If authorization would cause the application to exceed its athleteCapacity, we would prevent the athlete from authorizing. Otherwise we would allow authorization to proceed. Our use of the OAuth2.0 standard for external access to our API gave us an easy proxy for determining the connectedAthletesCount. As part

## Migrating Strava's My Routes Page to a React Microfrontend

DevFeed: [Migrating Strava's My Routes Page to a React Microfrontend](<https://devfeed.tech/articles/searching-for-success-at-strava-26577.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/searching-for-success-at-strava-22b9bf205dbf?source=rss----89d4108ce2a3---4>)

Author: Navika Budhraja

Published: 2022-11-15T17:01:28Z

Content type: article

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [React](<https://devfeed.tech/topics/react.md>), [Front end](<https://devfeed.tech/topics/frontend.md>), [Ruby on Rails](<https://devfeed.tech/topics/ruby-on-rails.md>), [monorepo](<https://devfeed.tech/topics/monorepo.md>)

Tags: [frontend](<https://devfeed.tech/tags/frontend.md>), [micro-frontends](<https://devfeed.tech/tags/micro-frontends.md>), [react](<https://devfeed.tech/tags/react.md>), [search](<https://devfeed.tech/tags/search.md>)

### AI overview

A Strava web-frontend intern describes migrating the My Routes page from the Active Ruby on Rails monolith to a React microfrontend, then adding filtering and search for athletes' saved routes.

### Source excerpt

Me and my mentors Patrick & NomnomsIntroduction Hi, my name is Navika Budhraja and I'm a rising senior at UC San Diego studying Computer Science. This summer I was a web-frontend engineering intern on the Athlete Services team and consequently, got to learn a lot about how to develop athlete-facing products! During my internship, I worked with 3 other interns, Emily (Server), Sahil (iOS), and Ryan(Android), on a project to add filtering and searching logic to athlete's saved routes, which in my case, meant working on the My Routes page on the web. "Old" My Routes that I would be improving Like the paths of many Strava routes, adding this feature on the web was not going to be a straightforward process. As you may already know, Strava is currently in the process of moving code out of their Ruby on Rails monolith called Active to React-based frontends. Since the code for the current My Routes page lives in active, I was also tasked with migrating the page from active to a React microfrontend before adding filtering/search logic. 😱...My Face exactly when I first read my project description, especially with super rusty React skills and no conception of what a microfrontend was (was it like a tiny frontend or like a craft, hipster frontend sort of like a microbrew?). However, what I came to learn is that when you work in an incredibly supportive and encouraging environment, the process of rolling out a requested feature in just 12 weeks with no experience isn't actually as daunting as it sounds. In the spirit of the Warriors winning the championship earlier this summer (Yes, I am still riding the high), I will break down these past 12 weeks in terms of quarters of a basketball game! First Quarter: Onboarding & Jams Although I wanted to jump in and start working on a project right away, I first had to get acclimated to a new code base, actually 2 new code bases: active (the monolith) and web (the monorepo where my microfrontend will live). By fixing some minor bugs on the w

## Strava's Transition from a Ruby on Rails Monolith to Scala Microservices

DevFeed: [Strava's Transition from a Ruby on Rails Monolith to Scala Microservices](<https://devfeed.tech/articles/a-taste-of-pakora-26568.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/a-taste-of-pakora-cf3b5de261ec?source=rss----89d4108ce2a3---4>)

Author: Avery Dunn

Published: 2022-11-01T16:02:01Z

Content type: opinion

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [Microservices](<https://devfeed.tech/topics/microservices.md>), [Scala](<https://devfeed.tech/topics/scala.md>), [Ruby on Rails](<https://devfeed.tech/topics/ruby-on-rails.md>), [Developer experience](<https://devfeed.tech/topics/developer-experience.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [internships](<https://devfeed.tech/tags/internships.md>), [microservices](<https://devfeed.tech/tags/microservices.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>), [scala](<https://devfeed.tech/tags/scala.md>), [software-development](<https://devfeed.tech/tags/software-development.md>)

### AI overview

A Strava software engineering intern reflects on the company's transition from a Ruby on Rails monolith to Scala microservices. The article describes the intended benefits for team independence and developer experience, and notes that the API is evolving from REST to GraphQL.

### Source excerpt

My name is Avery Dunn and I am a rising master's student at Washington University in St. Louis studying computer science. For the past 12 weeks, I have been a software engineering intern on the API & Platform pod of the Foundation team. I am an active Strava user and have been for approximately 3 years with my favorite activity being running. Some other activities I enjoy are playing the piano, reading novels, or skiing (more of a luxury rather than a hobby). My internship at Strava has been a wonderful experience to help me learn, grow, and develop into becoming a more well-rounded, conscientious software engineer. Whether it was working with a recent hire or seasoned "Stravioli," the positive and ambitious company culture shined brightly throughout the course of the summer. In Transition From a Monolithic to Microservice Architecture Strava currently maintains a code monolith-a huge Ruby on Rails codebase that controls the user interface, business logic, and database access. For a growing company like Strava and the continuous development of ideas being made into new features, a code monolith doesn't make for a great developer experience. Trying to parse through a massive codebase and making sure that all the moving parts are in order so that a typo that was somehow glossed over can successfully be changed makes me a little dizzy, personally. The developers at Strava thought so too, and decided to embark on a transition from the Ruby on Rails singular software application to Scala microservices. Over the course of my internship, I gained insight into the process of restructuring a singular software application into Scala microservices and the benefits of that result. Scala microservices can be thought of as modules that work together but separately. They encourage diversification of teams such that each team has less of a dependence on one another like they would for a monolithic codebase. Figure 1: Comparison of a monolithic codebase architecture versus distribut

## Personal Heatmaps

DevFeed: [Personal Heatmaps](<https://devfeed.tech/articles/personal-heatmaps-26574.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/personal-heatmaps-f51d15a0db2b?source=rss----89d4108ce2a3---4>)

Author: J Evans

Published: 2022-10-28T21:15:46Z

Content type: tutorial

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [Algorithm](<https://devfeed.tech/topics/algorithm.md>), [navigation](<https://devfeed.tech/topics/navigation.md>), [pixel](<https://devfeed.tech/topics/pixel.md>), [real-time](<https://devfeed.tech/topics/real-time.md>), [Google Maps](<https://devfeed.tech/topics/google-maps.md>), [Website](<https://devfeed.tech/topics/website.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [cycling](<https://devfeed.tech/tags/cycling.md>), [data](<https://devfeed.tech/tags/data.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [gis](<https://devfeed.tech/tags/gis.md>), [google-maps](<https://devfeed.tech/tags/google-maps.md>), [gps](<https://devfeed.tech/tags/gps.md>), [heat](<https://devfeed.tech/tags/heat.md>), [map](<https://devfeed.tech/tags/map.md>), [mapping](<https://devfeed.tech/tags/mapping.md>), [navigation](<https://devfeed.tech/tags/navigation.md>), [pixel](<https://devfeed.tech/tags/pixel.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [recursion](<https://devfeed.tech/tags/recursion.md>), [running](<https://devfeed.tech/tags/running.md>), [strava](<https://devfeed.tech/tags/strava.md>), [zoom](<https://devfeed.tech/tags/zoom.md>)

### AI overview

This article explains the algorithm behind Strava's Personal Heatmap, which renders an athlete's GPS activity as a frequency-based heatmap on an interactive world map. It focuses on Mercator projection and recursive map tiling, where 256x256 pixel tiles are served at different zoom levels for real-time navigation.

### Source excerpt

This post discusses the algorithm behind Personal Heatmap, one of Strava's most acclaimed subscriber features. Product Overview The Personal Heatmap feature has been around in some form since 2015, but we gave it a major overhaul in 2020. For those unfamiliar, the heatmap is an aggregated view of an athlete's GPS-enabled activities on Strava. Activity data is rendered onto a map according to path traversal frequency; the more an athlete runs on a road, the brighter -- i.e. "hotter" -- that road shows up on the map. The result is a beautiful color gradient displaying the intricate web of past activities, unique to each athlete. The Personal Heatmap is displayed on an interactive world map, also known as a slippy map. Athletes can seamlessly zoom in and out or pan around to arbitrary views of the map, and their activity heat stays displayed the entire time. To enable this, we must provide a scheme for rendering and serving subsections of the world map on the fly. Enter map tiling. Mercator Projection & Map Tiling Map tiling is the practice of subdividing a map into many discrete images that can be stitched together and rendered as a single image in real-time during map navigation. The first step in choosing a tiling scheme is picking what world map to use. Enter, the Mercator Projection, the most commonly used projection of Earth as a flat, rectangular surface. We use this projection in all of our mapping products, including heatmaps. https://medium.com/media/d9e120d13950dd0f1bb4ee14108aa9a9/href Now, imagine a grid overlaying the Mercator projection. Each grid section is known as a tile, a pixel image with resolution 256x256. Every tile has an associated zoom level, and tiles are defined recursively according to this zoom level. A tile at a given zoom level can be subdivided into four equal sized tiles at a next zoom level. For example, Zoom level 0 displays the entire planet in a single 256x256 pixel image. Zoom level 1 displays the world in four 256x256 pixel images.

## An Intern's Experience Refactoring Strava's Saved Routes Android Feature

DevFeed: [An Intern's Experience Refactoring Strava's Saved Routes Android Feature](<https://devfeed.tech/articles/opportunity-arises-from-the-most-unexpected-26573.md>)

Original publisher: [Read original article](<https://medium.com/strava-engineering/opportunity-arises-from-the-most-unexpected-614e9e13dcb9?source=rss----89d4108ce2a3---4>)

Author: Ryan Paragas

Published: 2022-10-25T16:01:27Z

Content type: opinion

Language: en

Sources: [Strava Engineering](<https://devfeed.tech/sources/strava-engineering.md>)

Topics: [Development](<https://devfeed.tech/topics/development.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Android](<https://devfeed.tech/topics/android.md>), [Bootcamp](<https://devfeed.tech/topics/bootcamp.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [experience](<https://devfeed.tech/tags/experience.md>), [intern](<https://devfeed.tech/tags/intern.md>), [internships](<https://devfeed.tech/tags/internships.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>), [route](<https://devfeed.tech/tags/route.md>), [strava](<https://devfeed.tech/tags/strava.md>)

### AI overview

Ryan Paragas describes his 2022 internship at Strava, including his team's work on filters for Saved Routes. He explains how the Android team began refactoring a large routes presenter into separate presenters, view delegates, and filter factories, while he learned Kotlin and project-scale development.

### Source excerpt

About Me: Hey there! My name is Ryan, and I come from an unconventional background. I am not like most interns from the group in 2022. I've dropped out of college 3 times, worked in different fields for about 10 years, then transitioned into a bootcamp. Now working with Strava, they have set the expectation of what it should be like working in a professional environment. My Experience at Strava: Strava has been nothing but a wonderful experience. The weekly events they hosted to really engage the interns are motivational. The weekly AMAs were definitely my favorite of all the intern events. We got to meet the leaders of Strava and get to know them personally. The person I was most inspired by was Claude Jones. Claude also came from an unconventional background. He is a self taught programmer and worked his was up to VP of Engineering, leads motivational talks, and writes his own children books. From him I've learned that even if I don't come from a university, then I'll be able to make it in this field. So long as I continue to develop myself. https://medium.com/media/adf714e44d6915dfd4229f36178d2c49/href Aside from all the events we got to participate in, the support from my team, mentors, and managers provided for me was a whole new experience. I was given the chance to learn so much, and that definitely did not go to waste. The Project: I am on the Athlete Services Team, and my team's project was to create filters for the Saved Routes. The designs wanted us to be able to filter by sport, key word, distance, elevation, whether the route is starred or not, and who it is created by. Development: Creating this feature sounds easy right? Get the state of the filters, save it to the sheet, and apply it to the query. Yes, but there is more to it. The routes presenter and all of its associated classes are huge. So the android team wants to start refactoring that class into separate presenters, view delegates, and filter factories. Which I had the pleasure to start. In al