:: كل المقالات ::

Tue, 13 Dec 2016

عن تخصص علوم الحاسب و البرمجة


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

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

الخيار الثاني برمجة البرنامج بلغة مفسرة و سيكون خيارا موفقا من ناحية الإنتاجية و لكنه لا يحل مشكلة التوافقية بين الانظمة لان التحزيم يختلف من نظام الى آخر و المشكلة الاكبر ان بعض نظم التشغيل لا يأتي معها المفسر افتراضيا و هذا يجعل من تحزيم البرامج حتى الصغيرة منها مشكلة لاننا سنحزم المفسر و المكتبات المرفقة و ينتج من ذلك كله ملف مضغوط كبير كان من المفترض الا يتعدى البايتات القليلة .
الخيار الاخير استهداف المنصات الافتراضية مثل جافا و دوت نيت و هي ربما افضل خيار لمن يطمح الى التعددية بأقل قدر من المشاكل و لكن هذا الخيار ايضا له عيوبه و اظهر العيوب كون المنصات مملوكة لشركات تجارية .
لو تجاوزنا هذه المسألة و قلنا اننا نستهدف نظام تشغيل معين واحد فقط (و هذه فكرة غير سديدة في اغلب الاحيان) فأيضا هناك اشياء مملة كثيرة يجب ان نهتم بها و سأتكلم عنها بشكل مفصل عندما اتكلم عن خطوات هندسة البرامج .. لكن قبل ذلك لنتكلم قليلا عن بعض التخصصات الاخرى :
الرسام عندما يرى منظرا جميلا و يريد ان يرسمه ، ماذا عليه ان يفعل ؟ ربما فقط عليه ان يحضر معداته من الوان و لوح و يشرع في الرسم خلال دقائق حيث يمضي بقية وقته في الابداع و الاستمتاع بعمله و عندما ينتهي ربما يعطيها النجار لعمل برواز و اضافة مادة حافظة على الالوان الزيتية و ينتهي الامر .
الشاعر عندما تخطر في باله افكار جميلة و يريد ان يصوغها في قصيدة ما عليه إلا ان يجلس بقلمه و قرطاسه و يدون ما يوحى له و في النهاية ربما يدققها لغويا او يعرضها على اهل الاختصاص للمراجعة ثم ينشرها .
بروفسور الرياضيات عندما يفكر بنظريته يستغرق في تفكيره و يداعب سبورته بالطباشير ثم يخلص إلى الحل و بعد ذلك يراجع الحل و اخيرا ينشره … إلى غير ذلك من الوظائف .
ما احاول قوله ان هذه التخصصات و اشباهها يكون تركيز المتخصص في صلب الموضوع الشيء الذي يستمتع به بدلا من قضاء اضعاف الوقت في اشياء جانبية رسمية مملة .. و الآن سأعرض عليكم طريقة إنشاء البرامج كما ينصح بها في هندسة البرمجيات – وإن كان ان بعض الخطوات اختياري فيمكن تجاهله اذا لم تكن تريد ذلك الا ان البعض الآخر منها ضروري و ضروري جدا:
الآن لنفترض ان لدي فكرة برنامج ما لنقل اي شيء بسيط مثلا برنامج قائمة الاعمال TODO List الاشياء الرئيسية هي ان يقوم البرنامج بعرض قائمة مواعيدي و اعمالي و يتيح إمكانية الإضافة وإمكانية الإزالة عندما ننتهي من الشيء .. بسيط ؟ لنرى هذه الخطوات المفترضة:
1- تحديد و كتابة هدف البرنامج مع شرح تفصيلي بمتطلبات التشغيل و الخصائص الوظيفية و الاختبارات المطلوبة لنجاح البرنامج.
2- عمل مخططات تصويرية باستخدام لغة النمذجة UML عن اجزاء النظام و طرق التفاعل بين عناصره ..الخ.
3- البدء بالبرمجة (صلب الموضوع و الشيء الممتع) و لكن صلب الموضوع في حقيقة الامر هو إنشاء ثلاث دوال واحدة للعرض و اخرى للحذف و اخرى للإضافة . و لكن في الحقيقة نحتاج الى برمجة واجهة رسومية و نحتاج إلى ذوق فني في ترتيب العناصر و طريقة ظهورها و علينا ان نكتب اكواد كثيرة فقط للتعامل مع الاستثناءات و الاخطاء التي ممكن ان تحدث من مثل إضافة قيم غير صحيحة ..الخ.
4- الآن نكتب الاختبارات المملة الكثيرة لكل دالة و نتأكد من ان البرنامج ينجح فيها كلها .
5- كتابة التوثيق للكود و التوثيق لاستخدام البرنامج (المانيول).
6- نبدأ مرحلة التحزيم بحسب النظام المستهدف .
7- هنا تبدأ مرحلة الصيانة و دعم البرنامج عند ظهور اي اخطاء يبلغ عنها المستخدمين و ربما إضافة المزيد من الخصائص للبرنامج و نعيد الخطوات السابقة .
لهذا يقولون ان البرمجة جزء بسيط من دورة حياة البرنامج و يقولون ان اغلب الوقت لا يصرف في البرمجة بل في الصيانة و المراجعة . هذا بالضبط ما اعنيه بالملل في البرمجة فكوني مبرمجا اريد ان اقضي وقتي في البرمجة بدلا من الالتهاء بكل هذه الاشياء ، نعم ربما يقال ان هذه الخطوات قد توزع في الشركات على عدة افراد عندها يمكن للمبرمج ان يتفرغ لما يحب و لكن هذا ليس صحيحا كليا فالمبرمج عليه ان يكتب الاختبارات الطويلة المملة و كما ذكرنا عليه على الاقل ان يكتب اكوادا كثيرة للتعامل مع الاخطاء و الاستثناءات ، اضف الى ذلك انه ليس كل المبرمجين يعملون لدى شركات او فرق عمل وإنما عمل فردي في احيان كثيرة ..
هذا و لم نتكلم عن برمجة الويب الاكثر مللا و فوضى ، فلكتابة نفس البرنامج السابق سنتبع كل الخطوات السالفة بالإضافة الى اشياء اخرى مثل : إعداد السيرفر و تحمل رسوم التشغيل، تشغيل البرنامج في بيئة آمنة ، استخدام إطار برمجة ويب ، التأكد من أمن البرنامج ، استخدام لغة قولبة ، استخدام قواعد البيانات ، إنشاء واجهة رسومية ربما تعتمد على جافا سكربت و html و css و حتى فوتوشوب، التأكد من ان الموقع يظهر بالشكل المطلوب على عدة متصفحات و كل متصفح له عدة إصدارات ..الخ
لكل هذه النقاط و غيرها يصبح من الصعب الاستمتاع بالبرمجة كما يستمتع الفنان بفنه و المفكر بفكره .

" سبحان ربك رب العزة عما يصفون و سلام على المرسلين و الحمد لله رب العالمين "