التراث — ليس مجرد كود قديم. إنه نظام يعمل ويجني الأموال للشركة ولكنه يبطئ التطوير. في تطوير التطبيقات المحمولة، قد يكون الكود القديم مكتوبًا بلغة Objective-C، أو يستخدم مكتبات قديمة أو أنماطًا معمارية متقادمة. وفقًا لتقرير CAST Software (2024)، يتجاوز متوسط عمر سطر الكود في مشاريع المؤسسات 14 عامًا. تحدد استراتيجية العمل مع الكود القديم ما إذا كان سيصبح عائقًا أم سيظل أصلًا قابلًا للإدارة.
الملخص
الكود القديم — كود أو نظام يستمر في العمل في الإنتاج ولكنه لم يعد يفي بمعايير الجودة الحديثة. قد يكون الكود القديم مكتوبًا بلغة متقادمة (مثل Objective-C بدلاً من Swift)، أو يستخدم مكتبات غير مدعومة أو أنماطًا معمارية اعتبرت منذ زمن أنماطًا مضادة.
الخاصية الرئيسية للكود القديم هي غياب الاختبارات. وفقًا لتعريف Michael Feathers (2004)، الكود القديم هو كود بدون اختبارات. إذا لم تتمكن من تغيير السلوك بأمان، فإن النظام في حالة كود قديم بغض النظر عن عمره. الكود الجديد بدون اختبارات وحدة هو كود قديم من اليوم الأول.
الكود القديم ليس بالضرورة سيئًا. نظام مصمم جيدًا بلغة Java 8 قد يكون أكثر موثوقية وقابلية للفهم من كود فوضوي بلغة Kotlin مع coroutines. عمر الكود ليس مؤشرًا على الجودة — المهم هو مدى سهولة تغيير النظام وتوسيعه.
كل نظام ناجح يصبح كودًا قديمًا بمرور الوقت. هذه عملية طبيعية: التقنيات تتطور أسرع مما يمكن إعادة كتابة الكود. تطبيق كُتب منذ 5 سنوات بلغة Swift 2 هو كود قديم اليوم، على الرغم من أنه كان حديثًا في وقت إنشائه.
قيمة الكود القديم للأعمال غالبًا ما تُقلل. النظام يعمل بموثوقية، يعالج المعاملات، يخزن البيانات — إعادة الكتابة تحمل مخاطر. وفقًا لـ Standish Group (2024)، 35% من مشاريع إعادة الكتابة الكاملة تنتهي بالفشل. من المبرر اقتصاديًا عدم التخلص من الكود القديم، بل تعلم كيفية العمل معه.
أفضل الاستراتيجيات هي الهجرة التدريجية، وعزل الكود القديم خلف واجهات جديدة، والاختبار الآلي. يصبح الكود القديم مشكلة فقط عندما يتوقف عن كونه قابلًا للتغيير بتكلفة يمكن التنبؤ بها.
غياب الاختبارات الآلية — المؤشر الرئيسي. إذا لم يتمكن المطور بعد تغيير سطر واحد من تشغيل الاختبارات والتأكد من عدم كسر شيء — فأنت أمام كود قديم. علامة إضافية: عملية النشر تستغرق ساعات وتتطلب خطوات يدوية.
التوثيق لا يتطابق مع الكود — علامة أخرى. الرسوم البيانية المعمارية قديمة، والتعليقات تصف سلوكًا تغير بالفعل. مدة التأهيل لمطور جديد تتجاوز الشهر — علامة على التعقيد العالي وانخفاض قابلية الصيانة.
علامات إضافية: بنية متجانسة بدون حدود واضحة، اختبار يدوي كطريقة رئيسية للتحقق، خط أنابيب CI طويل (أكثر من 30 دقيقة)، استخدام مكتبات بدون إصدارات محدثة، وعدم القدرة على تحديث التبعيات دون كسر الوحدات المرتبطة.
ظاهرة «الكود الهش» — تغيير في مكان واحد يكسر ثلاثة أماكن أخرى. هذا نتيجة الاقتران المحكم (tight coupling)، عندما تعرف الوحدات الكثير عن بعضها البعض. كلما زاد الاقتران، زادت سرعة انتقال النظام إلى فئة الكود القديم.
انخفاض السرعة — الخطر الرئيسي. إضافة ميزة بسيطة تتطلب ساعات من دراسة الكود وأيامًا من الاختبار. وفقًا لـ Stripe (2024)، يقضي المطورون 33% من وقتهم في التغلب على الديون التقنية، والتي ترتبط ارتباطًا مباشرًا بوجود وحدات كود قديم في المشروع.
تسرب الخبرة — مؤلفو الكود الأصلي يغادرون الشركة والتوثيق غير كامل. المطورون الجدد يخشون لمس الوحدات غير المألوفة، مما يؤدي إلى تأثير «الكود المتجمد»: الوحدة لا تتطور ولكنها تستمر في العمل. عامل الحافلة لهذه الأنظمة منخفض بشكل خطير.
الأمان — المكتبات القديمة تحتوي على ثغرات معروفة. استخدام OpenSSL 1.0.2 أو إصدارات قديمة من Jackson في مشاريع Java هو طريق مباشر لحوادث أمنية قد تكلف الشركة السمعة والعملاء.
إحباط الفريق — العمل مع كود قديم بدون استراتيجية للتحسين يقلل من رضا المطورين. يتوقف الفريق عن الاعتزاز بالمنتج، ويزداد معدل دوران الموظفين، مما يبطئ تطوير النظام أكثر.
اختبارات التوصيف — الخطوة الأولى قبل أي تغيير في الكود القديم. شغّل الكود على بيانات إدخال معروفة وسجل المخرجات المتوقعة. هذه الاختبارات تثبت السلوك الحالي كمواصفات. اختبار golden master — طريقة حيث تُقارن المخرجات بملف مرجعي.
تحليل الـ Seam — البحث عن نقاط يمكن فيها كسر الاقتران دون تغيير السلوك. يحدد Michael Feathers عدة أنواع من الـ seams: preprocessor seam، object seam، link seam. Object seam هو الأكثر شيوعًا: استبدال كائن حقيقي بنموذج اختبار عبر واجهة.
Sprout method و Sprout class — تقنيات لإضافة كود جديد بجانب الكود القديم، وليس داخله. بدلاً من تعديل طريقة موجودة، أنشئ طريقة جديدة بالمنطق المطلوب واستدعها من الطريقة القديمة. هذا يقلل من خطر كسر الكود العامل.
class LegacyPaymentProcessor {
def process(payment) {
// 200 سطر من الكود القديم الذي لا يجب المساس به
logPayment(payment) // طريقة sprout
}
def logPayment(payment) {
// كود جديد يضاف بجانب الكود القديم
}
}
نمط Strangler Fig — النهج الموصى به لهجرة الكود القديم. يتم إنشاء وحدة جديدة بالتوازي، ويتم تحويل حركة المرور تدريجيًا من القديم إلى الجديد. «تموت» الوحدة القديمة طبيعيًا عندما تتوقف عن تلقي الطلبات. يقلل النمط من المخاطر ويسمح بالتراجع في حالة ظهور مشاكل.
Branch by Abstraction — تقنية يتم فيها إنشاء طبقة تجريد فوق التنفيذ القديم والجديد. يتحول كود العميل إلى التجريد، ويتم استبدال التنفيذ القديم تدريجيًا. مثال: استبدال طبقة الشبكة من AFNetworking إلى Alamofire عبر بروتوكول موحد NetworkService.
الهجرة المرحلية — تقسيم الانتقال إلى خطوات صغيرة: عزل الوحدة القديمة ← كتابة الاختبارات ← إنشاء وحدة جديدة ← التشغيل المتوازي ← إزالة الوحدة القديمة. كل خطوة تنتهي بحالة نظام مستقرة، مما يسمح بالنشر في أي لحظة.
الأسئلة الشائعة
إعادة الكتابة الكاملة هي الخيار الأكثر خطورة. فقط 25% من المشاريع التي تعيد الكتابة بالكامل تنجح في الوقت المحدد. من الأفضل تطبيق نمط Strangler Fig: استبدال الوحدات تدريجيًا دون إيقاف المنتج. كل تكرار يحقق قيمة تجارية، والمخاطر تتوزع على الوقت.
ابدأ باختبارات التوصيف: شغّل الوحدة على بيانات معروفة وسجل النتيجة. اختبار golden master — طريقة بسيطة لتثبيت السلوك. أضف اختبارات في كل مرة تلمس فيها سطر كود. بعد 6 أشهر سيكون لديك هيكل يحمي من الانتكاسات.
إذا كان النظام مستقرًا، ولا يتطلب تغييرات متكررة، ولا يؤثر على سرعة تطوير الوحدات الأخرى — اتركه. «إذا لم يكن معطلاً، لا تصلحه» — نهج معقول للوحدات القديمة المعزولة ذات التردد المنخفض للتغييرات. المس الكود فقط عندما تحتاج إلى إدخال تغييرات تجارية.
استخدم الإصدار الدلالي وحدث بخطوات: patch ← minor ← major. اكتب اختبارات توافق لكل مكتبة. Dependabot أو Renovate يؤتمتة إنشاء PRs للتحديث. إذا كانت المكتبة مهملة، خطط لاستبدالها من خلال طبقة تجريد.
الدين التقني — استعارة لتقدير تكلفة التحسينات المؤجلة. الكود القديم — نظام أو كود محدد أصبح متقادمًا بالفعل. الدين التقني يمكن أن يتراكم في شهر، أما الكود القديم فيحتاج وقتًا. ليس كل دين تقني يصبح كودًا قديمًا، لكن كل كود قديم يحتوي على دين تقني.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.