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

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

ما الفائدة من هذه العمليّات المطوّلة من الكتابات والتفكير والرسومات البياناتية والمخططات .. الخ الخ طالما البرنامج لايحتاج الا لكتابة شفرته وتصميمه ؟

لما لا نبداء البرمجة بشكل جدي ؟ وذلك أفضل واختصاراً للوقت، وتوفيراً للجهد من كتابة المتطلبات، والتسنيدات، والرسوم البياناتية والعمليات التي ليست لها نهاية !

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

بختصار شديد: هي اختصار الوقت، تنفيذ أسرع، تطوير أكثر فاعلية و (جودة أعلى)، (تقضي على الملل من العمل). وفوائد كثيرة.

هذا التطبيق قد أنهيته مسبقاً ولكن سأعيد بناءه معكم! بمساعدتكم يا اصدقائي بمسار مختلف قليلاً.

من يستطيع المشاركة ؟ وكيف تكون المشاركة ؟

  • مهندس البرمجيات: سيساعدنا كثيراً وسوف يفهم كل ما يذكر. ويستفيد من التجربة.

  • المبرمج: سيساعدنا في كتابة الأكواد. وسوف يستفيد في تطوير مهاراته البرمجية، ومعرفة أهمية الهندسة البرمجية سواء كان مبتدئ أم خبير.

  • الراغب بالتعلم: سيستفيد بالطبع، ويساعدنا لتعليمه (بطرح الأسئلة) ونجيبه عليها (وهذه طريقة من طرق من اثراء المحتوى). ويساعدنا بالمقترحات ايضاً.

فوائد عامة:

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

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

أخترت لغة برمجة PHP حيث أنها سهلة التعلم! وأكثر لغة ويب مشروحة على الويب، ولغة ناضجة، بها كثير من الدوال الجاهزة والمفيدة (لن نحتاج الى مكتبات خارجية) وأكثرنا يعرفها (حتى من لايعرفها ببساطة يمكنه تعلمها). كذلك MySQL لقواعد البيانات.

بسم الله الرحمن الرحيم نبداء،

المتطلبات ( Requirements ):

كلمة المشكلة في هندسة البرمجيات لاتعني المصيبة والعياذ بالله، بل تعني (الدافع لبناء البرمجية) لذلك نبداء بوصف المشكلة أو بيان المشكلة (Problem statement). كل مايكتب في المتطلبات بعد تنفيذها فعلياً. تعاد صياغتها مرة أخرى في كل أصدار جديد للمنتج.

المنتج:

مدونة. أصدار، 1.0.0

بيان المشكلة (Problem statement):

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

حالات الاستخدام (Use-cases):

حالات الاستخدام أو Use-case هي عملية توضيح المهتمين بالبرمجية وما عملهم. مثلاً في حالتنا هذه ليس لدينا الا مهتم واحد وهو الزائر. وسوف يكون هناك مهتمين أكثر في الاصدارات القادمة مثل (المدير - العضو المسجل - الزائر). ولكن في حالتنا هذه الزائر فقط وهو يستطيع عمل ٣ اشياء (اضافة مقالة، مشاهدة المقالات و التعليق عليها). وهذا رسم توضيحي يسمى USE CASE DIAGRAM أي الرسم البياني لحالات الاستخدام.

http://i.imgur.com/6ZmOjII.png

علاقات الجداول (ERD)

بالأنجليزية (ولست جيداً بالترجمة) يطلق على هذه العملية (Entity relationship diagram) او (Entity relationship model) ولها أنواع كثيرة وطرق مختلفة، وتفاصيل أكثر دقة ولكن نحن هنا سنستخدم طريقة واحدة واضحة. ونستفيد منها كا التالي، من خلال بيان المشكلة و حالات الاستخدام نعرف ما المعلومات التي نريد أن نخزنها في هذا البرنامج والحد الأعلى (او العدد الفعلي) لخانات المدخلات. ونصنفها كجداول كا التالي:

(جدول المقالات): يحتوي على رقم المقالة، عنوان المقالة، أسم الكاتب و محتوى المقالة.

(جدول التعليق): يحتوي على رقم التعليق، رقم مقالة التعليق، اسم صاحب التعليق ومحتوى التعليق.

قد نضيف لاحقاً تاريخ التعليق وأمور اخرى في الاصدار القادم.

الرسم البياني:

http://i.imgur.com/6yX3uXK.png

ملاحظة: لو تلاحظ هنا علاقة بين جدول comments وجدول articles، كما أن article_id (رقم المقالة) مكرر بالجدولين ماذا يسمى هذا المفتاح؟ وكيف ومافائدة تكراره؟ وكيف تستطيع عمل هذه العلاقة في MySQL ؟

التصميم:

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

التصنيفات:

إذا كنت مبرمج لابك أنك قد سمعت بما يسمى بالبرمجة الكائنية (Object oriented programming) وتختصر OOP وقد يعتقد البعض أنها المرحلة النهائية لاحتراف البرمجة وهذا اعتقاد خاطئ. هي طريقة أخترعت لتسهّل عملية البرمجة وتجعلها أقرب للمنطق البشري. وفي بعض المناهج الدراسية! هي أول مايتعلمه المبرمج. لذلك وجد مايسمى بـ Class diagram. فأغلب البرامج الحديثة تستخدم اسلوب البرمجة الكائنية حتى تسهل عملية الأنتاج، التطوير وحل المشاكل مستقبلاً.

هذا هو الرسم البياني للتصنيفات.

http://i.imgur.com/4RxTD5A.png

ملاحظة: هناك علاقة بين الصنفين (2 classes) ماذا تسمى هذه العلاقة ؟ "ليست وراثة"

خريطة الموقع:

ببساطة الصفحات! تستطيع تخمين ومعرفة الباقي من خلال رؤية هذا الرسم البياني.

http://i.imgur.com/3EyOvNz.png

كم صفحة ستكون بالموقع؟ وما هي تلك الصفحات.

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

https://drive.google.com/fi...

طريقة التركيب:

  • افتح الضغط عن مجلد activity وضعه في المكان المخصص في السيرفر الشخصي. (إذا كنت تستخدم wamp ضعه في مجلد www الموجود مسبقاً مع مجلدات السيرفر الشخصي) (وإذا كنت تستخدم xampp ضعه في مجلد htdocs الموجود مسبقاً مع مجلدات السيرفر الشخصي). اذا كنت لا تعرف ماهو السيرفر الشخصي قم بالبحث وتحميل wamp او xampp واحد من الاثنين يكفي.

  • قم بطلب هذا الرابط (بعد تشغيل السيرفر الشخصي):

http://127.0.0.1/phpmyadmin

وقم بانشاء قاعدة بيانات بإسم activity وضع فيها الجداول كما هو موضح في نقطة علاقات الجداول ERD. وإذا احببت الاختصار (متأكد أنك تحب ذلك :-)) اضغط على اسم قاعدة البيانات ومن ثم (استيراد) أو import وارفع هذا الملف:

https://drive.google.com/fi...

الجائزة هي (أشتراك لمدة شهر في Lynda أو Treehouse) حسب الفائز.

للحصول على الجائزة عليك أن تراقب العلاقات في التصنيفات. هل هناك طريقة أخرى افضل؟ مثلاً وراثة ؟ وإذا كانت كذلك أخبرني بها وبتفاصيلها. وأفضل لو رسمت الـ Class diagram. لاداعي للتعديل على الشفرة البرمجية.

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