Python 3 en Facebook

Hola a todos!

Lanzamos la transmisión del quinto aniversario del curso Python Developer . Antes del comienzo de cada hilo, a menudo preguntan qué versión usamos en el entrenamiento (generalmente ambos y no solo, no importa cuán extraño suene, dado el nombre del curso, Python) y los diferentes matices de migración de una versión a otra. Hoy queremos compartir un artículo sobre la experiencia de migrar de 2 a 3 en Facebook, que se contó en PyConf.

Vamos

La transición a Python 3 se ha vuelto mucho más popular en los últimos años, pero el proceso aún está lejos de completarse. La infraestructura de muchas grandes empresas que usan Python deja grandes bloques de código en Python 2.7, y Facebook no es una excepción. Jason Fried visitó PyCon 2018 para hablar sobre los cambios que han ocurrido en la compañía en los últimos 4 años: al comienzo de Python 3 estaba prácticamente ausente, pero al final se convirtió en la versión principal de Python en la compañía. Jason ayudó a lograr este objetivo, y su charla [video de YouTube] es una gran fuente de ideas para otras organizaciones que desean migrar.

Fraid se unió a Facebook en 2011 y rápidamente se dio cuenta de que necesitaba aprender Python si quería obtener revisiones de código más rápido. Un poco más tarde, se dio cuenta de que se había convertido en la principal fuerza impulsora detrás de la transición a Python 3 en Facebook. Esto nunca fue parte de sus planes, y sucedió, por supuesto, mientras trabajaba con Python.



Fraid comenzó tomando una parte activa en el grupo interno de Python, y a menudo resultó ser el primero en responder preguntas. Como resultado, se hizo famoso ("ganó notoriedad") entre los pitonistas en Facebook, al arreglar el código él mismo, sin pedir permiso, si veía que el lenguaje se usaba incorrectamente. Esto es posible en Facebook, debido a la falta de una jerarquía vertical de control; todo el mundo tiene tantos derechos para revertir sus cambios como usted tiene que hacer estos cambios inicialmente. Con el tiempo, estas ediciones han ayudado a fortalecer la credibilidad de Freud en la comunidad de Python en Facebook, lo que será útil durante el proceso de migración.

Según Freud, cambiar algo así como una versión de Facebook del lenguaje Python tomó algo de tiempo y mucha diplomacia. Quería contar "la historia de cómo yo y un par de otros ingenieros en mi tiempo libre y sin ninguna autoridad hicimos de Python 3 la versión principal en Facebook".

En 2013, hubo soporte rudimentario para Python 3.3 en Facebook. Apareció como parte de la tarea de agregar compatibilidad con Python 3 al sistema de compilación. Pero esta tarea fue bloqueada por el soporte de Python 3 en las bibliotecas de Facebook, que a su vez fue bloqueada por la falta de soporte de Python 3 en el sistema de compilación. La situación es similar a la del Truco 22 : Python 3 estaba "disponible", pero nada en el entorno de Facebook lo soportaba.

Además, en 2013, Python 3 en Facebook estuvo rodeado de sentimientos negativos. Casi todos pensaron que la compañía se quedaría en Python 2.7 para siempre. También se habló de cambiar a un idioma completamente diferente. Incluso el propio Fraid dijo (en un grupo interno) que la transición a Python 3 nunca sucederá en Facebook. Solo una persona cuestionó esta declaración y se ofreció a hacer algo al respecto; En ese momento, Freide ignoró el llamado a la acción, pero continuó pensando en esta idea.

Rayo de esperanza

Pero, según Freud, la esperanza era cálida. En enero de 2013, el linter utilizó cuatro importaciones de __future__ (print_function, division, absolute_imports, andunicode_literals) . Inicialmente, parecían extender la vida útil de la base de código de Python 2, y se agregaron en todas partes para que el linter dejara de maldecir. Esto finalmente simplificó la conversión de módulos a Python 3.

Facebook usa el marco omnipresente para serializar y llamar de forma remota las rutinas Apache Thrift . Y su compatibilidad excepcional con Python 2 se ha convertido en un importante bloqueador. Pero en una encuesta sobre innovaciones potencialmente interesantes de Thrift en Facebook, agregar soporte para Python 3 resultó ser una opción popular. Fraid votó por él, pero aún no porque quería promocionar Python 3; simplemente sintió que la interfaz de Python 2 era similar a algo de Java y, por lo tanto, requería una refactorización.

Su proceso de pensamiento comenzó a cambiar después de una conferencia de Guido van Rossum en Yelp, San Francisco, sobre el tema "Tulipán", que resultó ser un módulo asincio . Fride siempre ha sido fanático de la programación asincrónica de Python, pero lo consideró fragmentado debido a las diferencias entre los marcos (por ejemplo, Twisted , gevent ) que lo proporcionaban. Tulip parecía que podía hacer que la E / S asincrónica fuera interoperable. La conferencia aún no había terminado, y Fraid ya había hablado con el equipo de Thrift en Facebook, ofreciéndole implementar el soporte de Tulip para Python 3 para esperar el puerto de Twisted, gevent y otros. Unos días después, Trift publicó una hoja de ruta que muestra el próximo soporte para Python 3 y Tulip.

Esto sucedió a principios de 2014, pero nada ha cambiado durante otros seis meses; los usuarios no aparecieron y no planearon hacer esto, de hecho, no sabían sobre ningún cambio.

Nuevo proyecto

En agosto de 2014, el viernes lanzó un proyecto para reescribir un servicio heredado. Inicialmente, para este propósito, planeó usar Python 2 y gevent, pero luego se dio cuenta de que cuando terminó, ya estaba desactualizado. Alguien debe ser el primero en hacer un cambio; para Facebook y Python 3, fue precisamente Fraid. "Es usted quien debe convertirse en esta persona para Python 3 en su organización".

Entonces, comenzó su proyecto usando Python 3 y "todo estaba roto"; no es sorprendente que nadie haya usado Python 3. El sistema de compilación ni siquiera pudo compilar su código, y todos los paquetes de ruedas de terceros estaban disponibles solo para Python 2. Y cuando reparó lo suficiente para ensamblar su servicio, se bloqueó instantáneamente al inicio - debido a algo profundo en el código que configura los puntos de entrada en el sistema de Facebook.

Por lo tanto, para que el código funcione, Fraid se vio obligado a arreglar todo lo demás; Reconstruyó cientos de ruedas de terceros para trabajar con ambas versiones de Python, actualizó todas las bibliotecas internas para hacerlas compatibles con 2/3. Sin embargo, todos los días alguien cometía cambios en Python 2 solo en su dependencia. No es de extrañar que Fraid estuviera cansado de arreglar regresiones. La única solución es forzar el cumplimiento de Python 3 internamente, pero esto no es posible en Facebook. Sin embargo, si comienzas a actuar como si tuvieras la autoridad para hacerlo, la gente comenzará a creer que realmente los tienes.

Fraid, utilizando su influencia social, agregó el linter Pyflakes al proceso de construcción. Dada la presencia de PEP 8 , justificó agregar uno nuevo para resolver una categoría diferente de problemas de código; Además, Pyflakes tenía menos falsos positivos, por lo que era menos molesto para los desarrolladores. Fraid configuró todo para que Pyflakes ejecutara todo el código enviado para su revisión, primero para Python 2 y luego para Python 3. Esto ayudó a distribuir el trabajo de mantener la compatibilidad con Python 3 entre todos los desarrolladores, lo que permitió lograr avances en el proyecto Freud.

Al principio, tenía que explicarle a la gente que el linter no estaba roto, y tiene sentido modificar el código para que sea compatible con Python 3. Si los desarrolladores creían que la transición a Python 3 era demasiado complicada, volverían a la idea de "quedarse con Python 2 para siempre". Con Freud, hacer que el código sea compatible con Python 3 se ha vuelto mucho más fácil. "Cerrar el linter" y, por lo tanto, del propio Freud, se ha vuelto más fácil que quejarse de la necesidad de editar el código, razón por la cual todos lo hicieron.

Entrenamiento

Todo esto ayudó a detener el "sangrado", pero no ayudó a hacer ningún progreso significativo en la introducción de Python 3 en Facebook. Friday se unió al equipo que enseñó Python a los nuevos empleados. Linters ya arrojó errores cuando el código no era compatible con 2 o 3, pero Fraid quería llegar al punto donde el código compatible con 2/3 se escribió solo para proyectos heredados, y el nuevo código se escribió solo en Python 3. Una vez más, Fraid tomó la situación en sus propias manos: para hacer esta declaración, en 2015 cambió las diapositivas en la clase Python para nuevos empleados. La idea era que en algún momento desconocido en el futuro, Facebook querría cambiar a Python 3, por lo que no tiene sentido escribir código para Python 2; algún día tendrá que reescribirse. Explicó a los principiantes que todo esto debería funcionar dentro de la infraestructura de Facebook y los sistemas de compilación, y si esto no fuera posible, tenía que enviar un error o solucionarlo usted mismo. "Por extraño que parezca, funcionó".

En enero de 2015, Fraid "finalmente lanzó" su proyecto. Pasó el resto del año contándole a la gente sobre su éxito y la necesidad de cambiar a Python 3. A lo largo del año, aparecieron nuevos aliados en la transición a Python 3 en Facebook.



Uno de ellos fue ukasz Langa, quien "de alguna manera convenció a Instagram de cambiar a Python 3". En 2016, Langa formó un nuevo equipo de control de Facebook en Facebook, llamado el "Departamento de Marcha Estúpida" . Como eran el "equipo de Python", la "autoridad ficticia" mencionada anteriormente funcionó; la gente pensó que podía tomar decisiones sobre Python en Facebook.

En 2016, hubo un aumento lento pero constante en el uso de Python 3 en la empresa. Hablaron de él en las reuniones, utilizado en nuevos proyectos. La opinión estaba cambiando, aunque Python 3 todavía no se consideraba la versión predeterminada, y los proyectos eligieron voluntariamente usarla. En mayo de 2016, el viernes anunció su intención de cambiar el sistema de compilación a Python 3 de forma predeterminada. La idea era totalmente compatible, por lo que pocos días después se realizó el cambio, sin consecuencias negativas.

A finales de 2016, el equipo del proyecto lanzó un informe con los resultados del cambio a Python 3. Los desarrolladores simplemente lanzaron 2to3 en el código y arreglaron todos los puntos que juró. Cuando se lanzó el código recibido, se descubrió que es un 40% más rápido y usa solo la mitad de la memoria. Esto apuntó a un mito que el viernes encontró a menudo: Python 3 es más lento que Python 2. Esto podría ser cierto para versiones anteriores de Python 3, pero en este momento no es relevante.

Cosas buenas

A principios de 2017, Instagram completó la migración a Python 3 y Facebook estaba cosechando las recompensas de un "futuro glorioso donde puedes disfrutar de cosas buenas". Actualizar la versión de Python no fue un proceso tan aterrador y abrió la posibilidad de usar nuevas funciones. Los desarrolladores de Facebook ahora pueden centrarse en problemas como las nuevas características de escritura estática o la migración de servicios para usar asyncio. "Python en Facebook es divertido de nuevo".

Un nuevo problema: las personas preguntan cuándo es posible rechazar el soporte para Python 2. Cuando aparecen regresiones en soporte de bibliotecas o módulos de Python 2, los desarrolladores a menudo preguntan si simplemente pueden cambiar a Python 3. El problema es lo contrario de lo que era hace unos años. "Oh, qué maravilloso el mundo en el que vivo".

Durante la conferencia, Freide mostró un gráfico de los puntos de entrada de Facebook para el servicio de Python a partir del tercer trimestre de 2015, en ese momento solo había 4 puntos de Python 3. En el momento de la transición a Python 3, a mediados de 2016, el 4% de todos los puntos ya estaban Python 3. En marzo de 2018, su número superó el 50%; a mediados de mayo, en el momento de la conferencia, había un 55% de "decenas de miles de puntos de entrada en Facebook". Según Freud, la compañía ahora está avergonzada de escribir código que solo se ejecuta en Python 2.

Luego, el viernes analizó el proceso. Señaló que hay que hacer más que simplemente crear algo nuevo; debe llevar a los desarrolladores a esto, "siendo el cambio que desea ver". Necesitamos atraer personas, incluso si no entienden que ayudan. Esto es facilitado por linter y pruebas unitarias. Es muy importante enseñar a los nuevos empleados por lo que se esfuerzan. Cuando obtenga el resultado, celebre mientras disfruta de las "cosas buenas": escriba "código genial de Python 3". Al ver cómo se pueden usar las nuevas funciones, otras también querrán cambiar.

El viernes respondió algunas preguntas de la audiencia. Una pregunta era sobre cómo hacer un cambio de este tipo en una organización jerárquica más tradicional. El viernes sugirió que podría ser aún más fácil, ya que no necesita convencer a miles de desarrolladores, sino solo una cadena de gerentes, comenzando por el que ve los beneficios de la transición. Pero, por otro lado, puede ser más difícil si la cultura de la empresa es conservadora. Centrarse en mejorar la calidad del código ayudará aquí. Otra pregunta se refería al código indivisible, que no se divide en muchos puntos de entrada. Para esta situación, el viernes sugirió ver la presentación de Instagram (video en YouTube) con PyCon 2017.

Otras organizaciones pueden aprender mucho de esta conferencia, pero está claro que es importante contar con un obstinado defensor que esté listo para controlar y coordinar todo el proceso. Las compañías que planean tal transición necesitarán un hombre como Fraid.

El fin

Estamos esperando una pregunta y comentarios que puedes dejar aquí o preguntarle a Stas directamente en su lección abierta .

Source: https://habr.com/ru/post/es425233/


All Articles