دروس اكاديمية

19/09/2013 15:41:55

هندسة البرمجيات

إن هندسة البرمجيات تجيب على العديد من الأسئلة التي تهم المبرمجين وأبرز هذه الأسئلة: كيف يمكن أن أقوم بتطوير منتج برمجي قابل للتطور مستقبلاً ؟

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

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

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

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

لنتخيل بأنك تملك محل للسندويش وتقوم بتقديم الفلافل والشاورما بشكل حصري وقمت بالإتفاق مع مبرمج ليقوم بتطوير برنامج ليعمل المحاسب عليه لتسهيل أمور الدفع والحسابات.

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

يقوم البائع بالضغط على صورة السندويشة التي تم شرائها ليتم إضافة فاتورة جديدة إلى قاعدة البيانات ويكون شكل البرنامج كالتالي:

ماذا لو أراد صاحب المطعم إدخال أصناف جديدة من السندويشات للمحل ؟

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

الأسوأ من هذا كله ماذا لو قام مبرمج آخر بإكمال العمل عن المبرمج الأول ؟

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

المشكلة الثانية التي تحاول هندسة البرمجيها حلها هي التقليل من كلف التعديلات

ففي المشاريع دائماً ماتكون كلفة التغيرات في مراحل تصنيع والتصميم الأولى أقل بكثير من المراحل المتقدمة.

مثال1 :

لنفرض بأنك تريد تصنيع سيارة وقام رجل فاحش الثراء بالتعاقد معك لتصنيع سيارة من نوع خاص تحديداً لتلبي متطلبه (سيارة طولها 4 أمتار مع طابقين).

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

بينما لو قام المهندس بعرض المخططات على الزبون فوراً بعد تصميم المخططات ولم يعجب الزبون بشكل السيارة سيخسر المهندس كلفة الورق فقط (كلفة التغير في المتغيرات قليلة جداً).

مثال 2 :

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

يوضح المخطط البياني التالي كلفة التغيرات في مشروع برمجي.

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

المهارات المطلوبة لتصبح مهندس برمجيات :

- البرمجة :

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

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

كما يجب أن يعرف مهندس البرمجيات على منهجيات البرمجة والتصميم Design patterns.

- القدرة على التعلم المستمر:

من المهم أن يعرف كل مهندس برمجيات بأن مقدار نضج هذه الهندسة لايقارن مع بقية الهندسات العتيقة كالهندسة المعمارية مثلاً.

لهذا السبب نجد العديد من التقنيات والمناهج الجديد تظهر بين الحين والآخر لحل المشاكل في هندسة البرمجيات عكس الهندسات العتيقة التي قلما نجد تغيرات جذرية في هذه العلوم.

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

- مهارات تحليلة

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

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

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

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

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

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

فعلى سبيل المثال، في تحليل الأنظمة، يلزم أن يصب محلل الأنظمة تركيزه على أربع مجموعات من المهارات التحليلية وهي: التفكير في الأنظمة والمعرفة التنظيمية وتحديد المشكلات وتحليل المشكلات وحلها.

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

إضافة لما سبق يجب أن يمتلك مهندس البرمجيات بالفكر النقدي Critical thinking

- مهارات تواصل :

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

تكمن مهمة مهندس البرمجيات كما هي مهمة أي مدير مشروع بإيجاد وتحديد المهتمين بالمشروع Stack holders وإيجاد العلاقات مابينهم وتحديد مايهم كل شخص من المشروع بالإضافة للتواصل معهم جميعاً بين الحين والآخر خاصة أثناء التعامل مع المتطلبات الديناميكية المتغيرة عبر الزمن كما هو حال آلية تطوير Agile.

- إدارة الوقت والمال:

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

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

- مهارات قيادية :

التنسيق وتوزيع المهام بين أعضاء الفريق بشكل جيد هي أحد المهارات التي يجب أن يتقنها مهندس البرمجيات كما من المهم أن يعالج مشاكل الدمج مابين عمل جميع العاملين بالمشروع.

- الكتابة والتوثيق:

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

إن مهندس البرمجيات على تواصل مع الزبون بشكل دائم لذا من المهم أن يتقن مهندس البرمجيات مهارات الاقناع وتبسيط المعلومة بشكل جيد.

إن مهارات الإقناع يمكن اكتسابها من خلال التدريس فالمدرس هو شخص يريد إقناع طلابه بالمعلومات التي يعرفها.

- مهارات لغوية

قدرة في البحث واستعياب المعلومات التي يجلبها من الإنترنت.

مهام مهندس البرمجيات :

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

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

- تحصيل المعلومات :

مراقبة ومشاهدة جميع المهتمين بالمشروع Stack holders وتحديد المعلومات المطلوبة من كل شخص منهم وتحصيلها.

- تحليل وتطوير وإدارة المشاريع البرمجية.

- تحليل وتقييم حاجات المستخدم النهائي الذي سيعمل على البرنامج بحيث غالباً ماتختلف حاجات الزبون عن حاجات المستخدم النهائي للمشروع.

- كتابة التقارير الداعمة لتطوير المشروع وتقارير الإختبارات.

- اختيار وتحديد منصة العمل التي يجب العمل عليها مثل منصة .net أو جافا أو العمل على نظام تشغيل ويندوز أو أندرويد أو بيئة ويب...الخ.

- تحليل وتصميم واجهات المستخدم البيانية.

- تحليل وتصميم قواعد البيانات المطلوبة.