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. Разработчикам нужен доступ к внутренним AWS-ресурсам — базам данных, API, staging-средам — из своих codespaces. Для решения этой задачи 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 — внутреннего инструмента, который Duolingo разработал для своих инженеров.

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

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

Результаты

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

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

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

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

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

Инвестиция в платформенный инструментарий окупается. 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. Начните с измерения (сколько сейчас занимает настройка окружения) и двигайтесь итеративно: каждая автоматизированная минута — это минута, которую каждый следующий разработчик потратит на полезную работу.