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

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

التزامن (Concurrency) ليس التنفيذ المتوازي (Parallelism)
قد تصل إلى الخادم عدة طلبات بينما ينتظر بعضها بيانات من الشبكة. يحتاج البرنامج إلى تنظيم هذه الأعمال حتى لا يعطل انتظار أحدها بقية الطلبات. لهذا توفر Go أدوات للتزامن في اللغة و مكتبتها القياسية (Standard Library).
يعني التزامن تنظيم عدة أعمال مستقلة خلال الفترة نفسها. أما التنفيذ المتوازي فيعني أن تنفذ عدة أعمال في اللحظة نفسها. قد تعمل بعض هذه الأعمال بالتوازي على عدة أنوية، لكن التزامن لا يضمن ذلك. كما أنه لا يمنع من تلقاء نفسه أخطاء مثل race conditions.

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

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