Хабрахабр

[Перевод] Python 3 в Facebook

Всем привет!

Перед стартом каждого потока часто спрашивают какую версию мы используем в обучении (вообще обе и не только, как бы это странно не звучало, учитывая как называется курс, Python) и разные нюансы миграции с одной версии на другую. Запустили юбилейный пятый поток курса «Разработчик Python». Сегодня мы хотим поделиться статьёй об опыте миграцию с 2 на 3 в Facebook, которую рассказывали на PyConf.

Поехали.

В инфраструктуре многих крупных компаний, использующих Python, остаются большие блоки кода на Python 2. Переход на Python 3 стал значительно популярней за последние годы, но процесс еще далек от завершения. Джейсон Фрайд (Jason Fried) посетил PyCon 2018, чтобы рассказать об изменениях, произошедших в компании за последние 4 года — в самом начале Python 3 практически отсутствовал, но в итоге стал основной версией Python в компании. 7, и Facebook — не исключение. Джейсон помог достичь этой цели, и его доклад [видео на YouTube] — отличный источник идей для других организаций, которые хотят провести миграцию.

Чуть позже он понял, что стал основной движущей силой за переход на Python 3 в Facebook. Фрайд начал работать в Facebook в 2011 году и быстро понял, что нужно учить Python, если он хочет получать ревью кода быстрее. Это никогда не входило в его планы, и случилось само собой по мере его работы с Python.

В итоге, он прославился (“скорее приобрел дурную славу”) среди питонистов в Facebook, тем что фиксил код самостоятельно, не спрашивая разрешения, если видел, что язык используется неправильно. Фрайд начал с того, что стал принимать активное участие во внутренней группе Python, и часто оказывался первым, готовым ответить на возникающие вопросы. Со временем эти правки помогли укрепить авторитет Фрайда в сообществе Python Facebook, который пригодится ему в процессе миграции. Это возможно в Facebook, в связи с отсутствием вертикальной иерархии контроля; у всех есть столько же прав, чтобы откатить ваши изменения, сколько у вас, чтобы изначально эти изменения совершить.

Он хотел рассказать “историю о том, как я и пара других инженеров в свободное время и без каких-либо полномочий сделали Python 3 основной версией в Facebook”. По словам Фрайда, менять что-то вроде версии языка Python в масштабах Facebook требовало некоторого времени и огромного количества дипломатии.

3. В 2013 году в Facebook присутствовала зачаточная поддержка Python 3. Но эта задача была заблокирована поддержкой Python 3 в библиотеках Facebook, которая в свою очередь была заблокирована отсутствием поддержки Python 3 в системе сборки. Она появилась как часть задачи по добавлению поддержки Python 3 в систему сборки. Ситуация как из «Уловки-22»: Python 3 был “доступен”, но ничто в среде Facebook его не поддерживало.

Почти все думали, что компания просто останется на Python 2. Кроме того, в 2013 году Python 3 в Facebook был окружен негативными настроениями. Также велись разговоры о переходе на совершенно другой язык. 7 навсегда. Только один человек бросил вызов этому заявлению и предложил что-то с этим сделать; в тот момент Фрайд проигнорировал призыв к действию но продолжил думать об этой идее. Даже сам Фрайд говорил (во внутренней группе), что переход на Python 3 никогда не произойдет в Facebook.

Луч надежды

В январе 2013 года, используемому “линтеру” потребовались четыре импорта из __future__ (print_function, division, absolute_imports, andunicode_literals). Но, по словам Фрайда, надежда теплилась. Это, в итоге, упростило конвертирование модулей на Python 3. Изначально они появились с целью продлить жизнь кодовой базы Python 2, и были добавлены везде, чтобы линтер перестал ругаться.

И его исключительная совместимость с Python 2 стала основным блокером. В Facebook “повсеместно используется” фреймворк для сериализация и удаленных вызовов процедур Apache Thrift. Фрайд проголосовал именно за него, но еще не потому что хотел заниматься продвижением Python 3; он просто посчитал, что интерфейс Python 2 похож на что-то из Java, и поэтому требует рефакторинга. Но в опросе на тему потенциально интересных нововведений, проведенном группой Trift в Facebook, популярным вариантом оказалось добавление поддержки Python 3.

Фрайд всегда был фанатом асинхронного программирования на Python, но считал его фрагментированным из-за различий между фреймворками (например, Twisted, gevent), которые его предоставляли. Его мыслительный процесс стал меняться после лекции Гвидо ван Россум (Guido van Rossum) в Yelp, Сан-Франциско на тему “Tulip”, который оказался модулем asyncio. Лекция еще не успела закончиться, а Фрайд уже общался с командой Trift Facebook, предлагая внедрить поддержку Tulip для Python 3 вместого того, чтобы ждать порта Twisted, gevent и других. Tulip выглядел так, будто может сделать асинхронный ввод-вывод интероперабельным. Через несколько дней Trift опубликовали роудмап, показывающий предстоящую поддержку Python 3 и Tulip.

Это произошло в начале 2014 года, но ничего не менялось еще в течение шести месяцев; пользователи не появились и не планировали это делать, на самом деле, они и не знали ни о каких изменениях.

Новый проект

Изначально для этих целей он планировал использовать Python 2 и gevent, но затем понял, что к моменту завершения работы оно уже устареет. В августе 2014 года, Фрайд начал проект по переписыванию унаследованного сервиса. “Именно вы должны стать этим человеком для Python 3 в вашей организации”. Кто-то должен быть первым, чтобы произошли изменения; для Facebook и Python 3 это был именно Фрайд.

Система сборки даже не могла собрать его код, а все сторонние пакеты wheel были доступны только для Python 2. Итак, он начала свой проект, используя Python 3 и “все было сломано”; неудивительно, что никто не пользовался Python 3. А когда он все-таки починил достаточно вещей, чтобы собрать свой сервис, тот мгновенно падал на запуске — из-за чего-то глубоко в коде, что настраивало точки входа в системе Facebook.

Однако, каждый день кто-нибудь коммитил в его зависимости изменения только для Python 2. Поэтому, чтобы заставить код работать, Фрайд был вынужден починить все остальное; Он пересобрал сотни сторонних wheel’ов, чтобы они работали с обеими версиями Python, обновил все внутренние библиотеки, чтобы сделать их совместимыми с 2/3. Единственное решение — принудительно ввести соответствие требованиям Python 3 внутри организации, но в Facebook подобное невозможно. Неудивительно, Фрайд устал фиксить регрессии. Однако, если начать себя вести так, будто у тебя есть на это полномочия, люди начнут верить, что они у тебя действительно есть.

С учетом наличия PEP 8, он обосновал добавление нового тем, что тот будет решать другую категорию проблем кода; плюс, в Pyflakes было меньше ложных срабатываний, поэтому он меньше раздражал разработчиков. Фрайд, используя свое социальное влияние, добавил линтер Pyflakes в процесс сборки. Это помогло распределить работу по соблюдению совместимости с Python 3 между всеми разработчиками, что позволило достичь прогресса в проекте Фрайда. Фрайд настроил все так, чтобы Pyflakes запускался на всем коде, отправленном на ревью, сначала для Python 2, а затем Python 3.

Если бы разработчики поверили, что переход к Python 3 слишком сложен, они бы вернулись к мысли “останемся с Python 2 навсегда”. Сначала ему приходилось объяснять людям, что линтер не поломан, и есть смысл доработать код до совместимости с Python 3. “Заткнуть линтер”, а значит и самого Фрайда, стало проще, чем жаловаться на необходимость править код, поэтому все так и поступили. Силами Фрайда, сделать код совместимым с Python 3 стало гораздо проще.

Обучение

Фрайд присоединился к команде, которая преподавала Python новым сотрудникам. Все это помогло остановить “кровотечение”, но не помогло достичь заметного прогресса по внедрению Python 3 в Facebook. В который раз Фрайд взял ситуацию в свои руки: чтобы сделать это заявление, в 2015 году он поменял слайды в классе Python для новых сотрудников. Линтеры уже выдавали ошибки, когда код не был совместим с 2 или 3, но Фрайд хотел достичь точки, где код, совместимый с 2/3, писался только для легаси проектов, а новый код писался только на Python 3. Он объяснил новичкам, что все это должно работать внутри инфраструктуры Facebook и систем сборки, а если это было невозможно, нужно было отправить баг, или починить все самостоятельно. Идея заключалась в том, что в какой-то неизвестный момент в будущем, Facebook захочет переключиться на Python 3, поэтому нет смысла писать код для Python 2 — когда-нибудь его придется переписать. “Как ни странно, это сработало”.

Он потратил остаток года, рассказывая людям о его успешности и о необходимости переключиться на Python 3. В январе 2015 года Фрайд “наконец выпустил” свой проект. В течение года появились новые союзники в переходе на Python 3 в Facebook.

В 2016 году Ланга сформировал в Facebook новую команду, ответственную за контролем Python, которую назвали “Министерство Глупых Походок”. Одним из них был Лука Ланга (Łukasz Langa), который “как-то убедил Instagram перейти на Python 3”. Так как они были “командой Python”, “фиктивный авторитет”, упомянутый выше, сработал; люди считали, что они могут принимать решения насчет Python в Facebook.

О нем говорили на собраниях, использовали в новых проектах. В 2016 году наблюдался медленный, но стабильный рост использования Python 3 в компании. В мае 2016 года Фрайд сообщил о своем намерении переключить систему сборки на Python 3 по умолчанию. Мнение менялось, хоть Python 3 все еще не считался версием по умолчанию, и проекты добровольно выбирали его использование. Идея была всецело поддержана, поэтому через несколько дней переключение было проведено — без негативных последствий.

Разработчики просто запустили 2to3 в коде и исправили все моменты, на которые он ругался. В конце 2016 года команда проекта выпустила отчет с результатами переключения на Python 3. Это указало на миф, с которым Фрайд часто сталкивался: Python 3 медленнее, чем Python 2. Когда запустили полученный код, обнаружилось, что он на 40% быстрее и использует только половину памяти. Это могло быть правдой для ранних версий Python 3, но сейчас это не актуально.

Обновление версии Python оказалось не таким страшным процессом и открыло возможность использовать новые функции. Хорошие вещи

В начале 2017 года Instagram завершил миграцию на Python 3 и Facebook пожинал плоды “славного будущего, где можно радоваться хорошим вещам”. “Python в Facebook снова стал веселым”. Разработчики Facebook теперь могут сконцентрироваться на таких проблемах, как новые функции статической типизации или миграция сервисов для использования asyncio.

Когда появляются регрессии в поддержке Python 2 библиотек или модулей, разработчики часто спрашивают, можно ли им просто перейти на Python 3. Новая проблема — люди спрашивают, когда можно отказаться от поддержки Python 2. “О, как прекрасен мир, в котором я живу”. Проблема противоположна той, что была несколько лет назад.

В момент перехода к Python 3, в середине 2016 года, 4% всех точек уже были Python 3. Во время лекции Фрайд показал график точек входа в Python сервиса Facebook, начиная с Q3 2015 года — на тот момент в общей сложности было всего 4 точки Python 3. По словам Фрайда, в компании теперь стыдно писать код, который работает только на Python 2. В марте 2018 года их количество перевалило за 50%; в середине мая, на момент лекции, их было 55% “из десятков тысяч точек входа Facebook”.

Он отметил, что необходимо сделать больше, чем просто создать что-то новое; нужно вести к этому разработчиков, “будучи тем изменением, которое вы хотите увидеть”. Затем Фрайд проанализировал процесс. В этом содействуют линтеры и юнит-тесты. Нужно привлекать людей, даже если они не будут понимать, что помогают. Когда вы достигните результата, отпразднуйте, наслаждаясь “хорошими вещами”: напишите “классный код на Python 3”. Очень важно учить новых сотрудников тому, к чему вы стремитесь. Видя, как новые функции могут быть использованы, остальные тоже захотят перейти.

Один вопрос был посвящен тому, как провести такое изменение в более традиционной, иерархической организации. Фрайд ответил на несколько вопросов из аудитории. Но с другой стороны, это может быть сложнее, если культура компании консервативна. Фрайд предположил, что это может быть даже проще, так как не нужно убеждать тысячи разработчиков, а лишь цепочку менеджеров, начиная с того, кто видит преимущества перехода. Другой вопрос касался неделимого кода, который не разбит на множество входных точек. Здесь поможет фокусирование на улучшении качества кода. Для такой ситуации Фрайд предложил посмотреть презентацию Instagram (видео на YouTube) с PyCon 2017.

Компаниям, планирующим подобный переход, понадобится такой человек как Фрайд. Другие организации могут многое почерпнуть из этой лекции, но ясно, что важно иметь упорного сторонника, готового контролировать и координировать весь процесс.

THE END

Ждём вопрос и комментарии, которые можно оставить тут или задать напрямую Стасу на его открытом уроке.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»