На этой неделе я завершил перевод 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%, страшно представить.
- Протестируйте руками! Автотесты необходимы, но они не гарантируют отсутствие ошибок. Перед финальным переключением интерпретатора сделайте полное ручное тестирование. Да, дорого. Но тестировать на пользователях – дороже.