ویرگول
ورودثبت نام
شهرام شبیری
شهرام شبیری
شهرام شبیری
شهرام شبیری
خواندن ۷ دقیقه·۱ سال پیش

۱۰۰ اشتباه در گولنگ و نحوه جلوگیری از آنها

«۱۰۰ اشتباه در گولنگ و نحوه جلوگیری از آنها» عنوان کتابی است که اخیراََ آن را مطالعه کردم. برای این کتاب یک مجموعه‌ی ویدیویی ساختم که می‌خواهم در این مطلب به معرفی آن بپردازم. این مطلب می‌تواند حکم یک پلی‌لیست توسعه یافته را برای مخاطبین این ویدیوها داشته باشد.

چطور این ایده شکل گرفت؟

حدود یک سال است که یک عادت جدید را در تیم دنبال می‌کنیم. یک کتاب (در حوزه مهندسی نرم‌افزار) انتخاب می‌کنیم، آن را بخش به بخش مطالعه کرده، آن‌چه را مطالعه کردیم در جلسات هفتگی با یکدیگر به اشتراک می‌گذاریم.

آخرین کتابی که مطالعه کردیم، «۱۰۰ اشتباه در گولنگ و نحوه جلوگیری از آنها» بود. در ابتدا فکر می‌کردیم که کتاب علاوه بر آنچه می‌دانیم چیز زیادی به ما اضافه نکند، برای همین گفتیم بگذار یک فرصت کوتاه به این کتاب بی‌نوا هم داده باشیم و برای این فرصت کوتاه تصمیم گرفتیم چند فصل آخر کتاب، یعنی فصل‌های همزمانی (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 خواهد شد.

۹- گیج شدن در مورد اینکه بلاخره کجا باید از جنریک استفاده کنیم - Being confused about when to use generics

مفهوم generics در گولنگ توضیح داده می‌شود. همچنین پیشنهاد می‌شود که در چه مواردی از جنریک‌ها استفاده کنیم و در چه مواردی استفاده از جنریک‌ها ارزش افزوده ای ایجاد نمی‌کند.

۱۰- آگاه نبودن از تبعاتی که ‌type embedding می‌تواند به دنبال داشته باشد - Not being aware of the possible problems with type embedding

مفهوم type embedding در گولنگ توضیح داده می‌شود. همچنین بیان می‌شود که استفاده از type embedding می‌تواند منجر به اکسپورت شدن ناخواسته توابع و ... شود.

۱۱- عدم استفاده از پترن فانکشنال آپشن - Not using functional options pattern

در نبود optional parameters در گولنگ، از چه پترن‌هایی می‌توانیم برای مدیریت کانفیگ‌های ‌optional استفاده کنیم. سه روش معرفی می‌شود که functional options pattern کامل‌ترین آنها است.

۱۲- ساختاربندی نامناسب پروژه - Project misorganization

در خصوص ساختار پروژه‌ها -دایرکتوری‌های پروژه- در گولنگ صحبت می‌شود.

۱۳- ساختن پکیج‌های خیلی عمومی با نام‌هایی مثل common, base, utility و ... - Creating utility packages

در مورد تعریف پکیج‌ها با نام‌ها و کاربردهای بیش از حد عمومی صحبت می‌شود.

۱۴- بی تفاوت بودن نسبت به تداخل اسم پکیج‌ها - 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) در اسلایس - Not understanding slice length and capacity

این اشتباه در مورد عدم درک صحیح از طول (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 برای چسباندن المان‌های جدید به اسلایس - Unexpected side effects using slice append

استفاده از فانکشن append می‌تواند ساید افکت‌های ناخواسته‌ای به دنبال داشته باشد. در این اشتباه به این ساید افکت‌ها و روش‌های جلوگیری از آنها پرداخته شده است.


اشتباهمطالعه کتاب
۲
۱
شهرام شبیری
شهرام شبیری
شاید از این پست‌ها خوشتان بیاید