الجمعة، 25 أبريل 2008

حول مشاريع التخرج, الجزء الأول

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

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

ما فائدة المشروع؟

التطبيق العملي للعلم: معظم مشاريع السنين الدراسية السابقة كانت تركز على التمرين على استخدام اﻷدوات البرمجية, أى أن هدفها كان تعليميا قبل أن يكون تطبيقيا. أما مشروع التخرج فهو فرصة لتطبيق ما تعرف لكتابة برنامج حقيقي و ليس مجرد إثبات فهمك لتكنولوجيا معينة. ربما يكون مشروعك برنامجا تطبيقيا جديدا و سيكون عليك أن تفكر في ال Users و احتياجاتهم. أو ربما يكون ذو اتجاه بحثي مثل الكثير من المشاريع التي تمت قبل ذلك في الكلية كمشاريع ال Robotics أو ال Compilers أو ال Image Processing , و وقتها ستتعلم كيف تقرأ في المراجع و كيف تسير على أساس علمي.
في كل الحالات ستتعلم كيف تدير Software Development Lifecycle كاملة من Analysis و Design و Implementation.

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

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

ما ليس بصفات المشروع

مشروعك ليس Assignment: على المشروع أن يقدم تحديا و أن يعلمك خبرات جديدة. إن وجدت المشروع أسهل مما يجب أو لا يحتاج أن تجيب على أسألة محيرة في ال Design أو أنك لن تحتاج لجمع معلومات من أجل تنفيذة, فراجع نفسك فربما لا يكون ما تفعل على مستوى مشروع تخرج.

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

كيف تجمع بين هذا وذاك؟
1- اختر فكرة جيدة بها تحدي لتنفذها
2- ركز في هذه الفكرة و لا تركز في غيرها.

أعتبر المشروع تجربة علمية اكثر منه منتجا تجاريا, ببساطة أنت لديك فكرة أن طريقة ABC هي طريقة جيدة لتحقيق هدف XYZ. اجعل هدف المشروع هو التأكد من صحة هذه الفكرة و لا شيء غير هذا. بعد أن تكون أنهيت المشروع بنجاح و تأكدت من جودة فكرتك يمكنك بعدها أن تفكر ان تستخدم الخبرة التي اكتسبتها في عمل مشروعا أكبر و أكثر طموحا.

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

و إذا كان مشروعك لغة برمجة تسهل عمل برامج للWeb, فركز على جزء الWeb و لا تحاول أن تضيف اليها ما لا علاقة له بالهدف, فإن كانت كتابة Interpreter اسهل لك فاجعلها Interpreted و ليس Compiled, و لا تسع لأن تضيف library كبيرة مثلا بل سيكون عليك أن تركز على الهدف الأساسي و هو "كيف تجعل حياة مبرمح ال Web أسهل" و ليس "كيف تصنع لغة البرمجة المثلى".

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

الجمعة، 18 أبريل 2008

Using 100% Original Software

So you want to use 100% original software but think you can't afford it?
Here's my guide to working without having to pay for applications yet without any illegally copied software.

Basically, there are 2 situations:

1- You have a laptop with an original copy of Windows pre-installed and all you have to worry about is application software.
2- You don't have Windows. In this case you could run Linux and Linux-based applications.

I'll talk about issue #1 in this post. Linux and its applications will have to wait for a future post. I won't mention any software unless it's has high enough quality to be usable for day to day tasks, either personally or in a company.

Programming

For C# and C++ programming on Windows, I use Visual Studio Express. High quality, free and straight from Microsoft. They also allow commercial use.

C++ express doesn't come with MFC. A lot of projects use wxWidgets so I think I'll be evaluating at some point to see if it's a good replacement (Update: I now Qt Creator for almost all my C++ work. Download from here).

For Java, I use Eclipse. Its refactoring support is amazing and the editor is very powerful. If your work focuses on designing Java GUI's I recommend Netbeans.

For LISP, I use SBCL, and for editing text files I use Notepad++.

Office & Web

I use OpenOffice.org, it has good Arabic support, opens and saves Word and Powerpoint files and has most of the features needed for everyday use. For email I use Thunderbird and for viewing PDF files I use Foxit Reader (Adobe Acrobat reader is free but I don't like it's quality. You'll learn to hate it too after you use Foxit).
For web browing I use Firefox (again, even though Internet explorer is already bundled with Windows, I don't consider it of high enough quality).

Utilities

For opening compressed files like *.rar or *.ace, I use 7-zip. Notice that WinRar is shareware and needs to be paid for, so it's not original software. 7-zip is free, however. My antivirus is ClamAV.

If you have more suggestions for free high quality software, I'd like to hear about them!

الاثنين، 14 أبريل 2008

هؤلاء العباقرة و حبهم للأجهزة المحمولة

في عام 1968 كان فريق من الباحثين في مركز Xerox PARC يعمل في مشروع كمبيوتر محمول اسمه ال Dynabook. و كان العالِم Alan Kay عضوا اساسيا في ذلك الفريق.
لم يكن ال Dynabook جهازا محمولا عاديا مثل ما نرى الآن و لكن كان أقرب لخليط من ال iPhone و ال Tablet PC و كان من أكثر المشاريع طموحا في عالم الكمبيوتر و البرمجة. و توقف المشروع بعد فترة و لم يحقق نجاحا تجاريا, و لكن أحد منتجاته كان لغة Smalltalk.

بعد هذا طورت ال Smalltalk و استخدمت في مشروع آخر هو ال Xerox Alto.
كان ال Alto من اوائل الأجهزة في العالم التي تعتمد على ال GUI. و كانت ال Smalltalk من اوائل لغات البرمجة ال Object Oriented. لم تكن اول لغة من هذا النوع لكنها طورت هذا العلم و دفعته إلى الإنتشار و ساهمت فيه مساهمات كثيرة ,ليس أقلها أن Alan Kay هو واضع مصطلح Object Oriented Programming!

و في زيارة لمركز PARC وجد Steve Jobs رئيس شركة Apple ما اوحى اليه بتصميم ال Macintosh و من بعده صممت Microsoft ال Windows.

إذن أحد العوامل الرئيسية في استخدامنا للGUI و ال Object Oriented Programming هو حلم Alan Kay في تصميم الحاسوب المحمول المثالي. و هو حلم لم يتحقق بعد.

و في التسعينات كان فريق من الباحثين في شركة Sun يحاول ابتكار لغة جديدة لبرمجة الأجهزة الإلكترونية. و حين جاء وقت تجربة بعض أجزاء اللغة, حاولوا صنع كمبيوتر محمول سُمي Star7. في عام 1994 تم استخدام اللغة في تشغيل البرامج عبر الأنترنت و ظهرت ال Java.

و في 1992 قدمت Apple جهاز Newton. و كان جهازا محمولا سابقا لزمنه عمل فيه بعض انبغ علماء Apple,و فيه على سبيل المثال تكنولوجيا للتعرف على الكتابة بخط اليد و يتم برمجته بلغة مبدعة هي NewtonScript التي بنيت على افكار من لغة Self. و Self هي نفس الغة التي بني عليها الكثير من أسس ال JavaScript.

يا لهؤلاء العباقرة! كل عشر سنوات يأتينا من يحدث قفزة في اساليبنا التي نبرمج بها أو نتعامل بها مع المعلومات. و نراهم مشتركون في الحلم بتصميم الجهاز المحمول المثالي!
حين ترى Steve Jobs يسعى لإنتاج ال iPhone تشعر كأنه هدف شخصي وليس مجرد منتج. ما الذي يدفعه؟
و ما الذي جعل Bill Gates يصر على إنتاج ال Tablet PC برغم عدم انتشاره نسبيا مقارنة بأجهزة ال Laptop العادية؟

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

و السؤال الأخير, بعد ان أوشك ال Dynabook على أن يتحقق و رأينا ال iPhone و Google Android يقتربون من امكانياته, بم سيحلم صانعو التكنولوجيا بعد ذلك؟
هل تعرف أنت؟

الخميس، 10 أبريل 2008

لغات البرمجة و لصوص الأفكار

في منتديات البرمجة ترى الصراعات عن الأدوات المفضلة: ما هي افضل لغة برمجة,و ما هو اقوى نظام تشغيل, و ما إلى ذلك.
و حين يتطرق الأمر الي لغات البرمجة بالذات, يأتي دائما ذكر كيف ان Microsoft قامت بسرقة افكار ال Java ووضعتها في ال #C.
السؤال هو: ما المشكلة في هذا؟ هل هناك سبب حقيقي يجعل استفادة مايكروسوفت من الأفكار الموجودة في ال Java شيئا سيئا؟

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

ال#C قد اقتبست من ال Java في بداية الأمر, لكنها بعد ذلك اضافت الكثير الي عالم المبرمجين في سوق البرمجيات,بداية من ال automatic boxing مرورا بالمساعدة في نشر استخدام ال closures و وصولا الي الأفكار الكبيرة مثل ال LINQ. اذا كان ثمن هذا هو الأقتباس من ال Java في البداية فليكن.
ال Java نفسها مر عليها سنوات و لم نر فيها الجديد. هي تقريبا نفس اللغة منذ ظهرت في منتصف التسعينات. نعم تطورت الLibraries و الIDE's الي حد يفوق ال #C في احيان كثيرة, و لكن اللغة نفسها صارت اشبه بعائق في طريق المبرمج اكثر منها اداة يستخدمها.

و مع ذلك فإن ال Java كانت قوية و مبتكرة حين ظهرت في بدايتها, و كانت بمثابة نفحة من الهواء النقي بالنسبة للمبرمجين وقتها. اتدرون ماذا كانت Sun تفعل في تلك الفترة؟ كانوا يقتبسون!

نظر مبتكروا Java الي لغات كثيرة بينما كانوا يقومون بتصميم اللغة الجديدة, مثل ال C و Mesa و Smalltalk و Objective C .لم يكن هذا عيبا في حق Sun. بل ربما كان ضروريا.

كلمة "سرقة الأفكار" لا تُفهم بالمعنى الحرفي, فالذي ينظر للبرامج الأخرى و هو يصمم برنامجه اقرب الي الصحفي الذي يتابع الأخبار ليعرف اهتمامات المجتمع او المؤلف الذي يقرأ كتب التاريخ بحثا عن ملحمة يروي عنها. هذا اطلاع و تأمل اكثر منه سرقة.

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

ليس معني الأبداع الأنغلاق. بل كلما نظرت إلى اعمال غيرك صار لديك مورد اكبر لأفكارك. بل و يفيدك أيضا التأمل في العلوم غير البرمجية ولو كان مشروعك برمجيا. لهذا يدرس مصممي ال User Interface علم النفس. و لهذا يفتخر Larry Wall مخترع لغة ال PERL بأنه درس اللغات الطبيعية البشرية, و لولا هذا ما ظهرت لغة مثل ال LISP مبنية على الأسس الرياضية التي يضمها ال Lambda Calculus.

و بمناسبة أقتباس الأفكار, لعلك تقرأ في الصحف المصرية الكثير من النداءات لتشديد قوانين براءات الاختراع و أن هذا هو السبيل الوحيد للحاق بركب التقدم.
كلا لا اصدق هذا. العلم كله مبني على بعضه البعض, و لا ارى ان تقييد حرية الأستفادة من افكار الغير يؤدي حقا الى التطور. تخيل لو كانت هناك براءات اختراع على ال Hashtable او ال Linked List او خوارزمية ال Binary Search او أي من هذه الأساسيات.
كان هذا سيقيد حرية التطوير الى حد ساحق و ربما ماكان سيظهر لنا Windows ولا Linux ولا Java ولا #C !

الثلاثاء، 8 أبريل 2008

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

هذا المقال مبني على ملاحظتين
اولا:ان مستقبل اﻷمة مبني على العلم
ثانيا:ان افضل وقت لتعلم البرمجة هو مرحلة الطفولة من حوالي سن العاشرة

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

واما الملاحظة الثانية فلا تعجب منها, فمن خبرتي الشخصية فأن كثير من افضل المبرمجين الذين عرفتهم بدؤا صغارا. كثير من المبرمجين المتمكنين في مصر تعلموا علي كمبيوتر صخر المنزلي و في باقي العالم تعلموا علي اجهزة مثل Commodore 64 او BBC Micro او ][ Apple

و هناك ابحات تجري في كليات عريقة مثل MIT و غيرها عن الطرق و اللغات المثلي لتعليم اﻷطفال البرمجة. احصائية سريعة لبعض هذه الأبحاث هنا : http://homepages.inf.ed.ac.uk/wadler/compthink.html

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

ﻻ تركز علي لغات البرمجة ذات الوجود الكبير في السوق مثل الJava او ال #C فليس هدفك ان تساعد احد على ايجاد وظيفة, و لكن استخدم لغة سهلة مثل Free Basic او Logo ..لغة من اللغات التي تسهل انشاء الرسومات و اﻷلعاب و تجعل من البرمجة مرحا و متعة. و يا حبذا لو جعلت اﻷطفال يقومون بإنشاء العابهم الخاصة.

ربما يكون بعض هذا الكلام مثيرا للاستغراب, لذلك سأجعل باقي المقال في صورة اسألة و اجوبة:
هل تعتقد ان تعليم بعض اﻷطفال البرمجة سيغير المجتمع حقا؟

عالِم واحد قد يقدم للأمة اكثر مما يقدمة مائة شخص عادي. انت ﻻ تدري مَن مِن هؤلاء الأطفال يمكن ان يكون مثل جون مكارثي او بيل جيتس او ستيف جوبز. بالمناسبة فأن مؤسسي مايكروسوفت و أبل هؤﻻء كانوا معروفين بشغفهم بالكمبيوتر وهم طلبة مدارس

الكبار يتعلمون البرمجة بمشقة, لماذا تصر علي تعليم اﻷطفال؟ لن يقدروا علي هذا!

كما قلت فإن الكثير من الباحثين و اولياء الأمور بالدول الأخري يشجعون اﻷطفال علي كتابة البرامج.و هناك مبرمجين عالميين يتطوعون بتعليم بعض اﻷطفال في اﻷماكن التي يسكنوا فيها. ابحث علي Google عن Teaching Children Programming و انظر بنفسك.اذن لا جدل في قدرة اﻷطفال على التعلم لأن التجربة العملية اثبتت هذه القدرة.

أيضا حين يتعلم الطفل البرمجة فإنه يفعل ذلك لأنه يستمتع بها. حين يتعلم الكبير البرمجة فقد يكون مستمتعا بها او قد يفعل ذلك طلبا لشهادة او وظيفة. ﻻ تقارن بين من يقوم بنشاط ما حبا و بين من يقوم به خوفا او طمعا. الطريقة اﻷولي هي الطريقة المثلي.

لماذا البرمجة بالذات؟ هناك العشرات من العلوم اﻷخري المفيدة

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


- تعلم البرمجة اسهل نوعا ما من غيرها, فأنت لا تحتاج سوي جهاز كمبيوتر و بعض الوقت

- البرمجة تعطي نتائج فورية, ﻷن الطفل سيتشجع حين يكتب برنامجا و يري نتيجته امامه بينما لن يقدر , مثلا, ان يخترع طائرة فورا اذا تعلم كيف تعمل الطائرات.


- البرمجة تعلم التفكير المنطقي المنظم, و هذا يفيد الطفل حتي اذا تخصص في اي مجال آخر حين يكبر

انا مقتنع بكلامك! هل ترشح لغة معينة اعلم اخوتي او اقربائي اياها؟ وهل هناك مادة علمية جاهزة استخدمها؟


حاليا اجرب استخدام ال LOGO في التعليم. و لا التزم بمنهج معين و لكني استخدم الكورسات الموجودة علي الأنترنت كمصدر للمعلومات و الأفكار.

هذه بعض الموارد التي يمكن استخدامها مع لغات مختلفة. ان فكرت في تحضير مادتك العلمية الخاصة او تعريب احد الموارد المذكورة فأرجو ان تعلمني بهذا في التعليقات او بالبريد الألكتروني فربما يمكننا التعاون على ذلك.هناك ايضا مشروع اسمه g4c لتسهيل برمجة الألعاب باستخدام ال ++C و لكنني لم اضعه بعد علي الأنترنت ﻷنه مازال قيد اﻷختبار. ابعث لي برسالة اليكترونية ان اردت نسخة اولية منه لتجربها. و إن شاء الله سأواصل وضع المزيد من الموارد على هذه المدونة.

LOGO
Download FMSLogo (one of many Logo implementations)
Some lessons
Course outlines

Python
Game programming course for children in python.

Freebasic
A language like Qbasic but for Windows. Home page

MIT Scratch
Completely visual programming environment for education. Home page