Duolingo — один из самых популярных ресурсов для изучения иностранных языков. Мы поговорили с Александром Гусевым, iOS-разработчиком Duolingo, и выяснили, как попасть в компанию и как там организован процесс разработки приложений.
Как идет отбор разработчиков в Duolingo? Как вы попали в компанию?
Я нашел вакансию iOS разработчика в Duolingo сам, в марте 2016 года. В то время мы с семьёй жили в Амстердаме и подумывали о переезде куда-нибудь ещё. Я давно увлекаюсь иностранными языками и лингвистикой, и приложением Duolingo пользовался активно с самого его появления, оттого был приятно обрадован тем, что они ищут iOS-разработчика. Ну и решил попытать удачи.
Вскоре после того, как я отправил своё резюме, мне предложили выполнить «домашнее задание» — написать небольшое iOS-приложение, удовлетворяющее определённым требованиям, в течение недели. Затем последовали два телефонных собеседования, первое с менеджером по персоналу, а второе — с разработчиками.
Где-то неделю спустя меня пригласили в главный офис компании на серию личных, face-to-face, собеседований, и вот одним солнечным весенним утром я оказался на пороге офиса Duolingo в Питтсбурге.
В первой половине дня я решал алгоритмические задачки и прошёл через несколько подходов «программирования на доске» с CTO и старшими инженерами компании, после чего я был приглашён на общеофисный обед, где я смог встретиться и пообщаться с весьма дружелюбными будущими коллегами.
Далее должен был последовать раунд более платформо-специфичных собеседований с iOS-разработчиками, но он как-то плавно вылился в беседу о том, чем я занимался до этого и с какого рода задачами и сложностями разработчики Duolingo сталкиваются сейчас. Многое было обговорено, и ни единой строчки кода не написано. Хоть она и была несколько неожиданной, эта часть интервью была крайне познавательной и очень мне понравилась.
Другой сюрприз ждал меня вечером, когда мне сообщили, что я приглашён на ужин в ресторане с основателями компании и рядом других участников команды. Вот это уже было не совсем похоже на предыдущие мои собеседования.
Как если бы ужина в ресторане было недостаточно, после него мы (спонтанно) пошли в местный бар послушать концерт нескольких питтсбургских рок-групп, и поддержать одного из сотрудников Duolingo, игравшего в одной из них. Такой вот опыт собеседования.
Я получил оффер по электронной почте в начале следующей недели, согласился, и так начался длительный процесс получения визы в США. Ушло 7 месяцев, чтобы закончить все формальности и получить наши паспорта с визами, и вот, наконец, в первых числах ноября наша семья прибыла в Штаты.
Какие инструменты используются в Duolingo для разработки?
Технологический стек Duolingo не сильно необычен: для ведения проектов мы используем JIRA, прежде пользовались Asana, и некоторые команды по-прежнему её используют, но компания в целом постепенно мигрирует на JIRA.
Весь код версионируется на приватных репозиториях в Github. Большая часть проектов используют Github и для код ревью. Изменения в код бэкэнда проверяются в Gerrit Code Review.
Внутри компании ведётся вики на базе Google Sites, каждый сотрудник может её совершенствовать и дополнять. Google Docs активно используем для всякого рода отчётов, таблиц и презентаций.
Основной канал связи внутри компании — Slack, через Zoom устраиваем видео-конференции (ряд сотрудников работает удалённо). Электронной почтой нас обеспечивает корпоративный Gmail.
Большая часть новых фич внедряется посредством экспериментирования, для чего используем свой собственный фреймворк A/B-тестирования. На данный момент большая часть получаемых в ходе экспериментирования данных собирается и в дальнейшем анализируется в Mixpanel.
Для UI и UX дизайна многие дизайнеры предпочитают Sketch.
В целом сотрудники практически не ограничены в выборе инструментов для работы, так, например, разработчики вольны пользоваться любимым текстовым редактором или IDE. Вместе с тем большинство проектов имеют платформо-специфичные стилистические правила и coding conventions, которых следует придерживаться.
Что же касается iOS-разработки, большая часть iOS-программистов предпочитают писать код в Xcode. Большая часть iOS-проектов использует CocoaPods для управления зависимостями, а ещё мы начинаем постепенно внедрять fastlane для упрощения релизов.
Как тестируются проекты и функции?
Для приложений тестирование связано с релизами и происходит следующим образом.
Сначала весь новый код должен пройти код-ревью, в рамках которого изменение должен одобрить хотя бы один старший разработчик. После этого внутренняя сборка для данной фичи может быть передана в тестирование.
В тестирование отдаётся большинство всех изменений, в частности, любые масштабные изменения, все видимые для пользователя изменения, и все новые фичи. В офисе работает несколько QA-инженеров, каждый из которых «прикреплён» к одной или нескольким командам и тем самым ответственен за тестирование изменений и фич этих команд.
Очень часто те же сборки, которые отдаются в тестирование тестировщикам, делают доступными и для любых желающих внутри компании. Так даём возможность большему числу сотрудников попробовать новые фичи и рассказать их авторам о своих впечатлениях или о найденных проблемах.
Только после успешного код-ревью и успешного же QA новый код вливается в основную ветку разработки. Так держим master-ветку стабильной и всегда готовой к публичным релизам.
iOS- и Android-приложения выкладываются в магазины раз в две недели, чередуя недели, чтобы равномерно распределять нагрузку на QA. Юнит тестирование является частью каждого релиза, все тесты должны проходить успешно, прежде чем будет собран релиз-кандидат. Одна или несколько таких релиз-кандидатных сборок проходят через более тщательное ручное QA-тестирование, а также ряд автоматизированных тестов. После того как любые серьёзные недостатки исправлены (если они были) и все участники довольны качеством сборки, iOS-приложение отправляется на ревью Apple, а для Android-приложения начинается постепенная выкатка на всех пользователей. Такая выкатка обычно длится пару дней и приостанавливается в случае обнаружения проблем.
Что же касается бэкэнда, небольшой набор юнит-тестов и прогон статического анализатора запускаются на каждый пулл-реквест. Разработчики также могут выкатывать свои изменения на внутренние тестовые сервера и прогонять на них смоук-тесты, это можно делать прямо из соответствующего Slack-канала.
Ещё мы постоянно, несколько раз в день, прогоняем в автоматическом режиме более охватывающий набор тестов Selenium и Appium на веб-сайте и приложениях в продакшн-окружении. Помимо этого масштабные изменения, с которыми может быть связан риск, выкатываются изначально на небольшой процент серверов и пользователей (т. н. канареечное развёртывание). Когда есть основания ожидать скачки трафика, например перед запуском новой крупной фичи, заранее проводим нагрузочное и стресс-тестирование на бэкэнде.
Какие процедуры управления проектами существуют в Duolingo?
Компания организована в небольшие команды (обычно не более 8 человек), некоторые команды организованы вокруг конкретных проектов, приложений или фич, некоторые — вокруг определённых тем.
Идеи для новых фич и того, над чем работать далее, генерирует вся команда, после чего менеджер по продукту и менеджер команды работают вместе с другими участниками команды (и с другими командами, при необходимости), чтобы реализовать эти идеи. Работаем короткими спринтами, чтобы лучше держать темп разработки и следить за тем, сколько и на что у нас уходит времени. Стараемся двигаться шустро и проворно.
Квартальное планирование осуществляется посредством OKR-техники (Objectives and Key Results — цели и ключевые результаты). Каждая команда ставит перед собой ряд целей, которых она хочет достичь за квартал, и измеримых результатов, которые ожидает увидеть, это делается перед началом каждого квартала. По окончании квартала фактические результаты анализируются, и команда отчитывается перед компанией, полученный опыт используется при планировании следующего квартала.
Есть ли карьерный рост и в чем он заключается?
Я могу сказать, что Duolingo высоко ценит карьерный рост своих сотрудников, чётко и ясно излагая пути для возможного роста.
В интранете доступна таблица со списком специальностей внутри Duolingo (здесь они называются «job families» — «семейства профессий») наряду с соответствующими «карьерными лестницами». Каждое семейство профессий включает набор должностей, а также требований и квалификаций, ожидаемых от каждой должности.
Повышения происходят два раза в год. Сотрудники могут номинировать себя на повышение сами, если они считают, что достигли уровня квалификации, необходимого для более старшей должности, либо их ролевой менеджер может принять решение о номинации сам. После этого комитет повышений, состоящий из старшего менеджмента и сотрудников старших должностей, решает, кого повысить, голосованием с простым большинством.
Специально для разработчиков совсем недавно была введена новая для компании роль тех-лида. Хотя тех-лид и не является должностью как таковой, он даёт возможность разработчикам проявить лидерские качества и может помочь проложить дорогу к будущему повышению.
Как течет жизнь разработчиков в Duolingo?
В Duolingo очень дружная и сплочённая команда. Всё начинается с ежедневных совместных обедов (в офисе работает свой повар), когда вся команда обедает за двумя длинными обеденными столами. Обед — отличная возможность пообщаться с коллегами на самые разные темы, связанные с работой или нет. Помимо этого почти каждую неделю организуются разнообразные интересные вылазки для сотрудников и членов их семей. Наконец, каждую неделю проходит Q&A-сессия с CEO компании, в течение которой происходят важные анонсы, и каждый сотрудник имеет возможность в неформальной обстановке задать CEO любой вопрос о компании, целях и планах, да и, в общем, о чём угодно, лично или анонимно.
К перерывам от работы тоже серьёзно подходим — есть игровой уголок с теннисным столом, бильярдом и настольным футболом, который пользуется большой популярностью после обеда. Мини-кухня со здоровыми (и не очень) вкусными закусками открыта весь день и снабжает офис необходимыми калориями. Сотрудники, начинающие работать позже и остающиеся в офисе допоздна, собираются вечером на совместный ужин, блюда заказываем из ресторанов поблизости.
В целом стараемся поддерживать неформальную атмосферу в офисе: неудивительно наблюдать CEO рассекающим по офису на общем самокате или видеть сотрудников, работающих на уютных диванах, а не за своими рабочими местами.
Многие люди в компании — представители разных стран, культур и обычаев, что безусловно помогает в разработке продукта, которым пользуются в разных и часто сильно отличающихся друг от друга уголках мира. Большое число сотрудников по-настоящему заинтересованы изучением иностранных языков и пользуются продуктами компании ежедневно.
Вообще довольно быстро создается ощущение, что работающие здесь люди сплочены и едины в своей миссии помогать людям по всему миру учить иностранные языки. Очень здорово быть частью этой команды.
Duolingo — обучение иностранным языкам, а как и чему учатся разработчики в компании?
Мне трудно говорить за всех разработчиков компании, но я встречал много программистов, работающих на платформах, отличных от платформы своей основной специализации, например, мобильных разработчиков, выполняющих изменения на бэкэнде для поддержки новых фич в мобильных приложениях. Помимо этого, здесь нетрудно встретить людей, весьма радикально сменивших свои роли и переквалифицировавшихся в новые области, например, из бэкэнд-разрабочтика в SEO-оптимизатора. Ну и наконец, в компании есть несколько по-настоящему фулл-стек программистов, способных как разрабатывать новые, так и поддерживать действующие продукты сразу на нескольких платформах.
За себя могу сказать, что я в данный момент знакомлюсь с бэкэнд-разработкой, и делаю ряд изменений на бэкэнде и фронтэнде для поддержки нового вида занятий в iOS-приложении. Я таким до сих мало занимался, и мне это в новинку как iOS-разработчику. В то же время новые платформы — это увлекательно и интересно, плюс потенциал для дальнейшего роста в этих областях.
В целом сотрудников компании ничто не останавливает от приобретения новых навыков, особенно если эти навыки помогают им лучше выполнять свою роль или идут на пользу их работе в команде. Здесь легко учиться у более опытных разработчиков посредством парного программирования. Кроме того, мы регулярно организуем в офисе технические презентации на самые различные темы, рассказывают как сотрудники компании, так и приглашённые докладчики. Любые желающие в офисе могут принимать участие и приобретать новые знания на таких презентациях.
Спасибо!