السبت، 21 يناير 2012

كنا نفعل أشياء!

لم تكن أمي معجبة جداً بالمدرسة في قطر.

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

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

نحن ببساطة لم نكن نتلقى الكثير من المعرفة knowledge، لكن كنا نفعل أشياءاً؛ هذا هو سر الموضوع. ذات مرة قال المعلم لنا في أول الترم: أريدكم أن تكتبوا قصة بوليسية.

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

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

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

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

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

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

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

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

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

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

السبت، 14 يناير 2012

Improving FCIS education: ideas and strategies

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

Architecture


There's a book called "The elements of computing systems" that attempts to go through all layers of a computer: starting from logic gates and building the hardware, assembler, compiler, operating system, and finally a Tetris game on top. The book even has prepared course material to teach with.

Will it be good? Will it be possible to give in a semester? I don't know, but seems worth examining.

Python, computer vision, and scientific computing

The problem with computer vision/image processing is that the set-up takes much longer than the fun parts. Students spend too much time learning how to load images, access pixels, do transformations,...etc

Python is a very high-level language, with very readable syntax (looks like pseudocode) and a lot of libraries. It currently has a gained a lot of users in the scientific community and got some excellent high-performance, high-quality libraries in these domains. It might be much easier to use in imaging/scientific computing than the current tools (C++, C#) and some researchers are even using it instead of Matlab.

This is a list of common Python libraries for imaging/SC. The most famous is SciPy, described as having "... modules for linear algebra, optimization, integration, special functions, signal and image processing, statistics, genetic algorithms, ODE solvers, and others. "

Another is VTK (visualization toolkit), described as "an open source, freely available software system for 3D computer graphics, image processing, and visualization used by thousands of researchers and developers around the world."

Also, there's SimpleCV, a set of Python libraries to make computer vision easy and straightforward. You can look at their demos if you like.

Perhaps someone can have some experiments with these libraries and try to make use of them in FCIS subjects and/or projects.

Algorithm animation toolkit

I don't know how useful algorithm animation would be in teaching algorithms, but it could be quite useful (algorithm animation = drawing each step in the algorithm one after the other while showing state of variables, content of arrays, ...etc).

I suggest creating a generic algorithm animation kit: it would be an interpreter for a small language (perhaps C-like), the TA would write the algorithm in that language and the interpreter (which knows how to draw an array, a tree, graph...etc) would run each step, visualizing along the way.

It's not that hard a project for someone who knows compilers. By the way it might be even more useful in the data structures course (e.g to explain insertion in a binary search tree) than algorithms.

First year & programming

Let's be honest: there are too many 3rd year students who barely know how to code (probably a lot of 4th year too). Even worse: they haven't learned to make it easy for themselves.

What do I mean, not make it easy? I don't mean object oriented design or such, I mean the really simple things:
  • Indenting code to know where each loop or if statement ends, to have no statement in the wrong place (e. outside the if instead of outside the while).
  • Passing values as parameters instead of storing them as global variables or fields in the class.
  • Giving variables meaningful names. I can't remember how many times I've seen variables called a, a1, c, instead of pixelsPerCentimeter, nameToEmployeeMap,...etc
  • Not trying to really understand the problems, instead randomly changing things until the program seems to run.
  • Not trying to plan their work: no sketching of solutions, no equations before coding, nothing but opening the editor and typing.
These things do not even require practice or extreme intelligence, they simply need to be done.

So how do I suggest solving those problems? We could at least start by:
  • Having TAs talk about these issues.
  • Having TAs code in front of new programmers. All crafts are learned by watching: a young carpenter learns by watching older carpenters. A mechanic learns from his master. Programming might be a science but - like it or not - it's also a craft.
There is this belief among beginners that code is the final product: As if a programmer should read the problem, think real hard about it, and then write the code correctly. In such an imaginary world there is no need to indent code or give variables good names: the code is for the compiler to translate, not for a human to read.

In the real world you'll spend 10 or 20 times as much debugging the code as you wrote it. You'll ask TAs to debug the code with you. Neither you nor the TA wants to get lost in x,c,i,j or wonder where the while loop ends among those braces, or discover that the function depends on a global or member that he forgot about. Just do what you can to make life easier.

Structured programming: the subject that isn't :(

I have a feeling that structured programming has never been taught in the faculty: they always would teach loops or pointers or the like: this is not SP! this is just programming language features.

Real structured programming is about code having structure, i.e being decomposed into smaller components, being able to reason about each component separately of the others, then combining them into a larger program.

This is a sample of the stuff that should be taught in such a course:
  • Decompose programs into functions
  • Functions should be like mathematical functions: takes input from parameters and returns values. Do not call a function by first writing to a global var, calling it, and letting it read from the global.
  • Don't let the function doing the calculation open a file, let each function do a specific job.
  • Don't mix user interface (console or GUI) with the logic. This prevents reuse, among other things.
  • A function should map to a unit of meaning in the problem (e.g draw_character, determine_if_monster_is_dead). Reading code should sound - in your head - like reading the solution of a problem.
  • Think hard about the data, and also decompose it into structs, arrays,...etc. Those should also map to units of meaning in the program (car, deck_of_cards, salary).
Object oriented programming

Among the syntax, the static methods, the class definitions, public & private,...the most important concept is forgotten: objects.

Basically, the idea is that when a program runs, a lot of objects will be created in memory and will interact with each other by method calls. This simple idea - believe it or not - is virtually unknown to a large portion of students.

Don't believe me? Here are the signs:
  • It is very hard to explain to students what static is, even if it means just "Doesn't work on a particular object".
  • It's very hard to explain the 'this' keyword, even if it just means "The object on which the method is called".
  • Students try to call methods on C# forms without having a reference to the form. If compilation fails they create a new form instance instead of acquiring a reference to the active form.
  • They have difficulty getting constructors, which are ways to create objects.
Basically, the students mostly memorize certain shapes of code and write them as-is. So how to solve the problem?

You can start by making sure the basic concept is understood: forget encapsulation, forget inheritance, forget public/private. First you got to make sure they get it:
  • When the program runs, objects are created. They call methods upon each other.
  • An object is not the class; the class is simply an 'algorithm' to create similar objects. All real work is with the objects.
  • When writing a class, think about how the objects created from it will behave.

(This is similar to functions actually: a functions is separate from its activation. This is why the same function can have multiple activations in e.g recursion).

Also, before making them define their own classes, let them use existing classes in the standard library to do basic object operations: creating them, calling methods, setting them as fields in other objects, learn about references...etc

The advice that I just gave can be applied to all subjects in all years: Start with the simplest, most essential concept (structured = decomposition, OOP = objects...) & make sure they learn it before you continue.

Graduation project supervision

It pains me to think about how much knowledge is created, then destroyed all along the years in FCIS.

Think about how many times e.g Ahmed Salah supervised a GP related to computer vision: He recommends papers to students to learn imaging from, then more specialized papers related to the project's domain, then tutorials to Matlab. And then next year students come and he has to repeat the whole cycle again. The day he leaves for his Phd is the day less students will be able to work on CV projects. Why does it have to be like that??

Come on people! I'm not asking for some big, systemic change! Can't we have a Google document online for all TAs to copy & paste the names of papers that they gave to the students?

Then along the years, new students can be pointed to them to learn about the GP domain, interested people like me can use them to learn about new subjects. The information in preserved when the TA is away. New papers would be added if the existing ones get out of date. Wouldn't it be awesome?

The same can be said about code & documentation: We should sort the copyright issues then have all code and docs posted online, and enable searching for projects by name, problem domain (e.g augmented reality) or year. This would solve problems like
  • "Has my project idea been done before?"
  • "Why aren't more projects continued on and improved?"
  • "We want a list of interesting projects to tell TV reporters, to make FCIS more known to society"
What I'm proposing here is accumulated knowledge: Recording previous valuable knowledge so that it can be reused in the future. This is for example why books are such an important part of human progress.

Themes for graduation projects

In 2010/2011 I tried to introduce the idea of themes: a lot of GPs in the same general domain. The aims were:
  • Encourage multiple teams to cooperate on common problems (e.g share papers that introduce NLP).
  • Plant a seed of research groups in the faculty, when some of those students become TA. This would form research groups naturally instead of by fiat from management.
I think this idea should be revisited. Have two or three themes each year, and let TAs announce in a session 10 ideas or so for each theme (but allow students to freely work outside them).

Observation

During my last months as a TA, and in the summer training after I quit, I did something new to myself: I began observing.

I'd sit with the students during a lecture that another TA is giving and see how they react to different styles, or even when do they focus and when they're distracted. If I would do that now I'd also go to the labs and watch how they actually try to program and the things that are repeatedly not understood by different groups of people.

Perhaps as educators we need to take a more scientific approach to teaching, & base our decisions on data instead of personal opinions.

Speaking of scientific, perhaps we could look at research about the topic of teaching programming. For example there's an ACM special interest group called SigCSE (special interest group, computer science education) where relevant papers are published. Also a lot of educators have blogs on the internet, and sometimes they write gems like this for example.

Know your goals

Rarely has an FCIS student been told: what is the purpose of your faculty, and why give those subjects in particular.

To improve the situation, I created this presentation: a tour of almost all FCIS subjects and the purpose of each, both science-wise and market-wise. If you haven't seen it already, I suggest doing so.

Epilogue

I hope some of those ideas turn out to be practical and useful. I think there's much more to be said in this area, and I might write a part II of this article someday :)

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

التفكير الحوسبي: مفتاح لنهضة علمية عربية

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

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

قبل ان اقول ماذا اقترح القيام به في هذا المجال، سآخذكم في جولة عبر ما يفعله الآخرون في العالم الغربي في هذا المجال. الفقرة القادمة من ورقة بحثية بعنوان"Computational thinking: What and why"

At Carnegie Mellon, computational thinking is everywhere. [...]
We have programs in computer music, and in computation, organizations, and society. We have joint programs between computer science and other disciplines, e.g.,
  • Algorithms, combinatorics, and optimization (computer science & mathematics, business)
  • Computer science and arts
  • Entertainment technology (computer science & drama)
  • Human-computer interaction (computer science & design, psychology)
  • Language technologies (computer science and linguistics)
  • Logic and computation (computer science and philosophy)
  • Pure and applied logic (computer science & math, philosophy)
  • Robotics (computer science & electrical and computer engineering, mechanical engineering)."
يعني باختصار، جامعة كارنجي ميلون (على سبيل المثال) يبحثون في كل المجالات العلمية في كل الكليات: اللغويات والفلسفة والأعمال والهندسة و...و...كيف يمكن حوسبتها؟
تعالوا الآن ننظر للشركات والمؤسسات الحكومية الأمريكية والبريطانية كيف تمول هذه المشاريع
  • On May 29,2009 an event about computational thinking was sponsored by ACM, CRA, CSTA, IEEE, Microsoft, NCWIT, NSF, and SWE...
  • CSEdWeek is sponsored by ABI, ACM, BHEF, CRA, CSTA, Dot Diva, Google, Globaloria, Intel, Microsoft, NCWIT, NSF, SAS, and Upsilon Pi Epsilon
  • In August 2010, the British Royal Society announced that it is leading an 18-month project to look “at the way that computing is taught in schools, with support from 24 organisations from across the computing community including learned societies, professional bodies, universities, and industry” (http://royalsociety.org/Education-Policy/Projects/).
من هذه الأمثلة يتضح أن فئات المجتمع كلها، من شركات ومؤسسات حكومية وعلمية، يركضون حتى يصدم بعضهم بعضاً لتمويل مثل هذه الأنشطة.
ألم يأت دورنا نحن؟ سأقول لكم الآن الخطة التي لدي؛
المشروع هو مركز ابحاث لدعم نشر التفكير الحوسبي في مصر والعالم العربي، يقوم بنشاطات مثل الآتي:
  • التعاون مع طلبة الماجستير والدكتوراه في المجالات الحوسبية أو التعليمية أو العلمية، لبحث تطوير تدريس علوم الحاسب أو تطبيق علوم الحاسب على العلوم الأخرى
  • التعاون مع الاساتذة الجامعيين أو المدارس في تجربة تطبيق علوم الحاسب في المناهج التي يدرسونها
  • استخدام منهج البحث العلمي (أي عمل افتراضية ومحاولة اثباتها أو نفيها بتجربة) في تطوير مناهج تعليم البرمجة لتلاميذ المدارس، وذلك عن طريق التجربة مع اطفال حقيقيين
  • عمل الندوات في الجامعات، المؤتمرات، والاماكن العامة (مثل ساقية الصاوي) لتعريف المجتمع بأهمية التفكير الحوسبي
  • السعي لتطوير مناهج جاهزة يمكن استخدامها بالمدارس في مصر وخارجها
  • تطوير لغات برمجة جديدة، العاب الكترونية يمكن برمجتها، وغير ذلك من وسائل التعليم المتطورة المخصصة للأطفال
المركز سيبدأ صغيراً ويكبر مع الوقت، وسيقوم بجزء بحثي وجزء توجيهي، أي أنه سيقوم بجزء من البحث الكلي، بينما لكن ينبغي أن يشارك المجتمع كله بجامعاته ومؤسساته بعد ان تبدأ الفكرة في الانتشار.
هذه الفكرة اسعى لها منذ مدة طويلة، كما يتضح من اول تدوينة لي في هذا الموضوع، انها كانت عام 2009
http://iamsamy.blogspot.com/2009/04/blog-post.html
وقد قمت بخطوات فعلية في هذا الموضوع، مثل تصميم وتنفيذ لغة "كلمات" لتعليم الأطفال البرمجة:
http://www.kalimat-lang.com
ومدونة "التفكير الحوسبي في مصر"
http://ctegypt.blogspot.com
وهذه روابط للمزيد من المعلومات
The Official Project Proposal:

Presentation (research-oriented) about CT and Egypt:
Computational thinking: why and how (Paper)

مقال بالتفصيل يجيب عن السؤال: كيف يمكن للتفكير الحوسبي أن يغير العلم
بالانجليزية:
http://ctegypt.blogspot.com/2011/12/computational-thinking-why-is-it-that.html

بالعربية:
 http://iamsamy.blogspot.com/2011/12/blog-post_27.html

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

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

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

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