بازبینی کد

مهندسان نرم‌افزار (یا همان برنامه‌نویسان) در حال بازبینی یک برنامه

بازبینی کد (انگلیسی: Code review) (که گاهی به آن بازبینی همتا گفته می‌شود) یک فعالیت تضمین کیفیت نرم‌افزار است که در آن یک یا چند نفر کد منبع یک برنامه رایانه‌ای را پس از پیاده‌سازی یا در حین فرایند توسعه بررسی می‌کنند. افرادی که عمل بررسی را انجام می‌دهند (به جز نویسنده کد)، «بازبین» (Reviewer) نامیده می‌شوند. حداقل یک بازبین نباید نویسنده خودِ کد باشد.[۱][۲]

بازبینی کد با سایر تکنیک‌های تضمین کیفیت نرم‌افزار مانند تحلیل ایستای کد، خود-بررسی، آزمون (تست) و برنامه‌نویسی دوتایی تفاوت دارد. تحلیل ایستا عمدتاً بر ابزارهای خودکار متکی است، خود-بررسی تنها شامل نویسنده کد می‌شود، آزمون نیازمند اجرای کد است و برنامه‌نویسی دوتایی به جای اینکه یک مرحله جداگانه باشد، به طور مداوم در طول توسعه انجام می‌شود.[۱]

هدف

اگرچه کشف مستقیم مشکلات کیفی اغلب هدف اصلی است،[۳] بازبینی‌های کد معمولاً برای دستیابی به ترکیبی از اهداف زیر انجام می‌شوند:[۴][۵]

  • بهبود کیفیت کد
    بهبود کیفیت داخلی کد و قابلیت نگهداری از طریق خوانایی بهتر، یکنواختی و قابلیت درک.
  • تشخیص نقص‌ها
    بهبود کیفیت در جنبه‌های خارجی، به ویژه صحت عملکرد، و همچنین یافتن مسائلی مانند مشکلات عملکردی (Performance)، آسیب‌پذیری‌های امنیتی و بدافزارهای تزریق شده.
  • یادگیری/انتقال دانش
    اشتراک‌گذاری دانشِ پایگاه کد (Codebase)، رویکردهای حل مسئله و انتظارات کیفی، هم برای بازبینان و هم برای نویسنده.
  • افزایش حس مسئولیت متقابل
    افزایش حس مالکیت کد جمعی و همبستگی.
  • یافتن راه‌حل‌های بهتر
    تولید ایده‌هایی برای راه‌حل‌های جدید و بهتر و ایده‌هایی فراتر از کد خاصِ در دست بررسی.
  • تطابق با دستورالعمل‌های تضمین کیفیت (QA) و استانداردهای ISO/IEC
    بازبینی کد در برخی زمینه‌ها، مانند نرم‌افزارهای ترافیک هوایی و نرم‌افزارهای ایمنی-حیاتی اجباری است.

انواع بازبینی

انواع مختلفی از فرایندهای بازبینی کد وجود دارد و انواع اضافی در استاندارد IEEE 1028 مشخص شده‌اند.[۶]

  • بازبینی‌های مدیریتی
  • بازبینی‌های فنی
  • بازرسی‌ها (Inspections)
  • مرورهای گام‌به‌گام (Walk-throughs)
  • ممیزی‌ها (Audits)

بازرسی (رسمی)

اولین فرایند بازبینی کد که به تفصیل مطالعه و توصیف شد، توسط مخترع آن، مایکل فاگان، «بازرسی» (Inspection) نامیده شد.[۷] بازرسی فاگان یک فرایند رسمی است که شامل اجرای دقیق و با جزئیات با چندین شرکت‌کننده و چندین فاز است. در بازبینی‌های رسمی کد، توسعه‌دهندگان نرم‌افزار در مجموعه‌ای از جلسات شرکت می‌کنند تا کد را خط به خط، اغلب با استفاده از نسخه‌های چاپ شده، بررسی کنند. تحقیقات نشان داده است که بازرسی‌های رسمی بسیار دقیق و در شناسایی نقص‌ها بسیار مؤثر هستند.[۷]

بازبینی منظم مبتنی بر تغییر (مرورهای گام‌به‌گام)

تیم‌های توسعه نرم‌افزار معمولاً یک فرایند بازبینی سبک‌تر را اتخاذ می‌کنند که در آن دامنه هر بازبینی مربوط به تغییرات در پایگاه کد (Codebase) مطابق با یک تیکت، داستان کاربر (User story)، کامیت (Commit) یا واحد دیگری از کار است.[۸][۳] علاوه بر این، قوانین یا قراردادهایی وجود دارد که وظیفه بازبینی را از طریق روش‌هایی مانند بازبینی اجباری تمام تیکت‌ها، معمولاً به عنوان بخشی از یک پول ریکوئست (درخواست ادغام)، به جای برنامه‌ریزی صریح برای هر بازبینی، در جریان کاری توسعه ادغام می‌کند. چنین فرایندی «بازبینی کد منظم و مبتنی بر تغییر» نامیده می‌شود.[۱] تغییرات زیادی از این فرایند پایه وجود دارد.

یک نظرسنجی در سال ۲۰۱۷ از ۲۴۰ تیم توسعه نشان داد که ۹۰٪ از تیم‌هایی که از بازبینی کد استفاده می‌کردند، از یک فرایند مبتنی بر تغییر پیروی می‌کردند و ۶۰٪ به طور خاص از بازبینی منظم مبتنی بر تغییر استفاده می‌کردند.[۳] شرکت‌های بزرگ نرم‌افزاری که شناخته شده است از بازبینی کد مبتنی بر تغییر استفاده می‌کنند شامل مایکروسافت،[۹] گوگل،[۱۰] و فیس‌بوک هستند.

کارایی و اثربخشی

تحقیقات در حال انجام توسط کیپرز جونز (Capers Jones) با تجزیه و تحلیل بیش از ۱۲٬۰۰۰ پروژه توسعه نرم‌افزار نشان داد که بازرسی‌های رسمی نرخ کشف نقص نهفته ۶۰ تا ۶۵ درصد داشتند، در حالی که بازرسی‌های غیررسمی کمتر از ۵۰ درصد نقص‌ها را شناسایی کردند. نرخ کشف نقص نهفته برای اکثر اشکال آزمون (تست) حدود ۳۰ درصد است.[۱۱][۱۲] یک مطالعه موردی بازبینی کد که در کتاب «بهترین اسرار حفظ شده بازبینی همتای کد» (Best Kept Secrets of Peer Code Review) منتشر شد، مطالعه کیپرز جونز را نقض کرد[۱۱] و دریافت که بازبینی‌های سبک (Lightweight) می‌توانند به اندازه بازبینی‌های رسمی باگ پیدا کنند، در حالی که سریع‌تر و کم‌هزینه‌تر هستند.[۱۳]

مطالعات نشان می‌دهد که تا ۷۵٪ از نظرات در بازبینی کد به جای عملکرد، بر قابلیت تکامل و قابلیت نگهداری نرم‌افزار تأثیر می‌گذارد،[۱۴][۱۵][۴][۱۶] که نشان می‌دهد بازبینی کد ابزاری عالی برای شرکت‌های نرم‌افزاری با چرخه‌های عمر طولانی محصول یا سیستم است.[۱۷] بنابراین، کمتر از ۱۵٪ از مسائل مورد بحث در بازبینی‌های کد مستقیماً به باگ‌ها مربوط می‌شود.[۱۸]

دستورالعمل‌ها

تحقیقات نشان می‌دهد که اثربخشی بازبینی با سرعت بازبینی همبستگی دارد. نرخ‌های بهینه بازبینی کد بین ۲۰۰ تا ۴۰۰ خط کد در ساعت متغیر است.[۱۹][۲۰][۲۱][۲۲] بازرسی و بازبینی بیش از چند صد خط کد در ساعت برای نرم‌افزارهای حیاتی (مانند نرم‌افزار تعبیه‌شده ایمنی-حیاتی) ممکن است برای یافتن خطاها بیش از حد سریع باشد.[۱۹][۲۳]

ابزارهای پشتیبانی

ابزارهای تحلیل ایستای کد با بررسی خودکار کد منبع برای آسیب‌پذیری‌های شناخته شده و الگوهای نقص، به ویژه برای بخش‌های بزرگی از کد، به بازبینان کمک می‌کنند.[۲۴] یک مطالعه در سال ۲۰۱۲ توسط VDC Research گزارش می‌دهد که ۱۷٫۶٪ از مهندسان نرم‌افزار تعبیه‌شده که مورد نظرسنجی قرار گرفتند، در حال حاضر از ابزارهای خودکار برای پشتیبانی از بازبینی همتای کد استفاده می‌کنند و ۲۳٫۷٪ قصد دارند در عرض دو سال از آنها استفاده کنند.[۲۵]

جستارهای وابسته

پیوندهای بیرونی

منابع

  1. 1 2 3 Baum, Tobias; Liskin, Olga; Niklas, Kai; Schneider, Kurt (2016). "A Faceted Classification Scheme for Change-Based Industrial Code Review Processes". 2016 IEEE International Conference on Software Quality, Reliability and Security (QRS). pp. 74–85. doi:10.1109/QRS.2016.19. ISBN 978-1-5090-4127-5. S2CID 9569007.
  2. Kolawa, Adam; Huizinga, Dorota (2007). Automated Defect Prevention: Best Practices in Software Management. Wiley-IEEE Computer Society Press. p. 260. ISBN 978-0-470-04212-0.
  3. 1 2 3 Baum, Tobias; Leßmann, Hendrik; Schneider, Kurt (2017). "The Choice of Code Review Process: A Survey on the State of the Practice". Product-Focused Software Process Improvement. Lecture Notes in Computer Science. Vol. 10611. pp. 111–127. doi:10.1007/978-3-319-69926-4_9. ISBN 978-3-319-69925-7.
  4. 1 2 Bacchelli, A; Bird, C (May 2013). "Expectations, outcomes, and challenges of modern code review" (PDF). Proceedings of the 35th IEEE/ACM International Conference On Software Engineering (ICSE 2013). Retrieved 2015-09-02.
  5. Baum, Tobias; Liskin, Olga; Niklas, Kai; Schneider, Kurt (2016). "Factors Influencing Code Review Processes in Industry". Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering - FSE 2016. pp. 85–96. doi:10.1145/2950290.2950323. ISBN 9781450342186. S2CID 15467294.
  6. IEEE Standard for Software Reviews and Audits. IEEE STD 1028-2008. August 2008. pp. 1–53. doi:10.1109/ieeestd.2008.4601584. ISBN 978-0-7381-5768-9.
  7. 1 2 Fagan, Michael (1976). "Design and code inspections to reduce errors in program development". IBM Systems Journal. 15 (3): 182–211. doi:10.1147/sj.153.0182.
  8. Rigby, Peter; Bird, Christian (2013). "Convergent contemporary software peer review practices". Proceedings of the 2013 9th Joint Meeting on Foundations of Software Engineering. pp. 202–212. CiteSeerX 10.1.1.641.1046. doi:10.1145/2491411.2491444. ISBN 9781450322379. S2CID 11163811.
  9. MacLeod, Laura; Greiler, Michaela; Storey, Margaret-Anne; Bird, Christian; Czerwonka, Jacek (2017). "Code Reviewing in the Trenches: Challenges and Best Practices" (PDF). IEEE Software. 35 (4): 34. doi:10.1109/MS.2017.265100500. S2CID 49651487. Retrieved 2020-11-28.
  10. Sadowski, Caitlin; Söderberg, Emma; Church, Luke; Sipko, Michal; Baachelli, Alberto (2018). "Modern code review: A case study at google". Proceedings of the 40th International Conference on Software Engineering: Software Engineering in Practice. pp. 181–190. doi:10.1145/3183519.3183525. ISBN 9781450356596. S2CID 49217999.
  11. 1 2 Jones, Capers (June 2008). "Measuring Defect Potentials and Defect Removal Efficiency" (PDF). Crosstalk, The Journal of Defense Software Engineering. Archived from the original (PDF) on 2012-08-06. Retrieved 2010-10-05.
  12. Jones, Capers; Ebert, Christof (April 2009). "Embedded Software: Facts, Figures, and Future". Computer. 42 (4): 42–52. Bibcode:2009Compr..42d..42E. doi:10.1109/MC.2009.118. S2CID 14008049.
  13. Jason Cohen (2006). Best Kept Secrets of Peer Code Review (Modern Approach. Practical Advice.). Smart Bear Inc. ISBN 978-1-59916-067-2.
  14. Czerwonka, Jacek; Greiler, Michaela; Tilford, Jack (2015). "Code Reviews do Not Find Bugs. How the Current Code Review Best Practice Slows Us Down". 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering (PDF). Vol. 2. pp. 27–28. doi:10.1109/ICSE.2015.131. ISBN 978-1-4799-1934-5. S2CID 29074469. Retrieved 2020-11-28.
  15. Mantyla, M.V.; Lassenius, C. (2009). "What Types of Defects Are Really Discovered in Code Reviews?" (PDF). IEEE Transactions on Software Engineering. 35 (3): 430–448. Bibcode:2009ITSEn..35..430M. CiteSeerX 10.1.1.188.5757. doi:10.1109/TSE.2008.71. S2CID 17570489. Retrieved 2012-03-21.
  16. Beller, M; Bacchelli, A; Zaidman, A; Juergens, E (May 2014). "Modern code reviews in open-source projects: which problems do they fix?" (PDF). Proceedings of the 11th Working Conference on Mining Software Repositories (MSR 2014). Retrieved 2015-09-02.
  17. Siy, Harvey; Votta, Lawrence (2004-12-01). "Does the Modern Code Inspection Have Value?" (PDF). unomaha.edu. Archived from the original (PDF) on 2015-04-28. Retrieved 2015-02-17.
  18. Bosu, Amiangshu; Greiler, Michaela; Bird, Chris (May 2015). "Characteristics of Useful Code Reviews: An Empirical Study at Microsoft" (PDF). 2015 IEEE/ACM 12th Working Conference on Mining Software Repositories. Retrieved 2020-11-28.
  19. 1 2 Kemerer, C.F.; Paulk, M.C. (2009-04-17). "The Impact of Design and Code Reviews on Software Quality: An Empirical Study Based on PSP Data". IEEE Transactions on Software Engineering. 35 (4): 534–550. Bibcode:2009ITSEn..35..534K. doi:10.1109/TSE.2009.27. hdl:11059/14085. S2CID 14432409.
  20. "Code Review Metrics". Open Web Application Security Project. Archived from the original on 2015-10-09. Retrieved 9 October 2015.
  21. "Best Practices for Peer Code Review". Smart Bear. Smart Bear Software. Archived from the original on 2015-10-09. Retrieved 9 October 2015.
  22. Bisant, David B. (October 1989). "A Two-Person Inspection Method to Improve Programming Productivity". IEEE Transactions on Software Engineering. 15 (10): 1294–1304. doi:10.1109/TSE.1989.559782. S2CID 14921429. Retrieved 9 October 2015.
  23. Ganssle, Jack (February 2010). "A Guide to Code Inspections" (PDF). The Ganssle Group. Retrieved 2010-10-05.
  24. Balachandran, Vipin (2013). "Reducing human effort and improving quality in peer code reviews using automatic static analysis and reviewer recommendation". 2013 35th International Conference on Software Engineering (ICSE). pp. 931–940. doi:10.1109/ICSE.2013.6606642. ISBN 978-1-4673-3076-3. S2CID 15823436.
  25. VDC Research (2012-02-01). "Automated Defect Prevention for Embedded Software Quality". VDC Research. Retrieved 2012-04-10.