الخميس، 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، تقوم بالغرض فسأسكت، على الاقل هذه المرة :)

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

هناك تعليقان (2):

Issam Elbaytam يقول...

very interesting. how old is the child? Also, I might have mentioned this before, have you considered using "Ask For" instead of "Read"?

Mohamed Samy يقول...

@Issam

He's 10 :)

Re the 'read' statement, I think both children now are fine with the fact that it reads from the console; it's the concept of variables, and the syntax, that needed further explaining..