Archive for 12 فبراير, 2010

إنه لطريق طويل، ولكنك بدأته، وعليك أن تكمله، لا مجال للتراجع – الجزء الرابع – مدخل إلى الخوارزميات وبنى المعطيات

12/02/2010

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

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

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

أول كتاب أنصحك بقراءته إن كنت مبتدئ في مجال الخوارزميات هو Data Structures and Algorithms in Java، وهو – كما لابد أنك لاحظت – يعلمك الخوارزميات مترافقة مع بنى المعطيات، جمال الكتاب وبساطته في أنه يتلافى الدخول في تعقيدات تحليل الخوارزميات والغياهب الرياضية المرافقة لذلك، فيمكنك قراءة الكتاب لفهم مبادئ الخوارزميات وبنى المعطيات ثم تتعمق في دراسة تحليلها من الكتاب السابق. أنصحك بنفس هذا الكتاب إن كنت مبرمج #C، فرغم الاختلافات بين اللغتين إلا أن تشابه Syntax الكود سيجعل من السهل فهم الكتب لمبرمج #C، فلا يوجد أي كتاب خوارزميات بلغة #C يستحق القراءة، حتى لو وجدت أن دار النشر تتبع جامعة محترمة كجامعة كامبريدج، فستجد أن كتابهم #Data Structures and Algorithms Using C مليء بالأخطاء من كل الألوان، عار عليهم فعلاً!
كتاب بديل عن الكتاب السابق بلغة ++C بدلاً من لغة Java هو
++Data Structures and Algorithms in C، وهو يدرس في أغلب الجامعات في منطقتنا وكثير من جامعات العالم، الكتاب بسيط الفهم وقوي المعلومات وهو كتاب جيد للبدء في تعلم الخوارزميات مثله مثل كتاب جافا السابق.

بالإضافة إلى “معجم الخوارزميات”، أي كتاب Introduction to Algorithms، هناك العديد من المواقع التي تلعب دور “دليل” لسرد تفاصيل عن الخوارزميات وبنى المعطيات المختلفة، أذكر بعضها:

من المواضيع الهامة عند دراسة الخوارزميات هو فهم الطريقة المسماة Big O notation المستخدمة لتحليل تعقيد الخوارزميات مما يسمح بمقارنة سرعة تنفيذها في الحالات المختلفة، من أبسط ما وجدته عن شرح هذه الطريقة هو A Beginners’ Guide to Big O Notation الذي يشرح الأمر باستخدام كودات بسيطة جداً، و Plain English Explanation of Big O Notation وهو شرح يعتمد على اللغة المجردة السهلة في إيصال الفكرة.
طبعاً ستجد الكثير من الحديث عن الـO الكبيرة هذه في “معجم الخوارزميات” الضخم الذي ذكرناه مراراً اليوم، لذلك تأكد من فهم مبادئها قبل البدء بالخوض في الكتاب.

إنه لطريق طويل، ولكنك بدأته، وعليك أن تكمله – الجزء الثالث – مدخل إلى علوم الحاسوب

10/02/2010

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

معظم الجامعات تبدأ تعليم طلاب كلية علوم الحاسوب CS مبادئ البرمجة عن طريق لغات برمجة غير حقيقية لا تستعمل في البرمجة اليومية، معظم هذه اللغات مطورة أصلاً لتعليم الأطفال مبادئ البرمجة، أشهر هذه اللغات لغة تدعى Scratch مطورة في MIT وتستعمل كمقدمة للبرمجة في عدد من الجامعات المحترمة أمثال Harvard و MIT نفسها، وهي لا تعتمد على كتابة الأوامر، بل تعتمد على السحب والإفلات Drag-and-Drop.

تنتقل الجامعات بعد ذلك إلى إحدى لغات البرمجة الحقيقية، لغة Java أو C أو – مؤخراً – Python، باعتبارها لغات قوية ويمكن البدء باستعمالها بسرعة. لتعلم نفسك إحدى هذه اللغات لن تحتاج إلى الكثير، اختر أحد الكتب وستتعلم مبادئ اللغة بسهولة، سأذكر هنا الكتاب الأبرز والأسرع لتعلم مبادئ كل لغة من اللغات المستعملة في الجامعات :

  • Python: كتاب Python Programming for the Absolute Beginner هو الأشهر للبدأ بتعلم لغة Python، اللغة الفعالة القوية والسهلة بنفس الوقت، الكتاب لا يفترض أنك مبرمج سابق، فحتى لو كنت جديداً على البرمجة فيمكنك قراءة هذا الكتاب للبدء بتعلم البرمجة.
  • C: الكتاب العتيد والعتيق لتعلم لغة C هو C Programming Language، بالرغم من قدم الكتاب إلا أنه يبقى الكتاب المفضل لتعلم أساسيات لغة C بسرعة وسلاسة، كتاب رائع فعلاً.
  • Java: لم أقرأ الكتاب، ولكن كتاب Head First Java حظي بسمعة حسنة وشهرة كبيرة لتعليم لغة جافا للمبتدئين.
  • ++C: أغلب الجامعات تقوم بتعليم لغة C أو ربما Java قبل أن تنتقل إلى ++C. من كتب ++C الذائعة الصيت كتاب The C++ Programming Language، كون المؤلف هو مبتكر اللغة نفسه، Bjarne Stroustrup.

ننتقل الآن إلى القسم الرائع من التدوينة (كما آمل أن تجده).
محاضرات الكورس التعريفي Introductory-course بعلوم الحاسوب في جامعة هارفارد ويدعى Computer Science 50 ـ (CS50.NET) من إلقاء الأستاذ David J. Malan متاحة كمقاطع فيديو هي وجميع المواد المرافقة له للتحميل مجاناً، من موقع التحميل الخاص بالكورس CS50.TV.

كذلك الأمر بالنسبة لكورس جامعة MIT، حيث يحوي موقع MIT OpenCourseWare الخاص بالجامعة على الكثير جداً من المصادر التعليمية المجانية لمئات الكورسات، والكثير منها متوفرة كمحاضرات فيديو بالإضافة إلى الملاحظات والوظائف والأوراق العلمية وأسئلة امتحانية وغيره، موقع رائع جداً يحبس الأنفاس إذا تذكرنا أن MIT هي إحدى أبرز الجامعات التقنية في العالم، ومن الكورسات المتاحة على الموقع والمتوافرة كمقاطع فيديو الكورس التعريفي بعلوم الحاسوب والبرمجة في MIT، ويسمى Introduction to Computer Science and Programming.

من الجامعات التقنية العريقة أيضاً لابد أن نذكر جامعة Stanford، ولها موقع تعليمي مجاني مشابه لموقع MIT ويسمى Stanford Engineering Everywhere أو SEE اختصاراً، وفيه ثلاث كورسات تعريفية لمجال علوم الكمبيوتر، هذه الكورسات هي Programming Methodology وهو الأهم، ثم Programming Abstractions وأخيراً Programming Paradigms.

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

إنه لطريق طويل، ولكنك بدأته – الجزء الثاني

07/02/2010

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

بالنسبة لجامعة دمشق وبقية الجامعات السورية التي تحوي كلية هندسة تقنية المعلومات Information Technology Engineering، يتلقى جميع الطلاب نفس المواد في السنوات الثلاثة الأولى من فترة الدراسة في الكلية، وهي خمس سنوات، ثم يختص الطالب في أحد ثلاثة مجالات، هذه المجالات هي هندسة البرمجيات Software Engineering and Information Systems، الذكاء الصنعي (أو الاصنطاعي كما يطلق عليه في بقية الدول العربية) Artificial Intelligence، وهندسة الشبكات والنظم Networks and Systems Engineering.

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

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

  • علوم عامة: كالفيزياء والكهرباء والدارات الإلكترونية.
  • علوم البرمجة والمنطق: مبادئ البرمجة، البرمجة الكائنية التوجه، البرمجة المرئية Visual، الخوارزميات وبنى المعطيات، الدارات المنطقية، لغات البرمجة، هندسة البرمجيات، البرمجة التفرعية، المترجمات، برمجة قواعد البيانات.
  • الرياضيات وعلومها: وتشمل الإحصاء والجبر الخطي والجبر العام والتحليل الرياضي والعددي والاحتمالات، بالإضافة إلى بعض المواد كبحوث العمليات Operations research، واللغات الشكلية Formal languages.
  • ثقافة حاسوبية عامة: مبادئ أنظمة التشغيل، الأنظمة التفرعية، الشبكات، بنية الكمبيوتر، الاتصالات الرقمية، إدارة قواعد البيانات وقواعد البيانات التوزعية، نظرية المعلومات، مبادئ الجرافيكس والتصميم بمساعدة الحاسوب CAD، الذكاء الصناعي، أنظمة الملتيميديا.
  • مهارات عامة: مهارات التواصل، إدارة المشاريع والتنظيم الاقتصادي.

طبعاً يختلف هذا التقسيم بين جامعة أو أخرى، ولكن هذه هي الخطوط العامة…

لاحظ أن الدراسة في تلك الكلية تعطيك فكرة واسعة في كثير من المواضيع، وهذه الفكرة سطحية في كثير من الأحيان، وهناك كثير من المواد التي لا تفيدك في مستقبلك كمبرمج بشكل مباشر، أو لا تفيدك على الإطلاق، أي أنك تدرس في الجامعة مواد *لن* تهمك في حياتك المهنية، فمثلاً، لن يساعدك فهم أنصاف النواقل في أن تكون مبرمجاً أفضل، ولن يضرني عدم دراستها! ولكن -أعترف- ذلك يبقى ضمن مجال الثقافة التي ستبني قاعدتك العلمية كمهندس، ولكن من جديد، المبرمج ليس مهندس بالضرورة، فلن أضيع وقتي فيما لن يفيدني في البرمجة بشكل مباشر! باختصار، سيكون تركيزنا على البرمجة وعلومها وما يصب في مصلحتها، من فروع الرياضيات مثلاً، أليس هذا ما نحتاجه فقط في البرمجة؟ 🙂

إنه لطريق طويل – الجزء الأول

05/02/2010

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

هذا السيناريو يتكرر كثيراً جداً، هناك الكثيرون ممن يعشقون البرمجة ثم لا يدرسون – لسبب أو لآخر – في كلية علوم الحاسوب CS (أو ما يطلق عليه، وبشكل غريب، هندسة المعلوماتية)، يبتعدون إلى كليات تقنية أخرى (كهندسة الإلكترون، الاتصالات، الحواسيب Computer Engineering، …)، أو ما هو أبعد من ذلك، كليات هندسية غير تقنية (هندسة مدنية، تصميم معماري، …)، أو ما هو أبعد من ذلك…

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

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

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

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

ما الأخبار؟! الجديد في سيلفرلايت 4

03/02/2010

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

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

حسناً، إذن سنلخص أهم الأخبار التي حصلت خلال هذه الأشهر الطويلة التي مرت:

– بعد أن طرح سيلفرلايت 3 بشكل نهائي في التاسع من يوليو \ تموز 2009، استمرت مايكروسوفت بطرح تحديثات دورية لهذا الإصدار، آخرها كان قبل أيام باسم Silverlight 3 GDR 3 وهو يحمل الرقم 3.0.50106.0.

– أعلنت مايكروسوفت قبل حوالي أربعة أشهر عن سيلفرلايت 4، وطرحت منه النسخة Beta 1. في هذا الإصدار العديد من التحسينات الرائعة والتي تجعل المنصة منصة ناضجة متكاملة يمكن الاعتماد عليها، وهو ما لم يكن الحال عليه سابقاً لو أردت رأيي، هناك قائمة طويلة من الميزات الجديدة، سألخصها بـ:

  • البداية مع دعم اللغة العربية ودعم الكتابة من اليمين إلى اليسار في التطبيقات، بالإضافة إلى الكثير من تحسينات الـLocalisation.
  • تحسينات في التعامل مع البيانات عن طريق WCF، وتحسين ربط البيانات Data binding.
  • دعم متصفح غوغل الجديد، غوغل كروم.
  • دعم الطباعة.
  • دعم التعامل الكامل مع لوحة المفاتيح Keyboard في وضع ملء الشاشة Full-screen وتحسين التعامل مع الماوس بدعم الزر الأيمن وعجلة الماوس Wheel/Scroll.
  • تحسين الواجهات عن طريق تحسين المؤثرات الحركية Animation effects ودعم الـThemes لأدوات الواجهة Interface Controls، بالإضافة إلى تحسينات في بعض الأدوات وأبرزها الـDataGrid والـRichTextBox.
  • طريقة أكثر ملاءمة لعرض الرسائل والتنبيهات للمستخدم.
  • دعم التعامل مع المايكروفون وكاميرا الويب Web-cam.
  • دعم الحافظة Clipboard والسحب والإفلات Drag-and-drop.
  • دعم تعدد اللمس Multi-touch.
  • دعم MEF ـ (Managed Extensibility Framework) والذي سأتحدث عنه قريباً إن شاء الله.
  • دعم حماية محتوى H.264.
  • دعم التعامل مع عناصر COM المحلية (Local COM objects).

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