Кейс Duolingo: 3 минуты до ready-to-code — Лаборатория DX
Easy Кейс

Кейс Duolingo: 3 минуты до ready-to-code

Как Duolingo сократил время настройки окружения с часов до минут с помощью Codespaces

С чего всё начиналось

Настройка рабочего окружения в Duolingo когда-то была «ритуалом посвящения» — процедурой на несколько часов или дней, которая включала установку зависимостей, конфигурацию инструментов, борьбу с несовместимостями и десятки обращений к коллегам за помощью. Каждый новый разработчик проходил ритуал заново, и каждый раз вылезали новые поломки: инструкции устаревали быстрее, чем кто-либо успевал их обновлять.

Ситуацию усложнял масштаб. Duolingo мигрировал с монолита на микросервисы, число разных окружений у инженеров росло. За неделю один разработчик мог переключаться между тремя-четырьмя сервисами, каждый со своими зависимостями, своими версиями языков и своими инструментами. Локальная машина превращалась в свалку конфликтующих рантаймов.

Решение: GitHub Codespaces + Tailscale

Команда платформенных инженеров Duolingo выбрала в качестве основы для облачных окружений GitHub Codespaces. Выбор определили несколько факторов: код Duolingo хостит на GitHub, команда работает в VS Code, а Codespaces описывает окружение через devcontainer.json и разворачивает его за минуты.

У Codespaces есть архитектурное ограничение: окружения запускаются в Azure, а сервисы Duolingo живут в AWS. Разработчикам из codespaces нужен доступ к внутренним AWS-ресурсам — базам данных, API, staging-средам. Для этого Duolingo интегрировал Tailscale — mesh VPN, создающий защищённую сеть между codespace и внутренней инфраструктурой.

Архитектура такая: Duolingo держит Tailscale relay node в своём VPC в AWS, а внутри каждого codespace при старте поднимается Tailscale-клиент. Разработчик выполняет команду duo vpn (обёртку вокруг tailscale up), проходит аутентификацию через Google SSO — и получает доступ ко всем внутренним ресурсам. Соединение сохраняется между запусками codespace: открыл codespace на следующий день, VPN поднялся автоматически. По наблюдению команды Duolingo, работает надёжнее их обычного корпоративного VPN.

Как устроена автоматизация

Duolingo построил многослойную систему автоматизации на базе lifecycle commands из спецификации Dev Containers. В каждом репозитории есть devcontainer.json, где postStartCommand указывает на bash-скрипт. Скрипт вызывает соответствующую команду из duo CLI — внутреннего инструмента, разработанного платформенной командой.

duo CLI обновляется автоматически при каждом запуске codespace — отсюда нет проблемы дрейфа конфигурации. Когда платформенная команда меняет процесс настройки, все разработчики получают обновление при следующем запуске, без ручных действий.

Скрипты ставят зависимости, конфигурируют Tailscale, выставляют переменные окружения, подключают нужные сервисы. Весь процесс для основного монолитного репозитория занимает около восьми минут — от нажатия «Create Codespace» до состояния, когда можно писать и запускать код.

Результаты

Один инженер из команды Content Tooling описал свой опыт так: получил новый ноутбук и через три минуты мог разрабатывать. Эти три минуты ушли на открытие браузера, переход на GitHub и запуск codespace. Настройка самого окружения заняла ещё несколько минут, но следить за ней не требовалось — за это время можно было заниматься остальными задачами первого дня.

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

Помимо скорости онбординга, появились другие выгоды. Переключение между репозиториями стало тривиальным: новый codespace под другой сервис — и через несколько минут разработчик в полностью настроенном окружении, без конфликтов зависимостей с предыдущим проектом. Feedback loop (время от изменения кода до результата) ужался до секунд: облачные машины мощнее средних ноутбуков. Привязка к конкретному ноутбуку исчезла — рабочим стало любое устройство с браузером.

Что можно вынести из этого кейса

Несколько уроков из опыта Duolingo, применимых в других компаниях.

Инвестиция в платформенный инструментарий окупается. Написать duo CLI, собрать систему автоматических скриптов, интегрировать Tailscale — это потребовало инженерных ресурсов. Но инвестиция окупается каждый раз, когда новичок начинает писать код через минуты, а не дни, и каждый раз, когда действующий разработчик переключается между сервисами без боли.

Стандартный devcontainer.json — правильная точка входа. Duolingo взяли открытую спецификацию Dev Containers, а не делали собственный формат конфигурации. Подход переносимый: если завтра захочется уйти с Codespaces на DevPod или Gitpod Flex, devcontainer.json останется рабочим.

Сеть — главная сложность. Облачные окружения по определению живут за пределами периметра, и подключение к внутренним ресурсам нужно решать на архитектурном уровне. Duolingo решил это Tailscale, другие используют VPN-шлюзы, SSH-туннели или service mesh. Сетевую задачу стоит закрывать первой: без доступа к внутренним сервисам облачное окружение бесполезно для большинства бэкенд-разработчиков.

Автообновление инструментов — обязательная фича. Setup-скрипт, который требуется вручную обновлять в каждом репозитории, устареет через месяц. Duolingo вынесли логику настройки в duo CLI с автообновлением — и платформенная команда меняет процесс онбординга без пулл-реквестов в сотни репозиториев.

Подходит ли это вам

Опыт Duolingo показывает масштаб возможного улучшения при достаточных инвестициях в платформу — от дней до минут. Воспроизводить их архитектуру целиком не требуется: для одного монолитного репозитория без микросервисов хватит devcontainer.json и базового Codespace. При сложной инфраструктуре в приватном облаке стоит присмотреться к Gitpod Flex или Coder. Начинайте с измерения текущего времени настройки окружения и двигайтесь итеративно: каждая автоматизированная минута — это минута, которую следующий разработчик потратит на полезную работу.