العودة إلى المدونة
أساسيات البرمجةقراءة ٦ دقيقة

أساسيات البرمجة التي يجب أن يتعلّمها كل مبرمج

الطبقة الكامنة تحت كل إطار عمل — التفكير من خلال البيانات، وبناء المنطق، واستخدام OOP بحُكم، واختيار هياكل البيانات، واستشعار التعقيد، والتنقيح كمنهج.

محتويات المقال

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

يغطّي هذا المقال تلك الطبقة. ولا شيء منها مرتبط بلغة أو إطار عمل، ولا شيء منها ينتهي صلاحيته حين تتبدّل المنظومة.

التفكير من خلال البيانات

معظم البرامج في جوهرها تحويل: بيانات تدخل، وشيء يحدث لها، وبيانات تخرج. والمطوّرون الذين يفكّرون بهذه الطريقة يكتبون شيفرة أوضح ممّن يفكّرون بمنطق خطوات تُنفَّذ، لأن شكل البيانات هو ما يخبرك عادةً بالشكل الذي ينبغي أن تكون عليه الشيفرة.

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

الأنواع توثيق تتحقّق منه الآلة

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

بناء المنطق

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

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

// Nested: the real work is buried three levels deep.
function publish(post, user) {
  if (user) {
    if (user.canPublish) {
      if (post.isComplete) {
        return save(post);
      }
    }
  }
  return null;
}

// Guarded: invalid cases leave first, the main path stays flat.
function publish(post, user) {
  if (!user) return null;
  if (!user.canPublish) return null;
  if (!post.isComplete) return null;

  return save(post);
}
السلوك نفسه واللغة نفسها. لكن النسخة الثانية يمكن قراءتها من الأعلى إلى الأسفل.

البرمجة كائنية التوجّه عملياً لا نظرياً

تُدرَّس الركائز الأربع — التغليف والوراثة وتعدّد الأشكال والتجريد — عادةً كتعريفات تُحفظ. لكن الأهم هو معرفة ما تكسبه من كل منها وما تدفعه ثمناً لها.

التغليف هو الأوضح عائداً. فحين تكون التفاصيل الداخلية خاصة، يمكنك تغييرها دون مراجعة قاعدة الشيفرة كلها، لأن ما بالخارج لم يكن مسموحاً له بالاعتماد عليها. وكل خاصية عامة هي وعد سيصعب عليك التراجع عنه لاحقاً.

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

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

هياكل البيانات وتكلفة الاختيارات

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

  • القراءة بالموضع، أو المرور على كل شيء بالترتيب — مصفوفة.
  • البحث بمفتاح فريد، أو التحقّق من العضوية بشكل متكرّر — خريطة تجزئة أو مجموعة.
  • المعالجة بترتيب الوصول، أو تأجيل العمل — طابور.
  • العكس أو التراجع أو تتبّع التداخل — مكدّس.
  • علاقات الأب والابن بعمق غير محدّد — شجرة.

والخطأ الكلاسيكي هو حلقة متداخلة فوق مجموعتين تنمو كلتاهما. وهو غير مرئي على بيانات الاختبار وقاتل في الإنتاج، وبمجرد أن تكتسب عادة ملاحظته، ستلتقطه أثناء الكتابة لا بعد وصول بلاغ من الدعم.

حسّ عملي بالتعقيد

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

وفي التطبيقات الحقيقية، لا تكون أكبر المكاسب خوارزمية عادةً على أي حال — بل تأتي من عدم أداء العمل من الأساس. فالاستعلام من قاعدة البيانات مرة واحدة بدلاً من مرة لكل صف داخل حلقة هو أشيع إصلاح للأداء في تطوير الويب، وهو رؤية عن التعقيد ترتدي زيّ ORM.

التنقيح كمنهج

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

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

الشيفرة النظيفة بلا تعصّب

الشيفرة النظيفة هي شيفرة يستطيع الشخص التالي تغييرها بأمان، والشخص التالي غالباً ما يكون أنت بعد ستة أشهر بلا ذاكرة لأسبابك. وبضعة أمور تحمل معظم الوزن: أسماء تقول ما هو الشيء أو ما يفعله، ودوال قصيرة بما يكفي لتستوعبها في ذهنك، وغياب منطق مكرّر يجب تغييره في عدة أماكن، وغياب حيل بارعة توفّر سطراً وتكلّف ساعة من الفهم، وتعليقات تشرح «لماذا» لا تعيد صياغة «ماذا».

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

كيف تتدرّب على هذه

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

  • Fundamentals
  • OOP
  • Data Structures
  • Clean Code
  • Debugging

أحمد العايدي

مطوّر Full-Stack

أبني أنظمة إنتاجية متكاملة — أنظمة Laravel الخلفية، وواجهات React و Next.js، وتطبيقات الموبايل، ولوحات التحكم، وواجهات API. وأكتب عن القرارات وراء الأنظمة التي تصل إلى مستخدمين حقيقيين.

اقرأ أيضاً

واتساب