خوارزميات يجب على كل مبرمج ان يجيد صناعتها و التعامل معها

خوارزميات يجب على كل مبرمج ان يجيد صناعتها و التعامل معها

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

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

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


خوارزميات يجب على كل مبرمج ان يجيد صناعتها و التعامل معها


- الـ Sort Algorithms ( عمليات تنظيم / تصنيف ) : 

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

  • إليك بعض إيجابيات تعلم خوارزميات التصنيف : أول شيئ تسهيل عملية البحث التي ستكون أسرع إن كانت البيانات مصنفة بالترتيب، ستساعدك كذلك على إظهار المعطيات او البيانات بأنماط متعددة للمستخدم ( مثلا تصنيف البيانات عن طريق تاريخ الإضافة سيسهل على مستخدم برمجيتك معرفة البيانات المدخلة مؤخرا و المدخلة سابقا )، و تصنيف البيانات يساعدك أنت أيضا على ضبط هيكلة البيانات التي يتم تخزينها او إظهارها. 
  • إليك بعض أنواع الـ Sort Algorithms الشهيرة : يوجد العديد من الخوارزميات الخاصة بالتصنيف و لكل خوارزمية إستخداماتها الخاصة و طريقتها في التصنيف، و يجب عليك إختيار الخوارزمية الأكثر ملائمة لمشروعك البرمجي او حسب نوع المعلومات التي تجلبها و ضخامتها، من بين أشهر هذه الخورزميات الـ Insertion sort التي تقوم بتصنيف كل معطى مع الآخر و تغيير أماكنهم في حالة كان المعطى المقارن أصغر من المقارن به، خوارزمية الـ selection sort التي تعتبر بطيئة قليلا بحكم عملها الذي يعتمد على مقارنة كل معطى مع كل المعطيات الاخرى و إيجاد مكانه المناسب و أخذه، كل من الـ Insertion و الـ Selection يعتبران بدائيين او يمارسهما كل مستجد في مجال الخوارزميات و البرمجة و علوم الحاسوب عامة، لكن يوجد خوارزميات أكثر تقدما مثل Merge sort، الـ Heapsort، الـ Quicksort ثم الـ Shellsort، يمكنك ان تتعمق فيهما أكثر بعد إيجادك لأساسيات الـ Sort و التنظيم و التصنيف. 
إقرأ أيضا : أقوى و أفضل 20 مصدر لتعلم، فهم و إحتراف التعامل مع الخوارزميات " Algorithm "


- الـ Search Algorithms ( عمليات البحث ) : 

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

  • إليك بعض إيجابيات تعلم خوارزميات البحث : البحث و التنقيب من الأشياء التي ستتعامل معها كثيرا في مشاريعك البرمجية، لا يوجد أي موقع، تطبيق، برمجية سطح مكتب و غيرها لا تتضمن خاصية البحث، و كلما كان البحث أسرع كانت تجربة الإستخدام لموقع أفضل، ليس هذا فقط، في هيكلة البيانات (Data Structure) على برمجيتك ان تمتاز بسرعة " فلاش " خصوصا حين يكون لديك ملايين المعطيات و عليك التنقيب بينها، السرعة و الخفة يدلان على المهارة و الإحترافية. 
  • إليك بعض أنواع الـ Search Algorithms الشهيرة : قد طور بعض المحنكين مجموعة من الخوارزميات الخاصة بالبحث منها السريعة و منها البطيئة، منها التي يتم إستخدامها في برمجيات كبرى الخاصة بجلب بيانات كبيرة و منها المتوسطة او الضعيفة، لعل أشهرها و اكثرها إستخداما الـ Linear Search و هو حين نتحقق من كل عنصر لدينا في Array مثلا او في جدول و نقارن كل عنصر مع العنصر الذي نبحث عنه، يتوقف البحث حين يتم إيجاده، او خوارزمية Binary Search التي إستعرضناها مسبقا في احدى منشوراتنا على صفحتنا على فيسبوك التي تقوم بالأساس على تنظيم أولا المعطيات في الـ Array او الجدول ثم تقسيمه الى قسمين و محاولة إيجاد القسم الذي يضم القيمة التي نبحث عنها، يتم تقسيم النصف الآخر و هكذا دواليك الى حين إيجاد القيمة المبحوث عنها، لعل هذين الطريقتين الاكثر شهرة، لكن يوجد خوارزميات واسعة الحيلة كذلك مثل Depth first search و Breadth First search، يمكنك الإعتماد عليها او إبتكار خوارزميتك الخاصة في البحث. 

قبل ان نستمر في شرحنا هذا، نود التنويه الا انه حين نتحدث عن الخوارزميات فإننا كذلك ندمج هياكل البيانات او الـ Data Structures، أي ان اردت تطبيق مثلا الـ Linear Search و الـ Binary Search في برمجيتك قد لا تجد هناك اختلاف في السرعة كون ان برمجيتك لازالت بدائية، لكن في برمجيات عملاقة فانت تحتاج الى دراسة الـ Complexity و الذي يتكون من أسوأ سيناريو، السيناريو المتوسط و أفضل سيناريو يمكن ان تمر به حالة البحث و يرمز لها بالـ Big O notation، اذ توجب عليك إيجاد الخوارزمية الأفضل من ناحية السيناريو من أجل تطبيقها. 

- الـ Hash Algorithms ( خوارزميات التشفير ) : 



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



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


  • إليك بعض إيجابيات تعلم خوارزميات التشفير: أولا الحماية، نحن نعلم ان خطأ بسيط قد يؤدي الى تسريب بيانات مجموعة من المستخدمين لبرمجيتنا، شاهدنا كيف ان شركة ياهو Yahoo قد تدمرت بسبب تسريبات متتالية لبياناتها لضعف الحماية، كما ان بعض البيانات لا نستطيع السماح لأي شخص بالولوج إليها و ان كان صاحب البرمجية بنفسها مثل كلمات السر الخاصة بالمستخدمين، او الرسائل أيضا  التي يتم تبادلها بين طرفين يستخدمان البرمجية و هكذا، التشفير جيد، و مهم أيضا و قد وضحنا في مقال كامل عن التشفير و الـ Cryptography اهميته و ضرورياته. 
  • إليك بعض أنواع الـ Hash Algorithms الشهيرة : لأكون صريحا معك، يستطيع أي شخص إبتكاره خوارزميته في التشفير، إذ يمكنني مثلا ان اقوم بجعل أي مدخل يقوم المستخدم بإدخاله و لنقل كلمة سر مكونة من أرقام، ان اقوم بضربها في العدد 852 مثلا، فإن ادخل كلمة سر مثل : 1258 سيتم تخزين قيمة 1071816، فحتى إن اطلع احد على كلمة السر و جربها سيجد انها غير صحيحة، و الطريقة الوحيدة لفك تشفيرها هي إعادة قسمة كلمة السر على 852، هذا بحد ذاته خوارزمية تشفير، لكنها ضعيفة و بسيطة و بدائية جدا، من بين أشهر خوارزميات التشفير يوجد الـ MD5 التي أكل عليها حاليا الزمن و هرم عليها الدهر، فحتى ان كانت خوارزمية تشفير قوية سابقا، إلا انه الآن يمكنك فقط البحث عن القيمة الناتجة بالـ MD5 في جوجل و ستجد فك تشفيرها في ظرف ثانية، يوجد خوارزمية الـ SHA التي تتكون هي الأخرى من عدة نسخ بداية بـ SHA0، هذه الخوارزميات جاهزة مسبقا و يكفي فقط الإطلاع عليها و فهم آلية عملها في الوقت الراهن. 

- خوارزميات الـ String ( التعامل مع الأحرف و الكتابة ) : 

ان التعامل مع الأرقام في عالم البرمجة و الخوارزميات لا يشوبه شائب، إذ ان اضفت 2 الى 5 ستحصل على ناتج 7، إن قمت بمقارنة من الأكبر بينهما ستحصل على نتيجة 5 أكبر من 2، إن اردت إجراء أي نوع عمليات على الرقمين فلن تجد أي مشكلة، لكن ماذا عن الأحرف و الكتابات و التي سنرمز لها خلال هذه الفقرة بالـ Strings، كيف يمكننا المقارنة بينهما ؟ او إرغام المستخدم على إدخال قيمة محددة من الـ String ؟ هنا علينا معرفة بعض الخوارزميات الخاصة بالتعامل مع المدخلات من نوع String
  • إليك بعض إيجابيات تعلم خوارزميات التعامل مع الـ String : قد تود من المستخدم ان يدخل بريد إلكتروني من اجل تسجيله و قد لا يفعل ذلك، قد يقوم بإدخال اي عبارات كيفما كانت و هنا وجب المقارنة بين المدخلات و بين شكل الإيميل قبل قبوله ( اني يتضمن كلا من الـ @ و . قادر على جعله إيميلا صحيحاً مبدئيا )، او حين تطلب من المستخدم إدخال رقم هاتفه الخاص ( رقم الهاتف يتم التعامل معه على أساس String و ليس أرقام ) الذي توجب ان يبدأ اولا بكود البلد، او حين يتم إدخال الـ Zip Code، كل هذه عبارة عن String وجب أولا فحصها و مقارنتها قبل تسجيلها للتأكد من أن المستخدم قد أدخل بيانات صحيحة و ليس أية بيانات. 
  • إليك بعض أنواع الخوارزميات الخاصة بالتعامل مع الـ String : لا يوجد الكثير منها صراحة، فالـ Regex و هي إختصار لعبارة Regular Expression قد حلت تقريبا المعضلة برمتها، الـ Regex تسمح لك بتكوين خريطة (Pattern) خاصة ثم يتم مقارنة ما كتبه المستخدم مع تلك الخريطة، فإن كانت صحيحة قد إستقبلها، و إن كانت خاطئة قد رفضها، فمثلا يمكننا صناعة Pattern خاص بالبريد الإلكتروني، بحيث سيكون الطرف الاول عبارة عن أحرف و أرقام و كل الـ Characters الأخرى مثل - / * ...، ثم في الوسط يجب ان يكون بشكل إجباري عبارة او حرف @ ، ثم بعدها مجددا أحرف و عبارات اخرى ثم بعدها وجوبا يجب ان يكون هناك نقطة ( . ) ثم نهاية بمجموعة أحرف اخرى، لنحصل على Regex مثل : ^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$ ، يوجد العديد من الـ Regex المخصصة لكل نوع من الخرائط (Patterns). هذه الـ Pattern مخصصة فقط للمقارنة، يوجد خوارزميات مخصصة للـ Parsing او التحويل ( في حالة كان هناك دمج للأرقام و الحروف قد يؤدي الأمر الى لخبطة المدخلات فتوجب تحويلها كلها الى String ) و غيرها، لكن هذه الامور اصبحت سارية و بسيطة و يمكن إنجازها بسرعة بالتقدم البرمجي، لكن توجب معرفة الخوارزميات القابعة خلفها. 
كانت هذه خلفيتنا على مجموعة من الخوارزميات التي يجب عليك البحث عنها، فهمها و تضمينها الى خبراتك البرمجية، فهل لديك أي خوارزميات أخرى تعتقد انها ستكون مفيدة في التعلم ؟ 

شاركه على :