الأربعاء، 11 يناير 2012

أفكار عن صنع مدارس المستقبل

أماكن وابحاث نسرق منها

اعتقد انه ينبغي، على رجل النهضة المتحمس، أن يقوم بجولة حول العالم يأخذ منها الافكار ليعود ويرى ما يناسب تطبيقه في مدارسنا. هذه هي المصادر الحالية في ذهني:
  • مدارس حركة كولن في تركيا، وهي مدارس مستوحاة من أفكار فتح الله كولن المفكر الإسلامي التركي. هناك أشياء معينة لاحظتها من المعلومات القليلة التي اعرفها عن تلك المدارس، مثل انهم يعتبرون الشطرنج منهجا رسميا وله كتب دراسية مثلاً، او ان كولن يبدو ان له نظريات معينة في التعليم. http://gulenschools.org
  • مدارس Aspire Schools في امريكا، ويبدو انها متفوقة لدرجة ان مؤسسة بيل وملندا جيتس تدعمها ماليا وكتبت عنها هذا المقال. لاحظ كيف انهم يهتمون بإعداد المعلم عن طريق عملية mentoring بأن يلزم المعلم الجديد بالتدرب على يد معلم اقدم يحضر للمتدرب حصصه ويوجهه؛ احيانا حتى يعطي نصائح بمايكروفون للمعلم المبتديء الذي يضع سماعات في اذنيه! http://www.aspirepublicschools.org
  • مدارس المغرب وطريقة متميزة لتدريس اللغة العربية (القراءة والكتابة). اترككم مع هذا المقال عن الموضوع
  • المدارس الفنلندية من افضل المدارس في العالم، حتى ان الدول الاخرى صارت ترسل البعثات لترى ماذا يفعلون بالضبط. هذا المقال يحكي قصة هذه المدارس وهناك كتاب يلخص الدروس من التجربة لمن يهتم. لا اظن انه يمكن تطبيق التجربة كما هي في مجتمعنا في صورته الحالية، ومؤلف الكتاب نفسه يقول انه ليس ارشادات تطبق كما هي لأن كل مجتمع مختلف، لكن فهم التجربة نفسها مهم ومفيد في رأيي.
  • هناك كتاب يتحدث عن استخدام الfractals (ذوات الأبعاد الكسرية) في تطوير مناهج الرياضيات اسمه "Fractals, graphics and mathematics education" ويبدو انه هناك حركة علمية في هذا الموضوع. القصة تبدو تستحق النظر والكسيريات هذه موضوع شيق في حد ذاته، أتمنى ان اتحدث عنه في المدونة.
مناهج جديدة للتدريس

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

اسئلة ينبغي الإجابة عليها :)

اختراع وإبداع

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

ولو كان الاختراع الحقيقي صعبا فلماذا لا يمكن عمل حتى simulation؟ هناك لعبة على الإكس بوكس اسمها "Banjo Kazooie, nuts and bolts" ابطالها مخترعون وفي اللعبة نفسها تقوم بتركيب محركات نفاثة، اجنحة، عجلات..الخ لتصنع طائرة او سيارة. لو كنت سأفتح مدرسة اليوم لكنت - بدون مبالغة - جعلت فيها حصة بانجو كازوي. تأمل بنفسك:



ألعاب الاختراع بشكل عام لم تعد نادرة، ولعل من اكثرها طموحاً لعبة اسمها Minecraft تبني فيها اشياء على درجات متنوعة من التعقيد حتى ان احد اللاعبين قام ببناء معالج حاسوبي CPU من داخل اللعبة نفسها!!

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

لماذا لا نصنع مثلا لعبة لتصميم نظام مرور بالمدينة. يبني فيها اللاعب طرق سيارات، خطوط اتوبيس ومترو انفاق، اشارات وتقاطعات..الخ ثم تضغط زر 'تجربة' فيقوم الجهاز بعمل simulation ليكتشف التلميذ اي اختناقات مرورية ويتعلم من اخطائه؟

ومادمنا ذكرنا الإبداع، فلابد أن نذكر الإبداع البرمجي، ووجود لغات للبرمجة الإبداعية أو المشجعة على الإبداع مثل Agent Sheets مثلاً، او MIT Scratch، أو لغة كلمات.

وإن ذكرنا البرمجة فلنذكر أيضاً...

المدرسة الفكرحوسبية

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

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

خاتمة

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

خطط النهضة: جدول المحتويات

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

خطة النهضة الأساسية

الجزء الأول
الجزء الثاني
الجزء الثالث
الجزء الرابع

التفكير الحوسبي

التفكير الحوسبي: مفتاح لنهضة علمية عربية
التفكير الحوسبي، كيف سيغير العلم؟
A key for advancing science and technology: computational thinking
البرمجة والتفكير وفرصة للتفوق العلمي
يوم في حياة أطفال مبرمجين
يوم في حياة أعضاء بمركز التفكير الحوسبي

تطبيق التفكير الحوسبي عمليا (بوجه عام، المجال التعليمي)

تطوير التعليم

أفكار عن صنع مدارس المستقبل
كنا نفعل أشياء!
الاجهزة الالكترونية المبرمجة وتطوير التعليم
مجانية التعليم: انا معها

الأطفال والبرمجة

علّموا الأطفال البرمجة
لغة برمجة عربية تعليمية: بعض الاعتراضات والرد عليها
بيئة حية متكاملة

اختراعات وافكار ومشاريع

مركز التفكير الحوسبي
كلمات، لغة البرمجة العربية الجميلة
جهاز أوراق: عربي، قلمي، ذكي

الثلاثاء، 27 ديسمبر 2011

التفكير الحوسبي: هل سيغير العلم حقا؟

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

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

هذا المقال هو مجموعة من الأفكار حاولت تجميعها لأفسر للقاريء - خاصة خارج المجال - أهمية هذا العلم.

تفاصيل بلا التباس

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

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

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

لغة مشتركة بين العلوم

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

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

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

لم يبق لنا إذاً سوى استخدام علوم الحاسب لوصف والتفاهم حول هذه المجالات بيننا وبين انفسنا، وليس فقط بيننا وبين الآلة.

لغة لوصف العمليات السارية

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

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

وسيلة للتفكير في الكفاءة بطريقة علمية منظمة

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

اخترعوا مثلاً مقاييس رياضية مثل time complexity ليمكن بها المقارنة بين كفاءة وسيلتين لحل نفس المشكلة، والمشاكل نفسها صنفوها في فصائل حسب كفاءة افضل حل ممكن لكل منهاـ وهناك كتب وابحاث وعلماء لا يعدون قد تخصصوا لأجل هذا الجانب الذي يعد اساسيا في مجالنا.

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

لغة، نَصِف بها تفكيرنا!

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

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

هذه الأشياء البسيطة في ظاهرها، الـgraph أو tree أو queue أو stack، هي خبز علماء الحاسوبيات الذي يعيشون عليه: يبحثون فيها ويكتبون الأبحاث عنها منذ عقود، كيفية التعبير عنها رياضياً بكفاءة، كيفية حساب خصائص معينة لها (مثل أقصر طريق بين نقطتين)، وغير ذلك الكثير.

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

والأن فكر معي: ماذا لو اخرجنا هذه المفاهيم من حظيرة علوم الحاسب وقدمناها للناس كافة في المدارس الإعدادية والثانوية كما يأخذون الحساب والجبر، ولم تعد حكرا على مجال من المجالات بل صارت جزءا من التفكير كله؟ ألا تدرك معي ضخامة الأمر وتأثيره؟ التفكير الحوسبي!

أرجو أن أكون قد ساهمت في توضيح أهمية هذا العلم الجديد الشيق.

الاثنين، 12 ديسمبر 2011

Dreams about metaprogramming in Kalimat

(Note: These are only design thoughts - I do not promise that all or any of those features will actually be in Kalimat).

I'm a big Lisp fan. It seems I can't create a language without trying to turn it into a Lisp. One of the reasons Kalimat got finished in the first place was that I decided to forget all the macros and metaprogramming and try my best to do a good "normal" language.

But now macros call me again...

The first thing I want to add is reified parse trees. I'll make the examples in Kick - the English version of Kalimat - because the Blogger editor has problems with mixing Arabic and English text. But if I implement this it will probably be implemented in Kalimat first.

Now consider this code:
m = myParseTree( )
print m: toString( )

What should be its expected output? Probably something like this:
Program(
statements = [
assignmentStmt(m, functionCall(myParseTree, [])),
printStmt(methodCall(m, toString, [])) ])

Looks like Lisp already :). The program here can see the objects that represent its own parse trees. This has many benefits. For example I can create automatic documentation tools, write code to convert a program into another language, create programs that do code generation or code verification, all without needing to write a Kalimat parser!


Modifying the trees

In a possible next step, I can make the program modify it own parse trees, and enable something like Lisp macros, C++ template metaprogramming, or MetaLua.

What do I mean? Suppose I could mark some functions as special "compile time code". Then I can write a function like this:
compiletime function const(code ~ expression):
code: replace(evaluationOf(code))
end
...and use this function like so:
x = const(sin(0.5) * cos(3) / factorial(3))                      
This will result in the code becoming like this; before the program is compiled:
x = -0.0791046143
Notice what happened: The program's parse tree was modified to replace an expression without variables with its own result (an optimization called constant-folding). This means that during the program's run the expression won't need to be evaluated.

What other tricks can we do? Imagine:
classFromDbTable("person")
classFromDbTable("department")
...and before compilation this code becomes:
class person:
has name, id, department, salary
responds to save(db), load(db)
end

class department:
has name, location
responds to save(db), load(db)
replies to getEmployees()
end
Here the compiler ran the "classFromDbTable" macro, which made a connection to the database, retrieved the needed information about tables and relations, and generated a class for each of the given table with methods to save a record, load a record, or retrieve related records.


Even more dreams

What can we do next? This is an active research area and I don't know if I can/want to implement this; but we could allow certain Kalimat modules to modify the parser before compilation. It means a Kalimat program can define a special version of Kalimat syntax and then we write the rest of that program in the new syntax! For example, if we are developing a game, we can make special syntax for declaring a game character:
syntax character:
codeForm: ...how it should look...
translation: ...actual kalimat code it should become...
end
...and then use the new syntax as if it were part of the existing Kalimat syntax:
character Ship:
image "ship.png"
control = keyboard
ai attack(enemy), maneuver(map)
end

ai attack for ship(enemy):
...implement attack...
end

ai maneuver for ship(map):
...implement maneuver...
end
So, what's the purpose of this article? First: to show you that compile-time meta-programming is cool. Right? :)

Second, to share with you some features I'm considering for Kalimat and hear any comments or suggestions.

Third, this article also answers a question I sometimes get: Why reinvent the wheel implementing a new language with its own parser, compiler, VM...etc. The answer is because Kalimat is not a translation of an existing language: it is a brand new language with its own features, design, and ideas.

الجمعة، 9 ديسمبر 2011

خطة للنهضة (4): أنا والنهضة

المحتويات: [الجزء الأول، الجزء الثاني، الجزء الثالث، الجزء الرابع هذا المقال]


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

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

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

حسناً، ماذا أريد أن افعل إذاً؟

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

ثاني اهتاماتي، وإن كان للمدى الطويل، هو جهاز أوراق اللوحي: عربيّ، قلميّ، ذكيّ.

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

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

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

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

هل سأنجح في أي من هؤلاء؟ هل سأبدأ أصلاً فيما لم ابدأ فيه؟ لا أعلم. حتى ذلك الحين الأفكار على المدونة لمن يشاء! لست محتاجا لأن تنتظرني حتى تتحقق الأفكار!

ماذا عنك أنت؟ منذ نشرت الأجزاء الأولى من هذه الخطة ويأتيني السؤال: الخطة تعجبني، لكن ماذا افعل بالضبط؟

كل إنسان له فترة يكتشف فيها اهدافه ووسيلة تحقيقها. انظر إلى رسالة، صناع الحياة، قبيلة TV، سلفيو كوستا، ...الخ...الخ. كل شخص قد جرب وفكر وتناقش حتى وجد "رُكنه" الذي يرتاح له.

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

الجمعة، 2 ديسمبر 2011

مطابقة الأنماط في لغة البرمجة كلمات

ملاحظة: هذه الأمثلة تحتاج نسخة كلمات ديسمبر 2011 أو أحدث. يمكن تحميل أحدث نسخة من هنا أو هنا.

مطابقة الأنماط pattern matching هي خاصية في لغات برمجة كثيرة وهي الآن في كلمات أيضاً. سوف نتعرف عليها الآن.

تخيل أنك تريد كتابة إجراء اسمه اطبع.الأسم، يأخذ اسماً في أحد الصور الآتية:
  • مصفوفة من عنصرين: الاسم واسم الأب
  • مصفوفة من ثلاثة عناصر: الاسم، اسم الأب، واسم العائلة على طريقة أهل الخليج العربي
ربما يمكن كتابة هذا الإجراء هكذا:
إجراء اطبع.الاسم ( م ) :
    إذا م هو مصفوفة.قيم وأيضا عدد( م ) = 2 :
        الاسم = م [ 1 ] 
        اسم.الأب = م [ 2 ] 
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م هو مصفوفة.قيم وأيضا عدد( م ) = 3 :
        الاسم = م [ 1 ] 
        اسم.الأب = م [ 2 ] 
        اسم.العائلة = م [ 3 ] 
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    تم 
نهاية

لكن هذه الكود تبدو رتيبة ومتكررة، التأكد ان القيمة المقدمة مصفوفة، التأكد من العدد، تفكيك البيانات إلى متغيرات...
هذه النوعية من المهام هي الدور الطبيعي لمطابقة الأنماط! هيا نكتب نفس الإجراء بالطريقة الجديدة:
إجراء اطبع.الاسم ( م ) :
    إذا م ~ [ ؟الاسم ، ؟اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م ~ [ ؟الاسم ، ؟اسم.الأب ، ؟اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    تم 
نهاية

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

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

إجراء اطبع.الاسم ( م ) :
    إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
     إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ، ؟ اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    وإلا إذا م ~ شخص له اسم = ؟ أ ، اسم.أب = ؟ ب :
        اطبع أ ، " " ، ب 
    تم 
نهاية
لاحظ كيف ان قراءة هذا الجزء من البرنامج سلسة جداً: "إذا كان م يطابق شخصاً له اسمٌ يساوي أ، واسم أبٍ يساوي ب، افعل كذا وكذا". شيء جميل جداً في رأيي :)

أخيراً ماذا لو كان يمكن للإجراء أيضاً أن يقبل قاموساً (مثل hashtable) فيه الاسم واسم الأب، وقد يكون أو لا يكون فيه اسم العائلة؟؟
كل مشكلة لها حل :)
إجراء اطبع.الاسم( م ) :
    إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ، ؟ اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    وإلا إذا م ~ شخص له اسم = ؟ أ ، اسم.أب = ؟ ب :
        اطبع أ ، " " ، ب 
    وإلا إذا م ~ {"الاسم" => ؟أ، "اسم.الأب" => ؟ب، "اسم.العائلة" => ؟ج}:
        اطبع أ ، " بن " ، ب ، " آل " ، ج 
    وإلا إذا م ~ { "الاسم" => ؟أ ، "اسم.الأب" => ؟ب } :
        اطبع أ ، " " ، ب 
    تم 
نهاية

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

هل تبقى شيء؟ أجل:

- يمكن المطابقة بالقيم العادية، مثلاً م ~ 12 ، أو مثل م ~ "مرحبا"

يمكن مطابقة مصفوفة بحيث لا يهم طولها، بل فقط قيم معينة تبدأ بها، هكذا:
إذا م ~ ["شجرة"، ؟ب، ...] :
    <افعل كذا>
تم
 هذا يطابق م مع مصفوفة أول عنصر فيها "شجرة"، ويضع ثاني عنصر في المتغير ب، ولا يهمه باقي العناصر، فقط ينبغي أن يكون عددها اثنان أو أكثر.
- علامة ~ على لوحة المفاتيح العربية هي shift + ئ

- وآخر شيء هو أن مطابقة الأنماط يمكن تبييتها nesting بحيث يمكن مثلاً مطابقة إذا كانت القيمة مصفوفة أول عنصر فيها كائن من نوع كذا وله حقل اسمه كذا....الخ.

Hints of pattern matching...


الأربعاء، 9 نوفمبر 2011

عن الكتابة

يقول الكتّاب: Show, don't tell. أترجمها: اظهر ولا تخبر.

ما معنى هذا؟ تماشياً مع سياق هذا المقال لن اخبرك، لكن سأظهر لك :)

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

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

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

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

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

قبل
إن أردت أن تنضم للعمل السياسي فلابد أن تحتمل إذا أردت أن تنجح. لن يكون كل الناس ودودين ولن يكونوا منصفين ولن يكونوا اصدقائك، وسيتهمونك بأبشع التهم وعليك أن تستمر بالرغم من كل ذلك، ولا تجعل هذا يؤثر فيك.

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

السبت، 5 نوفمبر 2011

عشان كدة الثورة يا عمنا

انت ممكن تكون بتفكر ان الثورة دي ما لهاش لازمة. ان حسني كان حرامي بس محافظ على الاستقرار. ان العادلي كان ظالم بس كان مخوف المجرمين، والانفلات الأمني ما كانش عمره حيبقى كدة لو العادلي كان موجود.

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

كان ايه اللي جبرنا على ده كله...عيال خايبة...

عاوز احكي لك حكاية: حسني كان عاوز يعمل انتخابات رئاسية في سبتمبر 2011، يعني كان زماننا دلوقتي بيحكمنا راجل ما بين الحياة والموت. أو كان زمان بيحكمنا ابنه دلوقتي.

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

والأنكت من كدة: فاكر لما كانوا بيبيعوا الأراضي في 2007؟ هو ايه اللي يتبقى من البلد غير الأرض؟ عارف -- البلطجية حيقعدوا يبرطعوا كام شهر؟ قول حتى سنة، قول حتى سنتين، انما دول كانوا عاوزين يقعدوا ميت سنة، ويسلموها لبعض كل ما يمشوا.
والبلطجي حيسرق منك بيت والا عربية، والا حتى يخطف واحد، انما ما كانش حيبيع البلد كلها. واحسب عموما الناس اللي ماتوا من الجوع، ومن الأدوية المغشوشة، واللي وقعت عليهم بيوتهم، واللي ماتوا في المعتقلات، واللي غرقوا، وشوف الثورة جابت البلطجية صحيح والا البلطجية كانوا اللي قاعدين من قبلها..

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

طيب ليه بيتظاهروا لغاية دلوقتي؟ مش كان كفاية بقى ويهمدوا؟ حاقول لك...

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

احمد شفيق كان سايب وزرا من النظام القديم؛ وكان تفكيره تفكير نظام قديم، وكان دماغه ناشفة ومايستحملش حد يقول له بم: ولو جينا نشيل الفاسدين من كل حتة كان حيقرفنا في عيشتنا ومش حناخذ منه حاجة في الآخر.

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

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

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

الجمعة، 4 نوفمبر 2011

Almost all programming is metaprogramming

Any sufficiently large program involves metaprogramming, whether the program's author meant it or not. By so I mean it:
  • Creates a 'program' in some specialized encoding, or 'language'
  • Writes an interpreter for that language
  • During runtime, creates a new program in the newly created language and executes it.
Or in other words, a sufficiently advanced data structure is indistinguishable from code.

Let's think of this in terms of real-world (and some not so real-world) examples:

1- Think of implementing a word processor; you have a specialized 'language' to describe paragraphs, lines, formatting, and so on and one or more 'interpreters' to take the program and render it to the screen or print it. Sometimes the language is very real, like for example Postscript.

2- Also, parser combinators: You are essentially creating a program out of lambdas or objects. Consider the parsing primitives to be like instructions of a virtual machine, and the resulting parser as an AST that knits those instructions together. Running the parser is passing the instructions calls to the VM.

3- Similarly, the reason a Turing machine is so powerful is because it has an infinite tape that can be freely accessed. If you study TM programs you'd find a lot of them generating intermediate data on the tape and then traversing this intermediate data using fixed circuitry in its transition diagram; so in other words interpreting it.

All of this seems rather obvious, and somewhat too philosophical. What practical benefit do we get out of this? I think if we realize that our programming is mostly about creating and executing more specialized programs; we'd start thinking about tooling support for our specialized programs..

Whether we're programming with C, Java or your favorite functional language, you probably have debugging, refactoring, and other support for the first level program; the (e.g Java code itself) the higher level program, however, is neglected as mere 'data'. So you'd be working on a lower abstraction level.

There's ongoing research about tooling support for domain specific languages and making it easy to integrate them with the host language's debugger...etc. I suggest going to the next level: make it easy to treat any data structure as a DSL..

That would probably require the host language to take homoiconism very seriously: If it's an OOP language the program itself would be composed of object literals. ML-like languages would have their code be composed of calls to data constructors. Prolog-like languages would have the program be a set of program facts. And so on. Basically, if the tools in the IDE work on code they should work similarly on anything else.

After all this is done, imagine again working on our word processor: We could step over the rendering of each paragraph, then step into a given line to troubleshoot a bug. Tracing the running of a parser created from combinators would be on a rule-by-rule basis. The 'safe delete' refactoring could have a lot in common with the language's garbage collector. An error would make the IDE stop and show which piece of input caused the problem instead of the troubled code in the main program.

Or maybe I'm wrong. Maybe no one came with the idea because there's some obvious flaw in this reasoning. Or that the idea is vaguely defined and falls apart if studied in detail..I don't know!