Python 3 di Facebook

Halo semuanya!

Kami meluncurkan aliran ulang tahun kelima dari kursus Pengembang Python . Sebelum memulai setiap utas, mereka sering bertanya versi mana yang kami gunakan dalam pelatihan (umumnya keduanya dan tidak hanya, tidak peduli seberapa aneh kedengarannya, diberi nama kursus, Python) dan perbedaan nuansa migrasi dari satu versi ke versi lainnya. Hari ini kami ingin berbagi artikel tentang pengalaman bermigrasi dari 2 ke 3 di Facebook, yang diceritakan di PyConf.

Ayo pergi.

Transisi ke Python 3 telah menjadi jauh lebih populer dalam beberapa tahun terakhir, tetapi prosesnya masih jauh dari selesai. Infrastruktur banyak perusahaan besar yang menggunakan Python meninggalkan banyak kode dalam Python 2.7, dan Facebook tidak terkecuali. Jason Fried mengunjungi PyCon 2018 untuk berbicara tentang perubahan yang telah terjadi di perusahaan selama 4 tahun terakhir - pada awal Python 3 praktis tidak ada, tetapi pada akhirnya itu menjadi versi utama Python di perusahaan. Jason membantu mencapai tujuan ini, dan ceramahnya [video YouTube] adalah sumber ide bagus untuk organisasi lain yang ingin bermigrasi.

Fraid bergabung dengan Facebook pada 2011 dan dengan cepat menyadari bahwa dia perlu belajar Python jika dia ingin mendapatkan ulasan kode lebih cepat. Beberapa saat kemudian, ia menyadari bahwa ia telah menjadi kekuatan pendorong utama di balik transisi ke Python 3 di Facebook. Ini tidak pernah menjadi bagian dari rencananya, dan itu terjadi tentu saja ketika dia bekerja dengan Python.



Ketakutan dimulai dengan mengambil bagian aktif dalam grup Python internal, dan sering kali menjadi yang pertama menjawab pertanyaan. Akibatnya, ia menjadi terkenal (โ€œagak mendapat ketenaranโ€) di antara para pythonis di Facebook, dengan memperbaiki kode sendiri, tanpa meminta izin, jika ia melihat bahwa bahasa tersebut digunakan secara tidak benar. Ini dimungkinkan di Facebook, karena kurangnya hierarki kontrol vertikal; setiap orang memiliki banyak hak untuk mengembalikan perubahan Anda karena Anda harus membuat perubahan ini pada awalnya. Seiring waktu, suntingan ini telah membantu memperkuat kredibilitas Freud di komunitas Facebook Python, yang akan berguna selama proses migrasi.

Menurut Freud, mengubah sesuatu seperti versi bahasa Python di Facebook membutuhkan waktu dan banyak diplomasi. Dia ingin menceritakan "kisah tentang bagaimana saya dan beberapa insinyur lain di waktu senggang saya dan tanpa otoritas membuat Python 3 versi utama di Facebook."

Pada 2013, ada dukungan dasar untuk Python 3.3 di Facebook. Itu muncul sebagai bagian dari tugas menambahkan dukungan Python 3 ke sistem build. Tapi tugas ini diblokir oleh dukungan Python 3 di perpustakaan Facebook, yang pada gilirannya diblokir oleh kurangnya dukungan Python 3 dalam sistem build. Situasinya seperti dari Trick-22 : Python 3 "tersedia", tetapi tidak ada di lingkungan Facebook yang mendukungnya.

Selain itu, pada 2013, Python 3 di Facebook dikelilingi oleh sentimen negatif. Hampir semua orang mengira perusahaan hanya akan tetap menggunakan Python 2.7 selamanya. Ada juga pembicaraan tentang beralih ke bahasa yang sama sekali berbeda. Bahkan Fraid sendiri mengatakan (dalam grup internal) bahwa transisi ke Python 3 tidak akan pernah terjadi di Facebook. Hanya satu orang yang menentang pernyataan ini dan menawarkan untuk melakukan sesuatu tentangnya; pada saat itu, Freide mengabaikan ajakan untuk bertindak tetapi terus memikirkan gagasan ini.

Secercah harapan

Tapi, menurut Freud, harapan itu hangat. Pada Januari 2013, linter menggunakan empat impor dari __future__ (print_function, division, absolute_imports, andunicode_literals) . Awalnya, mereka tampaknya memperpanjang umur basis kode Python 2, dan ditambahkan di mana-mana sehingga linter berhenti mengutuk. Ini pada akhirnya menyederhanakan konversi modul ke Python 3.

Facebook menggunakan kerangka kerja yang ada di mana-mana untuk membuat cerita bersambung dan memanggil rutinitas Apache Thrift dari jarak jauh. Dan kompatibilitasnya yang luar biasa dengan Python 2 telah menjadi pemblokir utama. Namun dalam jajak pendapat tentang inovasi yang berpotensi menarik oleh Thrift di Facebook, menambahkan dukungan untuk Python 3 ternyata menjadi pilihan yang populer.Takut memilihnya, tetapi belum karena ia ingin mempromosikan Python 3; dia hanya merasa bahwa antarmuka Python 2 mirip dengan sesuatu dari Jawa, dan karena itu diperlukan refactoring.

Proses pemikirannya mulai berubah setelah ceramah oleh Guido van Rossum di Yelp, San Francisco tentang topik "Tulip," yang ternyata menjadi modul asyncio . Fride selalu menjadi penggemar pemrograman Python asinkron, tetapi menganggapnya terfragmentasi karena perbedaan antara kerangka kerja (mis. Twisted , gevent ) yang menyediakannya. Tulip tampak seolah-olah bisa membuat I / O yang tidak sinkron dapat dioperasikan. Kuliah belum selesai, dan Fraid sudah berbicara dengan tim Facebook Thrift, menawarkan untuk mengimplementasikan dukungan Tulip untuk Python 3 untuk menunggu pelabuhan Twisted, gevent dan lainnya. Beberapa hari kemudian, Trift menerbitkan peta jalan yang menunjukkan dukungan yang akan datang untuk Python 3 dan Tulip.

Ini terjadi pada awal 2014, tetapi tidak ada yang berubah selama enam bulan lagi; pengguna tidak muncul dan tidak berencana untuk melakukan ini, pada kenyataannya, mereka tidak tahu tentang perubahan apa pun.

Proyek baru

Pada Agustus 2014, Jumat meluncurkan proyek untuk menulis ulang layanan warisan. Awalnya, untuk tujuan ini, ia berencana menggunakan Python 2 dan gevent, tetapi kemudian ia menyadari bahwa pada saat itu selesai, itu sudah ketinggalan zaman. Seseorang harus menjadi yang pertama untuk melakukan perubahan; untuk Facebook dan Python 3, justru Fraid. "Andalah yang harus menjadi orang ini untuk Python 3 di organisasi Anda."

Jadi, ia memulai proyeknya menggunakan Python 3 dan "semuanya rusak"; tidak mengherankan bahwa tidak ada yang menggunakan Python 3. Sistem build bahkan tidak dapat mengkompilasi kodenya, dan semua paket roda pihak ketiga hanya tersedia untuk Python 2. Dan ketika ia tetap memperbaiki hal-hal yang cukup untuk merakit layanannya, itu langsung terhenti saat startup - Karena sesuatu yang dalam pada kode yang mengatur titik masuk pada sistem Facebook.

Oleh karena itu, untuk membuat kode berfungsi, Fraid terpaksa memperbaiki yang lainnya; Dia membangun kembali ratusan roda pihak ketiga untuk bekerja dengan kedua versi Python, memperbarui semua perpustakaan internal agar kompatibel dengan 2/3. Namun, setiap hari seseorang melakukan perubahan pada Python 2 hanya dalam ketergantungannya. Tidak heran Fraid lelah memperbaiki regresi. Satu-satunya solusi adalah untuk memaksa kepatuhan dengan Python 3 secara internal, tetapi ini tidak mungkin dilakukan di Facebook. Namun, jika Anda mulai bertindak seolah-olah Anda memiliki wewenang untuk melakukannya, orang-orang akan mulai percaya bahwa Anda benar-benar memilikinya.

Takut, menggunakan pengaruh sosialnya, menambahkan serpihan Pyflakes ke proses pembangunan. Mengingat kehadiran PEP 8 , ia membenarkan menambahkan yang baru sehingga akan memecahkan kategori masalah kode yang berbeda; ditambah, Pyflakes memiliki lebih sedikit positif palsu, jadi itu kurang mengganggu bagi pengembang. Takut mengatur semuanya sehingga Pyflakes menjalankan semua kode yang dikirim untuk ditinjau, pertama untuk Python 2 dan kemudian Python 3. Ini membantu mendistribusikan pekerjaan mempertahankan kompatibilitas dengan Python 3 di antara semua pengembang, yang memungkinkan untuk mencapai kemajuan dalam proyek Freud.

Pada awalnya, ia harus menjelaskan kepada orang-orang bahwa linter tidak rusak, dan masuk akal untuk memodifikasi kode agar sesuai dengan Python 3. Jika pengembang percaya bahwa transisi ke Python 3 terlalu rumit, mereka akan kembali ke gagasan "bertahan dengan Python 2 selamanya". Dengan Freud, membuat kode yang kompatibel dengan Python 3 menjadi lebih mudah. โ€œTutup mulut,โ€ dan karenanya dari Freud sendiri, menjadi lebih mudah daripada mengeluh tentang perlunya mengedit kode, itulah sebabnya semua orang melakukannya.

Pelatihan

Semua ini membantu menghentikan "pendarahan," tetapi itu tidak membantu membuat kemajuan signifikan dalam memperkenalkan Python 3 di Facebook. Friday bergabung dengan tim yang mengajarkan Python kepada karyawan baru. Linter sudah melaporkan kesalahan ketika kode tidak kompatibel dengan 2 atau 3, tetapi Fraid ingin mencapai titik di mana kode yang kompatibel dengan 2/3 ditulis hanya untuk proyek lawas, dan kode baru ditulis hanya dengan Python 3. Sekali lagi, Fraid mengambil situasi di tangannya sendiri: untuk membuat pernyataan ini, pada 2015 ia mengubah slide di kelas Python untuk karyawan baru. Idenya adalah bahwa pada titik yang tidak diketahui di masa depan, Facebook ingin beralih ke Python 3, jadi tidak masuk akal untuk menulis kode untuk Python 2 - suatu hari nanti harus ditulis ulang. Dia menjelaskan kepada para pemula bahwa semua ini harus bekerja di dalam infrastruktur Facebook dan membangun sistem, dan jika ini tidak mungkin, Anda harus mengirim bug, atau memperbaiki semuanya sendiri. "Anehnya, itu berhasil."

Pada Januari 2015, Fraid "akhirnya merilis" proyeknya. Dia menghabiskan sisa tahun ini untuk memberi tahu orang-orang tentang keberhasilannya dan kebutuhan untuk beralih ke Python 3. Selama tahun ini, sekutu baru muncul dalam transisi ke Python 3 di Facebook.



Salah satunya adalah ukasz Langa, yang โ€œentah bagaimana meyakinkan Instagram untuk beralih ke Python 3โ€. Pada 2016, Langa membentuk tim kontrol Facebook baru di Facebook, yang disebut "Department of Stupid Gait" . Karena mereka adalah "tim Python", "otoritas fiktif" yang disebutkan di atas berfungsi; orang berpikir mereka bisa membuat keputusan tentang Python di Facebook.

Pada tahun 2016, ada peningkatan yang lambat namun stabil dalam penggunaan Python 3 di perusahaan. Mereka berbicara tentang dia di rapat, digunakan dalam proyek-proyek baru. Opini berubah, meskipun Python 3 masih belum dianggap sebagai versi default, dan proyek-proyek secara sukarela memilih untuk menggunakannya. Pada Mei 2016, Jumat mengumumkan niatnya untuk mengganti sistem build ke Python 3 secara default. Gagasan itu didukung sepenuhnya, sehingga beberapa hari kemudian pergantian dilakukan - tanpa konsekuensi negatif.

Pada akhir 2016, tim proyek merilis laporan dengan hasil beralih ke Python 3. Pengembang hanya meluncurkan 2to3 dalam kode dan memperbaiki semua poin yang dia bersumpah. Ketika kode yang diterima diluncurkan, ditemukan bahwa itu adalah 40% lebih cepat dan hanya menggunakan setengah dari memori. Ini menunjuk pada mitos yang sering dijumpai Jumat: Python 3 lebih lambat dari Python 2. Ini mungkin benar untuk versi Python 3 sebelumnya, tetapi saat ini tidak relevan.

Barang bagus

Pada awal 2017, Instagram menyelesaikan migrasi ke Python 3 dan Facebook menuai hasil dari "masa depan yang gemilang di mana Anda dapat menikmati hal-hal baik." Memperbarui versi Python bukan proses yang menakutkan dan membuka kemungkinan menggunakan fitur baru. Pengembang Facebook sekarang dapat fokus pada masalah seperti fitur pengetikan statis baru atau migrasi layanan untuk menggunakan asyncio. "Python di Facebook itu menyenangkan lagi."

Masalah baru - orang-orang bertanya kapan mungkin menolak dukungan untuk Python 2. Ketika regresi muncul untuk mendukung pustaka atau modul Python 2, pengembang sering bertanya apakah mereka dapat dengan mudah beralih ke Python 3. Masalahnya adalah kebalikan dari apa yang terjadi beberapa tahun yang lalu. "Oh, betapa indahnya dunia tempat aku tinggal."

Selama kuliah, Freide menunjukkan grafik titik masuk Facebook untuk layanan Python mulai dari Q3 2015 - pada saat itu hanya ada total 4 poin Python 3. Pada saat transisi ke Python 3, pada pertengahan 2016, 4% dari semua poin sudah Python 3. Pada bulan Maret 2018, jumlahnya melebihi 50%; pada pertengahan Mei, pada saat kuliah, ada 55% dari "puluhan ribu titik masuk Facebook." Menurut Freud, perusahaan sekarang malu untuk menulis kode yang hanya berjalan di Python 2.

Kemudian Jumat menganalisis prosesnya. Dia mencatat bahwa lebih banyak yang harus dilakukan daripada hanya menciptakan sesuatu yang baru; Anda perlu mengarahkan pengembang ke ini, "menjadi perubahan yang ingin Anda lihat." Kami perlu menarik orang, bahkan jika mereka tidak mengerti bahwa mereka membantu. Ini difasilitasi oleh uji linter dan unit. Sangat penting untuk mengajarkan karyawan baru apa yang Anda perjuangkan. Ketika Anda mendapatkan hasilnya, rayakan sambil menikmati "hal-hal baik": tulis "kode Python 3 keren." Melihat bagaimana fitur baru dapat digunakan, yang lain juga ingin beralih.

Friday menjawab beberapa pertanyaan dari hadirin. Satu pertanyaan adalah tentang bagaimana membuat perubahan seperti itu dalam organisasi hierarkis yang lebih tradisional. Friday menyarankan bahwa itu bisa lebih mudah, karena Anda tidak perlu meyakinkan ribuan pengembang, tetapi hanya rantai manajer, dimulai dengan orang yang melihat manfaat dari transisi. Tetapi di sisi lain, akan lebih sulit jika budaya perusahaan konservatif. Berfokus pada peningkatan kualitas kode akan membantu di sini. Pertanyaan lain menyangkut kode tak terpisahkan, yang tidak dibagi menjadi banyak titik input. Untuk situasi ini, Jumat menyarankan menonton presentasi Instagram (video di YouTube) dengan PyCon 2017.

Organisasi lain dapat belajar banyak dari kuliah ini, tetapi jelas bahwa penting untuk memiliki pendukung yang keras kepala yang siap untuk mengendalikan dan mengoordinasikan seluruh proses. Perusahaan yang merencanakan transisi seperti itu akan membutuhkan orang seperti Fraid.

AKHIR

Kami menunggu pertanyaan dan komentar yang bisa Anda tinggalkan di sini atau tanyakan langsung pada Stas dalam pelajaran terbukanya .

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


All Articles