الكود القديم يزداد سوءاً مع مرور الزمن

الكود القديم (Legacy code) لا يتقادم مثل النبيذ؛ بل يزداد سوءاً مع كل يوم تتجاهله فيه.

قضيتُ الأسبوع الماضي ثلاث ساعات في تصحيح أخطاء (debugging) لمشكلة كان من المفترض أن تستغرق 20 دقيقة فقط. كان السبب وحدة تحقق (validation module) تعود لعام 2019. تركها الجميع وشأنها لأنها كانت "تعمل"، لكنها لم تكن تعمل حقاً. وجدتُ تعليقاً من عام 2020 يقول: TODO: refactor this.

يتعامل الكثيرون مع الكود القديم كدين اختياري، ويظنون أنهم سيسددونه عندما يتوفر لديهم الوقت. لكن الكود القديم يعمل مثل العفن؛ ينتشر ويصيب كل ما حوله. وكلما طال انتظارك، زادت تكلفة تنظيفه.

الدورة متوقعة:

  • ترث ميزة (feature) فوضوية ولكنها تعمل.
  • تضيف جملة if أخرى لجعلها تعمل.
  • بعد ستة أشهر، يفعل شخص آخر الشيء نفسه.
  • بعد عام واحد، يصبح الملف مكوناً من 800 سطر وبدون أي اختبارات.

هذه التكلفة الخفية تضربك بثلاث طرق:

  • انخفاض السرعة. تقضي وقتاً في فهم السياق أكثر مما تقضيه في كتابة الكود.
  • تزايد الأخطاء (Bugs). إصلاح واحد قد يؤدي لتعطل شيء آخر لأن المنطق متشابك.
  • فشل عملية التهيئة (Onboarding). يواجه المطورون الجدد صعوبة في فهم سبب وجود المنطق نفسه في سبعة أماكن مختلفة.

انتبه لهذه العلامات التحذيرية:

  • تعليقات عديمة الفائدة مثل HACK: do not touch this.
  • تكرار منطق العمل (business logic) عبر ملفات مختلفة.
  • التبعيات الدائرية (Circular dependencies) حيث تعتمد الخدمات على بعضها البعض.

لا تعيد كتابة كل شيء. عمليات إعادة الكتابة الكاملة تفشل بنسبة 80% من الوقت. بدلاً من ذلك، استخدم إعادة الهيكلة التدريجية (incremental refactoring) مع اختبارات التوصيف (characterization tests).

اتبع هذه العملية:

  • وثّق السلوك الحالي باستخدام الاختبارات، حتى الأجزاء الغريبة منه.
  • أعد هيكلة الكود دون تغيير ذلك السلوك.
  • كرر العملية حتى يصبح الكود قابلاً للقراءة.
  • لا تغير السلوك إلا بعد أن تمتلك اختبارات حقيقية.

قواعد يجب اتباعها:

  • لا تقم أبداً بإعادة الهيكلة بدون اختبارات.
  • تجنب التحسينات التي تغير طريقة عمل الكود. فقد يكون الخطأ (bug) بمثابة ميزة يعتمد عليها العميل.
  • اترك الكود المستقر وشأنه. إذا لم تتغير وحدة برمجية (module) منذ ثلاث سنوات ولم تسبب أي مشاكل، فلا تلمسها.

ركز طاقتك على الكود الذي تلمسه وتعدل عليه باستمرار.

Source: https://dev.to/taina_costa_f/legacy-code-nao-envelhece-como-vinho-quanto-mais-espera-pior-fica-132h