الأربعاء، يوليو 14، 2010

آفاق البرمجة


بسم الله و الحمد لله و الصلاة و السلام على رسول الله و بعد...
فمنذ أن بدأت العمل في البرمجة منذ بضع سنين, ما مر بي يوم إلا و يفتح علىّ فيه ربي من علوم البرمجة شيئا جديدا و هو الفتاح العليم.
و مرت بي الأيام على هذه الحال حتى ظننت أني على شيء, و ما كدّر علي هذا الظن إلا أمران:
  • الأول: أني ما قابلت مبرمجا هو أقل مني في الخبرة أو في الكفاءة إلا و تعلمت منه شيئا جديدا لم أكن أعرفه من قبل!
  • و الثاني: أني قلت لنفسي ذات يوم: هلم نرُوز (نختبر) ما لديّ من علم, بالإجابة على أسئلة المبرمجين, فيممت وجهي إلى موقع شهير هو "ستاك أوفر فلو stackoverflow " و اشتركت فيه بالفعل, و بدأت أتابع الأسئلة التي ترِد إلى الموقع و أجيب عما أعرفه منها. و ما هي إلا أيام قلائل حتى أدركت أن "فوق كل دي علم عليم" و صار لسان حالي كما قال الشافعي:
كلما أدبني الدهر أراني نقص عقلي .... وإذا ما ازددت علماً زادني علماً بجهلي
فلما هممت باستدراك ما فاتني من علوم البرمجة, كان لزاما علىّ أن أحدد أولا "آفاق" هذه العلوم, ثم أحدد ثانيا ما الذي ينقصني منها, ثم أبدأ في تعلمها تباعا... و الله المستعان.
أما الخطوة الأولى - و هي تحديد آفاق البرمجة - فهي ما أحببت أن أشارككم فيه في هذه المقالة...فهيّا....
1- لكي يتعلم المرء البرمجة, فأول ما يبدأ به هو تعلم لغة برمجة مثل السي C أو السي بلس بلس C++ أو السي شارب C# و الجافا Java...إلخ, فأي هذه اللغات تتعلم؟ أجبت عن هذا السؤال من قبل, فليراجَع.
2- أي لغة برمجة - فيما أعلم - يصحبها برمجيات معدة سلفا لكي يستخدمها المبرمج فتوفر عليه الكثير من الوقت, و هذه البرمجيات تسمى مكتبات libraries, أو هياكل Frameworks. و من أمثلة ذلك مكتبة السي القياسية C Standard Library و هيكل الدوت نت .NET Framework
3- يمكنك كتابة البرنامج بأدوات بسيطة مثل النوتباد Notepad ثم إتباع ذلك باستخدام أدوات أخرى تحوّل نصوص البرامج إلى برامج فعلية, لكن هناك برمجيات قوية تسهل عليك كثيرا مراحل إنتاج البرنامج بداية من كتابته و وصولا إلى برنامج التشغيل النهائي Executable. هذه البرمجيات تسمى بيئات التطوير المتكاملة Integrated Development Environments. و من أمثلتها الشهيرة فيجوال ستوديو Visual Studio و إكلبسEclipse.
4- أي برنامج ستعمله, سيكون فيه بيانات أو معلومات تحتاج إلى تصنيف يسهل استخدامها و معالجتها. أما كيفية التصنيف المثلى للبيانات و المعلومات, فهذه يهتم بها علم "هياكل البيانات Data structures". أما الشق الثاني - هو معالجة البيانات, فهذا ما يهتم به علم الخوارزمات Algorithms. هذا العلم يشرح لك أفضل الخطوات اللازمة لترتيب البياناتSorting , و كيفية البحث فيهاSearching, و كيفية ضغطهاCompression, و كيفية تشفيرهاEncryption...إلخ.و يضع لك معاييرالترجيح بين الطرق المختلفة لحل نفس المشكلة. لكن ما هي الخطوات اللازمة لمعالجة البيانات بطريقة أخرى غير التي ذكرِت؟ هذا ما يهتم به علم آخر هو "كيفية تصميم الخوارزمات Algorithms design
5- كل ما ذكر في النقطة السابقة عن تصنيف البيانات و معالجتها, إنما قصدت به عمل ذلك في ذاكرة الحاسب, يعني أثناء فترة عمل البرنامج. أما أن يكون لديك بيانات و معلومات كثيرة جدا و تحتاج أن تحتفظ بها في مكان ما و تسترجعها بعد ذلك كما تشاء, فيبدو أنك تتحدث عما يسمى "قواعد البيانات Databases", و أشهر الأساليب المتبعة نظم إدارة قواعد البيانات Database Management Systems أسلوب قواعد البيانات العلائقية Relational Databases, و هذه باختصار تقول لك ضع البيانات في جداول Tables و حدد العلاقات بين هذه الجداول Relations بما يسهل لك معالجتها و استرجاعها فيما بعد. هناك برامج إدارة قواعد بيانت كثيرة, أشهرها أكسس Access لقواعد البيانات الصغيرة, و مايسيكويل MySQL لقواعد البيانات المتوسطة, و سيكويل سيرفر SQL Server و أوراكل Oracle لقواعد البيانات الكبيرة. و لكي تتعامل مع قواعد البيانات ستحتاج إلى لغة خاصة تسمى إس كيو إل SQL, و كذلك ستحتاج إلى معرفة الأساليب العلمية لتصميم قواعد البيانات العلائقية Relational Database design principles.
6- أفضل ما توصل إليه المبرمجون في طرق البرمجة: البرمجة الكائنية المنحى Object Oriented Programming, و هذه باختصار طريقة تنظيمية تسهل إعادة استخدام البرمجيات التي أعددتها من قبل و تسهل المحافظة على تماسك البيانات إلى حد بعيد. و لكي ترى أمثلة فعلية لكيفية تطبيق هذه الطريقة, يمكنك الاستعانة بعلم نماذج التصميم Design patterns, و هذا يعطيك نماذج استرشادية تعينك في تصميم برامجك.
7- يرتبط بالنقطة السابقة علم التحليل و التصميم الكائني المنحى Object Oriented Analysis and Design, و هذا باختصار يسهل لك تحليل مدخلات البرنامج و وظائفه ثم تصميم البرنامج بطريقة تسهل برمجته بالأسلوب الكائني المنحى.
8- لأن الصورة قد تفيد أكثر من الكلام و الكتابة, فقد ابتكر المبرمجون أشكالا ثمثل أجزاء البرامج و تفاعلاتها مما يسهل فهم البرنامج من غير الولوج في تفاصيل نصوصه البرمجية source code, و هذه الأشكال لها ارتباط وثيق بالبرمجة الكائنية المنحى Object Oriented Programming. فجمعوا كل هذه الأشكال من بعضهم البعض و صاغوها في إطار واحد أسموه لغة التصميم الموحدة Unified Modeling Language (UML).
9- إنتاج البرامج يمر بمراحل متعددة بدءا من تحديد وظائف البرنامج requirements . و مرورا بتصميمه design و برمجته development و اختباره testing و في النهاية تشغيله deployment و صيانته maintenance (أعلم أني أغفلت بعض الأشياء هنا للاختصار) و كل مرحلة من هذه المراحل تعتبر فنا قائما بذاته و ألُفت فيها الكتب الكبار, و كلها تندرج تحت علم هندسة البرمجيات Software Engineering. لكن ما أحب أن أشير إليه هنا أن هناك طرقا متبعة في إدارة عملية إنتاج البرامج, أشهرها الطريقة التقليدية Waterfall model و هذه تقول لك لا تدخل في مرحلة قبل أن تنهي التي سبقتها, و الطرق المرنة Agile و هذه تقول لك امزج بين هذه المراحل بما يحقق لك المرونة الكافية لتدارك التغيرات التي تطرأ على وظائف البرنامج.
10- عندما يكون برنامجك صغيرا نسبيا أو يعمل مع عدة حاسبات قليلة متصلة ببعضها, فغالبا سيكفيك ما ذكرت لك آنفا, و في هذه الحالة أنت تطور برامج تسمى "برمجيات سطح المكتب Desktop applications. لأنها تعمل على الحاسبات الشخصية كبرامج قائمة بذاته. و أشهر لغات البرمجة المستخدمة في مثل هذه البرامج: السي شارب C# لبرامج الويندوز Windows. و الجافا Java للبرامج التي تعمل على عدة نظم تشغيل.و هذه النوعية من البرمجيات آخذة في التآكل, راجع ما كتبته من قبل عن اتجاهات البرمجة في للعام 2010.
11- عندما تحتاج إلى برنامج يعمل على حاسبات تبعد عن بعضها آلاف الأميال, و لا يربط بينها رابط, فحتما ستتوجه لطريقة أخرى في عمل البرنامج, هذه الطريقة هي برمجيات الويب Web applications و خدمات الويب Web services, و من الصيحات الآن أيضا ما يسمى بالحوسبة السحابية Cloud computing. و باختصار, عمل مثل هذه البرامج يحتاج إلى البرمجة على جهتين:
  • الجهة الأولى جهة المستخدم, يعني عمل برامج تعمل داخل متصفح الإنترنت Internet browser و هذه تسمى البرمجة جهة العميل Client side scripting. و من أشهر لغات البرمجة المستخدمة في هذه الجهة: إتش تي إم إل HTML, و السي إس إس CSS, و الجافا سكربت Javacript. (قد تجوزت شيئا ما في اعتبار كل هذه اللغات لغات برمجة, فليراجع لزاما ما كتبت من قبل عن لغات البرمجة المكتملة و معيار تورنغ).و هذه الجهة تعتبر واجهة استخدام للبرنامج الفعلى الذي يوجد في الجهة الثانية و التي تسمى بالبرمجة جهة الخادم Server side scripting . و من أشهر اللغات المستخدمة في هذه الجهة إيه إس بي دوت نت ASP.NET بفروعها المختلفة, و البي إتش بي PHP و الروبي مع الريلز Ruby On Rails. و يرتبط ببرمجة الويب تقنيات أخرى مثل الإكس إم إل XML و توابعها و هي مستخدمة في نقل البيانات بين البرنامج و المتصفح,. كذلك هناك تقنيات تيسر عمل برمجيات للويب لتبدو و كأنها برمجيات سطح المكتب التي ذكرتها في النقطة السابقة, و هذه تسمى برمجيات الإنترنت الغنية Rich Internet Applications(RIA) مثل تقنيات الأجاكس Ajax و الفلاش Flash و السيلفرلايت SilverLight
12- من فوائد برمجيات الويب أنها يمكن استخدامها على معدات غير الحاسبات الشخصية PC, و أعني تحديدا الهواتف الجوالة, و هذه الجوالات لها نوع آخر من البرمجة - و إن كانت تتبع نفس الأساليب التي ذكرتها آنفا- لكن يحسن بنا أن نعرج عليها بشيء من التفصيل لأهميتها في هذا العصر. أقول: أهم المتصارعين في حلبة برمجيات الجوالات: شركة أبل Apple و جوالها آي فون iPhone, و هذا يُبرمج عليه بلغة أوجكتف سي ObjectiveC,و شركة غوغل Google و نظامها أندرويد Android, و هذا يُبرمج عليه بالجافا Java. و شركة نوكيا Nokia و نظامها سيمبيان Symbian و هذا يُبرمج عليه بالسي بلس بلس C++. و شركة مايكروسوفت Microsoft و نظامها ويندوز موبايل Windows Mobile و هذا يبرمج عليه بلغات الدوت نت .NET,....إلخ.
13- المعدات التي تطالها البرمجة ربما تكون أصغر من الجوالات, مثل الشرائح الإلكترونية electronic chips الصغيرة جدا التي توجد في السيارات مثلا, و هذه عادة ما تُبرمج بالسي C. بل تطال البرمجة ما هو أصغر من ذلك,: الكروت الذكيةSmart cards مثل شرائح الجوال و بطاقات الائتمان ...إلخ و هذه عادة ما تبرمج بالجافا Java.

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