ریویونامه

سلام

می‌خواهیم دربارۀ کد ریویو صحبت کنیم، از چرایی تا چگونگی.

چرا کد ریویو؟

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

این موقع بود که مغزهای متفکر تیم به‌کار افتادند!

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

خیلی زود دیدیم که مراج نشسته لب پنجره و با دلی شکسته می‌خواند:

«با هجوم پول‌ریکوئست فراوان چه کنم؟

با غم‌انگیزترین نغمۀ توسعه‌دهنده چه کنم؟

در غمش چشمۀ خوناب ز چشمم جاری‌ست

بی تو با جوشش این پول‌ریکوئست‌ها چه کنم؟»

دوباره مغزهای متفکر دست‌به‌کار شدند و ضمن یادآوری این نکته به مراج که دیگر شعر نگو، شروع کردند به فکر کردن دربارۀ مشکل. نتیجه‌ای که از تفکرات عمیق‌شان حاصل شد، این بود که به‌جای زیاد مرج‌کننده، مرج‌کنندۀ زیاد داشته باشیم.

و این شروعی بود برای داستان «کد ریویو» در تیم ما.

مزایای کد ریویو

۱. تقویت انگیزه: وقتی که قرار باشد کد و کار من را چند نفر ببینند، ناخودآگاه کارم را تمیزتر و بادقت‌تر انجام می‌دهم‌. اینکه بقیه کار و ایده‌های من را ببینند، جذاب است؛ نظر بقیه، چیزهایی که می‌توانم به بقیه یاد بدهم و از بقیه یاد بگیرم.

۲. انتشار دانش: کد ریویو از روش‌های بسیار ارزشمند برای مشارکت در هر پروژه محسوب می‌شود.

ـ کد ریویوکننده می‌تواند با پیشنهادها و تغییراتی که در کد ریویو می‌دهد، دانشی را که دارد، در اختیار بقیه بگذارد.

ـ کد ریویودهنده می‌تواند ایده‌ها و الگوریتم‌هایش را در کد ریویو با بقیۀ شرکت به‌اشتراک بگذارد.

ـ دانش مربوط به ویژگی یا کاری که کد ریویودهنده انجام می‌دهد، دیگر مختص به خود فرد نمی‌ماند و سایرین هم از آن خبر دارند و می‌توانند در صورت لزوم به او کمک کنند.

ـ با کد ریویو می‌شود ارتباط سازنده‌ای بین افراد شرکت در تیم‌ها و بخش‌های مختلف ایجاد کرد.

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

۴. افزایش خوانایی و راحتی نگهداری: زمانی که قرار است فرد دیگری کد من را بازبینی کند، سعی می‌کنم کد را طوری بنویسم که به توضیح برای کس دیگر نیاز نداشته باشد. این نیازنداشتن به توضیح باعث می‌شود در آینده نگهداری کد با هزینۀ کمتری انجام شود؛ چون دیگر لازم نیست که توسعه‌دهنده همراه کد باشد تا بشود کد را فهمید.

۵. کاهش خطاها: وقتی فرد ثالثی کد را بازبینی می‌کند، از فضایی خارج از فضای توسعه‌دهندۀ اصلی به آن نگاه می‌شود. این نوع نگاه متفاوت در خیلی از مواقع ممکن است راهگشا باشد و مشکلات ریز و درشتی را حل کند، مشکلاتی از جنس معماری، منطق، ساختار، امنیت و... .

طبق بررسی‌ها هزینۀ حل مشکلی که تیم موفقیت مشتری یا کنترل کیفیت پیدایش کرده‌اند، بیش از دو برابر هزینۀ حل مشکلی است که در تیم توسعه پیدا شده باشد.

پاسخ ۱۱۰۰ توسعه‌دهنده دربارۀ مزایای وجود کد ریویو
پاسخ ۱۱۰۰ توسعه‌دهنده دربارۀ مزایای وجود کد ریویو


چه چیزی را باید ریویو کرد؟

همه‌چیز! چرا؟ به دلایل بالا!

زمان می‌برد! بله، کد ریویو کار زمان‌بری است؛ ولی بخش مهمی از کار محسوب می‌شود.

می‌شود حالا این دفعه را از دلایل بالا گذشت؟ معلوم است که نه! دلیل‌های بالا خیلی مهم هستند.

یکی می‌گفت کد ریویوها مثل غول بی‌شاخ‌ودم می‌مانند. اگر رهایشان کنید، برمی‌گردند و شما را می‌خورند. پس مراقب خودتان باشید! :)

چه زمانی باید ریویو کنیم؟

کد ریویو کار زمان‌بری است. با تمامی خوبی‌هایی که دارد، باید حواسمان باشد که در آن وقت تلف نکنیم. بعضی‌ها می‌گویند بهترین زمان کد ریویو دقیقاً بعد از اجراشدن تست‌های CI است یا بعد از هر چک اتوماتی که داریم!

پس تا می‌توانید تست بنویسید و هر چیزی را که می‌توانید، اتومات کنید. دقت کنید که وقت طلاست؛ پس به بهترین نحو از آن استفاده کنید.

چطور آمادۀ کد ریویو شویم؟

کد ریویو میهمانی اشتراک دانش است! برای رفتن به میهمانی هم باید آماده بود. برای دادن کد ریویو لازم است که کدمان چند ویژگی زیر را داشته باشد:

۱. در مرحلۀ اول باید یک بار خودمان به قدوبالای کاری که کرده‌ایم، نگاهی بیاندازیم! خطاهای کامپایل را چک کنیم، تست‌ها را بررسی کنیم و... تا خدای نکرده دسته‌گل‌مان توی کد ریویو پَرپَر نشود و با غروری شکسته برنگردیم سر جایمان!

۲. توی مرحلۀ بعد هر کد ریویو باید خودش گویای حال و کارش باشد. پس لازم است هر کد ریویو توضیحی داشته باشد مفید و مختصر، دربارۀ کاری که می‌کند و اتفاق‌هایی که افتاده. این توضیح ممکن است بسته به کامیت و حجم و اهمیت کار متفاوت باشد. اولین چیزی که ریویوکننده به آن نگاه می‌کند، تغییرها و توضیح‌های مربوط به کد ریویو است. چرا این کد نوشته شده و با چه هدفی؟

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

چه‌جوری کد ریویو کنیم؟

کد ریویو میدان جنگ نیست! در نهایت قرار است مجلس بزمی باشد. در طول کد ریویو لبخند بزنید و تا می‌توانید از هم یاد بگیرید.

به ریویودهنده احترام بگذارید. اگر نمی‌توانید در چند ساعت آینده ریویو کنید، به او خبر دهید.

تأیید شما حرمت دارد! ما مسئول حفظ کیفیت کد هستیم! پس اگر چیزی واضح نیست، سؤال بپرسید؛ ولی یادتان باشد که هنوز توی مجلس بزمیم، پس لبخند فراموش نشود.

نظر بقیه را بپرسید.

سعی کنید دانش‌تان را به‌اشتراک بگذارید و از بقیه یاد بگیرید. دلیل سؤال یا درخواست‌هایتان را توضیح بدهید. از جمله‌هایی مثل «برو این کار را انجام بده.» یا «این آشغال چیه نوشتی؟» استفاده نکنید. هیچ‌چیزی بدون توضیح ارزش ندارد. سعی کنید reference بدهید، به clean code یا هر مرجع دیگری که لازم است.

همۀ ما آدمیم، حواستان باشد. توی کد ریویو دربارۀ کد صحبت کنید نه توسعه‌دهندۀ آن!

ـ هدف این کد چیست؟ قرار است چه کاری انجام دهد؟

ـ آیا قواعد استفاده از git رعایت شده؟ کامیت‌ها تمیز هستند؟

ـ آیا کد همان کاری را می‌کند که می‌گوید؟

ـ آیا تست‌های لازم برای کد نوشته شده؟

ـ آیا همه‌چیز درست کار می‌کند؟

ـ اگر این کد مرج بشود، برای کاربرهای قبلی و نسخه‌های قبلی چه اتفاقی می‌افتد؟

ـ اگر من بودم، همین‌جوری مسئله را حل می‌کردم؟

ـ کد خواناست؟ به کامنت و توضیح نیاز ندارد؟

ـ معماری و رسم‌الخط یکپارچگی لازم را دارد؟

ـ دیپندسی‌های پروژه تغییر کرده؟ چرا؟ به چه حقی؟ چطور؟

ـ این کد را قبلاً جای دیگری توی پروژۀ دیگری ندیده‌ام؟ تکراری نیست؟

در نهایت قبل از تأیید کد باید به این نکته توجه کنیم که همه‌چیز را فهمیده باشیم: نتایجش، نحوۀ اجرایش و... چیزی نمانده که بعداً بیاید و ما را بخورد؟

نکته‌ها:

کد ریویو کار زمان‌بری است. توی برنامه‌ریزی‌ها برایش وقت در نظر بگیریم.

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

اگر کد ریویوتان زیاد کامنت خورد، لزوماً به معنی این نیست که شما برنامه‌نویس خوبی نیستید یا کد خوبی ننوشته‌اید. این کد ریویو ممکن است پر از درس و ایده باشد، هم برای شما، هم برای بقیه.

با کد ریویوها و ریویوکننده‌ها چی‌کار کنیم؟

کد ریویوها را در اولین فرصت بررسی کنید؛ جایی، تیمی کارش لنگ شماست.

فقط یک راه درست وجود ندارد. پس برای پذیرش و شنیدن راه‌حل‌های مختلف آماده باشید.

ریویوکننده‌ها هم کار دارند. سعی کنید مزاحمشان نشوید! از آن‌ها برای کد ریویو زمان بگیرید. تا می‌توانید پیش ریویوکننده‌ها بروید و به ارسال لینک ریویو اکتفا نکنید.

به ریویوکننده‌ها احترام بگذارید. اگر سؤالی می‌پرسند، مطمئن بشوید که جوابش را می‌گیرند. پس کامنتی بدون جواب نماند.

کد شما با خود شما یکی نیست! اگر کسی به کد شما ایرادی وارد می‌کند، قصد تخریب شما را ندارد! پس با آرامش برای بهبود مهارت‌های خود تلاش کنید.

بهبود کیفیت کد ریویو

هیچ‌چیز بدون اندازه‌گیری بهبود پیدا نمی‌کند!

برای اینکه حواستان به کیفیت کد ریویوها باشد، اگر می‌توانید سه متغییر زیر را اندازه بگیرید:

۱. مدت زمان انجام ریویو؛

۲. تعداد کامنت‌هایی که در ساعت روی ریویو گذاشته می‌شود؛

۳. متوسط تعداد کامنت‌هایی که روی هر کد ریویو گذاشته می‌شود.

مرام‌نامۀ بازبینی کد تیم ما

۰. هیچ کد ریویویی بدون دقیقاً دو تا تأیید مرج نمی‌شود.

۱. قبل از دادن کد ریویو حتماً خودتان یک بار کد را به دید خریدار نگاه کنید.

۲. وقتی کد ریویو می‌دهید، دقت کنید کد ریویو واضح و گویا باشد. حتماً دربارۀ هدف کارتان توضیح دهید و اگر به توضیح بیشتری نیاز است، حتماً به کد ریویو اضافه شود، حتی در حد یک سطر.

۳. به‌‌هیچ‌وجه کد ریویو را یک‌نفره انجام ندهید، صاحب کد حتماً باید کنارتان باشد و باهم کد ریویو کنید.

۴. هیچ کامنتی توی کد ریویو نباید بدون پاسخ بماند.

۵. از تمسخر و شوخی توی کد ریویو پرهیز کنید؛ به ریویوکننده و ریویودهنده احترام بگذارید.

۶. اگر قرار است کدی ریفکتور شود، تا جای ممکن در گام‌های کوچک و بدون دست‌کاری منطق کد باشد.

۷. هیچ کد ریویویی قرار نیست بیش از شصت دقیقه زمان بگیرد.

۸. هیچ کد ریویویی نباید بیش از ۲۴ ساعت به‌تعویق بیفتد.

۹. ریویوکننده‌ها را توی کد ریویو منشن کنید.

۱۰. پول‌ریکوئست‌ها پس از تأیید ریویوکننده‌ها فقط و فقط به‌دست سازندۀ پول‌ریکوئست، مرج می‌شوند.