المعلوماتية > برمجيات
علوم الحاسب في مقابل هندسة البرمجيات
ما المقصود بهندسة البرمجيات؟ يعجز الكثيرُ من خريجي الجامعات ممن درسوا علوم الحاسب، عن التفريق بين علوم الحاسب وهندسة البرمجيات. علوم الحاسب بالإنجليزية هي: (Computer Science) أما هندسة البرمجيات فهي: (Software Engineering).
يشترك علم الحاسب مع هندسة البرمجيات في المهارات البرمجية، لهذا قبل الخوض في هندسة البرمجيات دعونا نتعرف أولاً على مصطلح البرمجة أو ما يعرف بتطوير البرمجيات (Software Development)، يصف أحد الطلاب مراحلَ تطوير البرمجيات كالآتي:
"أثناء تصميم البرنامج، أكون مصمماً. أثناء تصميم الواجهة، أكون فناناً. أثناء مراحل كتابة كود البرنامج، أكون حِرَفِيّاً. وأثناء مرحلة التصحيح، أكون فظاً عديمَ المشاعر!"
لا يزالُ الجدلُ قائماً حولَ ما إذا كان تطوير البرمجيات علماً أم فنّاً، قبل ثلاثين سنة كَتَب العالم دونالد نوث (Donald Knuth) سلسلةً من سبعةِ مجلدات حملت عُنوان: "فنُّ البرمجة بالحاسوب" (The Art of Computer Programming)، حيث تراوح عددُ صفحات أول ثلاثة مجلداتٍ حَوالي 2،200 صفحة، ما يجعلُ العدد الإجمالي لكامل صفحات السلسلة ما يقارب الـ 5،000.
إذا كان هذا العدد موجّهاً للبرمجة فقط، فكم تتوقع سيلزمُ من الصفحات للحديث عن علوم الحاسب؟
•هل البرمجة علمٌ أم فن؟
يُشير المؤيدون لمنظور البرمجة كـ "فن" إلى الجانب الجمالي لتطويرالبرمجيات، ويَرون أن العلوم لا تمتلك السلاسة والحرية الإبداعية التي يتمتع بها الفن.
في المقابل، يحتج الداعمون لمنظورالبرمجة كـ "علم" بأنّ عدمَ اعتماد المنهج العلمي أثناء البرمجة يزيدُ من احتمالية وقوع الأخطاء، ما يقلّلُ الثقة في البرنامج.
في الحقيقة، كلا النظريتين ناقصتان، وتطرحان الأسئلة الخاطئة؛ البرمجة (أو تطوير البرمجيات) هي علمٌ وفنٌ في آنٍ واحد. البرمجةُ بحدِّ ذاتها تُمارس من قِبَل الهُواة والمحترفين على حدٍّ سواء لذلك فالسؤال الذي يجب أن يُطرح هو: "كيف تكون البرمجة المحترفة؟"
يكمن الجواب في "هندسة البرمجيات" (Software Engineering)؛ هندسة البرمجيات هي طريقة المحترفين في عملية تطوير البرامج.
يستعمِلُ البعض وصفَ "البرمجة" بدلَ "هندسة البرمجيات" كنوعٍ من التبسيط، في اعتقادٍ منهم أنّ هندسة البرمجيات ما هي إلا أسلوبٌ مرتبٌ ومنظّمٌ لكتابة الأسطر البرمجية، ولكنّ هذا خطأ؛ فتطوير التطبيقات البرمجية لم يعد مقتصراً على معرفة علوم الحاسب فقط، ولهذا وُجِدت هندسة البرمجيات، لإضافة معلوماتٍ أُخرى خارج نطاق علوم الحاسب.
ولكن ما هي الهندسة تحديداً؟
بحسب تعريف القاموس: الهندسةُ هي تطبيقُ قواعدَ رياضيةٍ وعلميةٍ للوصول إلى نتائجَ عملية، وفي مجال تطوير البرمجيات، يعني هذا تطبيقَ خوارزمياتٍ مبنيةٍ علمياً وعلى أساسٍ رياضيٍّ لتصميمِ برامجَ وخدماتِ ويب وغيرها..
هندسةٌ أم علم؟
نأتي أخيراً إلى سؤالنا المهم وهو، ما علاقة علوم الحاسب بهندسة البرمجيات؟
التباين بين العلوم والهندسة هو نفسُه مهما اختلفت المجالات، دعونا نتعرف أولاً على الفرق بين الهندسة والعلوم بشكلٍ عام؛ في ميدان العلوم، يبحثُ العالِمُ عن الحقيقة عن طريق تجربة الفرضيات والخروج باستنتاجاتٍ تُساهم في توسيع المعرفة العلمية. أما في ميدان الهندسة، فيكون هدفُ المهندس البحثَ عمّا هو مفيد، وعن كيفية تطبيق المعارف المكتسبة لحل مشكلاتٍ من الواقع. على العلماء أن يكونوا على اطّلاعٍ بآخر الأبحاث في مجالهم العلمي، في حين أنه على المهندسين أن يكونوا على درايةٍ بالمعارف الموثوقة التي أثبتت فاعليتها.
باستطاعة الأشخاص الذين اختاروا الاختصاصات العلمية أن يتخصصوا أكثرَ في مجالهم، بينما يُطلَب من المهندسين معرفةً موسعةً بكلِّ ما يتعلّقُ بالعوامل التي ستؤثر على المنتج النهائي.
لا يحتاج العلماء لقوانينَ تُنظِّم عملهم لأنهم يتعاملون مع بعضهم فقط، في حين يحتاج المهندسون لمثل هذه القوانين كونَهم يتعاملون مع أشخاصٍ عاديين.
يُعِدُّ اختصاصُ الهندسةِ الطالبَ للحياة العمليّة، بينما يفتحُ الاختصاصُ العلمي الطريقَ أمام الطالب للاستمرار في المجال البحثي الأكاديمي ولا يعطي الشيء الكثير لبدء حياة عمليّة.
العواقب التي يدفع الطالب ثمنها نتيجة الخلط بين المجالين:
تمنحُ معظم الجامعات طلابها درجاتٍ في علوم الحاسب وتتوقع منهم الحصول على وظائف في تطوير البرمجيات، يقومون فيها بحلّ معضلات من الواقع؛ في حين أن نسبةً قليلةً من الطلاب يتوجهون نحو الدراسات العليا والمجال البحثي. مما يضع الطلابَ أمامَ واقعٍ تكنولوجي متضارب؛ فبينما هم يمتلكون درجاتٍ علمية فهم يقومون بوظائفَ تكون مقتصرةً على المهندسين، وهذا دون الحصول على تدريب مسبق. الأمر كما لو أنّك تطلب من طالب دكتوراة في الفيزياء بناءَ محرّكٍ كهربائي للاستهلاك العام؛ قد يفهمُ عالم الفيزياء قوانينَ الكهرباء أكثرَ من المهندس، ولكنّه ليس مدرباً على بناء منتجاتٍ لحلّ مشكلاتٍ من الواقع، حيث تقتصر خبرته على بناء نماذجَ مخبريّةٍ لا أكثر (prototypes)، ربما سيعملُ المُنتج، ولكنّه لن يكون متيناً بما فيه الكفاية للعمل خارج المختبر.
تحدثُ حالاتٌ مُشابهة في مجال تطوير البرمجيات، حيث يطور خريجو علوم الحاسب برامجَ ذات بنيةٍ ضعيفةٍ وغيرِ آمنة، فيركّزون على أمورٍ ثانوية مُهملينَ أموراً أكثرَ أهمية في بناء المنتج، فقد يقضي خريجُ علوم الحاسب مدة أسبوعين في صقل وتعديل خوارزمية، بدلاً من قضاء نفس المدة في تعلّم استخدامِ مكتبةٍ برمجيةٍ جديدة. باختصار، يحتاج طالب علوم الحاسب لسنواتٍ إضافية للتدريب على المجال العمليّ لاكتساب الخبرة الضرورية. وليس هذا هو السبب الوحيد، فتطور سوق العمل أصبح يتسارع بوتيرةٍ أكبر من المنظومة الأكاديمية.
خلاصة: هندسة البرمجيات ليست علوم حاسب:
في خضمّ واقعنا المتسارع تكنولوجياً، تتزايد حاجتنا لبرامج عالية الكفاءة، ومع أهمية هذه البرامج في حياتنا، وآخر المُستجدات العلمية المتعلقة بطرق تطويرها، تظهر الحاجة لمختصين ليس في تطوير وإنتاج هذه البرامج فحسب، بل في تصميمها وبناءها واختبارها وصيانتها أيضاً. لهذا يمكننا القول أن هندسة البرمجيات لم تعد جزءاً من علوم الحاسب.
---------------------------------------------------------------
المصادر:
[1] Professional Software Development: Shorter Schedules، Higher Quality Products، More Successful Projects، Enhanced Careers. - Steve McConnell.
[2] Software Engineering Programmes are Not Computer Science Programmes - David Lorge Parnas.