Chapter 41: The Legacy - How to Read Other People's Code
الفصل 41: الإرث - كيف تقرأ كودًا لم تكتبه بنفسك
أهلاً بك في 90% من وظيفتك الحقيقية
لقد أمضيت شهورًا، وربما سنوات، تتعلم كيف تكتب الكود. كيف تبني. كيف تخلق من العدم. كل الدورات التعليمية، كل الكتب، ركزت على الصفحة البيضاء.
ثم تحصل على وظيفتك الأولى. في يومك الأول، يتم إعطاؤك الوصول إلى مستودع الكود (Code Repository). تفتحه بحماس، وتجد… وحشًا. مشروعًا عمره خمس سنوات، بمئات الآلاف من الأسطر، كتبه عشرات المطورين الذين غادر معظمهم الشركة. لا توثيق تقريبًا، والأسماء غامضة، والمنطق متشابك كأحجية قديمة.
هذه هي اللحظة التي يدرك فيها كل مبتدئ الحقيقة الصادمة: وظيفتك كمبرمج ليست كتابة كود جديد. هذه تمثل 10% من العمل، إن كنت محظوظًا. وظيفتك الحقيقية، 90% من وقتك، هي قراءة وفهم وتصحيح وتوسيع كود كتبه آخرون.
أنت لست مهندسًا معماريًا يبني ناطحة سحاب جديدة كل يوم. أنت عالم آثار، محقق، ومصلح. تُعطى مدينة قديمة وتُكلف بإصلاح نظام الصرف الصحي فيها دون أن تنهار المباني فوق رأسك.
هذه المهارة - قراءة الكود القديم أو “الإرث” (Legacy Code) - هي أهم مهارة منفردة تفصل بين المبرمج المبتدئ والمحترف الخبير. وهي مهارة لا تُدرّس في الجامعات أو المعسكرات التدريبية. هذا الفصل هو دليلك لتلك المهارة.
استراتيجية الساعة الأولى: من الفوضى إلى الخريطة
الشعور الأول عند رؤية قاعدة كود ضخمة هو الرغبة في الغوص عشوائيًا. لا تفعل ذلك. أنت تضيع وقتك وطاقتك. بدلًا من ذلك، اتبع هذه الخطة المنظمة في الساعة الأولى. هدفك ليس الفهم الكامل، بل رسم خريطة ذهنية أولية.
1. شغّل التطبيق (Run it): قبل أن تقرأ سطرًا واحدًا، شغّل المشروع. استخدمه. اضغط على كل زر. انظر ماذا يفعل. إذا كان واجهة خلفية (Backend)، استخدم أداة مثل Postman لإرسال طلبات إلى نقاط النهاية (Endpoints) الرئيسية. لا يمكنك فهم الكود إذا كنت لا تعرف ماذا يفترض به أن يفعل.
2. اقرأ ملف README.md: قد يكون قديمًا، قد يكون غير مكتمل، لكنه أفضل نقطة بداية. ابحث عن تعليمات الإعداد (Setup Instructions)، ووصف البنية العامة، وأي أوامر مهمة.
3. افحص التبعيات (Dependencies): افتح ملف package.json (لـ Node.js) أو requirements.txt (لـ Python) أو pom.xml (لـ Java). هذه هي قائمة المكونات الجاهزة التي يستخدمها المشروع. هل يستخدمون Express أم Django؟ React أم Vue؟ هل هناك مكتبة غريبة لم تسمع بها من قبل؟ معرفة الأدوات المستخدمة يخبرك بالكثير عن فلسفة المشروع.
4. جد نقطة الدخول (Entry Point): أين تبدأ رحلة الكود؟ في تطبيق Node.js، غالبًا ما يكون ملف index.js أو server.js. في تطبيق Java، ابحث عن دالة public static void main. في تطبيق ويب أمامي، ابحث عن الملف الذي يستدعي ReactDOM.render أو createApp. من نقطة الدخول، يمكنك تتبع التدفق العام للتطبيق.
5. كن مؤرخًا: اقرأ git log: استخدم أمر git log --oneline -n 20 لترى آخر 20 تعديلاً على المشروع. من هم المطورون النشطون؟ ما هي الأجزاء التي يتم تغييرها بشكل متكرر؟ هذا يعطيك فكرة عن “المناطق الساخنة” في الكود والمطورين الرئيسيين الذين قد تحتاج إلى سؤالهم لاحقًا.
بعد هذه الساعة، لن تكون خبيرًا في المشروع، لكنك لن تكون تائهًا. سيكون لديك خريطة أولية، بوصلة، وفكرة عن الاتجاه الذي يجب أن تسلكه.
أدوات عالم الآثار البرمجي
الآن بعد أن أصبحت لديك خريطة، حان وقت الحفر. أنت لا تحتاج إلى فأس، بل تحتاج إلى أدوات دقيقة. محرر الكود (Code Editor) الخاص بك ليس مجرد أداة كتابة، بل هو مختبرك الجنائي.
1. “الانتقال إلى التعريف” (Go to Definition) هو صديقك الأفضل: هذه هي الميزة الأكثر استخدامًا لديك. ترى استدعاء دالة (Function Call) ولا تعرف ماذا تفعل؟ انقر عليها بالزر الأيمن واختر “Go to Definition”. هذا يسمح لك بالقفز عبر قاعدة الكود مثل الأرنب، متبعًا مسار المنطق من دالة إلى أخرى. إنها الطريقة التي تحول بها الكود من نص ثابت إلى شبكة حية ومترابطة.
2. المصحح (Debugger) هو مجهرك:
الـ console.log أو print() جيد، لكن المصحح (Debugger) يغير اللعبة. ضع “نقطة توقف” (Breakpoint) في بداية وظيفة معقدة. شغّل الكود. سيتوقف التنفيذ عند تلك النقطة، ويمكنك رؤية قيم كل المتغيرات في تلك اللحظة. يمكنك بعد ذلك “التقدم خطوة بخطوة” (Step Over) عبر الكود، سطرًا بسطر، ومشاهدة كيف تتغير الحالة. إنه مثل مشاهدة تشريح حي للبرنامج. استخدام المصحح هو الفارق بين تخمين ما يفعله الكود ورؤيته بالفعل.
3. البحث الشامل (Global Search) هو كلبك البوليسي:
هل تريد أن تعرف أين يتم استخدام متغير معين أو من أين تأتي قيمة ما؟ استخدم ميزة البحث في المشروع بأكمله (عادةً Ctrl+Shift+F أو Cmd+Shift+F). ابحث عن اسم الدالة، أو اسم متغير، أو حتى سلسلة نصية تظهر على الشاشة. هذا يساعدك على العثور على جميع الأماكن ذات الصلة بسرعة، مما يمنحك صورة كاملة عن تأثير أي تغيير قد تقوم به.
4. تصور بنية البيانات: إذا كان المشروع يستخدم قاعدة بيانات، فاستخدم أداة لتصور المخطط (Schema). انظر إلى الجداول، الأعمدة، والعلاقات بينها. فهم كيفية تنظيم البيانات هو اختصار لفهم 50% من منطق التطبيق. البيانات هي قلب أي نظام؛ الكود هو مجرد الأوعية الدموية التي تتدفق من خلالها.
هذه الأدوات تحولك من قارئ سلبي إلى مستكشف نشط. لا تقرأ الكود فقط، استجوبه، وشرحه، وتتبعه.
العقلية الصحيحة: كن محققًا، لا ناقدًا
الأداة الأهم ليست في محرر الكود الخاص بك، بل بين أذنيك. عقليتك تحدد ما إذا كانت هذه التجربة محبطة أم فرصة تعلم هائلة.
الخطأ الأول للمبتدئين: فتح كود قديم والقول فورًا، “يا إلهي، هذا فظيع. من كتب هذا الهراء؟ يمكنني إعادة كتابته بشكل أفضل في يومين.” هذه غطرسة خطيرة.
العقلية الصحيحة: عقلية المحقق.
-
افترض النية الحسنة والذكاء: لا تفترض أن المطور الأصلي كان غبيًا. افترض أنه كان ذكيًا مثلك تمامًا، لكنه كان يعمل تحت ضغوط وقيود لا تعرفها. ربما كان لديه موعد نهائي مستحيل. ربما تغيرت متطلبات العمل ثلاث مرات في أسبوع. ربما كانت المكتبة التي استخدمها هي الخيار الوحيد المتاح في ذلك الوقت. ابحث عن “لماذا” وراء الكود، وليس فقط “ماذا”.
-
لا تهرع إلى إعادة الكتابة (Rewrite): الرغبة في مسح كل شيء والبدء من جديد هي فخ. يُعرف هذا بـ “إعادة الكتابة الكبرى” (The Big Rewrite)، وهي غالبًا ما تفشل. قبل أن تفكر في إعادة كتابة سطر واحد، يجب أن تفهمه تمامًا. كما يقول المثل: “لا تهدم سياجًا حتى تعرف سبب بنائه”.
-
كن عالمًا: قم بإجراء تجارب صغيرة: أفضل طريقة لفهم جزء من الكود هي تغييره قليلاً ورؤية ما يحدث. قم بتغيير تسمية (Label) على زر. أضف تعليقًا. غير قيمة ثابتة. ثم قم بتشغيل الاختبارات (Tests). هل انكسر شيء؟ إذا كان الأمر كذلك، فقد تعلمت شيئًا عن تبعيات هذا الجزء. هذه التغييرات الصغيرة والآمنة تبني فهمك وثقتك تدريجيًا.
-
اشرحه لشخص آخر (أو لبطة مطاطية): تقنية “شرح البطة المطاطية” (Rubber Duck Debugging) ليست فقط لتصحيح الأخطاء، بل للفهم أيضًا. حاول أن تشرح بصوت عالٍ كيف يعمل جزء من الكود. ستجد نفسك تتوقف عند قول “ثم بطريقة ما، نحصل على هذه النتيجة…”. هذه “الطريقة ما” هي بالضبط الفجوة في فهمك التي تحتاج إلى سدها.
قراءة الكود القديم ليست معركة ضد مطور آخر. إنها حوار مع الماضي. كن محترمًا، فضوليًا، ومنهجيًا، وستكشف الأسرار.
الإرث هو أعظم معلميك
قد يبدو الكود القديم وكأنه عبء. لكن في الحقيقة، هو كنز. كل سطر من الكود الذي لم تكتبه هو درس مجاني.
- سترى أنماط تصميم (Design Patterns) تم تطبيقها في العالم الحقيقي، وليس في كتاب مدرسي.
- سترى اختصارات وحلولاً عملية (Workarounds) تم إجراؤها تحت الضغط، وستتعلم متى يكون “الجيد بما فيه الكفاية” هو القرار الصحيح.
- سترى أخطاءً فادحة أدت إلى مشاكل كبيرة، وستتعلم ألا تكررها أبدًا. هذه هي الدروس التي لا تُنسى.
- عندما تصلح خطأً في نظام معقد، فإن فهمك لهندسة البرمجيات ينمو عشرة أضعاف مقارنة ببناء تطبيق “قائمة مهام” من الصفر للمرة المائة.
إتقان فن قراءة الكود يحولك من مجرد “كاتب كود” إلى “مهندس برمجيات”. يمنحك القدرة على الانضمام إلى أي فريق، في أي شركة، والمساهمة بشكل هادف. يجعلك لا تقدر بثمن.
لذا في المرة القادمة التي تواجه فيها قاعدة كود قديمة ومرعبة، لا تيأس. ابتسم. لقد تم تسليمك مفاتيح المملكة. كل ما عليك فعله هو تعلم كيفية استخدامها.
في الفصل القادم: سنتحدث عن أكبر تغيير في كيفية كتابتنا للكود منذ اختراع المترجم (Compiler) نفسه. سنتناول عصر الذكاء الاصطناعي، وكيفية البرمجة جنبًا إلى جنب مع مساعدين مثل Copilot و ChatGPT.