الاثنين، 28 نوفمبر، 2011

المفاضلة بين لغات البرمجة 7

البساطة و الاستقرار:

من أكثر الأمور التى تثير غيظى فى لغة الـ(#C) أننى بعد أن قضيت فترة لا بأس بها أتعلمها فيها و أتشرب طريقة التفكير التى تتميز بها كسابقتها فى العمر الـ(java) أصبحت أحس بأننى لا أعرف البرمجة بها على الإطلاق، و يراودنى الإحساس بهذا كلما رأيت مقالاً أو كتيباً يتحدث عن الإصدارات الجديدة التى تصدرها (microsoft) من اللغة كل فترة. فهذه الإصدارات أصبحت رويداً رويداً تنفخ فى قربة كمية قواعد اللغة حتى انفجرت فى وجه المستخدمين الأبرياء و لى الفخر فى أن أكون واحداً منهم.و بعد أن كنت أتفاخر بأننى أفهم الـ(#C) جيداً أصبحت أخاف من التصريح بأننى أستخدمها فى البرمجة حتى لا يقوم أحدهم بإحراجى حينما يسألنى عن القاعدة الفلانية أو القاعدة العلانية التى ضمت إلى اللغة فى الإصدارة ذات الرقم الفلانى فيبدو جهلى واضحاً له
 و الأمر أصبح مدعاة للرثاء و تقليب الأكف حيرة عند التفكير فى السبب الذى يقف وراء تلك "التطويرات" و النفخات الجديدة التى تعطى للغة على فترات منتظمة حتى أن نحو اللغة الآن لا يكفيه بمفرده لشرحه شرحاً محترفاًً مختصراً كتاب ضخم الحجم لا يقوى على استيعابه المبرمج العادى إلا فى شهور طويلة ينقطع فيها لدراسة اللغة تماماً، و فى النهاية لا يكون أمامه إلا ترك جانب كبير من اللغة لدراسه فى وقت لاحق نظراً لأنه لا يستطيع ترك باقى العلوم و التفرغ لدراسة لغة البرمجة كل  الوقت و هى التى لا تمثل إلا جزءاً صغيراً من العمل البرمجى، و الجدير بالذكر أن الوقت اللاحق الذى يؤجل الدارس إليه دراسة أغلب اللغة مما تبقى له لا يأتى أبداً و ذلك عن تجربة واقعية.و هكذا لا يكون أمام المبرمج إلا خيار من اثنين، أولهما أن ينقطع للغة فترةً كافيةً تمكنه من التمكن الجيد منها ثم متابعة التطورات و الإضافات الجديدة التى تحدث و تضاف للغة كل فترة حتى يصبح مواكباً لأحدث تقنياتها على الدوام، أو الاكتفاء بمعرفة الجزء الأكبر و الأهم من اللغة و التمكن منه جيداً ثم الانطلاق إلى العلوم البرمجية الأخرى التى لابد من التمكن منها بجانب لغة البرمجة العملية.
أما الخيار الأول فيناسب من بدأ مشواره فى تعلم البرمجة منذ أن كان صغيراً و بالتالى كان أمامه الفترة الكافية للتعلم قبل مواجهة سوق العمل الذى يضغط الأوقات و الأعصاب إلى أقصى الحدود، و لا يمكن أن يتناسب مع ظروف شخص مثل كاتب هذه الأسطر على سبيل المثال؛ فالعمل يدفع من هم مثله على القراءة و التعلم و الاحتراف فى مجالات أخرى غير لغة البرمجة المعنية، بل وربما يدفع سوق العمل على إتقان لغةٍ أخرى غير اللغة التى يهتم بها المبرمج و يجد أنها تناسب نمط تفكيره، و أنا خير مثالٍ على ذلك فأنا أستخدم فى البرمجة لغة الـ(++C) التى أمقتها بعنف شديد و أنا مطالب باحترافها و التمكن منها حتى أستطيع العمل بها بحرفية فى مجال معالجة الصور الرقمية، و لأننى أحب الـ(java) و الـ(#C) إلا أننى لا أستطيع بالطبع مجاراة آخر التحديثات و التغييرات التى تتم لهما؛ لأننى لا أستطيع أن أقضى وقتى كله فى تعلم الـ(++C) من ناحية و تعلم الجديد فى الـ(#C) من ناحيةٍ أخرى على حين أن هناك علوم أخرى يجب أن أحصلها حتى أكون مبرمجاً بحق، مثل هندسة البرمجيات و الخوارزمات و غيرها و التى لم أتعلمها من قبل لأننى احترفت مجال البرمجة و الحوسبة عموماً منذ فترة لا تزيد على الثلاث سنوات بحال من الأحوال !.
و هناك من يناسبه خيار المتابعة المستمرة للغة غير البادئ فى التعلم منذ الصغر، و هو من بدأ مع اللغة منذ بداياتها الأولى و أول إصداراتها، و بالتالى كانت لديه الفرصة الرائعة للمتابعة المستمرة كأفضل ما يكون، و هؤلاء ليسوا بالقليلين بل هم فى كل مكان حولنا و يمكن أن نراهم كثيراً حينما يأتى الأمر على لغة مثل الـ
(
#C) التى أصبحت البرمجة بها موضة من موضات المبرمجين اليوم، و بالتالى انهمك الجميع فى دراستها و هى بعد فى المهد و بالمتابعة تعلموا الجديد أولاً بأول.أما الخيار الثانى القائل بالتمكن من الجزء الأكبر و الأهم من اللغة فقط لكى يتبقى الوقت اللازم لتعلم باقى العلوم البرمجية فهو أمر فيه جدال يطول، و ذلك لأنه و إن كان مع أصحابه الحق فى القول بأهمية تعلم باقى العلوم البرمجية غير لغة البرمجة ذاتها فإنهم لا ينتبهون إلى نقطة أخرى فى غاية الأهمية و هى أنهم بتطبيقهم خيار التجزيئ للغة لن يتمكنوا من فهم الأكواد البرمجية التى يكتبها غيرهم ممن يبرمجون بنفس اللغة البرمجية و لكنهم يستخدمون مكونات لم يتعلموها هم. ولن يكون مثل هذا الموقف قليل الحوث بل سيحدث كثيراً جداً كلما زادت كمية الأكواد التى يطلع عليها المبرمجون، و هى كثيرة العدد جداً فى هذه الأيام بفضل عالم المصادر المفتوحة الذى كشر عن أنيابه بقوة و أصبحت قوته الضاربة غير قابلة للجدال فى كل مجال من مجالات البرمجة.
و هذا يعنى أن أمثال هؤلاء المبرمجين سيجبرون إن عاجلاً أو آجلاً على التعرف على معظم المكونات التى تركوها خلفهم فى اللغة إن لم تكن كلها، و بالتالى يكون من الأفضل لهم أن يفعلوا ذلك من البداية فى ذروة تعلم اللغة ما دام الأمر لا مفر منه فى النهاية و من ثم يكون ما نخافه من الإهمال لباقى عناصر العلم البرمجى أو حتى عدم التنبه الكامل لها حتى الانتهاء من تعلم لغة البرمجة التى هى الأداة التى يستخدمها المبرمج فى عمله ليس إلا.و هكذا نرى بأم أعيننا الوقت الكبير يضيع فى تعلم ما كان يجب أن يكون هو الأمر الأبسط فى العملية التعليمية كلها بينما الأمور الأهم تترك لما بعد، و بعد كل ذلك تأتى مرحلة التطبيق على المجالات التى سوف تستخدم فيها كل تلك الخبرات البرمجية مثل برمجة الشبكات أو برمجة تطبيقات معالجة الصور الرقمية. و ليس لنا بعد كل ذلك الوقت المهدر التعجب من كره الكثيرين من التعمق فى دراسات البرمجيات النظرية مثل هندسة البرمجيات و الخوارزمات و رؤيتهم لها على أنها غير ذات جدوى بينما ينظرون إلى تعلم لغة برمجة على أنه هو كل شئ فى عالم البرمجة مادام يأخذ وقتاً كبيراً و يأتى دائماً فى المقدمة لكل شئ و يركز عليه الجميع أغلب اهتمامهم.
و هكذا نرى أيضاً كل عام أكواماً من الكتب التعليمية التى لم تعد لها أى فائدة رغم الجهد الذى بذله مؤلفوها فيها لأنها أصبحت تتحدث عن ماضى اللغة لا عن حاضرها، و رغم المال الذى دفعه فيها مشتروها الراغبين فى تعلم اللغة، و بالتدريج سيكون على المتعلم التفرقة بين الكتب القديمة و الحديثة بمنتهى الحرص حتى لا يقع فى معلومات مغلوطة عن اللغة
.
و مثل هذا الموقف نراه فى الـ(
#C) التى كنا منذ فترة ليست بالبعيدة نقول عنها أنها لغة ذات أنواع ثابتة أو (statically typed) و من ثم فاجأتنا الإصدارات الجديدة أنها صارت أيضاً ذات أنواع متغيرة أو (dynamically typed). و هذا الحال بالطبع لا يرضينى ولا أقتنع بجدواه على الإطلاق، بل أقول أن كل هذا عبث سخيف ليس له أن يستمر و لا يحق لأحد أن يفرضه على الآخرين بأى داع من الدواعى، فمنتجوا لغات البرمجة الشهيرة الذين يزيدون فى قواعدها يوماً بعد يوم مثل (microsoft) و لغتها الـ(#C) يجب عليهم أن يتوقفوا حالاً عن هذا و إلا كان لزاماً على معاشر المبرمجين مقاطعة أمثال تلك اللغات تماماً فيصير أمثال أولئك المنتجين مثالاً لكل من يتحدى إرادة مجتمع المبرمجين و يجبرهم على اللهاث وراءه فى عملية تعليمية تعذيبية الطابع لا نهاية لها.

الأسباب التى تجعل المنتجين للغات البرمجة يفعلون هذا:

إذا ما فكرنا فى هذه المسألة بعمق لوجدنا أن الأسباب التى تجعل منتجي لغات البرمجة يزيدون من قواعد لغاتهم أو "يطورونها" تختلف حسب المنهجية التى ينظر بها ذلك المنتج إلى المجتمع البرمجى نفسه، و لنا فى لغة الـ(
#C) خير مثال على ذلك، فمنتج لغة الـ(#C) هو (microsoft) التى لا تسعى (مثلها مثل كل الشركات التجارية) إلا وراء الكسب المادى مهما روجت دعايتها إلى كونها تسعى خلف التقدم العلمى. المهم أن (microsoft) يهمها للحصول على المكسب المادى من وراء لغة الـ(#C) أن يكون لها أكبر عدد من المستخدمين من المبرمجين مختلفى الطباع و الأهواء، لذا نرى أن الـ(#C) تحوى داخلها من الصفات ما يجعلها تجميعةً من مختلف أنواع التفكير البرمجية و يزداد هذا الأمر وضوحاً يوماً بعد يوم بالزيادات التى تضعها (microsoft) فيها بدعوى التطوير و التحديث.و قد ضربنا لذلك مثالاً بالـ(statically typing) و الـ(dynamically typing)، و نضرب له مثالاً آخر هو البرمجة الآمنة و البرمجة غير الآمنة أو الـ(safe programming) و الـ(unsafe programming)، و التى تمكن مبرمجى الـ(#C) من استخدام المؤشرات التى تعودوا عليها فى الـ(++C) إذا ما أرادوا استخدامها فى اللغة الجديدة، وهو الأمر الذى قد يسعد بعض من مبرمجى الـ(++C) و يقنعهم بالفعل بالانتقال إلى البرمجة بالـ(#C) و لكنه فى نفس الوقت يجعل الـ(#C) بالنسبة لمن هم مثلى أرضاً مشكوك فى كونها حقل ألغام.

عدم الخلط بين الاستقرار و الجمود:


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

و فى النهاية فإننى ألخص موقفى فى تلك النقطة الجوهرية من مبحث تصميم لغات البرمجة فى البنود التالية:


  1. يجب أن تكون اللغة مصممةً على نارٍ هادئة؛ حتى لا نحتاج إلى التغيير الكثير فيها فيما بعد.
  2. يجب أن تضم اللغة المكونات التى لا يمكن الاستغناء عنها و لا يمكن أن تحل محلها مكوناتٌ أخرى تم ضمها بالفعل للغة، أى أن الأولوية فى الضم للغة ستكون للمكونات التى لا غناء عنها و التى تغنى عن غيرها بينما يتم رفض ذلك الغير.
  3. إذا ما كانت هناك تطوراتٌ فى البرمجة تجعل مكوناً جديداً جديراً بالضم إلى اللغة، فيجب أن يتم حسم مسألة كون هذا المكون الجديد لا يهدم مكوناتٍ أخرى أم لا، فإن كان لا يفعل و كان سهل التأقلم مع المكونات الموجودة بالفعل فيمكن ضمه إلى اللغة بعد فترة استقرارٍ جيدةٍ لا تقل فى رأيى عن سنةٍ كاملة عن التغيير الضرورى السابق مباشرة.
  4. على مدى حياة اللغة يجب أن يكون هناك حدٌ يتم بعده رفض ضم أى مكونٍ للغة مهما كانت أهميته و هو ما يمكن أن نسميه حد التخمة، و أقدر أنا هذا الحد بحجم الكتاب الذى يشرح نحو اللغة على نحو محترف مختصر، فلو زاد حجم الكتاب على الخمسين صفحةً من ورق الـ(A4) المكتوب بخط وسط لا صغيرٍ و لا كبيرٍ يمكننى أن اعتبر هذه اللغة قد بلغت حد التخمة و يجب التقليل من كل ذلك الكم من القواعد التى لا داعى لها.و رغم أن الأمر يخضع للتقدير الشخصى بالفعل إلى حد كبير إلا أنه بالحس الشخصى يمكن التوصل إلى نتائج شديدة الشبه عند النظر إلى لغات البرمجة المختلفة من عينى أشخاص مختلفين استناداً إلى المعيار السابق للتخمة، أى أنه رغم كون المعيار غير فائق التحديد: إلا أنه عملياً سيكون ذا قوة توحيدٍ قياسيةٍ كبيرةٍ بين المبرمجين و الناقدين للغات البرمجة.
  5. عندما تبلغ اللغة حد التخمة و يكون هناك مكوناتٌ لابد من وجودها فى لغة البرمجة الجيدة لتلائم الأفكار الجديدة فى العمل البرمجى، أو عندما نحتاج إلى تغيير أحد الأفكار الرئيسة فى لغة البرمجة، أو حتى تكون هناك مكوناتٌ عفى عليها الزمن و يجب التخلص منها، فيجب علينا أن نفكر فى إنتاج لغة برمجةٍ جديدةٍ تستلهم الجيد الذى فى اللغة القديمة و تضع الجديد المرغوب فى ضمه محل القديم المرغوب فى تركه، و هذا يجعل تصميمَ اللغات أسهل، و تطورَها أكثر قابليةً للفهم، كما أنه يعطى للراغبين فى البرمجة باللغة على نفس الشكل القديم لها الفرصة لفعل ذلك، و لا يجبرهم على التغيير للشكل الجديد مادام الشكل الجديد قد صِيغ على شكل لغةٍ برمجيةٍ أخرى مختلفة لهم كل الحق فى التقرير لأنفسهم إن كانوا سيتعلمونها و يستخدمونها أم لا.

هناك تعليقان (2):

  1. تسلم إيدك موضوع رائع فعلاً ... نبهنا لأشياء كثيرة يمكننا تجنبها الآن ... دمت فى رعاية الله

    ردحذف
  2. و رعاك و بارك فيك أخي الحبيب، أتمني علي الله تعالي أن ينفعنا بما علمنا و أن يعلمنا ما جهلنا و هو القادر علي ذلك جل ثناؤه، و مرحباً بك مفيداً و مستفيداً.
    أرجو ألا تحرمني من مرورك مراتٍ أخري ^_^

    ردحذف