الجمعة، 9 مارس 2012

All about pointers: part 2

So now you learned pointers from part 1, right? What can we now do with them?

Well, we can use pointers in two ways:
1- As an abstraction over variables.
2- As just a memory location.

Abstraction over variables

Normal variables let us abstract over values; meaning "do something with x whatever value it has". Well, pointers let us store variables in variables, so to speak, and thus abstract over them.

For example, there is no pass by reference in C, but we can emulate it with pointers:

void readInt(int *x) {
cin >> *x;
}
main() {
int t;
readInt(&t);
}

The function main is passing the location &t (by value) to readInt. When readInt modifies *x, this means "go to the address stored in x, and in that address, store whatever comes from cin >>". This modifies the value of t; which is what we wanted.

This pass-by-value works for anything that has a memory location; not just simple variables:

main() {
Point p;
readInt(&(p.x));
}

This will take the address where p.x is stored, and pass it to readInt; so it will be the address where readInt will write.

Is there another use of 'abstraction over variables' other than pass by reference? Well, this depends on your imagination. We can do things like this:

void getAge( ) {
int x = 8;
dialog.scrollBox1.setBinding(&x);
showDialog( );
cout << x;
}

Here we can imagine the setBinding function storing a pointer to an integer (pointing to x in the example) and whenever the user slides the scroll bar, the content of the address stored in the pointer is changed. Therefore after the showDialog function ends we find the value of x automatically reflecting the scroll bar position. It is as if we passed the variable itself as an argument to the setBinding function.

Pointers as memory locations

We can also treat a pointer as just a location in memory, not associated with a named variable that already exists. This is helpful in situations like:

1- Dynamic memory.
2- Reading and writing buffers.
3- Accessing hardware devices.

Dynamic memory:

Local variables in functions are automatic variables; the size needed for each function's vars is calculated at compile time and space for all vars is allocated at function call, deallocated at function exit. This is useful for most programs but sometimes we want full control of memory allocation at runtime:
- Perhaps we have an array with non-fixed size.
- Perhaps we're using a linked list; where memory must be allocated only when we need to add to the list.
- Perhaps we're creating an interpreter for our own programming language, where the user's program will allocate memory.

In all cases, memory allocation takes a form like this
myPointer = malloc(memSize);
or
myPointer = new type;
or
myPointer = new type[numElements];

...and I can access the content of the pointer normally with *myPointer = xyz;

We are here using the pointer to store the address of a hypothetical variable that wasn't declared in the code. A 'run-time' variable if we may say. And since they need not be declared at compile time we can have as many of them as we wish and at the time we wish.

I think this has a theoretical aspect; and relates to theory of computation: think of turing machine and the infinite tape that gives them their computational power; and of finite state automatons and the finiteness of their states, as if they were 'compile time' memory :)

anyway...

Reading and writing buffers

Think of the fread function in C:

main() {
Point p1;
fread(&p1,myFile, sizeof(Point));
}

Here the fread function doesn't care if it's reading a point or not: all it needs is a memory location and the number of bytes to read, and it will fill that memory with data from the file. Here the pointer is treated purely as an address.

Accessing hardware devices.

In the good old days of DOS, you could do stuff like this:

// note: just a sample value
#define START_OF_VIDEO_MEMORY 0xA000

main() {
char *v = START_OF_VIDEO_MEMORY;
*(v + 5) = 60;
}

This would write the value 60 at five bytes after the start address of video memory. With code like this a developer could write directly to the video card; do tricks, make fast games....etc.

In modern operating systems this is impossible due to virtual memory. In a system like 32-bit Windows each program sees memory as 4GB all of it available to itself. The operating system does a lot of work to keep programs from taking each others' memory and keep each program thinking it owns all memory on the machine. This means that the address 0xA000 no longer means anything special; it's just a part of the virtual address space that could be valid or invalid for the running process (if it's valid, writing to it will change some unknown part of your program; if invalid your program will crash).

This leads to things like DirectX...etc to make game programming faster on Windows; but does that mean pointers for direct access are no longer useful?

Well, sometimes they're still useful. For example some hardware devices (sensors, robot controllers...) will take the virtual memory system to their advantage; the device's driver will map some memory on the device itself to memory in your program! This means you can use pointers to read or write directly to the device memory. It usually goes like this:

#include "sensor.h"
main() {
char * p = sensor_map_memory( "mySensorDeviceName");
// do what you want with p...
sensor_unmap_memory(p);
}

We've taken a nice journey now, and saw why C has a reputation for being suitable for low-level code; took a look into abstraction and dynamic memory, and hopefully understood pointers at a deeper level. I hope you liked the article!

All about pointers

Everyone, including myself, thought at some time that pointers are some complex, difficult-to-understand feature of C. It's much simpler than you think. You just need to know how the hardware & the C compiler deal with variables.

In C, all data are basically bytes: a char is 1 byte, an int is four bytes, a pointer is four or eight bytes...etc. The difference is what those bytes mean.

Also, during compilation variable names are replaced by numbers. So when your program is being compiled the variable 'x' is replace by (say) 1000. And this number refers to a location in memory.

Let's say your C program is this:

main()
{
int x, y;
x = 5;
y = x;
y++;
}

The compiler will choose an address for each variable (say address of x is 1000, address of y is 1100) and replace all your variable names with these addresses. The machine code generated from the compiler would be like this, in the form of instructions to the CPU:

put 5 into address 1000
read content of address 1000 & put a copy of this content into address 1100
increment the content of address 1100

But those addresses are invisible to us the programmer; we cannot see the 1000, we see only x, right? Well, being a powerful language, C allows us to peek behind the scenes and play with the addresses themselves. This is done via the 'addressOf' operator, also known as &

if I add to the above program
z = &x
it will mean the following (assuming Z is in address 1200):
put the address 1000 in the content of the address 1200

Do you notice a difference? We did not say "read the content of address ....", we directly said "put the address....". This is basically what pointers are: addresses.

The type of z would be a "pointer to int", which means "you know those int variables? I want to store their addresses, not their content". Notice that for int, float, char....etc all pointers are the same size; since all variables are in the same memory space, which has the same type of address.

ok, another example:

main()
{
int x;
int *z;
x = 8;
z = &x;
}

What can we now do with z? We want to read and write to the address it stores. So we can do this:

main()
{
int x;
int *z;
x = 8;
z = &x;
*z = 12;
}

This will generate machine code like this (assume again x is address 1000, z is address 1200; actually you can run this code in debug mode, put a breakpoint, and look at x, z...etc in the watch window; you'll see their actual addresses)

put the value 8 in the memory location 1000
put the value 1000 in the memory location 1200
read the content of the memory location 1200, use that value as a memory location, and go there and write 12

Oh! Did you see that? We did not put 12 in the address 1200, no! We took a peek in 1200, found another address, and went there and put 12.

What was the location written in 1200? It was 1000. And we know that 1000 is actually another name for x. If we did a cout << x we would have found it to be 12 and not 8.

In summary:
  • &a means "the address assigned to the variable a"
  • *b means "read the contents of b, use it as an address for reading and writing".
  • * has another meaning when declaring variables: type *x means x is a pointer to a variable of the type.
All this looks more confusing that it actually is. If you find it confusing, read it again with a pencil and papers, and try to draw memory and its locations/contents.

What is the benefit of all this? It's a long story about abstraction over variables and dynamic memory and more...I discuss it in the second part of this article. Just learn pointers first :)

هل تحارب لغات البرمجة العربية؟ عندي لك اخبار جيدة :)

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

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

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

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

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

الخميس، 1 مارس 2012

خدعوا انفسهم وقالوا واقعية

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

- حين يرفضون فتح الشركات في مصر...هل قاموا بعمل إحصائية عن حالة السوق ورؤوس الأموال والقدرة الشرائية...الخ...الخ؟

- حين يتحدثون عن استحالة تعريب العلوم، هل بنوا رأيهم هذا على أساس علمي؟ هل جربوا مثلا تعريب كتب في علم معين، ثم تدريس مجموعة اختبارية بالنسخة العربية ومجموعة ضابطة control group بالنسخة الأجنبية ومقارنة النتائج بين هذه وتلك؟ هل نشروا نتيجة التجارب في مؤتمرات؟

- وحين يقولون ان المجتمع لن يتطور إلا بعد مائة سنة (إن تطور اصلاً في نظرهم)، كيف عرفوا؟ هل جاؤوا بخبراء سياسة واقتصاد واجتماع وقانون، وقدموا دراسة مستفيضة من جميع الجوانب، ظهر منها ذلك الاستنتاج القوي؟

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

الذي لم يدركوه انهم قد استبدلوا انطباعاً شخصيا مفرط في التفاؤل بانطباع آخر متشائم، لكنها في الحالتين انطباعات: لم يصيروا واقعيين.

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

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

Some people have compassion, others don't even have empathy

"يا يحيى خذ الكتاب بقوة وآتيناه الحكم صبياً. وحناناً من لدنا وزكاةً وكان تقياً"
سورة مريم

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

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

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

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

الآن نتكلم عن empathy. معناها "التفكير كما يفكر الطرف الآخر" أو تقريباً ما نسميه التفهم. ليس معنى الempathy ان توافق الشخص بالضرورة - فقط معناها ان تفهمه. ويبدو اننا نحتاج أن نستورد بعضا من الempathy من الدولة المنتجة، لأنه هناك ازمة كبيرة في بلادنا ونقص في المخزون الاستراتيجي: لا يكاد احد يفهم كلمة من الطرف الآخر.

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

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

ما موضوع مقالي؟ موضوعه هو ان جزءاً كبيراً من الcompassion يأتي من الempathy. لو فهمت كيف يحيى الإنسان وكيف يفكر ومم يخاف...فسيزداد عطفك وكرمك معه.

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

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

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

بعض الناس لديها compassion، والبعض لا يملك حتى الempathy.

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

خاتمة اخرى: تبرعوا لسوريا.

الثلاثاء، 28 فبراير 2012

دولة المسئولية

كانت الدولة الإسلامية قديماً تستشري فيها فكرة المسؤولية. الدولة مسؤولة عن المواطن. ليست مجرد مسؤولة اقتصادياً أو أمنياً أو قانونياً -- مسؤولة عن المواطن. هل المواطن سعيد؟ هل هو راض؟ هل هو بصحة جيدة؟ هل يربي ابناءه بلا مشاكل؟

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

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

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

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

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

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

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

وماذا عن العلم؟ قديما في الدولة الإسلامية كان هناك مكتبة في كل شارع، لماذا لا نعيد هذا؟ ونصنع أيضاً استكشافية [وهي مكان عرض للعلم مثل تلسكوبات وقبة سماوية، تجارب، سيارات وآلات شفافة لترى كيف تعمل من الداخل...الخ...الخ] ليرى الناس عجائب الكون وإحكامه ويقدروا قيمة العلم الذي كُشف لنا به ما لم نحسب نفسنا سنراه؟

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

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

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

ولماذا لا يشعر كل منا، فرداً وموظفاً وحاكماً، بالمسؤولية تجاه الآخرين؟

الثلاثاء، 31 يناير 2012

لغة كلمات والمجتمع: لماذا وكيف؟

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

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


ووسيلة للتعبير عن النفس للكبار أيضاً

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

لكن الأمور قد تغيرت

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

يقول أحد المبرمجين الأمريكان: حين يختفي الإبداع يتخذ الناس الذوق بديلاً عن المهارة. أي أنه إن كنت انا غير مبدع وانت غير مبدع فكيف انافسك؟ بدلا من ان اقول "انظر لقدرات برنامجي" سأقول "انا اخترت لغة افضل منك"!

لقد نسينا متعة البرمجة، وقد آن لنا أن نتذكرها.

هيا نغير الأمور للأفضل

أريد إعادة روح الإبداع والتنافس للعالم البرمجي في الوطن العربي. من أجل هذا صنعنا لغة كلمات وهي سلاح أراه قوياً في هذا الأمر. لماذا؟
  • لأنها سهلة الاستخدام وسهلة التعلم، مما يتيح لعدد أكبر بكثير ان يدخلوا مجال البرمجة، وأن يدخلوها في سن مبكر حيث الاهتمام بالاستمتاع والتعبير عن النفس وليس البرمجة لأسباب وظيفية.
  • تتيح البرمجة باللغة العربية، مما يسمح لشريحة أوسع من المجتمع أن تدخل في هذا العالم، وتزيح عائقاً أمام كثير من الاطفال الاذكياء لكن لم يتعلموا الانجليزية.
  • الإبداع بالرسوم والألعاب سهل في كلمات: لا تحتاج إلى تركيب مكتبة مثل SDL أو DirectX أو PyGame كي تبدأ: كل شيء موجود بالفعل كجزء من الأوامر الاساسية للغة.
  • اللغة نفسها قوية وتنمو بنمو قدرات المبرمج، فيمكن استخدام اوامر صغيرة اولا لتكون لغة شبيهة بلغة البيسك القديمة، ثم الانتقال بعد ذلك للإجراءات، البرمجة الكائنية OOP، وحتى البرمجة المتوازية!
  • بيئة التطوير الخاصة باللغة مصممة من أجل التعليم، ونفخر أن يكون بها إمكانات خصيصاً لذلك:
  1. يمكنك أن تنسخ الكود بصيغة HTML مع ضبط المحاذاة وتلوين الكلمات، لتضع الكود بسهولة على مدونتك أو على منتدى تعليمي.
  2. يمكن كذلك نسخها بصيغة Wiki لكي يتعاون الناس على تصميم كتب لها عبر الإنترنت.
  3. بها إمكانية تتبع سير البرنامج أثناء تنفيذه (المراقب العجيب).
  4. بها debugger.
...وهناك إمكانات اخرى يخطط لها.

لم ننس الجانب الاجتماعي أيضاً

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

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

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

الاثنين، 23 يناير 2012

الطريق المعلوم لشرح مثال مثلث النجوم

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

*****
****
***
**
*

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

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

عملاً بمبدأ اظهر ولا تخبر تعالوا الآن نقدم طريقة مختلفة لشرح هذا المثال.

اولا سوف نصف المشكلة:
  • نريد كتابة برنامج يكتب مثلث نجوم ارتفاعه 5 سطور.
  • أدوات حل المشكلة لدينا هي (أ) امر cout الذي يعرض اشياء على الشاشة. (ب) امكانية الانتقال لسطر جديد بإضافة endl في امر cout وأخيراُ (ج)ادوات التحكم البرمجية التقليدية من loops، conditions، variables

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

الآن نفكر في الحل:

(من اجل التبسيط لن اكتب "طقوس" برامج السي من #include وما شابه)

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

main() {

for(int i=0; i<5; i++) {

draw_line();

}}

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

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

الآن نكتب الأمر المطلوب:

void draw_line() {

// ???????

}

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

ما هو عدد النجوم المطلوب؟ اوه ألا تعرف؟ إنه n بالطبع!

void draw_line() {

for(int j=0; j<n; j++) {

cout << "*";

}

cout << endl;

}

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

*****
****
***
**
*

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

main() {

int n = 5;

for(int i=0; i<5;i++) {

draw_line();

n--;

}

}

الكود تبدو طبيعية جدا: طول السطر يبدأ بخمسة، ثم نرسم السطر، ثم ننقص الطول بمقدار واحد، وهكذا. لكن الدالة draw_line هي التي تحتاج لطول السطر، وليس main!

لا بأس، من أجل هذا هناك إمكانية تمرير الparameters. أولا نعدل main:

main() {

int n = 5;

for(int i=0; i<5;i++) {

draw_line(n);

n--;

}

}

وثانيا نعدل draw_line:

void draw_line(int n) {

for(int j=0; j< n; j++) {

cout << "*";

}

cout << endl;

}

وانتهى البرنامج! ماذا لو لم يكن الطالب قد اخذ الfunctions من قبل؟ مشكلة قابلة للحل: يمكن تقديم الfunctions قليلاً أو استخدام comments هكذا:

main() {

for(int i=0; i<5;i++) {

// draw line

}}

ثم التساؤل "ماذا نكتب مكان التعليق" بدلاً من "كيف نكتب الدالة المطلوبة".

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

ارجو أن يفيد هذا المثال من هو في موقف تعليمي.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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