مدونة أفضل الممارسات مراجعة

يوفر الإنترنت ثروة من المواد على مراجعات الكود: حول تأثير مراجعات الكود على ثقافة الشركة ، على مراجعات الأمان الرسمية ، أدلة أقصر ، قوائم تدقيق أطول ، مراجعات إنسانية ، أسباب إجراء مراجعات الكود في المقام الأول ، أفضل الممارسات ، أكثر أفضل الممارسات والإحصائيات حول فعالية مراجعة التعليمات البرمجية لالتقاط الأخطاء ، وأمثلة من مراجعات التعليمات البرمجية خاطئ. أوه ، وبالطبع هناك كتب أيضًا. قصة قصيرة طويلة ، تقدم هذه المدونة تدوينات Palantir على مراجعات الكود. قد ترغب المنظمات التي لديها إحجام ثقافي عميق في استعراض النظراء في الرجوع إلى مقالة كارل إي ويجرز الممتازة حول "إضفاء طابع إنساني على النظراء" قبل محاولة اتباع هذا الدليل.

يتم نسخ هذا المنشور من أدلة أفضل الممارسات لسلسلة أدوات جافا كود الجودة ، خط الأساس ، ويغطي الموضوعات التالية:

  • لماذا وماذا ومتى تفعل مراجعات الكود
  • إعداد رمز للمراجعة
  • أداء الاستعراضات رمز
  • أمثلة مراجعة الكود

التحفيز

نقوم بإجراء مراجعات الكود (CRs) لتحسين جودة الكود والاستفادة من الآثار الإيجابية على ثقافة الفريق والشركات. فمثلا:

  • يتم تحفيز المتعهدين من خلال فكرة مجموعة من المراجعين الذين سيبحثون في طلب التغيير: يميل الملتزم إلى تنظيف الأطراف الفضفاضة ، ويدمج TODO ، ويحسن بشكل عام الالتزام. يعد الاعتراف بخبرة الترميز من خلال أقرانه مصدر فخر للعديد من المبرمجين.
  • تبادل المعرفة يساعد فرق التطوير بعدة طرق:
    - ينقل مدير السجل صراحةً الوظيفة المضافة / التي تم تغييرها / إزالتها إلى أعضاء الفريق الذين يمكنهم بناءً على العمل المنجز.
    - يجوز لمستخدم الإرسال استخدام تقنية أو خوارزمية يمكن للمراجعين أن يتعلموا منها. بشكل أكثر عمومية ، تساعد مراجعات الكود على رفع شريط الجودة عبر المؤسسة.
    - قد يمتلك المراجعون معرفة حول تقنيات البرمجة أو قاعدة الكود التي يمكن أن تساعد في تحسين التغيير أو توحيده ؛ على سبيل المثال ، قد يعمل شخص آخر بشكل متزامن على ميزة مشابهة أو إصلاح.
    - التفاعل الإيجابي والتواصل يقوي الروابط الاجتماعية بين أعضاء الفريق.
  • الاتساق في قاعدة الكود يجعل قراءة الكود وفهمه أسهل ، ويساعد على منع الأخطاء ، ويسهل التعاون بين أنواع مطوري البرامج العادية والمهاجرة.
  • يصعب الحكم على شظايا أجزاء الشفرة بالنسبة للمؤلف الذي يكون طفله عقلياً ، كما أنه من السهل الحكم عليه لمراجع ليس لديه السياق الكامل. الشفرة المقروءة أكثر قابلية لإعادة الاستخدام وخالية من الأخطاء وإثبات المستقبل.
  • غالبًا ما تكون الأخطاء العرضية (مثل الأخطاء المطبعية) وكذلك الأخطاء الهيكلية (على سبيل المثال ، الكود الميت أو أخطاء المنطق أو الخوارزمية أو اهتمامات الأداء أو الهندسة المعمارية) من السهل تحديدها للمراجعين الناقدين من منظور خارجي. لقد وجدت الدراسات أنه حتى المراجعات الشفرة القصيرة وغير الرسمية لها تأثير كبير على جودة الشفرة وتردد الأخطاء.
  • البيئات التنظيمية والامتثالية غالباً ما تتطلب مراجعات. تعد CRs طريقة رائعة لتجنب اعتراضات الأمان الشائعة. إذا كان لميزتك أو بيئتك متطلبات أمان هامة ، فستستفيد (وربما تتطلب) المراجعة من قِبل حراس الأمن المحليين (دليل OWASP هو مثال جيد على العملية).

ما لمراجعة

لا توجد إجابة صحيحة أبدية على هذا السؤال ، وينبغي أن يتفق كل فريق تطوير على مقاربة خاصة به. تفضل بعض الفرق مراجعة كل تغيير يتم دمجه في الفرع الرئيسي ، بينما سيكون لدى البعض الآخر حد "تفاهات" لا يتطلب إجراء مراجعة. المفاضلة بين الاستخدام الفعال لوقت المهندسين (المؤلفين والمراجعين) والحفاظ على جودة الشفرة. في بيئات تنظيمية معينة ، قد تكون مراجعة الرمز مطلوبة حتى بالنسبة للتغيرات البسيطة.

تعد مراجعة الكود غير صفية: كونك الشخص الأقدم في الفريق لا يعني أن الكود الخاص بك لا يحتاج إلى مراجعة. حتى إذا كانت الشفرة في الحالة النادرة خالية من العيوب ، فإن المراجعة توفر فرصة للإرشاد والتعاون ، كما تقوم بتنويع فهم الشفرة في قاعدة الشفرة إلى الحد الأدنى.

عندما للمراجعة

يجب أن تتم مراجعات الكود بعد الانتهاء من الاختبارات الآلية (الاختبارات ، الأسلوب ، CI الأخرى) بنجاح ، ولكن قبل دمج الكود في الفرع الرئيسي للمستودع. بوجه عام ، لا نقوم بمراجعة الكود الرسمية للتغيرات الإجمالية منذ الإصدار الأخير.

بالنسبة للتغييرات المعقدة التي يجب دمجها في الفرع الرئيسي كوحدة واحدة ولكنها كبيرة جدًا بحيث لا يمكن احتواؤها في السجل التجاري المعقول ، فكر في نموذج CR مكدس: إنشاء ميزة فرع أساسية / ميزة كبيرة وعدد من الفروع الثانوية (مثل الميزة / big-feature-api، feature / big-feature-testing، وما إلى ذلك) التي تضم كل مجموعة فرعية من الوظيفة والتي تتم مراجعتها بشكل فردي من الكود مقابل فرع الميزة / الميزة الكبيرة. بمجرد دمج جميع الفروع الثانوية في ميزة / ميزة كبيرة ، قم بإنشاء السجل التجاري لدمج الأخير في الفرع الرئيسي.

إعداد رمز للمراجعة

تقع على عاتق المؤلف مسؤولية إرسال تقارير السجل التي يسهل مراجعتها حتى لا نضيع وقت المراجعين ودوافعهم:

  • النطاق والحجم. يجب أن يكون للتغييرات نطاق ضيق ومحدّد جيدًا ومكتفي ذاتيًا بحيث تغطيه بشكل شامل. على سبيل المثال ، قد يتم تطبيق تغيير ميزة جديدة أو إصلاح الخلل. يفضل إجراء تغييرات أقصر على التغييرات الأطول. إذا قام السجل التجاري بإجراء تغييرات جوهرية على أكثر من ~ 5 ملفات ، أو استغرق وقتًا أطول من 1-2 أيام للكتابة ، أو استغرق الأمر أكثر من 20 دقيقة للمراجعة ، ففكر في تقسيمها إلى عدة سجلات مستقلة بذاتها. على سبيل المثال ، يمكن للمطور إرسال تغيير واحد يعرّف واجهة برمجة التطبيقات لميزة جديدة فيما يتعلق بالواجهات والوثائق ، والتغيير الثاني الذي يضيف تطبيقات لهذه الواجهات.
  • إرسال تقارير الاشتراك (CR) كاملة ومراجعة ذاتيا (بفرق) واختبارًا ذاتيًا فقط. من أجل توفير وقت المراجعين ، اختبر التغييرات المرسلة (أي قم بتشغيل مجموعة الاختبار) وتأكد من اجتيازها جميع الإنشاءات وكذلك جميع الاختبارات وفحص جودة الشفرة ، محليًا وخوادم CI ، قبل تعيين المراجعين.
  • إعادة تغيير التغييرات لا ينبغي أن يغير السلوك ؛ وعلى العكس من ذلك ، يجب أن تتجنب التغييرات التي تم تغيير السلوك تغيير إعادة تشكيلها وتغيير تنسيق التعليمات البرمجية. هناك عدة أسباب وجيهة لهذا:
    - إعادة ملامسة التغييرات غالبًا ما تلمس العديد من الخطوط والملفات وبالتالي سيتم مراجعتها باهتمام أقل. يمكن أن تتسرب تغييرات السلوك غير المقصودة إلى قاعدة التعليمات البرمجية دون أن يلاحظ أي شخص.
    - تؤدي التغييرات الكبيرة في إعادة بناء المنازل إلى كسر سحر الكرز وإعادة التسكين وسحر التحكم بالمصادر الأخرى. من الصعب جدًا التراجع عن تغيير في السلوك تم تقديمه كجزء من التزام بإعادة التخزين على مستوى المخزون.
    - يجب قضاء وقت مراجعة إنساني باهظ على منطق البرنامج بدلاً من مناقشات الأسلوب أو البنية أو التنسيق. نحن نفضل تسوية تلك باستخدام الأدوات الآلية مثل Checkstyle ، TSLint ، Baseline ، Prettier ، إلخ.

ارتكاب الرسائل

فيما يلي مثال لرسالة الالتزام الجيد التي تتبع معيارًا مقتبسًا على نطاق واسع:

رسملة ، ملخص قصير (80 حرفًا أو أقل)
نص توضيحي أكثر تفصيلا ، إذا لزم الأمر. لفه إلى حوالي 120 حرفًا أو نحو ذلك. في بعض السياقات ، الأول
يتم التعامل مع السطر باعتباره موضوع البريد الإلكتروني وبقية النص باعتباره النص الأساسي. الخط الفارغ الذي يفصل
ملخص من الجسم أمر بالغ الأهمية (إلا إذا حذفت الجسم بالكامل) ؛ يمكن الحصول على الخلط بين أدوات مثل rebase إذا قمت بتشغيل
الاثنين معا.
اكتب رسالة الالتزام في الضرورة: "إصلاح الخلل" وليس "الخلل الثابت" أو "إصلاح الخلل". هذه الاتفاقية مباريات
حتى مع رسائل الالتزام التي تم إنشاؤها بواسطة أوامر مثل git merge و git revert.
تأتي فقرات أخرى بعد خطوط فارغة.
- نقاط رصاصة على ما يرام ، أيضا

حاول أن تصف كل من التغييرات التي يرتكبها الالتزام وكيف يفعل ذلك:

> سيئة. لا تفعل هذا.
جعل تجميع مرة أخرى
> جيد.
أضف تبعية jcsv لإصلاح تصنيف IntelliJ

العثور على المراجعين

من المعتاد أن يقوم المقترض باقتراح واحد أو اثنين من المراجعين المطلعين على قاعدة الشفرة. غالبًا ما يكون أحد المراجعين هو قائد المشروع أو أحد كبار المهندسين. يجب على مالكي المشروع النظر في الاشتراك في مشاريعهم من أجل الحصول على إخطار من السجل التجاري الجديد. غالبًا ما تكون مراجعات الكود بين أكثر من ثلاثة أطراف غير مثمرة أو حتى تأتي بنتائج عكسية ، حيث قد يقترح المراجعون المختلفون تغييرات متناقضة. قد يشير هذا إلى وجود خلاف أساسي حول التطبيق الصحيح ويجب حله خارج مراجعة الكود في منتدى النطاق الترددي العالي ، على سبيل المثال في شخص أو في مؤتمر فيديو مع جميع الأطراف المعنية.

أداء الاستعراضات رمز

مراجعة الكود هي نقطة تزامن بين أعضاء الفريق المختلفين ، وبالتالي لديها القدرة على منع التقدم. وبالتالي ، يجب أن تكون مراجعات الكود سريعة (حسب ترتيب الساعات وليس الأيام) ، ويجب أن يكون أعضاء الفريق والعملاء المتوقعون على دراية بالتزام الوقت وتحديد أولويات وقت المراجعة وفقًا لذلك. إذا كنت لا تعتقد أنه يمكنك إكمال مراجعة في الوقت المناسب ، فالرجاء إخبار جهة الاتصال فورًا حتى يتمكن من العثور على شخص آخر.

يجب أن تكون المراجعة شاملة بدرجة كافية حتى يتمكن المراجع من توضيح التغيير بمستوى معقول من التفاصيل لمطور آخر. هذا يضمن أن تفاصيل قاعدة الكود معروفة لأكثر من شخص واحد.

بصفتك مراجعًا ، تقع على عاتقك مسؤولية تطبيق معايير الترميز والحفاظ على شريط الجودة أعلى. مراجعة الكود هي أكثر من كونها فنًا. الطريقة الوحيدة لتعلم ذلك هي القيام بذلك ؛ يجب على المراجع المتمرس النظر في وضع مراجعين آخرين أقل خبرة على تغييراتهم وجعلهم يقومون بالمراجعة أولاً. على افتراض أن المؤلف قد اتبع الإرشادات المذكورة أعلاه (خاصة فيما يتعلق بالمراجعة الذاتية وضمان تشغيل الشفرة) ، فإليك قائمة بالأشياء التي يجب على المراجع الانتباه إليها في مراجعة الكود:

غرض

  • هل يحقق هذا الكود هدف المؤلف؟ يجب أن يكون لكل تغيير سبب محدد (ميزة جديدة ، ريفاكتور ، بوجفيكس ، إلخ). هل الكود المقدم فعلاً يحقق هذا الغرض؟
  • اسال اسئلة. يجب أن توجد وظائف وفئات لسبب ما. عندما يكون السبب غير واضح للمراجع ، فقد يكون هذا مؤشراً على الحاجة إلى إعادة كتابة الكود أو دعمه بتعليقات أو اختبارات.

التنفيذ

  • فكر في كيفية حل المشكلة. إذا كان الأمر مختلفًا ، فلماذا؟ هل يعالج الكود الخاص بك المزيد من الحالات (الحافة)؟ هل هو أقصر / أسهل / أنظف / أسرع / أكثر أمانًا ومعادل وظيفيًا؟ هل هناك بعض الأنماط الأساسية التي رصدتها والتي لم يتم التقاطها في الكود الحالي؟
  • هل ترى احتمالية التجريدات المفيدة؟ غالبًا ما تشير الشفرة المكررة جزئياً إلى أنه يمكن استخراج وظيفة أكثر تجريدية أو عامة ثم إعادة استخدامها في سياقات مختلفة.
  • فكر كعدو ، لكن كن لطيفًا في ذلك. حاول "اصطياد" المؤلفين الذين يأخذون اختصارات أو حالات مفقودة عن طريق الخروج بتكوينات إدخال / إدخال إشكالية تخالف كودهم.
  • فكر في المكتبات أو رمز المنتج الموجود. عندما يعيد شخص تنفيذ الوظيفة الحالية ، في أغلب الأحيان يكون ذلك ببساطة لأنهم لا يعرفون أنها موجودة بالفعل. في بعض الأحيان ، يتم تكرار التعليمات البرمجية أو الوظيفة عن قصد ، على سبيل المثال ، لتجنب التبعيات. في مثل هذه الحالات ، يمكن لتعليق الكود توضيح الهدف. هل تم توفير الوظيفة المقدمة بالفعل من قبل مكتبة حالية؟
  • هل يتبع التغيير الأنماط القياسية؟ غالبًا ما تظهر قواعد الشفرة المنشأة أنماطًا حول اصطلاحات التسمية ، وتحليل منطق البرنامج ، وتعريفات نوع البيانات ، وما إلى ذلك. من المستحسن عادة أن يتم تنفيذ التغييرات وفقًا للأنماط الحالية.
  • هل يضيف التغيير تبعيات وقت الترجمة أو وقت التشغيل (خاصة بين المشاريع الفرعية)؟ نريد أن نبقي منتجاتنا متراخية ، مع وجود أقل عدد ممكن من التبعيات. يجب فحص التغييرات التي تحدث على التبعيات ونظام الإنشاء بشدة.

الوضوح والأناقة

  • فكر في تجربة القراءة الخاصة بك. هل فهمت المفاهيم في فترة زمنية معقولة؟ هل كان التدفق عاقلًا وكان متغيرًا وأسهل الطرق تتبعه؟ هل كنت قادرًا على تتبع ملفات أو وظائف متعددة؟ هل تم تأجيلك عن طريق التسمية غير المتسقة؟
  • هل تلتزم الشفرة بإرشادات الترميز ونمط الشفرة؟ هل تتوافق الشفرة مع المشروع من حيث الأسلوب ، واتفاقيات واجهة برمجة التطبيقات ، وما إلى ذلك؟ كما ذكرنا أعلاه ، نفضل تسوية مناقشات النمط باستخدام الأدوات الآلية.
  • هل يحتوي هذا الرمز على TODOs؟ TODOs فقط تتراكم في التعليمات البرمجية ، وتصبح قديمة مع مرور الوقت. اطلب من المؤلف إرسال تذكرة حول مشكلات GitHub أو JIRA وإرفاق رقم الإصدار إلى TODO. يجب ألا يحتوي تغيير الكود المقترح على كود تعليق.

قابلية الصيانة

  • قراءة الاختبارات. إذا لم يكن هناك اختبارات ويجب أن يكون هناك ، اطلب من المؤلف أن يكتب بعض. الميزات غير القابلة للاختبار حقًا نادرة ، في حين أن تطبيقات الميزات التي لم يتم اختبارها شائعة لسوء الحظ. تحقق من الاختبارات بأنفسهم: هل تغطي الحالات المثيرة للاهتمام؟ هل هي قابلة للقراءة؟ هل خفض السجل التجاري التغطية الشاملة للاختبار؟ التفكير في الطرق التي يمكن أن كسر هذا الرمز. غالبًا ما تختلف معايير النمط للاختبارات عن الكود الأساسي ، لكنها لا تزال مهمة.
  • هل يعرض هذا السجل التجاري خطر كسر كود الاختبار ، أو مراحل التدريج ، أو اختبارات التكامل؟ غالبًا ما لا يتم التحقق من ذلك كجزء من عمليات الفحص المسبق / الدمج ، ولكن جعلها تنخفض أمر مؤلم للجميع. الأشياء المحددة التي يجب البحث عنها: إزالة أدوات أو أدوات الاختبار المساعدة ، والتغييرات في التكوين ، والتغييرات في تخطيط / هيكل قطعة أثرية.
  • هل هذا التغيير يكسر التوافق الخلفي؟ إذا كان الأمر كذلك ، فهل من المناسب دمج التغيير في هذه المرحلة أم ينبغي دفعه إلى إصدار لاحق؟ يمكن أن تتضمن الاستراحات تغييرات قاعدة البيانات أو المخطط وتغييرات واجهة برمجة التطبيقات العامة وتغييرات سير عمل المستخدم ، إلخ.
  • هل يحتاج هذا الكود إلى اختبارات التكامل؟ في بعض الأحيان ، لا يمكن اختبار الكود بشكل كافٍ من خلال اختبارات الوحدة وحدها ، خاصةً إذا كان الكود يتفاعل مع الأنظمة الخارجية أو التهيئة.
  • اترك ملاحظات حول الوثائق على مستوى الشفرة والتعليقات وارتكاب الرسائل. التعليقات المكررة فوضى التعليمات البرمجية ، terse رسائل الالتزام يحير المساهمين في المستقبل. لا ينطبق هذا دائمًا ، ولكن التعليقات ذات الجودة والرسائل الملائمة ستدفع مقابلها. (فكر في وقت رأيت فيه رسالة أو تعليقًا رائعًا أو فظيعًا.
  • هل تم تحديث الوثائق الخارجية؟ إذا كان مشروعك يحتفظ بـ README أو CHANGELOG أو مستندات أخرى ، فهل تم تحديثه ليعكس التغييرات؟ قد تكون المستندات القديمة مربكة أكثر من لا شيء ، وسيكون إصلاحها في المستقبل أكثر تكلفة من تحديثها الآن.

لا تنس أن تشيد برمز مختصر / مقروء / فعال / أنيق. على العكس من ذلك ، فإن رفض أو رفض CR ليس وقحًا. إذا كان التغيير متكررًا أو غير ذي صلة ، فقم برفضه بشرح. إذا اعتبرت ذلك غير مقبول بسبب عيب واحد أو أكثر من العيوب المميتة ، رفضه ، مرة أخرى مع شرح. في بعض الأحيان تكون النتيجة الصحيحة لـ CR هي "دعونا نفعل ذلك بطريقة مختلفة تمامًا" أو حتى "دعونا لا نفعل هذا على الإطلاق."

أن تحترم المراجعين. على الرغم من أن التفكير العدائي مفيد ، إلا أنه ليس من ميزاتك ولا يمكنك اتخاذ جميع القرارات. إذا لم تتمكن من التوصل إلى اتفاق مع المراجع الخاص بك مع الكود كما هو ، فانتقل إلى الاتصال في الوقت الفعلي أو ابحث عن رأي ثالث.

الأمان

تحقق من أن نقاط نهاية واجهة برمجة التطبيقات تؤدي التخويل والمصادقة المناسبين بما يتوافق مع بقية قاعدة الشفرة. تحقق من نقاط الضعف الشائعة الأخرى ، على سبيل المثال ، التكوين الضعيف ، إدخال المستخدم الضار ، أحداث السجل المفقودة ، وما إلى ذلك. عندما تكون في شك ، أحيل السجل التجاري إلى خبير أمان التطبيق.

التعليقات: موجزة ، ودية ، للتنفيذ

يجب أن تكون المراجعات موجزة ومكتوبة بلغة محايدة. نقد الرمز ، وليس المؤلف. عندما يكون هناك شيء غير واضح ، اطلب التوضيح بدلاً من افتراض الجهل. تجنب الضمائر التملكية ، لا سيما بالاقتران مع التقييمات: "لقد عملت الكود الخاص بي قبل التغيير الخاص بك" ، "لقد كانت طريقتك تحتوي على خطأ" ، إلخ. تجنب الأحكام المطلقة: "هذا لا يمكن أن ينجح أبدًا" ، "والنتيجة هي خطأ دائمًا".

حاول التمييز بين الاقتراحات (على سبيل المثال ، "الاقتراح: استخراج طريقة لتحسين الوضوح") ، والتغييرات المطلوبة (على سبيل المثال ، "AddOverride") ، والنقاط التي تحتاج إلى مناقشة أو توضيح (على سبيل المثال ، "هل هذا هو السلوك الصحيح حقًا؟ إذا لذا ، يرجى إضافة تعليق يشرح المنطق. "). فكر في توفير روابط أو مؤشرات لتفسيرات متعمقة للمشكلة.

عند الانتهاء من مراجعة الرمز ، حدد إلى أي مدى تتوقع من المؤلف أن يرد على تعليقاتك وما إذا كنت ترغب في إعادة مراجعة السجل بعد تطبيق التغييرات (على سبيل المثال ، "لا تتردد في الدمج بعد الرد إلى بعض الاقتراحات البسيطة "مقابل" يرجى النظر في اقتراحاتي واسمحوا لي أن أعرف متى يمكنني إلقاء نظرة أخرى. ").

الاستجابة للمراجعات

جزء من الغرض من مراجعة الشفرة هو تحسين طلب تغيير المؤلف ؛ وبالتالي ، لا تشعر بالإهانة من اقتراحات المراجع الخاصة بك ولا تأخذها على محمل الجد حتى لو كنت لا توافق على ذلك. قم بالرد على كل تعليق ، حتى لو كان مجرد "ACK" أو "انتهى". اشرح سبب اتخاذك لقرارات معينة ، ولماذا توجد وظيفة ما ، وما إلى ذلك. إذا لم تتمكن من التوصل إلى اتفاق مع المراجع ، فانتقل إلى وقت الاتصال أو البحث عن رأي خارجي.

يجب دفع الإصلاحات إلى نفس الفرع ، ولكن في التزام منفصل. تجعل عمليات الإسكواش أثناء عملية المراجعة من الصعب على المراجع متابعة التغييرات.

الفرق المختلفة لديها سياسات دمج مختلفة: بعض الفرق تسمح فقط لأصحاب المشروع بالاندماج ، بينما تسمح الفرق الأخرى للمساهم بالاندماج بعد مراجعة الرمز الإيجابية.

في شخص الاستعراضات رمز

بالنسبة لغالبية مراجعات الكود ، تعد الأدوات المستندة إلى فرق غير متزامنة مثل Reviewable أو Gerrit أو GitHub خيارًا رائعًا. يمكن أن تكون التغييرات المعقدة ، أو المراجعات بين الأطراف التي تتمتع بخبرة أو خبرة مختلفة تمامًا ، أكثر فعالية عند إجرائها شخصيًا ، إما أمام نفس الشاشة أو جهاز الإسقاط ، أو عن بُعد عبر VTC أو أدوات مشاركة الشاشة.

أمثلة

في الأمثلة التالية ، تتم الإشارة إلى تعليقات المراجعة المقترحة بواسطة // R: ... تعليقات في كتل التعليمات البرمجية.

تسمية غير متناسقة

فئة MyClass {
  عدد الباحثين الخاصين // R: متغيرات الاسم باستمرار
  كثافة العمليات الفريدة الخاصة
}

التواقيع طريقة غير متناسقة

واجهة MyInterface {
  / ** إرجاع {link اختياري # فارغ} إذا تعذر استخراج s. * /
  عام اختياري <سلسلة> extractString (سلسلة) ؛
  / ** إرجاع فارغة إذا تعذر إعادة كتابة {code s}. * /
  // R: يجب مواءمة قيم الإرجاع: استخدم اختياري <> هنا أيضًا
  سلسلة عامة rewriteString (سلسلة) ؛
}

استخدام المكتبة

// R: إزالة واستبدالها بواسطة MapJoiner في الجوافة
String joinAndConcatenate (خريطة  map، String keyValueSeparator، String keySeparator)؛

ذوق شخصي

int dayCount؛ // R: nit: عادة ما أفضل numFoo على fooCount؛ متروك لكم ، ولكن يجب أن نبقيه ثابتًا في هذا المشروع

البق

// R: هذا يؤدي تكرارات numIterations + 1 ، هل هذا مقصود؟
// إذا كان الأمر كذلك ، فكر في تغيير دلالات numIterations؟
لـ (int i = 0 ؛ i <= numIterations ؛ ++ i) {
  ...
}

الاهتمامات المعمارية

otherService.call ()؛ // ص: أعتقد أننا يجب أن نتجنب التبعية على خدمات أخرى. هل يمكننا مناقشة هذا شخصيا؟

المؤلفون

روبرت ف (جيثب / تويتر)