الجمعة، 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..ماذا عن تشبيه؟ مفتاح بلون معين مثلاً؟
يبدو ان حضور محاضرة عن تعليم الجامعيين البرمجة، مجتمعاً مع قراءة كتاب عن مراحل تعلم الاطفال، قد اتى للمرء بأفكار عن تعليم الاطفال (والكبار) البرمجة. سجلت ملاحظات اخرى عن تعليم البرمجة في وجود جهاز أوراق، فكرة لمشروع، واشياء اخرى. كانت جلسة مثمرة.

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

الخميس، 24 مايو 2012

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

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

- مراجعة على المتغيرات وامر اقرأ -
- امر التخصيص assignment -
- العمليات الحسابية -
- العمليات الحسابية على متغيرات -
- امر إذا -
- امر إذا/وإلا -

مراجعة على المتغيرات وامر اقرأ

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

لزيادة التأكيد، عرضت عليه صورة المتغيرات وقلت ان المتغير شيء له اسم وقيمة، وان امر "اقرأ" يصنع متغيراً بطريقة كذا وكذا.

ثم قلت له: اكتب لي برنامجاً يقرأ كلاماً من المستخدم، ثم يطبعه مرتين.

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

القصد، كتب

اقرأ فوزي

(تم تغيير الاسم)

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

قلت له ان يكتبها وفعل. قلت: الآن يجب ان تطبعها مرتين. ماذا ستفعل؟ قال: حاجة مش فاكرها...فيها كاف...

(يبدو انني قد اخبرته من قبل بأمر لكل/تابع). قلت له: لا لا، تخيل انك تريد من شخص ان يفتح الثلاجة مرتين..ماذا تفعل؟ قال: اخبره ان يفتح الثلاجة مرتين! - لكن ماذا لو لم يعرف كلمة "مرتين"، ولم يعرف الاعداد اصلاً؟ بعد قليل من المناقشة عرف ان قصدي ان الاجابة التي قصدتها هي "افتح الثلاجة، افتح الثلاجة".

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

أيضا اخذت معه وقفة عن لوحة المفاتيح والمحرر: زر home يذهب لأول السطر، زر end لنهايته، النسخ ctrl+c، اللصق ctrl+v

قام بنسخ السطر، وتنفيذ البرنامج. فرح جداً بفكرة تكرار السطر = تكرار التنفيذ، وقام بتكراره ثلاث، واربع، وخمس مرات ورؤية النتائج. التفكير البرمجي كما قلت لكم :)

امر التخصيص

الطريقة الثانية لصنع متغير هي امر التخصيص أ = 12. انه يصنع متغيراً ويضع فيه قيمة. قمنا نفس المثال من الجزء السابق:
أ = "اسمي الكامل"
اطبع "أنا "، أ
اطبع "سن "، أ ، " هو 10"

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

ذكرت له الفرق بين الذكر والاستخدام. حين اقول ان كلمة "يا حمار" استخدمت لأول مرة سنة 1885 فأنا لا اشتم احداً، انا اتحدث عن الكلمة نفسها، بينما لو قلتها في سياق آخر قد اكون اشتم احد (ليس مثالا طيباً)، المرة الأولى ذكر والثانية استخدام. كيف نفرق بين الذكر والاستخدام، حتى في الكلام العادي؟ بعلامات التنصيص.

(نعم، انا اتكلم مع الاطفال في الفلسفة، لماذا تسأل؟).

العمليات الحسابية

مثال بسيط جداً:
س = 12
ص = 13
ع = س + ص

ولكن طلبت منه ان يشرحه لي سطراً سطراً. ويرسم المتغيرات وما يحدث لها على الورق. في الجزء الخاص بـ ع = س + ص قال بدون مساعدة مني انه يحسب اولاً س + ص، ثم يضع النتيجة في ع.

العمليات الحسابية والمتغيرات

ثم قلت له هذا المثال:

س = 9
س = س + 1

اخبرني إذاً ما سيحدث هنا؟
قال: سوف يصنع متغيراً اسمه س يساوي 9 (لسبب ما الاطفال لا يحبون كلمة "قيمته كذا").
ثم يحسب س + 1
- ثم ماذا؟
ثم يصنع متغير س ويضع فيه النتيجة.

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

كنت اظن التعبير في صورة س = [شيء يحتوي س] سيكون اصعب من هذا، لكنه عرف وحده كيف يقيس "س=س+1" على المثال السابق "ع = س + ص". او ربما تعلم هذا من جلسة سابقة. في الحالتين شيء جيد جداً.

هل احد اسباب هذا التعلم السلس هو انه لم يأخذ جبر بعد، وبالتالي ليس لديه معنى سابق للتعبير "س=س+1"؟

ثم صنعنا هذا المثال:

اقرأ #متغيرطويل
اقرأ # أ
اطبع أ+متغيرطويل
اطبع أ-متغيرطويل
اطبع أ×متغيرطويل
اطبع أ÷متغيرطويل

(يتضح للقاريء المقق انه كان هناك مناقشات جانبية هنا)

بدأ المثال ببرنامج يجمع رقمين ثم طورناه، لأننا مطورون برامج كما تعلمون (أو فنني حاسب آلي كما يذاع هذه الايام). كانت فرصة جيدة ليعرف علامات ×، ÷ على لوحة المفاتيح العربية، كما قلت له ان لغات البرمجة التقليدية فيها علامة الضرب * وعلامة القسمة /، وان الطريقة التقليدية */ والجديدة ×÷ كلتاهما مدعوم في لغة كلمات

امر إذا


وهنا قد حان وقت تعلم شيئاً جديداً (هيييه!). لو عدنا للمثال السابق سوف نجد انه يطبع دائماً ناتج العمليات الحسابية الاربعة. انا اريده ان يسأل المستخدم عن نوع العملية التي يريدها، يعني لو ادخلت له
12
3
÷

فسوف يقول لي 4. قلت له ان الامر إذا يأخذ الصورة الآتية:

إذا [شرط] :
_____
_____
تم

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

الآن هيا نعدل البرنامج. اضفنا (بعد شيء من النقاش) امر اقرأ ثالث للعلامة. ثم كان مطلوب منه وضع الجزء الخاص بالجمع فقط لو كان العلامة المطلوبة هي +.

بعد تفكير منه، وشيء من المساعدة مني، كانت الكود كالآتي:

اقرأ #متغيرطويل
اقرأ # أ
اقرأ ش

إذا ش = "+":
اطبع أ+متغيرطويل
تم

اطبع أ-متغيرطويل
اطبع أ×متغيرطويل
اطبع أ÷متغيرطويل

كان هناك حيرة في "هل نضع علامة زائد بين علامتي تنصيص ام لا" اعادتنا لنقاش الذكر او الاستخدام، كما كان هناك مشاكل في الشرط نفسه (لم يكن يعلم، ولم اكن اخبرته، بالمقارنات فكان الامر في البداية هو إذا ش+ من المتوقع لمن لا يعرف الـsyntax ان يحاول اختراع syntax خاص به...)

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

....لو اردنا يمكننا ان نغير ترتيب الاوامر ليكون المدخل
5
+
5

لكن لا يمكننا ان ندخلها كلها على نفس السطر.

بدا عليه الاحباط، إنه كان يتوقع ان يكون المدخل في صورة "طبيعية". سأل: وماذا لو اردنا إدخال 5+5؟

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

أليس هذا، أي تلميذي، هو ما يحدث في لغة كلمات نفسها؟ انها تقرأ شيء مثل ش=5+6 فتفصل ش وحدها، وكل رقم وحده، والعلامات وحدها، ثم تقوم بتنفيذ الامر.

كم كنت اود وقتها لو كانت لغة كلمات فيها مشروع Glass compiler الذي كنت اخطط له!! هذا المشروع يقوم باظهار برنامج كلمات في صورة كود، ثم parse tree ، ثم assembly، ثم يظهر تنفيذه.

ما علينا. قمنا، بتجربة البرنامج وشرحت له (او طلبت منه ان يشرح - لا اذكر) كيف يسير جزء "إذا"، ثم بعد مزيد من النقاش، بتعميم البرنامج:

اقرأ #متغيرطويل
اقرأ # أ
اقرأ ش

إذا ش = "+":
اطبع أ+متغيرطويل
تم

إذا ش = "-":
اطبع أ-متغيرطويل
تم

إذا ش = "×":
اطبع أ×متغيرطويل
تم

إذا ش = "÷":
اطبع أ÷متغيرطويل
تم

والآن حان وقت التجربة! كان تلميذي يتساءل كيف ان احد هذه الاوامر سينفذ بينما الباقي لا. هل هي عشوائية؟ قلت له انها ليست عشوائية لأن ش لا يمكن ان تساوي + و - في نفس الوقت. اليس كذلك؟ هه؟ شعرت ان السؤال السابق يوحي بعدم ثقتي في كفاية اجابتي، فقررت ان اسير بنصيحة "اظهر ولا تخبر". إن كلمات لغة برمجة تعليمية من الدرجة الأولى، وقد وضعت فيها امكانيات مثل "المراقب العجيب" لمثل هذه اللحظة.

شغلت المراقب وبدأ تتبع كل خطوة من البرنامج. ادخلت له 12، 6، ÷...دخل في اول امر. هل ÷ = +؟ لا، فلم يدخل في الامر. نفس الشيء مع امر "إذا" الثاني"، ثم جرب الثالث ونجح وعرض نتيجة القسمة. ثم جرب الرابع ولم يفعل شيئاً.

جربنا اكثر من عملية حسابية. حرصت ان اقول له انك لو ادخل 5،5،* بينما امر إذا يستخدم × فلن يتحقق الشرط.
برنامج دسم :)

امر إذا/وإلا


كانت الملفات المفتوحة الآن في كلمات كثيرة، وحين قمت بعمل برنامج جديد كان الاسم المخصص له من قبل الـIDE هو new program 9. قلت له هل تعرف كيف تقوم كلمات بهذا؟ هناك متغير يخزن عدد البرامج التي تم انشاؤها، ثم كلما اختار احد امر "جديد" ينفذ سطر كذا = كذا + 1

القصد...

نريد برنامجاً يقرأ رقم يعبر عن السن، ثم لو السن عشر سنوات او اكثر يقول "انت كبير"، ولو اقل يقول "انت صغير".

اقرأ
إذا س >= 10:
اطبع "انت كبير"
تم

إذا س <10:
اطبع "انت صغير"
تم

(جاء البرنامج من مناقشة، وعرفته بـ >=)

أراد ان يلعب قليلاً فغير الكود لتصبح كالآتي:

اقرأ
إذا س >= 10:
اطبع "انت اكبر من الهرم"
تم

إذا س <10:
اطبع "انت صغير جداااا"
تم

قلت له: لكن الهرم عمره - ماذا - خمسة آلاف سنة؟ هيا نفرق بين حالة "اكبر من الهرم" وحالة "كبير" العادية. بالمرة نفرق بين الصغير والصغير جداً.


اقرأ
إذا س >= 5000:
اطبع "انت اكبر من الهرم"
تم

إذا س >= 10:
اطبع "انت كبير"
تم

إذا س <10:
اطبع "انت صغير"
تم

إذا س <2:
اطبع "انت صغير جداااا"
تم

لكنك تعلم عزيزي القاريء ان هذا البرنامج - بالتجربة معه - لم يعط نتائج صحيحة: لو ادخلت ان سنك 12,000 سنة فسوف يقول "انت اكبر من الهرم" و "انت كبير" معاً! نفس الشيء لو قلت ان سنك سنة واحدة، سوف يعطي نتيجتين.

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

لاحظ اننا لو اردنا تطبيق ذلك في الكود الموجودة

إذا س >= 5000:
اطبع "انت اكبر من الهرم"
تم

إذا س >= 10:
اطبع "انت كبير"
تم

فإنهما لن يعودا امرا "إذا" منفصلين، بل سيتم دمجهما في امر واحد كما قلنا مثال السوق في عبارة واحدة. اولاً نحذف "تم" التي في المنتصف:

إذا س >= 5000:
اطبع "انت اكبر من الهرم"
إذا س >= 10:
اطبع "انت كبير"
تم

ثم "إذا" في المنتصف نجعلها "وإلا إذا":

إذا س >= 5000:
اطبع "انت اكبر من الهرم"
وإلا إذا س >= 10:
اطبع "انت كبير"
تم

نفس الشيء مع السن الصغير:

إذا س <10:
اطبع "انت صغير"
وإلا إذا س <2:
اطبع "انت صغير جداااا"
تم

قمنا بتجربة الاربع حالات: اكبر من 7000، بين 10 و7000، بين 2 و 10، اصغر من 2. لكننا في حالة السن سنة واحدة قال "انت صغير" وليس "انت صغير جداً". قلت له انه لابد من مراعاة الترتيب لأن "اصغر من 2" اخص من "اصغر من 10" لكنه فاجأني ان الموضوع واضح (او هكذا اشعرني).

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

غيرنا ترتيب الشروط، وجربنا البرنامج.

الأحد، 20 مايو 2012

نصف ساعة من النحو

الجمل تكون خبرية (تعطي معلومات) أو إنشائية (تفاعل مع شخص آخر، مثل نداء او استفهام). سوف نركز هنا على الجمل الخبرية.

هذه الجمل تكون بشكل عام مكونة من شيئين: (1) موضوع اتحدث عنه: انا، اخي، مصر، البحر... (2) معلومة اقدمها عن هذا الموضوع: آكل، ينام، جميلة، هاديء.

الموضوع الاساسي في الجملة اسمه المسند إليه، والمعلومة اسمها المسند، وذلك لأنني حين اقول "اخي جائع" فكأني اسندت صفة الجوع إلى أخي. في اللغة الانجليزية يسمونهما subject و predicate.

في الجملة الاسمية (التي تبدأ بإسم) مثل "البحر هاديء" يكون المسند هو الخبر (هاديء) والمسند إليه هو المبتدأ(البحر)، وفي الجمل الفعلية مثل "أكل الرجل" يكون المسند اليه - أي الموضوع الاساسي، هو الفاعل (الرجل) والمسند هو الفعل (أكل).

هذه المسندات الاربعة تكون مرفوعة. هذا الرفع اعتبره علامة أن لها أهم وضع في الجملة، فهي المكونات الأساسية لها. موضوع ومعلومة: هذه هي الجملة.

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

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

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

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

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

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

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

هناك حالة ثالثة للفعل المضارع هي الجزم، وهو يحدث لو سبق الفعل احد من:

لم: لم يأكل
لام الامر: لنرحل من هنا
لا الناهية: لا تقترب!!

لماذا هي مجزومة؟ لا اعرف. اتشعر انه لأن الموضوع فيه "عجالة" نوعاً ما....

علامات الإعراب

الآن نتحدث عن شيء: كيف نعرف حالة كل كلمة في الجملة؟ لو قلت "ضرب زكي اشرف"، من الذي ضرب من؟؟

في اللغات غير المعربة مثل الانجليزية يكون الأمر بترتيب معين للكلمات، لو قلت "Zaki hit Ashraf" فمن المؤكد تماما ان زكي هو الضارب، بينما "Ashraf hit Zaki" يكون العكس. لكن اللغة العربية لغة حرة لا تلزمك بترتيب معين بل يكاد يكون الترتيب حراً تماماً..أحمد يحب العنب، يحب أحمد العنب، يحب العنب أحمد..

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

لكن كيف إذاً نعرف وضع كل كلمة؟ اللغة العربية تقدم علامات معينة لتخبرك ان الكلمة مرفوعة او منصوبة او مجرورة أو مجزومة.

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

لكن في حالة جمع المذكر السالم يكون الرفع هكذا: مدرسون، والنصب والجر هكذا: مدرسين. في حالة جمع المؤنث السالم يكون الرفع الضمة مدرساتُ والنصب والجر بالكسرة مدرساتِ.

وفي حالة المثنى يكون الرفع بالألف "مدرسان" والنصب والجر بالياء "مدرسيْن". في كل الحالات تشعر ان الحرف "الاضعف" لغير الرفع.

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

في حالة الفعل المضارع يكون الرفع والنصب كالمعتاد، والجزم بالسكون، لكن الحرف المعتل يجزم بحذف حرف العلة: لم يمت الحلم، عنترة لم يعتدِ على احد.

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

هناك حالات اخرى لعلامات الإعراب لكن هذا يكفي حالياً.

التوابع

التوابع هي مكونات للجملة تأخذ نفس اعراب مكون آخر تتبعه. مثلاً:

الصفة: الورد الجميل في الحديقة. كلمة جميل مرفوعة مثل الموصوف (الورد).

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

العطف: "اكلت تفاحة وفرخة"، هنا فرخة معطوفة على تفاحة وتأخذ نفس اعرابها. ادوات العطف الشهيرة: "و"، "أو"، "فـ"، "ثم".

هناك تابع آخر اسمه التوكيد، بنوعيه اللفظي والمعنوي، لكن لن نتعرض له هنا.

جمل بداخل جمل

لو انت مبرمج، فهذا شيء ستحبه: هناك recursion في معظم اللغات البشرية بحيث يمكن ان تكون جملة هي مكون في جملة اكبر.

مثلاً في الانجليزية: He told me that she heard that they went to eat a chicken

في اللغة العربية سنعطي بعض الامثلة:

يمكن ان تكون جملة في مكان الخبر: البحر [ماؤه مالح]

(سوف اضع الجملة الداخلية بين اقواس مربعة)

او يمكن ان يكون الخبر جملة فعلية: الرجل [يخاف الناس من صوته]

ويمكن ان تكون الجملة حالاً: ذهبت إلى الحديقة [صوتي مهزوز من الإثارة]

ويمكن ان تكون الجملة صفة: يجري الجندي وراء عدو [يقفز خلف الجدران]

شبه الجملة

يوجد ايضاً عنصر اسمه "شبه الجملة"، وهو إما جار ومجرور أو ظرف ومضاف إليه.

وينفع لشبه الجملة أن تكون صفة: رأيت قلما [على الارض]، رأيت قلماً [تحت السلم].
أو أن تكون خبراً: الحاسوب [تحت الطاولة]
أو ان تكون حالاً: جلس اخي [في الشارع]

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

السبت، 19 مايو 2012

...وأنّ حالي كما ترى؟

تسألني لم أنني أنا، وأن حالي كما ترى؟
ليست امور اخترتها، وانما اختارتني هي

هذه قصة حياتي في الفترة من نهاية 2007 إلى منتصف 2008. وهي فترة مفتاحية، إذ اثرت على حياتي منذ وقتها حتى كتابة هذه السطور.

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

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

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

ماذا لو توقفنا عن التحسر على حال الطلبة، واعتبرنا ان لديهم القدرات لكن تحتاج فقط إلى من يعلمهم بطريقة صحيحة؟

المشكلة الاساسية بالنسبة لي كانت ان الطلبة لا يبرمجون اصلاً. معظم البرامج التي يصنعونها هي اشياء محفوظة مثل sum/average/minimum...لماذا لا يكتبون شيئاً جديداً له معنى؟

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

لكن المكتبات الرسومية معقدة جداً...DirectX, OpenGL, SDL...كلها تحتاج شيء من الاعداد. ربما يأخذ دقائق بالنسبة للمبرمج الخبير لكن بالنسبة لاشخاص مازالوا يتدربون على كتابة while loop ولا يعرفون بعد كيفية عمل open project؟ لن ينفع. لكن ماذا لو صنعنا مكتبة بسيطة جداً، تكفي دقائق للمبتديء كي يكتب بها برنامجاً صغيراً؟

بدأت افكر فيها: سوف تكون الرسومات بها مثل كمبيوتر صخر: خطوط ومستطيلات ودوائر، لكن من اجل الالعاب سوف نصنع لهم اشكالاً متحركة sprites. سوف يكون هناك 30 شكل متحرك، كل منهم له رقم (لنتفادى البرمجة الشيئية)، لماذا 30 بالذات؟ لأن هذا هو العدد الموجود في كمبيوتر صخر.

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

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

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

هذه هي المكتبة لمن يريد ان يعلّم احد بها.

كان هذا في صيف 2007. كتبتها في ثلاثة أيام، وتحملت آلام اليدين اثناء الكتابة. إن ألام اليدين قد جعلت البرمجة صعبة، والجلوس امام الانترنت صعباً. وبدأت افتح صناديق الكتب واقرأ. ولم تكن كلها كتباً برمجية. قرأت عن علم الاجتماع، واسباب التأخر الذي يحدث في مصر، والتاريخ، والدولة العثمانية، والحرب العالمية الاولى...

لقد انتهت الدولة العثمانية عام 1922. أي انه هناك اشخاص يعيشون بيننا الآن - من هم فوق سن التسعين - عاشوا في طفولتهم في دولة اسلامية موحدة. كان يحكمهم "أمير المؤمنين". ربما دولة ضعيفة او متأخرة لكن...موجودة. ليس الامر بعيداً كما يتخيل المرء.

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

...خسارة ان هذا التفكير لم يظهر سوى في ايامي الأخيرة كمعيد. لقد كانت الاستقالة على الابواب.

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

قدمت المحاضرة الاخيرة في التدريب الصيفي. كانت عن المستقبل: لابد لك كطالب ان تتعلم تكنولوجيات جديدة وانواع جديدة من البرامج (web, mobile, GUI...)، لكن طور نفسك أيضاً في علم الـcomputer science. تعلموا لغات كثيرة، لا تصدقوا من يقول لكم ان لغة واحدة تكفي..ولا تتعلموا فقط اللغات المشهورة. انظروا إلى Haskell أو Lisp، وهي اقوى بكثير من كل ما تعرفون.

ثم في هذه الفترة ظهرت لي خصوبة فكرية...كنت اكتب قصصاً، وافكر في لغة برمجة للموبايل اسمها Kitty (لم انتهي من تصميمها حتى الآن للاسف، وسبقتني مايكروسوفت بلغة TouchDevelop)، وافكر في لغة برمجة عربية...ولم لا؟ فقط لو وجدت لها اسماً جيداً..

ذهبت لمعرض الكتاب في ربيع 2008. وكنت قد استقلت من الكلية واجهز للذهاب للعمل في مايكروسوفت. كانت هناك دار نشر اماراتية لترجمة الكتب الاجنبية اسمها كلمة. بدأت اشعر ان العالم الاسلامي على ابواب نهضة. الا يقولون دائماً ان النهضة الاوروبية بدأت بترجمة الكتب العربية؟ (لكن الاسم قد اوحى لي بإسم للغة البرمجة الجديدة أيضاً..)

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

قد جاءت 2012، وبعض هذه الاسئلة نعرف إجابته والبعض لا. تابعوا معنا هذه القصة المثيرة.