company_banner
  • Архитектурный шаблон MVI в Kotlin Multiplatform, часть 2



      Это вторая из трёх статей о применении архитектурного шаблона MVI в Kotlin Multiplatform. В первой статье мы вспомнили, что такое MVI, и применили его для написания общего для iOS и Android кода. Мы ввели простые абстракции, такие как Store и View, а также некоторые вспомогательные классы и использовали их для создания общего модуля.

      Задача этого модуля — загружать ссылки на изображения из Сети и связывать бизнес-логику с пользовательским интерфейсом, представленным в виде Kotlin-интерфейса, который должен быть реализован нативно на каждой платформе. Именно этим мы и займёмся в этой статье.

      Мы будем реализовывать специфичные для платформы части общего модуля и интегрировать их в iOS- и Android-приложения. Как и прежде, я предполагаю, что читатель уже имеет базовые знания о Kotlin Multiplatform, поэтому не буду рассказывать о конфигурациях проектов и других вещах, не связанных с MVI в Kotlin Multiplatform.

      Обновлённый пример проекта доступен на нашем GitHub.
      Читать дальше →
      • +21
      • 2,1k
      • 8
    • Релиз мобильных приложений одной кнопкой



        Всем привет! Меня зовут Михаил Булгаков (нет, не родственник), я работаю релиз-инженером в Badoo. Пять лет назад я занялся автоматизацией релизов iOS-приложений, о чём подробно рассказывал в этой статье. А после взялся и за Android-приложения.

        Сегодня я подведу некоторые итоги: расскажу, к чему мы пришли за это время. Long story short: любой причастный к процессу сотрудник может зарелизить хоть все наши приложения на обеих платформах в несколько кликов — без головной боли, больших затрат времени, регистрации и СМС. Так, наш отдел релиз-инженеров за 2019 год сэкономил около 830 часов.

        За подробностями — добро пожаловать под кат!
        Читать дальше →
      • Собираем логи с Loki


          Мы в Badoo постоянно мониторим свежие технологии и оцениваем, стоит ли использовать их в нашей системе. Одним из таких исследований и хотим поделиться с сообществом. Оно посвящено Loki — системе агрегирования логов.


          Loki — это решение для хранения и просмотра логов, также этот стек предоставляет гибкую систему для их анализа и отправки данных в Prometheus. В мае вышло очередное обновление, которое активно продвигают создатели. Нас заинтересовало, что умеет Loki, какие возможности предоставляет и в какой степени может выступать в качестве альтернативы ELK — стека, который мы используем сейчас.

          Читать дальше →
        • Видеозаписи всех докладов с PHP Russia 2020 Online

            Онтико, благодаря поддержке Badoo, опубликовали видеозаписи всех докладов PHP Russia 2020 Online в открытый доступ.

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

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

            И вот теперь эти доклады доступны всем желающим, так же как и на конференции с оригинальной дорожкой и с синхронным переводом от Skyeng. Бонусом, полученным от онлайн-формата, ко всем видео прилагается запись Q&A-сессии. Можно сказать, что впервые можно переслушать то, что обсуждали в кулуарах, или вообще узнать, о чем говорили, когда ты убежал на следующий доклад.


            Чуть подробнее о каждом докладе
          • Исследуем баг iOS с помощью Hopper

              Привет! Меня зовут Александр Никишин, я занимаюсь разработкой iOS-приложений в компании Badoo. В статье я расскажу о том, как мы исследовали баг в UIKit, который Apple не хотела исправлять на протяжении полугода.



              Всё началось в августе 2019 года с первых бета-версий iOS 13. Тогда мы впервые столкнулись с проблемой. В приложениях Badoo и Bumble мы постоянно работаем над улучшением интерфейсов и, например, стараемся максимально оптимизировать нудный и не любимый пользователями процесс регистрации. Системные предиктивные подсказки над клавиатурой — отличный способ сокращения количества кликов пользователя при вводе данных. Однако в новой версии iOS мы с удивлением обнаружили, что подсказки при вводе номера телефона пропали.
              Читать дальше →
            • C2x: будущий стандарт C


                Я ловлю в далёком отголоске,
                Что случится на моём веку.
                («Гамлет», Борис Пастернак)

                Признаться, пишу на чистом C я не так уж и часто и за развитием языка уже давно не слежу. Но тут произошло два неожиданных события: С вернул себе звание популярнейшего языка программирования по версии TIOBE и случился анонс первой за долгие годы действительно интересной книги, посвящённой этому языку. Поэтому я провёл несколько вечеров за изучением материалов о C2x — следующей версии C.


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

                Читать дальше →
              • Архитектурный шаблон MVI в Kotlin Multiplatform, часть 1

                • Перевод


                Около года назад я заинтересовался новой технологией Kotlin Multiplatform. Она позволяет писать общий код и компилировать его под разные платформы, имея при этом доступ к их API. С тех пор я активно экспериментирую в этой области и продвигаю этот инструмент в нашей компании. Одним из результатов, например, является наша библиотека Reaktive — Reactive Extensions для Kotlin Multiplatform.

                В приложениях Badoo и Bumble для разработки под Android мы используем архитектурный шаблон MVI (подробнее о нашей архитектуре читайте в статье Zsolt Kocsi: «Современная MVI-архитектура на базе Kotlin»). Работая над различными проектами, я стал большим поклонником этого подхода. Конечно, я не мог упустить возможность попробовать MVI и в Kotlin Multiplatform. Тем более случай был подходящий: нам нужно было написать примеры для библиотеки Reaktive. После этих моих экспериментов я был вдохновлён MVI ещё больше.

                Я всегда обращаю внимание на то, как разработчики используют Kotlin Multiplatform и как они выстраивают архитектуру подобных проектов. По моим наблюдениям, среднестатистический разработчик Kotlin Multiplatform — это на самом деле Android-разработчик, который в своей работе использует шаблон MVVM просто потому, что так привык. Некоторые дополнительно применяют «чистую архитектуру». Однако, на мой взгляд, для Kotlin Multiplatform лучше всего подходит именно MVI, а «чистая архитектура» является ненужным усложнением.

                Поэтому я решил написать эту серию из трёх статей на следующие темы:

                1. Краткое описание шаблона MVI, постановка задачи и создание общего модуля с использованием Kotlin Multiplatform.
                2. Интеграция общего модуля в iOS- и Android-приложения.
                3. Модульное и интеграционное тестирование.

                Ниже — первая статья серии. Она будет интересна всем, кто уже использует или только планирует использовать Kotlin Multiplatform.
                Читать дальше →
              • WebRTC на Android: как включить аппаратное кодирование на множестве устройств

                  Для видеозвонков в Badoo мы используем стандарт WebRTC и кодек H.264. Если верить документации, этот кодек должен без проблем работать на любых устройствах Android начиная с Android 5.0. Но на практике всё оказалось не совсем так. В этой статье я расскажу про особенности реализации аппаратного кодирования для кодека H.264 в WebRTC и о том, как заставить его работать на большем количестве устройств.


                  Читать дальше →
                  • +55
                  • 5,4k
                  • 9
                • Видео Live! Badoo Localization Meetup 21 апреля



                    Неделю назад прошел Live! Badoo Localization Meetup. Для нас это первая встреча на такую тему, да еще и в онлайн-формате. Отдельные секции по локализации редко встречаются на конференциях, поэтому собрать вместе четырех спикеров и больше 100 заинтересованных слушателей было приятно и неожиданно.

                    Митап был задуман как руководство к действию: спикеры из Badoo, Яндекс.Директ, SmartCat и Alconost делились опытом и инструментами, которые подойдут проектам разного размера и на разных этапах развития.

                    После всех докладов мы еще 2 часа обсуждали и разбирали проблемы. А кто-то из гостей даже получил документ со схемой решения именно его вопроса.

                    В этой статье я собрал обзор выступлений и ссылки на материалы.
                    Читать дальше →
                  • Открытая конференция PHP Russia Online

                      На единственной конференции по PHP в России должно было быть 22 доклада от разработчиков инструментов, которыми мы все пользуемся, и множество камерных событий. Больше половины наших спикеров должны были прилететь из разных стран, поэтому угроза переноса или отмены нависла над нами еще до официальных российских постановлений. А после всё пошло не так…

                      Но мы не отчаиваемся и планируем провести большую оффлайн-конференцию 14 сентября в Москве, а чтобы PHP-сообщество не скучало до осени, 13 мая пройдет онлайн-конференция PHP Russia Online и, благодаря поддержке компании Badoo, она стала бесплатной.



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

                      Для опытных разработчиков PHP Russia Online даст возможность услышать выступления и задать вопросы лидерам PHP-сообщества — всегда же лучше получать информацию из первых рук. А для тех, кто уже добился первых успехов в PHP-разработке, но еще не дорос до уровня middle, — заряд вдохновения и ориентиры, на что обращать внимание, куда развиваться.
                      Читать дальше →
                    • Как перестать беспокоиться и начать верить A/B-тестам

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

                        Мы в Badoo не доверяем ощущениям, зато верим цифрам. Суммарно у наших сервисов больше 500 миллионов пользователей, и свой фреймворк для тестирования мы написали довольно давно. За шесть лет через него прошло 2962 теста, и A/B-тестирование доказало свою важность, надёжность и результативность.



                        Но в этой статье я расскажу не о том, как работает наша система. На это не хватит одной статьи. Кроме того, многие вещи специфичны для нашей компании и не подойдут другим. Сегодня я расскажу об эволюции наших представлений об A/B-тестах: на какие грабли мы наступали в процессе и как проверяли корректность работы тестов. Это статья для тех, кто ещё не начал тестировать, но думает об этом, а также для тех, кто не уверен в своей системе тестов.
                        Читать дальше →
                        • +47
                        • 5,1k
                        • 6
                      • QA — специалист по пожарной безопасности вашего проекта


                          На конференциях и в неформальных беседах на работе нет-нет да и возникает разговор о важности работы QA-инженера и его роли в проекте. Это может быть и робкий вопрос коллеги-программиста «А, может, выпустим без QA?», и объёмный доклад.


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

                          Читать дальше →
                          • +26
                          • 9,8k
                          • 8
                        • 21 апреля Live! Badoo Localization Meetup



                            Всем привет!

                            Я Алексей Тимин, отвечаю за техническую часть системы локализации в Badoo. У нас 150 000 фраз и текстов, переведённых на 52 языка для нескольких приложений. У каждого приложения свои особенности аудитории, определенный стиль общения с пользователем, версии для веба и мобильных платформ. 

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

                            Тема животрепещущая, так что мы предложили спикерам из Яндекса и Alconost поделиться своим опытом на первом Badoo Localization Meetup, который мы проведём в онлайн-формате. 

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

                            Мероприятие бесплатное, но регистрация обязательна
                            Читать дальше →
                          • Чиним сериализацию объектов в Kotlin раз и навсегда


                              Недавно я наткнулся на статью о проблеме c Java-сериализацией объектов в Kotlin. Автор предложил решать её добавлением метода readResolve к каждому объекту, который наследуется от java.io.Serializable.


                              Этот способ выглядит абсолютно правильным, однако его поддержка может оказаться слишком проблематичной. С учетом того, что в нашем проекте эта проблема возникала только при использовании объектов внутри Bundle, мы решили использовать проверку через is для каждой ветки when-выражений в случае sealed классов.


                              Тем не менее, размышляя об этом, я никак не мог понять, почему Kotlin не генерирует readResolve в компиляторе, поддерживая singleton-свойства объектов. Мне казалось, что это работа для инструментов, а не для человека. Но раз Kotlin не добавляет эту функцию сам, мы можем ему помочь! Этим мы сейчас и займёмся.

                              Читать дальше →
                              • +21
                              • 3,3k
                              • 7
                            • Strace в Linux: история, устройство и использование


                                В Unix-подобных операционных системах общение программы с внешним миром и операционной системой происходит через небольшой набор функций — системных вызовов. А значит, в отладочных целях полезно бывает подсмотреть за выполняемыми процессами системными вызовами.


                                Следить за «интимной жизнью» программ на Linux помогает утилита strace, которой и посвящена эта статья. К примерам использования «шпионского» оборудования прилагаются краткая история strace и описание устройства подобных программ.

                                Читать дальше →
                              • Дизайн-токены способны на большее: создаем единый источник информации о компонентах UI

                                • Перевод

                                Термином «дизайн-система» в IT давно никого не удивишь. Компании систематизируют дизайн продуктов, придумывая свои или используя чужие инструменты для управления стилями, паттернами и компонентами. 


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


                                image


                                Одна из первых и основных вещей, с которой начинается работа по созданию дизайн-системы, — это токены (или переменные), которые определяют значения разных сущностей системы. 


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


                                Несмотря на потенциал дизайн-токенов, во многих компаниях их структура остаётся довольно простой, что сильно ограничивает возможности их применения. 


                                Я хочу поделиться адаптированным переводом статьи моего коллеги Кристиано Растелли (Cristiano Rastelli), который несколько лет развивает дизайн-систему Cosmos. На примере своего опыта он показывает, как работать с токенами более эффективно: добавлять метаданные и использовать их для описания свойств компонентов. 


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

                                Читать дальше →
                              • Dynamic Delivery в многомодульных проектах (часть 2)



                                  Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и занимаюсь внедрением Dynamic Features в наши проекты.


                                  Я уже рассказывал, что такое Dynamic Delivery и какой у него API. В этой статье я подробнее опишу, как я использовал Dynamic Delivery в нашем приложении и почему интеграция оказалась такой лёгкой. В результате мне удалось уменьшить вес приложения на полмегабайта для 99% наших пользователей, превратив доступную для жителей определённого региона функцию в загружаемый модуль.

                                  Читать дальше →
                                • Dynamic Delivery в многомодульных проектах (часть 1)



                                    Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и занимаюсь внедрением Dynamic Features в наши проекты.


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


                                    В первой части статьи я подробнее расскажу о Dynamic Delivery и его API: как загружать и удалять модули. Во второй части — разберу на примере, как я использовал Dynamic Delivery в нашем приложении и получил экономию на размере приложения в полмегабайта.

                                    Читать дальше →
                                    • +21
                                    • 2,8k
                                    • 5
                                  • Избавляемся от рутины со своим плагином для PhpStorm

                                      Привет, Хабр! Я тружусь в команде Антиспама, и, как и у большинства бэкенд-разработчиков Badoo, большая часть времени у меня уходит на работу с PHP-кодом.

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

                                      Так появился плагин Badoo для PhpStorm, который мы сегодня активно используем. За несколько лет его возможности серьёзно расширились, мы его развиваем, и в этой статье я расскажу на примере наших кейсов, как адаптировать IDE под свои задачи и инструменты, и докажу, что это не так сложно, как кажется.


                                      Читать дальше →
                                    • Что делать с легаси. Материалы с Badoo PHP Meetup #4

                                        Всем привет!

                                        15 февраля в офисе Badoo прошла очередная встреча PHP-разработчиков, посвященная теме легаси. Целый день мы слушали рассказы об опыте крупных компаний, общались и делились болью.

                                        Получилось рассмотреть проблему с нескольких сторон:

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

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


                                        Читать дальше →
                                        • +32
                                        • 6,8k
                                        • 3

                                      Самое читаемое