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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. Фиче флаги

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. Легаси

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  41. github.com/badoo/
    funcmap

    View Slide

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

    View Slide

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

    View Slide

  44. Выводы

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide