مراجعة كتاب Programming: Principles and Practice Using C++, Second Edition

قررت في إجازة هذا الأسبوع أن أقوم بمراجعة و تحديث معلوماتي عن لغة البرمجة C++، كنت مهتم بالأخص أن أتعرف على الميزات الجديدة التي تمت إضافتها إلي اللغة في إصدار C++11 و إصدار C++14. قرأت في كثير من المقالات أن هذه التحديثات جعلت لغة C++ تعود إلى شبابها مرة أخرى و تصبح لغة ذات طابع عصري وبخصائص فيها شبه من Python .. على الأقل هذا هو الإنطباع الذي أخذته من تصفحي لبعض المقالات على الإنترنت.

51j679vpDGL._SX406_BO1,204,203,200_وقع اختياري على كتاب: Programming: Principles and Practice Using C++ الذي قام بتأليفه صانع اللغة Bjarne Stroustrup، وأنهيت تقريباً 16 فصل من فصول الكتاب. سبب اختياري للكتاب هو الترشيحات الكثيرة له في الإنترنت، وبسبب أن الكاتب هو صانع اللغة، و كذلك انه أحد الكتب القليلة المتوفرة التي تغطي النسختين C++11 و C++14.
وجدت الكتاب مناسب للمبتدئين في البرمجة و طلاب علوم الحاسب و يغطي الكثير من المواضيع من بداية البرمجة حتى مواضيع متقدمة مثل البرمجة بالكائنات و غيرها. محترفي البرمجة قد يجدون الكتاب ممل بعض الشيء بسبب كثرة الإسهاب في مواضيع بسيطة. الكاتب ركز على شرح المفاهيم البرمجية، و ركز على مسألة أن لغة البرمجة مجرد أداة و ان الأهم هو تعلم المفاهيم البرمجية. شخصيا، وجدت بعض فصول الكتاب مملة و طويلة أكثر من اللازم، وكان من الممكن إختصارها، لكن بما أن الكتاب موجه للمبتدئين فقد تكون كمية الشرح لبعض هذه المفاهيم مناسبة للشريحة المستهدفة.

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

بالنسبة للمحترفين الذين يبحثون عن كتاب مختصر، أنصح بكتاب: Tour of C++ لنفس الكاتب. الكتاب مختصر جدا و يقدم لك رحلة سريعة إلى عالم C++، لكن للأسف النسخة المتوفرة أثناء كتابة هذا الموضوع تغطي C++11 فقط.

خاطرة حول مشاريع التخرج لطلاب علوم الحاسب

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

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

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

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

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

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

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

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

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

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

أفكار عملية لمادة “مشروع التخرج”

  • إختر الفريق الذي ستعمل معه بعناية، أصدقائك المقربين منك جداً قد لا يكونون أفضل من تعمل معهم!
  • عند إختيار قائد الفريق حاول مع بقية أصدقائك الإتفاق على أقدركم على “القيادة”، هذا لايعني بالضرورة أنه أكثركم علماً أو أكثركم إطلاعاً، بل هو الأقدر على قيادة المشروع من بدايته حتى تسليمه بشكل كامل.
  • ليس من الواجب أن يعمل كل أعضاء الفريق في برمجة المشروع، هذا إعتقاد خاطئ، يجب أن يكون الجميع ملمين بجوانب المشروع، لكن يفترض أن يتم توزيع المهام في الفريق بناءً على القدرات، فالشخص الذي يمتلك مهارات عرض متميزة يجب أن يكون هو من يتقدم عند عرض المشروع، و الشخص الذي لديه قدرة جيدة على الكتابة يجب أن يكون مسؤول عن توثيق المشروع و كتابة التقرير.
  • من الجيد أن يتواصل الفريق بشكل مستمر مع مشرف المادة في كل خطوة من خطوات المشروع و إبقاءه على إطلاع بحالة المشروع، و لعلها فكرة حسنة أن يتم تقديم تقرير مرئي أو مكتوب كل أسبوع او أسبوعين يستعرض فيه ما تم إنجازه و ما سيتم عمله.
  • حاول قدر الإمكان إيصال فكرة المشروع بشكل واضح للمشرف، و حدد معه الإطار العام للمشروع Scope، بحيث تضمن أن ملاحظاته و إضافاته فيما بعد لاتخرج عن هذا الإطار.
  • إدار المشاريع مهاراة يمكنك تعلمها، الكثير من الكتب نشرت في هذا الموضوع، إختر مايناسبك و توكل على الله :).
  • مادة “مشروع التخرج” هي نافذة يمكنك من خلالها رؤية كيف تكون المشاريع في الواقع، ستواجهون كثير من المشاكل .. تماماً مثلما سيحدث عندما تعملون في مشروع حقيقي خارج الجامعة.
  • البرنامج الذي ستقوم بتطويره مهم جداً للحصول على درجة عالية في هذه المادة، لكن ليكن واضحاً لك و لبقية أعضاء الفريق أن التقرير الذي ستكتبونه و العرض المرئي الذي ستقدمونه سيكون له نسبة كبيرة جداً من درجتكم النهائية في المادة. قد يكون مشروعكم عظيم جداً، لكن إن قدمتوه بطريقة سيئة فتوقعو درجة سيئة كذلك.

طريقة آلية متميزة لإكتشاف مشاكل قابلية الإستخدام (Usability)

قرأت قبل ثلاث سنوات تقريباً بحث علمي نشره مجموعة من الباحثين من جامعة ستانفورد و شركة قوقل يتعلق بموضوع قابلية الإستخدام، حاز البحث وقتها على جائزة أفضل بحث علمي في واحده من أرقى المؤتمرات العلمية في مجال Human-Computer Interaction بل وفي مجال علوم الحاسب بشكل عام، شدني البحث لدرجة أنني لازلت أستشهد به و لازال عالق برأسي حتى الآن.

قابلية الإستخدام
“قابلية الإستخدام” هو مجال يجمع بين العلم و الفن، يقوم فيه المتخصصون بإختبار و تقييم تصاميم المواقع و واجهات البرامج لإكتشاف المشاكل التي يمكن أن يواجهها المستخدمين، الممارسين الحقيقين و أصحاب الخبرة في مجال قابلية الإستخدام يستخدمون عادة طرق منهجية منظمة لإجراء إختبارات قابلية الإستخدام ثبت بالتجارب العلمية أنها تؤدي إلى نتائج جيدة، لكن توجد أيضاً إختبارات بسيطة يمكن لغير المتخصص إتباعها للحصول على نتائج مرضية، الكاتب المبدع Steve Krug المتخصص في هذا المجال ألف كتابين الأول بعنوان Don’t Make Me Think و الآخر جديد نسبياً بعنوان Rocket Surgery Made Easy يشرحان و يقدمان بطريقة ميسرة خطوات يمكن إتباعها لإجراء إختبارات قابلية الإستخدام، و الأخ مشهور الدبيان يقدم محتوى عربي متميز عن هذا الموضوع في مدونة قابلية الإستخدام.

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

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

الأدوات المستخدمة لتحليل بيانات مستخدمي تويتر

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

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

إستخدمت لغة البرمجة Python مع مكتبة Tweepy للتواصل مع خدمة تويتر. بعد جلب بيانات المستخدمين و تحميلها على Redis قمت بالمرور على كل حساب و استخرجت الكلمات الموجودة فيه. كل كلمة تمر على عدة فلاتر لتقليل الإختلافات الإملائية قدر الإمكان (مثلاً حرف التاء المربوطة يتم استبداله بهاء ليتم التعامل مع الكلمتان “طالبة” و “طالبه” على انهما نفس الكلمة), أخيراً كل كلمة تعطى معرف (ID) خاص بها، استخدمت خوازمية SHA-1 لهذا الغرض، هذا المعرف يسهل عملية جمع المكرر بحيث أي كلمتين لهما نفس المعرف تعتبران كلمة واحدة. أخيراً، حسبت النتائج ثم حفظتها في ملف خارجي وعرضتها لكم كما رأيتم في التدوينة السابقة.

نظام Redis مرن جداً و سهل الإستخدام، كانت من حسناته أنه سرّع عملية تحليل البيانات بشكل ملحوظ. أرشحه لكل شخص يحتاج للتعامل مع بيانات كبيرة ليس لها هيكل محدد (ليست جداول و أعمدة مثل أنظمة قواعد البيانات التقليدية) و يحتاج لوصول سريع لهذه البيانات.

الكلمات الأكثر تكراراً في وصف (Bio) عينة من مستخدمي تويتر

قمت بإجراء تحليل سريع لعينة من حسابات أكثر من 110 آلاف مشترك في تويتر، معظم العينة كانت من السعوديين، هدف التحليل هو استخراج الكلمات الأكثر تكراراً في وصف هذه الحسابات (Bio – وهو نص بطول لايزيد عن 160 حرف يتحدث فيه الشخص عن نفسه)، الصورة التالية تظهر الثلاثين كلمة الأكثر تكراراً :

الكلمات الأكثر تكرارا في حسابات تويتر

الكثير من الكلمات الأخرى المهمة و التي قد تساعد على فهم طبيعة شريحة مستخدمي تويتر السعوديين لم تذكر في الرسم البياني أعلاه لضيق المساحة، الكلمات التي ترددت على الأقل عشرة مرات (تقريباً 7 آلاف كلمة) يمكن مشاهدتها في هذا الملف، و يمكن كذلك تنزيل ملف مضغوط يحتوي كل الكلمات (تقريباً 76 الف كلمة) مع عدد مرات تكرارها، الملف محفوظ بترميز UTF-8 و الحقول متباعدة باستخدام Tab.

هذا التحليل بسيط جداً، يمكن تحسينه بجمع الكلمات المتشابهه (مثل “هلال” و “هلالي”) و غيرها للحصول على أرقام أكثر دقة. أخيراً، يمكنك استخدام البيانات كيفما تشاء تحت ترخيص Creative Commons Attribution 3.0 Unported License.

مقدمة مبسطة لأساس خوارزمية MapReduce

Can Your Programming Language Do This?

خوارزمية تسمى MapReduce تعتبر أحد الأساسات التي يرتكز عليها محرك البحث Google والتي سمحت له أن يقوم بفهرسة و معالجة عدد مهول من صفحات الإنترنت يقدر بأكثر من 50 بليون صفحة، هذه الخوارزمية (هي أسلوب برمجي Programming Paradigm أكثر من كونها خوارزمية) تسمح للمبرمج أن يصمم برنامجه بحيث يمكن أن يتم تقسيم العمل على عدد كبير من أجهزة الكمبيوتر تعمل كلها معاً لإنهاء العمل بشكل متوازي Parallel Computing. هذه الخوارزمية تعتبر من أهم الخوارزميات الموجودة حالياً و تستخدم في كثير من التطبيقات الكبيرة. في هذه المقالة يشرح الكاتب  بأسلوب مبسط و بعدة أمثلة متتالية الفكرة الأساسية خلف MapReduce، قد تحتاج لمراجع أخرى حتى تستوعب فكرة الخوارزمية بشكل كامل.

إستدراك: أشار الأخ “نواف البديع” في تويتر إلى أن مسمى “خوارزمية” لاينطبق على MapReduce، وهذا القول هو الصواب وقد أشرت لذلك في منتصف المقال، لكني استخدمت كلمة خوارزمية تجاوزاً و لعدم امتلاكي لترجمة جيدة لكلمة Paradigm، كل الشكر للأخ نواف على تعليقه.

كيف تبني نظام توصية (Recommender System)

Data Mining: Finding Similar Items and Users

عندما تتصفح أحد الكتب في موقع أمازون ستجد الموقع يقدم لك توصيات لكتب أخرى قام بشرائها مستخدمين آخرين للموقع، هذه التوصيات غالباً ماتكون قريبةَ جداً من نوعية الكتب (أو السلع) التي تفضلها أنت لأنها عُرِضت عليك بناءً على تحليل البيانات المتعلقة بالسلع التي تفضلها و تفضيلات المستخدمين الآخرين، هذا النوع من تحليل البيانات يتم عبر أنظمة تسمى أنظمة التوصية Recommender Systems (كذلك يسمى Collaborative Filtering في بعض الأحيان). يقدم كاتب هذه المقالة شرحاً مختصراً عن هذه الأنظمة و يعرض مثالاً حياً (مع كود برمجي بلغة Ruby) لعدد من المقاييس (الرياضية) المستخدمة في بناء أنظمة من هذا النوع.

سلسلة تعلم البرمجة بالطريقة الصعبة

LearnCodeTheHardWay.org

يقدم كاتب هذه السلسة مجموعة “تمارين” لتعليم البرمجة تبدأ بمستوى بسيط جداً ثم تزداد صعوبتها تدريجياً. السلسلة حتى الآن تحتوي على كتاب لتعليم Python، و آخر لتعليم Ruby، وتوجد ثلاثة كتب أخرى لاتزال غير مكتملة: كتاب عن لغة C، و آخر عن SQL و ثالث Regular Expressions. يمكن تصفح الكتب مجاناً عبر الإنترنت أو شراء نسخة مطبوعة  من خلال موقع الكاتب.