ما يكلّفه فعلًا أن تتأخر ثلاثة إصدارات في Laravel
لا أحد يقرر التأخر. يحدث إصدارًا متخطى في كل مرة، وتصل الفاتورة كترقيع أمني لا تستطيع تطبيقه وعرض سعر أربعة أضعاف ما كان ينبغي.
التطبيق المتأخر ثلاثة إصدارات رئيسية لم يصل إلى هناك بقرار. كان هناك ربع سنة لم تتسع فيه الترقية، ثم إصدار لم تكن فيه حزمة قد لحقت بعد، ثم سنة لم ينكسر فيها شيء - والمسألة في خروج إطار من الدعم أن لا شيء ينكسر يوم يحدث ذلك.
والكلفة حقيقية على أي حال. إنها مؤجلة فحسب، وهي تتراكم.
الفاتورة، مفصّلة
تكفّ الإصلاحات الأمنية عن الوصول. هذا هو الجزء الذي له تاريخ. كل إصدار من Laravel ينال نحو سنتين من الإصلاحات الأمنية؛ فوّت تلك النافذة وتصير ثغرة تُعلن في الإطار بلا ترقيع تستطيع تطبيقه. الإصلاح موجود - في إصدار لا يستطيع تطبيقك تثبيته.
اعتمادياتك ترحل من دونك. الحزم تتبع الإطار. متأخرًا سنة، تثبّت إصدارًا أو اثنين. ومتأخرًا ثلاث سنوات، تكون الحزمة التي تحتاجها قد أسقطت دعم قيدك كليًا، ويصير تثبيت أي شيء جديد حلّ رسم بياني بلا حلّ. ويخبرك Composer بذلك بأقل الطرق فائدةً.
PHP يخرج من الدعم تحته. إصدارات Laravel تحمل متطلبات PHP، وPHP القديم يكفّ عن تلقي إصلاحات أمنية وفق جدوله. فصار اللغة والإطار والحزم كلها تحتاج تحريكًا، وعليها أن تتحرك بترتيب.
التوظيف يصعب والإدماج يبطؤ. مطوّرة عملت في Laravel ثلاث سنوات لم ترَ أعراف إصدارك قط. وكل توثيق تجده يصف شيئًا آخر. وأقوى حجج الإطار نفسه - أن من يعرف Laravel يستطيع قراءة أي شيفرة Laravel - تكفّ عن الانطباق على شيفرتك.
العمل نفسه يبطؤ. لا لأن الإصدار القديم بطيء، بل لأن كل شيء التفاف. ميزات تصدر في سطر واحد في Laravel الحالي تكون هنا حزمة، أو trait، أو أربعمئة سطر كتبها أحدهم في 2019 ثم رحل.
لماذا يسوء بدل أن يبقى كما هو
الترقية من إصدار إلى الذي يليه آلية في أغلبها. التغييرات الكاسرة موثَّقة، وهي قليلة عادةً، وملاحظات الإصدار تخبرك أين تنظر.
وثلاثة إصدارات ليست ثلاثة أضعاف ذلك العمل، لسببين.
التغييرات تتفاعل. الإهمال الذي أُدخل في إصدار وأُزيل بعد اثنين غير مرئي في أدلة الترقية المفردة ولا مفرّ منه حين تفعلها معًا. ولا تستطيع التقدم بنظافة، لأن الحزم التي كانت ستحملك عبر الإصدارات الوسيطة لم تعد لها إصدارات ترضي الطرفين.
فيكفّ العمل عن كونه طبّق الدليل ويصير افهم ما يفعله هذا التطبيق فعلًا - وهو غالٍ بالضبط لأن أحدًا لا يعرفه حاليًا.
كيف يبدو حين يُنفَّذ كما ينبغي
اقرأ قبل أن تكتب. ماذا يفعل التطبيق، وأي أجزائه لها اختبارات، وأي اعتماديات مهجورة، وأي PHP يحتاج. ينتج ذلك وثيقة وترتيبة، وهو الجزء الذي يريد الناس تخطّيه.
احصل أولًا على شبكة أمان. الترقية بلا اختبارات إعادةُ كتابة بخطوات إضافية. واختبارات وظيفية على المسارات التي تحرّك المال والمهام التي تلمس أنظمة أخرى تكفي عادةً - لا تغطية كاملة، فتلك تكلّف أكثر من الترقية.
اللغة أولًا حيث ينطبق. إن كان على PHP أن يتحرك، فهو يتحرك قبل الإطار، لأن الإطار لا يستطيع.
إصدار واحد في كل مرة، مدموج في كل مرة. رقِّ، وأصلح، وانشر، وكرّر. كل خطوة صغيرة بما يكفي للتفكير فيها والرجوع عنها. والفرع الواحد الذي يحاول الثلاثة ينتهي تعارض دمج بموعد نهائي ملحق به.
احذف على الطريق. ثلاثة إصدارات من الالتفافات المتراكمة تحوي بعضًا لا يوجد إلا لأن الإطار لم يكن يستطيع ذلك حينها. صار يستطيع الآن. وتلك الحذوفات هي الجزء الذي يسدد ثمنه مرتين.
الرقم الجدير بالمعرفة
النسخة الصادقة من الحساب: ترقية تُجرى كل سنة كلفة صغيرة يمكن توقعها. وإن تُركت ثلاثًا، كلّف العمل نفسه أضعافًا - لا لأن الشيفرة تغيّرت أكثر، بل لأن معرفة ما يفعله التطبيق يجب إعادة بنائها قبل أن يتحرك أي شيء بأمان.
والتراكم لا يتوقف بينما تقرر. سنة أخرى تضيف إصدارًا آخر، ومجموعة أخرى من الاعتماديات المهجورة، ومجموعة أخرى من الأشخاص الذين غادروا الشركة منذ أن كان أحد يفهم وحدة المدفوعات.
وإن كنت تقرأ هذا لأنك تعلم أنك متأخر بالفعل، فالخطوة الأولى المفيدة ليست عرض سعر. بل معرفة كم بالضبط، وبأي ترتيب يجب أن تتحرك الأشياء، وأي أجزاء التطبيق لا يستطيع أحد شرحها الآن - فتلك القائمة الأخيرة هي ما يتكوّن منه السعر فعلًا.
قراءة التطبيق تدقيق. ونقله ترقية وإنقاذ. وحالما يصير محدَّثًا، يصبح البقاء محدَّثًا مهمة شهرية صغيرة، وهذه هي الحجة كلها لصالح ترتيب صيانة.
وإن لم يكن التطبيق على Laravel أصلًا، فالفائدة نفسها تتراكم على إطار العمل الذي يقوم عليه. ننقل تلك التطبيقات على مراحل. ولا نعيد كتابتها.
