چرا من از Go استفاده میکنم؟

شاید شما هم مثل من برای استفاده از زبان‌های مختلف گاهی دچار سردرگمی و ابهام بودین؛ اینکه از کدوم زبان و تکنولوژی برای پروژه‌ی آینده استفاده کنم؟ آیا جاوا انتخاب مناسبی هست چون روش تسلط کاملی دارم؟ یا بهتره با پایتون کار کنم که خیلی ساده و چابکه؟ اما پرفورمنس برنامه‌هایی که با ++C نوشته میشه خیلی بیشتره و نکنه دارم اشتباه انتخاب میکنم؟
از این دست سوالات شاید ذهن شما رو هم مشغول کرده باشه؛ در این مقاله می‌خوام تجربه‌ی شخصی خودم در انتخاب زبان Go رو براتون بگم.




داستان گزینش زبان Go

برای یک پروژه‌ی تحت وب تصمیم گرفتم جهت تنوع، از تکنولوژی و زبان جدیدی استفاده کنم تا هم چیز جدیدی یاد گرفته باشم و هم نهایتا خروجی با کیفیت و بهتری داشته باشم. گوگلی زدم ببینم در مارکت زبان‌های برنامه‌نویسی الان چیا ترند هستند و آینده‌ی خوبی دارند که حداقل چیزی که یاد می‌گیرم به این زودی‌ها منسوخ و از رده خارج نشه. سری به پروژه‌ی GitHut زدم و پیشنهاد می‌کنم شما هم گاهی به آمار استفاده از زبان‌های برنامه‌نویسی در گیت‌هاب سر بزنید:


madnight.github.io/githut
madnight.github.io/githut


خلاصه بعد از کمی تحقیق و آینده‌نگری به زبان Go رسیدم. جالب بود، سرعت بالا در عین سادگی!

واقعیتش همون اول کمی نسبت بهش گارد گرفتم چون شعارش کارایی و پرفورمنس بالا در عین سادگی سینتکس بود و همیشه ادعای اثبات شده‌ی سرعت و بهینه‌گی رو توی زبان‌هایی مثل C و ++C قبول داشتم. چون سال‌های دور باهاشون کار می‌کردم و روی C هم تا حدی تعصب داشتم؛ به لحاظ پرفورمنس از نظر من با هیچ زبان دیگه‌ای قابل مقایسه نیست، حتی وقتی از Linus Torvalds (خالق لینوکس) می‌پرسند چرا فقط با زبان C سیستم‌عامل لینوکس رو توسعه دادی و سمت زبان دیگه‌ای برای این کار نرفتی؟ در جواب میگه:

I really love hardware... If you think like a computer, writing C actually makes sense...


https://www.youtube.com/watch?v=CYvJPra7Ebk


نظر ایشون قابل احترام، اما در عین حال دیگه همه اینو می‌دونیم که C زبان بسیار سخت گیری هست و اصلا رفاقتی با برنامه‌نویس‌های راحت طلب نداره و البته قرار نیست همه سیستم عامل بنویسند! پس باید به فکر چاره‌ای برای دستیابی به پرفورمنس بالا در عین سادگی بود.


ارزیابی اولیه‌ی امکانات Go

خلاصه سعی کردم تعصب رو کنار بذارم و امکانات و توانایی‌های Go رو مورد ارزیابی دقیق‌تر قرار بدم و نیازهایی که انتظار داشتم رو ازش بیرون بکشم.

موردی که از ابتدا منو به شدت جذب کرد این بود که برنامه‌ای که با Go می‌نویسید، تقریبا بر روی تمامی پلتفرم‌ها می‌تونید ازش خروجی بگیرید اونم تنها با یک تک فایل اجرایی! بدون هیچگونه پیش‌نیاز یا کتابخونه‌ی وابسته که لازم باشه از قبل روی مقصد وجود داشته باشه! جالبه نه؟ مخصوصا اینکه فایل باینری شما به صورت کاملا Native برای اون پلتفرم خروجی گرفته میشه و این یعنی بالاترین پرفورمنس و کمترین مصرف منابع رو موقع اجرا خواهید داشت.

تا اینجا از دید من فوق‌العاده بود! هرچی جلوتر می‌رفتم می‌دیدم کاری نیست که بخوام انجام بدم و دستم بسته باشه یا مثلا مثل کدنویسی در C با سختی و ریختن اشک بخوام انجامش بدم اما شباهت‌هایی هم با جد بزرگوار به چشم می‌خورد، مثل حضور اشاره‌گرها (*) مواردی که اون موقع لازم داشتم از جمله یک فریم‌ورک وب برای پیاده‌سازی RESTful و همچنین درایور ارتباط با دیتابیس پستگرس بود که چندین پکیج مختلف توی کامیونیتی Go موجود بود و هر کدوم امکانات و کمبودهایی داشتند، ولی مهم این بود که در حال توسعه بودند و قرار نیس به این زودی‌ها گوگل بیخیال این زبان بشه!

صادقانه موردی که در ابتدای کار زیاد خوشم نیومد اما الان دیگه بهش عادت کردم و دوسش دارم اینه که شما در زبان Go برای مشخص کردن محدوده‌ی دسترسی یک متغییر یا متد، دیگه از کلمات کلیدی public و private نمی‌تونید استفاده کنید و این تفاوت تنها با حالت کوچک یا بزرگ بودن حرف اول متد مشخص میشه! به این صورت که برای متد‌های public باید حرف اول رو بزرگ بنویسید و برای حالت private حرف اول کوچک. شاید در شروع کمی عجیب به نظر بیاد اما رفته رفته خلاصه شدن کدها باعث میشه شما هم از این الگو خوشتون بیاد. (نهایتا این الگو از نظر من خیلی بهتر از double-underscore بود ?️)

راستی نگفتم این زبان رو سال 2009 برو بچ شرکت گوگل زحمت کشیدن طراحی و منتشر کردن و هر روز داره جامعه‌ی بزرگتری برای توسعه‌ی پکیج‌های Go شکل می‌گیره. واقعیت غیر قابل انکار اینه که همیشه حرف از پکیج و کامیونیتی که میشه، اولین زبانی که به ذهن آدم میرسه پایتون هست! یک دنیا بسته‌ی نرم‌افزاری با پشتیبانی هزاران برنامه‌نویس زحمت‌کش، یعنی هرچیزی که دلت بخواد سه سوته پیدا میکنی؛ اما سوال اینجاست، آیا پایتون برای انجام هر کاری مناسبه؟


مقایسه Go با Python (با دید شخصی)

اینجا لازمه اشاره کنم که این مقایسه صرفا با دید شخصی انجام شده و هیچ تعصبی روی هیچکدوم ندارم و هر دوی این زبان‌های محبوب و پرطرفدار رو در جای خودش استفاده میکنم و اگر شما نظر دیگری دارید قابل احترام هست.

پایتون رو سال‌های قبل بعنوان یک زبان اسکریپت‌نویسی عالی بعنوان جایگزین Bash تحت لینوکس استفاده می‌کردم و هنوزم دوسش دارم. با اینکه می‌دونستم کاربرد پایتون بسیار فراتر از اسکریپت‌نویسی هست، اما امروز با Go آشنا شده بودم و باید یک وجه تمایز ویژه بین این دو زبان پیدا می‌کردم تا با خیال راحت ازش برای پروژه‌های سطح بالاتر استفاده کنم.

سرعت!

بله همین یک دلیل برای من استفاده از Go رو توجیه می‌کرد چون من از سال‌های دور بیماری پرفورمنس داشتم. چیزی حدود 40 برابر سریعتر از پایتون! برای اطمینان می‌تونید به این مقایسه نگاهی بندازید یا خودتون برای اثبات به گوگل متوسل بشین:

https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go-python3.html

البته واضح بود، پایتون یک زبان داینامیک و بر پایه‌ی مفسر هست و قبل از اجرا باید تمامی پیش‌نیازها رو بر روی مقصد نصب داشته باشید و واقعیتش زیاد در قید و بند استفاده‌ی بهینه از منابع سرور که شخصا خیلی روش حساس هستم نیست! بالعکس Go استاتیک و کد شما برای اجرا با تمامی وابستگی‌هاش کامپایل میشه و نهایتا یک فایل باینری، کاملا Native و بدون هیچ پیش‌نیازی روی پلتفرم مقصد و در بهینه‌ترین حالت اجرا میشه؛ پس قاعدتا نمیشه انتظار سرعت بالا از پایتون در مقایسه با Go رو داشت! در مقابل کدنویسی در پایتون بسیار ساده و چابک هست و همچنین پایتون کامیونیتی وسیعی داره که برای هر برنامه‌نویسی وسوسه انگیز هست.

پشتیبانی از هم‌روندی توکار

از جمله امکانات ویژه‌ای که به صورت توکار در زبان Go وجود داره، هم‌روندی (Concurrency) هست. یعنی شما بدون استفاده از کتابخونه یا ابزار جانبی خاصی می‌تونید برنامه‌هایی با وظایف هم‌روند اونم با بهترین کیفیت بنویسید. امکاناتی مثل Goroutine و Channel از مهمترین اجزای مکانیزم هم‌روندی هستند.

درصورتی که توی پایتون شما چنین چیزی رو به شکل توکار ندارید و نهایتا می‌تونید به صورت Parallel کد بنویسید و یا از بسته‌های متفرقه برای پیاده‌سازی هم‌روندی استفاده کنید و قاعدتا این امکان با حالت توکار Go قابل مقایسه نخواهد بود.

اجبار به خوش کدنویسی

برعکس کدنویسی در پایتون که شما هر مدل دلتون بخواد به سادگی کد میزنید، ساختار تعریف می‌کنید و به کسی پاسخگو نیستید! (شاید هم به خودتون پاسخگو باشید که قابل تحسینه) در زبان Go از این خبرا نیست و در عین سادگی سینتکس، شما باید قواعد خاصی رو هم رعایت کنید و نهایتا کد تمیز و بدون شلختگی در اختیار خواهید داشت که توسعه‌ی پروژه در آینده برای یک برنامه‌نویس دیگه بسیار راحتتر و خواناتر خواهد بود. همین خاصیت و عدم پیچیدگی در کدنویسی باعث میشه که این زبان برای پیاده‌سازی معماری Microservices و همچنین پروژه‌های با ابعاد بسیار بزرگ و اینترپرایز ایده‌آل باشه که خودتون می‌تونید با کمی گوگل در مورد پیاده‌سازی این معماری بر بستر Go و همچنین قابلیت‌های بی‌شمار دیگه‌ای که این زبان داره اطلاعات دقیق‌تری کسب کنید.

نهایتا پروژه‌ای که با Go نوشتم تحت یک Image داکر با حجم حدود 7 مگابایت که فقط حجم خروجی باینری کدهای خودم بود، بدون هیچ پیش نیاز داکری، یعنی:

FROM scratch

خروجی گرفتم و هنوز داره تر و تمیز با مصرف کمترین منابع، روی سرور کارشو انجام میده؛ پیشنهاد میکنم اگر دلتون خواست زبان جدیدی یاد بگیرید، حتما Go رو بعنوان یک گزینه با آینده‌ای درخشان در نظر داشته باشید.