الجمعة، 29 يونيو 2012

ابحث عن الفكرة الكبيرة!

كنت أريد أن أعلم الفرقة الأولى شيئاً عن البرمجة الشيئية (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 / ...

هذه ليست البرمجة!

ولهذا فإني في لغة كلمات حاولت تقليل التفاصيل المطلوبة لبدء البرنامج: لا يوجد ضرورة للإعلان عن أنواع متغيرات، ولا دالة main، ولا الزام بعملية include. الإمكانات القوية موجودة لمن يريدها، لكنها لا تحول بين الطفل وبين الأفكار الاساسية للبرمجة.

ونرجع لأول محاضرة قدمتها في تدريب OOP: بدأت بنماذج لبرامج شهيرة (MS Word, Paint, Age of Empires). ما هي الكائنات في مثل هذه البرامج؟ كيف تتفاعل؟

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

البرمجة، وقوالب الطوب، والحلم المختفي

لماذا أحب الكمبيوتر؟ في الثمانينات وانا في المدرسة رأيت برنامجاً للرسم يعمل على الكمبيوتر المنزلي. لا اعرف نوع الجهاز تحديداً لكن اعتقد أنه BBC Micro. كانت الأجهزة في تلك الفترة متقاربة على أي حال.

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

لقد كانت لحظة فارقة في حياتي. انا اعتبر نفسي إنساناً مبدعاً لكني كسول؛ والآن هناك آلة تقوم بالعمل الممل وتترك لي العمل الإبداعي! هذا يغير أشياء كثيرة. ولهذا أحببت الكمبيوتر.

هل تعرف ما هي إمكانات جهاز BBC Micro؟ إن سرعته هي 2 ميجاهرتز (وليس جيجا). الذاكرة من 32 كيلوبايت، والمعالج 8 بت.

ثم ننظر لهذا النظام (Sketchpad) وهو موضوع رسالة الدكتوراة للباحث Ivan Sutherland في الستينات.



النظام ليس فقط مبهر بالنسبة للفترة التي ظهر فيها، إنه مبهر حتى الآن! الشيء الذي يهمني في هذا المثال هو انه يستغل إمكانات الكمبيوتر الحسابية ليقوم بكثير من العمل بدلاً من الإنسان: هل تريد هذه الخطوط متوازية؟ هل تريدها متعامدة؟ هل تريد هذه النقاط على استقامة واحدة؟ فقط اطلب هذا من الحاسوب!

ثم ننظر إلى برامجنا الحديثة: برنامج Word مثلاً، فنجده انه يشبه في أساسه آلة كاتبة الكترونية. إنه يسمح لك بتنسيق كلامك، نعم، وبتعديله بعد كتابته، وبإدراج جداول ورسومات بيانية بل وأفلام فيديو، لكنه الهدف الأساسي..الكتابة؛ هذا متروك لك!
  • لو كنت تؤلف قصة فعليك أن تتابع أنت حالة كل شخصية وموقفها.
  • لو كنت تكتب مقالاً فمسؤوليتك تنظيم أفكارك.
  • لو كنت تكتب كتاباً فعليك مسؤوليات كثيرة؛ غالباً ما ستسجل في ورقة جانبية الفكرة العامة لكل فصل، والمصادر الخاصة بكل فصل، والأفكار التي أنت متأكد منها مقابل ما ينبغي مراجعته...الخ...الخ...
  • لو كنت تكتب documentation فعليك مسؤوليات أكثر.
  • لو كنت تكتب شعراً فعليك مراعاة الأوزان بنفسك.
طب إيه لزمة الكمبيوتر بقى؟؟؟؟

ننظر أيضاً لبرامج الرسم؛ سأركز على البرامج 2D حالياً: برنامج مثل Inkscape يسمح بعمل تدرجات للألوان، ويسمح باستخدام منحنيات بيزييه، ويسمح بأن تكون الخطوط مثل قلم حبر أو رصاص أو فرشاة. ويسمح بعمل أشكال ثلاثية الأبعاد. لكنه لا يساعدني أن أرسم!

مشاكلي في الرسم تشبه الآتي:
- لقد رسمت يداً تمسك بسيف، أي الخطوط أمسحها لكي اجعل الأصابع التي أمام السيف تظهر، والتي وراء السيف لا تظهر؟
- أريد أن اصمم الشكل (شخص، حصان، سيارة) من مكونات هندسية أساسية (متوازي مستطيلات، شكل كروي) ثم احولها تدريجياً للشيء المطلوب رسمه.
- أريد أن أضبط تعبيرات الوجه.
- أريد أن اسجل نسب الجسم الخاصة بشخص (نسبة الرأس للبدن للسيقان..) لكي يكون الشخص بنفس النسب كلما رسمته.
- أريد ان ارسم قصص مصورة بدون تكرار للعمل.

لماذا لا تساعدني أيها الحاسوب؟؟

ثم ننظر للبرمجة. لماذا لا يساعدني الكمبيوتر؟ إنه يعطيني محرراً أكتب فيه، ثم يسكت! على الأقل أدوات مثل Eclipse هي خطوة في الاتجاه الصحيح. هب أنني غيرت عدد الـparameters في دالة. يقوم Eclipse وقتها بتنبيهي إلى كل أماكن استدعاء الدالة لكي اضيف فيها الـparameter الإضافي. ولو كانت الدالة معرفة في class، فهو يقوم بتنبيهي لكل فصيلة فرعية تعيد تعريف الدالة لكي أغيرها أيضاً..

هكذا يكون الكمبيوتر الشاطر: يقوم بكل عمليات البحث والمطابقة - تلك العمليات المملة - لكي لا احتاج أنا الإنسان أن اقوم بها.

(الظريف ان بعض المبرمجين يتباهون بعدم احتياجهم لمثل هذه الأدوات.)

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

إن أجهزة الكمبيوتر الموجودة في الثمانينات كانت إمكاناتها لا تذكر مقارنةً بالأجهزة الحديثة، لكن البرامج القديمة، كثيراً ما أشعر انها كانت "ألذ" بكثير. لقد تغيرت نظرة المبرمجين للعلاقة بين الكمبيوتر وصاحبه؛ قديماً كان هناك تركيز كبير على فكرة "الكمبيوتر يقوم بالأشياء المملة لكي يقوم الإنسان بالأجزاء المهمة"، الآن يبدو وكأن الشخص هو خادم الكمبيوتر وليس العكس: تحديث الويندوز، الكشف عن الفيروسات، تركيب SVN/IDE/JVM/Maven....الخ قبل أن تبدأ البرمجة.

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

وعموماً مازال هناك البعض يحمل الفكرة: مثلاً برنامج Scrivener هو منسق للكلمات يساعدك فعلاً على تنظيم أفكارك وليس مجرد تغيير شكل الخطوط وأحجامها. برنامج Sketchup يساعد بالفعل على التعبير عن افكارك بطريقة رسومية بسرعة. هناك جيل جديد من الأدوات البرمجية يحاول ان يقوم بالأشياء "المملة" بدلاً من المبرمج.

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

أعتقد أن جزءاً من سبب المشكلة قد يكون التفريق بين "المطور" و"المستخدم". لقد تعلمنا في الجامعة أن هندسة البرمجيات تبدأ بجمع متطلبات البرنامج requirement analysis وتنتهي بصيانة البرنامج. لكن في الستينات، السبعينات، الثمانينات، كان كثيراً ما يكون المطور والمستخدم هما نفس الشيء. كان الإنسان يبرمج لنفسه أولاً.

الأربعاء، 27 يونيو 2012

كلمات والأطفال: بعض النتائج التجريبية (5)

في صورة ملاحظات سريعة، لكن مفيدة:

علمته اليوم control flow باستخدام goto. كانت ظريفة وسلسة. أحد القرارات الصحيحة مني: قدمت مثالاً به أكثر من "علامة" في نفس البرنامج، وقدمت امثلة على goto للأمام (skipping code) وgoto للخلف (repetition). اول مثال كان infinite loop لكي لا احتاج لشرح goto مع if من المرة الأولى.

حين كنت أشرح goto وسألته كيف يتصرف البرنامج هنا، قال "لو شغلنا المراقب العجيب حيحصل كذا.." وقصده "لو عملنا trace للبرنامج حيحصل كذا". شيء مثير للاهتمام جداً!

دع الطفل يجرب التفاصيل غير البرمجية ويستمتع بيها...مثلاً يختار نصوص ظريفة في الرسائل التي يعرضها على الشاشة.

قال لي "امر اقرأ بيجي دايماً قبل اطبع صح؟"، هذا لأن كل البرامج التي اخذها من قبل فيها هذا النمط. حرصت ان اظهر ان البرمجة بها حرية ان تقول أي اوامر بأي ترتيب، وان المهم في النهاية هو ان تحقق هذه الأوامر الهدف المطلوب. وجربت مثالاً امامه يأتي فيه "اطبع" قبل "اقرأ".

صار يفعل مثلي: يكتب جزءاً من البرنامج ويجرب تنفيذه، ثم يكتب المزيد، وهكذا. لا أعرف إن كان هذا بسبب الاقتداء بي أم بسبب الخبرة (ان معظم البرامج لا تكون صحيحة من اول مرة). يحتاج الأمر لتجارب للإجابة :)

بدأت أعلمه استخدام الـfunctions (وليس تعريفها) لأسباب عملية: كان البرنامج اكثر من مرة لا يعطي النتيجة الصحيحة بسبب وجود مسافات في أول أو آخر المدخلات، فعلمته دالة تقليم(س).

حاولت اشرح له boolean values، بس حاسس انها abstract أكثر من اللازم. مش متعودين كأشخاص ان "صح" و"خطأ" تكون قيم منفصلة عما تصف.

Nested ifs are a problem too, the concept of "an if statement, like any other statement, can be inside an if'" is not directly understood.

حاولت برضه اعلمه القواميس (وهي مثل الـhashtables)، فهم القواميس نفسها كان سهلاً، لكن كانت هناك مشكلتان: (1) مشاكل في شرح عملية lookup نظراً لتعقيدها وعدم وجود تشبيه مشهور يمثلها (2) لم أجد طريقة لقراءة التعبير س[أ]، فكنت كل مرة اقول "س القوسين أ" أو ما شابه :(

بالمرة اخذته في جولة سريعة في موضوع الـgraphics، إمكانية "اظهار الإحداثيات" في كلمات نفعت جداً. أنا سعيد اني اضفتها. رسمنا مثلثاً بأمر ارسم.خط.

من التجربة أدركت أيضاً أهمية لغة مثل "كلمات"، هناك أشياء كثيرة صممت فيها لأهداف تعليمية، ولا توجد في كثير من اللغات الأخرى،...ونفعت!

الثلاثاء، 19 يونيو 2012

افكار محمد سامي لمشاريع التخرج، 2012-2013

أفكار ماضية
  • هنا حوالي 30 فكرة مشروحة عن دعم اللغة العربية وجهاز "أوراق": الصفحة هنا.
  • وهذه فكرة عن برنامج Sketchcode، تجدها هنا.
ثم نأتي للأفكار الحديثة...

Augmented reality RTS game

I had a dream where I was in a room, playing a real time strategy game (like Red Alert or Age of Empires). The whole room was the play area: The map was the floor, you stood and gave voice orders to your army, pointing with your finger where the soldiers should attack, build, move...etc

Sounds fun, right? Why not build it? It would have a set of ready-made voice commands, but that is a small part; the big part is computer vision to recognize at which point on the map the user is pointing with their fingers; and the design of the game itself to be usable under those conditions.

Since we can't afford an LCD display to cover the whole floor, we could search for another way like a datashow projector & playing on the wall instead of floor; or augmented reality glasses.


مروة والروبوت - لعبة برمجية

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

3D Logo Turtle with augmented reality

Logo is a well-known language for teaching children programming; it features a small character, the turtle, which the user programatically moves to draw shapes and make games. I suggest using augmented reality (where a video camera takes a scene and adds other computer-generated elements) to make a 3D turtle where the child writes code to add things to a real-worlds scene: to draw on walls, carpets, or people.

Sketch-based keyframe animation

The program takes a sketch composed of keyframes + some cues (like movement lines) and creates an animation. The input should be allowed to be more interesting and realistic than this illustration.

Web-based Kalimat IDE

Kalimat is a (desktop) Arabic-based programming language for teaching children programming. Another educational programming language is MIT Scratch. Scratch allows children to share their programs and run them online in a Youtube-like site, and their new version the child does the programming itself online in the browser. Why not have the same experience for Kalimat?

Also, I have some ideas for an improved version of Scratch itself, we can talk about the details if you like :)

Cloud-based personal DBMS

 A cloud version of a personal or small-business database like Microsoft-Access: Access has allowed a lot of non-programmers (doctors, lawyers, housewives...) to create their own applications to manage work and life. Access provides those features for users:
  • Simple data design and entry
  • Forms and reports
  • Application development with VBA (a special version of visual basic).
We suggest a tool to do the same through a web-browser: ability to design and add data, create forms for the same or other users to fill-in, and generate reports; and finally to enable custom application development with JavaScript.

This is much bigger than Google spreadsheets. Google's application focuses on simple data entry and calculation, you cannot, say, create a photo-album application with it, or manage a supermarket's customers. Our project can :)

الاثنين، 11 يونيو 2012

كيف تكتب كود تبدو عربية؟

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

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

العوامل parameters تكون معرفة لا نكرة
مثلا في هذا الإجراء:
إجراء ارسم(الشكل):
اعرض(الشكل)
لون(الشكل)
حرك(الشكل)
نهاية
أعتقد ان السبب الآن واضح لماذا نفعل ذلك!

عندما تريد ان تتأكد أن اكثر من قيمة خطأ، استخدم "ليس/ولا" بدلاً من "اذا ليس كذا وأيضا ليس كذا"
إذا ليس الرصيد.منته() وأيضا ليس الصلاحية.منتهية() وأيضا ليس الشريحة.مسروقة():
نفذ المكالمة()
تم

إذا ليس الرصيد.منته() ولا الصلاحية.منتهية() ولا الشريحة.مسروقة():
نفذ المكالمة()
تم
اسم الدالة يدل على القيمة التي ستعود بها، وليس العمل الذي تقوم به
ب = "الشجرة الخضراء في الحديقة الغناء"
اطبع فصص(ب)

ب = "الشجرة الخضراء في الحديقة الغناء"
اطبع تفصيص(ب)

لكن اسم الإجراء (void function) يدل على العمل الذي يقوم به، ويأخذ صورة فعل الأمر
قراءة.البيانات()
حساب.الحسبة()
طباعة.النتائج()

اقرأ.البيانات()
احسب.الحسبة()
اطبع.النتائج()
ماذا لو كانت الدالة معرفة داخل فصيلة class وتعود بقيمة؟ في تلك الحالة استخدم صيغة بدل الاشتمال
أ = الموظف : هات.المرتب()
أ = الموظف: مرتبه()

ص = الصورة: تدوير()
ص = الصورة: تدويرها()
مذكر ام مؤنث؟ حسب اسم الفصيلة، لأنه لو كانت الفصيلة مثلاً "سيارة" فغالباً سوف نتحدث عن الكائنات منها بصورة س، سيارة1، السيارة...الخ، فسنسمي الدوال مثلاً "سرعتها"، "لونها".

عند تعريف بيانات داخل فصيلة fields، تذكر انها ستستخدم بصيغة الإضافة
فصيلة موظف:
له الاسم، المرتب
له المدير، المساعد
تم
م = اقرأ.موظف( )
الاسم المساعد المدير م = "ميشو"

فصيلة موظف:
له اسم، مرتب
له مدير، مساعد
تم
م = اقرأ.موظف( )
اسم مساعد مدير م = "ميشو"

بالمناسبة، لا ارى مشكلة في تعبير مثل "س النقطة، ص النقطة"، قياساً على "عين الفعل، لام الفعل" في علم الصرف.

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

ماذا عن اسماء البيانات المكونة من اكثر من كلمة؟

لو كان اسم البيان اصلا في صورة اضافة، مثل "رقم جلوس"، فاستخدمه كما هو:
أ = رقم.جلوس م
لكن لو كان اسماً وصفة، مثل "السرعة النسبية"؟ ليس لدي اجابة محددة. يمكنك ان تستخدمه كما هو:
أ = السرعة.النسبية م
وتقرأها "السرعة النسبية الخاصة بـ م"

أو يمكنك أن تسميه سرعة.نسبية وحين تقرأ السطر التالي:
أ = سرعة.نسبية م
تقرأه "سرعة م النسبية".

القاعدة المختصرة

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

هل لاحظت ان هذا المقال يبدو كمقال عن النحو لا فقط البرمجة؟ هذا لأن كلمات لغة البرمجة العربية الجميلة

الجمعة، 8 يونيو 2012

الإبداع الذي كان

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

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

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

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

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

لقد ابتكرت الطفلة وسيلة جديدة لتحقيق اهدافها، لم تكن مسبوقة.لقد كانت مخترعة وهي في المرحلة العمرية الاولى، المرحلة الفرعية الخامسة، من سن 12 شهر حتى 18.

وإني أرى الناس في سن 18 سنة وقد نسوا تماماً ماذا تعني "فكرة مبتكرة غير مسبوقة". حين يتحدثون عن النهضة لابد من "تجربة" لتقليدها، ماليزية او تركية او برازيلية. حين نقول "حلول مبدعة" نقصد ابدعها آخرون: تصدير البرمجيات كما فعلت الهند، تحرير اكاديمي تقليداً لـ"أكاديمي" اخرى. ليس التقليد خطأ ولا الاستفادة من خبرات الآخرين - لكن التقليد كوسيلة حصرية للتقدم؟ سوف نكون فرضنا على انفسنا فرضاً ان يسبقنا من نقلدهم. ليس لأنهم بالضرورة افضل منا عملاً ولكن لأننا دائماً بانتظار الافكار منهم.
s
وحين ارى الجامعيين يتعلمون البرمجة، اشفق عليهم. لقد علمهم تراكم سنين في المدارس المصرية ان كل مشكلة لها حل جاهز، وكل ما عليهم هو تطبيق الحل الجاهز على المشكلة الجاهزة. والبرمجة هي العكس تماماً: البرمجة هي ان تخترع حلاً جديداً في كل مرة تكتب فيها برنامجاً. ولكي ينجح الطالب لابد ان يمر بمرحلة يلقي فيها من على اكتافه حمولة المدارس المصرية من الافكار الخاطئة، ويعود لجذوره الاختراعية كإنسان يفكر ويبتكر منذ الطفولة.

ثم نتحدث، في الفصل الرابع من الكتاب، عن المرحلة قبيل العملية (Pre-operational، والتعريب من عندي وليس بالضرورة دقيقاً) من سن 2 إلى 7 سنوات.

يتحدث الكتاب عما يسمى representation، أي اتخاذ شيء ليمثل شيئاً آخر (مثلاً اللعب بقطعة خشب كأنها سيارة). يقول الكتاب انه هناك خمسة طرق لهذا التمثيل يمارسها الطفل في تلك الفترة:
  • التقليد المؤجل: ان يحاكي الطفل موقفا قد حدث بعدها بمدة، مثل ان يلعب مع نفسه لعبة كان يمارسها معه اهله.
  • اللعب الرمزي: مثل مثال قطعة الخشب/السيارة.
  • الرسم.
  • الصور الذهنية (أي الصور التي يراها بعين خياله)
  • اللغة المنطوقة.
اللعب الرمزي ليس مجرد تسلية، يقول Piaget، ان له اثراً هاماً على تطور الطفل معرفياً. هنا نأتي لسؤال مهم: إن الطفل في هذه المرحلة يتعلم مفاهيم هامة جداً وصعبة (مثل اللغة)، بينما لم يقل له أحد أن يفعل ذلك! لم يأت احد بسبورة أو قاموس ويعلمه الكلمات التي يتحدث بها، لم يعطه احد شهادة لكي يعلم نفسه الرموز عن طريق اللعب. إنه يفعل ذلك لدوافع فيه هو.

أليس هذا مثيراً؟ كيف يفعل الطفل ذلك؟ ولماذا تأتي المدارس (ليس فقط المصرية او العربية) وتتجاهل كل هذا لتأخذ الطفل وتلقنه كل شيء تلقيناً؟ وكيف نستفيد من حبه الطبيعي للتعلم لكي يتعلم ما نراه نحن الكبار ضرورياً له من رياضيات وفيزياء وتاريخ...الخ؟

يحتاج الامر للتأمل.

البيئة المحيطة

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

ولكني سريع التشتت. ما ان تبدأ المحاضرة في ذكر اشياء اعرفها حتى يقول لي عقلي: ماذا تنتظر؟ ابحث لي عن شيء افعله، هيا هيا. في البداية لم تكن "التشتيتات" علمية جداً. رسمت هذه:

وكنت قد اخذت معي كتاب عن نظرية Piaget عن مراحل التطور الفكري للطفل في سنين عمره المختلفة. اخذت اقرأ فيه قليلاً، في الفترات بين الاستماع.

كان الشرح الآن عن struct في لغة ++C. عن ان الstruct لا ينشيء بيانات في الذاكرة، لكن عمل variable منها ينشيء فعلاً البيانات. همممم، كنت اشرح الفصائل في توثيق كلمات اليوم السابق، ربما ينبغي ان ابسّط الشرح قليلاً.

دخل الشرح في الheap. هذا مهم... في كلمات، على عكس ++C، كل كائن عبارة عن reference. كيف اشرح الـreference؟

رسم الheap سهل. لكن الreference؟ دائما نرسمها اسهم تشير إلى اماكن في الذاكرة، لكن السهم ليس قيمة! حين أقول أ = ب، فإن قيمة الreference يتم نسخها. كيف اعبر عن هذا في رسمة تعبر عن البرنامج؟ أرقام؟ لا هذا معقد. أريد شيئاً مرئياً.

ماذا افعل؟ اشكال هندسية؟ لكنها لا تعطي علاقة "هذا يأتي بذاك"، أنا استخدم الreference للإتيان بالobject..ماذا عن تشبيه؟ مفتاح بلون معين مثلاً؟
يبدو ان حضور محاضرة عن تعليم الجامعيين البرمجة، مجتمعاً مع قراءة كتاب عن مراحل تعلم الاطفال، قد اتى للمرء بأفكار عن تعليم الاطفال (والكبار) البرمجة. سجلت ملاحظات اخرى عن تعليم البرمجة في وجود جهاز أوراق، فكرة لمشروع، واشياء اخرى. كانت جلسة مثمرة.

هذا اليوم لم تأت افكار النهضة من الجلوس على مكتب في غرفة خاوية، بل من قاعة محاضرات مزدحمة مليئة بالضجيج. هذا يسرني. هذا اقرب لفكرتي عن العلم والتطوير.