13 استاندارد برای code review (الهام گرفته شده از گوگل)

code review comicدر این مقاله ، به طور خلاصه 13 استاندارد بررسی کد را بررسی خواهیم کرد که به طور چشمگیری به بهبود سلامت نرم افزار شما کمک می‌کند و توسعه دهندگان را خوشحال نگه می‌دارد.مرور کد یا code review اصلا چیه؟فرآیندی که در اون یک یا چند تا برنامه‌نویس، کد نوشته شده توسط برنامه‌نویس‌های دیگر رو review می‌کنند و حالا چرا ؟ به دلایل زیر:کد خطا و باگی نداشته باشد.کد کیفیت و استانداردهایی که برای استایل کد تعریف کردیم رو رعایت کرده باشد.کد دقیقا همون چیزی که قرار بوده را انجام می‌دهد.کدی که مرج شده، سلامت کد اصلی رو از وضعیت قبلی بهتر کرده است.این‌ها دلایلی بود برای اینکه چرا کد ریویو یکی از بخش‌های مهم توسعه نرم‌افزار است.کد ریویو مثل دروازه‌بانی عمل می‌کنه که تصمیم می‌گیره، این بخش از کد به کد اصلی اضافه بشه و به محصول نهایی برسد یا خیر.شرکت گوگل به برتری تکنولوژی خود مشهور است. برنامه‌نویسان گوگل استانداردهایی را تعریف کردند که نکات خوبی را در مورد کد ریویو بیان می کنه و بهتر است آن‌ها را هنگام کد ریویو بخاطر بسپارید:هدف اولیه بررسی کد این است که مطمئن شویم سلامت کد پایه‌ی گوگل در طول زمان بهبود پیدا کرده است.در ادامه با هم ۱۳ استاندارد کد ریویو رو می‌خونیم.استانداردهای کد ریویو:１. کد کامیت شده، باید سلامت کلی سیستم را بهبود داده باشدوقتی یک پول ریکوئست را می‌گیریم باید بررسی شود که سلامت کلی سیستم بهبود پیدا کرده است. ایده اصلی اینست که در نتیجه بهبودهای کوچک، سلامتی کد اصلی بعد از هر مرج بهبود پیدا کند.２. کد ریویو، پاسخ و فیدبک دادن سریعدر کد ریویو، مرج کردن کد رو به تأخیر نیاندازید. هنگام مرور کد، انتظار کد کامل یا پرفکت رو نداشته باشیم. اگر کد دریافتی سلامت کلی سیستم رو بهبود می‌بخشه آن را ادغام کنید."نکته کلیدی ای که در این‌جا وجود داره اینه که چیزی به نام پرفکت کد وجود ندارد و همیشه کد بهتر در میان است"اگر وسط یک تسک نیازمند به تمرکز نیستید، کد ریویو رو کمی پس از دریافت آن، انجام دهید. با این حال، یک روز کاری حداکثر زمانیه که می‌تونید به یک پول ریکوئست پاسخ دهید. پیش بینی می‌شه یک پول ریکوئست در طول یک روز چند دور کد ریویوی جزئی یا کلی شود.３. در طول کد ریویو آموزش بدهید و الهام‌بخش باشیددر هنگام مرور کد سعی کنید مانند یک منتور با اشتراک‌گذاری دانش و تجربه در هرکجا که امکان دارد راهنمایی کنید.４. هنگام مرور کد استانداردها را رعایت کنیدهمیشه بخاطر داشته باشید که راهنمای استایل، استانداردهای کدنویسی و چنین مستنداتی در مرور کد اقتدار مطلق را دارند. برای مثال، اگر بین استفاده از تب و اسپیس مانده بودید به استانداردهای کدنویسی رجوع کنید.اگر از زبان جاوا استفاده می‌کنید، لینک زیر خلاصه‌ای از بهترین روش‌های برنامه‌نویسی جاوا در کمپانی‌های غول تکنولوژی است(اگر در ایران هستید برای مشاهده این مقاله احتمالا نیاز به تغییر آدرس IP دارید).A short summary of Java coding best practices５. حل تعارضات ناشی از بررسی کدوقتی کدِ یک برنامه نویس دیگه رو بررسی می‌کنید و سپس کامنتی در مورد کد به او ارائه می‌دید با توجه به کامنتی که دادید ممکنه واکنش‌های مختلفی دریافت کنید. طرف مقابل ممکن خیلی خوشحال و سپاسگزار شود یا ناراحت و تدافعی. شما باید این تعارضات رو بر اساس روش‌های توافق شده در استایل‌ها و استانداردهای کدنویسی حل کنید. همچنین راهنمایی و پیشنهادات برنامه نویسان دیگری که تجربه و دانش بیشتری بر روی محصول دارند دنبال کنید.نموداری را می‌بینید که توسط خانم Alex Hill در مقاله‌ی هنرِ دریافت و ارسال بررسی کد، ترسیم شده است.این نمودار دو تا محور داره: ارزشمند بودن کامنت و میزان تعارضات بر اساس کامنت‌هایی که فرد بررسی کننده کد ارائه می‌دهد. هنگامی که برنامه‌نویس کدی رو می نویسه و ریویو کننده، فیدبک و کامنتی به نویسنده کد می‌دهد، چون نویسنده به کدش حس مالکیت داره با توجه به میزان این حس مالکیت و نوع نظراتی که دریافت می‌کنه، ممکنه مقداری درگیری به وجود بیاد.هندل کردن تعارضات ناشی از کامنت های بررسی کننده کد. از مقاله Alex Hillدر قسمت بالا سمت چپ کامنت‌هایی رو می بینید که کم ارزش هستند و همچنین درگیری بالایی رو هم پیش میارن مثل کامنت در مورد تنظیمات دلخواه، استفاده از فضاهای خالی در کد و غیره که ارزش ندارند در کد ریویو بررسی شوند و می‌تونیم خیلی راحت یک استاندارد مشخص کنیم و به آن بچسبیم تا همه همان را رعایت کنند یا اینکه کلی ابزارهای اتوماتیک برای این کار وجود دارد و دیگر لازم نیست که یک انسان خودش رو درگیر این موارد کند. همانطور که گفته شد این موارد چون با حس مالکیت رابطه مستقیم دارند،باعث درگیری بالا میشن و به دلایلی که گفته شد کامنت‌های کم ارزشی هستند.در بخش پایین نمودار شما نقص‌ها رو می‌بینید. نقص‌هایی مثل اشکال در رفتار تابع، باگ‌ها و یا تست‌های نوشته نشده. این موارد هیچ ارتباطی با مالکیت کد ندارند چرا که فرد هرگز از عمد این مشکلات را به وجود نمیاره. پس این نوع از کامنت‌ها حس تدافعی در نویسنده ایجاد نمی‌کنند.در بخش بالایی نمودار مواردی ان که نسبتاً غیر قابل ارزیابی هستند اما شامل نظرات ارزشمندی مانند نظر در مورد خوانایی کد، استفاده از الگوهای طراحی، انتخاب نام‌های مناسب در این بخش قرار دارد. این نوع از نظرات نمی‌توانند توسط یک ابزار خودکار سازی ارائه شوند و حتما باید توسط یک انسان انجام شود، بازدهی بالایی دارند و همچنین نظر مستقیمی روی انتخاب‌های مالک کد می‌دهند. در واقع این نظرات خیلی ارزشمندند با اینکه ممکنه درگیری ای بین مالک کد و ریویو کننده ایجاد کنند. اگر ما سعی کنیم کامنت‌هایی که در دسته‌بندی‌های کم ارزش هستند رو ارائه ندیم و کامنتهامون از این دسته‌ی با ارزش باشه آنگاه می‌تونیم مشکلات کامنت‌های این دسته بندی رو مدیریت کنیم تا بتونیم همکاری رو بالا ببریم و مرور کد ارزشمندی داشته باشیم.اگر کامنتی در کد ریویو می‌دین که خیلی جزئی یا اختیاری ست به روشنی بیان کنید و اجازه بدید که نویسنده‌‌ی کد تصمیم بگیره که به اون توجه کنه یا خیر.به عنوان یک بررسی کننده، اگر که استانداردی برای استایل ها و کد نویسی ندارید، می‌تونید حداقل پیشنهاداتی ارائه کنید تا پایداری کد اصلی حفظ بشه.６. بررسی تغییرات UI به عنوان بخشی از کد ریویواگر تغییرات پول ریکوست، شامل تغییرات ظاهری هم میشه پس سعی کنید علاوه بر کد ریویو حتماً دموی تغییرات ظاهری رو هم ببینید تا بررسی کنید آیا چیزی که مشاهده میشه همون چیزیه که انتظار میره یا خیر؟７. بررسی کنید که ایا همه تست‌ها وجود دارندباید حتما بررسی کنید که کد همراه با همه تست‌ها مثل یونیت تست، integration تست و غیره باشه مگر اینکه در شرایط خیلی خاص و اضطراری باشید.شرایط خاص هم یعنی یک باگ یا رخنه امنیتی وجود داشته باشه که بخواد به سرعت حل بشه و تست می‌تونه بعداً اضافه بشه. در چنین موارد مطمئن شوید که تسکی براش ایجاد شده و یک نفر مسئولیت آن رو به عهده بگیره که بعد از اینکه شرایط بحرانی رد شد، تست‌ها رو اضافه کنه.هیچ دلیل خوبی برای تست ننوشتن وجود ندارد! اگر محدودیت زمانی دارید و ممکن است برخی از اهداف به دمو یا ریلیز نرسند، راه حل آن فرار از تست‌نویسی نیست بلکه موارد قابل تحویل را کاهش دهید.Ethan Vincent تست نویسی جان ما را نجات خواهد داد. کپی رایت توسط آقای ８. وقتی روی تسکی فوکوس کردید، بخاطر کد ریویو آن را به تعویق نیندازیدوقتی وسط یک تسک متمرکز هستید، وقفه ایجاد نکنین به این خاطر که زمان زیادی طول میکشه که به جایگاهی که بودید برگردید. هزینه وقفه انداختن در کار برنامه نویسی که فوکوس کرده خیلی بیشتر از منتظر ماندن یک برنامه‌نویس دیگه به خاطر کد ریویو است. کد ریویو رو بعد از یک استراحت کوتاه برنامه‌ریزی شده مثل ناهار یا قهوه و چیزهایی از این دست انجام بدید.کپی رایت توسط آقای Jason Heerisانتظار نمیره که کل فرایند بررسی کد و مرج کردن در یک روز اتفاق بیفتد. چیزی که مهمه اینه که به نویسنده کد خیلی سریع فیدبکی بدید. مثلاً ممکنه شما فرصت نکنید که کل کد ریویو رو انجام بدید اما می‌تونید با یک بررسی سریع به چند مورد اشاره کنید.９. همه چیز را ریویو کنید و مفروضاتی را قائل نشویدتمام خطوطی رو که برای کد ریویو به شما سپرده شده، بررسی کنید و هیچ فرضی در مورد کلاس‌ها و متدهای نوشته شده توسط یک انسان انجام ندهید و مطمئن بشید که دقیقا انچه کد انجام می‌دهد را فهمیده‌اید.مفروضات قائل نشید. کپی رایت توسط Manuمطمئن شوید کدی که درحال بررسی آن هستید را می‌فهمید در غیر این صورت از نویسنده کد توضیح بخواهید.اگر صلاحیت بررسی بخشی از کد را ندارید مطمئن شوید که برنامه‌نویسی که صلاحیت آن را دارد حتماً آن بخش را بررسی کند.１０. کد را با داشتن یک تصویر کلی در ذهن بررسی کنیداغلب بررسی تغییرات با یک وسعت دید بیشتر خیلی کمک کننده است. مثلاً فرض کنید که یک فایل تغییر کرده و چهار (4) خط کد به آن اضافه شده. فقط آن چهار (4) خط کد را ریویو نکنید بلکه بررسی کل فایل را در نظر بگیرید و چک کنید چه چیزهایی به آن اضافه شده. آیا کیفیت کد موجود را کاهش داده یا باعث شده که توابع موجود نیاز به ریفکتور پیدا کند؟اگر چنین تغییرات ساده‌ای در چارچوب کلاس یا متد بررسی نشود در طول زمان شاهد کلاسی خواهیم بود که غیر قابل نگهداری، پیچیده و غیرقابل تست است. کلاسی که همه کار انجام می دهد و گسترش و تغییر آن مشکل است. کلاسی که اصل تک مسئولیتی را نقض می‌کند.(مطمئنم همتون تجربه کار با چنین کلاسی رو داشتید)به یاد داشته باشیم همانطور که پیشرفت‌های اندک در طول زمان جمع می‌شوند و منجر به تولید یک محصول عالی با کمترین نقص می‌شوند، به همین ترتیب هم، تخریب جزئی کد و بدهی‌های فنی با گذشت زمان منجر به محصولی می‌شوند که نگهداری و تغییر آن چالش برانگیز است.１１. تشخیص و تشویق کد خوب در طول بررسی کداگر در حین کد ریویو مورد خوبی رو دیدید نویسنده کد را با اشتیاق صدا کنید و او را تشویق کنید. هدف کد ریویو فقط پیدا کردن اشتباهات نیست بلکه تشویق و راهنمایی توسعه‌دهندگان برای کار فوق‌العاده‌ای که انجام می دهند نیز هست.１２. در مرور کد، هوشیار، محترم، مهربان و صریح باشیدبسیار حیاتی است که در هنگام بازبینی کد صریح، مودب و محترم باشید و در عین حال در رفتار با نویسنده روشنگر و رهنما باشید. هنگام مرور کد حتما نظرتان را درباره‌ی کد و نه توسعه‌دهنده بیان کنید.(لطفا شخصیت برنامه نویس را تخریب نکنید و صدای خود را بالا نبرید!)در لینک زیر راهنمای گوگل در مورد چگونگی احترام گذاشتن در زمان مرور کد وجود دارد:بررسی کد محترمانه１３. نظرات مربوط به بررسی کد خود را توضیح دهید و یک محدوده در ذهن خود داشته باشیدهرگاه نظری که در کد ریویو ارائه می‌دهید، روش دیگری را بیان می‌کند مهم است که دلیل خود را توضیح دهید و بر اساس دانش و تجربه خود مثالی بزنید تا توسعه‌دهنده درک کند، چگونه پیشنهاد شما به کیفیت کد او کمک خواهد کرد.هنگام پیشنهاد اصلاح یا تغییر به نویسنده کد، تعادل درستی را پیدا کنید تا نویسنده را در اصلاح کدش راهنمایی کنید. به عنوان مثال من از روش راهنمایی، توضیح و ارائه برخی نکات و پیشنهادات استفاده می‌کنم و هرگز راه حل کامل را ارائه نمی دهم.مطالعه بیشتربرای عمیق‌تر شدن در مبحث استانداردهای کد ریویو گوگل، لینک زیر را مطالعه کنید و همچنین من بیشتر برایتان خواهم نوشت.چطور یک کد ریویو انجام دهیم.هزینه ایجاد وقفه در کار برنامه نویسی که تمرکز کرده در مقایسه با اینکه یک توسعه دهنده منتظر بماند تا شما کد خود را در بازه زمانی مناسب مرور کنید ، بسیار زیاد است. برای اطلاعات بیشتر در این باره ، به لینک زیر مراجعه کنید:هزینه ایجاد وقفه برای توسعه دهندگانمقاله بسیار مفید خانم Alex Hill با نام هنر ارسال و دریافت کد ریویو را در اینجا بخوانید.منابع استانداردها و روش های گوگلمقاله آقای Rafiullah Hamedyمقاله خانوم Alex Hillجمع بندیبه‌ عنوان برنامه‌نویسی که مدتی است در حال کد ریویو کد همکاران خود است و خودش هم همیشه تجربه ریویو شدن کدهایش را دارد توصیه می‌کنم حتما بررسی کد را امری جدی تلقی کنید. با بررسی کد به همکارانتان کمک می‌کنید از دانش و تجربه‌ی شما بهره‌مند شوند، کد خود را از نگاه شخص دیگری ببینند، ایده بگیرند و بسیار زیاد جلوی اشتباهات سهوی را خواهید گرفت.لطفا نظرات و پیشنهاد خود را در مورد این مطلب با من در میان بگذارید.