یاد گرفتن یه زبون برنامه نویسی جدید میتونه خیلی چالش داشته باشه. از کجا شروع کنم؟ چی یاد بگیرم؟ الان کجای کارم؟ آیا کارم خوبه؟ تا کجا میتونم کشش بدم؟ فکر میکنم این سوالا برای هرکسی که بخواد وارد یه حوزه جدید بشه پیش میاد.
یادمه اوایل که میخواستم فرانت-اند یاد بگیرم و کار کنم، دنیایی بدون AI و کورس ها و پکیج های چند میلیونی بود. اون موقع فقط علاقه و پشت کار و تلاش مستمر و عشق به کار بود که منو هل میداد که ادامه بدم. اون موقع دسترسی به منتور ها و افرادی که بتونن کمکت کنن به سادگی امروز نبود.
ولی امروز ماجرا متفاوته، امروز خیلی چیزا هست که اگه بدونی چطور ازشون استفاده کنی میتونن سرعت پیشرفتت رو به چشم چشم گیری بیشتر کنن. میتونی از ویدئو های یوتوب شروع کنی و اصول اولیه رو یاد بگیری و بعد بری سراغ ساختن یه چیزی. هر چیزی. نباید یه چیز کامل باشه، فقط یه چیزی که کار کنه کافیه. بعد بهبودش بدی و بهترش کنی. برگردی عقب و اشتباهاتت رو ببینی. یه جاهایی از کاری که قبلا کردی درس میگیری و دوباره تکرارش نمیکنی. میتونی با یه منتور صحبت کنی و ازش مشورت بخوای. میتونی توی لینکدین با افراد با سابقه اون حوزه تماس بگیری و مسیر بگیری. میتونی به کمک AI مسیرت رو بهبود بدی.
برای من ولی یه مقدار متفاوت بود. خب من تقریبا ۱۰ ساله که دارم کار میکنم. خیلی چیز ها رو میدونم. با خیلی مفاهیم هر چند شاید دور، ولی آشنا هستم. توی کار باهاشون برخورد داشتم، بعضی وقتا خیلی چیزا رو میشنیدم ولی نمیدونستم چی هستن یا دارن چیکار میکنن. اما در نهایت میدونستم به چی میخوام برسم. قدم اول برای من این بود که ببینم کجا میخوام برم.
بعد از اینکه از ایران خارج شدم تازه کلی مفاهیم جدید تر هم بهشون برخورد کردم که توی ایران به خاطر محدودیت های داخلی یا تحریم یا ضعف های فنی و کلی دلیل دیگه اصلا اطلاعی راجع بهشون نداشتم. پس تازه انگار چشمام باز شد، برای من خارج شدن از ایران صرفا رهایی از استفاده از ابزار های دور زدن فیلتر و تحریم نبودن، استفاده از کارت های بانکی متصل به شبکه جهانی نبودن. برای من دسترسی به اطلاعات و فضایی بود که حالا میتونم ازشون خیلی بهینه تر استفاده کنم.
از این صحبتا که بگذریم، براتون بگم که من چه کار کردم که GO یاد بگیرم. پس مطلب تازه از الان شروع میشه.

من تسلط نسبتا خوبی روی JavaScript دارم. هنوز نمیگم من استاد این زبون هستم ولی جایی ایستادم که میتونم باهاش یه کارایی بکنم. میتونم بگم که دیگه برایم فریم-ورک مهم نیست. میتونم بگم برام دیگه کتابخونه مهم نیست چون باور دارم همیشه اگر تسلط خوبی روی زبان وجود داشته باشه، باقی چیز ها ابزار هستن.
این ابزار ها برای ما کار رو راحت میکنن ولی ما باید بدونیم دقیقا زیر اون لایه خوشگل بالایی چه پیچیدگی هایی هست. نه اینکه خودمون بریم زیر و بم همه چیز رو دربیاریم، بلکه دست کم کنجکاو باشیم و صرفا ابزار ندونیم.
هر زبان برنامه نویسی به نظرم ۳ اصل پایه ای و اساسی داره. پس نقطه شروع خوبیه که از همینجا شروع کنیم یادگیری. این سه اصل این ها هستند:
این سه مفهوم توی تمام زبان ها اشتراک دارن. شاید Syntax ها متفاوت باشن ولی این سه اصل وجود دارن. میدونم که کلی چیز دیگه هم هست مثل OOP یا Function ها یا FP یا حتی موارد پایه ای تر مثل Memory Management و خیلی چیزای دیگه.
اما من ساده شروع کردم. اول یاد گرفتم همین سه کار توی Go چه شکلی انجام میشن. چه تایپ های مختلفی توی این زبون وجود داره. برای اینکه تجربه خوبی روی JS داشتم خیلی سعی میکردم به شکل مقایسه ای بهش نگاه کنم. مثلا تعریف متغیر توی JS چطور انجام میشد، و حالا توی Go به چه صورتی انجام میشه. توی JS ما چه تایپ هایی داشتیم و حالا توی Go چطور این اتفاق میوفته.
به کمک ChatGPT این مقایسه کردن ها برام خیلی ساده تر انجام شد. شاید بگم من تو چند ساعت کل سینتکس رو یاد گرفتم. حتی موارد خیلی عجیب و غریبی که برام خییییلی عجیب بود، به کمک روش مقایسه کردن هم شیرین شد هم قابل فهم. بذارید براتون چند تا مثال بزنم که به نظر خودم خیلی جالبن:
البته یه تغییر خیلی بزرگی که کلا JS نسبت به Go داشت و این خیلی مهمه قبل از شروع، این بود که توی JS شما کدتون به صورت runtime اجرا میشه و کامپایل نمیشه. مگه اینکه از TS استفاده کنید ولی بذارید باهاتون صادق باشم: واقعا مدل کار کردن TS نسبت به یه زبونی مثل Go که کامپایلری هست انقدر احمقانه و ساده است که من بعد از یه مدت کار کردن با Go اینطوری ام که واقعا TS خیلی شت هست 😂. بگذریم... پس قبل اینکه شما کدتون رو بخواید اجرا کنید توی Go بر خلاف JS باید کدتون کامپایل بشه. اگه مشکل runtime داشتیم پس چی میشه؟ بعدا میرسیم بهش.
بعد از یاد گرفتن اولیه سینتکس، شروع کردم به ساختن چیز های خیلی ساده. همون برنامه های احمقانه ای که همه مون تو مسیر برنامه نویسی انجامش دادیم. یه برنامه که چندتا عدد بگیره و جمع کنه یا یه برنامه که سن شما رو بتونه حدس بزنه یا از طریق CMD بتونه یه فایلی بسازه و ادیت کنه و ...
هدفم ساختن یه چیز مفید و به درد بخور نبود، هدفم این بود که با سینتکس بیشتر آشنا بشم. با پکیج های built-in زبان آشنا بشم و قابلیت های زبون رو بشناسم. پس کمالگرایی رو کامل گذاشتم کنار. برام مهم نبود که پرفورمنس کدی که نوشتم خوبه یا نه، برام مهم نبود کدی که مینویسم چقد style درستی داره یا ... فقط میخواستم بنویسم که یاد بگیرم.
بعد رفتم سراغ نوشتن اپلیکیشن هایی که چند تا فایل داشتن. گفتم بذار کدم رو تمیز کنم، پس قدم اول این بود که بعضی توابع رو ببرم توی یه فایل دیگه. خب توی JS ما میتونیم از توابع یا متغیر یا هرچیز دیگه ای که دوست داریم تو یه فایل دیگه استفاده کنیم. به شرطی که اونجا export کرده باشیم و جایی که میخوایم استفاده کنیم import کنیم. بماند که این وسط برای اینکه این فایل ها رو یکجا تجمیع کنیم (چون در نهایت کد رو میدیم browser اجرا کنه) نیاز داریم به ابزار های build گرفتن مثل Webpack یا Rollup و ... اگه توی Node هم باشیم بازم بستگی به یه سری پارامتر دیگه داره که کاری نداریم حالا.
ولی توی Go این کار به کمک package انجام میشه. یعنی نیازی نیست حتما توی اون فایل بهش اشاره کنی که میخوام این تابع رو export کنم. البته میگی ها... ولی اصلا شبیه JS نیست! خیلی راحت میتونی توابع ات رو توی یه namespace بذاری و حرف اول اون تابعی که میخوای جای دیگه استفاده کنی رو بزرگ بنویسی. مثلا به جای اسم yechizi بذاری Yechizi همین یعنی داری این تابع رو export میکنی! چه باحال!
بعد اینکار گفتم خب برم چندتا پکیج third-party نصب کنم. میخواستم یه اپلیکیشن بسازم که به یه درخواست فقط جواب بده. مثلا روی پورت ۳۰۰۰ بیاد بالا و یه ping/pong ساده رو هندل کنه. دیدم که برای انجامش میتونم از پکیج های built-in استفاده کنم. که خداییش کار کردن باهاش هم خیلی ساده بود ولی گفتم حالا که اول نیت کردم یه پکیج نصب کنم، اصلا اینجا تفاوتش با js چطوریه؟ اصلا فرض کنیم Go نداشت این پکیج رو خودش.
خب ما توی JS یه پکیج منیجر داریم که اصولا یا npm هست یا yarn یا npmn یا ... که در نهایت یه فایل package.json میسازن و یه lock فایل که check sum ها رو نگه میداره، همه depencency ها رو لیست میکنن و ورژن کنترل رو انجام میدن. پکیج های نصب شده هم میذارن تو یه سیاه چاله ای به اسم node_modules که معرف حضورتون هست که اگه منو دنبال کرده باشید.
دیدم روش کار کردنش توی Go در عین سادگی، خیییییییلی موثر هم هست. اینجا هم ما یه فایلی مشابه package.json و lock داریم ولی فقط از دور شبیه اش هست! هیچ خبری از node_modules یا معادلش نیست. مدل import کردن این پکیج ها به خیلی شبیه deno انجام میشه (البته به نظرم deno شبیه go هست و نه برعکس) یعنی هرجا که شما میخوای از یه پکیجی استفاده کنی مستقیم آدرسش رو مینویسی. حالا ممکنه این آدرس یه لینک گیت باشه یا پکیج داخلی خود اپلیکیشن خودت.
اول به نظر میرسید که خیلی پیچیده یا سردرگم کننده است، ولی یه مقدار که باهاش کار کردم متوجه مزایای دیگه اش هم شدم. مثلا توی JS اگه دوتا پکیج به یه اسم یا آدرس داشته باشیم برای import کردنشون عملا راهی نداریم. ولی اینجا شما میتونید دقیقا از یک آدرس (پکیج) توی یک فایل چند بار با اسامی مختلف import کنید. اشتباه برداشت نکنید البته، میدونم که توی JS قابلیت alias کردن هست، ولی مثلا شما دوبار توی دو خط نمیتونید از یه پکیج import کنید ولی اینجا به کمک اون namespace ها اینا با هم تداخلی نمیخورن. گرچه باز هم امکان alias کردن هم وجود داره که خب... چی از این بهتر.
تا جایی که یادم میومدم تفاوت ها رو گفتم و اشاره کردم. ولی این مسیر ادامه داشت. نم نم داشتم اپلیکیشنی مینوشتم که یه کاری انجام میداد. نیاز شد که بیشتر با دیتا تایپ های مختلف کار کنم مثل slice ها یا map ها. اینکه چطور بتونم تغییرشون بدم. نم نم از ذخیره اطلاعات روی memory بیام و روی فایل ذخیره کنم و بعد ببرمش روی یه دیتابیس که تو قسمت های بعد میرسیم به اونجا هم.
پینوشت: هدفم از ثبت کردن این مسیر دو چیز هست. اول اینکه برای خودم بمونه یادگاری و بعدا بتونم بهش سر بزنم شاید بفهمم کجا ها رو درست و کجا ها رو اشتباه اومدم. دوم اینکه شاید برای شما هم که میخواید یه زبون یا تکنولوژی جدید یاد بگیرید، بتونه ایده ای بده از اینکه راه رو چطور برید و قدم بعدی رو چطور تعیین کنید. البته اینا تجربه منه.
قسمت دوم: