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

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

Badoo Tech
February 15, 2020

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

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

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

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

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

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

Badoo Tech

February 15, 2020
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. Процессные источники

    View full-size slide

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

    View full-size slide

  8. • Все продуктовые идеи проходят процедуру тестирования
    • 200 активных тестов
    • 2000 завершившихся тестов
    Процессные источники
    A/B Тестирование

    View full-size slide

  9. A/B тестирование
    порождает мертвый код

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. Фиче флаги

    View full-size slide

  18. Клиент Сервер
    Я поддерживаю
    фотосообщения
    Спасибо,
    буду иметь ввиду
    600 Minor features
    Процессные источники: Фиче флаги

    View full-size slide

  19. Клиент Сервер
    Я поддерживаю
    видеостримиг. Включить?
    Спасибо.

    Да / Нет
    300 Application features
    Процессные источники: Фиче флаги

    View full-size slide

  20. Фиче флаги порождают
    мертвый код

    View full-size slide

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

    View full-size slide

  22. • -150 Minor features
    • -70 Application features
    Фиче флаги
    -24%
    Процессные источники

    View full-size slide

  23. Исторические источники

    View full-size slide

  24. Легаси

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. Файлы
    PHP код
    get_included_files()
    opcache_get_status(t
    rue)
    find . -name '*.php'
    Источники: Легаси

    View full-size slide

  29. Файлы загружаются, но
    многое не используется

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. Принцип работы
    • RINIT
    • выставляем флаг сбора данных
    • создаем HashTable
    • инициализируем таймер
    • MSHUTDOWN
    • пишем данные из HashTable
    • Подменяем zend_execute_ex
    Источники: Легаси

    View full-size slide

  36. Конфигурация
    enabled = 1
    logfile = /local/logs/funcmap/data_%pid%.log
    probability = 0 ..100
    flush_interval_sec = 200
    funcmap_enabled(bool $flag)
    Источники: Легаси

    View full-size slide

  37. Накладные расходы
    time
    rps
    25% 50% 100%
    Источники: Легаси

    View full-size slide

  38. Ложный результат
    • Увеличить вероятность
    • Обработка ошибок
    • Дополнительная валидация
    • Ручное маркирование
    Источники: Легаси

    View full-size slide

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

    View full-size slide

  40. github.com/badoo/
    funcmap

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  43. Выводы

    View full-size slide

  44. • Продумайте флоу удаления a/b тестов
    • Контролируйте устаревания нативных клиентов
    • Чистота API ведет к упрощению кода
    • Можно автоматизировать процесс поиска мертвого кода
    Выводы

    View full-size slide

  45. • github.com/badoo/funcmap
    • Highload: Как мы поддерживаем 100 разных версий
    клиентов в Badoo / Ярослав Голуб
    • Habr: Как устроено сплит-тестирование в Badoo
    • Tombs by Joe Watkins
    Ссылки

    View full-size slide

  46. tech.badoo.com/ru/
    СПАСИБО!

    View full-size slide