Русский
Русский
English
Статистика
Реклама

Badoo

Анонс как создаются Highload проекты на PHP

27.07.2020 16:04:10 | Автор: admin


Вы просили, и мы сделали! Теперь наши прямые эфиры проходят во всех соцсетях сразу завтрашний стрим можно будет посмотреть на нашем youtube-канале, в ВК, Facebook и в Инстаграме



Завтра, 28 августа, в 20:00 пройдет прямой эфир с Александром Высоцким ведущим PHP-разработчиком в лондонском офисе Badoo, работает в команде антиспама. Ну что, готовы поговорить про PHP?



Саша ответит на ваши вопросы, а также расскажет:

  • Как PHP позволяет быстро разрабатывать масштабируемый проект и почему он подходит для решения именно их задач.
  • Почему Badoo использует не микросервисы, а монолит.
  • Как релизиться два раза в день, когда у тебя два продукта на нескольких платформах и сотни версий клиента.
  • О специфике работы инженера в антиспам-команде: ML, очень много данных и создание инструментов для других команд.
  • PHP и MySQL: что делать для оптимизации производительности бэкенда.
  • Как перевезти в Лондон жену, чтобы она поступила в университет, а не скучала дома. Налоги, местная медицина, жилье на двоих.
  • Что помогало ему каждый раз адаптироваться на новом месте.
  • Как инженеры Badoo движут русскоговорящее PHP-сообщество: конференции, митапы, блог и неформальные сходки разработчиков.



Вы можете задавать вопросы к Александру прямо здесь в комментариях, он ответит на них во время прямого эфира.

Как не пропустить эфир?



Выбирайте платформу, которая вам нравится


Нажмите кнопку Напомнить

До встречи в эфире!

Подробнее..

Как создаются Highload проекты на PHP расшифровка

08.08.2020 12:09:15 | Автор: admin


28 июля в нашем инстаграм-аккаунте и ютубе прошел прямой эфир с Александром Высоцким ведущим PHP-разработчиком в лондонском офисе Badoo, который работает в команде антиспама. Саша рассказал о том как создаются Highload проекты на PHP, своей жизни в Лондоне и, конечно, про Badoo.

***

Меня зовут Высоцкий Александр, я работаю в компании Badoo ведущим PHP-разработчиком.
Мы делаем Badoo и Bumble это онлайн-платформы для знакомств. У нас 500 миллионов пользователей по всему миру. В команде 300 человек, у нас 2 офиса разработки в Москве и Лондоне, 20 open source-проектов и множество других внутренних инструментов.

Я родом из Саратова, там же получил профильное образование. Я закончил специалитет и аспирантуру на Факультете компьютерных наук и информационных технологий СГУ. К моменту окончания аспирантуры успех поработать на позиции backend- разработчика в разных областях, от туристической сферы до игр. В середине 2016 основной проект завершился, и передо мной возник вопрос: что делать дальше искать что-то новое в Саратове, переехать в Москву или Санкт-Петербург или податься в зарубежные компании? Тогда я уже знал о Badoo, и сделал apply на открытую позицию в лондонский офис. Правда, мне не хватило опыта и знаний, чтобы получить offer, но параллельно мне пришли предложения о работе из Германии и Нидерландов, и я решил вместе с супругой переехать и работать в немецкой компании. Полтора года жили в Лейпциге это город в Саксонии, в десятке крупнейших городов Германии. Я там работал над туристическими решениями. Однако желание работать в Badoo не пропало, и я подался на открытую позицию еще раз, через год. После нескольких интервью по телефону и одного on-site мне сделали offer. В начала 2019 года я релоцировался уже в Лондон.

Я хочу рассказать, каково работать на позиции backend-разработчика в Badoo, в условиях двух релизов в день, реального highload и миллиона строк кода, как адаптироваться к жизни и работе за границей и сохранить при этом семью.

Насколько бесшовен deploy в условиях монолитности?


Ответ на этот вопрос можно разделить на две части. Первая техническая реализация нашего CICD-pipeline, ее хорошо описал мой бывший коллега Юрий Насретдинов в своем докладе на HighLoad (5 способов deploy PHP-кода в условиях highload). Я его рекомендую посмотреть. Если коротко у нас есть несколько сотен серверов, которые обслуживают запросы пользователей. При deploy мы раскладываем только изменения в репозитории и атомарно переключаем symlink. Вторая проверка того, что deploy не разломает нам production. Любой код перед выкладкой проверяется с помощью unit, интеграционного и UI-теста, а также статическим анализатором, на предмет явных проблем. У нас большой и профессиональный QA-отдел, позволяющий успешно релизить 2 раза в день.

Используете ли DDD или другие архитектурные паттерны?


DDD это Domain Dream Design. Это не архитектурный паттерн скорее, а методология. Я бы не сказал, что у нас используется один конкретный подход, скорее комбинация из нескольких. Насчет паттернов в backend для решения задач используется несколько паттернов проектирования, я бы хотел выделить это подробно: наш отдел их активно разрабатывает, и они помогают нам эффективно решать задачи. Мы активно используем реализации [5:17 ???], у нас есть очень много очередей, мы отправляем миллионы событий, которые обрабатываются соответствующими консумерами. Также среди активно используемых паттернов есть модуль: большая часть нашего кода разбита на отдельные связанные инстансы, которые взаимодействуют через ограниченный открытый API.

Какие фреймворки используются?


У нас свой, внутренний фреймворк, мы не используем сторонние открытые решения.

Как PHP позволяет быстро разрабатывать масштабируемый проект, и почему он подходит для решения именно этих задач?


Объемный вопрос, я его разобью на несколько частей.

Безусловно, PHP это отличный инструмент, который позволяет нам решать задачи web-разработки. Но отношение к нему в сообществе неоднозначно, и это связано с его репутацией. С самого появления PHP бытовало мнение, что на нем очень легко писать плохой код но, по моему мнению, низкий порог входа не является недостатком. Наоборот, это позволяет приобщить к разработке широкий круг людей. Кроме того, он действительно позволяет хорошо решать задачу разработки web-приложений, и с каждой новой версией язык улучшается. PHP 7 сделал огромный шаг вперед по части performance и удобства разработки. У нас в блоге на Хабре есть отличная статья о том, как переход на эту версию позволил нам высвободить значительную часть ресурсов.

Популярность PHP в последнее время падает, и это закономерно появляются другие инструменты и языки, которые конкурируют с PHP, и многие разработчики на них переключаются. Но у нас принято подбирать инструменты под конкретную задачу, и PHP с задачей справляется.

Почему Badoo использует монолит, а не микросервисы?


Это довольно холиварный вопрос, сообщество расколото на два лагеря по этому поводу. Ни для кого не секрет, что у нас используется монолитная архитектура, и за время существования проекта мы научились бороться с минусами этого подхода и использовать все его преимущества. Кроме того, у нас есть набор сервисов (на Go, PHP, C++), которые мы активно используем в повседневной работе. Если понимать вопрос как стоит ли нам бросать все и применять все наличные ресурсы для переписывания существующего монолита под микросервисную архитектуру я считаю, что нет. У нас есть бизнес-задачи, с которыми существующее решение успешно справляется. Если будет такая необходимость, мы это сделаем, но, как я уже говорил, мы выбираем инструмент в соответствии с решаемой задачей.

Как релизиться 2 раза в день, когда у тебя 2 продукта на нескольких платформах и сотни версий клиента?


У нас очень короткий релиз-цикл и, действительно, два deploy в день. Нам очень важно поддерживать качество работы нашего продукта на высоком уровне мы не хотим выкатывать в production баги/фаталы. Поэтому на первое место выходит тестирование фичей, которые катятся на production. Я уже упоминал о том, что у нас есть большой набор инструментов для тестирования каждого релиза, и это позволяет нам выкатывать минимальное количество багов/фаталов на production. Кроме того, у нас есть подход, который связан с тем, что каждый backend-разработчик отвечает и заинтересован в том, чтобы его фича на backend запустилась без каких-либо дополнительных действий со стороны его отдела и со стороны frontend и mobile-команд. Может быть такая ситуация, когда у тебя есть тикет на разработку backend-фичи, ты ее релизишь на production, но она реально начинает использоваться только через какое-то время. И тогда к тебе приходят QA-инженеры и спрашивают, почему она не работает. Поэтому мы на стороне backend при релизе функционала покрываем его максимальным количеством тестов, моков и QAP, чтобы быть на 100% уверенными в том, что все, что мы катим на 100% рабочее.

Стоит ли идти в крупную компанию из фриланса на меньшую ЗП, если до этого не было опыта работы в крупной компании?


Дисклеймер: вы можете зайти на наш сайт tech.badoo.com, где мы выкладываем текущие вакансии. Может быть, попадется что-то по душе, и вы попробуете сделать apply.

Тут вопрос, скорее, не про зарплату, а про процессы, связанные с переходом в крупную компанию. Если заниматься фрилансом значит, ты сам для себя устанавливаешь рабочий день и строишь рабочие процессы, которые тебе позволяют доводить задачи до конца. В компании все по-другому: жесткие дедлайны, гораздо больше коммуникаций как между коллегами в команде, так и между командами. Нужно подумать, подходит ли такой темп и формат работы для тебя, и принимать решение, исходя из этого. А насчет зарплаты надо смотреть на перспективу. Если сейчас отказаться от большой зарплаты на фрилансе и перейти на меньшую, в компанию, то впоследствии зарплата может вырасти сильнее благодаря опыту в индустрии.

Расскажите, были ли такое, что production не выдерживал highload и как с этим боролись?


На моей памяти не было. У нас опытные инженеры, наш продукт разрабатывается уже более 15 лет, и у компании огромный опыт именно highload-разработки. Мы нацелены на то, чтобы performance наших приложений был на максимуме.

Какие плюшки в Badoo относительно мелких компаний?


Об этом лучше прочитать на нашем сайте, там лучше написано, чем я могу перечислить. Но основные моменты, которые не могут не радовать это DMS, компенсация фитнеса, завтраки-обеды-ужины в компании, качественная рабочая техника.

Чем вы тестируете API?


У нас есть unit-тесты и целый фреймворк для запуска большого количества тестов параллельно, с минимальными затратами времени. Подробно об этом можно прочитать в статье Владимира Янца в нашем блоге, он хорошо и подробно описал эту тему. Если говорить о UI-тестах мы используем Bash для их запуска, чтобы проверять корректность работы UI.

Расскажи о специфике работы инженера в антиспам-команде. Machine learning, очень много данных, создание инструментов для других команд.


Да, я работаю в команде антиспама. Исходя из названия, может показаться, что мы занимаемся одним только антиспамом, но это далеко не так. Наша цель обеспечить самый лучше экспириенс от использования наших приложений. Для нас очень важна задача защиты пользователя, и на это выделяется большое количество ресурсов и усилий.
Если обобщить, мы занимаемся борьбой с недоброжелательными юзерами: теми, кто рассылает спам, занимается мошенничеством и портит опыт от использования приложений. Мы активно используем ML. Я, конечно, не могу вдаваться в детали, чтобы не облегчать жизнь спамерам, но вот несколько примеров.

У нас есть модель для детекта spam/scam. Мы сделали тулзу для анализа мобильного трафика для параллельной команды. Также у нас в компании используются нейросети для жестовой фото-верификации и при отправке непристойных фотографий в мессенджере. Недавно наши коллеги запустили т/н dick pic detector для защиты от нежелательного контента в личных сообщениях (пользователь может выбирать, хочет ли он получать такой контент).

PHP и MySQL что делать для оптимизации производительности backend?


Здесь затрагивается стек, который используется в компании, и производительность, поэтому я также разобью ответ на две части.
Насчет стека: благодаря тому, что в Badoo большое количество отделов и команд, мы используем максимально широкий набор технологий начиная от PHP, MySQL, Nginx, Go, C++ и заканчивая Tarantool, LUA и Scala. Каждая команда выбирает инструмент для эффективного решения поставленной задачи. Так как мы работаем в условиях highload и обрабатываем десятки тысяч запросов в секунду, критичным становится вопрос performance нашего backend.

Теперь стоит упомянуть об инструментах, которые были созданы внутри компании и были выложены в open source. Первый инструмент это Pinba (PHP is Not a Bottleneck Anymore). Это инструмент для сбора статистики и мониторинга производительности приложения без импакта на его performance, и для представления собранных данных в human-friendly виде. Следующий Codeisok: инструмент для управления git-репозиториями и проведения code review. Мы активно юзаем нашу внутреннюю наработку, и перед тем, как фича переходит в master, мы применяем лучшие практики code review (о них тоже можно прочитать в нашем блоге), чтобы до production доезжал максимально эффективный код. Еще один инструмент, который позволяет нам трекать performance каждого отдельного участка кода это LifeProf: он позволяет в автоматическом режиме профилировать все запросы. Все эти инструменты (и даже больше) можно найти в нашем Github-репозитории.

Как перевести в Лондон жену, чтобы она поступила в университет, а не скучала дома? Налоги, местная медицина, жилье на двоих.


Очень широкая тема. У меня есть опыт жизни в Германии и Англии, и он отличается, но я расскажу про Лондон.
Переезд это испытание. Ты выходишь из привычной среды, рядом с тобой нет друзей, родственников, родителей, с которыми ты привык общаться каждый день. Это определенный удар для тебя и для супруги, для семьи в целом. Тут важно найти выход из этого состояния. Рецепт, который нашли мы это максимально быстрая интеграция в новое общество. В Германии очевидным барьером был язык мы всегда учили английский, а тут предстояло влиться в немецкое общество; это требовало усилий, и было стрессово, но за 1.5 года жизни в Германии мы смогли достигнуть высокого уровня языка, уча его каждый день. В Лондоне такой проблемы не стояло, и опыт жизни в иностранном государстве уже был.
Компания Badoo оказывала максимальную поддержки при переезде в вопросах поиска первой квартиры, в общении с налоговой. Это позволяло легко влиться в жизнь в Лондоне.

Налоги: в Англии прогрессивная шкала, доход делится на группы по возрастанию, и с каждой группы снимается своя ставка.
Медицина это еще один холиварный вопрос. Кто-то говорит, что с ней все в порядке, кто-то не согласен. У меня был положительный опыт.
Поиск жилья это отдельная история. Сложно найти хорошее жилье, его слишком быстро разбирают; кроме того, перед тем, как получить квартиру внаем, нужно пройти определенную проверку. В моем случае были даже звонки в Германию тем людям, у которых мы снимали жилье спрашивали, насколько я хороший квартиросъемщик.

Моя супруга всегда хотела учиться на дизайнера, и планирует поступать. Здесь мы нашли курсы, которые подошли; она как раз учила язык и сдавала тест IELTS, чтобы поступить на бакалавриат интерьерного дизайна. Очень широкий набор учебных заведений, но нужно помнить, что для иностранцев стоимость обучения в несколько раз выше, чем для местных.

Как контролировать усилие, усидчивость, самомотивацию, прокрастинацию?


Не секрет, что из-за пандемии большая часть IT-компаний перешла на работу из дома. Для меня было сложно перестроиться на другие рельсы, но я выделил для себя несколько моментов.

Во-первых, нужен жесткий контроль рабочего времени. Можно сообщить всем коллегам, что с 9 до 18 ты работаешь и доступен во всех мессенджерах, а вне этого времени не отвечать на запросы. К этому все относятся с пониманием. Когда ты работаешь из дома, сложно разделить работу и семью, но для сохранения психологического настроя и отношений в семье это очень важно.
Самомотивация и прокрастинация. Очень многие статьи на Хабре говорят, что прокрастинация это нормально, но, когда ее много это плохо. Когда мне попадается большая задача, я делю ее на много маленьких, и тогда новая страшная фича уже не кажется страшной, и ее можно без проблем зарелизить.

Используете ли вы ORM или прямое взаимодействие с хранилищем? Почему?


Я уже упоминал, что у нас свой собственный фреймворк. Мы используем собственную реализацию ORM.

В Штатах офис не планируете?


У нас есть офис в США, там хостится Bumble в городе Остин, штат Техас. Но там нет инженерной команды, и пока неизвестно, будем ли мы расширяться.

Что помогало адаптироваться каждый раз на новом месте?


Главная поддержка всегда находится внутри семьи. В нашем случае мы с супругой поддерживали друг друга, и это помогло нам преодолеть все первоначальные трудности. Кроме того, мне каждый раз везло с командой у меня очень крутые коллеги, они всегда поддерживают и слово, и делом, делятся опытом, на первых порах могут вместе с тобой сходить и решить проблему. В общем, хорошая семья и хорошие коллеги это на вес золота.

Как инженеры Badoo движут русскоговорящее PHP-сообщество? Конференции, митапы, блог, неформальные сходки.


Badoo активно проводит и участвует в большом количестве профильных событий. Это заложено в культуре компании и в культуре наших инженеров. Разработчики постоянно делятся наработками и знаниями на внутренних и внешних митапах, встречах и конференциях.
У нас есть Badoo PHP Meetup: два раза в год, в московском офисе. На последних встречах было около 250 участников. Мой коллега Владимир Янц, о котором я уже говорил, развивает неформальные встречи в Москве BeerPHP Moscow. У него уже есть последователи в Санкт-Петербурге, Саратове и других городах. Формат, конечно, заимствован у аналогичных митапов BeerJS, но это все равно очень круто в неформальной обстановке пообщаться с единомышленниками, коллегами и просто чуваками из индустрии.

Инженеры Badoo регулярно входят в состав программного комитета единственной PHP-конференции в России, PHP Russia. В этом году ее онлайн-часть стала международной и бесплатной для всех участников, благодаря нашей компании.
Также у нас есть блоги на Хабре и Medium, где мы делимся всеми наработками (не только PHP).

Как скалируются разные куски монолита под нагрузку?


Хороший вопрос в продолжение темы о монолите и микросервисах. У нас в блоге выложена отличная презентация о performance и о том, как с архитектурной точки зрения построен наш backend я расскажу кратко. У нас есть около 600 серверов, которые обрабатывают все запросы от клиентов, и на них возложен наш монорепозиторий. При таком подходе мы обладаем некоторой гибкостью в скейлинге, добавляем новые тачки, вкладываем код и они готовы к использованию.

Расскажите подробнее о самописном фреймворке Badoo на основании чего он реализован и на что больше похож?


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

Я бы не сказал, что он на что-то конкретное похож. Я работал с Aravel и Symfony безусловно, какие-то части есть, и мы можем использовать модули, которые находятся в open source в нашем проекте, но я не думаю, что наш git-репозиторий сильно отличается по подходам от других современных фреймворков. Мы используем пакетные менеджеры, чтобы подтягивать сторонние зависимости, используем autoloading, используем модули, чтобы инкапсулировать части кода.

Какие самые сложные задачи пришлось решать в Badoo?


Не могу выделить конкретную задачу или проект, которые были бы очень сложными. У нас есть интересные проекты, и есть очень интересные, и они все очень разные. В моей практике это все проекты, связанные с Machine Learning. Когда я учился в аспирантуре, я касался этой темы, и эта область и задачи из нее мне импонирует. Я упоминал проект, который мы делали для команды Performance Marketing, связанный с анализом трафика он был очень крутой, мы нашли и открыли много полезных инсайтов.

Используется ли в Badoo компиляция PHP?


Нет.

Репа одна, все пушат в одно место?


Да, репа одна, и все backend-инженеры пушат в одно место. У нас есть внутреннее правило нейминга веток, которые так или иначе связаны с решаемой задачей. Напрямую запушить мастер, конечно, нельзя, ветка пушится туда после успешного code review, после всех чеков и юнит-тестов, и после того, как QA-инженер, который работал над задачей вместе с тобой, сказал, что все в порядке.

Есть ли DDD в Badoo, как вы к нему относитесь?


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

Как Badoo работает со спамом? Простые if или уже есть ML?


Я где-то видел шутку о том, что ML это просто большая куча if/else. Но, конечно, мы используем что-то гораздо более продвинутое.
У нас есть несколько направлений использования ML, и он позволяет сильно улучшать проекты. Я уже упоминал нейросети, которые позволяют определять жест фотоверификации. Это сильно снижает нагрузку на пост-обработку верификационных фотографий, если на клиенте вводится такая предобработка то есть, детектинг того, что это действительно человек делает фотографию сейчас и он делает то, что от него попросили. Нейронки это круто.

Как именно мы работаем со спамом тема закрытая, я не могу сильно распространяться. Но мы активно боремся со спамом, мошенничеством и связанными вещами. У нас есть целое подразделение, задачей которого является решение такого рода проблем. Перед нами стоит задача свести спам/scamming и другие нежелательные вещи на нашем проекте к минимуму, это цель номер один для компании.

Как организовано взаимодействие модулей проекта? Класс к классу, или что-то более хитрое?


Хороший вопрос. Каждый модуль имеет одну точку входа, которая может инстанцироваться только через фабрику. Таким образом, предоставляется внятное API наружу для других модулей или для других фичей. Мы не раскрываем всю внутреннюю реализацию для остального проекта, оставляем только то, что хотим отдать наружу.

Правда ли, что Badoo не нанимает на работу в Англию? Не могу найти явный ответ.


До пандемии у нас были вакансии в Москве и в Лондоне. Всегда указано, в каком офисе открыта вакансия компания придерживается максимальной прозрачности в этом вопросе.

На чем реализуете ML? PHP, другой язык, какой-то фреймворк, полностью своя разработка?


У нас есть очень крутые ребята в data team. В блоге есть крутой доклад от Александра Крашенинникова к сожалению, он уже мой бывший коллега в котором рассказано, что это за команда, какие проблемы она решает, как улучшает работу Badoo и помогает нам всем. Эта команда создала свой собственный фреймворк для ML, который очень прост в использовании и доступен всем остальным командам в компании можно сказать, они уже сделали всю работу за нас. У них очень крутая реализация, отличная документация, очень прямолинейный подход работы с фреймворком.

какие используется специфичные для разных БД плюшки, используя ORM?


Не до конца понимаю вопрос, но постараюсь ответить.

Я уже говорил, что основная наша БД это MySQL, в ней хранится большая часть данных. Также мы используем Exasol, Presto, Tarantool, для специфичных задач Aerospike; то есть, у нас есть большой набор хранилищ под каждую задачу. Мы себя не ограничиваем в выборе инструмента: если использование технологии выгодно, мы ее используем. MySQL центральное место для нашего приложения, и мы используем разнообразные репликации, шардинги, чтобы эффективно держать нагрузку.

Ваш API монолит?


Да.

Пришлось работать на удаленке? Сложнее стало? Как взаимодействовали?


Да, мы до сих пор работаем на удаленке. Я уже говорил, что в начале было сложно из-за того, что ты не можешь находиться со многими коллегами в одном таймфрейме. Кто-то еще не пришел на работу, кто-то уже ушел. Требуется синхронизация между разными командами, и между коллегами. Вопросы коммуникации стало сложнее решать, и из-за того, что стало невозможно адресовать сложный вопрос напрямую коллеге, приходилось писать или звонить, что занимает гораздо больше времени, чем дойти до кого-то в офисе и задать вопрос.
Для взаимодействия у нас есть большой набор чатов, видеоконференций, которые мы используем.

Что думаете про PHP 8, планируете переходить?


Мы активно следим за каждым новым релизом PHP. Безусловно, будем использовать все возможности новой версии конечно, после того, как мы убедимся, что наш код совместим, и переход на PHP 8 даст нам больше выгоды, чем то время, которое мы потратим на сам переход. Мы определимся с переходом, когда PHP 8 выйдет.

Как я уже говорил, когда мы перешли на PHP 7, у нас высвободилось много серверов, которые мы направили на другие задачи то есть, переход на новую версию способен принести большую выгоду.

Как устроен тестинг для разработчиков? Все самому локально в docker поднимать, или что-то сложнее, на виртуальных серверах?


Еще одна ситуация, когда я не могу точно ответить.

Docker мы не используем, у нас есть общее dev-окружение, которые мы используем для разработки. Наша платформа занимается, в том числе, поддержанием нашего dev-окружения в рабочем состоянии для разработки, и там мы запускаем все тесты, раскладываем фичи, которые будем катить на production. То есть, у нас есть преднастроенное окружение.

Так и не понял, на чем ML: PHP, Python, что-то другое?


Раньше использовали Python для ML-фреймворка, но сейчас перешли на Spark это сильно повысило performance.

Как балансируете нагрузку на 600 серверов? Я правильно понимаю, что это монорепа на каждом сервере, в docker?


Монорепа на каждом сервере, но балансируется не в docker, а с помощью Nginx.

Какие у вас ожидания от кандидата на собеседовании, какие soft/hard-скиллы в среднем достаточны?


Я уже говорил, что все открытые вакансии есть на нашем сайте tech.badoo.com. Я советую никому не стесняться, не бояться, заходить и делать apply.

Очень сложно сказать, какие конкретные ожидания могут быть у компании от кандидата. Я бы сказал: если, читая описание, возникает ощущение, что ты не подходишь на эту вакансию нужно 100% делать apply. Релевантный опыт или знания можно узнать от человека в ходе нескольких раундов интервью. На мой взгляд, нужно делать apply в любом случае.

Из hardskills безусловно, нужно иметь опыт и понимание того, как работают PHP и MySQL это основные технологии, которые мы используем, стек. Это если речь идет о backend-разработке, у других отделов свой стек.

Softskills это обширная тема. На мой взгляд, значительная часть разработки связана не с написанием кода, а с общением с людьми. Очень важно задавать правильные вопросы. Если ты умеешь это делать, задача на 50% решена. Проблемы miscommunication всегда есть, но чем их меньше, тем лучше для тебя, для компании и продукта. Это стандартный набор сейчас, но умение хорошо коммуницировать, работать в команде нужно. Также для нас важно, чтобы люди умели брать на себя ответственность по доведению проекта (фичи, части функционала) до завершения.

Используете ли автогенераторы кода, для каких задач?


Используем, довольно часто. При разработке, когда нужно сгенерировать модели по какому-то описанию, заложенному в конфигах, или если есть класс, который должен реализовывать функциональность по определенному шаблону.

Как осуществляется репликация баз данных для MySQL?


Могу ответить только поверхностно.
Ни для кого не секрет, что у нас есть датацентры в Европе и США, и необходимо поддерживать между ними консистентность данных. Мы используем репликацию между основными хранилищами, чтобы поддерживать в каждом месте актуальную информацию. Из-за того, что между датацентрами может быть большой replication lag, мы используем разного рода кэши для тех задач, где не критична актуальность данных.

Junior берете, или минимум mid?


Как я уже сказал, нужно сделать apply. В ходе интервью станет понятно, достаточно ли сейчас у вас знаний и опыта, чтобы начать работать в компании, или вам стоит получить релевантный опыт и знания в другом месте и потом вернуться, как я.

Bспользуете исключения, или стараетесь избегать?


Используем. И стараемся избегать.

Test-driven development, когда сначала тесты, потом код не практикуете?


Мне кажется, на этот вопрос я буду отвечать уже опосредованно в третий раз. У нас каждая команда может использовать при разработке свой подход, и я знаю, что некоторые коллеги практикуют этот подход. Я знаю, что он работает, но сам не практикую.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию
  11. Андрей, технический директор GameAcademy как видеоигры помогают прокачивать реальные навыки и найти работу мечты.

Подробнее..

Ask me anything! Задай вопрос Android-команде Badoo

16.07.2020 14:23:13 | Автор: admin
Предлагаем продолжить добрую традицию Ask me anything на Хабре и поговорить про разработку Android-приложений. Сегодня и завтра Android-команда Badoo будет на связи и ответит на любые вопросы о разработке и тестировании приложений с многомиллионной аудиторией, даст советы начинающим и расскажет про особенности платформы. Если вы столкнулись с какой-то проблемой или у вас есть вопрос по теме, пишите нам!



Обещаем ответить на все комментарии первого уровня, которые появятся здесь до 16:00 17 июля по московскому времени, а по возможности и на более поздние.

Немного фактов о нас. Badoo и Bumble одни из самых популярных дейтинг-сервисов в мире: только в Google Play у нас 210 млн скачиваний. В Android-приложениях больше 1,3 млн строк кода. В Android-команде больше 20 разработчиков. Основной язык разработки Kotlin, архитектурные паттерны MVI и RIBs, база данных SQLite.

Под катом подробнее о нашей команде и о темах, на которые мы можем поговорить.


С вами на связи


Иван Бирюков bivy


image

Моя айтишная история началась в 1997 году, когда я выиграл школьную олимпиаду. C тех пор понеслось. В Badoo я работаю семь с половиной лет. Сначала занимался Android-разработкой, потом построил команду мобильных архитекторов, разрабатывающую в том числе протокол коммуникации с сервером. Сейчас отвечаю за все нативные мобильные приложения Badoo и Bumble для iOS и Android.





Анатолий Варивончик ANublo


image

Я работаю в команде регистрации Badoo два с половиной года. До этого жил и работал в Минске. Готов рассказать о регистрации и фотоверификации в приложении: как мы добились нелинейного флоу в регистрации и как используем нейронные сети в фотоверификации.







Аркадий Иванов arkivanov


image

Я в Badoo уже три года и девять месяцев, техлид чат-команды. До этого работал в Яндексе, а ещё раньше в Mail.ru Group. Моё главное хобби играть неоклассику на электрогитаре. Из профессиональных интересов поддержка библиотеки Badoo Reaktive и моей собственной MVIKotlin. Готов ответить на вопросы об архитектуре, MVI, мультиплатформе, Rx.





Николай Чамеев lukaville


image

Я работаю в Badoo два года, в основном над различной инфраструктурой для Android-приложений. Core team, участником которой я являюсь, в последнее время занималась увеличением скорости сборки приложений, инфраструктурой запуска тестов на CI, мониторингом и оптимизацией приложений (app start/ANRs/crashes).







Артём Ушаков temq91


image

Все полгода работы в Badoo я нахожусь в юните Revenue. В наши обязанности входят разработка и поддержка функциональности, тем или иным образом связанной с revenue: paywall, рекламные и платёжные SDK. До Badoo я работал в компании MERA. В последнее время интересуюсь DevOps (контейнеризация, Docker и т. д.) и билд-системами. Экспериментирую с Raspberry Pi 4: делаю из него домашний NAS.





Азат Хайруллин AzatKhairullin


image

Я работаю Android-разработчиком в Badoo около полутора лет. Сейчас в основном занимаюсь профилями пользователей и encounters экраном с карточками. До этого работал в Biglion, а ещё раньше фрилансил и жил на острове Панган. Немного играю в Hearthstone, интересуюсь Flutter.







Юрий Уфимцев yufimtsev


image

В Badoo я два с половиной года. Воплотил в жизнь дюжину фичей, последние полтора года тружусь в команде чата, используемого в обоих наших приложениях. До Badoo я руководил группой Android-разработки в Яндексе и создавал приложения с нуля в Rosberry. Был президентом омского клуба риичи-маджонга Канчи ветров (возможно, являюсь им до сих пор, но это неточно).







Темы, на которые мы можем поговорить


  • Архитектура наших приложений и сравнение архитектурных паттернов.
  • Как выстроен процесс разработки.
  • Как мы работаем с легаси-кодом.
  • Как устроен процесс тестирования приложений.
  • A/B-тесты в Badoo и Bumble.
  • Как мы работаем с дизайн-системой.
  • Карьера Android-разработчика.


Самые интересные вопросы и ответы с AMA на Reddit


Недавно мы устраивали сессию вопросов и ответов на Reddit вместе с англоязычной частью нашей команды и получили 163 вопроса от пользователей. Некоторые из них мы перевели для читателей Хабра: надеемся, они станут поводом расспросить нас о чём-то подробнее.

Вопросы и ответы с AMA на Reddit

Какую архитектуру вы используете? Нравится ли она вам и что бы вы изменили, если бы могли? Какие уроки вы извлекли?


Жольт: Мы используем сильно переделанную версию RIBs (под сильной переделкой я подразумеваю В этой ветке 871 коммит и 15 коммитов после uber:master). Получилась древовидная структура, каждый слой которой можно взять и вставить в другое приложение со всеми связанными с ним ветками. В узлах дерева мы применяем паттерн MVI с реактивными биндингами. Мы довольны тем, что получилось!

Какие уроки мы извлекли. Activity это неверная абстракция. Если хотите использовать компоненты многократно, то навигация не должна быть глобальной. Сильно помогает удаление из компонентов понятия экрана. Наличие определённой структуры для создания переиспользуемых компонентов очень помогает нам понимать код друг друга. Всю тяжёлую работу прячьте за абстракциями, чтобы клиентский код было легче писать и сопровождать.

Майкл: Недавно наша команда Revenue Team начала экспериментировать с новым подходом на основе MVI, который мы назвали SubFlow. Большое влияние на него оказал паттерн с акторами (как это видно на примере библиотек Play Framework и Vert.x). Изначально этот подход применялся нашей iOS-командой. Увидев, как он хорошо работает, мы решили тоже попробовать. Суть в разделении бизнес-логики на простые одношаговые акторы. Каждый актор/подпроцесс для выполнения следующего шага может запустить следующий подпроцесс в цепочке. Возможные варианты подпроцессов конфигурируются извне.

Нашей главной задачей было уменьшить сложность и громоздкость кода, а также обменяться опытом с iOS-командой. Работа ещё в стадии эксперимента, но результаты нам уже очень нравятся. К сожалению, код пока закрыт.

Наверняка у вас есть древний код. Как вы относитесь к рефакторингу старых решений, чтобы идти в ногу со временем? Если рефакторите, то как? У вас этим занимается специально обученный человек или целая команда?


Анатолий: Если при разработке новой функциональности приходится изменять уже существующий код, то мы можем вносить в оценку задачи рефакторинг старой части кода. Кроме того, если мы сталкиваемся с проблемами в кодовой базе, то обсуждаем с руководством выделение времени на рефакторинг. По умолчанию мы тратим на это около 20% времени. Рефакторить может кто угодно в зависимости ситуации, у нас нет для этого специального человека.

Антон: Я стараюсь соблюдать правило скаута: Оставляй после себя код лучше, чем он был, когда ты его нашёл. Работая над фичей, которая затрагивает старый код, я стараюсь улучшить покрытие тестами; возможно, делаю небольшой рефакторинг, например разбиваю длинные методы. А для более масштабных переделок мы составляем конкретный план, выделяем на это время и определяем этапы.

Майкл: У нас есть части кода, написанные в далёком 2012 году. Мы оставили их нетронутыми, потому что было страшно менять их без покрытия тестами. То есть мы сначала улучшаем покрытие, в этом нам помогает наша замечательная команда тестировщиков, которая с помощью Calabash создаёт для нас end-to-end-тесты. Затем мы начинаем маленькими кусочками переписывать старый код, часто объединяя это с работой над фичами. Наконец, мы специально выделяем время на переписывание самых плохих частей. В соответствии с правилом команды Revenue Team мы тратим один день в неделю, чтобы держать под контролем технический долг, выбирая для этого какую-нибудь необычную задачу.

Какую БД вы используете в приложении?


Аркадий: Мы используем SQLite: либо базовый SQLiteOpenHelper, либо Room. Последний мы используем только в новых модулях, над которыми работаем в данный момент. Переводить на Room другие части приложения (например, чат), которые уже используют SQLiteOpenHelper, нецелесообразно.

Как вы относитесь к Annotation Processing?


Аркадий: Отрицательно. Плагины для компилятора наше будущее!
Николай: Мы стараемся избегать обработки аннотаций и для тестовых сборок по мере возможности используем реализации библиотек обработки аннотаций с поддержкой рефлексии. Сейчас мы применяем обработку аннотаций для Dagger, Room и Toothpick.
Андрей: Apt годится до тех пор, пока это не kapt.

Проект сегментирован по странам? Как это сделано?


Иван: С нативной клиентской точки зрения это выглядит как единый бэкенд, к которому мы обращаемся через API. Серверная часть разделена на несколько фрагментов, но всё не так просто, потому что функциональность одновременно используется разными сервисами и уровнями приложения.

Николай K. (серверная команда): У нас два основных региона (два местоположения дата-центров). Каждый пользователь обслуживается дата-центром из его первичного региона. Этот регион определяется на основе местоположения пользователя, указанного им при регистрации. Позднее регион может меняться (когда пользователь в офлайне), если пользователь сменил местоположение.

Ваш проект использует App Bundle? Какой был выигрыш в размерах .apk?


Николай: Да, мы используем App Bundle. Размер приложения с использованием App Bundle уменьшился примерно на 17%.

Андрей: Также мы применяем Dynamic Delivery и даже написали об этом статью.

Обсуждала ли команда миграцию на мультиплатформенный подход? На какой именно или почему нет?


Аркадий: Мы экспериментировали с Kotlin Multiplatform, у нас есть целиком написанный на нём внутренний проект, и мы обсуждали использование этой технологии в продакшене. В нашем основном проекте тоже есть несколько мультиплатформенных модулей, но сейчас они используются только в Android.

Для поддержки перехода мы создали Reactive Extensions-библиотеку Reaktive.

MVICore сейчас переводится на Kotlin Multiplatform.

Может ли команда рассказать о каком-нибудь маленьком изменении или новой фиче, которая продемонстрировала большие результаты?


Анатолий: Что касается фич, то мы реализовали в Badoo видеочаты и оптимизировали функцию отправки подарков. Раньше пользователю нужно было нажать на кнопку трансляции, затем на Отправить подарок и выбрать подарок. Целых три действия и людям не было очевидно, что есть такая возможность. Поэтому мы добавили нижнюю панель с горизонтальным списком подарков, чтобы пользователи могли выбрать подарок одним нажатием и сразу же отправить его стримеру. На внедрение ушло около трёх дней, но позже мы получили значительное увеличение числа отправленных подарков.

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

Используете ли вы Android Jetpack, Fragments и Activities? Или что-то вместо них?


Жольт: Хороший вопрос!

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

LiveData: нет. Вместо MVVM у нас MVI, и мы разработали для неё собственный инструмент для автоматического определения области видимости Binder. Сейчас он существует как часть нашей библиотеки MVICore, но мы планируем сделать его в виде отдельной библиотеки. Так будет универсальнее по сравнению с LiveData, поскольку в этом случае Binder можно будет использовать и вне контекста Android, причём очень легко (одна строка на Kotlin). Почитать об этом подробнее можно здесь и здесь. Действительно отличный инструмент. Попробуйте его.

Компонент Navigation: нет. Мы применяем паттерн Router со своей версией RIBs. Необходимость поддерживать глобальную навигацию в приложениях с общими компонентами затрудняет сопровождение на уровне приложения, а также требует понимания устройства конкретных компонентов. Последнее является огромным недостатком, если вы хотите переиспользовать какой-то компонент в разных приложениях. Компонент не должен что-либо предполагать относительно приложения, которое его использует (например, какие размеры экранов доступны). Routing, к примеру, это просто локальная навигация. Он переносит задачу навигации с глобального уровня на уровень реализации компонентов, поэтому вы можете спокойно использовать их где угодно.

Fragments: нет. С помощью RIBs мы создали что-то похожее на глубоко вложенное дерево фрагментов, но гораздо лучше. Также мы без каких-либо хаков решили проблему безопасного внедрения конструкторов вроде Fragment Factory на этапе компиляции. Фреймворк собирает компоненты за вас, но вы говорите ему, как это делать.

Почему мы пошли своим путём, а не следуем общепринятым практикам? Дело в том, что этот процесс начался много лет назад. Задолго до наступления эры Jetpack мы пытались идти по пути Google и в результате обожглись на Fragments. Ушли от этого, стараясь понять, какая альтернатива подойдёт нам лучше всего. Часто мы были одними из первых, кто внедрял у себя новую технологию (в 2016-м мы попробовали чистую архитектуру и RxJava, в 2017-м Kotlin и MVI на основе Redux), и подобных инструментов, фреймворков и библиотек было не так уж много. К моменту анонса Jetpack мы уже вложились в собственный технологический стек. И в целом он вполне нас устраивает в сравнении с общепринятыми подходами.

К слову, мы используем Room, и лично меня очень интересует Jetpack Compose.


Пожалуйста, оставляйте вопросы в комментариях первого уровня, чтобы нам было легче их найти.

Ask me anything поехали!
Подробнее..

Перевод Что нам стоит автоматизацию построить три паттерна для повышения эффективности процессов

20.05.2021 20:12:40 | Автор: admin

Меня зовут Владислав Романенко, я старший iOS QA Engineer в Badoo и Bumble. Несколько лет назад мы начали активнее использовать автотесты в разработке, но столкнулись с некоторыми трудностями.

Логичный вопрос: почему мы занялись автоматизацией тестирования? Ответ кроется в еженедельном выпуске новых версий наших мобильных приложений. QA-отделу приходится тестировать новые фичи, их интеграцию в сервисы и заниматься регрессионным тестированием. За неделю комплексное регрессионное тестирование нужно проводить как минимум один раз, что довольно утомительно. Автоматизация помогла нам выпускать новые версии быстрее и без потери качества. Подробнее об автоматизации мобильного тестирования в докладе моих коллег.

В разработке проблемы часто решаются с помощью паттернов обобщённых решений для часто возникающих проблем в заданном контексте. То же и с автоматизацией тестирования, есть даже хорошее wiki-описание. В этой статье мы поговорим о паттернах процессов (Process Patterns). Они помогают организовать и улучшить процесс автоматизации тестирования.

Без дальнейших предисловий перейдём к трудностям, с которыми мы боролись, и рекомендациям по их преодолению с помощью тех самых паттернов. Замечу, что это не единственные проблемы, которые у нас были и есть. Но в рамках данной статьи я решил остановиться именно на них.

Паттерн 1. Просьба о помощи (Ask for Help)

Как это часто бывает, мы все имели разный опыт, знания и навыки. На тот момент не все в команде сталкивались с автоматизацией тестирования некоторым пришлось учиться на ходу. Чтобы помочь коллегам из команды QA справиться со сложностями, мы предложили им обратиться за помощью к команде автоматизации. Идея в том, что если ты застреваешь на какой-то проблеме, то не нужно самостоятельно бороться с ней слишком долго, ведь другие уже могли столкнуться с подобным и найти решение. А чтобы автоматизаторов не завалили вопросами, мы решили формализовать этот подход. Прекрасным решением оказался паттерн ASK FOR HELP:

Просите о помощи, а не теряйте время, пытаясь всё сделать самостоятельно.

Ни одна команда не может в любой момент времени обладать всеми необходимыми навыками, и иметь несколько экспертов, к которым можно обратиться при необходимости, то, что нужно.

Но оказалось, что простое следование паттерну может привести к новым проблемам. Команде автоматизации тестирования стали задавать вопросы ещё чаще, чем обычно (например, о настройке окружения). Со временем мы стали замечать, что разные члены команд задают одни и те же вопросы. У автоматизаторов уходило много времени на то, чтобы всем ответить, поскольку даже простой и хорошо сформулированный вопрос требует переключения контекста.

Внутрениий StackOverflow

Стоит отметить, что в нашей вики есть документация и описания решений для большинства распространённых проблем. Возможно, документировать все возможные ошибки и объяснения в вики не лучший подход, но мы считали, что сохранить их в одном месте будет полезно. Так у нас возникла идея создания локального Stack Overflow. Для этого мы воспользовались open source-решением Scoold. Оно предназначено для использования на первой линии обработки запросов и работает как обычная Stack Overflow, только для сотрудников компании. Когда у кого-нибудь возникает проблема, достаточно зайти в наш локальный Stack Overflow, чтобы найти решение или написать вопрос, на который ответит кто-то из специалистов.

Так выглядит наш локальный StackOverflowТак выглядит наш локальный StackOverflow

Преимущества

  • Процесс геймифицируется, поэтому в поиск решений вовлекается больше людей. Мы не стали придумывать разные лычки или звания количество голосов или звёзд ничего не значит и вам не советуем этим увлекаться. Геймификация лишь дополнительный стимул для участников, а не основной фактор.

  • Мы тратим меньше времени и сил на решение проблем. Во-первых, они оказываются на виду, поэтому их проще решить. Во-вторых, уменьшается количество перекидываний задачи от одного человека к другому.

  • Стало меньше сообщений и веток в чатах, где их трудно отслеживать и искать. Мессенджеры не лучшее место для хранения документации и обращения к ней как к источнику истины. Stack Overflow гораздо удобнее.

Недостатки

  • Нет ответственного за запуск реализации. Нужно, чтобы кто-то стимулировал создание даже простейшего решения. Нам повезло в нашем случаем таким человеком стал dr0pt4ble, который взял инициативу в свои руки. Не менее важно, чтобы руководство понимало и поддерживало такую инициативу.

  • Низкая популярность решения: платформа не сразу стала настолько востребованной, насколько мы ожидали. Любой новый инструмент должен сражаться за любовь пользователей, и это понятно, ведь не всем нравятся перемены. Возможно, мы не проявляли на сайте сверхактивность с первого дня, но постепенно смогли перенаправить туда почти все соответствующие вопросы, а также привлечь к решению проблем людей, не входящих в команду автоматизации тестирования.

  • На вопросы могут отвечать недостаточно быстро. На этот случай стоит реализовать уведомления в мессенджерах о появлении новых вопросов. Однако сегодня многие работают из дома и мессенджеры переполнены уведомлениями, что повышает соблазн отключить звук. Каждая команда решает эту проблему по-своему, но для нас появление напоминания в чате автоматизаторов в Slack работает хорошо.

Паттерн 2. Введение стандартов (Set Standards)

По мере возможности мы стараемся переиспользовать код в разных приложениях и на разных платформах, чтобы упростить сопровождение и поддержку. Но, как и в любой другой системе, которую несколько лет разрабатывало много людей, разные части кода могут быть написаны в разных стилях. Наш основной язык для сквозных автотестов это Ruby (об истории автоматизации мобильного тестирования в нашей компании рассказывал agile_seph здесь), потому что он как раз позволяет писать код в разных стилях (автор языка Юкихиро Мацумото хотел, чтобы разработчики использовали его язык так, как им удобно). Однако работать с чужим кодом бывает сложно.

Для решения этой проблемы мы выбрали паттерн SET STANDARDS:

Введите и соблюдайте стандарты для артефактов автоматизации.

Без этого может получиться, что над одним проектом работают несколько человек, и у каждого свой стиль и методы (как если бы все говорили на разных языках). Решать проблему мы начали со сбора мнений тех, кто непосредственно занимается автоматизацией. Мы стремились выработать такие соглашения о стиле, которые будут полезны всем пользователям. И чтобы каждый, кто участвовал в принятии решения, в будущем старался его придерживаться. Так мы создали руководства, которые принимают и соблюдают все участники процесса, что в буквальном смысле помогло нам найти общий язык.

Что мы сделали

  • Создали локальную вики с актуальными руководствами и документами (например, как настроить окружение, как запускать и поддерживать тесты), которая помогла сократить циклы ревизии кода. Всю документацию мы храним в Confluence, который разделили на несколько частей. Команды регулярно проверяют актуальность своей документации.

  • Добавили в вики межкомандные ретроспективы и соглашения. Ежемесячно мы проводим встречи и по результатам каждой из них делаем какие-то практические выводы.

  • Что касается самого кода тестов и ограничений на уровне кода для основных этапов и методов верификации, мы внедрили стандартные инструменты, включая RuboCop (статический анализатор и инструмент форматирования кода для Ruby), защитные проверки (Guard Cheсks) и pre-commit-хуки.

  • Вычистили устаревший код и выделили универсальные параметризированные этапы и методы. Рекомендовали не создавать собственные методы, если можно воспользоваться уже существующими. Образец проекта с некоторыми из наших лучших практик можно посмотреть здесь.

  • Из участников команды автоматизации тестирования сформировали комитет качества кода. У него есть список вопросов и задач, поучаствовать в решении которых может любой желающий. Мы также приглашаем на встречи комитета всех, у кого есть вопросы, чтобы помочь в их решении.

Преимущества

  • На сопровождение тестов и исправление ошибок тратится меньше времени и сил. Руководство по написанию кода очень облегчает понимание того, что и как писать.

  • На ревью кода уходит меньше времени. С одной стороны, код становится аккуратнее, с другой всегда есть источник истины для рецензента и рецензируемого.

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

Недостатки

  • После создания документации её никто не сопровождает. Это общая проблема для любой документации, особенно для той, что не используется постоянно. Поэтому мы назначили ответственных за сопровождение документов и настроили отправку им на почту уведомлений из Confluence, чтобы ничьи комментарии не оставались без внимания.

  • Трудно организовывать ретроспективные встречи и привлекать людей. Непросто найти время, когда все заинтересованные сотрудники не заняты решением своих задач. Поэтому такие встречи приходится планировать сильно заранее.

Паттерн 3. Делимся информацией (Share Information)

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

Этот паттерн называется SHARE INFORMATION:

Просите и давайте информацию начальству, разработчикам и другим тестировщикам.

Для нас это способ улучшить автоматизацию тестирования за счёт более широкого набора знаний. Для реализации этого паттерна мы запустили еженедельные короткие презентации QA Lightning Talks. Любой человек может предложить тему и в течение 10-15 минут выступить с ней. Поскольку у встреч чёткий тайминг, это хорошая возможность узнать что-то новое, не потратив на это много времени. Для тех, кто не смог присутствовать, мы сохраняем видеозаписи встреч во внутренней библиотеке.

Доклады могут быть посвящены не только тестированию и его автоматизации. Например, однажды bayandin рассказывал о своём опыте поддержки проекта Homebrew. А я как-то рассказывал о том, что я диванный картограф в Humanitarian OpenStreetMap. Я создаю карты районов, которые плохо картографированы, и потом ими пользуются в работе сотрудники разных организаций вроде Красного Креста или Врачей без границ. Сокращённая версия этого доклада позднее была представлена на сессии Soapbox конференции EuroSTAR 2020.

Преимущества

  • Участники команды лучше понимают, кто над чем трудится. В больших компаниях нередко бывает так, что команды начинают работать изолированно, словно в бункерах. И такие короткие доклады могут стать ценным дополнением к другим способам налаживания коммуникации и совместной работы.

  • Общий объём знаний растёт. А согласно исследованию, обмен знаниями улучшает взаимодействие между департаментами и внутри них.

  • Дополнительная мотивация к саморазвитию и росту. Когда видишь, что делают другие и как ты можешь им помочь, это может вдохновить научиться чему-то новому или углубить знания.

Недостатки

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

  • Трудно удерживать интерес аудитории и увеличивать ее. Мы каждый раз меняем тему и сосредотачиваемся на актуальных проблемах. Например, один из проектов заключался в том, что мы собирали результаты всех тестовых прогонов тикета в таблицу и интегрировали её в Jira. Об этом на ближайшей встрече и рассказал один из участников команды автоматизации тестирования.

Бонус: паттерн для обучения разделение на пары (Pair Up)

Расскажу ещё о том, к чему привели вышеописанные шаги. Например, QA-инженеры стали готовы брать (и постепенно взяли) ответственность за написание, сопровождение и анализ нестабильных автоматизированных тестов. Поэтому мы решили пойти дальше сделать так, чтобы они взяли на себя ещё и фреймворк автоматизации тестирования и некоторые связанные с инструментарием задачи. Такой шаг был бы невозможен, если бы тестировщики не смогли, помимо своих повседневных задач, ещё и изучать фреймворк и плотно работать с кодовой базой. И хотя регулярные задачи решались качественно, казалось, что выйти за их пределы без помощи будет непросто.

Чтобы достичь цели, мы воспользовались паттерном PAIR UP:

Более опытный сотрудник получает себе в пару менее опытного.

Для QA-инженеров мы запустили внутреннюю программу менторства. Что это такое? QA-инженеры присоединяются к автоматизаторам на короткий промежуток времени (обычно на две недели) и работают над задачами из бэклога этой команды, а не из своего. Помогают им в этом менторы из числа старших инженеров-автоматизаторов. Цель внутреннего менторства заключается в обучении. Мы разработали такой манифест:

  • Сосредоточенность на обучении, а не на строгом соблюдении сроков.

  • Интерактивные обсуждения, а не работа в бункере.

  • Ранняя и регулярная обратная связь, а не ретрообзор в конце менторства.

Хотя утверждения справа ценны, утверждения слева для нас ценнее.

Подробнее о менторстве, о том, почему и как мы его практикуем, я рассказывал в недавнем выступлении.

Итоги

Применение этих паттернов помогло нам решить несколько сложных вопросов и в коммуникации, и в работе с кодом. Мы вышли на новый уровень автоматизации при этом процессы налажены, а люди в команде не перегружены работой.

Какие проблемы мы смогли решить

  • Нежелание обращаться за помощью к коллегам (решили с помощью паттерна Ask for help). Как отметили в своей книге A Journey through Test Automation Patterns: One teams adventures with the Test Automation Серетта Гамба и Дороти Грэхем, не бойтесь просить о помощи: большинству людей на самом деле нравится помогать.

  • Высокая стоимость сопровождения кодовой базы тестирования (решили с помощью паттерна Set Standards). Если вы давно работаете над автоматизацией, то стандарты просто необходимы.

  • Информационный бункер (решили с помощью паттерна Share Information). Общайтесь с другими людьми: в процессе обсуждения часто рождаются новые идеи.

В этой статье я описал лишь несколько паттернов, подходящих для автоматизации тестирования. Но я надеюсь, что наш опыт и рекомендации послужат для вас вдохновением.

Расскажите в комментариях, с какими сложностями при автоматизации тестирования столкнулись вы и как их решали.

Подробнее..

Модуляризация iOS-приложения Badoo борьба с последствиями

21.01.2021 20:07:17 | Автор: admin

В предыдущей статье я рассказывал о том, как мы выделили модуль чата в нашем приложении. Всё прошло успешно, и мы собирались распространить этот опыт начать тотальную модуляризацию в iOS-разработке Badoo. Даже презентовали подход продуктовым командам, командам, занимающимся тестированием и непрерывной интеграцией, и постепенно стали внедрять модуляризацию в наши процессы.

Мы сразу понимали, что будут сложности, поэтому не торопились и раскатывали решение поэтапно. Это помогло нам вовремя понять проблемы, о которых сегодня пойдёт речь.

В этой статье я расскажу:

  • как мы не потерялись в сложном графе зависимостей;

  • как спасли CI от чрезмерной нагрузки;

  • что делать, если с каждым новым модулем приложение запускается всё медленнее;

  • мониторинг каких показателей стоит предусмотреть и почему это необходимо.

Сложный граф зависимостей

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

Так выглядел граф зависимостей Badoo к моменту, когда у нас было около 50 модулей:

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

  1. Визуализация всех зависимостей одновременно сложная и бессмысленная задача. При работе с графом нужно понимать, какая проблема ищется или решается и каких модулей она касается. Этим инструментом можно пользоваться эффективно только в рамках графа вокруг одного, максимум нескольких модулей.

  2. Сложности визуализации порождают сложности отладки. Найти фундаментальные проблемы в сложном графе зависимостей крайне непросто.

  3. Добавление зависимостей, особенно промежуточных (о них мы говорили в первой части), ресурсоёмкая задача, влекущая за собой дополнительную нагрузку на разработчиков и отвлекающая от решения продуктовых задач.

Мы поняли, что простой визуализацией не обойтись, работу с графом зависимостей нужно автоматизировать. Так появилась наша внутренняя утилита deps. Она была призвана решать наши новые задачи: искать проблемы в графе зависимостей, указывать на них разработчикам и исправлять типовые ошибки линковки.

Основные характеристики утилиты:

  • это консольное Swift-приложение;

  • работает с xcodeproj-файлами с помощью фреймворка XcodeProj;

  • понимает сторонние зависимости (мы не очень активно и охотно принимаем их в проект, но некоторые всё же используем; загружаются и собираются они через Carthage);

  • включена в процессы непрерывной интеграции;

  • знает о требованиях к нашему графу зависимостей и работает в соответствии с ними.

Последний пункт объясняет, почему не стоит надеяться на появление подобных утилит с открытым исходным кодом. Сегодня не существует универсальной хорошо описанной структуры проектов и их настроек, которая подойдёт всем. В разных компаниях могут отличаться различные параметры графа:

  • статическая или динамическая линковка;

  • инструменты поддержки сторонних зависимостей (Carthage, CocoaPods, Swift Package Manager);

  • хранение ресурсов в отдельных фреймворках или на уровне приложения;

  • и другие.

Поэтому, если вы смотрите в сторону 100+ модулей, на каком-то этапе вам, скорее всего, придётся задуматься о написании подобной утилиты.

Итак, для автоматизации работы с графом зависимостей мы разработали несколько команд:

  1. Doctor. Команда проверяет, все ли зависимости корректно связаны и встроены в приложение. После исполнения мы либо получаем список ошибок в графе (например, отсутствие чего-либо в фазе Link with binaries или Embedded frameworks), либо скрипт говорит, что всё хорошо и можно двигаться дальше.

  2. Fix. Развитие команды doctor. Эта команда в автоматическом режиме исправляет проблемы, найденные командой doctor.

  3. Add. Добавляет зависимость между модулями. Пока у вас простое небольшое приложение, добавление зависимости между двумя фреймворками кажется простой задачей. Но когда граф сложный и многоуровневый, а вы работаете с включёнными явными зависимостями, добавление нужных зависимостей становится задачей, которую вы не захотите из раза в раз делать руками. Благодаря команде add разработчики могут просто указать два названия фреймворков (зависимый и зависящий) и все фазы сборки заполнятся необходимыми зависимостями в соответствии с графом.

Впоследствии скрипт создания нового модуля по шаблону также стал частью утилиты deps. Что мы получили в итоге?

  1. Автоматизированную поддержку графа. Мы находим ошибки прямо в pre-commit hook, сохраняя стабильность и правильность графа и давая возможность разработчику в автоматическом режиме эти ошибки исправлять.

  2. Упрощённое редактирование. Добавить новый модуль или связи между модулями можно одной командой, что сильно упрощает их разработку.

Непрерывная интеграция не справлялась

Перед переходом на модуляризацию у нас было семь приложений, и мы придерживались стратегии проверь всё. Вне зависимости от того, что именно было изменено в нашем монорепозитории, мы просто пересобирали все приложения и прогоняли все тесты. Если всё было хорошо, то мы позволяли изменениям попасть в основную ветку разработки.

Модуляризация быстро дала нам понять, что этот подход плохо масштабируется. Количество модулей и количество CI-агентов, необходимых для распараллеливания проверки изменений, линейно связаны. Когда количество модулей увеличилось, увеличились и очереди на CI. Конечно, до какого-то момента можно просто покупать новые билд-агенты, но мы пошли более рациональным путём.

Кстати, это была не единственная проблема CI. Инфраструктура также подвержена проблемам: симулятор может не запуститься, память закончиться, диск повредиться и т. д. Доля таких проблем небольшая, но с увеличением количества проверяемых модулей (запущенных работ на агентах в целом) абсолютное число инцидентов выросло, что не позволяло команде CI оперативно обрабатывать входящие обращения разработчиков.

Мы безуспешно попробовали несколько подходов. Расскажу о них подробнее, чтобы вы не повторяли наши ошибки.

Очевидным решением было перестать собирать и проверять всё и всегда. Нужно было, чтобы CI проверял только то, что нужно проверить. Что не сработало:

  1. Вычисление изменений по структуре директорий. Мы пробовали положить в репозиторий файл с маппингом директория модуль, чтобы понимать, какие модули нужно проверить, но буквально через неделю из-за увеличившегося количества падений приложения на проде обнаружили, что файл был перенесён в новый модуль и изменён одновременно, а файл маппинга при этом обновлён не был. Контролировать обновление файла с маппингом автоматически не представлялось возможным и мы перешли к поиску иных решений.

  2. Запуск интеграционных проверок на CI ночью. В целом это неплохая идея, но разработчики не сказали нам за это спасибо. Регулярными стали ситуации, когда ты уходишь домой в надежде, что всё хорошо, а утром в корпоративном мессенджере получаешь сообщение от CI, что 25 проверок не прошли, и первое, что нужно делать, разбираться с ночными проблемами, которые, вероятно, ещё кого-то блокируют. В общем, мы не захотели портить завтраки людям и продолжили поиски оптимального решения.

  3. Разработчик указывает, что проверять. Этот эксперимент завершился быстрее всех буквально за пару дней. Благодаря ему мы узнали, что разработчики бывают двух типов:

    1. Те, кто на всякий случай проверяет всё.

    2. Те, кто уверен, что не мог ничего сломать.

Как вы поняли, из-за первых очереди на CI почти не становились меньше, а из-за вторых у нас ломалась основная ветка разработки.

В итоге мы вернулись к идее автоматизации вычисления изменений, но немного с другой стороны. У нас была утилита deps, которая знала про граф зависимостей и файлы проекта. А Git позволяла получить список изменённых файлов. Мы расширили deps командой affected, с помощью которой можно было получить список затронутых модулей, исходя из изменений, отражаемых системой контроля версий. Ещё более важно то, что она учитывала зависимости между модулями (если от затронутого модуля зависят другие модули, их тоже необходимо проверить, чтобы, например, в случае изменения интерфейса более низкого модуля верхний не перестал собираться).

Пример: изменения в блоках Регистрация и Аналитика на нашей схеме указывают на необходимость проверить также модули Чат, Sign In with Apple, Видеостриминг и само приложение.

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

В результате такой модернизации мы получили ряд бонусов:

  1. Мы проверяем в CI только то, что действительно было затронуто прямо или косвенно.

  2. Продолжительность CI-проверок перестала линейно зависеть от количества модулей.

  3. Разработчик понимает, что его изменения могут затронуть и где нужно быть осторожным.

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

Ждём завершения Е2Е-тестов

Для приложения Badoo у нас есть более 2000 сквозных (end-to-end) тестов, которые его запускают и проходят по сценариям использования для проверки ожидаемых результатов. Если запустить все эти тесты на одной машине, то прогон всех сценариев займёт около 60 часов. Поэтому на CI все тесты запускаются параллельно насколько это позволяет количество свободных агентов.

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

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

Для каждого нового модуля отдельный скрипт в CI проверяет наличие модуля в этом маппинге, чтобы разработчики не забывали синхронизироваться с командой тестирования для пометки модуля необходимыми группами тестов.

Подобное решение едва ли можно назвать оптимальным, но всё же преимущества от его внедрения были ощутимы:

  1. Нагрузка на CI существенно снизилась. Чтобы не быть голословным, привожу график времени, которое задача на прогон сквозных тестов провела в очереди:

  2. Уменьшился шум инфраструктурных проблем (меньше запусков тестов меньше падений из-за зависших агентов, сломавшихся симуляторов, недостатка места и т. д.).

  3. Карта модулей и их тестов стала точкой синхронизации отделов разработки и тестирования. В рамках разработки программист и тестировщик обсуждают, например, какие из имеющихся групп тестов могут подойти для проверки в том числе нового модуля.

Медленный запуск приложения

Apple открыто говорит о том, что динамическое связывание замедляет запуск приложения, однако именно оно является вариантом по умолчанию для любого нового проекта, созданного в Xcode. Так выглядит реальный график времени запуска одного из наших проектов:

В середине графика видно резкое снижение времени. Причина переход на статическую линковку. С чем это связано? Инструмент динамической загрузки модулей dyld от Apple выполняет трудоёмкие задачи не совсем оптимальными способами, время исполнения которых линейно зависит от количества модулей. В этом и была основная причина замедления запуска нашего приложения: мы добавляли новые модули dyld работал всё медленнее (на графике синяя линия отражает количество добавляемых модулей).

После перехода на статическое связывание количество модулей перестало влиять на скорость запуска приложения, а с появлением iOS 13 Apple перешла на использование dyld3 для запуска приложений, что тоже поспособствовало ускорению этого процесса.

Стоит сказать, что статическая линковка несёт с собой и ряд ограничений:

  1. Одно из наиболее неудобных невозможность хранения ресурсов в статических модулях. Эта проблема частично решается в относительно новых XCFrameworks, но технологию пока что нельзя считать проверенной временем и полноценно готовой к Enterprise. Мы решили эту проблему созданием рядом с модулем отдельных бандлов, которые уже упаковываются в готовое приложение или тестовый бандл для прогона тестов. Обеспечением целостности графа при работе с ресурсами также занимается утилита deps, которая получила несколько новых правил.

  2. После перехода на статическую линковку нужно хорошенько протестировать приложение на предмет рантайм-падений. Чтобы исправить многие из них, вам просто придётся использовать не самые оптимальные параметры оптимизаций. Например, почти для всех Objective-C-модулей придётся включить флаг -all-load. Отмечу ещё раз, что решение всех этих проблем с вынесенными xcconfigами (про xcconfig в первой части) не было таким мучительным, каким могло бы быть.

Итак, мы побороли две основные проблемы, вынесли ресурсы в отдельные бандлы, поправили конфигурации сборки. В результате:

  • количество модулей в приложении перестало влиять на скорость его запуска;

  • размер приложения уменьшился примерно на 30%;

  • количество крашей уменьшилось в три раза за счёт ускорения запуска. iOS убивает приложения, если они долго запускаются, а на устройствах старше трёх лет со слабенькими батареями, где процессор давно не работает на максимуме, это реальные случаи, которых стало значительно меньше.

Цифры подскажут, куда двигаться дальше

Мы рассмотрели глобальные изменения, которые нам пришлось сделать, чтобы жить в мире и согласии в процессе модуляризации:

  • автоматизация работы с графом зависимостей: следите за графом, сделайте так, чтобы было легко понять, что от чего зависит и где на графе узкие места;

  • уменьшение нагрузки на CI за счёт фильтрации проверяемых модулей и умных тестов: не попадайтесь в ловушку прямой зависимости продолжительности CI-проверок от количества модулей;

  • статическая линковка: скорее всего, вам придётся перейти на статическое связывание, так как уже к 50-60 модулям регресс в скорости запуска приложения станет заметен не только вам, но и вашим менеджерам.

Я не говорил об этом напрямую, но, как вы могли заметить, у нас есть графики времени, которое задачи проводят в очереди CI, скорости запуска приложения и т. д. Необходимость всех изменений, описанных ранее, была обусловлена значениями важных при разработке приложения метрик. Какие бы преобразования процессов вы ни задумали, необходимо иметь возможность измерить их результаты. Если такой возможности нет, скорее всего, изменения не имеют смысла.

В нашем случае мы понимали, что изменения сильно затронут разработчиков, поэтому основная метрика, за которой мы следили и следим, это время сборки проекта на железе разработчика. Да, есть показатели времени чистой сборки с CI, но разработчики редко делают чистую сборку; они используют другое оборудование и т. д., то есть и конфигурации сборки, и их окружение другие.

Поэтому у нас есть график среднего времени сборки наших приложений на компьютерах разработчиков:

Если на графике есть выбросы (резко замедлилась сборка всех приложений), значит, скорее всего, в конфигурациях сборки что-то изменилось не в лучшую для разработчиков сторону. Такие проблемы мы стараемся исследовать и решать.

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

Мы построили график с расположенными по осям средней продолжительностью сборки и количеством сборок в день. Стало ясно, что среди самых долго собирающихся модулей есть такие, которые собираются всего лишь два раза в день, и в целом их влияние на общий опыт работы с проектом крайне мало. Есть же, наоборот, модули, сборка которых занимает порядка 10 секунд, но в день их собирают более 1500 раз: за ними нужно внимательно следить. В общем, старайтесь смотреть не на один модуль, а на картину в целом.

Кроме того, мы стали понимать, какое оборудование ещё подходит для работы над нашим проектом, а с каким пришло время прощаться.

Например, видно, что iMac Pro 5K 2017 года выпуска не лучшее железо для сборки Badoo, в то время как MacBook Pro 15 2018 года ещё вполне неплох.

А главный вывод, который мы сделали, заключается в необходимости повышения качества жизни разработчиков. В процессе модуляризации есть вероятность уйти в технологии с головой, забыв о том, для чего это всё делается. Поэтому важно помнить основные мотивы и понимать, что последствия отразятся и на вас самих.

Измеряем время сборки

Чтобы получать данные о продолжительности сборки на компьютерах разработчиков, мы создали специальное macOS-приложение Zuck. Оно сидит в статус-баре и следит за всеми xcactivitylog-файлами в DerivedData. xcactivitylog файлы, которые содержат ту же информацию, которую мы видим в билд-логах Xcode в непростом для парсинга формате от Apple. По ним можно понять, когда началась и закончилась сборка отдельного модуля и в какой последовательности они собирались.

В утилите есть white- и black-листы, так что мы отслеживаем только рабочие проекты. Если разработчик скачал демо-проект какой-то библиотеки с GitHub, мы не будем отправлять данные о её сборке куда-либо.

Информацию о сборке наших проектов мы передаем во внутреннюю систему аналитики, где имеется широкий инструментарий для построения графиков и анализа данных. Например, у нас есть инструмент Anomaly Detection, который предсказывает аномалии в виде слишком сильных отклонений от прогнозируемых значений. Если время сборки резко изменяется по сравнению с предыдущим днём, Core-команда получает уведомление и начинает разбираться, где и что пошло не так.

P. S. Мы дорабатываем Zuck, чтобы выпустить его в open source.

В целом измерение локального времени сборки даёт важные результаты:

  • мы измеряем влияние изменений на разработчиков;

  • имеем возможность сравнивать чистые и инкрементальные сборки;

  • знаем, что надо улучшить;

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

Далее я приведу краткую сводку метрик, за которыми нужно следить, если вы начали двигаться в сторону модуляризации:

  1. Время запуска приложения. Последние версии Xcode предоставляют эту информацию в разделе Organizer. Метрика быстро укажет на появившиеся проблемы.

  2. Размер артефактов. Эта метрика поможет быстро обнаружить проблемы линковки. Возможны случаи, когда линковщик не сообщает о том, что, например, какой-то модуль дублировался. Однако об этом скажет увеличившийся размер скомпилированного приложения. Обращайте внимание на этот график. Проще всего подобную информацию получить из CI.

  3. Инфраструктурные показатели (время сборки, время задач в очереди CI и т. п.). Модуляризация скажется на многих процессах компании, но инфраструктура особенно важна, потому что её придётся масштабировать. Не попадайтесь в ловушку, как мы, когда до мержа в мастер изменениям приходилось находиться в очереди по пять-шесть часов.

Конечно, нет предела совершенству, но это основные показатели, которые позволят вам отслеживать самые критичные проблемы и ошибки. Некоторые метрики можно собирать и локально, если нет возможности инвестировать в сложные системы мониторинга: заведите локальные скрипты и хотя бы раз в неделю смотрите на основные показатели. Это поможет понять, в правильном ли вообще направлении вы движетесь.

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

Заключение

После моего рассказа у вас могло сложиться впечатление, что требуется очень много сил и ресурсов, чтобы построить в компании процесс модуляризации. Отчасти это правда, но я приведу небольшую статистику: на самом деле мы не такие уж и большие.

  1. Всего сейчас у нас работают 43 iOS-разработчика.

  2. Четыре из них в Core-команде.

  3. Сейчас у нас два основных приложения и N экспериментальных.

  4. Около 2 миллионов строк кода.

  5. Около 78% из них находятся в модулях.

Последняя цифра постепенно растёт: старые фичи и переписанный legacy-код потихоньку перетекают из основного таргета приложений в модули.

В двух статьях я рекламировал вам модуляризацию, но, конечно, у неё есть свои минусы:

  • усложнение процессов: вам придётся решить ряд вопросов в процессах как вашего департамента и рядовых iOS-разработчиков, так и во взаимодействии с другими департаментами: QA, CI, менеджерами продуктов и т. д.;

  • в процессе перехода на модуляризацию вскроются проблемы, которых вы не ждали, всё не предусмотреть: возможно, потребуются дополнительные ресурсы и других команд;

  • всё, что вы построите, будет нуждаться в дополнительной поддержке: процессы, новые внутренние инструменты кто-то должен будет за это отвечать;

  • приложения, базирующиеся на модулях, сильнее зависят друг от друга. Например, при изменении чего-то в модуле работы с базой данных для приложения Badoo через несколько минут можно получить от CI сообщение о том, что в приложении Bumble не прошли тесты.

Но хорошая новость заключается в том, что все эти минусы управляемы. Их не стоит бояться, поскольку это не те проблемы, которые невозможно решить. Нужно просто быть к ним готовыми.

О плюсах модуляризации уже было сказано, но я повторюсь:

  • гибкое масштабирование iOS-разработки: новые команды начинают работать в своих модулях, подход к созданию и поддержке которых унифицирован;

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

  • развитие инфраструктуры и мониторинга: это неизбежные улучшения, без которых вам будет очень сложно создать и поддерживать процесс модуляризации.

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

Подробнее..

Розыгрыш туалетной бумаги ипосиделки уискусственного костра каким был тимбилдинг вэтом году

25.11.2020 18:12:55 | Автор: admin
imageФото: www.facebook.com/doctorevent

Компании уже около года существуют в новой реальности, условия которой диктует пандемия. В какой-то момент ограничения ослабевали, но сейчас люди снова засели по домам. Отдельные компании и вовсе решили перевести штат на вечную удаленку. Редакция Хабр Карьеры решила выяснить, как российские и зарубежные IT-компании решили проблему тимбилдинга и проведения корпоративов.
Этот пост вышел в рамках Марафона удалёнки на Хабр Карьере. Эту душеспасительную движуху мы затеяли уже во второй раз, чтобы не сойти с ума на второй волне изоляции. Заодно, надеемся, эта активность поможет кому-то прокачать навыки удалённой работы и сделать домашний офис комфортнее.

Тема недели: Как настроить процессы в команде
Куратор недели: Евгений Россинский, директор по технологии в IVI

У них


Основным трендом весны-2020 стал онлайн-бар. Люди собирались перед мониторами с любимыми напитками в условленное время, чтобы пообщаться неформально. Тренд набрал популярность не только у нас, но и за рубежом. В компании Srax, штаб которой насчитывает около 150 сотрудников в пяти офисах по всему миру, на первую же встречу пришли около сотни человек, и вечеринку пришлось перенести из Highfive в Google Hangouts.

Со временем просто выпивать наскучило. Компании начали проводить настоящие онлайн-квартирники, в ходе которых каждый мог продемонстрировать свои умения: сыграть на балалайке, жонглировать мандаринами или исполнить сальсу. Некоторые фирмы приглашали ведущих, чтобы те не дали вечеринке превратиться в неконтролируемое шоу талантов. Особо смелые даже транслировали происходящее на YouTube.

Хорошим вариантом тимбилдинга стали квизы или квесты, причем, последние было удобно проводить даже в мессенджерах.

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

Онлайн-бары начали трансформироваться в столовки. Вот компания Ingenio каждый день в полдень приглашает членов команды в Обеденную. Им начисляют стипендию через DoorDash, а бонусом дают одно бесплатное блюдо в неделю. Кроме того, каждый день в 17:00 стартует счастливый час, когда можно не только поесть, но и выпить.

За рубежом целый ряд компаний теперь предлагает свои решения для организации удаленного тимбилдинга. Например, Water Cooler Trivia создает текстовые онлайн-викторины, которые можно отправлять по электронной почте или в Slack. Их можно адаптировать под профиль компании. Удобство формата в том, что сотрудники могут отвлечься на викторину в любой момент, особенно, если все они живут в разных часовых поясах. И это не так обязывает, как участие в Zoom-вечеринках, которые многие успели возненавидеть еще с весны.

image

Другая компания, Let's Roam, запустила домашний вариант квестов участники должны искать предметы в своих собственных домах. Компания также предлагает викторины, шарады и прочие виды активности.

Компания из Сан-Франциско The Go Game организует видеоигры продолжительностью от 45 минут до часа. У каждой есть реальный ведущий, сама игра включает викторины, караоке и конкурсы. Интересно, что компания сумела перевести свою предыдущую деятельность из офлайна в онлайн, и теперь такие игры пользуются спросом.

А вот Tiny Campfire предлагает устраивать кэмпинги на дому. Компания доставляет сотрудникам крошечные костры и другие походные предметы, а потом организует в Zoom комнату с ведущим судя по всему, опытным скаутом. Говорят, что в пандемию такие кэмпинги устраивали в Apple, Amazon, Microsoft, Pepsi, H&M и Netflix.

image

У нас


В России, впрочем, тренд подхватили быстро, и теперь наши компании тоже предлагают разнообразный корпоративный досуг.

Команда Вконтакте еще в самом начале пандемии реорганизовала одно из внутренних сообществ под удалённый формат. Там на неформальные мероприятия могли собираться коллеги из разных локаций.

image Началось со спорта: тренировки по йоге, растяжке и Full Body, заработал клуб любителей планки, которые пробовали стоять в планке два раза в день по видеосвязи, прошла лекция о домашних тренировках от главного врача сборной России по футболу. Потом перешли к кулинарии: готовили вместе по рецептам шеф-поваров и коллег, организовывали розыгрыши, победители которых получали набор продуктов с доставкой на дом. Проводили игры: Мозгобойню и Квиз Плиз, Свою Игры и даже пытались сыграть в Мафию. Дошло дело и до учебы: были лекции о кино, истории и даже по медицине. Хобби стали коллективными, сотрудники мастерили светильники и ароматические свечи, пересаживали домашние растения и собирали букеты, учились живописи и керамике, создавали 3D-картины.

В онлайн-кинотеатре Okko решили максимально адаптировать встречи в Zoom под привычные офлайновые форматы. Примерно раз неделю компания проводит по небольшому онлайн-празднику. За время локдауна в Okko успели поиграть в настолки, встретиться командами в онлайн-баре, сыграть в Кофе-рулетку, организовать онлайн-путешествие не выходя из дома, провести мастер-классы для детей сотрудников.

Компания регулярно опрашивает сотрудников о том, какие удаленные развлечения им хотелось бы попробовать, устраивает опросы и голосовалки. Традиционные в офлайне welcome-ужины для новичков перешли и в онлайн. В рамках такого ужина новые сотрудники готовят вместе еду на кулинарном мастер-классе, лучше узнают друг друга и задают вопросы коллегам из HR.

Самым запоминающимся для Okko стал первый онлайн-корпоратив. Для него подготовили пять онлайн-комнат по интересам, между которыми сотрудники могли перемещаться. В одной комнате поиграть в Крокодила, а в другой обсудить, как развлечь детей на самоизоляции.

Классным новым форматом в компании стали онлайн-экскурсии по другим странам. Сотрудники выбирали, куда отправиться на онлайн-тимбилдинг. Как выяснилось, самая любимая страна у сотрудников Okko это Япония.

В Badoo даже на карантине сохранили традицию пицца-пятниц. Сотрудникам высылают промокоды на доставку, а во время вечеринок они общаются в вечернем чате и делятся фотографиями с любимой едой.

Компания активно осваивает разные форматы. В апреле прошла вечеринка Радио Badoo с ведущими, звонками в студию, песнями на заказ и приглашенными гостями. Эфир длился несколько часов и был посвящен разным темам, по которым выступали шуточные эксперты. Было здорово наконец-то услышать всех после месяца карантина, заказывать любимые песни, передавать приветы в эфире и шутить в чатике, делятся в компании. Кстати, к участию подключили и лондонских коллег.

На Geek Day компания обратилась к ТВ-формату и провела игру Сто к одному. В виртуальной студии с десяток инженеров соревновались в ответах на вопросы ведущего о компании и коллегах. Самые популярные варианты ответов определили заранее, опросив команду Badoo. Игра помогла новым работникам погрузиться в атмосферу и коллектив. А старичкам пришлось вспоминать, правда ли, что их коллеги нашли вторую половинку на Badoo, и действительно ли в компании работает чемпион России по скоростной сборке кубика Рубика.

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

В МегаФоне протестировали более 15 различных вариантов досуга: от бизнес-игр до квестов и на их основе создали внутренний каталог онлайн-тимбилдингов. Компания проводила квесты в Telegram и организовывала онлайн-стратегии, к участию в которых привлекала партнеров.

В онлайн-кинотеатре IVI решили, что для комфортной работы на удаленке важно наладить общение сотрудников с топами, а также как можно больше информировать их о новостях компании и ситуации с коронавирусом. Для коллег провели два конкурса рабочих мест, несколько викторин я знаю IVI. С лидерами направлений организовывали регулярные бизнес-завтраки, а между сотрудниками устраивали Рандомный кофе с помощью Slack-бота, чтобы познакомить между собой тех, кто обычно не контактирует по работе. Новичкам устраивали welcomе-тренинги в онлайне, а еще ввели экватор адаптации дружескую встречу после 68 недель работы в компании.

Сотрудников вовлекали в разного рода активности: викторины, совместные тренировки, онлайн-вечеринки, бизнес-завтраки и конкурсы. Однажды в компании провели шуточный розыгрыш карантинного набора с гречкой, масками и туалетной бумагой.

Мы смогли даже вывезти топ-менеджмент на стратегическую сессию во Францию Онлайн, разумеется. Нарисовали тематические фоны для Zoom, разослали всем ланч боксы с запрещенкой и небольшие сувениры во французском стиле, поделились в IVI.

В целом, говорят в компании, с форматами тимбилдинга приходится постоянно экспериментировать, чтобы они оставались эффективными.

В Додо Пицце в этом году впервые отметили день рождения компании в онлайне. Была организована трансляция на YouTube и сформирована программа телепередач для Додо ТВ. Сотрудники в прямом эфире проводили мастер-классы из дома: по приготовлению французского соуса, занятиям спортом, созданию запоминающихся фотографий. На десерт им организовали игру Угадай мелодию.

А в команде WayRay перенесли традиционные ежеквартальные офлайн-встречи WayRay Friday с обсуждением итогов в онлайн и проводили их как вебинары в Zoom. Сотрудники собирались на онлайн-завтраки перед началом рабочего дня, играли в видеоигры онлайн. Даже курилку перенесли в онлайн. Два месяца компания проводила Photo challenge, в ходе которого ребята делали фотографии по заданиям коллег.

Вообще этот год показал многое. Например, то, что даже обычная рабочая встреча в Zoom может превратиться в целое шоу. Неплохую пародию показали в Saturday Night Live:

Подробнее..

22 сентября, Онлайн-митап Product Engineering Meetup 2 Культура разработки

17.09.2020 16:18:03 | Автор: admin
22 сентября мы проводим онлайн-митап Product Engineering Meetup #2 Культура разработки в продуктовых компаниях.

В прошлом году мы собирались, чтобы поговорить о том, кто такой продуктовый инженер, зачем разработчику развивать продуктовое мышление, как найти баланс между продуктом и разработкой (записи можно найти тут).

На предстоящей встрече мы сфокусируемся на культуре разработки в продуктовых компаниях.

Спикеры инженеры и менеджеры продукта из Badoo, ManyChat, Додо Пицца и Работа.ру. Будем говорить о том, какие практики помогают командам создавать качественные продукты. Обсудим, какие процессы разработки помогают фокусироваться на донесении ценности пользователям и соблюдать сроки. Рассмотрим, как находить компромисс между бизнесом и разработкой и определять границы ответственности.

Надеемся, что встреча будет полезна всем участникам продуктовых команд инженерам, менеджерам продукта, тех- и тимлидам.

Регистрация доступна по ссылке, а подробности программы читайте под катом.



Доклады


История эволюции фичи: от MVP до одной из основных функциональностей продукта Евгений Жуков, Backend Developer (ManyChat)

Я расскажу историю интеграции ManyChat с Shopify одной из ведущих платформ в электронной коммерции. Из доклада вы узнаете, как собранный за неделю на коленке MVP эволюционировал в течении года и вырос в полноценное отдельное направление в нашем продукте. Поделюсь проблемами версионирования, с которыми мы столкнулись. И расскажу о метриках: какие используем мы, и как именно они нам помогают.

Как перестать беспокоиться и начать верить А/Б тестам 2 Максим Кислов, Frontend Engineering Manager (Badoo)

После того как вы победили А/Б тесты и интегрировали их в свое рабочее окружение, кажется, что все позади. На самом деле приключение только начинается: у команды нет накопленной экспертизы, процессы не налажены, а бизнес хочет полагаться на А/Б тестирование для принятия ключевых решений и ожидает результатов. Я расскажу:

  • как организовать работу с А/Б тестами внутри компании;
  • как дать бизнесу ответ на вопрос ну как там наш тест?;
  • как определить границу ответсвенности техлида и разделить ответственность с продактом.

Инициатива не наказуема. Почему разработчика важно погружать в продуктовую жизнь Лаша Харчилава, Ведущий Менеджер Продукта (Работа.ру)

  • Что нужно сделать в первый день новому продакту, чтобы жизнь разработчика стала лучше.
  • Что такое продуктовый онбординг и зачем он разработчику.
  • Для чего нужны разработчики в краткосрочном и среднесрочном планировании продуктовых задач.
  • План к действию: есть проблема сначала спроси у разработчика.
  • Какая связь между разработчиками и результатами АБ-теста.

Как релиз продукта вышел на полгода позже, а пересмотр процессов разработки научил нас попадать в сроки Борис Герн, B2C Product Lead (Додо Пицца)

Существует много различных методологий разработки, мы в Додо постоянно экспериментируем с ним комбинируя разные фреймворки.

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

В презентации рассказывается о том, как команда одного из наших продуктов приходила к своему рабочему процессу:

  • Какие ошибки были совершены на старте
  • В какой момент мы поняли, что что-то идет не так
  • Какие шаги предпринимали, чтобы исправить ситуацию
  • Какие практики и процессы оказались рабочими, что мы используем сейчас
  • Какие выводы мы сделали и как планируем применить это в будущем

Участие


Встреча пройдёт онлайн, 22 сентября. Начало в 19:00.

Доклады будут транслироваться на YouTube, а пообщаться со спикерами и другими участниками можно будет в Zoom и телеграм-чате. Для самых стойких организуем онлайн-бар после основной программы.

Для участия нужно заполнить форму регистрации, чтобы получить ссылку для подключения и напоминание о трансляции.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru