Обновление Python в проекте

На этой неделе я завершил перевод Django-based проекта с Python 2.7 на Python 3.7. Это была наверное самая объемная и многоэтапная техническая задача за весь профессиональный опыт, поэтому выводы из этой задачи будет интересно сохранить на будущее.

Некоторые интересные цифры про процесс разработки.

  • Примерное количество Python-кода в проекте: >550k LOC.
  • Суммарное количество изменений в pullrequest-ах: >35k LOC.
  • Суммарное чистое время, понадобившееся на разработку: ~240h.
  • Количество потребовавшихся pullrequest-ов на код проекта: 13.
  • Количество задач на разработку, тестирование, раскладку: 17.
  • Покрытие кода тестами на момент начала разработки: >80%.
  • Суммарное чистое время, понадобившееся на тестирование: ~120h.
  • Количество найденных проблем ручным тестированием: 60.
  • Количество найденных проблем после релиза в продакшн: 8.

Некоторые интересные цифры про результаты.

  • Память на сервере больше не отъедается в python-аллокатор до конца. Теперь после нескольких часов работы объём памяти фиксируется примерно на одном уровне, и этот уровень в 2 раза меньше пиковых значений в старом варианте.
  • Время исполнения python-кода сократилось на 25%. Это видно как по тестовым сборкам (CI), так и в реальной нагрузке на продакшне.

Какие советы могу дать желающим провернуть что-то подобное.

  • Не бойтесь! Такая задача сложна только в смысле объема, но выполняя её по частям, плавно, поэтапно, её можно выполнить любой командой в любой ситуации.
  • Релизьте постепенно! Не допускайте единомоментных объемных и сложных изменений. Лучше выложить изменение за 10 PR-ов на 5к строк каждый и найти промежуточные проблемы, чем выложить разом 50к строк, которые разрабатывались в течение нескольких месяцев и собрать все проблемы разом.
  • Имейте тесты! Не стоит даже подходить к этой задаче, пока у вас нет тестов, или их покрытие небольшое. Например, в моей ситуации имея покрытие 80%, в ручные тесты проскочили >60 ошибок! Что бы было при покрытии в 50%, страшно представить.
  • Протестируйте руками! Автотесты необходимы, но они не гарантируют отсутствие ошибок. Перед финальным переключением интерпретатора сделайте полное ручное тестирование. Да, дорого. Но тестировать на пользователях – дороже.

Leave a Reply

Your email address will not be published.