Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Фиче флаги

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Легаси

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

github.com/badoo/ funcmap

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Выводы

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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