لماذا أعتبر لغة جو أفضل من لغة راست ؟
من المهم أن أذكر في البداية أن لغة جو ولغة راست هما لغات برمجة ممتازة. هدفي هنا ليس انتقاد أي لغة. ولكني أتكلم عن متى يكون استخدام لغة راست هو الاختيار الأفضل ، ومتى يكون اختيار لغة جو هو الأفضل.
إن جلست في هدوء وبدأت في التفكير في لغات البرمجة، أيهما أفضل وأنسب لتطوير أطر عمل وبرامج آمنة وقليلة المهام (microservice) ، ستفكر غالباً في استخدام لغة جو أو لغة راست.
حتى وإن كانوا متشابهين في بعض الصفات مثل نضج اللغة ، وكونهما لغات مفتوحة المصدر ، ومصممين للـ microservice ، ولغات حديثة ، ويدعموا تنفيذ التعليمات البرمجية بالتوازي، ولكن هناك الكثير من الغموض حول المقارنة بين لغة جو ولغة راست حول أيهما أفضل لمجتمع المبرمجين.
دعنا نفترض أنك تعمل بشكل أساسي بلغة جو ، ستقوم ببناء بعض الأدوات التي تعمل جيداً. ستقول أن هذه الأدوات سريعة لأنها كتبتها بلغة جو، بالإضافة أنها ملف واحد فقط لتشغيل البرنامج، .. إلخ. عندما تشارك هذا الكلام مع مجموعة من الزملاء في مجتمعات المبرمجين ولكنك تجد شخصاً يسألك “لماذا تستخدم لغة جو وليس راست؟”.
تبدأ في الشعور بالإرهاق. يُمكنك أن تجيب أنك لا تعرف إلا لغة جو ، وهي اللغة التي اعتدت على استخدامها لحل المشكلات التي تواجهك، ولكن هذه الإجابة لن تكون كافية للسائل. أنت تتكلم بفخر عن سرعة الأداة التي أنشأتها والسائل سيعرض مزايا وفوائد استخدام لغة راست بدلاً من لغة جو.
والآن أصبحت أنت نفسك تتساءل لماذا تعلمت لغة جو من الأساس؟ قالولك إن لغة جو سريعة وبها concurrency primitives عظيمة .. ولكن لغة راست أتت وكل الناس يقولون أنها أفضل من كل النواحي!
كل كانوا كاذبين ، أم أنهم يكذبون الآن ؟ 🔗
لا يوجد لغة برمجة واحدة تتفوق في كل النواحي. ولكن من الممكن أن تختار اللغة الخطأ وينتهي بك الحال مع برنامج مكتوب باللغة الغير مناسبة لمواصفاته. أنت اخترت لغة جو من وسط كل اللغات في السنوات القليلة الماضية وشاركت في التساؤل “لماذا هذه اللغة وليست لغة جو؟”.
ليس سراً أن محبي لغة راست منبهرين بها ومصممين دائماً أن ينيروا ظلمة أتباع لغة البرمجة الأخرى والتحدث معهم عن عظمة لغة راست كما لو كانت ديناً أو مذهباً دينياً. وهذا ليس خطأ لغة راست، كل مشروع ناجح سيكون له أتباع سلوكهم سيئ. هذا سلوك لابد منه. كل الناس يحتاجوا إلى التعامل مع هؤلاء الناس. ولكن المبرمجين بلغة جو هم أكثر فئة معرضة لتنمر ومضايقات هؤلاء المحبين للغة راست، بسبب تشابة أهداف لغة راست مع لغة جو.
- لغة جو سريعة ، لكن لغة راست أسرع.
- لغة جو بها efficient garbage collector ، لكن لغة راست بها static memory management.
- لغة Go بها دعم قوي للـ concurrency ، لكن لغة Rust تتمتع بـ provably-correct concurrency.
- لغة جو بها interfaces ، لكن لغة راست بها traits و zero-cost abstractions أخرى.
إن كنت مبرمج بلغة جو ، ربما تشعر أنه تم خداعك. على العكس تماماً، لا يحزن المبرمجين بلغة بايثون عندما يتعرضون للغة راست. لأنهم يعرفون أن لغة بايثون بطيئة وليست على أعلى كفاءة، وهم متقبلين لهذه الحقيقة لأنهم يعرفون وظيفة لغة بايثون ؛ وهي جعل كتابة الكود بسهولة، وكتابة الأكواد الهامة للأداء والسرعة إلى لغة سي.
ماذا عن لغة جو ؟ 🔗
لغة جو مناسبة لكتابة الخدمات المصغرة (microservices) 🔗
تم إنشاء لغة جو داخل شركة جوجل لحل مشكلات جوجل، وهي بشكل عام تخص التعامل مع الخدمات المتصلة بالإنترنت. نموذج التنفيذ المتبادل والمتوازي في لغة جو (concurrency model) مناسب جداً للبرامج التي تعمل على الخوادم الإلكترونية (server-side applications) التي تختص بالتعامل مع طلبات متعددة مستقلة عن بعضها البعض، وليس التعامل مع البرامج المعقدة التي تعطي نتيجة بعد إتمام الكثير من العمليات. لهذا السبب تم استخدام كلمة go
وليس await
في الـ concurrency في لغة جو.
لغة جو بها دعم قوي جداً لبروتوكول HTTP والبروتوكولات المتعلقة بالإنترنت والشبكات ، ومن السهل كتابة خدمة إلكترونية مرضية بلغة جو (web service). في المشاريع الشخصية الخاصة بي ، أثبتت لغة جو أنها بديل قوي لـ NodeJS و PHP Laravel وخاصةً في المواقف التي أحتاج فيها أن أحدد الواجهة بين الجزئين بشكل صريح وواضح مع استخدام لغة جافاسكربت المعتادة.
بالإضافة إلى ذلك، لغة جو بها أدوات قوية لتشخيص مشكلات الـ concurrency و الأداء ، والقدرة على إخراج ملف تنفيذي للبرنامج لكل المنصات وأنت على منصة واحدة منهم (cross-compilation).
لغة جو سهلة الفهم 🔗
تفتخر لغة جو بإستخدام مجموعة قليلة جداً من الخصائص. وهذا يجعل لغة جو أسهل في التعلم و أسهل في قراءة وفهم الكود حتى في المشاريع الكبيرة والضخمة. مؤسسي لغة جو يطلقون عليها لغة “مملة”. يُمكننا أن نتناقش بخصوص اضافة خاصية ما للغة لتصبح مفيدة أكثر ، ولكن فكرة إجبار الناس على انجاز أشياء كبيرة بأدوات أقل هي فكرة ثبت أنها ناجحة.
لغة راست هي في نفس كفاءة لغة جو في إنشاء الخدمات السحابية (web services) ، وربما أفضل، ولكن لغة راست لا تستطيع أن تتفوق على لغة جو في البساطة والسهولة. وهي ليست مجرد سهولة، ولكن هي قواعد وأعراف وضعها مؤسسو اللغة لابد أن تسير عليها عكس باقي لغات البرمجة. لغة جو لا تقبل وجود استدعاء لمكتبة برمجية خارجية غير مستخدمة في الكود ، ولا تقبل وجود متغير غير مستخدم في الكود ، ولابد أن تكون كل الملفات الخاصة بالحزمة داخل نفس المجلد ، .. وغيرها من الأعراف والقوانين الخاصة بلغة جو.
لغة جو لا تريد وجود “بصمات” داخل الكود، لذلك فإنها تجبرك على إتباع طريقة كتابة محددة من خلال الأمر go fmt
.
في الحقيقة، ولا خاصية من هذه الخصائص منفردة تجعلك تعجب أو تحب لغة جو ، ولكن هذه الخصائص والأعراف يصفوا لك العقلية المبنية عليها لغة جو. الكثير لا يحبها ، ولكن في رأيي أنها أهم ميزة في لغة جو لتطوير الكثير من أنواع البرمجيات مثل تطوير البرمجيات في الشركات الضخمة.
لغة جو تعمل بشكل ممتاز في البرامج الضخمة 🔗
كما ذكرت سابقاً ، تم إنشاء لغة جو لحل مشكلات جوج ، ومشاكل جوجل هي مشاكل ضخمة في برامج ضخمة. إن كان هذا هو الهدف من البداية أم أنها طبيعة البيئة التي تم تطوير اللغة فيها، لغة جو هي بلا شك مناسبة جداً لتطوير البرامج الضخمة داخل الشركات الضخمة مثل جوجل. إن كان لديك خبرة في كتابة البرمجيات الضخمة وجربت لغة جو ستفهم ما أقصده.
إليك شرح مختصر لما أقصده.
تطوير البرامج في الشركات الضخمة شئ مختلفة مقارنةً بتطوير البرامج على مستويات أصغر. إن لم تشارك في هذا من قبل ، ربما تسأل نفسك “ما هو تطوير البرامج في الشركات الضخمة؟” أنا عملت كـ consultant في هذا النوع من البرمجة لفترة قصيرة، لذا إليك رأيي في الموضوع.
تطوير البرامج في الشركات الضخمة هو عن المستوى الضخم 🔗
لا أقصد هنا عدد المستخدمين الضخم لهذه البرامج التي يتم تطويرها، ولا حجم البيانات التي تعمل عليها هذه البرامج. غالباً تكون هذه حقائق بالفعل، ولكن الصفحة الواصفة لهذا النوع من التطوير هي ضخامة مستوى العمليات (scale of scope and process).
تطوير البرامج في الشركات الضخمة (Enterprise software) دائماً يكون على مستوى ضخم. المجال غالباً يكون ضخم وواسع وكبير ، أو ضيق وصغيرة ولكنه معقد للغاية. وأحياناً يكون الإثنان معاً. عندما تنشئ برمجيات لتمثيل هذه المجالات، القواعد والأعراف الخاصة بالبرمجة لا تكون كافية بسبب المشكلات غير التقنية تكون مؤثرة أكثر من المشكلات التقنية في هذا النوع من البرمجة.
لفك تعقيد هذه المجالات لابد من عمل طريقة تسلسل عمليات مصمم جيداً. تحتاج إلى خبراء في المجال ، ومحللين، وطريقة لجعل أصحاب الأسهم التجارية يفهموا ما الإنجارات التي تم البدء فيها والإنتهاء منها. وأحياناً تكون أنت ، التقني ، لا تفهم المجال بشكل دقيق. أصحاب الأسهم التجارية وخبراء المجال لا يكونوا على دراية بالتقنيات والبرمجة.
هذا يدفع الإهتمامات التقنية والبرمجية بعيداً على دائرة الأولويات مثل الكفاءة وحتى الدقة نفسها. لا تفهمني خطأ، البزنس يهتم بالدقة ولكنها ليست دقة الخوارزمية البرمجية ، ولكن دقة إتمام العملية وسهولة مراجعتها وتقديم الدعم الفني بخصوصها.
بسبب هذه البيئة ظهرت بعض الأفكار والأعراف المناسبة لحديثنا.
الكثير من المبرمجين الجدد يتعلموا البرمجة في بداية عملهم كمبرمجين. في بعض الشركات عندما يتم تعيينك في وظيفة فإنك تأخذ أسبوع أمام كورس برمجة وبعد هذا الأسبوع تعتبر مبرمج ومطلوب منك القيام بعملك كمبرمج.
المشاريع البرمجية تكبر بسرعة ويزداد تعقيدها لأسباب خاطئة. المشاريع الكبيرة تأخذ وقت للبناء والمبرمجين سيأتون ويرحلون أثناء بناء المشروع. إعادة الكتابة المستمرة (constant refactoring) ليست حل لأن كل فرد من أفراد الفريق سيكتب كود مختلف في جودته عن المبرمج الآخر. أكثر من فريق يعملون على نفس المشروع البرمجي في نفس الوقت سيؤدي إلى كتابة أكواد مكررة ولا حاجة لها. المجال يتغير بمرور الزمن والإفتراضات القديمة تصبح غير دقيقة مما يجعل الكود المختص بهذه الإفتراضات غير مناسب للعمل. كلما زاد تعقيد الكود ، كلما زادت إحتمالية وجود مشكلة فيه بمرور الوقت مع تغيرات البزنس.
الأدوات البرمجية غالباً تكون عامة وقديمة. هذه نتيجة كل ما تكلمت عنه حتى الآن. كميات ضخمة من الكود القديم تلزمك بإستخدام مجموعة أدوات محددة ، المبرمجين المبتدئين سيتعلموا أحدث التقنيات والأدوات، والمديرين وأصحاب الأسهم غير قادرين على إتخاذ قرارات بخصوص التقنيات والبرمجة، مما يجعلهم يقلدون قرارات الشركات الناجحة الأخرى في بند التقنيات والبرمجة. أو ما يقوله المحللين أن الشركات المنافسة تقوم به.
لغة جو تعمل على تقليل التعقيد على المستوى الضخم 🔗
لغة جو تساعد الفريق على النجاح بإعطائهم أكثر مما تعطيهم باقي الأدوات واللغات ، وعدم إتاحة بعض الأدوات لتقليل وقوع الفريق في المشكلات والنقاشات المعتادة المُضيّعة للوقت.
لغة جو أسهل في التعلم مقارنةً بلغة جافا أو سي شارب. في صناعة البرمجيات دائماً المشاريع البرمجية متأخرة ، وميعاد التسليم قريب، والإدارة تعين مبرمجين جدد بهدف زيادة سرعة التطوير والإنتهاء في الميعاد.
المجتمع الخاص بلغة جو يعتبر الكثير من الـ abstractions المستخدمة دائماً في لغة جافا أو سي شارب غير مناسبة مثل IoC containers و الوراثة في الـ OOP على سبيل المثال. هناك مستويين فقط من الظهور والعلنية في المتغيرات ، ونموذج العمل المتتالي (concurrency) الوحيد هو CSP. من الصعب أن تقع في مشكلات معقدة عميقة أثناء كتابة كود بلغة جو مقارنةً بإستخدام لغات مثل جافا و سي شارب (C#).
الـ Go compiler سريع مما يعني أن الإختبارات (tests) ستكون سريعة أيضاً ، وتنصيب البرمجيات للعمل (deployments) يأخذ وقت قليل جداً ، مما يزيد من الإنتاجية بشكل عام.
لغة جو تساعد المبرمجين الجدد على أن يصبحوا منتجين في وقت قصير، وتصعب على المبرمجين القدامى (mid-level developer) أن يضيفوا abstractions ضعيفة التي تسبب مشكلات فيما بعد.
لهذه الأسباب الكثيرة ، فإن لغة راست غير مناسبة لتطوير البرمجيات على مستوى الشركات الضخمة (entreprise software development) مقارنةً بلغة جو. وهذا لا يعني أن جو لغة مثالية، أو أن لغة راست لا تتفوق على لغة راست في بعض النواحي. لغة راست بها الكثير من المزايا الغير موجودة في لغة جو، ولكني أقول أن الفكرة العامة عن لغة جو هي الخطأ.
لغة جو ليست أسرع لغة. لغة جو ليست أكفأ لغة في استهلاك الذاكرة (الرامات). لغة جو لا تملك أفضل concurrency model بين جميع اللغات.
ولكن لغة جو أسرع من لغة جافا و سي شارب. لغة جو أكفأ في استهلاك الذاكرة من لغات من سي شارب و جافا. وطبعاً لغة جو تملك concurrency أفضل من جافا و سي شارب. لغة جو بسيطة وتظهر هذه الصفة عند مقارنة مشاريع برمجية متوسطة الحجم من لغات مختلفة مثل جافا و سي شارب و جو. ليس من الضروري أن تكون لغة جو أسرع من لغة سي شارب أو لغة جافا في أساسيات اللغة لأن التطبيقات المكتوبه بهذه اللغات تختلف كثيراً عن التصميم النظري لنفس هذه التطبيقات الحقيقية. وعدد المشكلات الموجودة في المشاريع البرمجية في لغة جو أقل ما يمكن. على سبيل المثال، استمع إلى هذه المحاضرة عن الـ concurrency في لغة c# ، وستعلم أن استخدام await يكون خطأ في معظم الأحيان. تخيل معي المشكلات الضخمة الناتجة عن هذه المشكلة في كل البرامج المكتوبة بلغة سي شارب. في الحقيقة المواقع المكتوبة بـ ASP.NET تتوقف (deadlocking) بدون سبب عند الكثير من الناس.
لغة جو أسرع بالفعل في بعض الحالات 🔗
- التعامل مع النصوص (strings) أسرع وأسهل في لغة جو مقارنةً بلغة راست.
- عمل parsing لـ protobuf data بصيغة بروميثيوس (Prometheus format) أسرع في لغة جو حتى بعد عمل تحسينات ضخمة في الكود المكتوب بلغة راست. اقرأ مقال Greptime من هنا لتعرف تفاصيل أكثر عن هذه الحالة.
الخُلاصة 🔗
لغة جو أفضل من لغة جافا ولغة سي شارب مقارنةً بلغة راست. الوضوح الذي تقدمه لغة جو في تطوير البرمجيات على مستوى الشركات الضخمة أهم بكثير من إزالة الـ garbage collection من اللغة على حساب الإنتاجية.
ربما تأخذ فكرة خاطئة عن أنا المبرمجين بلغة راست والمبرمجين بلغة جو لا يتعاملون مع بعض إطلاقاً وبينهم ما صنع الحدّاد. ولكن هذا ليس حقيقي، حسب خبرتي، لدينا الكثير من النقاشات حول المشاريع البرمجية ولغة جو ولغة راست والأمر يسير بشكل جميل.
أتمنى أن تكون قد استفدت من الموضوع ، إن كنت تعرف أي شخص يُمكنه الإستفادة من هذه المعلومات، ارسل له رابط هذا المقال. إن أردت معرفة الموضوعات الجديدة بعد نشرها مباشرةً على موقع أبانوب حنا ، تابعني على يوتيوب و تيليجرام ، و فيسبوك ، و واتساب .