أجد صعوبة في وصف محتويات هذا المقال بأسلوب الوصف العام. لذلك سيستخدم هذا المقال أسلوب المقابلة في الوصف بدلاً من ذلك.
مرحباً Tapir، متى ولماذا خططت لكتابة هذا الكتاب؟
في حوالي يوليو 2016، بعد استخدامي Go لمدة عامين (ليس بكثافة كبيرة)، شعرت أن Go لغة بسيطة وأنني أتقنت برمجة Go. في ذلك الوقت، كنت قد جمعت تفاصيل كثيرة في برمجة Go. اعتقدت أنني أستطيع أرشفة هذه التفاصيل في كتاب، واعتقدت أنه ينبغي أن يكون عملاً سهلاً.
كنت مخطئاً. كنت مفرطاً في الثقة. أثناء محاولتي تقديم تفسيرات لبعض التفاصيل، وجدت أنني لا أستطيع شرحها بوضوح. ومع تجمّع المزيد والمزيد من الارتباسات، شعرت أن معرفتي بـ Go محدودة جداً لدرجة أنني ما زلت مبرمج Go مبتدئاً.
تخليت عن كتابة ذلك الكتاب.
تخليت؟ أليس هذا الكتاب قد اكتمل الآن بالفعل؟
كان ذلك الكتاب هو الذي أُلغي، لا كتاب Go 101. في النهاية أزلت تقريباً كل الارتباسات بقراءة الكثير من وثائق Go الرسمية وجميع أنواع مقالات Go على الإنترنت، وبإيجاد إجابات من بعض منتديات Go ومن متتبع قضايا مشروع Go.
أمضيت حوالي عام في إزالة تلك الارتباسات. خلال تلك الفترة، ومن وقت لآخر، حالما كنت أزيل معظم الارتباسات حول موضوع ما وأستعيد الثقة في شرح ذلك الموضوع، كنت أكتب مقالة مدونة واحدة لذلك الموضوع. في النهاية، كنت قد كتبت حوالي عشرين مقالة عن Go، وجمعت تفاصيل عن Go أكثر من قبل. وكان الوقت قد حان لإعادة إطلاق خطة كتابة كتاب عن Go.
كتبت عشر مقالات تعليمية أساسية أخرى وعشرين مقالة إضافية حول جميع أنواع مواضيع Go الأخرى. لذا يضم Go 101 الآن حوالي 50 مقالة.
ما كانت ارتباساتك السابقة؟
بعض الارتباسات كانت تفاصيل قليلة في تصميم الصياغة والدلالات، وبعضها تضمّن قيم أنواع معينة — الشرائح (slices) والواجهات (interfaces) والقنوات (channels) بشكل رئيسي — وقليل منها كان مرتبطاً بواجهات برمجة الحزم القياسية.
ما أسباب ارتباساتك السابقة في رأيك؟
اعتبار أن Go سهلة الإتقان يُعدّ ضاراً. إن تبنّي مثل هذا الرأي (اعتبار أن Go سهلة الإتقان) سيجعلك تفهم Go فهماً سطحياً ويمنعك من إتقانها.
Go لغة غنية بالمزايا. مجموعة قواعدها النحوية ليست كبيرة بالتأكيد، لكن لا يمكننا القول أيضاً إنها صغيرة. بعض تصاميم الصياغة والدلالات في Go مباشرة، وبعضها مضاد للحدس قليلاً أو غير متسق مع غيره. وهناك عدة مقايضات في تصاميم صياغة Go ودلالاتها. يحتاج المبرمج إلى خبرات معينة في برمجة Go لاستيعاب هذه المقايضات.
توفر Go عدة أنواع من الأنواع غير الجوهرية بصفة مواطن من الدرجة الأولى (first-class citizen). تُجرى بعض عمليات التغليف عند تنفيذ هذه الأنواع لإخفاء بنيتها الداخلية. فمن ناحية، تجلب هذه التغليفات راحة كبيرة لبرمجة Go، ومن ناحية أخرى، تضع بعض العقبات أمام فهم سلوكيات قيم هذه الأنواع بعمق أكبر.
العديد من دروس Go الرسمية وغير الرسمية بسيطة جداً ولا تغطي سوى حالات الاستخدام العامة متجاهلةً تفاصيل كثيرة. قد يكون هذا جيداً لتشجيع مبرمجي Go الجدد على تعلم Go واستخدامها. لكنه من ناحية أخرى يجعل أيضاً العديد من مبرمجي Go مفرطين في الثقة بمدى معرفتهم بـ Go.
عدة دوال وأنواع معلنة في بعض الحزم القياسية ليس لديها تفسيرات مفصلة. وهذا أمر مفهوم، لأن كثيراً من التفاصيل دقيقة جداً لدرجة يصعب معها إيجاد صياغة مناسبة لشرحها بوضوح؛ فقول بضع كلمات دقيقة أفضل من قول الكثير من الكلمات مع عدم الدقة. لكن هذا يترك حقاً بعض الارتباسات لمستخدمي الحزمة.
إذن هل تعتقد أن البساطة ليست نقطة بيع لـ Go؟
أعتقد، على الأقل، أن البساطة ليست نقطة البيع الرئيسية لـ Go؛ ففي النهاية هناك عدة لغات أخرى أبسط من Go. ومن ناحية أخرى، فإن Go، بصفتها لغة غنية بالمزايا، ليست لغة معقدة أيضاً. ويمكن لمبرمج Go جديد يتحلى بالمواقف الصحيحة أن يتقن برمجة Go خلال عام واحد.
إذن ما نقاط بيع Go في رأيك؟
شخصياً، أعتقد أن كون Go، كلغة ساكنة (static language)، مرنة كالعديد من لغات البرمجة النصية الديناميكية هو نقطة البيع الرئيسية للغة Go.
توفير الذاكرة، والبدء السريع للبرنامج، وسرعة تنفيذ الشيفرة، والتصريف السريع، مجتمعةً، نقطة بيع رئيسية أخرى لـ Go. رغم أن هذه نقطة بيع شائعة لدى العديد من لغات عائلة C، لكن في مجال تطوير الويب، نادراً ما تمتلك اللغات الخصائص الأربع في الوقت نفسه. في الواقع، هذا هو السبب الرئيسي لتحوّلي إلى Go من Java لتطوير الويب.
الدعم المدمج للبرمجة المتزامنة هو أيضاً نقطة بيع لـ Go، رغم أنني شخصياً لا أعتقد أنها نقطة البيع الرئيسية لـ Go.
قابلية قراءة الشيفرة الممتازة نقطة بيع مهمة أخرى لـ Go. وأشعر أن قابلية القراءة هي العامل الأهم الذي يوضع في الاعتبار عند تصميم Go.
الدعم الممتاز عبر الأنظمة الأساسية نقطة بيع لـ Go أيضاً، رغم أن نقطة البيع هذه لم تعد فريدة كثيراً في الوقت الحاضر.
كما يمكن اعتبار فريق التصميم والتطوير الأساسي المستقر والمجتمع النشط معاً نقطة بيع لـ Go.
ماذا يفعل Go 101 لإزالة هذه الارتباسات؟
يحاول Go 101 إزالة العديد من الارتباسات من خلال القيام بما يلي.
- التشديد على المفاهيم والمصطلحات الأساسية. فبدون فهم هذه المفاهيم والمصطلحات الأساسية، يصعب الفهم الكامل للعديد من القواعد والمفاهيم عالية المستوى.
- إضافة مصطلح جزء القيمة (value part) وتخصيص مقال خاص لشرح أجزاء القيم. يكشف هذا المقال البنى الأساسية لبعض أنواع الأنواع، حتى يستطيع مبرمجو Go فهم قيم Go من تلك الأنواع بعمق أكبر. أعتقد أن معرفة القليل من التنفيذات الأساسية المحتملة مفيدة جداً لإزالة بعض الارتباسات حول جميع أنواع قيم Go.
- شرح كتل الذاكرة (memory blocks) بالتفصيل. فمعرفة العلاقات بين قيم Go وكتل الذاكرة مفيدة جداً لفهم كيفية عمل جامع النفايات (garbage collector) وكيفية تجنب تسرب الذاكرة.
- النظر إلى قيم الواجهات كصناديق لتغليف القيم غير الواجهية. وقد وجدت أن التفكير في قيم الواجهات كصناديق قيم مفيد جداً لإزالة العديد من الارتباسات المتعلقة بالواجهات.
- توضيح عدة غموض موجود في مواصفات Go، مثل قواعد التضمين، وتقييم قيم الطرق المروَّجة (promoted method value)، وآلية panic/recover.
- إعداد عدة مقالات ملخِّصة ومقالات لمواضيع خاصة من خلال تجميع العديد من نقاط المعرفة والتفاصيل، مما يوفّر على مبرمجي Go الكثير من وقت التعلم.
هل هناك أي شيء آخر يستحق الذكر؟
لا يتناول هذا الكتاب الأجناس العامة المخصصة (custom generics) بعمق. يرجى قراءة كتاب Go Generics 101 لتعلم الأجناس العامة المخصصة.
بالإضافة إلى ذلك، تُتجاهل أنواع وسائط الأنواع (type parameter types) — المستخدمة بشكل متكرر في الأجناس العامة المخصصة — عمداً في أوصاف قواعد التحويل وقابلية الإسناد والمقارنة. وبعبارة أخرى، لا يأخذ هذا الكتاب في الاعتبار الحالات التي تدخل فيها الأجناس العامة المخصصة.