كنت أريد أن أعلم الفرقة الأولى شيئاً عن البرمجة الشيئية (OOP).
في المحاضرة الأولى لم اتطرق للـclasses اصلاً، بل كان كلامي عن الـobjects. في ذلك اليوم تعلم الطلبة ان البرنامج مكون من "كائنات" أو "أشياء"، وأن هذه الأشياء تعبر عن اجزاء مختلفة من البرنامج مثل أزرار، موظفين، أو حتى algorithms متنوعة، وأن الأشياء تتعامل مع بعضها عن طريق ارسال رسائل لبعضها البعض، ووسيلة تنفيذ الرسالة اسمها method، وكل كائن مسؤول عن الاستجابة بطريقته.
هذه هي الفكرة الكبيرة للبرمجة بالأشياء: البرنامج مكون من أشياء، وهي تتبادل الرسائل! كل شيء آخر عبارة عن تفاصيل. هناك لغات شيئية لا يوجد بها inheritance، ولا حتى classes، مثل JavaScript أو Self.
ماذا عن الديموقراطية؟ بالنسبة لي الفكرة الكبيرة هي "انتزاع السلطة من القلة وإعطاؤها للكثرة". ربما يكون هذا بصورة انتخابات، أو بشيء مثل الديموقراطية التشاركية، أو بتمكين المجتمع المدني، لكن الفكرة الكبيرة ليست في هذه التفاصيل.
أنا لست خبيراً سياسياً، وهذا الرأي رأي شخصي، لكن حتى لو فكرتي الكبيرة خاطئة، فهناك حتماً فكرة كبيرة أخرى!
الفكرة الكبيرة وراء منهج البحث العلمي (أيضاً رأي شخصي): لا تكتفِ بالرأي البشري أو أن يبدو الكلام "منطقياً"، الجأ للتجربة والملاحظة. احرص على إجراء التجربة بشكل صحيح.
ماذا عن الفكرة الكبيرة وراء البرمجة؟ يقول David Harel هذا الملخص:
Programming is not about doing; it's about causing the doing
كنت قد عبرت ذات مرة عن شيء مثل هذا: لو قررت، بدلاً من حلب البقرة، أن تخترع جهازاً لحلب الأبقار، فهذه هي البرمجة.
هل معنى ذلك ان التفاصيل ليست مهمة؟ لا بالطبع، فجملة مثل "جهاز حلب الأبقار" لن تجعلني مبرمجاً، لكن البحث عن الفكرة الكبيرة له فوائد عديدة: إنه يعطيك فرصة لتحديد المعنى لما تفعل، والفرق بين هذا المجال والمجالات الأخرى المتعلقة به. ويجعلك في نفس الوقت تخرج عن المألوف، مثلاً البحث عن طرق مختلفة للبرمجة غير كتابة الكود في محرر نصوص، أو البحث عن سبل أخرى لتطبيق الديموقراطية غير الانتخابات. لقد خرجت من قيد الارتباط بأفكار تفصيلية معينة.
البرمجة ليست كتابة كود، وليست حتى "كود في صور أخرى" مثل الرسوم. البرمجة هي ان تضع وصفاً أو وسيلة لتحقيق الهدف بحيث يمكن أن يأتي عامل (بشري أو جهاز) يفسر تلك الخطة وينفذ الهدف. قد "ابرمج" الروبوت ان يحرث الأرض بأن احرث امامه، أو أبرمج نظاماً للذكاء الاصطناعي بأن اصف له بعض القواعد، أو بكتابة الكود، لكن الفكرة الكبيرة مازالت موجودة.
طبعاً هناك دور محوري لموضوع "الفكرة الكبيرة" في التعليم. أعتقد ان جزءاً مهماً من مشاكل التعليم يكمن في خلط النقاط الأساسية بالنقاط الثانوية. ذات مرة فتحت كتاباً لتعليم البرمجة في المنهج الرسمي لأحد المراحل الدراسية المصرية، فوجدت
الفصل الأول: أنواع البيانات
عدد صحيح / Integer / من -2,147,483,648 إلى 2,147,483,647
قيمة منطقية / Boolean / تأخذ true أو false
قيمة احادية الدقة / Single / ...
عدد صحيح / Integer / من -2,147,483,648 إلى 2,147,483,647
قيمة منطقية / Boolean / تأخذ true أو false
قيمة احادية الدقة / Single / ...
هذه ليست البرمجة!
ولهذا فإني في لغة كلمات حاولت تقليل التفاصيل المطلوبة لبدء البرنامج: لا يوجد ضرورة للإعلان عن أنواع متغيرات، ولا دالة main، ولا الزام بعملية include. الإمكانات القوية موجودة لمن يريدها، لكنها لا تحول بين الطفل وبين الأفكار الاساسية للبرمجة.
ونرجع لأول محاضرة قدمتها في تدريب OOP: بدأت بنماذج لبرامج شهيرة (MS Word, Paint, Age of Empires). ما هي الكائنات في مثل هذه البرامج؟ كيف تتفاعل؟
ثم قدمت امثلة على صنع كائنات جديدة، استدعاء methods منها، تحديد properties. أليس هذا هو الهدف من كل شيء أصلاً؟ الفصائل، الوراثة...الخ، ما هي إلا أدوات لتنظيم وتسهيل الأهداف الاساسية. ثم في محاضرات لاحقة بدأنا الدخول في التفاصيل.