• Badoo Jira API Client: магия в Jira на PHP

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



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

      И всё это сегодня доступно и происходит автоматически. Большую часть магии мы реализовали на PHP с помощью постоянно развивающегося API Jira и с использованием её webhook’а. И сегодня мы хотим поделиться с сообществом нашей версией клиента для этого API.

      Сначала мы хотели просто рассказать об идеях и подходе, который мы используем, а потом решили, что к такой статье решительно не хватает кода для наглядности. Так появилась open-source-версия Badoo Jira PHP Client. Огромное спасибо ShaggyRatte за то, что помог с ее описанием. И добро пожаловать под кат!
      Читать дальше →
    • Неформальные отношения в команде: зачем и как ими управлять



        Много лет назад я пришёл на должность разработчика в одну компанию и вскоре стал свидетелем необычной сцены. Тимлид соседнего отдела подозвал своего подчинённого посреди рабочего дня и довольно громко и развязно сказал ему: «Слышь, на вот тебе денег. Сгоняй в магазин, купи вискаря и закуски». 

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

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

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

        В последние десять лет я занимаюсь тем, что руковожу командами разработки, семь из них — в Badoo. Эта статья написана по мотивам моего  выступления на Saint TeamLead Conf 2019: в ней я попытаюсь объяснить, как и зачем нужно работать над неформальными отношениями в коллективе. 
        Читать дальше →
      • Пробуем preload (PHP 7.4) и RoadRunner



          Привет, Хабр! 

          Мы часто пишем и говорим о производительности PHP: как мы ей занимаемся в целом, как мы сэкономили 1 млн долларов при переходе на PHP 7.0, а также переводим разные материалы на эту тему. Это вызвано тем, что аудитория наших продуктов растёт, а масштабирование PHP-бэкенда при помощи железа сопряжено со значительными затратами — у нас 600 серверов с PHP-FPM. Поэтому инвестирование времени в оптимизацию для нас выгодно.

          Прежде мы говорили в основном об обычных и уже устоявшихся способах работы с производительностью. Но сообщество PHP не дремлет! В PHP 8 появится JIT, в PHP 7.4 — preload, а за пределами core-разработки PHP развиваются фреймворки, подразумевающие работу PHP как демона. Пора поэкспериментировать с чем-то новым и посмотреть, что это может нам дать.

          Так как до релиза PHP 8 ещё далеко, а асинхронные фреймворки плохо подходят для наших задач (почему — расскажу ниже), сегодня остановимся на preload, который появится в PHP 7.4, и фреймворке для демонизации PHP — RoadRunner.

          Это текстовая версия моего доклада с Badoo PHP Meetup #3. Видео всех выступлений мы собрали в этом посте.
          Читать дальше →
        • Время высокой точности: как работать с долями секунды в MySQL и PHP

          • Tutorial


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


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


          Я буду использовать термин «время высокой точности». В документации MySQL вы увидите термин “fractional seconds”, но его дословный перевод звучит странно, а другого устоявшегося перевода я не нашёл.

          Читать дальше →
        • 19 октября Badoo Techleads Meetup #5. Непростые ситуации



            Меня зовут Денис Чернобай, я отвечаю за frontend-разработку в компании Badoo. Три года назад мы впервые собрали сообщество IT-руководителей, чтобы обсудить объединяющие его темы, и продолжаем следить за тем, что волнует коллег по цеху. 

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

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

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

            Регистрация по ссылке, подробнее о спикерах под катом.
            Читать дальше →
          • PHP Xdebug proxy: когда стандартных возможностей Xdebug не хватает

              PHP Xdebug proxy: когда стандартных возможностей Xdebug не хватает


              Для отладки PHP-программ часто используют Xdebug. Однако стандартных возможностей IDE и Xdebug не всегда достаточно. Часть проблем можно решить с помощью Xdebug proxy — pydbgpproxy, но всё же не все. Поэтому я реализовал PHP Xdebug proxy на базе асинхронного фреймворка amphp.


              Под катом я расскажу, что не так с pydbgpproxy, чего в нём не хватает и почему я не стал его дорабатывать. Также объясню, как работает PHP Xdebug proxy, и покажу на примере, как его расширять.

              Читать дальше →
            • Continuous delivery для вашей Kotlin Multiplatform библиотеки

                Logo


                Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и принимаю участие в создании библиотеки Reaktive — Reactive Extensions на чистом Kotlin.


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

                Читать дальше →
              • Производительность PHP-бэкенда. Видео с Badoo PHP Meetup #3

                  Привет! Готовы материалы с Badoo PHP Meetup #3, традиционной неформальной встречи сообщества. Напомню, в этот раз мы обсуждали проблемы производительности бэкенда на PHP и их решение в разных компаниях.  



                  Тема нашла моментальный отклик среди почти 200 гостей — на каждом перерыве спикеров окружала толпа с вопросами. Опытом делились Александр Малащицкий из Superjob, Павел Мурзаков pmurzakov из Badoo и Антон Шабовта zloyusr из Onliner, а к панельной дискуссии также присоединились Семён Катаев из Avito и Михаил Буйлов из Mamba.

                  Все материалы — под катом, полезного просмотра!
                  Читать дальше →
                  • +33
                  • 6,6k
                  • 6
                • Танцы с саппортом: виды и формы поддержки. Саппорт систем, работающих в бою

                    Всем привет! Меня зовут Александр Афенов, и я тимлид команды Order Processing в Lamoda. Сегодня хочу рассказать вам о том, как мы разгребаем саппорт.

                    Сначала поговорим про то, как он встраивается в наши процессы и как в целом мы планируем свою работу, спринты и итерации.

                    Затем расскажу, откуда вообще саппорт может прилетать и на какие виды он подразделяется.
                    Поделюсь опытом того, как мы внутри команды справляемся с каждым из видов саппорта.

                    В конце рассмотрим плюсы и минусы используемых нами практик и подведем итоги.

                    Читать дальше →
                    • +30
                    • 3,2k
                    • 2
                  • Внутренности Go: оборачиваем переменные цикла в замыкании

                    • Перевод


                    Сегодня я решил перевести для вас небольшую статью о внутренностях реализации так называемых замыканий или closures. В дополнение вы узнаете о том, как Go пытается автоматически определить, нужно ли использовать указатель/ссылку или значение в разных случаях. Понимание этих вещей позволит избежать ошибок. Да и просто все эти внутренности чертовски интересны, как мне кажется!


                    А еще я хотел бы пригласить вас на Golang Conf 2019, которая пройдет 7 октября в Москве. Я член программного комитета конференции, и мы с коллегами выбрали много не менее хардкорных и очень, очень интересных докладов. То, что я люблю!


                    Под катом передаю слово автору.

                    Читать дальше →
                  • Cron в Linux: история, использование и устройство


                      Классик писал, что счастливые часов не наблюдают. В те дикие времена ещё не было ни программистов, ни Unix, но в наши дни программисты знают твёрдо: вместо них за временем проследит cron.


                      Утилиты командной строки для меня одновременно слабость и рутина. sed, awk, wc, cut и другие старые программы запускаются скриптами на наших серверах ежедневно. Многие из них оформлены в виде задач для cron, планировщика родом из 70-х.


                      Я долго пользовался cron поверхностно, не вникая в детали, но однажды, столкнувшись с ошибкой при запуске скрипта, решил разобраться основательно. Так появилась эта статья, при написании которой я ознакомился с POSIX crontab, основными вариантами cron в популярных дистрибутивах Linux и устройством некоторых из них.


                      Используете Linux и запускаете задачи в cron? Вам интересна архитектура системных приложений в Unix? Тогда нам по пути!

                      Читать дальше →
                    • От копипасты к компонентам: переиспользуем код в разных приложениях



                        Badoo разрабатывает несколько приложений, и каждое из них — это отдельный продукт со своими особенностями, менеджментом, продуктовыми и инженерными командами. Но все мы работаем вместе, в одном офисе и решаем похожие проблемы.

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

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


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


                          Критика C — классический для нашей индустрии эпистолярный жанр. Она звучит то громче, то тише, но в последнее время буквально оглушает. Пример — перевод статьи Дэвида Чизнэлла «C — не низкоуровневый язык», опубликованный в нашем блоге некоторое время назад. Про C можно говорить разное, в дизайне языка действительно много неприятных ошибок, но отказывать C в «низкоуровневости» — это уже слишком!


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

                          Читать дальше →
                        • Как дебажить переменные окружения в Linux

                            Часто бывает так, что приходишь на машину и обнаруживаешь какой-то скрипт, запущенный под системным пользователем неделю назад. Кто его запустил? Где искать этот run.php? Или добавляешь запись в /etc/crontab, а скрипт там падает с ошибкой «command not found». Почему? И что делать? 

                            У меня есть ответы на эти вопросы.

                            Читать дальше →
                          • 21 сентября Badoo PHP Meetup #3: производительность

                              Всем привет!

                              Я Павел Мурзаков, тимлид серверной команды Badoo. Мы обожаем PHP, вкладываемся в его развитие и развитие сообщества вокруг него. 21 сентября планируем провести третий Badoo PHP Meetup. Приглашаем спикеров и гостей!

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

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

                              Регистрация по ссылке, начало в 12:00, гостей встречаем с 11:00. 
                              Читать дальше →
                              • +39
                              • 4,8k
                              • 7
                            • Дзен изолированных компонентов в Android-архитектуре

                              • Перевод


                              Несколько лет назад мы в Badoo начали использовать MVI-подход к Android-разработке. Он был призван упростить сложную кодовую базу и избежать проблемы некорректных состояний: в простых сценариях это легко, но чем сложнее система, тем сложнее поддерживать её в корректном виде и тем проще пропустить баг. 

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

                              Наш коллега Zsolt Kocsi (Medium, Twitter) из лондонского офиса рассказал, каким образом с помощью MVI мы строим независимые компоненты, которые легко переиспользовать, какие преимущества мы получаем и с какими недостатками нам пришлось столкнуться при использовании этого подхода.
                              Читать дальше →
                            • Мутационное тестирование в PHP: качественное измерение для code coverage

                                Как оценивать качество тестов? Многие полагаются на самый популярный показатель, известный всем, — code coverage. Но это количественная, а не качественная метрика. Она показывает, какой объём вашего кода покрыт тестами, но не то, как хорошо эти тесты написаны. 

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

                                На Badoo PHP Meetup в марте я рассказывал, как организовать мутационное тестирование для PHP-кода и с какими проблемами можно столкнуться. Видео доступно по ссылке, а за текстовой версией добро пожаловать под кат.


                                Читать дальше →
                              • Как отсеошить старые статьи, чтобы они резко выросли в органике: +104% трафика за полгода

                                  Как отсеошить старые статьи, чтобы они резко выросли в органике: +104% трафика за полгода


                                  Трафик в блог — это не только про новые статьи. Если блог активно живет более 2-3 лет, в нем накапливается контент, а это — резервы, которые можно поднять и заставить работать. Рассказываем, как мы выжали из старых статей +104% к посещаемости из поиска и сколько это стоило — без привлечения платного трафика.


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

                                  Читать дальше
                                • Как не потерять деньги в черном ящике: методы тестирования биллинга

                                    Проверка платных сервисов — один из ключевых инженерных вопросов в тестировании Badoo. Наше приложение интегрировано с 70 платёжными провайдерами в 250 странах мира, и баг хотя бы в одном из них может привести к непредсказуемым последствиям. 

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

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



                                    Читать дальше →
                                    • +37
                                    • 8,5k
                                    • 9
                                  • «Сгоревшие» сотрудники: есть ли выход?

                                      Ты работаешь в хорошей компании. Вокруг тебя крутые профессионалы, получаешь достойную зарплату, каждый день делаешь важные и нужные вещи. Илон Маск запускает спутники, Сергей Семёнович улучшает и без того лучший город Земли. Погода отличная, солнце светит, деревья цветут — живи да радуйся!

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

                                      Что же делать? Как работать с Игнатом? Добро пожаловать под кат!


                                      Читать дальше →