برمجة

معلومات عن البرمجة التنافسية

معلومات عن البرمجة التنافسية
شارك هذا

البرمجة التنافسية

البرمجة التنافسية هي رياضة عقلية تقام عادة على الإنترنت أو ضمن شبكة محلية، متضمنة مجموعة من المتسابقين يحاولون كتابة برامج وفقاً لمعطيات محددة ومقدمة، البرمجة التنافسية مدعومة بشكل كبير من قبل الكثير من الشركات العالمية، أمثال google, Facebook… المسابقة البرمجية تتضمن بشكل عام مجموعة من المشاكل المنطقية والرياضية المقدمة للمتسابقين، والذين يطلب منهم كتابة برامج قادرة على حل كل مشكلة. إضافة إلى التعريف السابق أود أن أذكر أيضاً أن المشاكل المطلوب حلها هي مشاكل تم حلها مسبقاً من قبل لجنة التحكيم وفقاً للحدود المعطاة في المشكلة، بمعنى أن المتسابقين يطلب منهم التفكير في إيجاد حلول لمشاكل لها حل مسبق، وليس كغير مسابقات يطلب فيها إيجاد حلول لمشاكل لا حل لها.

المشاكل التي يطلب حلها بشكل عام عبارة عن مشاكل منطقية ورياضية متعلقة بعلوم الحاسب، وتتطلب معرفة موسعة بالخوارزميات وبنى المعطيات، يطلب من المتسابقين كتابة كود برمجي بأية لغة برمجية وظيفة هذا الكود هو إيجاد حل صحيح وفعال للمشكلة المطروحة، عامل الفعالية هنا يتعلق بسرعة تنفيذ هذا الحل ضمن مجال الذاكرة المسموح به، أية مسألة يوجد لها حل 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 [1]https://icpc.baylor.edu/community/history-icpc-2009 أحد المشاركين في تحضير سلسلة How to Win Coding Competitions: Secrets of Champions يعمل حالياً أستاذ مساعد ورئيس قسم تقنيات الحاسوب في الجامعة، تحدث عن تجربته مع البرمجة التنافسية وعن فوائد البرمجة التنافسية من أجل إيجاد النجاح في العمل الوظيفي، وشمل هذا في خمس نقاط رئيسية:

ماكسيم بوزدالوف
ماكسيم بوزدالوف
  1. البرمجة التنافسية تجعلك مرشحاً مرغوباً به من قبل الشركات الكبرى. المشاركة في مسابقة ACM-ICPC هو فرصة كبيرة حتى يتم ملاحظتك من قبل الشركات الكبرى مثل Apple, Facebook, Google, IBM حيث أن هذه الشركات تتابع مثل هذه الفعاليات بشكل دائم للبحث عن مواهب شابة، تعتبر هذه المسابقة هي اﻷكبر من نوعها في مجال المسابقات البرمجية والتي يشارك فيها طلاب جامعة شباب موهوبون، سابقاً شركات مثل IBM, Apple, AT&T and Microsoft كانت راعي رسمي للمسابقة، وتم تقديم الكثير من عقود العمل للفائزين, يضيف ماكسيم وعلى الرغم من أنني لم أعد أشارك في هذه المسابقات وأصبحت أشارك فقط في تدريب المتسابقين، إلا أنني لا أزال أتلقى الكثير من عروض العمل، وخاصة Google التي تراسلني سنويا.
  2. البرمجة التنافسية تجعلك سريع، وأكثر دقة. في المسابقات غالباً ما تكون تحت ضغط كبير، بشكل أساسي الوقت القصير وإلا سوف تخسر في المسابقة، إضافة إلى أنك يجب أن تكون مركزاً بشكل كبير على المشكلة المطلوبة، ليس فقط أن تحلها بشكل سريع وإنما بشكل صحيح أيضاً، وجميع هذه المهارات مفيدة في أي عمل، ليس فقط في البرمجة.
  3. البرمجة التنافسية تساعدك على حل المشاكل المعقدة. خلال التدريب للبرمجة التنافسية ستقوم بحل مشاكل المبرمجون العاديون غير قادرين على حلها, وهذا يساعدك في التحضير لأي عمل أو وظيفة, ﻷنه باستطاعتك أن تتكيف لحل العديد من المشاكل المختلفة, وفي ظروف مختلفة.
  4. البرمجة التنافسية تساعدك للعمل ضمن فريق. وهي مهارة هامة جداً، معظم الوظائف تتطلب في إحدى المراحل العمل مع فريق. البرمجة التنافسية تساعدك على كيفية العمل بشكل فعال مع الفريق، في معظم الحالات يتوجب عليك العمل مع فريقك لحل نفس المشكلة، وتساعدك على معرفة نقاط قوة وضعف فريقك وتمكنك من تقسيم العمل بشكل فعال معهم، أي فريق يحتاج إلى قائد سواء أكان ذلك في المكتب أو ضمن مسابقة برمجية، كقائد للفريق معرفة كيف تنظم وتحفز فريقك أمر هام للغاية، كمثال بسيط على ذلك ضمن مسابقات ACM-ICPC يجب أن يتم ترتيب الكراسي الخاصة بالفريق بطريقة صحيحة حتى يضمن للفريق الجلوس بشكل مريح، ويتيح التناقش بشكل فعال.
  5. التدريب والمشاركة تساعدك لتحضير سيرة ذاتية في مجال البرمجة. المشاركة في المسابقات البرمجية هو أمر يجب أن تذكره ضمن سيرتك الذاتية، كما ذكرت سابقاً وجود خبرة في البرمجة التنافسية يظهر لأرباب العمل أنك شخص قادر على العمل ضمن فريق، حل مشاكل معقدة، العمل في ظروف تحت ضغط كبير، متمكن من إدارة الوقت والمواعيد النهائية وتقليل اﻷخطاء, منضبط, ذو تركيز عال, وسريع في حل المشاكل.[2]https://blog.edx.org/5-career-benefits-of-competitive-programming/

البرمجة التنافسية ومقابلات العمل

البرمجة التنافسية ومقابلات العمل
البرمجة التنافسية ومقابلات العمل

ذكرت غايل لاكمان (مهندسة برمجيات عملت في قسم التوظيف في شركات كبرى مثل Microsoft, Apple and Google… ومؤسسة موقع CareerCup.com ) في مقدمة كتابها الشهير Cracking the coding interview قصة عن أحد المرشحين الذين قامت بمقابلتهن أثناء عملها في Google. لاكمان كانت هي من قامت بترشيحه، حائز على تقدير 3.73 GPA من جامعة واشنطون وعمل في تطوير العديد من المشاريع مفتوحة المصدر، ووصفته بكونه: إنسان نشيط، مبدع يعمل بجد، لقد كان فعلاً geek بكل المقاييس.

لكن على الرغم من كل هذا تم رفضه!!! تتابع لاكمان بقولها كما هو حال الكثير من المرشحين المتحمسين لقد حضر بشكل كبير، لقد قرأ كتاب K&R’s التقليدي بلغة ال C وراجع كتاب CLRS’ الشهير عن الخوارزميات، لقد كان قادراً على وصف أساليب موازنة شجرة بطرق لا تعد ولا تحصى، وكان قادراً على القيام بأشياء بلغة C لا يرغب أي مبرمج عاقل أن يقوم بها.

عندما سئل عن سبب الرفض اضطررت أن أخبره الحقيقة المؤسفة، هذه الكتب ليست كافية، الكتب اﻷكاديمية تحضرك من أجل حلقة بحثية رائعة، لكنها لا تساعدك في مقابلات العمل، لماذا؟ سأعطيك تلميح: إن من يقوم بمقابلتك لم يشاهد Red-Black Trees منذ أن كان في الجامعة.

البرمجة التنافسية والحياة الواقعية

البرمجة التنافسية والعالم الواقعي
البرمجة التنافسية والعالم الواقعي

من أكثر القضايا المثيرة للجدل حول البرمجة التنافسية هي أنها مختلفة عن الواقع, البعض يقول بأن الأشخاص الذين لديهم خبرة فقط في مسابقات البرمجة يعانون كثيراً في سوق العمل, يجيب ميشيل دانيلسك ( مهندس برمجيات في https://monitora.cz/) عن هذا السؤال ويتحدث عن الجوانب السلبية للبرمجة التنافسية:

  • البرمجة التنافسية مليئة بروح المنافسة, وتصبح مهووساً بالمنافسة, دائما ما ترغب في أن تكون اﻷفضل وتأدي بشكل أفضل من زملائك في المسابقات, في الحياة الواقعية هذا الشيء غير موجود.
  • تعتاد على النجاح السريع، في البرمجة التنافسية تحصل على نتيجة عملك بعد بضع ساعات، أما في الحياة الواقعية تحتاج إلى شهور حتى ينتهي مشروعك وتحصل على المكافأة.
  • لم تقم بشيء مفيد، ولا يمكنك أن تعرف الشعور حين يجرب الناس مشروعك ويستفيدون منه.
  • لا يمكنك أن تكسب الكثير من المال (سأتحدث عن هذا الجانب مطولا بعد قليل).
  • أنت تعرف لغات برمجة، لكنك لا تعرف الكثير من أطر العمل.
  • في الحياة الواقعية يوجد الكثير من الأسباب حتى يكون حلك خاطئ، أكثر من مجرد Wrong Answer, Time Limit Exceeded or RuntimeError يمكن لحلك أن يكون صحيح بمفرده، ولكنك تعمل ضمن مشروع كبير، ويجب أن تحقق التوافق مع جميع مكونات المشروع.
  • معرفة بسيطة بالبرمجة الكائنية التوجه، design patternes مفاهيم مثل الخوارزميات الجينية، تعليم الالة، معالجة الصورة، التعامل مع قواعد البيانات، Viterbi algorithm, Bloom filter… جميعها مفاهيم لا تصادفها في البرمجة التنافسية.[3]https://www.quora.com/What-are-the-advantages-and-disadvantages-of-having-only-competitive-programming-experience

البرمجة التنافسية والربح المادي

البرمجة التنافسية والربح المادي
البرمجة التنافسية والربح المادي

في الواقع يوجد ربح مادي من المشاركة في البرمجة التنافسية، ربما ليس كبيراً كما هو الحال في باقي المجالات ولكن سأذكر مجموعة من طرق الربح المادي في مجال البرمجة التنافسية:

  • يحصل الفائزون في المسابقات على جوائز مادية، صحيح أنها محصورة فقط في أصحاب المراكز اﻷولى فقط، لكنها تبقى مصدر للربح، كمثال على ذلك يحصل الفريق الفائز في مسابقة Google Code Jam على مبلغ 15 ألف دولار أمريكي [4]https://codingcompetitions.withgoogle.com/codejam.
  • المشاركة في الورشات التدريبية، سنوياً يوجد الكثير من الورشات التدريبية للبرمجة التنافسية، وبالطبع يحصل المدربون على حصة من المبالغ، كمثال على ذلك تكلفة Moscow Pre-Finals Workshop 2020 تصل حتى 820 دولار أمريكي [5]https://it-edu.com/en/acm-menu/about-workshops/spring-training-2020.
  • تحضير المسابقات للمواقع المختلفة، يدفع موقع Codeforces الروسي 400 دولار لمن يحضر مسابقة DIV. 1 و200 دولار لمسابقات ال DIV. 2 [6]https://codeforces.com/blog/entry/59136 موقع TopCoder يدفع أكثر من ذلك بكثير.
  • كميل ديبوسكي, المعروف باسم Errichto كتب سابقاً [7]https://codeforces.com/blog/entry/75985?#comment-603722:
بيتر نورفينغ

بيتر نورفينغ هو رئيس قسم الأبحاث في شركة Google في عام 2015 ضمن محاضرة بعنوان How Computers Learn سئل عن صحة اﻷخبار أن شركة Google تستخدم تقنيات الذكاء الصنعي في عملية التوظيف، جواب نورفينغ ذكر بأن Google استخدمت تقنيات الذكاء الصنعي لتقييم أداء الموظفين، واﻷمر تضمن مفاجأة له وللجميع, سأنقل الجواب:

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

على الرغم من أن Google لم تنشر أي وثيقة حول هذا اﻷمر, اعتبر البعض أن جواب نورفينغ كان مجرد دراسة تمت بشكل سيء منذ أكثر من عقد من الزمن وبالتحديد في أوائل 2000s, والتي قررت جوجل عدم نشرها أو العمل بها [8]https://news.ycombinator.com/item?id=9324513. بدليل استمرار مسابقة Google Code jam واستمرار عمليات التوظيف من قبل جوجل للأشخاص الفائزين في مسابقات البرمجة التنافسية أمثال بوهدان بروتشينكو المعروف ب I_love_Tanya_Romanova [9]https://codeforces.com/profile/I_love_Tanya_Romanova وبيتر ميتريتشيف [10]https://codeforces.com/profile/Petr, أراء إضافية حول هذا الموضوع مذكورة ضمن هذا النقاش على موقع Codeforces.

هل يجب أن يمارس البرمجة التنافسية كل شخص؟

دعنا نقسم هذا السؤال إلى أربع فئات:

  1. طلاب المدارس، البرمجة التنافسية أمر ضروري لتنمية مهارات التفكير النقدي لدى طلاب المدارس في مرحلة مبكرة، إضافة إلى أن المشاركة في أولمبياد المعلوماتية تساعد في الحصول على منح من الكثير من الجامعات. كمثال على ذلك جامعة واترلو قدمت العام الماضي منح دراسية مخصصة فقط للطلاب أصحاب الميداليات في أولمبياد الرياضيات والمعلوماتية [11]https://uwaterloo.ca/undergraduate-entrance-awards/awards/mathematics-olympiad-scholarship.
  2. طلاب الهندسة والرياضيات في سنين الدراسة اﻷولى, مسابقة ACM-ICPC تساعد الطلاب في هذه المرحلة في بناء سيرة ذاتية قوية والاختلاط مع مجتمع المبرمجين أكثر. غالبية المقررات الدراسية في سنين الدراسة اﻷولى تكون سهلة وغير مرتبطة كثيراً بالاختصاص، لا تقلق دع التفكير بسوق العمل لأوقات أخرى.
  3. الباحثين عن عمل، كما ذكرنا سابقاً البرمجة التنافسية مهمة في التحضير لمقابلات العمل، أي مقابلة تحتوي على coding interview ستكون بسيطة للغاية لمن يتقن البرمجة التنافسية.
  4. لمن لديه عمل، مارس البرمجة التنافسية في وقت فراغك طالما تجدها أمراً ممتعًا.
المراجع    [ + ]
السابق
الانترنت: معلومات بشكل مبسط
التالي
بايثون:معالجة الصور بمكتبة opencv