التفكير الحاسوبي والبرمجة المرئية
درس 4 من 4
4التفكير الحاسوبي والبرمجة المرئية (Scratch)
قبل أي سطر كود نصي، هذا الجزء يبني حدسك حول "كيف يفكر المبرمج" بمعزل عن تعقيد الصيغة النحوية (syntax) لأي لغة.
ماذا تشاهد في الرسم: مسألة كبيرة تتفكّك، ثم تظهر أنماطها، ثم نجرّد ما لا يهم، فتبقى خوارزمية بخطوات واضحة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
قبل أن تتعلّم لغة برمجة مكتوبة، تتعلّم التفكير كمبرمج بقطع ملوّنة تسحبها وتركّبها مثل الليغو، كما في Scratch. لا أخطاء إملائية ولا فواصل منسية، فقط الفكرة: قسّم المشكلة، ولاحظ ما يتكرر، وتجاهل التفاصيل غير المهمة، ورتّب الخطوات.
التفكير الحاسوبي أربع مهارات: التفكيك decomposition، والتعرّف على الأنماط pattern recognition، والتجريد abstraction، وتصميم الخوارزميات. قطع Scratch تقابل بنى البرمجة النصية: الحلقات والشروط والمتغيرات والأحداث، ومنها تنتقل إلى الشيفرة الزائفة وجدول التتبع.
قبل أن تبدأ
🧩لا خلفية مطلوبة
هذا فعليًا نقطة البداية، الهدف تكوين حدس حل المشكلات قبل تعلّم أي صيغة برمجية.
🖱️التفكير بالسحب والإفلات
Scratch تستبدل كتابة الكود بتركيب قطع بصرية (Blocks)، هذا يعزل "منطق الحل" عن "تذكّر الصيغة".
الفكرة الجوهرية: التفكير الحاسوبي
التفكير الحاسوبي (Computational Thinking) ليس عن الحاسوب نفسه، هو طريقة تحليل أي مشكلة معقّدة لتصبح قابلة للحل بخطوات دقيقة لا تحتمل الغموض. المشكلة الحقيقية التي يحلّها هذا الأسلوب ليست "كيف أكتب الكود" بل "كيف أفكّر قبل أن أكتب أي كود أصلًا"، فالدماغ البشري لا يتعامل بثقة مع مشكلة كبيرة ومعقّدة دفعة واحدة، لكنه يتعامل بسهولة مع عدة مشكلات صغيرة ومحددة. أربعة أعمدة يتكرر استخدامها بهذا الترتيب تقريبًا في كل مشروع لاحق في هذا الدليل، وكل واحد منها يبني فعليًا على ما قبله:
1التفكيك (Decomposition)
تقسيم مشكلة كبيرة (مثل "لعبة متاهة") إلى أجزاء أصغر يمكن حلّ كل واحد منها على حدة (حركة اللاعب، اكتشاف الاصطدام، عدّ النقاط). الفائدة ليست فقط "تنظيمية"، كل جزء مفكَّك يصبح قابلًا للاختبار بمفرده: تستطيع التأكد أن حركة اللاعب تعمل بشكل صحيح قبل أن تضيف منطق الاصطدام فوقها، فإذا ظهر خطأ لاحقًا تعرف بالضبط في أي جزء من المنطق يكمن، بدل البحث في برنامج كامل متشابك لا تعرف من أين تبدأ تفكيكه.
2التعرّف على الأنماط (Pattern Recognition)
ملاحظة أن مشكلتين مختلفتين الشكل تُحلّان بنفس الفكرة، مثلًا "تكرار حركة" في لعبة قفز يشبه "تكرار عدّ" في حلقة for. هذا العمود يأتي منطقيًا بعد التفكيك مباشرة: بعد أن قسّمت المشكلة لأجزاء صغيرة، تسأل نفسك "هل سبق أن حللت جزءًا يشبه هذا؟"، فحص الاصطدام بين القط والفأر هو نفس منطق فحص اصطدام الكرة بالحارس في لعبة كروية؛ الاختلاف فقط في الرسمة الظاهرة، لا في منطق المقارنة بين إحداثيات العنصرين. التعرف على هذا التشابه يوفّر وقتًا هائلًا لأنك تعيد استخدام حل مُختبَر فعليًا بدل إعادة ابتكاره من الصفر في كل مرة.
3التجريد (Abstraction)
تجاهل التفاصيل غير المهمة والتركيز على ما يهم فعلاً لحل المشكلة، لا تحتاج تعرف كيف تُرسم البكسلات لتحرّك شخصية في Scratch. التجريد هو ما يسمح لعقلك بالتعامل مع مستوى واحد فقط من التفصيل في كل لحظة: عندما تحرّك شخصية، أنت تفكّر بمستوى "الموقع (س، ص) يتغيّر"، لا بمستوى "آلاف البكسلات التي يعاد رسمها على الشاشة ستين مرة في الثانية"، تلك التفاصيل يتولاها محرك Scratch نفسه خلف الكواليس بالكامل. بدون هذا التجريد، ستغرق في تفاصيل تنفيذية لا تخدم حل مشكلتك مباشرة، ولن تتقدّم في المنطق الفعلي أبدًا.
4تصميم الخوارزميات (Algorithm Design)
كتابة سلسلة خطوات دقيقة ومرتّبة تؤدي للحل، هذا بالضبط ما تفعله عند ترتيب قطع Scratch فوق بعضها. هذا العمود هو الناتج النهائي للثلاثة السابقة: بعد التفكيك والتعرّف على الأنماط والتجريد، تكتب الآن تسلسلًا لا يحتمل أي تفسير مزدوج، "حرّك القط نحو الفأر تقريبًا" غير قابلة للتنفيذ لأن "تقريبًا" غامضة؛ لكن "إذا كان موقع الفأر على المحور س أكبر من موقع القط، حرّك القط خطوة واحدة لليمين، وإلا حرّكه خطوة لليسار" قابلة للتنفيذ حرفيًا بلا أي قرار إضافي يحتاج الحاسوب اتخاذه بنفسه.
المهم أن تلاحظ أن هذه الأعمدة الأربعة ليست خطوات تُنفَّذ مرة واحدة وتُنسى، هي عدسة تعيد استخدامها في كل مشروع قادم في هذا الدليل، من ملفات الشل في الجزء الثالث إلى أشجار البحث الثنائية في الجزء التاسع. حين تجد نفسك تحدّق في مشكلة كبيرة لا تعرف من أين تبدأ حلّها، الترتيب العملي هو دائمًا نفسه: فكِّك أولًا، ثم ابحث عن نمط رأيته قبلًا، ثم تجاهل كل تفصيلة لا تخدم الحل المباشر، وأخيرًا صِغ الخطوات بدقة لا تقبل أكثر من تفسير واحد.
القطع الأساسية في Scratch ومقابلها النصي
| مفهوم Scratch (بصري) | ما يمثّله برمجيًا | مقابله النصي القادم |
|---|---|---|
| عند النقر على العلم الأخضر | نقطة بداية البرنامج (Entry Point) | if __name__ == "__main__": أو main() |
| كرر (Repeat) / كرر إلى الأبد | حلقة تكرارية (Loop) | for / while |
| إذا ... وإلا (If/Else) | تفرّع شرطي | if / else |
| البث والاستقبال (Broadcast) | التواصل بين أجزاء مستقلة من البرنامج عبر أحداث | Event Listeners / Callbacks |
| اجعل متغيّر | تخزين قيمة قابلة للتغيير | x = 0 |
| الاستشعار (Sensing: هل يلمس اللون X؟) | فحص حالة النظام واتخاذ قرار بناءً عليها | if collision_detected: |
شكل 1، كل قطعة مرئية في Scratch لها مرادف نصّي دقيق: ما تتعلّمه هنا لا "يُنسى" عند الانتقال للنص، بل يتغيّر شكله فقط.
مثال محلول: تفكيك مشكلة "لعبة القط يطارد الفأر"
لنطبّق أعمدة التفكير الحاسوبي الأربعة على مشكلة واحدة قبل أي تنفيذ:
| الخطوة | التطبيق على اللعبة |
|---|---|
| 1. تفكيك | حركة القط بالسهم، حركة الفأر العشوائية، فحص الاصطدام، عرض "خسرت" عند الاصطدام |
| 2. أنماط | "تحديث الموقع كل إطار" هو نفس نمط أي حلقة لعبة (Game Loop) بغض النظر عن نوع اللعبة |
| 3. تجريد | لا يهمك شكل الرسمة (Sprite) نفسها، فقط إحداثياتها (x, y) وحالتها |
| 4. خوارزمية | كرر إلى الأبد: [حرّك القط حسب مفتاح السهم] [إذا لمس القط الفأر: أوقف الكل] |
تعمّق: من الفكرة إلى الشيفرة الوهمية وجدول التتبع
تعلّمت في هذا الجزء أن حل المشكلة يبدأ بالتفكير لا بالكتابة. نفصّل هنا الجسر بين الفكرة والشيفرة: الشيفرة الوهمية (Pseudocode)، ثم تتبّع التنفيذ يدويًا في جدول، ثم المخطط الانسيابي، وأخيرًا فكرة البرمجة بالأحداث التي تقوم عليها مشاريع Scratch.
أولًا: الشيفرة الوهمية هي لغة بين البشر والآلة
الشيفرة الوهمية نص منظّم يشبه البرمجة لكنه لا يخضع لقواعد مترجم. هدفها أن تركّز على المنطق دون أن تنشغل بالفاصلة المنقوطة أو أسماء الأنواع. لكنها ليست حرة تمامًا: تعتمد على ثلاثة أنماط فقط يمكن بها بناء أي خوارزمية، وهي التسلسل (خطوة بعد خطوة)، والاختيار (إن تحقق شرط فافعل كذا وإلا فكذا)، والتكرار (كرّر ما دام الشرط صحيحًا). وكلما كانت الصياغة صارمة (اسم متغير واحد لكل معنى، وإزاحة ثابتة لما بداخل كل كتلة) كان الانتقال إلى C أسهل لأن C نفسها صارمة.
| النمط | الصياغة الوهمية | ما يقابله في Scratch | ما يقابله في C |
|---|---|---|---|
| تسلسل | اقرأ ثم احسب ثم اطبع | كتل متراصة تحت بعضها | أسطر متتابعة |
| اختيار | IF … THEN … ELSE … END IF | كتلة if/else | if / else |
| تكرار بشرط | WHILE … DO … END WHILE | كتلة repeat until | while |
| تكرار بعدد | FOR i FROM 1 TO n | كتلة repeat n | for |
ثانيًا: مثال أصلي بالشيفرة الوهمية
لنصف خوارزمية تحسب كم ورقة نقدية نحتاج لدفع مبلغ بأقل عدد ممكن من الأوراق من فئتين (5 و1). الخوارزمية مثال تعليمي مختلف عن تمارين المشروع، ونكتبها كما تُكتب الشيفرة الوهمية الصارمة:
SET amount TO 17
SET fives TO 0
WHILE amount >= 5 DO
SET amount TO amount - 5
SET fives TO fives + 1
END WHILE
SET ones TO amount
PRINT fives, onesثالثًا: جدول التتبع (Trace Table) هو آلتك الذهنية
الوسيلة الوحيدة المضمونة لفهم ما تفعله خوارزمية هي أن تنفّذها بيدك سطرًا بسطر وتسجل قيم كل متغير بعد كل خطوة. هذا ما تفعله أداة مثل Python Tutor لاحقًا في الجزء الخامس، لكنك هنا تفعله بالقلم. ابنِ جدولًا بعمود لكل متغير وصف لكل تكرار:
| الدورة | amount | fives | الشرط amount ≥ 5 |
|---|---|---|---|
| قبل الحلقة | 17 | 0 | صحيح |
| 1 | 12 | 1 | صحيح |
| 2 | 7 | 2 | صحيح |
| 3 | 2 | 3 | خطأ: توقف |
عندما يتوقف التكرار تكون amount تساوي 2 فتُطبع النتيجة: ثلاث أوراق من فئة 5 وورقتان من فئة 1. لاحظ أن الجدول كشف أمرًا مهمًا: الحلقة ضمنت أن amount تتناقص في كل دورة، ولذلك ستنتهي حتمًا. هذا السؤال (هل ينتهي التكرار؟) هو أول ما تتحقق منه في أي خوارزمية.
رابعًا: المخطط الانسيابي (Flowchart)
المخطط الانسيابي رسم للخوارزمية يفهمه من لا يعرف أي لغة. الرموز قليلة: شكل بيضاوي للبداية والنهاية، مستطيل لخطوة، معيّن لقرار له مخرجان على الأقل، وأسهم للتدفق. أي سهم يعود إلى الخلف يعني تكرارًا.
شكل 2، المخطط الانسيابي للمثال: السهم العائد من المستطيل إلى المعيّن هو الحلقة.
خامسًا: البرمجة بالأحداث في Scratch
في C ستكتب برنامجًا يبدأ من main وينفذ بالترتيب. أما في Scratch فالنموذج مختلف: لا يوجد "تسلسل واحد رئيسي" بل سكربتات كثيرة تنتظر أحداثًا. الحدث قد يكون ضغط العلم الأخضر أو مفتاحًا أو ملامسة جسم لآخر أو رسالة. وكتلتا broadcast وwhen I receive هما قناة اتصال: أي كائن يبث اسم رسالة فتستجيب كل السكربتات المشتركة في هذا الاسم. هذا نفس مبدأ واجهات المستخدم وتطبيقات الويب حيث لا يعرف المرسِل من المستقبِل، يكفي الاتفاق على اسم الحدث.
شكل 3، بث واحد يوقظ عدة مستقبِلين في الوقت نفسه.
سادسًا: حلقة اللعبة (Game Loop)
تعتمد الألعاب، من لعبة التخمين البسيطة إلى الألعاب الكبيرة، على حلقة تدور بلا توقف: اقرأ المدخلات، حدّث الحالة، ثم اعرض النتيجة. وفي لعبة تخمين رقم تتحول الحالة إلى متغيرات (الرقم السري، عدد المحاولات) والمدخلات إلى سؤال المستخدم، والخروج من الحلقة إلى شرط الفوز أو الخسارة. إدراك أن كل برنامج تفاعلي يدور على هذه الحلقة هو ما يجعل الانتقال من Scratch إلى C سلسًا.
شكل 4، حلقة اللعبة العامة: مدخل، تحديث، عرض، ثم قرار الاستمرار.
جرّب بنفسك
أي ركن من التفكير الحاسوبي يقسّم مشكلة «لعبة متاهة» إلى حركة اللاعب واكتشاف الاصطدام وعدّ النقاط؟
التفكيك (Decomposition) يقسّم المشكلة الكبيرة إلى أجزاء يُحلّ كل منها على حدة، وهو أول الأركان الأربعة.
لماذا لا تحتاج أن تعرف كيف تُرسم البكسلات لتحرّك شخصية في Scratch؟
التجريد يعني تجاهل التفاصيل غير المهمة والتركيز على ما يلزم لحل المشكلة.
ما الناتج النهائي للأركان الثلاثة السابقة (تفكيك، أنماط، تجريد)؟
بعد التفكيك والأنماط والتجريد تكتب الخطوات الدقيقة المرتّبة التي تؤدي للحل، وهو ما تفعله عند ترتيب قطع Scratch.
بطاقات مراجعة سريعة
تحقق من فهمك
لو أردت إضافة "نقاط" للعبة القط والفأر، أي عمود من أعمدة التفكير الحاسوبي يساعدك أكثر في تحديد متى وأين تزيد النقاط؟
التفكيك، لأنه يفصل "زيادة النقاط" كخطوة مستقلة (تحدث عند حدث معيّن، مثل لمس عنصر) عن بقية منطق اللعبة.
هل "كرر إلى الأبد" في Scratch يقابل for أم while في البرمجة النصية؟ ولماذا؟
يقابل while True:، لأن عدد التكرارات غير معروف مسبقًا ويستمر حتى يحدث شيء يوقفه، وهذا بالضبط استخدام while لا for.
في مثال الأوراق النقدية، لماذا تنتهي الحلقة حتمًا؟
لأن amount تتناقص بمقدار 5 في كل دورة، وتصل في النهاية إلى قيمة أقل من 5.
كيف يختلف بث الرسائل في Scratch عن استدعاء الدالة في C؟
البث لا يعرف مستقبليه ولا ينتظر ردًا، أما الاستدعاء فيحدد دالة بعينها ويعود إليها.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.