الجمعة، 17 يونيو 2011

آلة حاسبة بلغة كلمات


لا تحتاج خبرة سابقة بالبرمجة بلغة كلمات لتتابع هذا المثال (لكن تحتاج لأن تعرف البرمجة بشكل عام). إذا أردت أن تجربه عملياً فيمكنك تحميل أحدث نسخة من اللغة من http://code.google.com/p/kalimat/downloads


هام: هذا المثال يحتاج نسخة يونيو 2011 أو أحدث ليعمل. لو كنت قد حملت نسخة قديمة من كلمات فستحتاج أن تحمل نسخة جديدة.

الآن هيا نبدأ!

رسم الأزرار على الشاشة
زر1 = زر جديد
زر1 : حدد.المكان ( 10 ، 10 )
زر1 : حدد.الحجم ( 30 ، 30 )
زر1 : حدد.النص ( "1" )
ن = النافذة.الحالية ( )
ن : اضف ( زر1 )

ستؤدي الكود السابقة لعرض زر على الشاشة. لاحظ ان علامة النقطتين ' : ' معناها method call، مثل علامة النقطة في لغات البرمجة المعروفة. الأمر جديد هنا هو نفسه operator new في اللغات الأخرى.

نحن سنرسم أزراراً كثيرة في البرنامج، لذلك هيا نكتب دالة (function) توفر علينا عناء الكتابة المتكررة:
دالة صنع.زر(س ، ص ، العرض ، الارتفاع ، النص ، النافذة):
   ز = زر جديد
   ز : حدد.المكان ( س ، ص )
   ز : حدد.الحجم ( العرض ، الارتفاع )
   ز : حدد.النص ( النص )
   النافذة : اضف ( ز )
   ارجع ب: ز
نهاية
لاحظ هنا أن العوامل (parameters) لا تأخذ تعريف للأنواع، بل فقط تأخذ اسماً، وذلك لأن اللغة dynamically typed مثل لغات البايثون مثلاً أو الجافاسكريبت. أيضاً لاحظ أن النقطة هي جزء من اسم الدالة، أي ان اسمها صنع.زر هكذا كلمة واحدة، النقطة في كلمات هي جزء من رموز المعرفات (identifier characters) ولا دور لها في معنى البرنامج.

الآن وقد صار لدينا دالة تسهل وضع الأزرار يمكننا أن نرسم شكل الآلة الحاسبة، نبدأ أولاً بالأزرار ثم نضيف لاحقاً 'شاشة العرض' التي ستظهر عليها النتيجة:
ن = النافذة.الحالية ( )
زر1 = صنع.زر (40 ، 130 ، 30 ، 30 ، "1" ، ن)
زر2 = صنع.زر (70 ، 130 ، 30 ، 30 ، "2" ، ن)
زر3 = صنع.زر (100، 130 ، 30 ، 30 ، "3" ، ن)
زر4 = صنع.زر (40 ، 100 ، 30 ، 30 ، "4" ، ن)
زر5 = صنع.زر (70 ، 100 ، 30 ، 30 ، "5" ، ن)
زر6 = صنع.زر (100، 100 ، 30 ، 30 ، "6" ، ن)
زر7 = صنع.زر (40 ، 70  ، 30 ، 30 ، "7" ، ن)
زر8 = صنع.زر (70 ، 70  ، 30 ، 30 ، "8" ، ن)
زر9 = صنع.زر (100 ، 70 ، 30 ، 30 ، "9" ، ن)
زر0 = صنع.زر (70 ، 160 ، 30 ، 30 ، "0" ، ن)

زر.الجمع = صنع.زر (10 ، 70  ، 30 ، 30 ، "+" ، ن)
زر.الطرح = صنع.زر (10 ، 100 ، 30 ، 30 ، "-" ، ن)
زر.الضرب = صنع.زر (10 ، 130 ، 30 ، 30 ، "×" ، ن)
زر.القسمة = صنع.زر(10 ، 160 ، 30 ، 30 ، "÷" ، ن )
زر.يساوي = صنع.زر (40 ، 160 ، 30 ، 30 ، "=" ، ن)
زر.الفاصلة.العشرية = صنع.زر(100، 160، 30، 30، "."، ن)

والآن حان دور شاشة العرض:
الشاشة = سطر.نصي جديد
الشاشة : حدد.المكان ( 10 ، 30 )
الشاشة : حدد.الحجم ( 120 ، 30 )
الشاشة : حدد.النص ( "" )
ن : اضف ( الشاشة )

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

الآن يمكننا تجربة البرنامج:

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

ن : حدد.الحجم ( 150 ، 210 )
ن : حدد.العنوان ( "الحاسبة" )


هذا أفضل بكثير!

ادخال المستخدم للأرقام

الآن بعد عمل "شكل" البرنامج حان وقت اضافة "المضمون". أول شيء نريده هو عرض الأرقام حين يدخلها المستخدم. الأمر نلخصه في القواعد الآتية:
1- إذا ضغط المستخدم زر رقمي [0..9]، اضف الرقم المناظر للزر إلى شاشة العرض
2- إذا ضغط المستخدم زر الفاصلة العشرية اضفه لشاشة العرض إذا كانت هذه أول مرة يضغط فيها، وإلا لا تفعل شيئاً.

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

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

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

لو قمت بتجربة البرنامج الآن ستجد أنه يضيف "1" إلى الشاشة كلما ضغطت الزر المطلوب.

(دور القنوات أكثر بكثير مما قيل هنا، لكن لن نتوسع في الحديث عنها في هذا المثال المبدئي)

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

   تسلم إشارة من ضغط زر2
   الشاشة : الحق.نص ( "2" )
تابع
لماذا لن تنفع؟ لأننا هنا نأمره أن يتسلم الإشارات بالترتيب، أي أننا نقول للبرنامج "تسلم اشارة من ضغط زر1، ثم تسلم إشارة من زر2". هذا سيعمل فقط لو أراد المستخدم أن يدخل شيئاً مثل "12" أو "1212"، "121212"...الخ :(

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

من السهل تعميم ذلك لندخل الأرقام كلها:
كرر :
    تخير :
    تسلم إشارة من ضغط زر1 :
       الشاشة : الحق.نص ( "1" )
    أو تسلم إشارة من ضغط زر2 :
       الشاشة : الحق.نص ( "2" )
    أو تسلم إشارة من ضغط زر3 :
       الشاشة : الحق.نص ( "3" )
    أو تسلم إشارة من ضغط زر4 :
       الشاشة : الحق.نص ( "4" )
    أو تسلم إشارة من ضغط زر5 :
       الشاشة : الحق.نص ( "5" )
    أو تسلم إشارة من ضغط زر6 :
       الشاشة : الحق.نص ( "6" )
    أو تسلم إشارة من ضغط زر7 :
       الشاشة : الحق.نص ( "7" )
    أو تسلم إشارة من ضغط زر8 :
       الشاشة : الحق.نص ( "8" )
    أو تسلم إشارة من ضغط زر9 :
       الشاشة : الحق.نص ( "9" )
    أو تسلم إشارة من ضغط زر0 :
       الشاشة : الحق.نص ( "0" )
    تم
تابع
الكود طويلة لكن كلها تشبه بعضها؛ لا تعقيد كبير فيها. هناك طرق لجعلها أكثر تنظيماً لكن صورتها الحالية بسيطة، ونحن نريده مثالاً بسيطاً في الوقت الحالي...

الفاصلة العشرية

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

كرر :
    تخير :
    تسلم إشارة من ضغط زر.الفاصلة.العشرية :
        إذا كتبنا.فاصلة.عشرية = خطأ :
            الشاشة : الحق.نص ( "." )
            كتبنا.فاصلة.عشرية = صحيح
        تم
    أو تسلم إشارة من ضغط زر1 :
        الشاشة : الحق.نص ( "1" )
    أو تسلم إشارة من ضغط زر2 :
        الشاشة : الحق.نص ( "2" )
    ........وهكذا وهكذا الخ الخ
    تم
تابع

العمليات

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

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

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

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

الجزء الآخر عند ضغط زر 'يساوي'
....
أو تسلم إشارة من ضغط زر.يساوي :
    العدد.الثاني = الشاشة : نصه ( )
    العدد.الثاني = كعدد ( العدد.الثاني )
    إذا العملية = "+" :
        النتيجة = العدد.الأول + العدد.الثاني
        النتيجة = كنص ( النتيجة )
        الشاشة : حدد.النص ( النتيجة )
        العملية = ""
    تم
....
هذا بدوره يقوم بالآتي:
1- يأخذ العدد الموجود على الشاشة ويخزنه في المتغير العدد.الثاني
2- يتأكد أن العملية عملية جمع (سيكون هذا مهماً حين نضيف باقي العمليات) ويحسب النتيجة المطلوبة
3- يعرض النتيجة على الشاشة بعد تحويلها إلى صورة نصية
4- يعيد العملية إلى القيمة غير المعرفة "" إلى أن نختار عملية جديدة

هناك فقط مشكلة هي أن البرنامج سيعمل بطريقة صحيحة مرة واحدة فقط: لو أدخلت 12 ثم + ثم 13 ثم = فستجد النتيجة 25، لكن إن ضغطت بعدها 1 فستجد مكتوب على الشاشة 251

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

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

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

لكي نحل المشكلة نحتاج لمتغير جديد اسمه تفريغ، معناه "هل علينا أن نفرغ الشاشة حين يضغط المستخدم على زر عددي في المرة القادمة"؟

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

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

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

ن = النافذة.الحالية ( )
زر1 = صنع.زر (40 ، 130 ، 30 ، 30 ، "1" ، ن)
زر2 = صنع.زر (70 ، 130 ، 30 ، 30 ، "2" ، ن)
زر3 = صنع.زر (00 ، 130 ، 30 ، 30 ، "3" ، ن)
زر4 = صنع.زر (40 ، 100 ، 30 ، 30 ، "4" ، ن)
زر5 = صنع.زر (70 ، 100 ، 30 ، 30 ، "5" ، ن)
زر6 = صنع.زر (100، 100 ، 30 ، 30 ، "6" ، ن)
زر7 = صنع.زر (40 ، 70  ، 30 ، 30 ، "7" ، ن)
زر8 = صنع.زر (70 ، 70  ، 30 ، 30 ، "8" ، ن)
زر9 = صنع.زر (100، 70  ، 30 ، 30 ، "9" ، ن)
زر0 = صنع.زر (70 ، 160 ، 30 ، 30 ، "0" ، ن)

زر.الجمع = صنع.زر (10،  70 ، 30 ، 30 ، "+" ، ن)
زر.الطرح = صنع.زر (10، 100 ، 30 ، 30 ، "-" ، ن)
زر.الضرب = صنع.زر (10، 130 ، 30 ، 30 ، "×" ، ن)
زر.القسمة = صنع.زر(10، 160 ، 30 ، 30 ، "÷" ، ن)
زر.يساوي = صنع.زر (40، 160 ، 30 ، 30 ، "=" ، ن)

زر.الفاصلة.العشرية = صنع.زر(100، 160، 30، 30، "."، ن)

الشاشة = سطر.نصي جديد
الشاشة : حدد.المكان ( 10 ، 30 )
الشاشة : حدد.الحجم ( 120 ، 30 )
الشاشة : حدد.النص ( "" )
ن : اضف ( الشاشة )

ن : حدد.الحجم ( 150 ، 210 )
ن : حدد.العنوان ( "الحاسبة" )
كتبنا.فاصلة.عشرية = خطأ
العملية = ""
العدد.الأول = لاشيء
تفريغ = خطأ

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

        إذا ليس النتيجة = لاشيء :
            النتيجة = كنص ( النتيجة )
            الشاشة : حدد.النص ( النتيجة )
            العملية = ""
            تفريغ = صحيح
        تم
    أو تسلم إشارة من ضغط زر.الفاصلة.العشرية :
        إذا كتبنا.فاصلة.عشرية = خطأ :
            الشاشة : الحق.نص (".")
            كتبنا.فاصلة.عشرية = صحيح
        تم
--------
    أو تسلم إشارة من ضغط زر1 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("1")
--------
    أو تسلم إشارة من ضغط زر2 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("2")
--------
    أو تسلم إشارة من ضغط زر3 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("3")
--------
    أو تسلم إشارة من ضغط زر4 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("4")
--------
    أو تسلم إشارة من ضغط زر5 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("5")
--------
    أو تسلم إشارة من ضغط زر6 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("6")
--------
    أو تسلم إشارة من ضغط زر7 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("7")
--------
    أو تسلم إشارة من ضغط زر8 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("8")
--------
    أو تسلم إشارة من ضغط زر9 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("9")
--------
    أو تسلم إشارة من ضغط زر0 :
        إذا تفريغ :
            الشاشة : حدد.النص ("")
            تفريغ = خطأ
        تم
        الشاشة : الحق.نص ("0")
    تم
تابع
يبدو البرنامج طويلاً، لكن تذكر أنه كله أجزاء متكررة: الكود الخاصة بالعمليات مكررة أربع مرات والجزء الخاص بالأرقام عشر مرات! هناك بالتأكيد طرق لاختصار هذه الكود كما قلت، لكن حاليا...إنها تعمل :)


مازال هناك بعض الإمكانات التي يمكن إضافتها:
  • السماح بإدخال سلسلة مثل 12 / + / 13 / + / 15 بحيث تظهر نتيجة "12+13" عند ضغط علامة زائد الثانية قبل استمرار العمليات
  • إجراء العمليات بالترتيب الرياضي الصحيح، يعني لو أدخل المستخدم 7+5×2 تكون النتيجة 17 وليس 24
  • تدارك أخطاء المستخدم المحتملة
لكن هذه الإمكانيات خارج نطاق هذا المثال التوضيحي على أية حال. يمكنك أن تكتبها أنت إن أردت ^^

السبت، 21 مايو 2011

تحذير: ساحكي قصة حياتي!

جانب علمي

ما تريد أن تكون عندما تكبر؟ رائد فضاء....لا! لا! أريد أن أكون مخترعاً!

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

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

جربت برمجة الألعاب. قرأت في الرياضيات. نصحني أستاذ لي بالقراءة في الArtificial intelligence، قرأت فيه من كتاب، ثم مللته وقرأت من كتاب آخر. كان ذلك الكتاب الآخر فيه مقدمة للغة Lisp...شدتني اللغة ربما أكثر من الAI نفسه.

بعدها قرأت عن لغة Haskell. وبدأت افهم أنه هناك عالم أكبر بكثير من الC والJava وما شابه. مجالي المفضل هو...لغات البرمجة!

(من فضلكم: لا يقولن أحد أن مجالي هو الcompilers! هناك فرق بين compilers وبين programming language theory).

جانب عملي

بعد التخرج صار السؤال: ماذا أريد أن أفعل؟ قبلت وظيفة المعيد. بعدها بسنين تركتها. قبل أن أدخل في وظيفة أخرى كان لابد أن أقف وقفة مع نفسي: ماذا أريد بالضبط؟ ما الذي جعلني اختار تلك الوظيفة؟ (لابد من سبب منطقي)، وما الذي جعلني أتركها؟ ما هدفي؟

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

في النهاية قررت أن أبني تلك البيئة لنفسي: شركة وظيفتها تحويل الcomputer science إلى أرباح، شركة ما هي إلا حجة للمخترعين كي يخترعوا.

(مازال السعي لتلك الشركة مستمراً.)

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

شيء آخر: بعد تركي للكلية وجدت طالباً يقول لي أنه يريدني أن القي بعض المحاضرات عن الLisp.

قلت له: لكني لم أعد معيداً رسمياً.

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

هنا اكتشفت شيئاً جديداً؛ أنني لا أحتاج أن أكون عضو هيئة تدريس لأقدم علماً لمن يريده!

منذ ذلك الحين قدمت ندوات عن ال
جانب شخصي

في 2010 حدث شيء جديد: بدأت أقابل أطفالاً في عائلتنا لم أكن قد رأيتهم من قبل (كنت منعزلاً نوعاً ما) وأطفال لمعارف.اكتشفت معلومة جديدة: إن الطفل لهو شيء مذهل.

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

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

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

هذا هو الهدف الناقص!!

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

جانب فلسفي

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

شيئاً فشيئاً أحاول التوصل لإجابة هذا السؤال:
  • لكي تخترع لابد (1) أن تفهم قوانين الطبيعة ثم (2) تفكر كيف تطوع تلك القوانين لتحقيق أهداف بطرق جديدة.
  • لكي تبرمج لابد أن تفهم الsyntax/semantics الخاصة بلغة البرمجة ثم تصنع بها شيئا جديدا.
  • لكي تلعب مع الطفل [بطريقتي] لابد (1) أن تكون مثقفا و (2) أن تفكر في طرق لشرح ما تعلم بطريقة تناسب سن الطفل.
  • لكي تسعى للمشاركة في إحداث نهضة عليك أن تفهم كيف يتغير المجتمع وكيف تنتشر الأفكار، ثم تخطط لنشر الأفكار التي تراها صحيحة.
  • كل هذه الأشياء مرتبطة ببعضها: اهتمامي باللغة العربية ينعكس على البرمجة ينعكس على الأطفال ينعكس على النهضة.
يمكن إذاَ تلخيص الدافع الذي يحركني كإنسان في كلمات ثلاث:
Explore. Understand. Invent

لو أردت عدداً أكبر من الكلمات:
Search, understand, create. Try to do things no one did before you.
Whether it's programming, a business, or society.

هذا يفسر أشياء كثيرة؛ أليس كذلك؟ هل تذكر اقتراحاتي لتطوير الACM؟ كنت أقول أننا نحتاج إلى "Creation, Diversity, Depth". الآن انظر:

Search / Understand / Create <==> Diversity/ Depth / Creation

ماذا عن فكرة مركز التفكير الحوسبي؟ هدف إنشاء المركز جزئين: (1) البحث عن طريقة متطورة لتعليم البرمجة/علوم الحاسب (2) اقتراح هذه الطريقة للمدارس والمؤسسات التعليمية. أي نفس فكرة الفهم ثم التطبيق.

إن استكشاف الإنسان لنفسه لشيء صعب حقاً...

(هل تشعر أن هذه التدوينة علمية أكثر من اللازم؟ استرخ قليلاً هنا)

لك ولأطفالك :)

ماما جابت لي معزة

ماما جابت لي معزة
ماما جابت لي معزة
المعزة مستفزة...
بس أنا باحب المعزة،
اللي جابتها ماما

ماما جابت لي سمنة
ماما جابت لي سمنة
انا واختي سلمى
مش بنحب السمنة
اللي جابتها ماما

ماما جابت لي جزمة
ماما جابت لي جزمة
جزمة مالهاش لازمة...
بس انا باحب الجزمة
اللي جابتها ماما

ماما جابت لي نملة
ماما جابت لي نملة
نملة متكاملة
وانا باحب النملة
اللي جابتها ماما

ماما جابت لي فرخة
ماما جابت لي فرخة
فرخة لابسة طرحة
وانا باحب الفرخة
اللي جابتها ماما

ماما جابت لي وزة
ماما جابت لي وزة
الوزة مشمئزة...
بس انا باحب الوزة
اللي جابتها ماما

ماما جابت لي زبدة
ماما جابت لي زبدة
زبدة بطعم الكبدة
وانا باحب الزبدة
اللي جابتها ماما

يوم الجمعة

بابا راح يصلّي
واخويا بيشد ودني
وانا قلت يا أمي:
اخويا شد ودني again.

انا باحب السمك
واخويا بيحب السمك
بابا في عمل السمك انهمك
وماما عملت آيس كريم.

عايزة اروح النادي
واخويا عايز النادي
ومامي قالت لdaddy:
ماتوديهم النادي يا حسين.

الأربعاء، 18 مايو 2011

خطة للنهضة(3): أفكار للضربات الجراحية

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

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

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

العمل بالإسلام

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

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

نشطة تعني مراكز ابحاث للحكم الإسلامي والدعوة الإسلامية والاقتصاد الإسلامي. باحثون وعاملون ومكافحون في كل لحظة وفي كل مكان في العالم لا يتوقفون ليل نهار [وكثير من هذا موجود بالفعل].

ما هي الخطوات الأولى لتحقيق هذه البيئة؟ لديّ اقتراحات مبدئية:

تحديث طريقة كتابة كتب العلوم الإسلامية

فلنبدأ بالأشياء البسيطة: يمكن مثلا تعميم طرق تهيئة النص الحديثة في الكتب: كاستخدام الbullet points في السرد فيما لا يناسبه الفقرات الطويلة، أو استخدام تنسيق معين للاقتباس من كتب اخرى بدلا من الطريقة التقليدية (طريقة قال فلان.....إنتهى) أو استخدام الجداول والرسومات البيانية والاصطلاحات الرياضية لتوضيح المقاصد (مثلا رأيت كاتبا إسلاميا استخدم Venn diagram في أحد كتبه).

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

كما أننا الآن في عصر وسائل التعليم المبتكرةـ والعالم كله -ونحن فيهم- يبحث عن طرق تطوير طرق التعليم كلها، وأعتقد انه هناك آلاف الفرص الخفية لتطوير تعليم الإسلام عن طريق الكمبيوتر أو الأنترنت أو الmobile devices، وهكذا.

الجمع بين علوم الدين والدنيا والتكامل بينهما

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

كنت أستمع لبرنامج عن علم الحديث وكان الشيخ يشرح مصطلح "الإعلاء" [تخيل شخص سمع حديثا عن فلان عن فلان...سبع مرات حتى يصل الإسناد للرسول صلى الله عليه وسلم، لو استمع هذا الشخص للحديث من راو آخر سلسلة إسناده طولها اربعة، فقد صار اسناده هو أعلى لأنه قلل عدد الرواة بينه وبين الرسول. هذا هو الإعلاء.] ولاحظت على الفور شيئا: ان هذا مرتبط جدا بفرع من الرياضيات هو الgraph theory. لقد اخترع علماء الحديث قطعة من الgraph theory وهم لا يعلمون، وأني أرى استفادة عظيمة لو اخذنا مثل هذا العلم وقد صار علما رسميا وطبقناه على روايات الأحاديث.

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

وكل هذا الذي أقول ليس بجديد، بل هو سنّة علماء المسلمين منذ قرون: العلوم الدينية والدنيوية تتطور جنبا إلى جنب ويكمل كل منهما الآخر.

طبقة وسطى قوية

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

ماذا نفعل لنشجع الناس على الاستقلال بأعمالهم وتكوين شركاتهم؟

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

2- تخفيف المخاطرة في إنشاء الشركات: وذلك بتجميع وتوفير وبحث كل العلوم المطلوبة من تخطيط وتسويق وقانونيات وبيع وتعيين، وعلينا أن نجعل هذه المعلومات متاحة قدر الإمكان (يفضّل أن تكون مجانية) وأن تُحدّث باستمرار، وأتمنى أن يكون هناك مؤتمرات تضم مؤسسي الشركات الناجحين يتحدثون عن خبراتهم ويمدون يدهم للمؤسسين الأقل خبرة. وأن يأتي كُتّاب يعملون حوارات مع هؤلاء المؤسسين ويجمعون خبراتهم في كتب (مثلا كتاب لكل عشر شركات). لا اتحدث عن أمور التنمية البشرية وسائر النصائح العامةـ بل اتحدث عن التفاصيل والخبرات المتخصصة...كيف عين فلان هؤلاء الموظفين العباقرة؟ هل هي الinterviews؟ أم بيئة العمل الجذابة؟ وما نوع اسئلة الinterviews؟ وكيف تأكد أن المتقدمين لم يغشوا في الإجابة؟ ولماذا كانت جذابة تلك البيئة؟ أكان سبب جاذبيتها المرتبات الكافية ام اعطاء الناس الحرية في إدارة انفسهم ام امتيازات غير مادية؟ وكيف وازن بين اعطاء الناس الحرية وبين تأسيس بيئة عمل منظمة مُتحَكّم فيها؟ وكيف باع منتجاته؟ وكيف حافظ على مستوى خدمة العملاء؟ وكيف يقوم بترقية الموظفين؟

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

3- تمويل الشركات الجديدة، خاصة التمويل من نوع seed funding الذي يقدم مبالغ أقل من أنواع التمويل الأخرى مقابل التزامات أقل من أصحاب الشركة. دفع مبالغ قليلة للتمويل له فوائده: أنه يعطي الفرصة لتمويل شركات اكثر، أنه يسمح لأفراد اكثر من المجتمع أن يمولوا بدلا من اقتصار الفرصة على الحكومات أو الأغنياء، وأن كَوْن المبلغ قليل هو نوع من التصفية يدفع الممول للبحث عن الأذكياء المكافحين الذين ينجزون الكثير بأقل ما يمكن. المبرمج المتمكّن مثلا سيعرف كيف يستخدم برامج الopen source وكيف يجمّع اجهزته بنفسه وكيف يستخدم الأنترنت الاستخدام الأمثل للتسويق بدلا من الاستعانة بشركه دعاية غالية، وهكذا. فإن وجدت هؤلاء فهم فعلاً يستحقون التشجيع والدعم.

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

4- البحث في طرق جديدة لمزاولة العمل. هناك اشخاص لا يريدون إنشاء شركات وفي نفس الوقت يريدون بعض الاستقلال الشخصي وعدم الارتباط بمؤسسات كبيرة. نحن في القرن ال21 فلماذا نصرّ على ممارسة أعمالنا بالطرق القديمة؟ الا يمكن مثلا عمل شركة برمجة بها فريق إداري وقانوني ومحاسبي ثابت لكن كل مبرمجيها من الfreelancers؟ هكذا يكون المبرمج قد احتفظ بحريته لكن لم يحتج لتولي مسؤوليات لا يريد توليها، وفي نفس الوقت فإن الشركة الأم قد فازت بالمرونة (يمكنها تعيين المبرمجين وتركهم في أي وقت) وبمزايا اقتصادية (لن تدفع مرتبا لمبرمج إلا لو كان يعمل في مشروع) وهكذا.

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

علم مستشري

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

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

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

4- مجالس العلم: ذات مرة مررت بجانب مسجد وسمعت محاضرة تُلقَى بالداخل فدخلت وجلست أستمع. كانت تجربة جميلة، أن استمع لعلم بدون سبب اكاديميّ أو وظيفي. اتمنى أن تعود فكرة مجالس العلم، سواء في المساجد أو بصورة مستقلة، كنوع من "العلم العرضي" أي بصورة عارضة بلا خطة مسبقةـ يمر المرء فيرى علما فيجلس يستمع.

5- العلم باللّغة العربية: انظر لمصطلح في علم الأحياء مثل ungulates، أيهما أسهل في التعلّم: "أُنجُليت" أم "الحافريّات"؟ أيهم أدل على سبب التسمية؟ ماذا عن platyhelminthes...هي أم "الديدان المسطّحة"؟ أو لننظر في علم الرياضيات، أنقول dodecahedron أم "ذو الإثنا عشرة سطحا"؟ إن المصطلحات العلمية لاتينية الأصل تبدو غريبة ليس لمتحدثي العربية فحسب بل لمتحدثي الانجليزية أنفسهم الذين تجدهم يبحثون عن معناها كما نبحث نحن! مقابل ذلك فإن اللغة العربية وعاء يستوعب ما تريد من العلوم.

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

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

7- الالعاب! أعتقد أنه يمكن الإبداع كثيراً في استخدام الألعاب لتحبيب الأطفال في العلم. لا تخف من التعمق؛ هل تعلم مثلاً أنه هناك لعبة جماعية لتعليم البرمجة اسمها C-Jump؟ أو ألعاب ذات خلفية تاريخية/اقتصادية مثل "Made for trade"؟ بل أنه هناك من يحاول عمل لعبة عن فتح الشركات حيث تحاول الحصور على تمويل وتعين فيها مبرمجين وخبراء تسويق. هيا نحبب الناس في العلم!

8- وسائل للاختراع: من بعد الأطفال، ماذا عن المراهقين والشباب؟ أفكر في نشر "روح المهندس" أو "روح المخترع" فيهم؛ ماذا لو نشرنا بسعر رخيص وبطريقة آمنة وسائل الاختراع؟ نبدأ بالمكونات الإلكترونية من boards وmicrocontrollers ثم بعدها أشياء مثل المضخات، محركات صغيرة، خراطيم وتروس وسيور...ثم ندع الباقي لخيالهم. دعهم يحولون كرسي بعجلات إلى سيارة، ثم يتحكمون بها بالكمبيوتر عن بعد، ثم يصنعون سرباً من السيارات ويلعبوا به العاب real time strategy في الحقيقة الواقعة :)

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

سيارة عربية open source :)


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

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

(البقية في الجزء القادم)

الأحد، 8 مايو 2011

بين عبقرينو وروبرت كوخ

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

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

‫هناك نوعين إذًا أميّز بينهما: الباحث الذي يهدف أساسا لفهم شيء عن الكون الذي نعيش فيه، والمخترع الذي يستفيد من العلم‬.

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

‫كنت فيما مضى أظن أنني أريد أن أكون روبرت كوخ. أرى نفسي في نقطة مستقبلية كعالم computer science أكتشف نظريات جديدة،
‫لكني في الواقع أريد أن أكون عبقرينو‬.

أريد أن أستخرج الكنوز المدفونة في الأبحاث العلمية وأصنع بها أشياء مبهرة. أريد - في مرحلة ما من عمري- أن أصمم أشياء لم يكن يُتخيّل أنها تصنع. أريد أن أرى تصميماتي وهي تعمل على أرض الواقع.

هل معنى ذلك أنني لا أريد أن أكتشف أية نظرية علمية؟ ربما يحدث أن أكتشف شيئا أو أطوّر شيئا (لو بلغت ذلك المستوى...لو!). المسألة ليست عِناداً!

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

هل سأبلغ ذلك المستوى؟ هل سيتحقق ما أرغب؟ لا أعلم!

السبت، 7 مايو 2011

Two personal stories related to Lisp

Story #1

Autumn of 2007. I was giving a series of Lisp sessions for some second year students.

The students were surprisingly good, and it got me thinking: the problem facing almost any software company is how to have good developers. They (i.e the good companies) usually solve it in two parts:
  1. Set up an attractive environment for developers
  2. Set up good interviews to differentiate good developers from bad
Now for this question: What if, instead of searching for good developers, we began making them?

What if someone formed a company with two sides: a production side and an academic side. The employees in this company would have double duties: To produce and sell great software, and to transfer their knowledge and experience to a newer generation of smart students.

And they would be sincere in it: They would not give sessions that are actually hidden advertisement for their products. They would not force students to join the company or to take training therein; no: their primary academic goal would be to foster an environment of learning and raise as many great programmers as possible. Even if not all of those programmers join us, the end result would be a better market and an academic scene where science and skills are everyone's goal. In the end, we'd still benefit one way or another.

Since 2007 this has been the company I'm trying to form.

Story #2

I created a Lisp-like language in 2008, called Ayka. (You thought Kalimat was the only language I made?).



It was intended to be a part of a larger project called "Mira", but that project has stopped. The language was written in C# and Ayka programs could use the .net libraries. It had its own simple IDE and wrappers for the Winforms GUI library:



It also had those features:
  • Support for "defmacro" style Lisp macros
  • Support for full continuations via trampolines
  • The ability to create dynamic web pages
I was an amateur language implementer at the time (actually, I still am), so the project wasn't really mature: The language was slow, the libraries were buggy, things were falling apart, so I stopped working on Ayka and moved on to other projects. I learned a lot from it though, and it influenced my work on Kalimat --mainly by telling me what mistakes to avoid.

Still, from time to time, I wonder if the project could be revived. I also wonder if those sessions should be given again...

الأربعاء، 27 أبريل 2011

قراقيش

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

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

الجمعة، 18 مارس 2011

البدء في مشروع مركز التفكير الحوسبي

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

أولاً: عرض الهدف

الفكرة باختصار هي أنه هناك في مصر مركزين لتعليم الأطفال البرمجة (انظر هنا و هنا). أنا أريد فتح مركز ثالث.

لماذا؟ أولاً زيادةً في الخير والتنمية. ثانياً أريد تجربة شيء جديد هو تطوير وسائل تعليم البرمجة ذاتها. ما معنى ذلك؟

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

1- هناك اقتراح ان طريقة كذا افضل لتعليم طفل البرمجة
2- يتم تغيير المنهج قليلا ليستخدم الطريقة الجديدة
3- يتم تقسيم الطلبة إلى مجموعتين: مجموعة تجريبية تستخدم المنهج الجديد ومجموعة control group تستخدم المنهج التقليدي.
4- يتم تقييم المجموعتين وتسجيل الملاحظات، مع تحليل النتائج تحليلاً علميّا.
5- إما أن تكون الملاحظات كافية لعمل استنتاجات أو يتم تكرار التجربة
6- نشر التجارب في صورة أبحاث كلما أمكن ليكررها سائر العلماء في مؤسسات أخرى ويراجعوها.

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

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

ثانياً: فتح باب التعاون

أ) الخطة الحالية هي التدريس بلغة كلمات للأعمار الصغيرة (8-12)، ودراسة فكرة تقديم لغة أخرى "كبيرة" للأعمار فوق ذلك.

ب) الموضوع يحتاج مجموعات العمل الآتية:
- مجموعة لوضع منهج دراسي عبارة عن كتاب + خطة دراسية [بمعنى كل درس له محتواه + تمارينه + ....]
- مجموعة لشرح الكورسات نفسها
- مجموعة لاختبار لغة كلمات لتكون جاهزة لمواجهة المجتمع :)
- على المدى الطويل هناك مجموعة بحثية دورها تطوير المناهج، تطوير الأدوات التعليمية (برامج وخلافه)، البحث العلمي في سبل التعليم.

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

د) هل الموضوع تطوعي أم بمرتبات؟ قل لي رغبتك وسأحاول تحقيقها بقدر الإمكان :)

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

و) من سيشرف على تحضير المناهج؟ غالبا أنا أو معيدين أحاول الإتيان بهم.

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

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

ط) كيف يمكن التقدم بالمساعدة؟ حاليا احاول فتح حوار غير رسمي مع من يريد التقدم. يمكن مراسلتي بالبريد الالكتروني على samy2004@gmail.com . لو رأيت العدد كبيراً ربما يمكن عمل اجتماع مع المساهمين كلهم. بعد ذلك يمكن الحديث عن الأدوار الرسمية. لو أردت المحادثة أرجو إخباري بالمساهمة المفضلة لديك [تحضير مناهج، اختبار اللغة، تقديم الكورس في الصيف، دور بحثي].

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