banner
Дом / Блог / Исправлено 2: следующая Мета
Блог

Исправлено 2: следующая Мета

Oct 16, 2023Oct 16, 2023

Python — один из самых популярных языков, используемых в Meta. Инженеры-технологи Meta (PE) — это специализированные инженеры-программисты (SWE), которые уделяют особое внимание надежности, эффективности и масштабируемости. Они работают над различными проектами, включая отладку производственных сервисов, переписывание неэффективных библиотек, организацию масштабного развертывания проектов или планирование мощностей. А Python часто является одним из первых инструментов, к которым обращаются PE, поскольку он предлагает быструю разработку, простой для чтения синтаксис и огромный набор библиотек с открытым исходным кодом.

Команда Meta's Python Language Foundation — гибридная команда, состоящая из PE и традиционных SWE — помогает владеть и поддерживать инфраструктуру и инструменты для Python в Meta. Команда поддерживает инженеров, специалистов по обработке данных, исследователей и всех остальных сотрудников Meta, использующих Python для выполнения своей работы.

Один из способов достижения этой цели — создание инструментов, которые позволяют разработчикам Python писать более качественный и надежный код и более эффективно. Сюда входят такие инструменты, как автоматическое форматирование и сортировка импорта, которые избавляют от утомительной работы, или линтеры, которые помогают инженерам создавать поддерживаемый код с меньшим количеством ошибок.

В этом году мы создавали новый линтер Fixit 2, разработанный с нуля, чтобы сделать разработчиков более эффективными и способными как в проектах с открытым исходным кодом, так и в разнообразном ландшафте нашего внутреннего монорепозитория. В Meta мы используем Fixit 2 с несколькими ранними пользователями и планируем вскоре распространить его на остальную часть нашего монорепозитория. Но любой разработчик может использовать его для более эффективного выполнения автоматического исправления и более быстрого улучшения своей собственной кодовой базы.

В экосистеме Python существует множество отличных линтеров, многие из которых имеют большое сообщество сторонних плагинов, предоставляющих разнообразный набор правил линта. Мы используем Flake8 внутри компании Meta с 2016 года, и он очень успешно помогает разработчикам уменьшать количество ошибок и поддерживать чистоту кодовой базы. Популярный плагин flake8-bugbear был даже создан Лукашом Лангой (автором Black, постоянным разработчиком PSF и менеджером по выпуску Python 3.8 и 3.9) во время работы в Meta (тогда Facebook) как дом для более самоуверенных правил lint. который мы могли бы использовать как внутри компании, так и поделиться с остальным сообществом разработчиков Python.

У нас также есть большое количество внутренних плагинов, созданных различными командами, и Flake8 позволяет им писать и включать собственные правила проверки непосредственно в базе кода, не получая разрешения от центрального привратника и не дожидаясь запуска нового развертывания Flake8. вне.

Но хотя Flake8 уже давно является краеугольным камнем нашего решения для ворса, у него также есть некоторые неровности. Написание новых правил проверки требует создания целых плагинов (каждый из которых претендует на часть «пространства имен» для кодов ошибок) и побуждает разработчиков создавать сложные плагины, охватывающие несколько классов ошибок. Когда эти ошибки проверки обнаружены, Flake8 может только указать номер строки и столбца, где она произошла, но не имеет возможности предложить изменения разработчику, просматривающему список результатов проверки, оставляя их в состоянии проб и ошибок, чтобы найти изменения, которые делают линтер счастливым. Кроме того, Flake8 использует модуль stdlib ast, что делает его неспособным анализировать будущие функции синтаксиса и вынуждает разработчиков ждать обновления инструментов, прежде чем они смогут использовать новую блестящую возможность.

Конечно, есть альтернативы Flake8, но многие из них имеют один или несколько недостатков:

Хотя некоторые из этих функций не являются критическими, наиболее важным для эффективности разработчика является предложение автоматических исправлений — автоматических предлагаемых изменений, которые удовлетворяют правилу проверки. Это избавляет от догадок при использовании линтера и позволяет пользователям быстро просматривать и принимать эти изменения, когда это возможно, устраняя необходимость повторного запуска линтера до тех пор, пока код не будет окончательно очищен. Сочетание этих автоматических исправлений с встроенными в репозиторий пользовательскими правилами проверки обеспечивает уровень индивидуальных улучшений качества кода, который трудно превзойти.

К сожалению, даже Fixit, линтер с автоматическим исправлением, который мы создали для Instagram и который был открыт с открытым исходным кодом, не поддерживал локальные правила линта или иерархическую конфигурацию — основные требования для нашего монорепозитория, в котором хранятся тысячи проектов, многие из которых сами являются проектами с открытым исходным кодом. со своими собственными потребностями в линтинге и CI. Мы получили много запросов от разработчиков на поддержку Fixit в нашем монорепозитории, но было достаточно препятствий, чтобы мы могли поддерживать только небольшой набор правил проверки безопасности, что уменьшало прямую выгоду для нашей кодовой базы Python.