Upgrade to Pro — share decks privately, control downloads, hide ads and more …

«Мёртвый код: найти и обезвредить» — Данил Мухаметзянов, Badoo

De18318c9ff86ea93435effe50a43c4b?s=47 Badoo Tech
February 15, 2020

«Мёртвый код: найти и обезвредить» — Данил Мухаметзянов, Badoo

Очередная встреча сообщества PHP-разработчиков в офисе Badoo.

Главная проблема легаси, которую мы решаем, — это то, что инженеры бесполезно тратят время на чтение мёртвого кода.

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

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

— как заботимся об удалении завершенных А/Б тестов
— контролируем все доступные версии клиентов
— поддерживаем чистоту API
— автоматически находим мертвый код и информируем об этом разработчиков

De18318c9ff86ea93435effe50a43c4b?s=128

Badoo Tech

February 15, 2020
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

  1. Данил Мухаметзянов· 15 февраля КАК МЫ ЧИСТИМ КОД

  2. Цифры 41k файлов 36k классов 277k методов 5.7m логических строк

  3. “Высокооплачиваемые инженеры постоянно читают мертвый код”

  4. Каковы источники?

  5. 1. Процессные • A/B тестирование • Многообразие клиентов • Фиче

    флаги 2. Исторические • Легаси Источники
  6. Процессные источники

  7. A/B Тестирование

  8. • Все продуктовые идеи проходят процедуру тестирования • 200 активных

    тестов • 2000 завершившихся тестов Процессные источники A/B Тестирование
  9. A/B тестирование порождает мертвый код

  10. Задачи на удаление ставятся автоматически

  11. None
  12. Тест всегда имеет дату окончания

  13. Многообразие клиентов

  14. • 4 бренда • 3 платформы • Недельный цикл Многообразие

    клиентов Процессные источники
  15. Старые версии клиентов порождают мертвый код

  16. Сервер может отстреливать старые версии

  17. Выключайте мертвые платформы

  18. Фиче флаги

  19. Клиент Сервер Я поддерживаю фотосообщения Спасибо, буду иметь ввиду 600

    Minor features Процессные источники: Фиче флаги
  20. Клиент Сервер Я поддерживаю видеостримиг. Включить? Спасибо.
 Да / Нет

    300 Application features Процессные источники: Фиче флаги
  21. Фиче флаги порождают мертвый код

  22. Процессные источники: Фиче флаги

  23. • -150 Minor features • -70 Application features Фиче флаги

    -24% Процессные источники
  24. Исторические источники

  25. Легаси

  26. Идея PHP код Источники: Легаси

  27. Идея PHP код Вызываемый код Источники: Легаси

  28. Идея PHP код Вызываемый код Мертвый код Источники: Легаси

  29. Файлы PHP код get_included_files() opcache_get_status(t rue) find . -name '*.php'

    Источники: Легаси
  30. Файлы загружаются, но многое не используется

  31. Методы PHP код ? nikic/PHP-Parser Источники: Легаси

  32. Методы PHP код xhprof nikic/PHP-Parser Источники: Легаси

  33. Недостатки xhprof • Требует изменения php кода • Дублирование данных

    • Человеческий фактор • Сложность изменения Источники: Легаси
  34. Методы: требования • Минимальные накладные расходы • Не требует изменения

    php кода • Работает везде (fpm / cli) • Обрабатывает форки • Сэмплирование из коробки • Форсирование из кода Источники: Легаси
  35. Методы: требования • Минимальные накладные расходы • Не требует изменения

    php кода • Работает везде (fpm / cli) • Обрабатывает форки • Сэмплирование из коробки • Форсирование из кода funcmap.so Источники: Легаси
  36. Принцип работы • RINIT • выставляем флаг сбора данных •

    создаем HashTable • инициализируем таймер • MSHUTDOWN • пишем данные из HashTable • Подменяем zend_execute_ex Источники: Легаси
  37. Конфигурация enabled = 1 logfile = /local/logs/funcmap/data_%pid%.log probability = 0

    ..100 flush_interval_sec = 200 funcmap_enabled(bool $flag) Источники: Легаси
  38. Накладные расходы time rps 25% 50% 100% Источники: Легаси

  39. Ложный результат • Увеличить вероятность • Обработка ошибок • Дополнительная

    валидация • Ручное маркирование Источники: Легаси
  40. Альтернативы krakjoe/tombs • Отсутствие семплирования • Разделяемая память • Плохо

    учтена работа в cli • Сложность постобработки Источники: Легаси
  41. github.com/badoo/ funcmap

  42. Источники: Легаси

  43. Источники: Легаси

  44. Выводы

  45. • Продумайте флоу удаления a/b тестов • Контролируйте устаревания нативных

    клиентов • Чистота API ведет к упрощению кода • Можно автоматизировать процесс поиска мертвого кода Выводы
  46. • github.com/badoo/funcmap • Highload: Как мы поддерживаем 100 разных версий

    клиентов в Badoo / Ярослав Голуб • Habr: Как устроено сплит-тестирование в Badoo • Tombs by Joe Watkins Ссылки
  47. tech.badoo.com/ru/ СПАСИБО!