مدونة المُظلي

كلام عن تطوير البرمجيات والمبرمجين وما حولهما

Wednesday, August 07, 2019

Elixir ضد Go


تنويه: إذا أردت التعرف أولاً على ما هي Elixir برجاء قراءة هذا المقال أولاً


قديماً قال المتنبي "وبِضِدّها تَتَبَيّنُ الأشْياءُ" وهي جملة من الحكمة بمكان
ولتعرف أهمية هذه الحكمة، دعونا نلقي نظرة على أول قيمة من قيم شركة Netflix

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

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

واحدة من الحيل التي استعملها عادة حينما أكون حديث عهد بمعلومة ما، ولا أدري عنها أي شئ بعد
أن اكتبها في جوجل متبوعة ب "VS" لأرى ما يناظرها فأختصر مسافة كبيرة من البحث
وأول مرة سمعت عن Elixir فعلت مثل ما أفعل دائما وكتبت
Elixir VS

وكانت أول نتيجة للبحث تذكر Go VS Elixir

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

لذلك سأحول أن أتأخذ طريقاً مختلفاً في مقارنة Go vs Elixir بأن أبين وجه التضاد بينهم وبالتبعية المواقف المناسبة لاستعمال كل واحدة منهم (وفقاً لفهمي حتى الآن)

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

فعلى بركة الله نبدأ :)

أول فرق هو ال Virtual Machine

لكي يعمل أي برنامج مبني ب Elixir فعليك أن تركب ال Erlang Virtual Machine على كل جهاز تريد تشغيل البرنامج عليه

  • أي أن Elixir مناسبة أكثر لبناء الخوادم Servers حيث التحكم بها وإعدادها يكون أسهل وتحت إدارة فريق التطوير نفسه

على الجانب الآخر Go لا تحتاج Virtual Machine ولا تحتاج أي شئ إطلاقاً لكي تعمل، فهي statically compiled أي يتم تضمين "كل" ما يلزم لتشغيلها في نفس ملف التشغيل

  • لذلك هناك أهتمام كبير من المشتغلين بقطاع ال DevOps لبناء أدوات تساعدهم في عملهم باستخدام GO مثل ال command-line tools نظرا لأهمية هذا الميزة الكبيرة. ملف واحد مطلوب هو ملف البرنامج نفسه ولا شئ آخر

ثاني فرق هو ال Runtime

تأتي Elixir بنظام تشغيل كامل التجهيز battery-included runtime لبناء أنظمة موزعة distributed systems بكل ما تحتاجه من أدوات وطرق اتصال 
  • ولهذا بناء التطبيق الخاص بك ليعمل داخل cluster  يعد عملية سهلة في Elixir بل هي مصممة من أجل ذلك
أما GO فهي تأتي بأقل نظام تشغيل ممكن minimal runtime ثم تدعك أنت تقرر ما تحتاج، حتى لا يتضخم حجم برنامجك بسبب كثير من المكتبات التي ليس لك بها حاجة
  • لهذا السبب تكون GO مناسبة لل standalone apps مثل ال REST api service وبرامج ال command-line مثلما ذكرنا من قبل


ثالث فرق هو ال Scheduler

المجدول الخاص ب Elixir يعمل ك Preemptive Scheduler  أي أنه يمكن مقاطعة Erlang process إذا حدد أنها دخلت في حالة غير صحية ليتم إنهاءها منعاً من تأثيرها على ال Erlang process الأخرى
  • لهذا السبب تكون Elixir مناسبة للبرامج التي تحتاج إلي الرد في وقت محدد حتى لو كان ذلك على حساب بعض الطلبات التي سيتم إنهاءها بسبب أي خطأ حدث بها.. مثل برامج ال video streaming التي يجب أن تتلقى صور بشكل مستمر خلال وقت محدد. وإن حدث خطأ في إحضار صورة ما، فيمكن تخطيها بشكل كامل والاستمرار في بث الصور التي تليها
المجدول الخاص ب GO يعمل ك Cooperative Scheduler أي أنه لا يمكنه الإنتقال في عمله من goroutine إلي goroutine إلا بعد سماح ال goroutine الذي يعمل حاليا بذلك، وهو في العادة يعمل بشكل أسرع من ال Preemptive Scheduler لانه ليس عليه المراقبة أو التدخل
  • من أجل ذلك، تعد GO مناسبة أكثر للبرامج التي تعتبر CPU intensive مثل برامج تشفير الملفات، لانه لا يكون مقبولاً أن يتم تخطي ملف حتى لو تم الانتظار بعض الوقت حتى تنتهي العملية

وللحديث بقية

دمتم في أمان الله


2 comments:

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

    ReplyDelete
    Replies

    1. أولاً دعنا نتفق أن كلا التقنيتين رائعتين ويعتبرا من أفضل التقنيات المتاحة حالياً
      وسيقدمان أداء عام ممتاز بالإضافة إلي مميزات أخرى

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

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


      أما إن كان المطلوب بناء نظام موزع كامل
      Distributed systems
      عبارة عن أكثر من ميكروسيرفس يتواصلون فيما بينهم، فاعتقد أن
      Elixir
      ستوفر عليك شهوراً -إن لم يكن سنوات- من المجهود في بناء هذا النظام

      أمر آخر تعتبر
      Elixir
      مميزة فيه، هو بناء خدمات تعتمد على ال
      Realtime communication
      مثل برامج المحداثات وخدمات التنبيه والخدمات المعتمدة على ال
      Web Sockets

      وأيضاً هي مميزة في الخدمات التي يجب أن نظل متاحة طوال الوقت

      Delete