:: كل المقالات ::

Tue, 13 Dec 2016

من هو المبرمج الحقيقي ؟ "نقاش"

بسم الله الرحمن الرحيم
كُتب في مجتمع لينكس ان من يريد ان ينصح احدا لتعلم البرمجة فيجب ان ينصحه بسي او سي++ لان المعرفة باحدهما فقط هي من تجعل منك مبرمجا حقيقيا . طبعا كانت لي وجهة نظر مخالفة فقلت :
السلام عليكم و رحمة الله ،،
لا اجدني اوافق ما طرح في هذا الموضوع فالموضوع يوجب ان من يريد التعلم المهني (و ليس اللعب على حد تعبيره) يجب ان يتعلم سي او سي++ كبداية . و هذا خطأ فهل التعلم المهني المقصود هو التعلم لسوق العمل؟ فسوق العمل واسع و متعدد و كما اشار الاخوة هناك تخصصات عديدة لا تحتاج سي و سي ++ و التعامل المباشر مع الذاكرة ، منها مثلا و ليس حصرا ، تطوير الويب بلغات بايثون ، بيرل ، روبي و نود ..ألخ تطوير برامج الجوالات بجافا ،او حتى تطبيقات ويب تستهدف الجوالات خاصة في المنصات التي تتعامل مع ال webapps كمواطن من الدرجة الممتازة مثل نظام ميجو و فايرفوكس ..الخ . اما المهني بمعنى الشركات التجارية فهذه اغلب وظائفها جافا او سي# هذه الايام . بعبارة اخرى من لا يحب او ينوي التطوير للانظمة المدمجة embedded او النظم بشكل عام سواءً نظم تشغيل او منصات افتراضية لا ارى مزية كبيرة للاصرار في استخدام سي او سي++ ، حتى بالنسبة لمبرمجين كبار (ايكازا و فريدمان ..الخ) لا يجدون حرجا من استخدام اللغات الحديثة في احيان كثيرة بدلا من سي .
اما اذا كان القصد ان سي و سي++ تعطيك مبادئ و مفاهيم برمجية لا غنى عنها و يجب تعلمها كي تصبح مبرمجا حقيقيا مثل ما ذكرتم التعامل مع الذاكرة ، فلا ارى مزية كبيرة مرة اخرى فكل لغة لديها مبادئ و مفاهيم تستاهل التعلم و الاطلاع عليها مثلا اللغات الوظيفية مثل هاسكل ..الخ و اللغات المنطقية ..ألخ .
هذا للجادين في تعلم البرمجة اما للهاوين و من يريدون مثلا تعلم اساسيات تمكنهم من عمل مواقع بسيطة و برامج صغيرة تؤدي بعض احتياجاتهم فأجد انه من الجريمة ان ننصحهم بالبداية بسي و سي ++ .
تحية طيبة ،،

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

فقلت تعقيبا على كلامه :
اهلا بالاخ العزيز الاستاذ زكريا ،
ابدا لا يوجد اختلاف معكم في حقيقة ان سوق العمل للسي و السي ++ من اكبر اسواق العمل من حيث الفرص الوظيفية و هذا ليس فقط لقوة اللغتين بل لقدم اللغتين و وجود ملايين السطور البرمجية المتراكمة لعقود من الزمن و التي تحتاج صيانة و ادارة . و لكن هذا لا يعارض حقيقة ان هناك مسارات كثيرة لا تحتاج اي معرفة بالسي و التعامل مع البنية التحتية للحاسوب يكفي ان تأخذ مسار جافا و مسار سي # و تعلمون كمية الطلب على هذه النوعية من لغات البرمجة في الشركات التجارية اضف الى ذلك مسار برمجيات الويب من بي اتش بي و غيرها الى غيرها من المسارات التي يمكن ان يقضي فيها الانسان عمرا كمبرمج محترف و لا يحتاج لان يمس اي كود مكتوب بسي او سي++.
اما جعلكم فهم الذاكرة و التعامل معها شرطا من شروط كون المبرمج مبرمجا حقيقيا ! فهذا لا اوافقكم فيه فلا اجد في تعريفات المبرمجين ما يدل على اشتراط فهم هذه الجزئية و كما قلت في ردي السابق اذا كان هذا شيء واجب على كل مبرمج ان يعرفه فعلى اي اساس تم اختياره خاصة ان اغلب لغات البرمجة من التسعينات و ما بعدها لا تحتاج الى معرفته فهل نقول ان المبرمجين المحترفين بهذه اللغات ليسوا بمبرمجين حقيقيين ؟!
مرة اخرى لماذا مثلا لا تشترطون معرفة كل المبادئ البرمجية المتداولة في الاوساط الوظيفية و الكائنية ..ألخ لماذا بالذات التعامل مع الذاكرة ؟! كلامكم هذا يجعل من مبرمجين جافا و سي # و غيرهم مجرد هواة و هذا معلوم انه مخالف للواقع .
وفقكم الله

فأجابني مرة اخرى قائلا :
مرحباً أستاذي الحبيب، الأخ علي حفظه الله تعالى
ربما وقع سوء فهم بسيط وسأقوم بتصويبه ولله الحمد.
أولاً: في ردي السابق قمت بتخصيص مجال أنا أعكف على دراسته، وقد تكلمت بكلام يتعلق به، فأنا لم أتكلم عن باقي التخصصات والمجال المتعلقة بعلوم الحاسوب، نظراً لأنّ خلفيتي العلمية حولها بسيطة ولا تعدو أن تكون معرفة عامةً. والأصل أن أتكلم أنا العبد الضعيف بعلم أو أسكت بحلم.!
ثانياً: ما ذكرته سابقاً من كلمة مبرمج أو متخصص حقيقي وما شابه ذلك كله يتعلق بالأصل الذي انطلقت منه وهو مجال وتخصص أمن المعلومات، فمطلوب منه أن يحكم فهم كل ما يتوقف عليه فهم الخطأ والعلة، وهذا يتطلب فهم آلية عمل الحاسوب، والذاكرة، والمسجلات وغيرها. ومبرمج حقيقي لديه نظرة وإحاطة حول المجال الذي يعمل عليه. وليس هو بإطلاق اللفظ على كل مجال ؛ ولا أحد تراه يفهم في كل شيء.
ثالثاً: ذكرت فهمت الذاكرة على سبيل الإختصار، وإلاّ فتوجد مئات المواضيع المهمة، وعلى رأسها طرق حلّ المشاكل، والرياضيات وغيرها .. وهذا قطعاً لا أقصد به من يريد أن يصمم صفحة ويب مثلاً ! فهو أمرُ مستنكرُ عقلاً.
رابعاً: نقدي يتعلق بقياسكم أستاذي الحبيب في نقطة مبادئ البرمجة الموجودة كالكائنية وغيرها، مع تعلم مفاهيم الذاكرة، والمسجلات وغيرها، وهذا ممتنعٌ:
لأنّ الأولى قد نسميها نكهات إذا ما تعددت في لغة واحد مثل بايثون أو سي ++، وربما تكون مطلوبة كالإجرائية في سي،ـ أو الكائنية في روبي فقط.
أمّا الثانية: مطلوبة لمن يتعامل مع لغات منخفصة المستوى، وهي شرط يتوقف عليها الكثير من الأمور.
جزاك الله خيراً ونفع بك أستاذ عليّ
رعاك الباري..

اخيرا قلت :
أحسنتم اخي العزيز قولكم بمطلوبية الثانية فيمن يتعامل مع لغات منخفضة و انها شرط يترتب عليه كثير من الامور في هذا المجال فهو لان اطار المشكلة Problem Domain في هذه اللغات يحتاج اليها . و كما لا يخفى عليكم ان اللغات منذ عقدين من الزمن تخرج هذه المشكلة من مجالها حتى اصبح المبرمجون يستطيعون ان يبرمجوا ليس فقط برامج دسكتوب او ويب بدون القلق من ناحية ادارة الذاكرة بل حتى البرمجة المضمنة embedded اصبحت في كثير من الاحيان ممكنة حتى بدون استخدام سي (منصة جافا مثلا) .
اما الاولى يا رعاك الله التي سميتموها بالنكهات فالكلام ليس عن عمومياتها بل تساؤلي على مفاهيمها الخاصة التي لا غنى للمبرمج الحديث عنها مثلا معرفة الانماط الصحيحة في البرمجة الشيئية و معرفة و فهم آلية عمل الـ interfaces و الوراثة و الـ polymorphism ..ألخ فكما اشرتم المبرمج بطبيعة الحال سيركز على المفاهيم الاقرب الى مجال مشكلته فلا غرابة لو سمعتم ان مبرمجا عمله الاساسي تحليل النصوص يقول لكم ان المبرمج الحقيقي هو من يعرف الـ regex .. لذلك قلت في بداية مشاركتي اني لا اوافق الموضوع من حيث انه يضيق واسعا ، فالمبرمج الحقيقي لا يعرف بكونه حصريا يعرف كيف يتعامل مع الذاكرة (ربما هذا مبرمج النظم) او كيف يكتب خوارزميات معقدة جدا (ربما هذا مبرمج بخلفية علمية) او كيف يكتب regex معقدة جدا (ربما هذا محلل نصوص او مدير نظم)..الخ.
بشكل عام لا يوجد اختلاف كبير بيننا فقط اختلاف في وضع مكان الاهمية و الاولوية .
شكرا لاتاحتكم هذه الفرصة للحوار اخي و عزيزي زكريا ،،

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