إنما البرمجة تفصيل المبهم وتنظيم الذي لا يُنظّم. البرنامج امتداد لفكرك واللغة أداتك؛ فاشحذ فكرك فالكمبيوتر لن يؤلف شيئا بدلا منك، وأتقن لغتك فالكمبيوتر لن يقرأ أفكارك. اعرف لغات متعددة تتفتح الطرق لك، ولا تتحيز للغة دون الأخرى. فكر في مواءمة اللغة للهدف الذي بين يديك، ولا تضيع وقتا في جدل عن لغة مقابل غيرها، وتذكر: إن هي إلا أدوات تعمل بها.
البرمجة أسسها رياضية وتطبيقاتها عملية – فقدّر هذين الجانبين واهتم بهما، واستمتع بما تعمل واعمل ما تنفع به الناس، ولا تتوقف عن التعلم ولا تدع تخرجا ولا توظفا يمنعك من معرفة أو يخبرك أنك قد اكتفيت من العلم.
البرامج خطط ثابتة تنفيذها عمليات سائرة. اعرف العلاقة بين تكوين البرنامج وبين سلوك العمليات الذي تتبع منه تصبحْ برامجك بين يديك، وافتح عينيك لما تراه يتكرر أمامك، وسرعان ما تجد مفاهيم كنت تظنها مختلفة قد صارت واحدا، وما كان مجسما قد صار مجردا.
ليس كل الناس مبرمجين ولم يبلغ كل المبرمجين علمك، فكن صبورا لمن لم يفهم لك قصدا ولا تتكبر على من يقلّ عنك علما، واعلم أن البرامج للبشر ليقرؤوها كما هي للآلة لتنفـّذها فاكتب برامجك لتُقرأ قبل أن تكتبها لتُنفـّذ، وليكن أول قاريء تراعيه هو أنت.
لا تجعل العمل يحطمك واهتم بصحتك، لا تقضِ الساعات الطوال جالسا بلا راحة واصنع بيئة عمل تعينك واحجز وقتا كافيا لنومك. تعلم علوما غير البرمجة تجد نفسك مبرمجا أفضل، ولو قابلت خطأ لا حل له اترك الكمبيوتر برهة لعلك تُلْهَم الحل، وتذكر أن البرمجة تفكير لا كتابة فأحيانا تفكر جديا وأنت بعيد عن الجهاز وتفكيرك عمل.
البرمجة تفاهم بين بشر وآلة وبين بشر وبشر، فتعلّم كيف تتكلم يسرِ الحال كما أردت، وتعلم كيف تكتب تتحقق أهدافك، واعلم أن أهم أداة للإقناع أن تكون على حق أولا، وإن وجدت خطأ في قولك فلا تعاند فيه. وإن كنت لا تعلم فقل "لا أعلم" ولا تدّعِ علما ليس لك.
سألتني فأجبتك على قدر ما أعلم، وما لا أعلم أكثر وأعظم.
(انتهت المقامة البرمجية، شكراً لعمر عثمان على مراجعتها والأقتراحات القيمة التي قدمها)
الأحد، 14 مارس 2010
المقامة البرمجية
الأربعاء، 8 أبريل 2009
البرمجة و التفكير (و فرصة للتفوق العلمي)
تحولات...
قديما كانت القراءة و الكتابة مهارتين نادرتين حتى ان المرء كان ليؤجّر كاتبا يكتب له ما يشاء. الآن أي طفل في الشارع يقرأ و يكتب. ثم كانت العمليات الحسابية مثل الضرب و القسمة المطولة حكراً على العلماء حتى صارت هي الأخرى في متناول التلميذ العادي.
و قديما كان علم الجبر لا يقدر عليه سوى اسطورة مثل الخوارزمي. لم يعد الأمر كذلك. مع مرور الوقت يتحرك العلم من شيء تخصصي لا يقدر عليه إلا القلّة إلى جزء من التعليم العادي. و من تخصص وظيفي إلى معرفة عامّة.
...تفتح أبوابا
و حين يصير علم مثل الحساب معرفة عامة للناس جميعا، يرتفع مستوى البحث العلمي و يمتد إلى آفاق اكبر مثل التفاضل و التكامل مثلاً. و حين تصير الفيزياء العادية معروفة للجميع يفتح هذا الباب للهندسة و الألكترونيات. و حين تصير القراءة و الكتابة أمام كل الناس يفتح هذا المجال للصحافة، التي لم تكن ممكنة في عصور كان معظم الناس فيها لا يقرأون. و لو صارت العلوم السياسية مثلا يعرفها طلبة المدارس لفتح هذا باباً للمجتمع كله ليتكلم عن ادارة الدول و نظم الحكم. و كل علم يتحول من "تخصصيّ" إلى "عام" يرفع مستوى العلم في المجتمع كله.
و الفرصة القادمة البرمجة...
أعتقد أنه في السنوات القادمة ينبغي أن تكون البرمجة جزء من التعليم الأساسي، مثلها مثل الحساب و الجبر من قبلها. يجب ان يتكلم الناس عن الAlgorithms و الArrays كما يتكلمون عن طرح x من طرفي المعادلة. هل هذا صعب؟ ليس بشدة: مع مرور الزمن يتطور مستوى تفكير المجتمع ككل. و هناك الآلاف من الناس في بلادنا و خارجها تعلموا البرمجة و هم أطفال. لو اخذ المجتمع هذا الموضوع مأخذ الجد فإني أتوقع، إن شاء الله، ان تزداد خبرة المعلمين شيئا فشيئا و يتعلموا من تجاربهم الطرق المثلى لتعليم البرمجة لأي طفل.
و هل سيفيد هذا شيئا؟ نعم يفيد في مجالين:
أولا: البرمجة هي "تفكير بطريقة رسمية" و يدخل في كل شيء في الحياة. ربما لو نظرنا لعلم مثل المحاسبة نجده مجموعة من الData structures و الAlgorithms. أشياء مثل الBaker's algorithm أو الBanker's Algorithm كانت تستخدم فعلا في المخابز و البنوك. حتى الأستراتيجيات العسكرية ربما يمكن "تكويد" بعضها أو كثير منها في صورة خوارزميات. لو كان الناس كلهم يعرفون البرمجة لوجدوا طريقة جديدة، غاية في الوضوح و الدقة، للحديث عن العلوم الأساسية التي يعرفونها.
ثانيا: العلوم الطبيعية مثل الأحياء و الفيزياء صارت أعقد من أن يقوم بها الأنسان وحده و صار الكثير من الأبحاث يعتمد على الكمبيوتر. و ظهرت علوم مهجّنة مثل Computational Physics أو ال
Computational Biology و صار العديد من علماء الفيزياء و الكيمياء يتعلمون البرمجة ليتابعوا أعمالهم.
...فرصة للتفوق العلمي
تخيل لو سبق العالم الأسلامي باقي الدول في إدخال البرمجة في التعليم الأساسي (بشكل صحيح مبدع) و خرج لدينا جيل كامل من الأطباء و المهندسين و المحامين و المحاسبين الذين لا يجدون البرمجة شيئا غريبا. ماذا سيحدث؟ اتوقع، بإذن الله، ثورة علمية تكافيء أثارها أو تفوق آثار النهضة الأوروبية.
- ربما يصير شيء مثل الComputational Physics مادة جامعية عادية بدلا من حكرا على نخبة من العلماء القليلين!
- ربما تصير القوانين و المحاماة اقل إبهاما و أسهل في التطبيق!
- ربما يكون الإعراب في النحو بوصف الParse Trees!
..هيّا
هناك أوروبيون بدأوا فعلا في التفكير في هذا الأمر (أنظر مثلا هذه الصفحة عن ال"Computational Thinking"). لكن الأمر مازال في بدايته و لعلّنا نكون أمام فرصه حقيقية لأن نسبقهم بمشيئة الله تعالى.
كما قلت في مثل هذا اليوم في 2008...علّموا الأطفال البرمجة!
قديما كانت القراءة و الكتابة مهارتين نادرتين حتى ان المرء كان ليؤجّر كاتبا يكتب له ما يشاء. الآن أي طفل في الشارع يقرأ و يكتب. ثم كانت العمليات الحسابية مثل الضرب و القسمة المطولة حكراً على العلماء حتى صارت هي الأخرى في متناول التلميذ العادي.
و قديما كان علم الجبر لا يقدر عليه سوى اسطورة مثل الخوارزمي. لم يعد الأمر كذلك. مع مرور الوقت يتحرك العلم من شيء تخصصي لا يقدر عليه إلا القلّة إلى جزء من التعليم العادي. و من تخصص وظيفي إلى معرفة عامّة.
...تفتح أبوابا
و حين يصير علم مثل الحساب معرفة عامة للناس جميعا، يرتفع مستوى البحث العلمي و يمتد إلى آفاق اكبر مثل التفاضل و التكامل مثلاً. و حين تصير الفيزياء العادية معروفة للجميع يفتح هذا الباب للهندسة و الألكترونيات. و حين تصير القراءة و الكتابة أمام كل الناس يفتح هذا المجال للصحافة، التي لم تكن ممكنة في عصور كان معظم الناس فيها لا يقرأون. و لو صارت العلوم السياسية مثلا يعرفها طلبة المدارس لفتح هذا باباً للمجتمع كله ليتكلم عن ادارة الدول و نظم الحكم. و كل علم يتحول من "تخصصيّ" إلى "عام" يرفع مستوى العلم في المجتمع كله.
و الفرصة القادمة البرمجة...
أعتقد أنه في السنوات القادمة ينبغي أن تكون البرمجة جزء من التعليم الأساسي، مثلها مثل الحساب و الجبر من قبلها. يجب ان يتكلم الناس عن الAlgorithms و الArrays كما يتكلمون عن طرح x من طرفي المعادلة. هل هذا صعب؟ ليس بشدة: مع مرور الزمن يتطور مستوى تفكير المجتمع ككل. و هناك الآلاف من الناس في بلادنا و خارجها تعلموا البرمجة و هم أطفال. لو اخذ المجتمع هذا الموضوع مأخذ الجد فإني أتوقع، إن شاء الله، ان تزداد خبرة المعلمين شيئا فشيئا و يتعلموا من تجاربهم الطرق المثلى لتعليم البرمجة لأي طفل.
و هل سيفيد هذا شيئا؟ نعم يفيد في مجالين:
أولا: البرمجة هي "تفكير بطريقة رسمية" و يدخل في كل شيء في الحياة. ربما لو نظرنا لعلم مثل المحاسبة نجده مجموعة من الData structures و الAlgorithms. أشياء مثل الBaker's algorithm أو الBanker's Algorithm كانت تستخدم فعلا في المخابز و البنوك. حتى الأستراتيجيات العسكرية ربما يمكن "تكويد" بعضها أو كثير منها في صورة خوارزميات. لو كان الناس كلهم يعرفون البرمجة لوجدوا طريقة جديدة، غاية في الوضوح و الدقة، للحديث عن العلوم الأساسية التي يعرفونها.
ثانيا: العلوم الطبيعية مثل الأحياء و الفيزياء صارت أعقد من أن يقوم بها الأنسان وحده و صار الكثير من الأبحاث يعتمد على الكمبيوتر. و ظهرت علوم مهجّنة مثل Computational Physics أو ال
Computational Biology و صار العديد من علماء الفيزياء و الكيمياء يتعلمون البرمجة ليتابعوا أعمالهم.
...فرصة للتفوق العلمي
تخيل لو سبق العالم الأسلامي باقي الدول في إدخال البرمجة في التعليم الأساسي (بشكل صحيح مبدع) و خرج لدينا جيل كامل من الأطباء و المهندسين و المحامين و المحاسبين الذين لا يجدون البرمجة شيئا غريبا. ماذا سيحدث؟ اتوقع، بإذن الله، ثورة علمية تكافيء أثارها أو تفوق آثار النهضة الأوروبية.
- ربما يصير شيء مثل الComputational Physics مادة جامعية عادية بدلا من حكرا على نخبة من العلماء القليلين!
- ربما تصير القوانين و المحاماة اقل إبهاما و أسهل في التطبيق!
- ربما يكون الإعراب في النحو بوصف الParse Trees!
..هيّا
هناك أوروبيون بدأوا فعلا في التفكير في هذا الأمر (أنظر مثلا هذه الصفحة عن ال"Computational Thinking"). لكن الأمر مازال في بدايته و لعلّنا نكون أمام فرصه حقيقية لأن نسبقهم بمشيئة الله تعالى.
كما قلت في مثل هذا اليوم في 2008...علّموا الأطفال البرمجة!
Labels:
arabic-posts,
education,
programming
الجمعة، 27 فبراير 2009
فيش فيش
احيانا يقرأ المرء أشياء عجيبة لم يسمع بها من قبل. هذا مثال مم قرأت أنا:
ابدأ بكلمة انجليزية تنفع إسما أو فعلا على السواء مثل "Fish". هناك جمل عديدة في صورة Fish^N هي جمل صحيحة نحويا, هذه بعض قيم N:
الجملة رقم 6 تحتاج بعض التفصيل, تخيل أن السمك أ يصطاد ب, و ب يصطاد ج, و جيم يصطاد سمكا غير محدد:
أعتقد أنه يمكن إثبات بواسطة الInduction أن أي جملة في صورة fish^N هي جملة مفيدة (لكني لم أحاول بعد). هل يمكنك أنت أن تثبت هذا؟
ابدأ بكلمة انجليزية تنفع إسما أو فعلا على السواء مثل "Fish". هناك جمل عديدة في صورة Fish^N هي جمل صحيحة نحويا, هذه بعض قيم N:
| N | الجملة | المعنى |
| 1 | !Fish | إصطد! |
| 2 | Fish fish | "إصطد سمكا" ...أو "السمك يصطاد |
| 3 | Fish fish fish | السمك يصطاد سمكا |
| 4 | Fish fish fish fish | السمك الذي يصطاده السمك يصطاد |
| 5 | Fish fish fish fish fish | السمك يصطاد السمك الذي يصطاده السمك |
| 6 | Fish fish fish fish fish fish | السمك الذي يصطاده السمك (الذي يصطاده السمك) يصطاد |
الجملة رقم 6 تحتاج بعض التفصيل, تخيل أن السمك أ يصطاد ب, و ب يصطاد ج, و جيم يصطاد سمكا غير محدد:
أعتقد أنه يمكن إثبات بواسطة الInduction أن أي جملة في صورة fish^N هي جملة مفيدة (لكني لم أحاول بعد). هل يمكنك أنت أن تثبت هذا؟
Labels:
fun,
linguistiscs,
proof,
puzzles
الخميس، 19 فبراير 2009
الجمعة، 16 يناير 2009
We can do Web applications
Watching a new homegrown language grow up and generate its first dynamic Web page. Seeing the result of months of work. It feels good, الحمد لله.
If you know Lisp, you probably can understand how the code works in the (simplistic) example below. Click on the picture for better viewing.
To the team members who contributed valuable code to this project*, if you're reading this, thank you :)
[*] Haytham Alaa, Mosapha Ateya Sakr, Mostapha M. El-Maasarawy, Mohamed M. Moussa, Mohamed Abdul-Aziz El-Morsy & Kamal El-Din Mohammed.

الأربعاء، 14 يناير 2009
من اخترع المتغيرات؟ (الجزء الأول)
لم يعرف الخوازمي- العالم المسلم مؤسس علم الجبر- المتغيرات الرياضية بالصورة التي نعرفها.
في كتابه" الجبر و المقابلة" تجده يتحدث عن "الجذر" و "المال" في معادلاته. فيعرف الجذر بأنه "كل شيء مضروب في نفسه" و المال بأنه "كل ما اجتمع من الجذر المضروب في نفسه".
يقول المؤرخون أن الجذر في هذا الكتاب يرمز إلى المجهول
و المال هو مربع المجهول
. و لكن لماذا كانت الأمور بهذه الطريقة؟ و لماذا كلمة "مال" بالذات؟
أخمّن أنا رأيا آخر, و لا أعلم إن كان رأيي صحيحا أم لا (وليس معي الكتاب الآن لأراجع الحقائق, للأسف!).
المهم..تخميني هو أن العلماء في ذلك الزمن لم يكونوا يستخدمون الأسس بل كانوا يستخدمون الجذور. فبينما نحن نقول:
كانو يفكرون هم في:
فالمجهول الأصلي بالنسبة لهم هو مربع المجهول بالنسبة لنا.
و لكن عموما مشكلتهم كانت أكبر من ذلك, لم يكن لديهم أصلاً فكرة حرف مثل x يعبّر عن قيمة عددية. فماذا يفعل الخوارزمي؟
بدلا من المتغير كان يتكلم عن الشيء الحقيقي المراد معرفة قيمته, و لما كان كتابه يهدف لمساعدة الناس في حسابات التجارة و المواريث ففي كثير من الأحيان يكون المطلوب معرفته هو مقدار من المال. وهذه هي نظريتي في سبب التسمية.
و نتيجة لهذه التسميات فأنه لو نظرت في كتاب الجبر و المقابلة تجد أنه حيث نقول نحن:
كان يقول هو:
ثم تطورت الأمور فبعد أن صارت كلمة "مال" تعني الرقم مضروبا في نفسه بشكل عام, صار مثلا "مال المال" هو نتيجة رفع العدد للأس أربعة, و بدأت اصطلاحات جديدة تظهر. بالمناسبة قام الدكتور مصطفى مشرفه وعالم مصري آخر سنة 1937 بتأليف شرح كتاب الجبر و المقابلة. شرح النص الأصلي كان في الهامش متضمنا "ترجمة" للمعادلات من الصياغة القديمة إلى المعادلات بالصورة التي نعرفها.
لك طبعا أن تتخيل الجهد العقلي الجبار الذي كان الخوارزمي و أمثاله يبذلونه في وضع القوانين. هذا الرجل اخترع علم الجبر بدون أن يكون لديه رموز رياضية و لا حتى متغيرات! رحم الله اساتذتنا علماء المسلمين.
كيف إذن ظهرت المتغيرات بالطريقة التي نعرفها؟ البقية في الجزء الثاني.
يقول المؤرخون أن الجذر في هذا الكتاب يرمز إلى المجهول
و المال هو مربع المجهول
. و لكن لماذا كانت الأمور بهذه الطريقة؟ و لماذا كلمة "مال" بالذات؟أخمّن أنا رأيا آخر, و لا أعلم إن كان رأيي صحيحا أم لا (وليس معي الكتاب الآن لأراجع الحقائق, للأسف!).
المهم..تخميني هو أن العلماء في ذلك الزمن لم يكونوا يستخدمون الأسس بل كانوا يستخدمون الجذور. فبينما نحن نقول:
كانو يفكرون هم في:
فالمجهول الأصلي بالنسبة لهم هو مربع المجهول بالنسبة لنا.
و لكن عموما مشكلتهم كانت أكبر من ذلك, لم يكن لديهم أصلاً فكرة حرف مثل x يعبّر عن قيمة عددية. فماذا يفعل الخوارزمي؟
بدلا من المتغير كان يتكلم عن الشيء الحقيقي المراد معرفة قيمته, و لما كان كتابه يهدف لمساعدة الناس في حسابات التجارة و المواريث ففي كثير من الأحيان يكون المطلوب معرفته هو مقدار من المال. وهذه هي نظريتي في سبب التسمية.
و نتيجة لهذه التسميات فأنه لو نظرت في كتاب الجبر و المقابلة تجد أنه حيث نقول نحن:
كان يقول هو:
"مال وخمسة أجذار يعدل 24 درهماً".
ثم تطورت الأمور فبعد أن صارت كلمة "مال" تعني الرقم مضروبا في نفسه بشكل عام, صار مثلا "مال المال" هو نتيجة رفع العدد للأس أربعة, و بدأت اصطلاحات جديدة تظهر. بالمناسبة قام الدكتور مصطفى مشرفه وعالم مصري آخر سنة 1937 بتأليف شرح كتاب الجبر و المقابلة. شرح النص الأصلي كان في الهامش متضمنا "ترجمة" للمعادلات من الصياغة القديمة إلى المعادلات بالصورة التي نعرفها.
لك طبعا أن تتخيل الجهد العقلي الجبار الذي كان الخوارزمي و أمثاله يبذلونه في وضع القوانين. هذا الرجل اخترع علم الجبر بدون أن يكون لديه رموز رياضية و لا حتى متغيرات! رحم الله اساتذتنا علماء المسلمين.
كيف إذن ظهرت المتغيرات بالطريقة التي نعرفها؟ البقية في الجزء الثاني.
الأربعاء، 5 نوفمبر 2008
أين تضع الغضب
أحتلّوا أفغانستان و العراق و أقاموا فيهما سنوات. يقتلون و ينهبون. في كل مكان تجد الذي فقد اباه و أخاه و ابنه. أنت غاضب, فأين تضع الغضب؟
حمّل paper و اقرأها. خطط لمشاريع. طوّر نفسك باستمرار.
كم مرة حطموا فيها لبنان؟ لم أعد استطيع العد. و كم فلسطينيا قتلوا؟ و كم أسروا؟ و على كم اعتدوا؟
أين تضع الغضب؟
أكثر من قراءة القرآن. اذهب للمسجد و احضر درساً. تعلّم دينك. ألم يحن الوقت؟
تعالي. إهانة. قمع. تشريد. إذلال. و مع ذلك لديهم أطماع و يتمنون التوسّع في أراضينا و يرغبون في المزيد. أين تضع الغضب؟
لا تقاطع فحسب. بل ادّخر المال الذي لم تدفعه لهم. ستحتاج كلّ مليم و أنت تفتح شركتك.
تلك الأمم المعتدية, كانوا محظوظين فظفروا بالتفوق العلمي و الاقتصادي.
تلك الأمم المعتدية. كانوا محظوظين فماذا فعلوا بحظهم؟ قتلوا و سرقوا و دمّروا.
و لكن الأمور تتغير. و بينما هم في أزماتهم الاقتصادية التي صنعوها لأنفسهم,علينا نحن أن نعمل.
فلينتشر العلم حرفا حرفا. و لنصنع مشاريعا خطوة بخطوة. و لينتشر الإصلاح فردا فردا. و لنعد إلى الله.
قد يحتاج الأمر وقتا أوّل الأمر, لا بأس, سنصبر. فقد صبرنا كثيرًا من قبل.
و كلما هجموا علينا, زاد الغضب.
و كلما زاد الغضب, زدنا إصرارا على العمل.
في الجامعات, في الشركات, في البيت: العلم, السعي, الإصلاح. و قريبا بأذن الله نسبقهم.
تلك الأمم المعتدية. كانوا محظوظين. و قريبا..يوشك حظهم أن ينتهي.
حمّل paper و اقرأها. خطط لمشاريع. طوّر نفسك باستمرار.
كم مرة حطموا فيها لبنان؟ لم أعد استطيع العد. و كم فلسطينيا قتلوا؟ و كم أسروا؟ و على كم اعتدوا؟
أين تضع الغضب؟
أكثر من قراءة القرآن. اذهب للمسجد و احضر درساً. تعلّم دينك. ألم يحن الوقت؟
تعالي. إهانة. قمع. تشريد. إذلال. و مع ذلك لديهم أطماع و يتمنون التوسّع في أراضينا و يرغبون في المزيد. أين تضع الغضب؟
لا تقاطع فحسب. بل ادّخر المال الذي لم تدفعه لهم. ستحتاج كلّ مليم و أنت تفتح شركتك.
تلك الأمم المعتدية, كانوا محظوظين فظفروا بالتفوق العلمي و الاقتصادي.
تلك الأمم المعتدية. كانوا محظوظين فماذا فعلوا بحظهم؟ قتلوا و سرقوا و دمّروا.
و لكن الأمور تتغير. و بينما هم في أزماتهم الاقتصادية التي صنعوها لأنفسهم,علينا نحن أن نعمل.
فلينتشر العلم حرفا حرفا. و لنصنع مشاريعا خطوة بخطوة. و لينتشر الإصلاح فردا فردا. و لنعد إلى الله.
قد يحتاج الأمر وقتا أوّل الأمر, لا بأس, سنصبر. فقد صبرنا كثيرًا من قبل.
و كلما هجموا علينا, زاد الغضب.
و كلما زاد الغضب, زدنا إصرارا على العمل.
في الجامعات, في الشركات, في البيت: العلم, السعي, الإصلاح. و قريبا بأذن الله نسبقهم.
تلك الأمم المعتدية. كانوا محظوظين. و قريبا..يوشك حظهم أن ينتهي.
Labels:
social
الجمعة، 26 سبتمبر 2008
سي شارب - الجزء الأول - طريقة جديدة للتفكير
"A language that doesn't affect the way you think about programming, is not worth knowing." -- Alan Perlis
أيّ لغة برمجة ليست مجرّد syntax, بل هي تقدّم وسيلة جديدة للتفكير في البرنامج الذي تكتبه. #C هي لغة في سلسلة من اللغات المبنيّة على مباديء البرمجة المعتمدة على الأشياء Object Oriented Programming. و بدون تمكّن من هذه المباديء فلن يستفيد المبرمج حقاً من الـ#C. لذلك يجب أن نتحدث عن الOOP أولاً.
الأشياء و الفصائل
كثير من البرامج يسهل وصفها لو قسّمناها إلى أشياء.
مثلا في Word الأشياء هي شريط الأدوات و القوائم, الكلام الذي تكتبه و الصفحات و الفقرات, اللغات التي يعمل معها المدقق الأملائي, و سائر مكونات البرنامج. و في لعبة مثل ألعاب الحروب فالأشياء التي تكوّن البرنامج هي الوحدات و المباني و الخريطة و عوامل البيئة مثل الحيوانات أو الأنهار.
من كثرة انتشار البرامج التي يتيسّر وصفها لو قسّمناها لأشياء ظهرت طريقة للبرمجة مبنية على فكرة "الشيء" أو الobject. فما معنى "شيء" هنا؟
الشيء هو كائن له "حالة" و له "سلوك". An object has a state and behavior. أما الحالة فهي الوضع الذي عليه الشيء, مثل لون الكلمة في الWord أو مكان الجندي في لعبة الحرب أو عدد العناصر في الArray.و أمّا السلوك فهو التأثيرات التي يحدثها الشيء. مثلا السلوك في Word هو الطريقة التي يُرسم بها الجدول على الشاشة أو الطريقة التي يعمل بها المدقق الأملائي. و في اللعبة فسلوك الوحدة هو الطريقة التي تهاجم بها أو ردّ فعلها عندما تقترب منها وحدة معادية.
يمكن لو أخترنا أن نعبر عن حالة الشيء عن طريق مجموعة من الصفات Attributes و أن نعبر عن سلوكه بواسطة حصر الطُرُق methods التي يتصرّف بها. فلو كنت أصمم برنامج لشئون العاملين مثلا فقد أقول أن البرنامج فيه نوع من الأشياء هم الموظفون, و أن حالتهم تحددها صفات مثل تاريخ التعيين, السن, هل يقومون بالعمل حاليا أم لا, و هكذا. بينما يمكن أن أصف سلوكهم بأنهم يمكنهم أن يعملوا, أن يأخذوا عطلة, أن يترقّوا, أن يغيروا الفرع أو أن يستقيلوا.
نلاحظ أنّ كل "شيء" له عموماً حالته المستقلّة. فكل جندي في اللعبة له صحته و مكانه بغضّ النظر عن أي وحدة أخرى. و لكن تأتي أحيان كثيرة يكون السلوك فيها مشترك بين فئة كبيرة من الوحدات. فجنود المشاة مثلا في اللعبة يهجمون كلهم بنفس الطريقة و يردون على اقتراب الأعداء بنفس الطريقة. طبعاً قد يختلف السلوك باختلاف الحالة (فمثلا الجندي ذو الصحة القليلة قد لا يهاجم) و لكن الخطة العامّة أو "البرنامج" الذي يحرك جندي المشاة قد تكون هي هي لكلّ الجنود.
من أجل هذا فإن بعض لغات البرمجة التي تتعامل مع الobjects (و لكن ليس كلها) قد اختارت أن تقدم مبدءاً جديداً لوصف مجموعة من الأشياء لها سلوك موحّد, و ذلك المبدأ هو الفصيلة class.
الفصيلة هي طريقة لوصف فئة من الأشياء يجمع بينها مجموعة مشتركة من الصفات و سلوك مشترك.
مجموعة مشتركة من الصفات أي أنّ السيّارة في لعبة سباق مثلا لها لون و سرعة و مكان. نعم كل سيّارة منهم لها لون و سرعة و مكان مختلفين لكن يجمع بينهم أن الكل يجب أن تكون هذه الصفات فيه. و سلوك مشترك أي أن كل ال checkboxes في الWindows مثلا تتصرف بنفس الطريقة بأن ترسم علامة حين تختارها و تلغي هذه العلامة حين تلغي اختيارك.
لتوضيح العلاقة بين الشيء و فصيلته انظر هذا المثال:
تخيّل أنه هناك قطة اسمها نميرة. يمكننا أن نقول
اذن كلمة instance معناها العلاقة بين الشيء و فصيلته.
أنواع الـattributes و الـmethods
مع أن كل شيء من الـ"أشياء" له حالة مختلفة إلا أنه يكون أحيانا هناك حالة مشتركة بين كل الأشياء من فصيلة معيّنة. مثلا لو كان في السيارة صفة هي "سعر قطعة الغيار" و كان هذا السعر موحدا فإنه لا معني أن يكون هناك نسخة مستقلة من هذا السعر لكل سيّارة على حدىً. و أيضا لو تغيّر هذا السعر فأنه من المتوقع أن ينعكس هذا التغيير على السيّارات كلها. في هذه الحالة فإن الصفة تظهر و كأنها خاصة بالclass كله و ليس بكل instance على انفراد. حين تكون الصفة خاصة بكل instance منفردة تكون تلك الصفة instance attribute و أمّا حين تكون خاصة بالـclass و مشتركة بين كل الـinstances فهي class attribute.
نفس الموقف بالنسبة للـmethods: فلو كانت الـmethod تصف سلوكا خاصا بالكائن (مثل طريقة هجوم الجندي) فهي instance method و لكن لو كانت تصف سلوكاً لا يرتبط بكائن معين فهي class method. مثال على الclass method أن أكتب code تقوم بحصر عدد الجنود الذين ماتوا في اللعبة. هذا شيء لا يرتبط بجندي معيّن و لكن يشمل فئة الجنود عموماً لهذا هو class method.
الهويّة
لكي نميّز بين "شيء" و آخر فاننا نحتاج أن يكون للأشياء هويّة identity وهي صفة قيمتها متفردة لكل شيء منفصل. في ال#C نستخدم الreference و هو قيمة تعبر (عادةً) عن مكان الـobject في الذاكرة فهي شبيهة بالpointers نوعاً ما. هذه القيمة تحدد أيضا الidentity بمعني أنه لو تساوى اثنان من الـreferences فمعنى هذا أنهما يدلّان على نفس الـobject و لو اختلفا فهما بالتأكيد يدلّان على objects مختلفة.
إعرف هذه المباديء جيداً. سنحتاجها المرة القادمة إن شاء الله حين نبدأ بكتابة code حقيقيّة!
الأشياء و الفصائل
كثير من البرامج يسهل وصفها لو قسّمناها إلى أشياء.
مثلا في Word الأشياء هي شريط الأدوات و القوائم, الكلام الذي تكتبه و الصفحات و الفقرات, اللغات التي يعمل معها المدقق الأملائي, و سائر مكونات البرنامج. و في لعبة مثل ألعاب الحروب فالأشياء التي تكوّن البرنامج هي الوحدات و المباني و الخريطة و عوامل البيئة مثل الحيوانات أو الأنهار.
من كثرة انتشار البرامج التي يتيسّر وصفها لو قسّمناها لأشياء ظهرت طريقة للبرمجة مبنية على فكرة "الشيء" أو الobject. فما معنى "شيء" هنا؟
الشيء هو كائن له "حالة" و له "سلوك". An object has a state and behavior. أما الحالة فهي الوضع الذي عليه الشيء, مثل لون الكلمة في الWord أو مكان الجندي في لعبة الحرب أو عدد العناصر في الArray.و أمّا السلوك فهو التأثيرات التي يحدثها الشيء. مثلا السلوك في Word هو الطريقة التي يُرسم بها الجدول على الشاشة أو الطريقة التي يعمل بها المدقق الأملائي. و في اللعبة فسلوك الوحدة هو الطريقة التي تهاجم بها أو ردّ فعلها عندما تقترب منها وحدة معادية.
يمكن لو أخترنا أن نعبر عن حالة الشيء عن طريق مجموعة من الصفات Attributes و أن نعبر عن سلوكه بواسطة حصر الطُرُق methods التي يتصرّف بها. فلو كنت أصمم برنامج لشئون العاملين مثلا فقد أقول أن البرنامج فيه نوع من الأشياء هم الموظفون, و أن حالتهم تحددها صفات مثل تاريخ التعيين, السن, هل يقومون بالعمل حاليا أم لا, و هكذا. بينما يمكن أن أصف سلوكهم بأنهم يمكنهم أن يعملوا, أن يأخذوا عطلة, أن يترقّوا, أن يغيروا الفرع أو أن يستقيلوا.
نلاحظ أنّ كل "شيء" له عموماً حالته المستقلّة. فكل جندي في اللعبة له صحته و مكانه بغضّ النظر عن أي وحدة أخرى. و لكن تأتي أحيان كثيرة يكون السلوك فيها مشترك بين فئة كبيرة من الوحدات. فجنود المشاة مثلا في اللعبة يهجمون كلهم بنفس الطريقة و يردون على اقتراب الأعداء بنفس الطريقة. طبعاً قد يختلف السلوك باختلاف الحالة (فمثلا الجندي ذو الصحة القليلة قد لا يهاجم) و لكن الخطة العامّة أو "البرنامج" الذي يحرك جندي المشاة قد تكون هي هي لكلّ الجنود.
من أجل هذا فإن بعض لغات البرمجة التي تتعامل مع الobjects (و لكن ليس كلها) قد اختارت أن تقدم مبدءاً جديداً لوصف مجموعة من الأشياء لها سلوك موحّد, و ذلك المبدأ هو الفصيلة class.
الفصيلة هي طريقة لوصف فئة من الأشياء يجمع بينها مجموعة مشتركة من الصفات و سلوك مشترك.
مجموعة مشتركة من الصفات أي أنّ السيّارة في لعبة سباق مثلا لها لون و سرعة و مكان. نعم كل سيّارة منهم لها لون و سرعة و مكان مختلفين لكن يجمع بينهم أن الكل يجب أن تكون هذه الصفات فيه. و سلوك مشترك أي أن كل ال checkboxes في الWindows مثلا تتصرف بنفس الطريقة بأن ترسم علامة حين تختارها و تلغي هذه العلامة حين تلغي اختيارك.
لتوضيح العلاقة بين الشيء و فصيلته انظر هذا المثال:
تخيّل أنه هناك قطة اسمها نميرة. يمكننا أن نقول
Cat is the class of Numaira
القطط هي فصيلة نميرة
و لكن كيف يمكن أن نقول نفس الجملة مع تبديل المبتدأ و الخبر؟القطط هي فصيلة نميرة
Numaira is an instance of Cat
نميرة هي تجسيد لفصيلة القطط
نميرة هي تجسيد لفصيلة القطط
اذن كلمة instance معناها العلاقة بين الشيء و فصيلته.
أنواع الـattributes و الـmethods
مع أن كل شيء من الـ"أشياء" له حالة مختلفة إلا أنه يكون أحيانا هناك حالة مشتركة بين كل الأشياء من فصيلة معيّنة. مثلا لو كان في السيارة صفة هي "سعر قطعة الغيار" و كان هذا السعر موحدا فإنه لا معني أن يكون هناك نسخة مستقلة من هذا السعر لكل سيّارة على حدىً. و أيضا لو تغيّر هذا السعر فأنه من المتوقع أن ينعكس هذا التغيير على السيّارات كلها. في هذه الحالة فإن الصفة تظهر و كأنها خاصة بالclass كله و ليس بكل instance على انفراد. حين تكون الصفة خاصة بكل instance منفردة تكون تلك الصفة instance attribute و أمّا حين تكون خاصة بالـclass و مشتركة بين كل الـinstances فهي class attribute.
نفس الموقف بالنسبة للـmethods: فلو كانت الـmethod تصف سلوكا خاصا بالكائن (مثل طريقة هجوم الجندي) فهي instance method و لكن لو كانت تصف سلوكاً لا يرتبط بكائن معين فهي class method. مثال على الclass method أن أكتب code تقوم بحصر عدد الجنود الذين ماتوا في اللعبة. هذا شيء لا يرتبط بجندي معيّن و لكن يشمل فئة الجنود عموماً لهذا هو class method.
الهويّة
لكي نميّز بين "شيء" و آخر فاننا نحتاج أن يكون للأشياء هويّة identity وهي صفة قيمتها متفردة لكل شيء منفصل. في ال#C نستخدم الreference و هو قيمة تعبر (عادةً) عن مكان الـobject في الذاكرة فهي شبيهة بالpointers نوعاً ما. هذه القيمة تحدد أيضا الidentity بمعني أنه لو تساوى اثنان من الـreferences فمعنى هذا أنهما يدلّان على نفس الـobject و لو اختلفا فهما بالتأكيد يدلّان على objects مختلفة.
إعرف هذه المباديء جيداً. سنحتاجها المرة القادمة إن شاء الله حين نبدأ بكتابة code حقيقيّة!
Summary
- Applications can be composed of objects.
- An object has state (attributes) and behavior (methods).
- Objects of common attributes and behavior can be grouped into classes.
- If C is the class of and object O, then O is an instance of C.
- Instance attributes have a different value for each object, while a class attribute has only one value for the whole class, and does not belong to any particular instance.
- Similarly, an instance method works on a particular object each time it's invoked, but a class method does not work on any particular object but is related to the class as a whole.
- An object reference can be used to determine its identity and uniquely distinguish it from other objects.
Labels:
c-sharp,
education,
programming,
tutorials
الثلاثاء، 26 أغسطس 2008
سدّ الفجوة التكنولوجية
سؤال
لماذا لم نصنع نظام تشغيل خاص بنا؟ أو لغة برمجة؟ أو برنامج مثل Office؟
فيكون الرد:
نعم, نعم. هذا هو التفكير السائد الآن. و أيضاً لمَ نصنع سيارة محليّة بينما يمكننا تجميع التويوتا و الهيونداي؟ و لمَ ننشيء إقتصادا قويا بأنفسنا و يمكننا بدلا من هذا جذب الأستثمارات الأجنبية؟ أليس كذلك؟
كلّا! حان وقت تغيير هذا الرأي و السعي لإحداث نهضة علمية حقيقية. دع أفكارك تكبر عن الأنشغالات التقليدية. نحن لا نتحدث عن كشف الأرباح و الخسائر لسنة مالية بل عن المائة سنة القادمة. هل تظن أنه بعد مائة سنة سيستخدم الناس نظام تشغيل يشبه الWindows أو ستكون لغة برمجتهم تشبه الC# أو يبحثون عن المعلومات بكتابة بضع كلمات في Google؟ و هل سنصنع نحن هذه الأدوات المستقبلية أم سننتظر مرةً أخرى حتى تُصنع لنا؟
احتياج
و ما علاقة المائة سنة القادمة بإنتاج نظام تشغيل جديد أو Office Application؟ الجواب أنّك لن تستطيع سد الفجوة التكنولوجية إلا لو قمت بإعادة إنتاج قمة التكنولوجيا الحالية بنفسك. طالما أنّك تستخدم المكونات الجاهزة أو تستعين بالخبراء الأجانب فلن تصل لشيء بل ستظل تنتظر الخطوة القادمة التي يخطوها غيرك ثم تطلب ما صنعوا. تستوي هذه الجملة أن تكون عن الصناعة أو البرامج.
و لم لا نأخذ نظاما مفتوح المصدر مثل Linux أو الJava Virtual Machine و ندرس الSource code و نطوّر عليها؟ هذه ستكون خطوة مهمة و رائعة و لكنها لن تكفي. نعم سنكون مشاركين في صنع التكنولوجيا و ليس مجرد مستهلكين و لكننا يجب ألا نتأخر عن هدفنا الحقيقي: أن نصبح صانعين و مبدعين. المشكلة في برنامج مثل Linux أن معظم المشاكل الصعبة قد حلّت و معظم القرارات الشيقة قد اتخذت فتعلم طريقة كتابة الLinux kernel سيكون اكتساب معرفة أكثر منها اكتساب خبرة.
نعم ستكون معرفة عملية على منتج حقيقي و لكنها مازالت معرفة أسرار برنامج جاهز و ليست كتابة برنامج من الصفر بنفسك بينما هذا هو ما نحتاجه الآن: لن تتعلم كيف تتفوق على التكنولوجيا الحالية إلا لو تعلمت كيف تبدأ من لا شيء, لأن التكنولوجيا الحالية هي لا شيء من التكنولوجيا القادمة.
و كيف تكون إعادة اختراع للعجلة و أنت لم تخترعها أصلا بعد؟
خطة
علينا في رأيي أن نعيد إنتاج الأدوات الأساسية كي يكون لنا فئة من الناس قد بدأت من البداية و تقدر أن تواصل للمستقبل. بشكل عام التطبيقات الآن طبقات مبني بعضها على بعض:
هدفنا أن نقوم تدريجيا بغزو هذه الطبقات فنقدر إن شاء الله خلال عشر سنوات مثلا أن يكون لدينا القدرة على عمل "برج تكنولوجي" مستقل يشمل كلّ شيء من البرامج حتى الHardware. فكيف نفعل هذا؟
كن مشاركا تكنولوجيا: نحن الآن في عصر الوفرة التكنولوجية و الحمد لله. أنظر إلى أيّ مشروع يعجبك: Linux أو Python أو Java أو Abiword أو أي برنامج تحب و حمّل الsource code و تعلمها و شارك فيها. يمكنك أن تبدأ بتطوير صغير: صلّح bug أو زود menu item جديد. شيء يفتح شهيتك. مع الوقت ستجد نفسك تتمنى إمكانية معينة في البرنامج و لديك القدرة على إضافتها فافعل.
إبدأ بمنتج صغير و مختلف: ما لم تكن بمؤسسة كبيرة فلا أنصحك أن تحاول عمل منتج تكنولوجي ضخم لأسباب قومية بحتة. ستجد الحماس يفتر بعد بضعة أسابيع من العمل لتكتشف أنك تحاول أن تعمل Windows آخر وحدك بلا سبب واضح. إبدأ صغيرا و في نفس الوقت اصنع شيئا أفضل من الموجود. حين بدأت الشركات الجديدة في إعادة صنع Office لم تحاول عمل نسخة طبق الأصل من برنامج Microsoft بل صنعت برامج مثل Google Docs: بها عُشر إمكانات Excel و Word و مع ذلك تميّز نفسها بأنها تعمل من على الWeb و تدار مركزيا و لا تحتاج Installation. و هكذا فعلوا شيئا حكيما: لم يقوموا بالمهمة المستحيلة و هي الإنتاج الفوري لبديل لMS Office و في نفس الوقت ميزوا أنفسهم عنه بأمكانات قوية. و مع الوقت ستجدهم يضيفون الأمكانات شيئا فشيئا حتّى يلحقوا بالExcel و الWord و يتفوقوا عليهما. يساعدهم في ذلك أنهم يطورون أدواتهم و يخرجون لنا بcompilers تحول البرامج العادية إلى Ajax و يطورون نظم التشغيل لتحتمل عبء تشغيل البرامج من على الWeb لكلّ المستخدمين. أي أنهم يقومون بغزو طبقات النظام كلها إما بالأنتاج أو بتطوير الموجود (أنظر كيف أفادهم إعادة أختراع العجلة).
أنت أيضا يمكنك أن تفعل مثل ذلك: ربما يمكن أن تبني لغتك على ال JVM أو ال.net أو الParrot في البداية و مع الوقت اجعلها كيانا مستقلا بذاته و حتى يأتي وقت استقلالها ميزها بقدرات أكبر عن اللغات الشائعة أو بملائمتها لنوع معين من التطبيقات مثل تطبيقات الweb أو الimaging.أو يمكنك عمل برنامج مثل الOffice و لكنه يعمل على الmobile. في البداية سيكون برنامج الكتابة أقرب للNotepad منه للWord و برنامج الحسابات يشبه الcalculator و لكنه تدريجيا سيزداد فائدة مع تطور التكنولوجيا. أو ربما تميز منتجك عن الموجود بطريقة استخدامه المبدعة كما فعل الiPhone : كانت إمكاناته أقل بكثير من الWindows Mobile ولكنه قدم طريقة جديدة مذهله للتعامل مع الجهاز ثم بدأ يسدّ الثغرات في الأمكانيات.
كن صبوراً: لو توقعت نجاحا مبهرا سريعا فسيفتر حماسك و تجد نفسك تعود للمكونات الجاهزة كما عاد آخرون للخبرة الأجنبية. تذكر أننا نتحدث عن نهضة علمية للمدى الطويل. المشاريع الكبيرة دوما تأخذ سنوات. Google أخذت سنوات طويلة حتى نجحت. لغة الRuby موجودة منذ 1995 و حققت شهرتها الفائقة منذ حوالى 2004. أنظر إلى منتج مثل Linux بدأ عام 1991 و مازال يتطور إلى الآن: كان على صانعه أن يحقق توازنا بين عمل برنامج يسد احتاجاته الحالية و بين الصبر و التخطيط للمدى البعيد. لو حاول أن يصنع نظاما عظيما منذ الخطوة الأولى لفشل, و لو أخذ يخطط للمدى الطويل بدون أن يصنع منتجا حقيقيا يمكن استخدامه فورا لانصرف الناس و تركوه يطارد حلما ليس له وجود مادي. المشاريع لا تنجح بانفجار كانفجار البركان و لكن بسلسلة مستمرة من الخطوات الصغيرة. حسّن و طوّر و صلح الأخطاء و لا تتوقف تأتي لحظة على المدى الطويل يكون نجاحك فيها واضحا كبيرا.
لماذا لم نصنع نظام تشغيل خاص بنا؟ أو لغة برمجة؟ أو برنامج مثل Office؟
فيكون الرد:
و لمَ نعيد اختراع العجلة؟ أليست أمامك لغات مثل ال#C و ال++C و برامج مثل Microsoft Office؟ كل ما ستفعله لو أعدت إنتاج مثل تلك البرامج أن تضيع الوقت و الجهد لتنتهي في نفس النقطة التي بدأت بها, بل أقل لأن برامجك لن تكون على مستوى البرامج الموجودة.
نعم, نعم. هذا هو التفكير السائد الآن. و أيضاً لمَ نصنع سيارة محليّة بينما يمكننا تجميع التويوتا و الهيونداي؟ و لمَ ننشيء إقتصادا قويا بأنفسنا و يمكننا بدلا من هذا جذب الأستثمارات الأجنبية؟ أليس كذلك؟
كلّا! حان وقت تغيير هذا الرأي و السعي لإحداث نهضة علمية حقيقية. دع أفكارك تكبر عن الأنشغالات التقليدية. نحن لا نتحدث عن كشف الأرباح و الخسائر لسنة مالية بل عن المائة سنة القادمة. هل تظن أنه بعد مائة سنة سيستخدم الناس نظام تشغيل يشبه الWindows أو ستكون لغة برمجتهم تشبه الC# أو يبحثون عن المعلومات بكتابة بضع كلمات في Google؟ و هل سنصنع نحن هذه الأدوات المستقبلية أم سننتظر مرةً أخرى حتى تُصنع لنا؟
احتياج
و ما علاقة المائة سنة القادمة بإنتاج نظام تشغيل جديد أو Office Application؟ الجواب أنّك لن تستطيع سد الفجوة التكنولوجية إلا لو قمت بإعادة إنتاج قمة التكنولوجيا الحالية بنفسك. طالما أنّك تستخدم المكونات الجاهزة أو تستعين بالخبراء الأجانب فلن تصل لشيء بل ستظل تنتظر الخطوة القادمة التي يخطوها غيرك ثم تطلب ما صنعوا. تستوي هذه الجملة أن تكون عن الصناعة أو البرامج.
و لم لا نأخذ نظاما مفتوح المصدر مثل Linux أو الJava Virtual Machine و ندرس الSource code و نطوّر عليها؟ هذه ستكون خطوة مهمة و رائعة و لكنها لن تكفي. نعم سنكون مشاركين في صنع التكنولوجيا و ليس مجرد مستهلكين و لكننا يجب ألا نتأخر عن هدفنا الحقيقي: أن نصبح صانعين و مبدعين. المشكلة في برنامج مثل Linux أن معظم المشاكل الصعبة قد حلّت و معظم القرارات الشيقة قد اتخذت فتعلم طريقة كتابة الLinux kernel سيكون اكتساب معرفة أكثر منها اكتساب خبرة.
نعم ستكون معرفة عملية على منتج حقيقي و لكنها مازالت معرفة أسرار برنامج جاهز و ليست كتابة برنامج من الصفر بنفسك بينما هذا هو ما نحتاجه الآن: لن تتعلم كيف تتفوق على التكنولوجيا الحالية إلا لو تعلمت كيف تبدأ من لا شيء, لأن التكنولوجيا الحالية هي لا شيء من التكنولوجيا القادمة.
و كيف تكون إعادة اختراع للعجلة و أنت لم تخترعها أصلا بعد؟
خطة
علينا في رأيي أن نعيد إنتاج الأدوات الأساسية كي يكون لنا فئة من الناس قد بدأت من البداية و تقدر أن تواصل للمستقبل. بشكل عام التطبيقات الآن طبقات مبني بعضها على بعض:
| Applications |
| Compilers, Interpreters, Virtual Machines |
| Operating Systems |
| Hardware - CPU's, Boards, Communications...etc |
هدفنا أن نقوم تدريجيا بغزو هذه الطبقات فنقدر إن شاء الله خلال عشر سنوات مثلا أن يكون لدينا القدرة على عمل "برج تكنولوجي" مستقل يشمل كلّ شيء من البرامج حتى الHardware. فكيف نفعل هذا؟
كن مشاركا تكنولوجيا: نحن الآن في عصر الوفرة التكنولوجية و الحمد لله. أنظر إلى أيّ مشروع يعجبك: Linux أو Python أو Java أو Abiword أو أي برنامج تحب و حمّل الsource code و تعلمها و شارك فيها. يمكنك أن تبدأ بتطوير صغير: صلّح bug أو زود menu item جديد. شيء يفتح شهيتك. مع الوقت ستجد نفسك تتمنى إمكانية معينة في البرنامج و لديك القدرة على إضافتها فافعل.
إبدأ بمنتج صغير و مختلف: ما لم تكن بمؤسسة كبيرة فلا أنصحك أن تحاول عمل منتج تكنولوجي ضخم لأسباب قومية بحتة. ستجد الحماس يفتر بعد بضعة أسابيع من العمل لتكتشف أنك تحاول أن تعمل Windows آخر وحدك بلا سبب واضح. إبدأ صغيرا و في نفس الوقت اصنع شيئا أفضل من الموجود. حين بدأت الشركات الجديدة في إعادة صنع Office لم تحاول عمل نسخة طبق الأصل من برنامج Microsoft بل صنعت برامج مثل Google Docs: بها عُشر إمكانات Excel و Word و مع ذلك تميّز نفسها بأنها تعمل من على الWeb و تدار مركزيا و لا تحتاج Installation. و هكذا فعلوا شيئا حكيما: لم يقوموا بالمهمة المستحيلة و هي الإنتاج الفوري لبديل لMS Office و في نفس الوقت ميزوا أنفسهم عنه بأمكانات قوية. و مع الوقت ستجدهم يضيفون الأمكانات شيئا فشيئا حتّى يلحقوا بالExcel و الWord و يتفوقوا عليهما. يساعدهم في ذلك أنهم يطورون أدواتهم و يخرجون لنا بcompilers تحول البرامج العادية إلى Ajax و يطورون نظم التشغيل لتحتمل عبء تشغيل البرامج من على الWeb لكلّ المستخدمين. أي أنهم يقومون بغزو طبقات النظام كلها إما بالأنتاج أو بتطوير الموجود (أنظر كيف أفادهم إعادة أختراع العجلة).
أنت أيضا يمكنك أن تفعل مثل ذلك: ربما يمكن أن تبني لغتك على ال JVM أو ال.net أو الParrot في البداية و مع الوقت اجعلها كيانا مستقلا بذاته و حتى يأتي وقت استقلالها ميزها بقدرات أكبر عن اللغات الشائعة أو بملائمتها لنوع معين من التطبيقات مثل تطبيقات الweb أو الimaging.أو يمكنك عمل برنامج مثل الOffice و لكنه يعمل على الmobile. في البداية سيكون برنامج الكتابة أقرب للNotepad منه للWord و برنامج الحسابات يشبه الcalculator و لكنه تدريجيا سيزداد فائدة مع تطور التكنولوجيا. أو ربما تميز منتجك عن الموجود بطريقة استخدامه المبدعة كما فعل الiPhone : كانت إمكاناته أقل بكثير من الWindows Mobile ولكنه قدم طريقة جديدة مذهله للتعامل مع الجهاز ثم بدأ يسدّ الثغرات في الأمكانيات.
كن صبوراً: لو توقعت نجاحا مبهرا سريعا فسيفتر حماسك و تجد نفسك تعود للمكونات الجاهزة كما عاد آخرون للخبرة الأجنبية. تذكر أننا نتحدث عن نهضة علمية للمدى الطويل. المشاريع الكبيرة دوما تأخذ سنوات. Google أخذت سنوات طويلة حتى نجحت. لغة الRuby موجودة منذ 1995 و حققت شهرتها الفائقة منذ حوالى 2004. أنظر إلى منتج مثل Linux بدأ عام 1991 و مازال يتطور إلى الآن: كان على صانعه أن يحقق توازنا بين عمل برنامج يسد احتاجاته الحالية و بين الصبر و التخطيط للمدى البعيد. لو حاول أن يصنع نظاما عظيما منذ الخطوة الأولى لفشل, و لو أخذ يخطط للمدى الطويل بدون أن يصنع منتجا حقيقيا يمكن استخدامه فورا لانصرف الناس و تركوه يطارد حلما ليس له وجود مادي. المشاريع لا تنجح بانفجار كانفجار البركان و لكن بسلسلة مستمرة من الخطوات الصغيرة. حسّن و طوّر و صلح الأخطاء و لا تتوقف تأتي لحظة على المدى الطويل يكون نجاحك فيها واضحا كبيرا.
Labels:
arabic-posts,
future,
technology
الاثنين، 23 يونيو 2008
حول مشاريع التخرج - الجزء الثاني - أفكار المشاريع
( الجزء الأول هنا )
نصائح للعثور على أفكار لمشاريع التخرج:
- وسّع مداركك.
- لا تخشَ إعادة استكشاف الأفكار السابقة.
- فكر في احتياجاتك أنت.
-اعرض الأفكار على الآخرين.
- قَيِّم مشروعك عملياً.
وسّع مداركك
كلما تنوعت معرفتك و زاد إلمامك بأمور البرمجة, كلما وجدت وفرة في أفكار المشاريع. من تتخيل سيأتي بأفكار أفضل: الذي لا يعرف سوى ال #C و ال SQL أم الذي قرأ عن ال Ajax أو ال Virtual Machines أو ال Distributed Computing؟
اذهب إلى مواقع أبحاث الشركات التي تهتم بالعلم مثل Microsoft أو Sun أو Google أو IBM أو Intel. لا تذهب فقط بنيّة البحث عن فكرة مشروع فالتعجُّل قد يحرمك من رؤية الأفكار الجميلة حقا. بل اذهب بنيّة الأطّلاع و كأنك تأخذ جولة سياحية في علوم الكمبيوتر. أنظر إلى المشاريع. زُر بعض الصفحات الشخصية للباحثين هناك. أنظر الى ما نشروا. تابع ال blogs. أبحث ببعض الكلمات المهمة في مواقع نشر ال Papers مثل Citeseer أو Google Scholar. أو اذهب لمراكز البحث في الجامعات الشهيرة
ربما تجد فكرة مفتوحة تأخذها جاهزةً و ربما لا, ليس هذا المهم و لكن المهم أن يتسع مجال تفكيرك و تجد تطبيقات كثيرة لل Software و ال Hardware كانت غائبة عنك, و هكذا يمكنك الهروب من المشاريع النمطية التي يكاد يقوم بها الجميع.
حتى لو شعرت أنه لم يبق متسع من الوقت للمعرفة فأقرأ. ربما ينفعك ولو يوم واحد من القراءة لتعرف مجالاً جديدا غنياً بالأفكار.
لا تخشَ إعادة استكشاف الأفكار السابقة
كثيرا ما تكون النتائج أهم من الفكرة نفسها. كان العالَم مليء بمحركات البحث من قبل Google ولم يمنعهم هذا من الأبتكار في نفس المجال. لم يكن ال iPhone أول هاتف محمول ذكي و لم تكن ال #C صادرة قبل ال Java، ومع ذلك كل من هؤلاء قدم تطويرات كبيرة على ما سبق وصار إنجازا في حد ذاته.
لا تخف من الأفكار القديمة و انظر الى مشروع سابق أو برنامج تستخدمه. و سل نفسك كيف أطوره. كيف أتحاشى أخطاء من صممه. كيف أعيد اختراعه. معظم التكنولوجيا التي نستخدمها من GUI أو لغات برمجة أو Office Applications مبنية على نفس المباديء الموجودة منذ السبعينات أو الثمانينات، وبها مجال واسع للتطور. ربما يفيدك أن تلقي نظرة على الأبحاث المنشورة في تلك المجالات لتعلم الأفكار الجديدة التي بُحثت و لم تطبق بعد أو لم تطبق بصورة كلية.
فكر في احتياجاتك أنت
ما احتياجاتك كمبرمج؟ كمستخدم للإنترنت؟ كمستخدم عربي؟ كطالب؟ في حياتك؟
أمثلة للاحتياجات:
اعرض الأفكار على الآخرين
اجتمع مع افراد الفريق في جلسات brainstorming وناقشوا كل الأفكار المتاحة (حتى لو بدت في حينها سخيفة أو غير عملية). اعرضوا الأفكار على أصدقائكم و على المعيدين. اطلبوا الأقتراحات لتحسينها. لو انتقد أحدٌ الأفكار اسألوا كيف يمكنه أن يتلافى العيوب التي ذكرها. جرب أن تخلط أفكارا ببعضها (مثلا برنامج Resolver خَلَط لغة ال IronPython بفكرة الجداول الألكترونية مثل ال Excel).
قَيِّم مشروعك عملياً
لا تكتف بفكرة مجرّدة فتقول "سأقوم بمشروع عن كذا" فحسب. ارسم رسما تخطيطياً للمشروع على ورق. تخيل أنه تم تنفيذ مشروعك و مثل انك تستخدمه بعد تنفيذه. ارسم screenshots. افعل مثلما فعل Jeff Hawkins مصمم جهاز ال Palm حين كان يمسك بلوح خشبي صغير كأنه كمبيوتر محمول ليجرب الطرق المخلفة للتعامل مع الأجهز-- كان حينا يكتب عليه بقلم و حينا يتحدث إليه صوتيا و هكذ، ليعلم أي من تلك الوسائل تبدو تلقائية و مريحة للمستخدم).
إذا كان مشروعك Compiler أو أداة برمجة فجرّب أن تكتب على الورق نماذج للcode باللغة الجديدة التي تصممها. إذا كان ال GUI جزءا أساسيا في المشروع فلعله يفيدك أن تكتب Prototype يرسم GUI كروكية ليراها باقي أفراد الفريق أو المشرفين.
لا تكتف بتقييم فكرة المشروع "سَمَاعيّا" بأن تتكلم عنه فقط! بل قيِّمها عملياً بأن تصنع رسومات وبرامج تجريبية تكون آثارا حقيقية لتفكيرك.
نصائح للعثور على أفكار لمشاريع التخرج:
- وسّع مداركك.
- لا تخشَ إعادة استكشاف الأفكار السابقة.
- فكر في احتياجاتك أنت.
-اعرض الأفكار على الآخرين.
- قَيِّم مشروعك عملياً.
وسّع مداركك
كلما تنوعت معرفتك و زاد إلمامك بأمور البرمجة, كلما وجدت وفرة في أفكار المشاريع. من تتخيل سيأتي بأفكار أفضل: الذي لا يعرف سوى ال #C و ال SQL أم الذي قرأ عن ال Ajax أو ال Virtual Machines أو ال Distributed Computing؟
اذهب إلى مواقع أبحاث الشركات التي تهتم بالعلم مثل Microsoft أو Sun أو Google أو IBM أو Intel. لا تذهب فقط بنيّة البحث عن فكرة مشروع فالتعجُّل قد يحرمك من رؤية الأفكار الجميلة حقا. بل اذهب بنيّة الأطّلاع و كأنك تأخذ جولة سياحية في علوم الكمبيوتر. أنظر إلى المشاريع. زُر بعض الصفحات الشخصية للباحثين هناك. أنظر الى ما نشروا. تابع ال blogs. أبحث ببعض الكلمات المهمة في مواقع نشر ال Papers مثل Citeseer أو Google Scholar. أو اذهب لمراكز البحث في الجامعات الشهيرة
ربما تجد فكرة مفتوحة تأخذها جاهزةً و ربما لا, ليس هذا المهم و لكن المهم أن يتسع مجال تفكيرك و تجد تطبيقات كثيرة لل Software و ال Hardware كانت غائبة عنك, و هكذا يمكنك الهروب من المشاريع النمطية التي يكاد يقوم بها الجميع.
حتى لو شعرت أنه لم يبق متسع من الوقت للمعرفة فأقرأ. ربما ينفعك ولو يوم واحد من القراءة لتعرف مجالاً جديدا غنياً بالأفكار.
لا تخشَ إعادة استكشاف الأفكار السابقة
كثيرا ما تكون النتائج أهم من الفكرة نفسها. كان العالَم مليء بمحركات البحث من قبل Google ولم يمنعهم هذا من الأبتكار في نفس المجال. لم يكن ال iPhone أول هاتف محمول ذكي و لم تكن ال #C صادرة قبل ال Java، ومع ذلك كل من هؤلاء قدم تطويرات كبيرة على ما سبق وصار إنجازا في حد ذاته.
لا تخف من الأفكار القديمة و انظر الى مشروع سابق أو برنامج تستخدمه. و سل نفسك كيف أطوره. كيف أتحاشى أخطاء من صممه. كيف أعيد اختراعه. معظم التكنولوجيا التي نستخدمها من GUI أو لغات برمجة أو Office Applications مبنية على نفس المباديء الموجودة منذ السبعينات أو الثمانينات، وبها مجال واسع للتطور. ربما يفيدك أن تلقي نظرة على الأبحاث المنشورة في تلك المجالات لتعلم الأفكار الجديدة التي بُحثت و لم تطبق بعد أو لم تطبق بصورة كلية.
فكر في احتياجاتك أنت
ما احتياجاتك كمبرمج؟ كمستخدم للإنترنت؟ كمستخدم عربي؟ كطالب؟ في حياتك؟
أمثلة للاحتياجات:
- كيف تنظم أفكارك
- كيف تدير نسخ مختلفة من ال code عبر اعضاء الفريق الواحد
- كيف تبحث عن المعلومات
اعرض الأفكار على الآخرين
اجتمع مع افراد الفريق في جلسات brainstorming وناقشوا كل الأفكار المتاحة (حتى لو بدت في حينها سخيفة أو غير عملية). اعرضوا الأفكار على أصدقائكم و على المعيدين. اطلبوا الأقتراحات لتحسينها. لو انتقد أحدٌ الأفكار اسألوا كيف يمكنه أن يتلافى العيوب التي ذكرها. جرب أن تخلط أفكارا ببعضها (مثلا برنامج Resolver خَلَط لغة ال IronPython بفكرة الجداول الألكترونية مثل ال Excel).
قَيِّم مشروعك عملياً
لا تكتف بفكرة مجرّدة فتقول "سأقوم بمشروع عن كذا" فحسب. ارسم رسما تخطيطياً للمشروع على ورق. تخيل أنه تم تنفيذ مشروعك و مثل انك تستخدمه بعد تنفيذه. ارسم screenshots. افعل مثلما فعل Jeff Hawkins مصمم جهاز ال Palm حين كان يمسك بلوح خشبي صغير كأنه كمبيوتر محمول ليجرب الطرق المخلفة للتعامل مع الأجهز-- كان حينا يكتب عليه بقلم و حينا يتحدث إليه صوتيا و هكذ، ليعلم أي من تلك الوسائل تبدو تلقائية و مريحة للمستخدم).
إذا كان مشروعك Compiler أو أداة برمجة فجرّب أن تكتب على الورق نماذج للcode باللغة الجديدة التي تصممها. إذا كان ال GUI جزءا أساسيا في المشروع فلعله يفيدك أن تكتب Prototype يرسم GUI كروكية ليراها باقي أفراد الفريق أو المشرفين.
لا تكتف بتقييم فكرة المشروع "سَمَاعيّا" بأن تتكلم عنه فقط! بل قيِّمها عملياً بأن تصنع رسومات وبرامج تجريبية تكون آثارا حقيقية لتفكيرك.
الاشتراك في:
الرسائل (Atom)



