راسلني على واتساب
كل المقالات

استلام مشروع قديم بدون إعادة كتابته من الصفر

1 سبتمبر 2026 · قراءة 8 دقائق · بلال ناجي

Legacy CodeReact NativeRefactoring

وصلني Medicta تطبيقَ React Native حيًّا على Google Play: مستخدمون حقيقيون يحجزون مواعيد أطباء وزيارات منزلية، وقائمة أخطاء طويلة تكفي لتؤلم، وواجهة قديمة، ولا سبيل للوصول إلى المطورين الذين كتبوه. وكان العميل قد سمع فعلًا النصيحة التي يقدمها كل مطور في هذا الموقف — "المشروع محتاج إعادة كتابة" — ولم يكن يحتمل ستة أشهر يدفع فيها ثمن منتج يملكه بالفعل.

ثبّتُّ التطبيق، وأعدت تصميم واجهته شاشةً بشاشة، وأعدته إلى Google Play دون أن يتوقف يومًا عن خدمة مستخدميه. هذه هي الخطة كاملة، لأن استلام المشاريع القديمة تخصص قائم بذاته، وكل شيء فيه تقريبًا يسير عكس غريزة المطور.

أولًا: استحق بناءً قابلًا للتكرار

لا شيء آخر يهم قبل أن يثبت أن الكود على جهازك يتحول فعلًا إلى التطبيق الموجود في المتجر. مشاريع الموبايل القديمة تفشل هنا باستمرار: مفاتيح توقيع غير موثقة، وإصدارات اعتماديات لم تعد تُحلّ، ووحدات native مثبتة على SDK أقدم بثلاثة إصدارات، وملف ‎.env يعيش فقط على حاسوب مطورٍ سابق.

أول تسليم لم يكن إصلاحًا — بل كان بناءً: سحب الكود، والتثبيت، والترجمة، والتشغيل على جهاز حقيقي، مع توثيق مكتوب لكل خطوة وكل بيانات اعتماد يلزم تكرارها. عملٌ لا بريق له ولا يراه العميل، لكنه يحوّل المشروع من "ملف مضغوط نخاف منه" إلى برمجيات. عندها فقط لمستُ أول خطأ.

اقرأ قبل أن تحكم

كل استلام يبدأ برغبةٍ في إدانة المطور السابق. قاومها — لا مجاملةً، بل لأنها تنتج هندسة رديئة. الكود الذي يبدو جنونيًا غالبًا ما يحمل وزنًا لم تكتشفه بعد: غلاف إعادة المحاولة الغريب موجود لأن API الحجز يخصم مرتين عند انتهاء المهلة، ومحلّل التواريخ اليدوي موجود لأن الخادم يرسل ثلاث صيغ مختلفة.

قضيت الأيام الأولى في رسم الخريطة لا في الإصلاح: أي الشاشات موجودة، وأي نقاط API تستدعيها، وأين تعيش الحالة، وماذا تقول تقارير الانهيار فعلًا. لا يلزم أن تكتمل الخريطة — يلزم أن تكون صادقة بشأن ما فُهم وما زال معتمًا. تبقى الإصلاحات داخل المنطقة المضاءة، وتنكمش المنطقة المعتمة خطأً بعد خطأ.

فرزٌ كغرفة طوارئ، لا كقائمة مهام

قائمة أخطاء مشروعٍ قديم ليست backlog يُحرق بالترتيب. صنّفت مشاكل Medicta في ثلاث درجات: أخطاء تخسر مالًا أو مستخدمين الآن (فشل الحجز، انهيار عند الإقلاع)، وأخطاء تُضعف الثقة ببطء (تسميات خاطئة، بيانات قديمة، حالات حدّية مكسورة)، وكل ما هو تجميلي. الدرجة الأولى تُشحن بأسرع ما يمكن بأمان؛ والثانية تُجدول؛ والثالثة تنتظر إعادة التصميم لتبتلعها مجانًا.

ونظام الدرجات أعطى العميل ما لا تعطيه إعادة الكتابة أبدًا: تقدمًا مرئيًا في الأسبوع الأول. شعر المستخدمون بالتطبيق يتحسن والعملُ الأعمق ما زال جاريًا — والعميل الذي يرى حركةً يمنح ثقة، وهي عملة يستهلكها الاستلام سريعًا لولا ذلك.

غيّر بأصغر الوحدات الممكنة

في كودٍ بلا اختبارات وبلا مؤلفيه الأصليين، حجم التغيير هو حجم مخاطرته. كان كل إصلاح أصغر فرقٍ يحل المشكلة — لا تنظيفات عابرة، ولا refactor "بما أنني هنا" مخلوطًا بإصلاح خطأ. وحين كانت إعادة الهيكلة ضرورية حقًا، شُحنت وحدها، حتى إذا انكسر شيء كان السبب commit واحدًا لا مشروعَ تنقيبٍ أثري.

واتبعت إعادة تصميم الواجهة القاعدة نفسها على نطاق أوسع: شاشة بشاشة، لا التطبيق بقفزة واحدة. كل إصدار استبدل حفنة شاشات بالتصميم الجديد بينما بقي الباقي يعمل كما كان. حصل المستخدمون على تطبيق يتحسن باطراد بدل تحديثٍ انفجاري، وبقي كل إصدار صغيرًا بما يكفي للتراجع عنه.

سؤال إعادة الكتابة… بإجابة صادقة

إعادة الكتابة صائبة أحيانًا — حين تموت المنصة، أو يفقد الإطار دعمه، أو تسدّ البنية طريق العمل فعليًا. لم يكن شيء من ذلك صحيحًا هنا. ما تعبّر عنه غريزة إعادة الكتابة غالبًا هو أن قراءة كود الآخرين أصعب من كتابة كودك. هذا صحيح — وهو أيضًا صلبُ المهنة.

كلّف الاستلام جزءًا يسيرًا من كلفة إعادة الكتابة، وأبقى الإيراد يتدفق طوال الوقت، وحافظ على سنوات من معرفة الحالات الحدّية المخزنة في ذلك الكود "القبيح" — معرفة كانت إعادة الكتابة ستعيد اكتشافها حادثةَ إنتاجٍ تلو أخرى.

الخلاصة

إذا ورثت كودًا حيًّا: اجعل البناء قابلًا للتكرار قبل أي شيء، وارسم الخريطة قبل أن تُصلح، وافرز بحجم الضرر على العمل لا بترتيب التذاكر، وأبقِ كل تغيير بصغر ما تمليه مخاطرته، وعامل إعادة الكتابة كملاذ أخير له حالة عمل مقنعة — لا كغريزة أولى دافعها جمالي. العميل لا يحتاج كودًا جميلًا؛ يحتاج التطبيق الذي دفع ثمنه أن يعمل، وأن يستمر في العمل وهو يتحسن.

المقالة التالية

واجهات عربية RTL تصمد أمام لوحات التحكم والفواتير