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

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

نتابع مع نفس الطفل المذكور في الجزء الثاني.

كتبت هذه الكود:
اقرأ أ
اقرأ ب

ثم قلت: فلنفترض ان أ يمثل اسم الشخص (مثلاً محمد) و ب يمثل اسم الاب (مثلاً سامي)، فكيف اكتب الاسم الكامل؟

كان الرد الأول: اطبع أ=محمد...

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

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

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

لا اريد ان اترك شيء من التفاصيل بدون ان ابحثه، فنحن نتكلم - من اول الموضوع -عن النتائج التجريبية. ربما ينبغي ان اسألها، إن كانت مازالت تتذكر :)

القصد، قالت ان السطر الثالث المطلوب هو "اطبع أ ب"..

هذا جيد -- لكن يتبقى الsyntax. اكتبيه إذاً؟

قالت:

اطبع أ ب

صححت لها موضوع الفاصلة:

اطبع أ، ب

ثم جربنا تنفيذ البرنامج، ادخلت له اسمي واسم أبي فقال البرنامج:
محمدسامي

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

نريد ان نطبع الاسم، ثم مسافة فارغة، ثم اسم الاب، كم شيئا نريد ان نطبعه؟
- ثلاثة!
- تمام! وكم فاصلة بينهم؟
- اثنان

حسناً...اكتبي إذا الفاصلة الزائدة، والآن لدينا فراغ نكتب فيه المسافة:

اطبع أ، ، ب

ينبغي الآن ان نكتب مسافة فارغة بين الفاصلتين..ضعيها بين علامتي تنصيص

اطبع أ، " "، ب

وهيا ننفذ البرنامج. ما الاسم الذي تريدين؟
- سلمى
- حسناً، سوف اكتب سلمى
- لكن اكتبها بالياء!
- لماذا؟ هكذا ستكون الكلمة خطأ! سلمي بدلا من سلمى!
- لكننا نريد حرفاً يشبك مع الذي بعده!

اووووه :)

وهكذا تم تجربة أول برنامج.

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

اطبع أ، " "، ب

إن هذا السطر مليء بالتعقيدات التي لا اشعر بها لأني برمجت قبل ذلك بالسي++، جافا...الخ
  • أ و ب هم عناصر خاصة بالكود syntactic elements، لكن عند تنفيذ البرنامج فهي تدل على عناوين لقيم مخزنة في الذاكرة..
  • المسافات في الكود لا تصنع فارقاً، لأن لغة البرمجة بها Lexical analyzer يقوم بعمل skip whitespace، لكن لو كانت المسافة بين علامتي تنصيص، فإنه يكون لها معنى كقيمة، قيمة اثناء تنفيذ البرنامج.
  • امر اطبع يأخذ القيم المطلوب طبعها بينها فواصل وحول النصوص علامات تنصيص، لكن القيم تطبع على الشاشة بدون هذه النقشات.
إن المبرمج دائماً يضطر أن يحوّل انتباهه بين عالمين: عالم الكود في المحرر وعالم القيم اثناء تنفيذ البرنامج، وعليه ان يعلم - بصورة مباشرة او غير مباشرة - انه هناك مفسر للغة يقوم بنقل الكود من احد هؤلاء العالمين إلى العالم المجاور.

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

أو هنا مثال اوضح للفرق بين طريقة كلمات وطريقة روبي:
اطبع "الاسم هو "، س، " والسن هو "، ص، " يا فتى"
اطبع "الاسم هو {س} والسن هو {ص} يا فتى"

هنا انا لا افصل بين المخرجات بفاصلة، بل اكتبها في صورة نص كبير، لكن حين اريد ان اطبع قيمة متغير (شيء يشبه الكود ولا يشبه النص المعروض كما هو) احيطه بأقواس { }

نعم، طريقة روبي افضل كطريقة برمجية، لكن كطريقة تعليمية؟ ربما وربما لا. كالعادة: يحتاج الامر لتجربة :)

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

ربما بعد ذلك احتاج لعمل نسخة من كلمات يمكن تغيير الـsyntax بها تغييرات طفيفة بدون مجهود كبير - بدون حتى عمل recompile للغة - لتسهيل هذا النوع من التجارب.

ليست هناك تعليقات: