البرمجة التنافسية:
البرمجة التنافسية وفقاً لتعريف ويكيبيديا هي “رياضة عقلية تقام عادة على الإنترنت أو ضمن شبكة محلية، متضمنة مجموعة من المتسابقين يحاولون كتابة برامج وفقاً لمعطيات محددة ومقدمة، البرمجة التنافسية مدعومة بشكل كبير من قبل الكثير من الشركات العالمية، أمثال google, Facebook…
المسابقة البرمجية تتضمن بشكل عام مجموعة من المشاكل المنطقية والرياضية المقدمة للمتسابقين، والذين يطلب منهم كتابة برامج قادرة على حل كل مشكلة.”[1] إضافة إلى التعريف السابق أود أن أذكر أيضاً أن المشاكل المطلوب حلها هي مشاكل تم حلها مسبقاً من قبل لجنة التحكيم وفقاً للحدود المعطاة في المشكلة، بمعنى أن المتسابقين يطلب منهم التفكير في إيجاد حلول لمشاكل لها حل مسبق، وليس كغير مسابقات يطلب فيها إيجاد حلول لمشاكل لا حل لها.
المشاكل التي يطلب حلها بشكل عام عبارة عن مشاكل منطقية ورياضية متعلقة بعلوم الحاسب، وتتطلب معرفة موسعة بالخوارزميات وبنى المعطيات، يطلب من المتسابقين كتابة كود برمجي بأية لغة برمجية وظيفة هذا الكود هو إيجاد حل صحيح وفعال للمشكلة المطروحة، عامل الفعالية هنا يتعلق بسرعة تنفيذ هذا الحل ضمن مجال الذاكرة المسموح به، أية مسألة يوجد لها حل brute force ولكن هذا الحل غالباً مرفوض ﻷنه بطيء للغاية. في البرمجة التنافسية يمكن أن تواجهك مشاكل متعلقة بعلم الاحتمالات، طرائق العد، نظرية اﻷعداد، نظرية البيان، البرمجة الديناميكية… وغيرها من المجالات. ذكرنا سابقاً أن الكثير من الشركات العالمية تدعم البرمجة التنافسية، بل وتقيم أيضاً مسابقات سنوية في البرمجة التنافسية، من هذه المسابقات:
- ACM-ICPC (Association for Computing Machinery — International Collegiate Programming Contest).
- IOI (International Olympiad in Informatics).
- Facebook Hacker Cup.
- Google Code Jam.
- IEEEXtreme.
أين تكمن فوائد البرمجة التنافسية؟
ماكسيم بوزدالوف أحد أفراد فريق جامعة St. Petersburg State University of IT, Mechanics and Optics الذي أحرز كأس مسابقة ACM-ICPC عام 2009 [2] أحد المشاركين في تحضير سلسلة How to Win Coding Competitions: Secrets of Champions يعمل حالياً أستاذ مساعد ورئيس قسم تقنيات الحاسوب في الجامعة، تحدث عن تجربته مع البرمجة التنافسية وعن فوائد البرمجة التنافسية من أجل إيجاد النجاح في العمل الوظيفي، وشمل هذا في خمس نقاط رئيسية:
- البرمجة التنافسية تجعلك مرشحاً مرغوباً به من قبل الشركات الكبرى. المشاركة في مسابقة ACM-ICPC هو فرصة كبيرة حتى يتم ملاحظتك من قبل الشركات الكبرى مثل Apple, Facebook, Google, IBM حيث أن هذه الشركات تتابع مثل هذه الفعاليات بشكل دائم للبحث عن مواهب شابة، تعتبر هذه المسابقة هي اﻷكبر من نوعها في مجال المسابقات البرمجية والتي يشارك فيها طلاب جامعة شباب موهوبون، سابقاً شركات مثل IBM, Apple, AT&T and Microsoft كانت راعي رسمي للمسابقة، وتم تقديم الكثير من عقود العمل للفائزين, يضيف ماكسيم وعلى الرغم من أنني لم أعد أشارك في هذه المسابقات وأصبحت أشارك فقط في تدريب المتسابقين، إلا أنني لا أزال أتلقى الكثير من عروض العمل، وخاصة Google التي تراسلني سنويا.
- البرمجة التنافسية تجعلك سريع، وأكثر دقة.في المسابقات غالباً ما تكون تحت ضغط كبير، بشكل أساسي الوقت القصير وإلا سوف تخسر في المسابقة، إضافة إلى أنك يجب أن تكون مركزاً بشكل كبير على المشكلة المطلوبة، ليس فقط أن تحلها بشكل سريع وإنما بشكل صحيح أيضاً، وجميع هذه المهارات مفيدة في أي عمل، ليس فقط في البرمجة.
- البرمجة التنافسية تساعدك على حل المشاكل المعقدة.خلال التدريب للبرمجة التنافسية ستقوم بحل مشاكل المبرمجون العاديون غير قادرين على حلها, وهذا يساعدك في التحضير لأي عمل أو وظيفة, ﻷنه باستطاعتك أن تتكيف لحل العديد من المشاكل المختلفة, وفي ظروف مختلفة.
- البرمجة التنافسية تساعدك للعمل ضمن فريق.وهي مهارة هامة جداً، معظم الوظائف تتطلب في إحدى المراحل العمل مع فريق. البرمجة التنافسية تساعدك على كيفية العمل بشكل فعال مع الفريق، في معظم الحالات يتوجب عليك العمل مع فريقك لحل نفس المشكلة، وتساعدك على معرفة نقاط قوة وضعف فريقك وتمكنك من تقسيم العمل بشكل فعال معهم، أي فريق يحتاج إلى قائد سواء أكان ذلك في المكتب أو ضمن مسابقة برمجية، كقائد للفريق معرفة كيف تنظم وتحفز فريقك أمر هام للغاية، كمثال بسيط على ذلك ضمن مسابقات ACM-ICPC يجب أن يتم ترتيب الكراسي الخاصة بالفريق بطريقة صحيحة حتى يضمن للفريق الجلوس بشكل مريح، ويتيح التناقش بشكل فعال.
- التدريب والمشاركة تساعدك لتحضير سيرة ذاتية في مجال البرمجة.المشاركة في المسابقات البرمجية هو أمر يجب أن تذكره ضمن سيرتك الذاتية، كما ذكرت سابقاً وجود خبرة في البرمجة التنافسية يظهر لأرباب العمل أنك شخص قادر على العمل ضمن فريق، حل مشاكل معقدة، العمل في ظروف تحت ضغط كبير، متمكن من إدارة الوقت والمواعيد النهائية وتقليل اﻷخطاء, منضبط, ذو تركيز عال, وسريع في حل المشاكل[3].
البرمجة التنافسية ومقابلات العمل
ذكرت غايل لاكمان (مهندسة برمجيات عملت في قسم التوظيف في شركات كبرى مثل Microsoft, Apple and Google… ومؤسسة موقع CareerCup.com ) في مقدمة كتابها الشهير Cracking the coding interview قصة عن أحد المرشحين الذين قامت بمقابلتهن أثناء عملها في Google. لاكمان كانت هي من قامت بترشيحه، حائز على تقدير 3.73 GPA من جامعة واشنطون وعمل في تطوير العديد من المشاريع مفتوحة المصدر، ووصفته بكونه: إنسان نشيط، مبدع يعمل بجد، لقد كان فعلاً geek بكل المقاييس.
لكن على الرغم من كل هذا تم رفضه!!! تتابع لاكمان بقولها كما هو حال الكثير من المرشحين المتحمسين لقد حضر بشكل كبير، لقد قرأ كتاب K&R’s التقليدي بلغة ال C وراجع كتاب CLRS’ الشهير عن الخوارزميات، لقد كان قادراً على وصف أساليب موازنة شجرة بطرق لا تعد ولا تحصى، وكان قادراً على القيام بأشياء بلغة C لا يرغب أي مبرمج عاقل أن يقوم بها.
عندما سئل عن سبب الرفض اضطررت أن أخبره الحقيقة المؤسفة، هذه الكتب ليست كافية، الكتب اﻷكاديمية تحضرك من أجل حلقة بحثية رائعة، لكنها لا تساعدك في مقابلات العمل، لماذا؟ سأعطيك تلميح: إن من يقوم بمقابلتك لم يشاهد Red-Black Trees منذ أن كان في الجامعة.
الصورتان السابقتان من Table of Contents لكتاب لاكمان [4]، معظم الأفكار والعناوين السابقة هي بديهية للغاية ﻷي مبرمج مستواه لا يتعدى الـ Specialist في البرمجة التنافسية. بالطبع كونك متميز في البرمجة التنافسية لا يضمن لك النجاح دائماً في مقابلات العمل، الكثير من المقابلات تشتمل مواضيع كثيرة إضافية، لكن كونك ناجح في البرمجة التنافسية يساعدك كثيراً.
البرمجة التنافسية والعالم الواقعي
من أكثر القضايا المثيرة للجدل حول البرمجة التنافسية هي أنها مختلفة عن الواقع, البعض يقول بأن الأشخاص الذين لديهم خبرة فقط في مسابقات البرمجة يعانون كثيراً في سوق العمل, يجيب ميشيل دانيلسك ( مهندس برمجيات في https://monitora.cz/ [5]) عن هذا السؤال ويتحدث عن الجوانب السلبية للبرمجة التنافسية:
- البرمجة التنافسية مليئة بروح المنافسة, وتصبح مهووساً بالمنافسة, دائما ما ترغب في أن تكون اﻷفضل وتأدي بشكل أفضل من زملائك في المسابقات, في الحياة الواقعية هذا الشيء غير موجود.
- تعتاد على النجاح السريع، في البرمجة التنافسية تحصل على نتيجة عملك بعد بضع ساعات، أما في الحياة الواقعية تحتاج إلى شهور حتى ينتهي مشروعك وتحصل على المكافأة.
- لم تقم بشيء مفيد، ولا يمكنك أن تعرف الشعور حين يجرب الناس مشروعك ويستفيدون منه.
- لا يمكنك أن تكسب الكثير من المال (سأتحدث عن هذا الجانب مطولا بعد قليل).
- أنت تعرف لغات برمجة، لكنك لا تعرف الكثير من أطر العمل.
- في الحياة الواقعية يوجد الكثير من الأسباب حتى يكون حلك خاطئ، أكثر من مجرد Wrong Answer, Time Limit Exceeded or RuntimeError يمكن لحلك أن يكون صحيح بمفرده، ولكنك تعمل ضمن مشروع كبير، ويجب أن تحقق التوافق مع جميع مكونات المشروع.
- معرفة بسيطة بالبرمجة الكائنية التوجه، design patternes مفاهيم مثل الخوارزميات الجينية، تعليم الالة، معالجة الصورة، التعامل مع قواعد البيانات، Viterbi algorithm, Bloom filter… جميعها مفاهيم لا تصادفها في البرمجة التنافسية.[6]
البرمجة التنافسية والربح المادي
في الواقع يوجد ربح مادي من المشاركة في البرمجة التنافسية، ربما ليس كبيراً كما هو الحال في باقي المجالات ولكن سأذكر مجموعة من طرق الربح المادي في مجال البرمجة التنافسية:
- يحصل الفائزون في المسابقات على جوائز مادية، صحيح أنها محصورة فقط في أصحاب المراكز اﻷولى فقط، لكنها تبقى مصدر للربح، كمثال على ذلك يحصل الفريق الفائز في مسابقة Google Code Jam على مبلغ 15 ألف دولار أمريكي [7].
- المشاركة في الورشات التدريبية، سنوياً يوجد الكثير من الورشات التدريبية للبرمجة التنافسية، وبالطبع يحصل المدربون على حصة من المبالغ، كمثال على ذلك تكلفة Moscow Pre-Finals Workshop 2020 تصل حتى 820 دولار أمريكي [8].
- تحضير المسابقات للمواقع المختلفة، يدفع موقع Codeforces الروسي 400 دولار لمن يحضر مسابقة DIV. 1 و200 دولار لمسابقات ال DIV. 2 [9] موقع TopCoder يدفع أكثر من ذلك بكثير.
- كميل ديبوسكي, المعروف باسم Errichto كتب سابقاً [10]:
. Youtube and coding interview teaching are becoming my job.
بيتر نورفينغ
بيتر نورفينغ هو رئيس قسم الأبحاث في شركة Google في عام 2015 ضمن محاضرة بعنوان How Computers Learn سئل عن صحة اﻷخبار أن شركة Google تستخدم تقنيات الذكاء الصنعي في عملية التوظيف، جواب نورفينغ ذكر بأن Google استخدمت تقنيات الذكاء الصنعي لتقييم أداء الموظفين، واﻷمر تضمن مفاجأة له وللجميع, سأنقل الجواب من دون ترجمة حتى لا أخطئ في ترجمة شئء وأخل بالمعنى المقصود:
“One thing that was surprising to me was that being a winner at programming contests was a negative factor for performing well on the job. Which is surprising it doesn’t mean you guys should stop doing the contests, but I think what it meant was everybody that gets hired at google is pretty good, So if I just had to pick someone off the street, I really want that contest winner, I got to take him every time, or her. But if it’s somebody who passed the hiring bar, then they’re all pretty much at the same level. And maybe the ones used to winning the contest, they’re really used to going really, really fast and cranking the answer out and then moving on to the next thing and you perform better on the job if you’re a little more reflective and go slowly and make sure you get things right.
على الرغم من أن Google لم تنشر أي وثيقة حول هذا اﻷمر, اعتبر البعض أن جواب نورفينغ كان مجرد دراسة تمت بشكل سيء منذ أكثر من عقد من الزمن وبالتحديد في أوائل 2000s, والتي قررت جوجل عدم نشرها أو العمل بها [12]. بدليل استمرار مسابقة Google Code jam واستمرار عمليات التوظيف من قبل جوجل للأشخاص الفائزين في مسابقات البرمجة التنافسية أمثال بوهدان بروتشينكو المعروف ب I_love_Tanya_Romanova [13] وبيتر ميتريتشيف [14], أراء إضافية حول هذا الموضوع مذكورة ضمن هذا النقاش على موقع Codeforces.
بعد كل هذا، هل يجب أن أمارس البرمجة التنافسية؟
سأعرض هنا رأيي في هذا اﻷمر من دون الاستعانة بمراجع إضافية، وسأقسم هذا السؤال إلى أربع فئات:
- طلاب المدارس، البرمجة التنافسية أمر ضروري لتنمية مهارات التفكير النقدي لدى طلاب المدارس في مرحلة مبكرة، إضافة إلى أن المشاركة في أولمبياد المعلوماتية تساعد في الحصول على منح من الكثير من الجامعات. كمثال على ذلك جامعة واترلو قدمت العام الماضي منح دراسية مخصصة فقط للطلاب أصحاب الميداليات في أولمبياد الرياضيات والمعلوماتية [15].
- طلاب الهندسة والرياضيات في سنين الدراسة اﻷولى, مسابقة ACM-ICPC تساعد الطلاب في هذه المرحلة في بناء سيرة ذاتية قوية والاختلاط مع مجتمع المبرمجين أكثر. غالبية المقررات الدراسية في سنين الدراسة اﻷولى تكون سهلة وغير مرتبطة كثيراً بالاختصاص، لا تقلق دع التفكير بسوق العمل لأوقات أخرى.
- الباحثين عن عمل، كما ذكرنا سابقاً البرمجة التنافسية مهمة في التحضير لمقابلات العمل، أي مقابلة تحتوي على coding interview ستكون بسيطة للغاية لمن يتقن البرمجة التنافسية.
- لمن لديه عمل، مارس البرمجة التنافسية في وقت فراغك طالما تجدها أمراً ممتع 😀
خاتمة
بدأت بممارسة البرمجة التنافسية منذ خمس سنين, اكتسبت بفضلها خبرات كبيرة, وساعدتني على تعزيز ثقتي بنفسي, لحظات عالية من التنافسية عشتها بعضها نجحت بها والبعض اﻷخر فشلت بها وعلمتني الكثير, تعرفت على الكثير من اﻷشخاص العظيمين والمؤثرين ليس فقط في جامعتي ولا في بلدي بل في بلدان أخرى, لدي أصدقاء كثر من الأردن, مصر, تونس, روسيا, إيطاليا, الصين… جميعهم تعرفت عليهم بفضل البرمجة التنافسية, حصلت خلال دراستي على بعض عروض العمل المقبولة بفض مشاركاتي في المسابقة البرمجية, صحيح أحياناً أشعر بأنني أعطيتها مساحة أكبر وكان يتوجب علي أن أبحث عن مصدر للدخل مثل باقي زملائي, ولكني أصبحت واثقاً من قدرتي على تعلم أي مجال أخر في زمن ضيق والحصول بسهولة على عرض عمل أكثر إغرائاً.
References:
[1] https://en.wikipedia.org/wiki/Competitive_programming
[2] https://icpc.baylor.edu/community/history-icpc-2009
[3] https://blog.edx.org/5-career-benefits-of-competitive-programming/
[4] GAYLE LAAKMANN, “CRACKING THE CODING INTERVIEW” 2010, pp: 5.
[5] https://www.quora.com/profile/Michal-Danilák
[6] https://www.quora.com/What-are-the-advantages-and-disadvantages-of-having-only-competitive-programming-experience
[7] https://codingcompetitions.withgoogle.com/codejam
[8] https://it-edu.com/en/acm-menu/about-workshops/spring-training-2020
[9] https://codeforces.com/blog/entry/59136
[10] https://codeforces.com/blog/entry/75985?#comment-603722
[11] https://youtu.be/T1O3ikmTEdA?t=4260
[12] https://news.ycombinator.com/item?id=9324513
[13] https://codeforces.com/profile/I_love_Tanya_Romanova
[14] https://codeforces.com/profile/Petr
[15] https://uwaterloo.ca/undergraduate-entrance-awards/awards/mathematics-olympiad-scholarship Technology