الخوارزميات: بين روعة الحلول ومرارة التحديات

دقائق القراءة: 4

مقدمة في عالم الخوارزميات

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

تحليل التحديات الشائعة

الاستعانة بالمجتمع

تضمن أحد هذه التحليلات تتبع عدد المرات التي قام فيها الأشخاص بلصق أكوادهم ليتم فحصها من قبل الآخرين في غرف محادثة Gitter ذات الصلة. حصلنا على البيانات من واجهة برمجة تطبيقات Gitter API. بعد بعض عمليات التنظيف، حاولنا الحصول على أسماء الدوال لكل تحدٍ من الرسائل المنشورة في غرفة محادثة المساعدة. على الرغم من أن البيانات ليست دقيقة تمامًا، إلا أنها تقدير جيد لما قد يحدث. يوضح الرسم البياني (المشار إليه في المقال الأصلي) بوضوح أن خوارزميات مثل palindromes، title case، seek and destroy، longest word، reverse string، mutation أو chunky monkey هي تلك التي يطلب فيها الكثيرون المساعدة.

تحليل الوقت المستغرق

تحليل آخر قمنا به هو أخذ متوسط الوقت لكل صفحة أمضاها كل متعلم في كل تحدٍ، باستخدام بيانات Google Analytics. مرة أخرى، كانت التحديات الصعبة هي خوارزميات مثل palindromes، ولكن هناك تحديات أخرى بدت صعبة أيضًا (لنفترض ربع متوسط الوقت لكل مستوى على نفس متوسط الوقت) خاصة للمستويات الأساسية والمتوسطة، مثل Spinal Tap Case، Pig Latin، Search and Replace، Common Multiple، Sum All Primes، Steamroller، Friendly Date Range، Pairwise، وغيرها.

العوامل المؤثرة في أداء حل الخوارزميات

بالنظر إلى النتائج، هل يمكننا تحديد العوامل التي تؤثر على أداء المتعلمين مع الخوارزميات؟ الأسباب الأكثر وضوحًا، مرتبة ترتيبًا مبدئيًا، هي:

  • يواجه المتعلمون صعوبة بالغة في التعامل مع strings (السلاسل النصية)، ويبدو أن Regex (التعبيرات النمطية) تمثل تحديًا كبيرًا مهما كان مستوى الخبرة.
  • تسبب بعض التحديات الرقمية صعوبة للمتعلمين، لا سيما تلك التي تتطلب استخدام recursive calls (الاستدعاءات التكرارية).
  • مشكلة شائعة أخرى هي التعامل مع المجموعات المتداخلة من arrays (المصفوفات) و objects (الكائنات).
  • تعد الصعوبة في فهم المفاهيم والتعريفات أمرًا شائعًا. على سبيل المثال، غالبًا ما يمثل مفهوم “symmetric difference” (الفرق المتماثل) تحديًا، حيث لا يستوعب العديد من المتعلمين المفهوم بشكل صحيح، على الرغم من توفر تعريف رياضي مقبول على نطاق واسع.

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

نصائح لتحسين مهارات حل الخوارزميات

إذا كنت تقرأ هذا وقد عانيت بالفعل من بعض الخوارزميات، فستدرك أنك لست وحدك. للمبتدئين في عالم الخوارزميات، أوصي بما يلي:

  • ابدأ بالأسهل: قد تجد في حل المشكلات الأبسط تدريبًا يساعدك على التعامل مع الأصعب لاحقًا.
  • افهم المشكلة: ابدأ بسؤال نفسك: ما هي المشكلة بالضبط؟
  • ابحث: استشر الكتب والمراجع والدورات التدريبية عبر الإنترنت.
  • شارك واطلب المساعدة: هناك الكثير من المساعدة المتاحة لمشكلات مشابهة لمشكلتك. اسأل في غرف الدردشة، تواصل مع الروبوتات المساعدة، اطلع على الويكي، جرب البرمجة الثنائية (pair programming)، أو زر مجتمعًا برمجيًا للتعاون وجهًا لوجه.

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

قراءة أكواد الآخرين

البيانات التي استخدمناها لهذه التحليلات كانت للعام الماضي: هذا العام، تم بذل جهود كبيرة لتعديل المنهج الدراسي، لذا قد تلاحظ فرقًا في أدائك إذا عملت من خلال قسم Basic JavaScript المحسن. إذا لم تكن قد أكملت المنهج المحدث، فقد يكون من المفيد إعادة زيارة هذا القسم.

نصيحتي الإضافية؟ نعم، حاول بجد بنفسك ولكن… اقرأ أكواد الآخرين أيضًا. عندما تقرأ كتابًا عن JavaScript لتعلم البرمجة، فهذا بالضبط ما تفعله. تعلم كيفية الهندسة العكسية (reverse engineer) للأكواد الموجودة وتعديلها لتناسب احتياجاتك. لماذا؟ أولاً، لا داعي لإعادة اختراع العجلة. ثانيًا، تتعلم الكثير من خلال فهم عمل أولئك الذين حلوا المشكلة بالفعل. تذكر: ستجد أنك في معظم الأوقات ستعيد استخدام مقتطفات معدلة من كود سابق في كود جديد. لذا لا عيب في قراءة أكواد الآخرين. هذا جزء من طبيعة المصادر المفتوحة (Open Source)، بالمناسبة… برمجة سعيدة!

💡 الخلاصة التقنية

تُظهر تحليلات أداء المبرمجين أن تحديات الخوارزميات شائعة، وأن الصعوبات تتمركز غالبًا حول التعامل مع السلاسل النصية (strings)، التعبيرات النمطية (Regex)، الاستدعاءات التكرارية (recursive calls)، وهياكل البيانات المتداخلة (nested arrays/objects)، بالإضافة إلى فهم المفاهيم المجردة. لتجاوز هذه العقبات، يُنصح بالبدء بالمشكلات الأبسط، تعميق فهم المشكلة، البحث المستمر، والمشاركة الفعالة في المجتمعات البرمجية. الأهم من ذلك، أن قراءة أكواد المطورين الآخرين وتعديلها يمثلان أداة تعليمية قوية ومسرعًا للتعلم، مما يعزز مبدأ “لا تعيد اختراع العجلة” ويسهم في تطوير مهارات الهندسة العكسية.

اترك تعليقاً

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