مكود مكود

آخر الأخبار

جاري التحميل ...

دليل المبتدئين للتفكير الخوارزمي في البرمجة


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

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

إذا كانت تراودك أي من هذه الأفكار ، أو تشعر أنك لا يمكن أن تكون مبرمجا حقيقيًا إلا إذا كنت تعرف الخوارزميات ، فأنت لست وحدك ، فهناك الكثير من الناس الذين يعتبرون الخوارزميات و هياكل البيانات Algorithms and data structures مصدر قلق كبير في عالم تطوير البرمجيات . 

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


لماذا يجب عليك أن تستخدم التفكير الخوارزمي ؟


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

إن الطريقة التي تتعامل بها مع الأشياء تختلف كثيرا عن الطريقة التي يستخدمها الحاسوب ، و السبب أننا قمنا جميعا بتطوير اختصارات و افتراضات و قواعد مبهمة نستخدمها لمساعدتنا في حل المشكلات اليومية التي تعترضنا دون التفكير فيها ، و لذلك و بشكل مدهش نجد صعوبة في التصرف مثلما يتصرف الحاسوب !

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

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

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

فكيف تفكر خوارزميًا ؟!

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

  • تحديد المشكلة بوضوح
  • تقسيم المشكلة إلى أجزاء صغيرة وبسيطة
  • إيجاد حل لكل جزء من أجزاء المشكلة
  • تنفيذ الحل
  • وأخيرا تطوير الحل و جعله فعالاً


ولكن انتظر لحظة أيها القبطان ، ما هي الخوارزمية بالضبط ؟


وأيضا لماذا يجب أن أهتم بها ؟

شخصيا قبل أن أبدأ في تعلم الخوارزميات ، شعرت بالخوف ، و شعرت بأن الخوارزميات أشياء معقدة و يصعب تعلمها ، شعرت بأنها معقدة و تتجاوز قدرتي على الفهم . وكنت متأكدًا جدًا من أهمية معرفتها ( حيث بدت مهمة بالتأكيد ) لكنني لم أكن أعرف أفضل طريقة لمعرفة المزيد عن هذا الموضوع .

في حياتنا اليومية ، عادة ما نسمع عن الخوارزميات الجديدة لشركات التكنولوجيا باستمرار مثل خوارزميات البحث الجديدة لدى Google و خوارزميات تعديل الـ PageRank ، و أيضا نسمع عنها في المواقع المختصة بعلوم الحاسوب و البرمجة و في مقابلات العمل حيث يتم إبلاغنا باستمرار عن مدى أهميتها و تعقيدها .. و في الغالب نسمع عنها من قبل أشخاص في وسائل الإعلام والتواصل لا يعرفون الكثير عنها .

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

في رأيي ، " الخوارزمية " هو مصطلح عام له وزن زائد عن حده في عالم تطوير البرمجيات ، الحقيقة البسيطة هي أن الخوارزميات هي مجرد طرق لفعل الأشياء ، إنها عمليات لحل المشاكل المختلفة . مثلا يمكن أن ننشئ خوارزمية لـ :

  • البحث عن كلمة في قاموس
  • فرز قائمة من الأرقام
  • توليد تسلسل ترتيبي
  • ترجمة كلمة من لغة إلى أخرى
  • غسل ملابسك

الآن ، لكي نكون منصفين ، هناك العديد من الخوارزميات التي تتصدر الأخبار التقنية هذه الأيام و التي يمكن نصفها بأنها مثيرة للإعجاب و معقدة و تتطلب معرفة عميقة بعلوم الكمبيوتر ، و تعلم الآلة Machine Learning ، و الرياضيات .. إلى آخره .

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

لكي تبدأ في التفكير خوارزميًا ، بإمكانك البدئ بمواجهة التحديات التي تعترضك في البرمجة عبر اتباع إحدى الطريقتين كخيار أول لك ؛ إما تفكيك المشكلة في البداية ، أو بناء الحل مباشرة .

لكنّ مَيلنا الطبيعي كمبرمجين هو بناء الحل أولاً ، و رغم ذلك أفضّل صراحة أن أبدأ عبر تفكيك المشكلة ثم بعد ذلك بناء الحل .


قسم المشكلة إلى أجزاء لكي تبني خوارزمية


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

كمثال خذ مشكلة البحث عن معنى كلمة "يُرفرف" في القاموس مثلا ، حيث يجب أن يكون معناها في هذا القاموس "يحلق" . في هذه الحالة لكي نصوغ خوارزمية تبحث لنا عن هذه الكلمة يجب علينا أن نعرف :

  1. أين و كيف يجب أن نبدأ البحث ؟
  2. متى وكيف نوقف البحث ؟
  3. كيف نقارن بين عنصرين لكي نعلم أيهما هو الاختيار الصحيح 
  4.  كيفية مواصلة البحث عندما لا نجد العنصر المستهدف بعد

وكلما كانت الخوارزمية أفضل كلما كان الوقت الذي تستغرقه للبحث بين العناصر سريعا . بالنسبة لمشكلة البحث في القاموس الخاصة بنا فيمكننا التوسع و التفصيل في الخطوات الأربعة أعلاه و تقسيم هذه المشكلة إلى أجزاء أصغر :

  1. الترتيب الذي يجب أن تكون عليه الكلمات (أي ترتيبها وفق الأبجدية العربية مثلا)
  2. كيفية مقارنة كلمتين مختلفتين وتحديد أيهما يجب أن يكون الإختيار الصحيح - وهذا مرتبط بالنقطة الأولى .
  3. كيف نعرف أننا وجدنا الكلمة المستهدفة
  4. كيف نعرف أن الكلمة ليست في القاموس الذي لدينا

والآن لنحاول أن نفهم كيف تعمل هذه الخوارزمية التي كتبنا في أربعة أجزاء :

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

بالنسبة للنقطة الثالثة وهي كيف نعرف أننا وجدنا الكلمة التي نبحث عنها ، بطبيعة الحال سنعلم ذلك عندما تكون الكلمة موضع بحثنا ( القاموس ) مطابقة تماما لكلمة البحث الخاصة بنا . و بالطبع يمكن لمعظم لغات البرمجة في هذه الأيام معرفة ما إذا كانت الكلمتين متشابهتين أم لا عبر استخدام أدوات برمجية مثل البنيات الشرطية في اللغة .

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

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


كيفية بناء خوارزمية في خطوات بسيطة


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

وخلال طريقك في مواجهة مشكلة برمجية فإنه قد يكون من المغري جدا أن تبدأ برنامجك بمحاولة بناء الحل مباشرة من دون أي تحليل أو تخطيط ، أنا أيضا كنت أفعل ذلك .. إن بناء حل للمشكلة هو المرحلة الأساسية خلال عملية البرمجة بأكملها ، لذلك فإنه من المنطقي أننا نريد عادة أن نبدأ مباشرة بالحل .

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

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

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

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

في حالة البحث عن كلمة في القاموس ، قد أقوم بإنشاء حل مثل هذا :

  1. أكتب حلقة تكرارية / دالة Function تقوم بوظيفة البحث
  2. اكتب كود يقوم بالخروج من الحلقة / الدالة أو إنهائها في حالة ما إذا تم العثور على الكلمة  
  3. اكتب كود للخروج من الحلقة إذا لم يتم العثور على الكلمة في حالة قمت بالبحث في القاموس بأكمله
  4. اكتب كود يقرر طريقة البحث التالي إذا لم يتم العثور على الكلمة والقاموس لم ينتهي بعد


تعتبر خوارزميات البحث والفرز مراحل جيدة للبدء في التعامل مع التفكير الخوارزمي لأنها مرتبطة فيما بينها و سهلة التعلم ويمكنها أن تساعدك في الكثير من النواحي في مجال البرمجة .

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

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

امنح نفسك الوقت لتجربة الحلول المختلفة التي تخطر على بالك و حاول أن تقبل حقيقة أنك قد تضطر إلى المحاولة عدة مرات لجعل البرنامج يعمل ، ثم مرات أكثر لجعله فعالا و نظيفا .

كيف تطور تفسك في الخوارزميات ؟


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

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


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

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

في مقدمة مجلده الثالث " فن برمجة الكمبيوتر" يقول دونالد نوث إنه يعتقد أن البحث و الفرز هي محطات رائعة للبدء في تعلم الخوارزميات لأنها تجعلك تفكر في :

  • كيف يتم إنشاء خوارزميات جديدة ؟
  • كيف يمكن تحسين الخوارزميات ؟
  • كيف يمكنك تحديد كفاءة الخوارزمية ؟
  • كيف يمكنك الاختيار بين خوارزميات مختلفة وأي منها أفضل ؟

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

فيما يلي بعض خوارزميات البحث والفرز الهامة التي يجب على كل مطور فهمها :

  1. البحث Searching

  • بحث خطي Linear search
  • بحث ثنائي Binary search

2. الفرز Sorting

  • فرز إدراج Insertion sort
  • فرز إختيار Selection sort
  • فرز فقاعة Bubble sort
  • فرز كومة Heap sort
  • فرز دمجي Merge sort
  • فرز سريع Quick sort


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

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


كتب لتعلم الخوارزميات :


فيما يلي بعض الكتب التي يمكنك استخدامها لمعرفة المزيد حول الخوارزميات و التعرف على خوارزميات أخرى إضافية في حالة إذا كنت تريد دراستها عن كثب :

  • البحر الشاسع لدخول الخوارزميات من بابها الواسع من تأليف خالد السعداني ( باللغة العربية )
  • مقدمة عن الخوارزميات من تأليف Thomas H. Cormen و Charles E. Leiserson ( باللغة الإنجليزية )
  • الخوارزميات من تأليف Robert Sedgewick و Kevin Wayne ( باللغة الإنجليزية )
  • فن برمجة الكمبيوتر من تأليف  Donald Knuth ( باللغة الإنجليزية ) 

أخيرا ... 

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

التعليقات



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

إتصل بنا

الهدف :

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