Site icon AppTractor

Как в Duolingo удалили 10,000 строк кода с помощью Reaper

Когда в октябре 2012 года мы впервые выпустили наше приложение для iOS, у нас был один разработчик. За прошедшие 12 лет наша команда инженеров-программистов сильно выросла (и продолжает расти!), как и размер кодовой базы.

Недавно мы изучили количество строк кода в каждом выпуске приложения, начиная с Duolingo 4.0 в 2014 году. Наша кодовая база сейчас почти в 20 раз больше, чем десять лет назад! Хотя большая кодовая база не является чем-то плохим по своей сути, есть определенные преимущества в ее сокращении. Меньшее количество строк кода делает проект более читаемым и удобным для навигации, а также уменьшает “площадь”, которую нужно поддерживать. Даже код, который никогда не используется в производстве, необходимо обновлять при изменении зависимостей и связанных файлов. Это приводит к потере времени как для инженера, вносящего изменения, так и для ревьювера. Очистка неактуального кода не только повышает скорость работы разработчиков, но и может иметь последствия для пользователей. Например, меньшее количество кода означает меньший размер приложения, что особенно полезно для учащихся в районах с низким уровнем связи.

Наша первая попытка заключалась в проверенном и верном методе — мы удаляли файл и пытались собрать приложение заново. Если сборка удавалась, мы знали, что можно удалить этот файл. Этот метод работал, но занимал много времени и был неэффективным, поскольку полагался на наши знания и память.

Далее мы изучили инструменты с открытым исходным кодом, такие как Periphery, для статического анализа кодовой базы и генерации отчетов о неиспользуемом коде. Это значительно ускорило процесс, так как требовалось запустить инструмент всего один раз, охватив всю кодовую базу без опоры на человеческую память. Однако, даже очистив мертвый код, мы подозревали, что можем сделать больше.

Инструменты, которые мы использовали ранее, могли выявить код, на который никогда не ссылались, но они не могли сказать нам, какой код никогда не использовался, когда приложение действительно работало с нашими пользователями. Это различие очень важно, поскольку приложение Duolingo ведет себя по-разному в зависимости от инструкций, поступающих с наших внутренних серверов. Например, наши серверы диктуют, какие упражнения появляются в уроке. Мы также проводим множество A/B-тестов, в которых после завершения теста некоторые пути кода больше не используются. Такой неиспользуемый код не может быть обнаружен инструментами статического анализа.

К счастью, у наших друзей из Emerge Tools, с которыми мы сотрудничали в прошлом году, появился новый инструмент под названием Reaper. Этот инструмент выявляет код, который никогда не вызывается во время выполнения. Интеграция Reaper в наше приложение заняла всего одну строчку кода, и мы запускаем его на всех версиях приложения в нашей бета-программе, начиная с версии 7.7.0 в январе 2024 года.

После того как наши ученики поработают с приложением некоторое время, мы проверяем дашборд в Emerge Tools, чтобы увидеть все неиспользуемые классы, о которых сообщает Reaper:

Хотя анализ одной версии приложения может быть полезен, он может дать ложные срабатывания, например, новые классы, которые еще не были запущены из-за неактивных A/B-тестов. Чтобы получить более четкое представление о действительно неиспользуемых классах, мы собрали отчеты по всем версиям, выпущенным с момента интеграции Reaper, и выявили классы, неиспользуемые ни в одной из версий. Некоторые классы казались используемыми, но находились в частях приложения, к которым редко обращались наши бета-пользователи, например, при прохождении всего курса. Даже отфильтровав их, мы обнаружили гораздо больше неиспользуемых классов, чем ожидалось.

Яркий пример — упражнения, показываемые в уроках. Код приложения поддерживает различные типы упражнений, но некоторые упражнения “уходят на пенсию” или никогда не запускаются полностью, оставляя свой код в приложении. Благодаря Reaper мы выявили четыре типа упражнений, которые никогда не используются.

С момента внедрения Reaper мы проанализировали результаты только дважды и удалили более 10,000 строк кода, что составляет почти 1% нашей кодовой базы!

Использование Reaper стало отличным способом оптимизировать нашу кодовую базу. Мы с нетерпением ждем будущих возможностей, таких как автоматизация этого анализа и добавление предупреждений о новых неиспользуемых классах, даже потенциальное обнаружение неиспользуемых изображений и анимаций. С помощью наших друзей из Emerge Tools мы уверены, что еще больше улучшений не за горами. Мы советуем командам, которые подозревают, что в их приложении есть неиспользуемый код, попробовать Reaper — вы будете удивлены, что сможете найти.

Успех, которого мы достигли в оптимизации нашей кодовой базы с помощью таких инструментов, как Reaper, — это лишь один из примеров того, как мы постоянно стремимся к совершенствованию и инновациям. Наши инженеры играют решающую роль на этом пути, обеспечивая как техническое совершенство, так и впечатляющий пользовательский опыт. Если вы увлеченный инженер, которому не терпится решить сложные проблемы и изменить мир к лучшему с помощью образования, мы принимаем вас на работу!

Источник

Exit mobile version