Python 3 على Facebook

مرحبا بالجميع!

أطلقنا تيار الذكرى السنوية الخامسة لدورة المطور Python . قبل بدء كل سلسلة محادثات ، غالبًا ما يسألون عن الإصدار الذي نستخدمه في التدريب (بشكل عام وليس فقط ، بغض النظر عن مدى غرابة الأمر ، نظرًا لاسم الدورة التدريبية ، Python) والفروق الدقيقة المختلفة للترحيل من إصدار إلى آخر. اليوم نريد مشاركة مقال حول تجربة الهجرة من 2 إلى 3 على Facebook ، تم إخباره على PyConf.

دعنا نذهب.

أصبح الانتقال إلى Python 3 أكثر شعبية في السنوات الأخيرة ، لكن العملية لا تزال بعيدة عن الاكتمال. البنية التحتية للعديد من الشركات الكبيرة التي تستخدم Python تترك كتلًا كبيرة من التعليمات البرمجية في Python 2.7 ، ولا يعتبر Facebook استثناءً. قام Jason Fried بزيارة PyCon 2018 للتحدث عن التغييرات التي حدثت في الشركة على مدى السنوات الأربع الماضية - في بداية Python 3 كانت غائبة عمليًا ، ولكن في النهاية أصبحت النسخة الرئيسية من Python في الشركة. ساعد جيسون في تحقيق هذا الهدف ، ويعتبر حديثه [فيديو يوتيوب] مصدرًا رائعًا للأفكار للمنظمات الأخرى التي ترغب في الهجرة.

انضم Fraid إلى Facebook في عام 2011 وسرعان ما أدرك أنه بحاجة إلى تعلم Python إذا أراد الحصول على مراجعات الشفرة بشكل أسرع. بعد ذلك بقليل ، أدرك أنه أصبح القوة الدافعة الرئيسية وراء الانتقال إلى Python 3 على Facebook. لم يكن هذا أبدًا جزءًا من خططه ، وقد حدث ذلك بالطبع أثناء عمله مع Python.



بدأ Fraid بأخذ دور نشط في مجموعة Python الداخلية ، وغالبًا ما تبين أنه أول من يجيب على الأسئلة. ونتيجة لذلك ، أصبح مشهورًا ("اكتسب سمعة سيئة") بين المؤيدين على Facebook ، من خلال إصلاح الرمز نفسه ، دون طلب الإذن ، إذا رأى أنه تم استخدام اللغة بشكل غير صحيح. هذا ممكن على Facebook ، بسبب عدم وجود تسلسل هرمي رأسي للتحكم ؛ كل شخص لديه العديد من الحقوق للتراجع عن تغييراتك كما يجب عليك إجراء هذه التغييرات في البداية. بمرور الوقت ، ساعدت هذه التعديلات في تعزيز مصداقية فرويد في مجتمع Python Facebook ، والذي سيكون مفيدًا أثناء عملية الترحيل.

وفقًا لفرويد ، فإن تغيير شيء ما مثل إصدار بلغة Python على مستوى Facebook استغرق بعض الوقت والكثير من الدبلوماسية. أراد أن يروي "قصة كيف جعلت أنا واثنين من المهندسين الآخرين في وقت فراغي وبدون أي تفويض من Python 3 الإصدار الرئيسي على Facebook."

في عام 2013 ، كان هناك دعم بدائي لـ Python 3.3 على Facebook. ظهر كجزء من مهمة إضافة دعم Python 3 إلى نظام البناء. ولكن تم حظر هذه المهمة من خلال دعم Python 3 في مكتبات Facebook ، والتي تم حظرها بدورها بسبب عدم دعم Python 3 في نظام البناء. الوضع مثل Trick-22 : Python 3 كانت "متاحة" ، ولكن لا شيء في بيئة Facebook يدعمها.

بالإضافة إلى ذلك ، في عام 2013 ، كان Python 3 على Facebook محاطًا بالمشاعر السلبية. اعتقد الجميع تقريبًا أن الشركة ستبقى في Python 2.7 إلى الأبد. كان هناك أيضا حديث عن التحول إلى لغة مختلفة تماما. حتى Fraid نفسه قال (في مجموعة داخلية) إن الانتقال إلى Python 3 لن يحدث أبدًا على Facebook. شخص واحد فقط اعترض على هذا البيان وعرض عليه فعل شيء حيال ذلك ؛ في تلك اللحظة ، تجاهل فرايد نداء العمل لكنه استمر في التفكير في هذه الفكرة.

شعاع الأمل

ولكن ، وفقا لفرويد ، كان الأمل حارا. في يناير 2013 ، استخدم __future__ (print_function, division, absolute_imports, andunicode_literals) أربعة واردات من __future__ (print_function, division, absolute_imports, andunicode_literals) . في البداية ، بدا أنها تطيل عمر قاعدة كود Python 2 ، وتمت إضافتها في كل مكان بحيث توقف اللبي عن الشتم. أدى هذا في النهاية إلى تبسيط تحويل الوحدات إلى Python 3.

يستخدم Facebook إطار العمل في كل مكان لإجراء تسلسل واستدعاء إجراءات Apache Thrift عن بُعد. وقد أصبح توافقها الاستثنائي مع Python 2 مانعًا رئيسيًا. ولكن في استطلاع حول الابتكارات المحتملة المثيرة للاهتمام من قبل Thrift على Facebook ، تبين أن إضافة دعم Python 3 هو خيار شائع. صوت لصالحه ، ولكن ليس لأنه يريد الترويج لـ Python 3. شعر ببساطة أن واجهة Python 2 كانت مشابهة لشيء من Java ، وبالتالي تطلب إعادة الهيكلة.

بدأت عملية تفكيره تتغير بعد محاضرة غيدو فان روسوم في Yelp ، سان فرانسيسكو حول موضوع "توليب" ، والتي تبين أنها وحدة غير متزامنة . لطالما كانت Fride من المعجبين ببرمجة Python غير المتزامنة ، لكنها اعتبرتها مجزأة بسبب الاختلافات بين الأطر (مثل Twisted ، gevent ) التي وفرتها. بدا توليب كما لو كان يمكن أن يجعل I / O غير متزامن قابلة للتشغيل المتبادل. المحاضرة لم تنته بعد ، وكان فريد قد تحدث بالفعل مع فريق Thrift Facebook ، وعرض تنفيذ دعم Tulip لـ Python 3 لانتظار منفذ Twisted و gevent وغيرها. بعد بضعة أيام ، نشر Trift خريطة طريق تظهر الدعم القادم لـ Python 3 و Tulip.

حدث هذا في أوائل عام 2014 ، ولكن لم يتغير شيء لمدة ستة أشهر أخرى. لم يظهر المستخدمون ولم يخططوا للقيام بذلك ، في الواقع ، لم يعرفوا عن أي تغييرات.

مشروع جديد

في أغسطس 2014 ، أطلق يوم الجمعة مشروعًا لإعادة كتابة خدمة قديمة. في البداية ، لهذا الغرض ، خطط لاستخدام Python 2 و gevent ، ولكن بعد ذلك أدرك أنه بمجرد الانتهاء من ذلك ، يكون قد أصبح قديمًا بالفعل. يجب أن يكون الشخص أول من يقوم بالتغيير ؛ بالنسبة إلى Facebook و Python 3 ، كان ذلك بالضبط خوفًا. "أنت من يجب أن تصبح هذا الشخص في Python 3 في مؤسستك."

لذلك ، بدأ مشروعه باستخدام Python 3 و "تم كسر كل شيء". ليس من المستغرب أن لا أحد استخدم Python 3. لم يتمكن نظام البناء من تجميع الكود الخاص به ، وكانت جميع حزم عجلات الطرف الثالث متوفرة فقط لـ Python 2. وعندما قام بإصلاح أشياء كافية لتجميع خدمته ، فقد تعطل على الفور عند بدء التشغيل - بسبب شيء ما عميقًا في الكود الذي أنشأ نقاط الدخول على نظام Facebook.

لذلك ، من أجل جعل الكود يعمل ، اضطر Fraid لإصلاح كل شيء آخر ؛ أعاد بناء مئات من عجلات الجهات الخارجية للعمل مع كلا الإصدارين من Python ، وتحديث جميع المكتبات الداخلية لجعلها متوافقة مع 2/3. ومع ذلك ، كل يوم يقوم شخص ما بإجراء تغييرات على Python 2 فقط في تبعيته ، ولا عجب في أن تعب كان من إصلاح الانحدارات. الحل الوحيد هو فرض الامتثال لـ Python 3 داخليًا ، ولكن هذا غير ممكن على Facebook. ومع ذلك ، إذا بدأت في التصرف وكأنك تملك السلطة للقيام بذلك ، سيبدأ الناس في الاعتقاد بأنك تمتلكهم حقًا.

أضاف فريد ، باستخدام نفوذه الاجتماعي ، مادة Pyflakes linter إلى عملية البناء. نظرًا لوجود PEP 8 ، برر إضافة فئة جديدة حتى تحل فئة مختلفة من مشاكل التعليمات البرمجية ؛ بالإضافة إلى ذلك ، كان لدى Pyflakes عدد أقل من الإيجابيات الزائفة ، لذلك كان أقل إزعاجًا للمطورين. قام Fraid بإعداد كل شيء بحيث يعمل Pyflakes على جميع التعليمات البرمجية المرسلة للمراجعة ، أولاً لـ Python 2 ثم Python 3. وقد ساعد هذا على توزيع عمل الحفاظ على التوافق مع Python 3 بين جميع المطورين ، مما جعل من الممكن تحقيق تقدم في مشروع Freud.

في البداية ، كان عليه أن يشرح للناس أن اللنتر لم يتم كسره ، ومن المنطقي تعديل الكود ليتماشى مع Python 3. إذا اعتقد المطورون أن الانتقال إلى Python 3 كان معقدًا للغاية ، فسيعودون إلى فكرة "البقاء مع Python 2 إلى الأبد". مع Freud ، أصبح جعل التعليمات البرمجية متوافقة مع Python 3 أسهل بكثير. أصبح "إغلاق اللتر" ، وبالتالي فرويد نفسه ، أسهل من الشكوى من الحاجة إلى تحرير الشفرة ، وهذا هو السبب في قيام الجميع بذلك.

تدريب

كل هذا ساعد في وقف "النزيف" ، لكنه لم يساعد في تحقيق أي تقدم كبير في تقديم Python 3 على Facebook. انضم يوم الجمعة إلى الفريق الذي علم بايثون للموظفين الجدد. أبلغ Linters بالفعل عن أخطاء عندما كان الرمز غير متوافق مع 2 أو 3 ، لكن Fraid أراد الوصول إلى النقطة التي تمت فيها كتابة الرمز المتوافق مع 2/3 فقط للمشاريع القديمة ، وتمت كتابة الرمز الجديد فقط في Python 3. مرة أخرى ، أخذ Fraid الوضع بين يديه: من أجل الإدلاء بهذا البيان ، قام في عام 2015 بتغيير الشرائح في فئة Python للموظفين الجدد. كانت الفكرة هي أنه في وقت ما غير معروف في المستقبل ، قد يرغب Facebook في التحول إلى Python 3 ، لذلك ليس من المنطقي كتابة رمز لـ Python 2 - في يوم من الأيام يجب أن تتم إعادة كتابته. وأوضح للمبتدئين أن كل هذا يجب أن يعمل داخل البنية التحتية لـ Facebook وأنظمة البناء ، وإذا لم يكن ذلك ممكنًا ، كان عليك إرسال خطأ أو إصلاحه بنفسك. "من الغريب ، لقد نجحت."

في يناير 2015 ، "أطلق فرايد" مشروعه أخيرًا. أمضى بقية العام في إخبار الناس عن نجاحه والحاجة إلى التحول إلى Python 3. خلال العام ، ظهر حلفاء جدد في الانتقال إلى Python 3 على Facebook.



أحدهم كان ukasz Langa ، الذي "أقنع بطريقة ما Instagram إلى التحول إلى Python 3". في عام 2016 ، شكل لانغا فريق تحكم جديدًا على Facebook على Facebook ، يُسمى "قسم Stupid Gait" . بما أنهم كانوا "فريق Python" ، عملت "السلطة الوهمية" المذكورة أعلاه ؛ اعتقد الناس أنه يمكنهم اتخاذ قرارات بشأن Python على Facebook.

في عام 2016 ، كانت هناك زيادة بطيئة ولكن ثابتة في استخدام Python 3 في الشركة. تحدثوا عنه في الاجتماعات التي استخدمت في مشاريع جديدة. كان الرأي يتغير ، على الرغم من أن Python 3 لا يزال لا يعتبر الإصدار الافتراضي ، واختارت المشاريع استخدامه طوعًا. في مايو 2016 ، أعلن الجمعة عن نيته تبديل نظام البناء إلى Python 3 بشكل افتراضي. تم دعم الفكرة بالكامل ، لذلك بعد بضعة أيام تم تنفيذ التبديل - دون عواقب سلبية.

في نهاية عام 2016 ، أصدر فريق المشروع تقريرًا بنتائج التحول إلى Python 3. أطلق المطورون ببساطة 2to3 في الشفرة وأصلحوا جميع النقاط التي أقسم عليها. عندما تم إطلاق الرمز المستلم ، وجد أنه أسرع بنسبة 40 ٪ ويستخدم نصف الذاكرة فقط. يشير هذا إلى أسطورة واجهتها يوم الجمعة في كثير من الأحيان: Python 3 أبطأ من Python 2. قد يكون هذا صحيحًا في الإصدارات السابقة من Python 3 ، ولكنه الآن غير ذي صلة.

الاشياء الجيدة

في أوائل عام 2017 ، أكمل Instagram الانتقال إلى Python 3 وكان Facebook يجني ثمار "مستقبل رائع حيث يمكنك الاستمتاع بأشياء جيدة." لم يكن تحديث نسخة Python عملية مخيفة وفتح إمكانية استخدام ميزات جديدة. يمكن لمطوري Facebook التركيز الآن على مشكلات مثل ميزات الكتابة الثابتة الجديدة أو ترحيل الخدمة لاستخدام asyncio. "Python على Facebook هي متعة مرة أخرى."

مشكلة جديدة - يسأل الناس عندما يكون من الممكن رفض دعم Python 2. عندما تظهر الانحدارات لدعم مكتبات أو وحدات Python 2 ، غالبًا ما يسأل المطورون عما إذا كان بإمكانهم ببساطة التبديل إلى Python 3. المشكلة هي عكس ما كان عليه قبل بضع سنوات. "أوه ، كم هو رائع العالم الذي أعيش فيه."

خلال المحاضرة ، أظهر Freide رسمًا بيانيًا لنقاط الدخول على Facebook لخدمة Python بدءًا من الربع الثالث 2015 - في ذلك الوقت لم يكن هناك سوى 4 نقاط Python 3 في المجموع. في وقت الانتقال إلى Python 3 ، في منتصف عام 2016 ، كانت 4٪ من جميع النقاط بالفعل Python 3. في مارس 2018 ، تجاوز عددها 50٪. في منتصف شهر مايو ، في وقت المحاضرة ، كانت هناك 55٪ من "عشرات الآلاف من نقاط الدخول على Facebook". وفقًا لفرويد ، تشعر الشركة بالحرج الآن من كتابة رمز يعمل فقط على Python 2.

ثم حلل يوم الجمعة العملية. وأشار إلى أن هناك الكثير الذي يتعين القيام به من مجرد إنشاء شيء جديد ؛ أنت بحاجة لقيادة المطورين لهذا ، "كونه التغيير الذي تريد أن تراه." نحن بحاجة إلى جذب الناس ، حتى لو لم يفهموا أنهم يساعدون. يتم تسهيل ذلك عن طريق اختبارات اللتر والوحدة. من المهم جدًا تعليم الموظفين الجدد ما تسعى إليه. عندما تحصل على النتيجة ، احتفل أثناء الاستمتاع بـ "الأشياء الجيدة": اكتب "كود Python 3 الرائع". عند رؤية كيفية استخدام الميزات الجديدة ، سيرغب الآخرون أيضًا في التبديل.

أجاب يوم الجمعة على بعض الأسئلة من الجمهور. كان أحد الأسئلة حول كيفية إجراء مثل هذا التغيير في منظمة أكثر تقليدية وتسلسلية. اقترح يوم الجمعة أنه يمكن أن يكون الأمر أسهل ، نظرًا لأنك لست بحاجة إلى إقناع الآلاف من المطورين ، ولكن فقط سلسلة من المديرين ، بدءًا من الشخص الذي يرى فوائد الانتقال. ولكن من ناحية أخرى ، يمكن أن يكون الأمر أكثر صعوبة إذا كانت ثقافة الشركة محافظة. سيساعدك التركيز على تحسين جودة الشفرة هنا. سؤال آخر يتعلق برمز غير قابل للتجزئة ، والذي لم يتم تقسيمه إلى العديد من نقاط الإدخال. لهذه الحالة ، اقترح يوم الجمعة مشاهدة عرض Instagram (فيديو على YouTube) مع PyCon 2017.

يمكن للمنظمات الأخرى أن تتعلم الكثير من هذه المحاضرة ، ولكن من الواضح أن من المهم أن يكون لديك مؤيد عنيد مستعد للتحكم في العملية بأكملها وتنسيقها. ستحتاج الشركات التي تخطط لمثل هذا الانتقال إلى رجل مثل Fraid.

النهاية

نحن في انتظار سؤال وتعليقات يمكنك تركها هنا أو طرح Stas مباشرة في الدرس المفتوح .

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


All Articles