
«۱۰۰ اشتباه در گولنگ و نحوه جلوگیری از آنها» عنوان کتابی است که اخیراََ آن را مطالعه کردم. برای این کتاب یک مجموعهی ویدیویی ساختم که میخواهم در این مطلب به معرفی آن بپردازم. این مطلب میتواند حکم یک پلیلیست توسعه یافته را برای مخاطبین این ویدیوها داشته باشد.
حدود یک سال است که یک عادت جدید را در تیم دنبال میکنیم. یک کتاب (در حوزه مهندسی نرمافزار) انتخاب میکنیم، آن را بخش به بخش مطالعه کرده، آنچه را مطالعه کردیم در جلسات هفتگی با یکدیگر به اشتراک میگذاریم.
آخرین کتابی که مطالعه کردیم، «۱۰۰ اشتباه در گولنگ و نحوه جلوگیری از آنها» بود. در ابتدا فکر میکردیم که کتاب علاوه بر آنچه میدانیم چیز زیادی به ما اضافه نکند، برای همین گفتیم بگذار یک فرصت کوتاه به این کتاب بینوا هم داده باشیم و برای این فرصت کوتاه تصمیم گرفتیم چند فصل آخر کتاب، یعنی فصلهای همزمانی (concurrency) و optimization را مطالعه کنیم. کتاب ابداََ بینوا نبود و به ما نشان داد که دانش ما در خصوص گولنگ، در بعضی حوزهها آنقدرها که فکر میکردیم عمیق نیست. توانستیم با مطالعه همین چند فصل به اشتباهاتی در دنیای واقعی پی ببریم و همچین دید عمیقتری نسبت به گولنگ پیدا کنیم. به این نتیجه رسیدیم که فصلهای اول کتاب نیز ارزش مطالعه دارد و از ابتدا شروع به خواندن کتاب کردیم.
من که قبلاََ یک دوره ویدیویی به منظور بررسی کتاب High performance MySQL تهیه کرده و بازخوردهای مثبتی از آن دریافت کرده بودم، تصمیم گرفتم که برای بررسی این کتاب نیز یک دوره ویدیویی تهیه کنم.
با توجه به بازخوردهایی که از بررسی ویدیویی قبلی دریافت کردم، تصمیم گرفتم قالب ویدیوها را تغییر دهم. ویدیوهای بررسی ۱۰۰ اشتباه در گولنگ کوتاهتر هستند. براساس بازخوردهایی که دریافت کردم، کوتاه بودن ویدیوها، این امکان را برای مخاطب ایجاد میکند که آنها را در نشستهای کوتاهتری ببیند و این موضوع حس پیشرفت بهتری برای او ایجاد میکند. اما در در کنار این مزیت، کوتاه شدن ویدیوها یک اشکال به همراه دارد: متعدد شدن ویدیوها. تعدد ویدیوها ممکن است باعث شود مخاطب برای مشاهده ویدیوها سردرگم شود: از کجا شروع کنم؟ تا کجا پیش رفته بودم؟ من دنبال موضوع بخصوصی هستم، آن را کجا پیدا کنم؟
پلیلیست یوتیوب، تا حدی این مشکل را حل میکند ولی شاید استفاده از آن به اندازه کافی ساده نباشد. به همین منظور، تصمیم گرفتم این مطلب را بنویسم. در اینجا همه ویدیوها را لیست میکنم و در مورد هر کدام توضیح مختصری ارائه کرده و لینک یوتیوب مرتبط را در مقابل آن قرار میدهم.
در این مسیر من یک تازهکار هستم، بازخوردهای شما برای من در پاسخ به این سوالات بسیار اهمیت دارد. آیا محتوایی که تولید میکنم مفید و کاربردی است؟ آیا از کیفیت لازم برخوردار است؟ آیا این مسیر را ادامه بدهم؟ پس لطفا از ارائه بازخورد با لایک یا دیسلایک، کامنت یا هر روش دیگری که میدانید، من را در این مسیر یاری کنید.
فصل ۱- Go: Simple to learn but hard to
کمی در مورد بازخوردهای ویدیوهای قبلی صحبت کردم و فصل اول کتاب را به اختصار توضیح دادم.
فصل ۲- Code and project organization
۱، ۲ و ۳ - استثنائاََ سه اشتباه در یک ویدیو
اینجا هنوز در خصوص فرمت ویدیوها به جمع بندی نرسیده بودم و سه اشتباه را در یک ویدیو گفتم.
اشتباه ۱ در مورد شدو کردن ناخواسته (Unintended variable shadowing)، اشتباه ۲ در مورد بلاکهای تو در تو (Unnecessary nested code) و اشتباه ۳ در خصوص استفاده نامناسب از فانکشن ()init است (Misusing init functions).
۴ و ۵- استثنای مکرر(!) دو اشتباه در یک ویدیو
اشتباه ۴ در خصوص استفاده بیش از حد از Getter و Setter است (Overusing getters and setters).
اشتباه ۵ به موضوعی با عنوان آلودگی اینترفیسی میپردازد (Interface pollution). در این اشتباه در خصوص نوع نگاه ما به اینترفیسها در گولنگ و تفاوت آن با زبانهای پاردایم شیگرا صحبت میشود.
۶- تعریف اینترفیس در پکیج پیادهسازی کننده آن - Interface on the producer side
در گولنگ، تعریف کردن اینترفیس در پکیجی که آن را پیادهسازی (satisfy) میکند (به نوعی) اشتباه است.
۷- برگرداندن اینترفیس در خروجی فانکشن - Returning interfaces
برگرداندن اینترفیس در خروجی فانکشن، (به نوعی) اشتباه است. این موضوع دست کلاینت را میبندد.
۸- استفاده از any (معمولا) بیمعنی است - any says nothing
استفاده از any یا اینترفیس خالی (interface{}) در عموم موارد منجر به مشکل overgeneralization خواهد شد.
مفهوم generics در گولنگ توضیح داده میشود. همچنین پیشنهاد میشود که در چه مواردی از جنریکها استفاده کنیم و در چه مواردی استفاده از جنریکها ارزش افزوده ای ایجاد نمیکند.
مفهوم type embedding در گولنگ توضیح داده میشود. همچنین بیان میشود که استفاده از type embedding میتواند منجر به اکسپورت شدن ناخواسته توابع و ... شود.
۱۱- عدم استفاده از پترن فانکشنال آپشن - Not using functional options pattern
در نبود optional parameters در گولنگ، از چه پترنهایی میتوانیم برای مدیریت کانفیگهای optional استفاده کنیم. سه روش معرفی میشود که functional options pattern کاملترین آنها است.
۱۲- ساختاربندی نامناسب پروژه - Project misorganization
در خصوص ساختار پروژهها -دایرکتوریهای پروژه- در گولنگ صحبت میشود.
در مورد تعریف پکیجها با نامها و کاربردهای بیش از حد عمومی صحبت میشود.
۱۴- بی تفاوت بودن نسبت به تداخل اسم پکیجها - Ignoring package name collisions
موضوع این اشتباه، استفاده از نام یکسان برای متغییر، پکیج و ... و پیامدهای ناشی از آن است.
۱۵- عدم کامنت گذاری مناسب - Missing code documentation
در گولنگ کامنت گذاری بر روی فانکشنها، استراکتها و ... ای که به بیرون پکیج اکسپورت میشوند، توصیه شده است.
۱۶- عدم استفاده از لینترها - Not using linters
در این بخش به اهمیت استفاده از لینترها اشاره شده است.
فصل ۳- Data types
۱۷- گیج شدن در هنگام استفاده از عبارتهای مبنای ۸ - Creating confusion with octal literals
فصل سوم کتاب به اشتباهات پیرامون data type ها -بجز string که خود یک فصل مستقل دارد- اسلایس (slice) و مپ (map) میپردازد.
در اشتباه شماره ۱۷ در خصوص عبارات مبنای ۸ صحبت شده است.
۱۸- بیتوجهی به سرریز شدن اعداد صحیح - Neglecting integer overflows
نوع داده صحیح (integer) میتواند سرریز (overflow) شود. در این اشتباه در خصوص نحوه سرریز شدن و روش جلوگیری از آن صحبت شده است.
۱۹- عدم درک صحیح اعداد ممیز شناور - Not understanding floating points
در این تاپیک در خصوص اعداد ممیز شناور (floating point) و چالشهایی که در کار با این اعداد وجود دارد، صحبت میشود.
این اشتباه در مورد عدم درک صحیح از طول (length) و ظرفیت (capacity) در اسلایسها است. این موضوع میتواند منجر به کاهش کارایی (performance) در کار با اسلایسها شود.
۲۱- مقداردهی اولیه ناکارآمد اسلایس - Inefficient slice initialization
در این اشتباه به بررسی این موضوع پرداخته میشود که عدم مقداردهی اولیه مناسب اسلایس، می.تواند چه تبعاتی به دنبال داشته باشد.
۲۲- گیج شدن در مورد تفاوت اسلایس nil و خالی - Being confused about nil vs. empty slices
این اشتباه در خصوص تفاوت (و شباهت) اسلایس nil و خالی (empty) است.
۲۳- استفاده از روش نادرست برای کنترل خالی بودن اسلایس - Not properly checking if a slice is empty
در این اشتباه به موضوع چک کردن خالی بودن اسلایس پرداخته میشود. آیا مقایسه اسلایس با nil روش مناسبی برای بررسی خالی بودن اسلایس است؟
۲۴- استفاده از روش نادرست برای کپی کردن اسلایس - Not making slice copies correctly
در این تاپیک به اشتباهات رایج در کپی کردن اسلایسها پرداخته میشود. همچنین یک روش جایگزین (به جای فانکشن copy) برای کپی کردن اسلایسها معرفی میشود.
استفاده از فانکشن append میتواند ساید افکتهای ناخواستهای به دنبال داشته باشد. در این اشتباه به این ساید افکتها و روشهای جلوگیری از آنها پرداخته شده است.