مقابلة مع ميد كينكي يتحدث فيها هو وكاترينا أوين عن مترجم Rust، وعن واجهة رسومية تستخدم فضاءات ألوان علمية لتحديد لون البيرة، وعن كتابه 'A Practical Guide To Rust'.
مرحبًا ميد. شكرًا لك على هذا الحديث. أردنا أن نتحدث معك لأنك أكثر المرشدين عطاءً على مسار Rust. لقد ساعدت أكثر من 400 طالب. كيف تعرّفت على Exercism؟
نشر أحدهم على منتدى Rust الفرعي في Reddit أن مسار Rust في Exercism يحتاج إلى مرشدين، فبحثت في الأمر. أنا سعيد جدًا لأنني فعلت ذلك، فالأمر مُجزٍ للغاية والجميع لطفاء ومقدّرون. لقد كوّنت علاقات رائعة مع طلابي في Exercism، وأحب مساعدتهم.
هل هناك قصص معينة تبرز؟
نعم، هناك تمرين معيّن في Rust كان شائعًا جدًا: ثلاثية فيثاغورس.
المشكلة الأكثر شيوعًا في هذا التمرين هي الأداء غالبًا. معظم الناس يحلّونه في البداية بحلقات for متداخلة، وهو حل من رتبة O(n²) على الأقل وغير فعّال أبدًا. هدفي أن أوصل طلابي إلى حل خطّي: O(n).
أسلوبي هو طرح الأسئلة. أبدأ بسؤالهم إن كانوا يريدون تعلّم طريقة المكرِّر في Rust، لأن لها فوائد كثيرة، منها أنك تستطيع استخدام مكتبة Rayon لجعل عملك متوازيًا.
بعد أن أجاب أحد طلابي بـ«نعم، من فضلك»، ذكر أنه يتعلّم Rust لأنه يفكّر في استخدامها في أنظمة التحكم المدمجة ثم في معالجة كمّ البيانات الضخم الذي تنتجه. لذلك فإن التوازي مهم بالنسبة له. وقد سُرّ بأنني استخدمت تمرينًا يبدو بسيطًا لتعليمه أجزاءً أكثر تعقيدًا وأقرب إلى الأسلوب المتّبع في Rust.
والآن، بفضل Exercism، استعان بي لتعليمه بشكل فردي، وسنعمل معًا على بعض المشاريع التجريبية. كما سأدرّب فريقه بأكمله عندما ينقل الشركة بالكامل إلى Rust.
لقد استمتعت حقًا بالعمل مع الطلاب الذين أشرفت على إرشادهم، وأريد أن يستمر هذا الأمر في النمو.
أحببت الأمر إلى حد أنني تطوّعت الآن لأكون أحد القائمين على مسار Rust وأساعد أكثر من خلف الكواليس.
هذا التواصل الإنساني مهم جدًا! أنت مؤلف كتاب A Practical Guide to Rust. عن ماذا يتحدث الكتاب وما الذي دفعك لكتابته؟
كتبت هذا الكتاب لمساعدة الآخرين على فهم بعض جوانب Rust بشكل أفضل. لا يوجد توثيق كثير لهذه اللغة، ورأيت أننا بحاجة إلى مؤلّفات فيها روح الدعابة وتشرح مفاهيم اللغة بشكل ملموس. يقدّم الكتاب أدلة إلى بعض المجالات الأساسية والمتقدمة. أريد أن يكتسب الناس إحساسًا راسخًا بالاستخدام العملي للغة في العالم الحقيقي. فهو يقدّم أمثلة حقيقية لا افتراضية.
كنت أعرف دائمًا أنني سأكتب كتابًا. وعندما وجدت نفسي أعلّم زميلًا لي البرمجة بلغة Rust عن بُعد، اكتمل الإطار من تلقاء نفسه. لم يكن قد لمس أي كود من قبل، وكنت بحاجة إلى شرح مصطلحات وأساليب نعتبرها نحن المهووسين من المسلّمات بطرق جديدة يمكن إدراكها. استخدمت تشبيهات مثل استعارة كتاب من المكتبة مقابل امتلاكه عند الحديث عن مفهوم الملكية في Rust.
كما أدرجت أمثلة من مشروعي BrewStillery. إنها وسيلة رائعة لرؤية كيف تعمل أشياء مثل البنيات والتعدادات داخل برنامج حقيقي. وتُظهر أيضًا كيفية استخدام التوازي استخدامًا واقعيًا.
عندما كنت أكتب الكتاب، كنت أعرف أنني أريده أن يُقرأ كقصة لا كدليل مرجعي فحسب. فهو يبني على نفسه، لكن عناصره قائمة بذاتها أيضًا. إنه الفرق بين الطبخ باتباع دليل كيميائي ومشاهدة حلقة من برنامج «The French Chef» لجوليا تشايلد.
هذا مثير للاهتمام. لمن كتبت كتابك وماذا سيجني القارئ منه؟
الكتاب موجّه إلى أي شخص يريد تعلّم Rust. والقاسم المشترك في أسلوبي في عرض الأفكار هو أنه يمنح القارئ فهمًا أساسيًا، في حين تميل كثير من المؤلفات الأخرى إلى الحفظ عن ظهر قلب.
أرى أنك تلقيت الكثير من المراجعات الإيجابية. هل تخطط لإصدار جزء ثانٍ؟
نعم! سأواصل الكتابة بالطبع، وأخطط لنشر مزيد من الأجزاء.
إلى جانب التعليم عبر الإرشاد والكتابة، عملت أيضًا على مترجم Rust. هل يمكن أن تحدثني عن ذلك؟
بالتأكيد!
كمقدمة موجزة عن عملي، هناك أساسًا مكانان يمكن أن يعمل فيهما البرنامج: وقت الترجمة ووقت التشغيل. عندما تُنفَّذ دالة في وقت التشغيل، يجب إعادة توليد كل شيء فيها وإعادة حسابه. وهذا يعني بشكل حاسم إعادة تخصيص الذاكرة، وهو أمر نريد تجنّبه دائمًا. أما عندما تكون الدالة ثابتة، فتُحمَّل في الذاكرة عند بدء تشغيل البرنامج. وكلما زاد ما يمكننا إنجازه في وقت الترجمة، كان أداء برامجنا أفضل.
قبل فترة سمعت أن فكرة تنفيذ الدوال في وقت الترجمة (const fn) تُطبَّق في Rust، فتحمّست جدًا. أنا شغوف جدًا بأن تكون الأشياء فعّالة ودقيقة. ومن الأمور التي أحبها في const fn أنه عندما يكتمل، يمكننا الحصول على أشياء رائعة مثل الثوابت الرياضية محسوبة بأناقة. حاليًا، قيمة pi مضمّنة في الكود بشكل ثابت. سيقول كثير من الناس إنها دقيقة بما يكفي، لكنني أرى أنه ينبغي استخدام كامل المساحة العددية المتاحة. ومع const fn يمكننا استخدام صيغة لايبنتز، التي ستملأ مساحة الفاصلة العائمة بالكامل.
قرأت المزيد ووجدت تدوينة تقول إن MIRI سيجعل تثبيت const fn أسهل بكثير. مرّ الوقت ولم أرَ أي تقدّم عند إصدار نسخ جديدة. فتواصلت مع فريق Rust وبدأت العمل على المترجم.
الأمر الرائع أن المترجم نفسه مكتوب بلغة Rust. كان مكتوبًا في البداية بلغة OCaml ثم أُعيدت كتابته بلغة Rust، وهو ما يُسمى bootstrapping. وباختصار، يحلّل المترجم كل المدخلات إلى AST، ثم تُسلَّم إلى التمثيل الوسيط عالي المستوى (HIR)، ثم متوسط المستوى (MIR)، ثم منخفض المستوى (LIR)، الذي يتولّاه LLVM. وكلما تقدّمنا عبر هذه الخطوات، اقتربنا أكثر فأكثر من كود الآلة.
من الأمور التي يجب فهمها أن المترجم مجرد برنامج، لكنه برنامج بالغ التعقيد. وتستغرق ترجمة Rust وقتًا طويلًا، خصوصًا عند تشغيل كل اختباراتها. لذا لا يمكنك أن ترمي بعض الكود فحسب ثم تقول: «انتهيت».
كان عملي الأول على المترجم في HIR. تطلّب ذلك قراءة هائلة للمكتبة القياسية (النسختين المستقرة والليلية) وتتبّع مسارات متشعّبة تستهلك الوقت. كان عليّ أن أنزل بشكل تعاودي عبر كل نوع متداخل في المترجم حتى أستنفد كل الخيارات. ومكتبة النسخة الليلية/المترجم فيها عدد ضخم من الأنواع المتداخلة. والحفاظ على الخيط الذي تتبعه يتطلب تركيزًا كبيرًا.
ومما يزيد الأمر تعقيدًا أن المترجم يعمل عليه فريق موزّع، وهو ما يعني أننا كثيرًا ما ننتهي إلى تعارضات في الدمج.
كان الأمر ممتعًا للغاية. ولا يزال هناك قدر هائل من العمل، وسأتفرّغ له في المستقبل القريب.
إضافة إلى هذه المساهمات مفتوحة المصدر، أعرف أنك المدير التقني لشركة سلسلة كتل. شخصيًا، أقرن سلسلة الكتل بخسارتي الكثير من المال في Etherium. ماذا تعني لك؟
للأسف، أصبحت سلسلة الكتل أكثر الكلمات الرنّانة طنينًا على الإطلاق.
إنها أكثر بكثير من استغلال The City ووول ستريت لموجة جديدة في العملات الرقمية. نحن في الواقع لسنا «شركة سلسلة كتل»، فنحن في Chainetix نوفّر دفاتر خاصة لتأمين بيانات الشركات بأمان. بل إننا لا نتعامل أصلًا مع العملات المشفّرة. والهدف في Chainetix هو أن نضع خبرتنا بين يدي كل من لديه فهم أساسي للبرمجة.
تضمّن عملي رسم أنظمتنا وبنيتنا التحتية من الصفر لبناء شيء متين للغاية. واخترت مشروعًا اسمه Habitat by Chef. عرفت به لأنه مكتوب بلغة Rust، وهو أمر يثير الفضول حين يصدر من شركة ضخمة مثل Chef. وخلافًا لـ Docker العادي، ينشئ Habitat صورًا يمكنها تحديث نفسها تلقائيًا والقيام بأشياء مذهلة مثل ربط الخدمات. كما ساهمت بقدر لا بأس به في مستودع Habitat المسمى core-plans.
ذكرت سابقًا مشروعك BrewStillery. يبدو أنه مهم بالنسبة لك. هل يمكن أن تخبرنا المزيد عنه؟
نعم، إنه مهم بالتأكيد!
BrewStillery أداة مفتوحة المصدر وشاملة للبيرة والنبيذ والمشروبات الروحية، كتبتها بلغة Rust وGTK3. كما أضفت سمة CSS فريدة وجميلة. وباختصار، إنها آلة حاسبة متقدمة لكل من يصنع المشروبات الروحية.
أنشأت علامات تبويب مختلفة لفصل الحاسبات الخاصة بالبيرة والشمبانيا، مع وجود تبويب عام ينطبق على صنّاع البيرة وصنّاع النبيذ والمقطّرين على حد سواء. إذا نظرت إلى معظم قوارير البيرة والنبيذ، فسترى نسبة الكحول في القارورة، أي نسبة الكحول بالحجم. ومن الأمور التي تقوم بها BrewStillery تحديد نسبة ABV تلك. وكما يمكنك أن تتخيل، هناك قدر كبير من الروعة المهووسة هنا. وأكثر ما يسعدني هو حساب لون البيرة:


تُظهر هاتان الصورتان، قبل وبعد، ما يحدث بعد إدخال الكميات. والأسلوب الذي اعتمدته لم يفعله أحد من قبل. ومن الميزات الرائعة الأخرى أن كل شيء يُحسب فورًا أثناء الكتابة. وإذا أردت التفاصيل الدقيقة عن فضاءات الألوان، فابحث عني في أحد المؤتمرات ولنتحدث عنها على كأس من البيرة!