لماذا أكره Java و ‎C‎+‎+‎ و ‎C‎#‎ (كلغات تعليمية) « مغامرات برمجية

لماذا أكره Java و ‎C‎+‎+‎ و ‎C‎#‎ (كلغات تعليمية)

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

رغم أنني تركت مقاعد الدراسة منذ أيام كان رجال الكهف يصارعون الديناصورات من أجل حفنة دراهم، إلا أنني أحب من وقت لآخر متابعة ما يجري في الجامعات وتطور التعليم الحاسوبي بها. وهناك توجه مقلق نحو اعتماد لغات Java و ‎C‎+‎+‎ و ‎C‎#‎ كلغات تعليمية. أنا لا أنقص من قدر هذه اللغات الجليلة والمخضرمة، ولكنني أسلط الضوء على ما أراه غير مناسباً لها.

ما هو العامل المشترك بين هؤلاء الثلاثة؟ كلا ليس إرث syntax الـC المتشارك. رغم أنني لم أذكر Visual Basic .NET معهم، إلا أن لها نفس المشكلة رغم اختلاف الـsyntax. ما أقصده هو أن الثلاثة هي لغات غارقة حتى الصميم في مبادئ الـobject oriented programming. وهذه الأخيرة هي بالذات التي تجعلها لغات غير مناسبة تعليمياً.

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

ولكننا حينما نختار أحد هذه الثلاث لغات كلغة بداية فإننا نقذف بهؤلاء الطلاب البؤساء إلى عرين كواسر الـOOP!

دعنا نرى برنامج Hello World بلغة ‎C‎#‎:

1
2
3
4
5
6
7
class Program
{
static void Main()
{
Console.WriteLine("Hello world!");
}
}

والآن تخيلوا أن تحاولوا أن تشرحوا هذا البرنامج البسيط جداً إلى طالب مستجد. دون أن تطرقوا إلى الـOOP. ما يحدث غالباً هو أنك (رحمةً بهؤلاء المساكين) ستتجاهل الـOOP وتخبرهم أن “class و static هي أشياء سنتعلمها لاحقاً. الآن إحفظوها كما هي.” أنا أتحدث عن نفسي هنا (ولو أنني أتخيل وأتمنى أنني لست الوحيد) وعلي القول أنني أكره كره العمى الحفظ الأعمى. لذا هذا الأسلوب في حفظ الكليشيهات مرفوض تماماً في قاموسي.

وحفاظاً على الأمانة العلمية ها هنا مثال بالـJava (لا يختلف كثيراُ في الواقع):

1
2
3
4
5
class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

ومثال بالعجوزة الشمطاء ‎C‎+‎+‎ كاد بصيبني أنا بالشلل رغم كل هذا السنين من البرمجة، ولو أنه خفيف نوعاً من ناحية الـOOP:

1
2
3
4
5
6
#include

int main()
{
std::cout << "Hello, world!\n";
}

لكن لماذا الإصرار على هذه اللغات كلغة برمجة أولى؟ حسب ما فهمت، هناك سببين رئيسيين:

1. هذه لغات مهمة من ناحية تطبيق الـOOP. وبما أن الطلاب عاجلاً أم آجلاً سيتعلمون الـOOP فمن الأحرى أن يتعلموا هذه اللغات الآن.
2. هذه لغات منتشرة في سوق العمل. وبما أن الطلاب عاجلاً أم آجلاً سيبحثون عن قوت يومهم (بعيداً عن مصارعة الديناصورات) فمن الأحرى أن يتعلموا هذه اللغات الآن.

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

عندما نأخذ طريق تعليم البرمجة باللغة س، فإننا ندرب الطالب على توجه واحد فقط. وحين يتطلب السوق والعالم الواقعي أن يغير توجهه ستجده يتسمر في مكانه. أليس من الأحرى إذن تعليم البرمجة كمبدأ وطريقة تفكير بدلاً من حفظ مجموعة من الأوامر؟ وإذا كنا سندرس البرمجة كطريقة تفكير فعلينا أن نفصل بين الـsyntax والأوامر وبين الجوهر الحقيقي للبرمجة: المنطق والخوارزمية. وهذه تحصل بتعلم عدة توجهات. بدايةً بالبرمجة procedural ومروراً بالـOOP (ويا حبذا لو مررنا ببعض التوجهات المغلوب على أمرها مثل الـfunctional والـlogical أيضاً).

تمام. لنهاجم النقطة الثانية. هنا علينا أن نتوقف لوهلة ونفكر. ما هو الهدف من البرامج الجامعية؟ هناك خلاف فلسفي في هذه النقطة. فريق يقول أن على الجامعة تخريج طلاب جاهزين لسوق العمل. وفريق آخر يقول أن هدف الجامعة أكاديميٌ أكثر منه مهني. سأسمي الفريق الأول فريق الواقع المر، والثاني فريق المبادئ السامية. رغم أن الكل يكره المتحذلقين إلا أنني سأهجم على فريق الواقع المر، لسبب بسيط هو أن فريق المبادئ السامية هو ذو توجه أكاديمي بحت تحدثنا عنه في النقطة السابقة. إذن لنتحدث عن هذه الكمية المبهمة والمؤرقة التي نسميها سوق العمل.

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

أذكر أنه عندما دخلت الجامعة كانت التقنية المنتشرة لتطبيقات الأعمل هي DBase IV. وعندما شارفت على نهاية دراستي تحول الجميع إلى Oracle Forms. وأول ما توظفت انتقلت الموضة إلى تطبيقات الويب بالـASP (القديمة). وبعدها بسنة بالضبط ظهرت الدوت نت لتكتسح السوق. تخيل معي لو أن برنامجاً جامعياً ركز فقط على واحدة (أو حتى اثنتين) من هذه التقنيات. ثم تذكر أن الجامعات العربية مشهورة ببطء تغيير مناهجها. أليس هذا أمراً مخيفاً؟

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

هناك الخيارات الكلاسيكية. لغتا Fortran وPascal قد تكونان شبه منقرضتين (في سوق العمل) إلا أنها تبقى لغات تعليمية فعالة، بالذات الـPascal. لغة C أيضاً خيار قوي، وتفتح المجال لتعلم الـ‎C‎+‎+‎ وغيرها فيما بعد.

ولكن هناك خياران آخران أفضلهما شخصياً. لغتا Python وJavaScript.

أعرف أنني تحدثت عن البايثون كثيراً في هذه المدونة، لذا لن أضجركم بمحاضرة طويلة عن مزاياها. فقط انظروا إلى برنامج Hello World لها:

1
print("Hello World!")

فقط. لا غير. أي طالب لا يستطيع فهم هذا البرنامج بعد بضعة دقائق من الشرح هو طالب فنون جميلة ضاع في طريقه إلى محاضرة الرسم بالألوان المائية. “لكنها لغة interpreted!” سيقول البعض. وماذا في هذا؟ حذف عملية الـcompile من روتين الطالب المستجد سيسرع عملية التعليم. لغة الـBASIC القديمة كانت لغة interpreted، وخرجت أجيال وأجيال من المبرمجين الأكفاء (رغماً عن أنف Djikstra ومقولته المشهورة! ;) ). “ولكنها بطيئة!” وماذا في هذا؟ لا أعتقد أن طلاب سنة أولى برمجة سيقومون بتطوير محرك ألعاب ثلاثي الأبعاد. وهي ليست فكرة اخترعتها أنا. هناك عدة جامعات كبرى تدرس البايثون كلغة أولى، مثل جامعة MIT. ورغم أنني قلت بايثون، إلا أن هناك لغات برمجة أخرى شبيهة بها يمكنها أن تقوم مقامها مثل Ruby و Lua.

وطبعاً JavaScript.

علي أن أقول (رغم أنني أحب بايثون أكثر) بأن JavaScript قد تكون أحد أفضل اللغات لتعليم البرمجة بها في رأيي. مبادئها سهلة. كل ما تحتاجه للبرمجة بها هو محرر نصوص بسيط ومتصفح ويب. وفي الأخيرة تكمن قوتها. قد تروق برامج الـconsole لهواة البرمجة والـgeeks، إلا أن بقية الناس سيكونون مرتاحين أكثر مع صفحات الويب لأنها شئ يتعاملون معه بشكل شبه يومي. من أحد أهم متطلبات لغات التعليم هو سهولة التطبيق. مع كورس HTML بسيط ستجد أن الطلاب يمكنهم أن يضيعوا ساعات طوال وهم يجربون تغيير ألوان ونصوص صفحات الويب وجعلها تتقافز. هذه التجارب و”اللعب بالكود” هي أساس إيجاد الولع بالبرمجة وبالتالي إجادتها.

Post to Twitter

5 تعليق - أضف تعليق
  1. password123 قال:

    اتفق معك 100% بالاضافة لكرهي للoop حتى في خارج الجامعات

    • System Down قال:

      لا أستطيع أن أقول أنني أكره الـOOP نقطة انتهى. ولكن يمكنني القول أنني أكره الفكرة الرائجة بأن الـOOP هي الطريقة الوحيدة الصحيحة للبرمجة. لكل مشكلة أداتها.

      شكراً لمرورك!

  2. معتز قال:

    صحيح أن البرمجة الكائنية oop لا تصلح لدارس جديد للبرمجة. كلما كان المدخل اسهل للبرمجة كلما كان عدد الطُلاب الذين تتكون لديهم عقدة من البرمجة أقل.

  3. khanssa قال:

    البرمجه من اكثر المواد الممتعه بالنسبه لي وما حاقول اني بكره لانها حلوه بس حقول ليكم حبو الماده علشان تقدرو تتعاملو معها . والمبرمج مافي شي صعب بالنسبه ليه!!.

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

أضف تعليق

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

*

يمكنك استخدام أكواد HTML والخصائص التالية: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


مرحباً , تاريخ اليوم هو الثلاثاء, 2017/02/21