مصاحبهای با Meade Kincke که در آن او و Katrina Owen دربارهی کامپایلر Rust، یک رابط گرافیکی که رنگ آبجو را با فضاهای رنگی علمی تعیین میکند و کتابش «A Practical Guide To Rust» صحبت میکنند.
سلام Meade. ممنون که با ما گفتوگو کردید. میخواستیم با شما صحبت کنیم چون شما پرکارترین منتوری هستید که در مسیر Rust داریم. به بیش از ۴۰۰ دانشجو کمک کردهاید. چطور با Exercism آشنا شدید؟
یکی از اعضای سابردیت Rust در Reddit پستی گذاشته بود دربارهی اینکه مسیر Rust در Exercism به منتور نیاز دارد، پس دربارهاش تحقیق کردم. خیلی خوشحالم که این کار را کردم، چون بسیار ارزشمند است و همه بسیار مهربان و قدردان بودهاند. با دانشجوهایم در Exercism ارتباطهای فوقالعادهای ساختهام و کمک کردن به آنها را بسیار دوست دارم.
داستان خاصی هست که برایتان برجسته باشد؟
بله، یک تمرین Rust خاص هست که بسیار محبوب بوده: سهگانهی فیثاغورسی.
رایجترین مشکل در این تمرین معمولاً کارایی است. بیشتر مردم ابتدا آن را با حلقههای for تودرتو حل میکنند که دستکم O(n²) است و بسیار ناکارآمد. هدف من این است که دانشجوهایم را به یک راهحل خطی برسانم: O(n).
روش من پرسیدن سؤال است. با این پرسش شروع میکنم که آیا میخواهند متد iterator در Rust را یاد بگیرند، چون مزایای فراوانی دارد؛ یکی از آنها این است که میتوانید از کتابخانهی Rayon برای موازیسازی کارتان استفاده کنید.
پس از پاسخ «بله، لطفاً»، یکی از دانشجوهایم اشاره کرد که در حال یادگیری Rust است چون به این فکر میکند که از آن برای کنترل نهفته و بعد پردازش خروجی عظیم دادههایش استفاده کند. بنابراین موازیسازی برایش مهم است. او خوشحال بود که من از یک تمرین بهظاهر ساده برای آموزش بخشهای پیچیدهتر و اصطلاحیتر Rust استفاده کردم.
حالا به لطف Exercism، او مرا استخدام کرده تا بهصورت یکبهیک به او آموزش دهم و قرار است با هم روی چند پروژهی آزمایشی کار کنیم. وقتی او کل شرکت را بهطور کامل به Rust منتقل کند، به کل تیمش هم آموزش خواهم داد.
از کار با دانشجوهایی که منتوریشان کردهام واقعاً لذت بردهام و میخواهم این کار همچنان گسترش پیدا کند.
آنقدر از آن خوشم میآید که حالا داوطلب شدهام تا نگهدارندهی مسیر Rust باشم و بیشتر در پشت صحنه کمک کنم.
این ارتباط انسانی چقدر مهم است! شما نویسندهی A Practical Guide to Rust هستید. آن کتاب دربارهی چیست و انگیزهی شما از نوشتنش چه بود؟
این کتاب را نوشتم تا به دیگران کمک کنم جنبههای خاصی از Rust را بهتر درک کنند. مستندات زیادی دربارهی این زبان وجود ندارد و حس کردم به متنی نیاز است که طنز داشته باشد و مفاهیم زبان را به شکلی ملموس توضیح دهد. این کتاب راهنماهایی برای برخی مباحث پایه و پیشرفته ارائه میدهد. میخواهم مخاطبان درکی روشن از کاربرد عملی و واقعی این زبان پیدا کنند. مثالهای واقعی ارائه میدهد، نه فرضی.
همیشه میدانستم که قرار است کتابی بنویسم. وقتی دیدم دارم از راه دور به یک همکار برنامهنویسی با Rust را آموزش میدهم، ساختار کتاب خودبهخود شکل گرفت. او هرگز قبلاً به کد دست نزده بود و لازم بود اصطلاحات و روشهایی را که ما نِردها بدیهی میدانیم، به شکلهای تازه و قابلفهم توضیح دهم. وقتی مفهوم مالکیت در Rust را بحث میکردم، از قیاسهایی مثل قرض گرفتن کتاب از کتابخانه در مقابل مالکیت کتاب استفاده کردم.
همچنین مثالهایی از پروژهی خودم BrewStillery را گنجاندهام. این راه خوبی است برای دیدن اینکه چیزهایی مثل struct و enum در یک برنامهی واقعی چگونه کار میکنند. همچنین نشان میدهد چطور از موازیسازی به شکلی واقعی استفاده کنیم.
وقتی کتاب را مینوشتم، میدانستم که میخواهم مثل یک داستان خوانده شود، نه فقط یک راهنمای مرجع. کتاب بر خودش بنا میشود، اما اجزایش مستقل هم میایستند. تفاوتش مثل آشپزی با یک کتاب شیمی در مقابل تماشای قسمتی از «The French Chef» اثر Julia Child است.
اوه، جالب است. کتاب را برای چه کسی نوشتید و خواننده از آن چه به دست میآورد؟
برای هر کسی است که میخواهد 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 بود. شامل مقدار عظیمی خواندن در کتابخانهی استاندارد (هم stable و هم nightly) و دنبال کردن سرنخها در عمق مسائل بود. مجبور بودم تا انتها در همهی انواع تودرتوی کامپایلر بهصورت بازگشتی پایین بروم تا اینکه همهی گزینهها را بررسی کرده باشم. کتابخانهی nightly/compiler انواع تودرتوی زیادی دارد. نگه داشتن رشتهای که دنبال میکنید نیاز به تمرکز زیادی دارد.
برای پیچیدهتر شدن ماجرا، روی کامپایلر یک تیم توزیعشده کار میکند، یعنی اغلب به تعارضهای ادغام میرسیم.
خیلی لذتبخش بود. هنوز کارهای زیادی مانده که در آیندهی نزدیک به آنها خواهم پرداخت.
علاوه بر این مشارکتهای متنباز، میدانم که شما مدیر ارشد فناوری یک شرکت بلاکچین هستید. من بلاکچین را با از دست دادن پول زیادی در Etherium به یاد میآورم. برای شما چه معنایی دارد؟
متأسفانه بلاکچین به پرهیاهوترین کلمهی مُدی تبدیل شده که تا به حال مُد شده است.
این بسیار بیشتر از این است که The City و والاستریت از یک روند تازه برای ارز دیجیتال پول دربیاورند. ما در واقع یک «شرکت بلاکچین» نیستیم؛ ما در Chainetix دفترهای کل خصوصی ارائه میدهیم تا دادههای یک شرکت را امن نگه داریم. در واقع، ما حتی با ارز دیجیتال سروکار نداریم. هدف ما در Chainetix این است که تخصصمان را به دست همهکسانی برسانیم که درکی پایه از برنامهنویسی دارند.
کار من شامل طراحی سیستمها و زیرساختهایمان از صفر بود تا چیزی بسیار محکم بسازیم. پروژهای به نام Habitat by Chef را انتخاب کردم. دربارهاش فهمیدم چون به Rust نوشته شده بود و این از شرکتی به بزرگی Chef جالب بود. برخلاف Docker معمولی، Habitat ایمیجهایی میسازد که میتوانند خودشان را بهطور خودکار بهروزرسانی کنند و کارهای شگفتانگیزی مثل service bindings انجام دهند. همچنین بهطور قابل توجهی به مخزن core-plans در Habitat کمک کردهام.
قبلاً به پروژهتان، BrewStillery، اشاره کردید. به نظر میرسد برایتان مهم است. میتوانید کمی بیشتر دربارهاش برایمان بگویید؟
بله، قطعاً همینطور است!
BrewStillery یک ابزار متنباز و همهکاره برای آبجو، شراب و مشروبات است که آن را با Rust و GTK3 نوشتم. یک تم CSS هم اضافه کردم که به شکلی زیبا بینظیر است. در یک جمله، یک ماشینحساب پیشرفته برای هر کسی است که مشروبات تولید میکند.
تبهای مختلفی ساختهام تا ماشینحسابهای مخصوص آبجو و شامپاین را جدا کنم و در همان حال یک تب عمومی داشته باشم که برای آبجوسازان، شرابسازان و تقطیرکنندگان یکسان به کار میآید. اگر به بیشتر بطریهای آبجو و شراب نگاه کنید، درصد الکل آن بطری را میبینید، یعنی درصد حجمی الکل. خب، یکی از کارهایی که BrewStillery انجام میدهد تعیین همین درصد حجمی الکل است. همانطور که احتمالاً میتوانید حدس بزنید، کلی چیزهای شگفتانگیز و نِردی اینجا دخیل است. چیزی که بیش از همه از آن راضیام محاسبهی رنگ آبجو است:


این تصاویر قبل و بعد نشان میدهند پس از وارد کردن مقادیر چه اتفاقی میافتد. روشی که من به کار بردهام چیزی است که قبلاً کسی انجامش نداده است. یک ویژگی عالی دیگر این است که همهچیز همانطور که تایپ میکنید بهصورت زنده محاسبه میشود. اگر جزئیات دقیق دربارهی فضاهای رنگی را میخواهید، در یک کنفرانس سراغم بیایید تا با هم سر یک لیوان آبجو دربارهاش حرف بزنیم!