كيف تبدأ في تعلم الـ Competitive Programming وحل المشكلات؟
مهارة البرمجة التنافسية (Competitive Programming) وحل المشكلات (problem solving) هي واحدة من أهم المهارات التي تميزك عن الآخرين في مجال صناعة البرمجيات إذا أتقنتها، وستضيف المزيد من القوة إلى سيرتك الذاتية، كما أن إتقانك لهذه المهارة سيعزز التفكير المنطقي لديك وسيحسن من طريقة تفكيرك ونظرتك للأمور بشكل عام. ومن المعروف أن العديد من عمالقة الشركات التكنولوجيا المشهورين، بما في ذلك فيسبوك وجوجل وأمازون وما إلى ذلك يهتمون بشكل كبير بمهارات البرمجة التنافسية وحل المشكلات لدى المرشحين لديهم، لذا إذا كنت ترغب في الالتحاق بتلك الشركات فيجب عليك الاهتمام بتعلم هذه المهارة والعمل بجد لإتقانها وتعزيزها.
كيف تبدأ في تعلم البرمجة التنافسية
ما هي البرمجة التنافسية (Competitive Programming)؟
البرمجة التنافسية هي تمرين لرفع مستوى مهارات البرمجة وهياكل البيانات والخوارزميات الخاصة بك من خلال حل العديد من المشاكل البرمجية، مع وجود قيود معينة مثل الحد الزمني والذاكرة. تحتاج إلى التوصل إلى حل صحيح للمشكلة البرمجية المعطاة باستخدام لغتك المفضلة، ويجب أن يجتاز الكود الخاص بك جميع حالات الاختبار المطلوبة.
أفضل جزء هنا هو أنك تتنافس مع العديد من العقول القوية في جميع أنحاء العالم، وتعزز ليس فقط مهارات البرمجة أو مهارات هياكل البيانات والخوارزميات الخاصة بك، ولكن أيضًا المهارات الأخرى، مثل التفكير المنطقي والتحليلي، وحل المشكلات، وإدارة الوقت، وتحليل المشكلة إلى أجزاء صغيرة، والعديد من المهارات الأخرى.
في هذه المقالة سأشارك معك بعض الأمور التي تحتاج أن تقوم بها إذا كنت تريد أن تبدأ في تعلم البرمجة التنافسية وحل المشكلات Competitive Programming and problem solving.
1. تعلم لغة البرمجة المفضلة لديك
أولاً، وقبل أي شيء عليك اختيار لغة البرمجة المفضلة لديك وأن تصبح بارعًا في بنيتها وأساسياتها وكتابة الأكواد البرمجية باستخدامها. تحتاج إلى أن تكون على دراية بالوظائف المدمجة (built-in functions)، والجمل الشرطية (conditional statement)، والحلقات (loops)، وما إلى ذلك جنبًا إلى جنب مع المفاهيم المتقدمة المطلوبة مثل مكتبة STL في لغة ++C، أو Big Integers في لغة Java. هناك العديد من اللغات المناسبة للبرمجة التنافسية مثل C و++C و Java و Python وغيرها الكثير، ولكن عادةً ما يتم تفضيل لغة ++C للبرمجة التنافسية من قبل المبرمجين بسبب بعض مميزاتها مثل وقت التنفيذ الأسرع مثلًا، ومع ذلك، يُمكنك اختيار أي من اللغات ذات الصلة وفقًا لتفضيلك.
2. تعلم هياكل البيانات والخوارزميات Data structures and Algorithms
ثم يأتي هنا الجانب الأساسي للبرمجة التنافسية، أي هياكل البيانات والخوارزميات. في الواقع، يعد تعلم أساسيات هياكل البيانات والخوارزميات أمرًا لا بد منه لبدء رحلتك في إتقان مهارة البرمجة التنافسية وحل المشكلات.
سيخبرك البعض أنه ليس من الضروري تعلم الخوارزميات وهياكل البيانات مسبقًا للبدء في تعلم البرمجة التنافسية وحل المشكلات البرمجية، وأنه يمكنك البدء في حل المشكلات وتعلم الخوارزميات وهياكل البيانات بالتوازي مع بعضهما البعض، ونحن نوصيك على الأقل بتغطية أساسيات الخوارزميات وهياكل البيانات مثل المصفوفات (Arrays)، القائمة المرتبطة (Linked List)، المكدس (Stack)، قائمة الانتظار (Queue)، خوارزميات البحث والفرز، قبل البدء في حل المشاكل البرمجية والقيام بممارسة البرمجة التنافسية؛ لأنه تعلم هذه الأساسيات سيساعدك على الشعور بالثقة وحل غالبية المشاكل. دون معرفة أساسيات هياكل البيانات والخوارزميات جيدًا، لن تتمكن من التوصل إلى حل مثالي وفعال لمشكلة البرمجة التي تقوم بحلها.
لتعلم وإتقان هياكل البيانات والخوارزميات، نوصي بهذه الدورة أساسيات هياكل البيانات والخوارزميات والتي يتم شرحها كاملةً باللغة العربية.
3. ابدأ بالممارسة وحل المشاكل Practice and problem solving
بعد تعلم لغة البرمجة ومفاهيم DSA، حان الوقت لممارسة تعلمك والبدء في حل المشكلات. يجب أن تبدأ في حل مشاكل مستوى المبتدئين أولاً، وفي البداية ستجد نفسك تكافح من أجل حل حتى هذه المشاكل السهلة أو المبتدئة، ولكن لا داعي للقلق حيال ذلك. كل ما عليك فعله هو عدم الاستسلام والاستمرار في المحاولة، ويمكنك الاطلاع على حلول الأفراد الآخرين، ولكن لا ينبغي القيام بذلك إلا بعد بذل قصارى الجهد من جانبك.
4. ابدأ بالمشاركة في تحديات أو مسابقات حل المشكلات البرمجية
هناك العديد من المواقع على الإنترنت، التي تساعدك في ممارسة وتعلم البرمجة التنافسية ومواضيعها المختلفة.
بإمكانك أن تجد في مثل هذه المواقع العديد من المسائل البرمجية والتحديات، ويمكنك رفع كودك (code) الخاص لحل هذه المسائل باستخدام العديد من لغات البرمجة، حيث يقوم الموقع باختبار الحل وتقييمه من خلال ما يدعى (Online Judging System). تقوم مثل هذه الأنظمة بترجمة الكود، وتشغيله، وتجربته على العديد من حالات الاختبار (إعطاء البرنامج دخل معين، معاينة الخرج، ومقارنته مع النتيجة المتوقعة).
كما وتقوم العديد من هذه المواقع بتنظيم مسابقات برمجية دورية يمكنك أيضا المشاركة بها، إما للتدرب، أو الحصول على جائزة.
من أمثلة هذه المواقع: spoj.com ،codeforces.com وغيرها الكثير، يمكنك الاطلاع على هذه القائمة ببعض مواقع البرمجة التنافسية.
بعض هذه المواقع تذهب أبعد من موضوع البرمجة التنافسية وتساعدك في تعلم العديد من علوم الحاسب الأخرى، كما وتساعدك في التحضير لمقابلات العمل، مثل: Hackerrank ،Interviewbit ،LeetCode وغيرها.
5. حافظ على التزامك بهذه العملية – تعلم، مارس، شارك!
من أهم الأشياء التي يجب تذكرها، والتي غالبًا ما يتجاهلها معظم الأفراد هو البقاء متسقًا مع عملية التعلم والممارسة والمشاركة. نعم، تحتاج إلى معرفة أنها عملية مستمرة، ولإتقان البرمجة التنافسية وحل المشكلات، مطلوب منك الاستمرار في التعلم والاستمرار في التدريب والاستمرار في المشاركة. تحتاج إلى الخروج من منطقة الراحة الخاصة بك وتوسيع حدودك. على سبيل المثال، بعد أن تصبح بارعًا في مفاهيم DSA الأساسية، انتقل إلى DSA المتقدم، أو بعد إتقان حل مشاكل مستوى المبتدئين، انتقل إلى المستوى المتوسط وهكذا.
أيضًا، عند الوصول إلى الحل الصحيح للمشكلة، عليك التحقق من حلول الآخرين لتعلم العثور على طرق جديدة ومختلفة لحل مشكلة معينة. وبالمثل، حتى لو فشلت أو لم تكن قادرًا على الأداء الجيد في التحديات، يجب أن تلتزم بهدفك وتستمر في المشاركة في هذه التحديات من خلال تقوية نقاط ضعفك أو تصحيح أخطائك السابقة باستمرار.
لذلك، يمكن أن تساعد هذه الخطوات المذكورة أعلاه جميع المبتدئين والطلاب (الذين ليس لديهم خبرة في CP) على البدء ببرمجة تنافسية بسلاسة وكفاءة تامة. تذكر أيضًا النقاط التالية في رحلة البدء في تعلم البرمجة التنافسية:
1- قم ببناء اتصالات مع زملائك المبرمجين التنافسيين في جميع أنحاء العالم من خلال البقاء نشطًا في العديد من مجتمعات البرمجة التنافسية أو منتديات المناقشة، لأنها ستساعدك كثيرًا على التعلم والنمو كمبرمج تنافسي.
2- لا تقفز مباشرةً لحل المشكلات المعقدة، ولكن ابدأ بحل المشكلات السهلة أولاً، ثم انتقل تدريجياً نحو المشكلات المتقدمة.
3- قبل البدء في حل المشكلة، اقرأ بيان المشكلة بدقة للحصول على التفسير الصحيح للمشكلة، وبالتالي التوصل إلى الحل الصحيح. كما أن بعض التفاصيل الرئيسة للنهج الصحيح لحل المشكلة المعينة عادةً ما تكون مخفية في بيان المشكلة نفسه.
4- لا تنقص عزيمتك بسبب الإخفاقات الأولية، ولكن تعلم من أخطائك وحسن من نفسك باستمرار.
قمنا من خلال هذه المقالة باستعراض مفهوم البرمجة التنافسية كوسيلة وخطوة مهمة في طريقك لتعلم البرمجة، وتعلم مهارات حل المشكلات، كما وقمنا بتقديم العديد من الموارد والمراجع التي يمكنك استخدامها خلال رحلتك للتعلم.
يمكنك البدء باستخدام أي لغة برمجة حسب تفضيلاتك، ولكن يفضل استخدام لغات برمجة مثل ++C وJava كونها اللغات الأكثر استخدامًا في عالم البرمجة التنافسية وحل المشكلات البرمجية.
مهارة البرمجة التنافسية وحل المشكلات هي واحدة من أقوى المهارات التي يمكن أن يمتلكها المبرمج، وهي المهارة الأهم التي تبحث عنها الشركات الكبرى في مجال صناعة البرمجيات، لذا تعلمك وإتقانك لهذه المهارة سيعطيك الأولوية للالتحاق بهذه الشركات.