Як відхилити огляд коду, який ви вважаєте непотрібним?


89

Я в положенні, коли мене попросили переглянути якийсь код, який вирішує проблему, яку, на мою думку, не існує.

Фіксатор, який старший за мене, наполягає на тому, що його потрібно виправити, але, здається, це не більше ніж софістика C ++. Частина нашого процесу розгортання - це перегляд коду, і я буду переглядати зміни, будучи другим найвищим інженером в невеликій компанії.

Я вважаю, що рецензенти так само відповідають за зміни коду, як і оригінальний кодер, і я не бажаю брати на себе відповідальність за цю зміну. Як би Ви відмовилися від огляду?


113
Мені це здається очевидним. Ви вказуєте в огляді, що код - це інтелектуальна мастурбація C ++, метою якої є виправлення проблеми, яка не існує. А потім, як частина процесу перегляду, ви відкидаєте код.
user16764

86
Не використовуйте слова "інтелектуальна мастурбація", коли ви відхиляєте це. Якщо ви використовуєте це формулювання, ви будете протидіяти йому, і він не сприйме те, що ви маєте сказати, як потенційно правильну технічну критику, він сприйме це як особисту атаку. Це може бути саме інтелектуальна мастурбація, але ви можете бути абсолютно впевнені, що він не бачить цього таким чином.
Майкл Шоу

15
Джеймс - Я вийняв емоцію з вашого питання, щоб дозволити громаді зосередитись на вашому основному питанні. Як вказують інші, використання завантаженої термінології у вашому огляді лише погіршить ситуацію, що очевидно є делікатною.

8
C і C ++ наповнені речами, які, здається, працюють, але насправді є невизначеною поведінкою. UB - справжній дефект, навіть якщо ви не можете написати тест, який показує, що він не працює як слід. Наприклад, багато компіляторів використовують UB як можливість оптимізації, припускаючи, що невизначений випадок ніколи не буває. Наприклад, якщо ви size > size+1перевіряли наявність переповнення підписаного цілого числа, компілятор може просто замінити цей вираз на false, оскільки переповнення підписаних цілих чисел не визначено. Дивіться blog.llvm.org/2011/05/…
CodesInChaos

5
@MichaelShaw "він сприйме це як особисту атаку". що формулювання цього питання звучить як для мене, особиста атака на старшого розробника, з яким ОП має різні думки, він тепер може «виграти», оскільки його поставили на позицію влади.
jwenting

Відповіді:


274

Попросіть тестовий випадок, який не вдається без зміни, яка вдається зі зміною.

Якщо він не може його виготовити, ви використовуєте це як виправдання.

Якщо він може його виготовити, то вам потрібно пояснити, чому тест недійсний.


245
А може, якщо він зможе це зробити, ви перегляньте свої припущення і вважаєте, що він, можливо, мав рацію. Імовірно, суть вправи полягає в поліпшенні кодексу, а не в виграші дебатів.
Калеб

99
Тільки тому, що ви не можете написати тест, не означає, що він не порушений. Невизначена поведінка, яка, як правило, працює так, як очікувалося (C і C ++ наповнені цим), умови перегонів, потенційне переупорядкування через слабку модель пам'яті ...
CodesInChaos

29
А як щодо стандартного рефакторингу? Як ви пишете невдалий тест для твору рефакторингу?
Майк Веллер

62
"Попросіть його довести, чому це потрібно ..." Можливо, попросіть його навчити вас, чому це потрібно.
Майк Шеррілл 'Відкликання котів'

8
@RhysW: Неправильне припущення. Існуючий код із перегоновим станом також не може бути перевірений у цьому відношенні. Тож новий код теоретично кращий і емпірично еквівалентний. Ваше припущення виправдане лише в тому випадку, якщо старий код є емпірично кращим.
MSalters

152

Рецензенти повинні бути об'єктивними.

Зрозуміло, що ви сформували думку щодо коду, про який йдеться, ще до того, як його ще переглянули, і здається, що ви та фіксатор зайняли свої позиції. Якщо це так, то перед вами буде складний час, коли постає мета, а ще складніше - об'єктивна. Ніщо з цього не допомагає цьому процесу, і, можливо, найкраще, найоб’єктивніше, що ви можете зробити, це поклонитися на тій підставі, що ви занадто близькі до проблеми.

Розглянемо командний підхід.

Якщо видалити себе неможливо, можливо, ви можете мати кілька інших інженерів одночасно переглянути код. Або вони погодиться з вами, що код слід відхилити, або він не стане. Якщо вони згодні з вами, то це вже не буде лише ви проти фіксатора, і ви зможете зробити більш сильний випадок, коли команда розглянула виправлення об'єктивно і вирішила проти його прийняття. З іншого боку, якщо вони вирішать прийняти виправлення, то це теж буде рішенням команди. Само собою зрозуміло, що ви повинні брати участь з такою ж відкритою думкою, наскільки можете керувати, і не слід намагатися впливати на думку інших членів команди, окрім раціональної дискусії. Важливо: якщо згодом буде поганий результат, не кидайте команду під автобус, кажучи: "Ну я завжди говорив, що це поганий код, але мене переважали інші члени команди ".

Відхилення - це природна частина процесу перегляду коду.

Процес перегляду коду не існує для виправлення гумових штампів у старших людей; це там, щоб захистити та покращити якість коду. Немає нічого поганого у відхиленні виправлення за умови правильної причини, тобто виправлення не покращує код. Якщо після відкритого огляду коду ви все ще відчуваєте, що виправлення не зменшує ризик та / або масштабність демонструваної проблеми, тоді слід відхилити її. Це не особиста, просто ваша чесна думка. Якщо фіксатор не погоджується, це теж добре, і в цей момент для управління стає проблемою з'ясувати. Просто не забудьте залишатися чесними, відкритими та професійними.

Відповідальність скорочує обидва напрямки.

Ви сказали, що не хочете нести відповідальність за цю зміну, мабуть, тому, що не вірите, що є проблема. Тим НЕ менше, ви повинні розуміти , що якщо ви не праві , і там є проблема, то ви можете в кінцевому підсумку відповідальність за відмову від коду , який би уникнути цієї проблеми.

Робіть замітки.

Ведення письмового журналу процесу рецензування допоможе вам зрозуміти факти. Запишіть свої думки та занепокоєння під час перегляду, опису та результатів будь-яких тестів, які ви можете запустити, щоб виміряти передбачувану проблему та виправити і т.д. положення. Якщо справа з’явиться в майбутньому знову (можливо, це буде, якщо фіксатор буде прикріплений до його власного перегляду), у вас буде щось пробігти вашу пам’ять.


24
+1 це набагато корисніше, ніж прийнята відповідь
Саймон Бергот

2
Безумовно. Прийнята відповідь характерна для одного випадку, очевидно, не така загальна і продумана, як ця.
Флоріан Маргаїн

40

Запишіть свої причини відхилення та захист щодо ймовірних контраргументів. Потім раціонально обговоріть з фіксатором і при необхідності перейдіть до управління.

Якщо у вас є достатня документація (включаючи списки коду, результати тестів та об'єктивні аргументи), ви будете добре висвітлені.

Ви викличете деяку недоброзичливість із закріплювачем, тож переконайтеся, що проблема стоїть (тобто, чи не усунення шкоди завдає шкоди?)

Також, якщо фіксатор якимось чином пов’язаний з власниками, забудьте цю відповідь.


9
Я хотів би проголосувати двічі за останню частину вашої відповіді. Дуже тверда відповідь.

31

Нещодавно в новинах LinkedIn з’явилася стаття про вирішення конфліктів на робочому місці та про те, щоб бути скромним, а не виглядати зарозумілим. На жаль, зараз я не можу знайти посилання, але загальна суть полягала в тому, щоб спробувати сформулювати питання неконфронтаційно. Будь ласка, не сприймайте це так, як я маю на увазі, що ви зарозумілі, це лише спосіб написання статті.

Так чи інакше, якщо сказати старшому програмісту, що він помиляється у своїх припущеннях, це призведе лише до того, що він застосує оборонний підхід і атакує вас у відповідь. Однак якщо ви ставите питання про те, чому він вважає, що проблема існує, з точки зору вашого нерозуміння, то він, швидше за все, буде більш відкритим для обговорення цього питання.

Отже, замість того, щоб сказати: "Проблеми не існує, тому мені не потрібно було б переглядати цю проблему", можливо, запитайте щось на кшталт "Для того, щоб переглянути це правильно, мені потрібно зрозуміти проблему. Чи можете ви поясніть, будь ласка, її точка зору?"

Як приклад, у статті описано тест, який проводили дітям, коли доросла людина тримала кубик, обличчя якого було одного кольору, за винятком того, що було звернене до дорослого. Коли дітей запитали, якого кольору обличчя бачить дорослий, люди, які не досягли 5 років, майже завжди говорили б про колір, який вони могли бачити, оскільки вони не могли зрозуміти, що дорослий може мати інший погляд на свій власний.


8
Відмінний момент, але я не розумію, як пов’язаний приклад внизу (я не стверджую, що це не пов'язано, поза межами, просто вказую на моє нерозуміння стосунку).
угорен

8
@ugoren Ха-ха, мені подобається, що ти там робив!
TheDarkKnight

1
@ugoren стосунки є "якщо ви не можете побачити всю картину, не
формулюйте

2
Мені завжди подобається скромний підхід, я б відхилив зміни на основі того, що я не розумію, і тому я не кваліфікований, щоб надати це нормально.
PhilDin

2
@PhilDin Там скромно, а потім йдеться про те, що ти не маєш кваліфікації для роботи. Якщо він може переглядати код, я думаю, що люди, які поставили його в цю посаду, очікують, що він достатньо кваліфікований для цього.
Енді,

9

C / C ++ може бути сповнений невизначеного поведінки. З одного боку, це погано, оскільки це може призвести до несподіваної поведінки. З іншого боку, це дозволяє агресивну оптимізацію, і зазвичай, коли ви використовуєте C / C ++, вас цікавить швидкість.

Писати тестовий випадок, який може бути важким - це може включати дивну архітектуру або компілятор, який вже не існує. Також може здатися, що на будь-якій розумній архітектурі "це не повинно викликати проблем".

Однак в той чи інший момент ви зміните платформу (скажімо - ви хочете перейти на мобільний телефон, щоб перейти до ARM або хочете прискорити роботу та використовувати GPU). У цей момент речі можуть почати ламатися, і вам доведеться налагоджувати це. Це може бути настільки тривіальним, як і оновлення компілятора до нової версії (і ви, можливо, хочете / знадобиться).

Проблемним кодом було:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

Під час останньої ітерації d[++k] => d[++15] => d[16]доступний. Оскільки зазвичай наступним елементом була легальна пам’ять (з точки зору підключення до моделі пам'яті C), навіть тривіальні компілятори не створювали жодного виконуваного файлу із дивним поведінкою. Єдиним способом написання тестового випадку було пошук платформи з точно такою ж моделлю пам'яті, що і C (ймовірно, VM).

Однак видно попередню передачу gcc 4.8, яка d[++k]виконується в кожному циклі. Тому в k < 16іншому випадку доступ був би незаконним, і законність програми, що подається компілятору, є частиною договору. Тож умова циклу завжди відповідає дійсності припущень, тому це нескінченна петля. Це може здатися дивним, але це була абсолютно юридична оптимізація - випромінювання system("dd if=/dev/zero of=/dev/sda"); system("format c:")також було б правильною заміною циклу. Є більш тонкі способи вибору прояву поведінки. Наприклад, під час лекції про транзакційну пам'ять я пам’ятаю, що ведучий кілька разів намагався отримати неправильне значення, коли 2 нитки збільшували одне і те ж значення.

Однак C / C ++, на відміну від деяких мов, є стандартизованим, щоб такий спір можна було вести з посиланням на об'єктивне джерело:

  • Якщо ви думаєте, що це не проблема, спробуйте довести це за допомогою стандарту C / C ++ (тобто, це призводить до визначеного значення та поведінки)
  • Якщо він вважає, що це проблема, попросіть його довести це, використовуючи стандарт C / C ++ (тобто це призводить до невизначеного значення або поведінки)

Як правило, якщо ваша команда пише на C / C ++, корисно мати під рукою стандарт - навіть фахівці команди можуть раз у раз знайти щось дивне.


4

Це звучить більше як проблема з політикою вашої команди, ніж з цим конкретним оглядом. Коли я працював у великому магазині програмного забезпечення в команді з 9 осіб, програма для рецензентів мала право вето на код, і це був стандарт, який ми всі дотримувались. Ми були досить талановиті та кмітливі - а саме. "зрілий", але більше в сенсі "не по-дитячому", ніж "досвідчений", - що керівник нашої команди міг би з розумом очікувати, що ми завжди зможемо прийти до згоди, не перетворюючись на аргументи в розсудливий період часу.

Просто виходячи з вашої мови у своєму дописі, я можу попередити вас, що це здається, що ви збираєтесь підходити до цієї ситуації таким чином, що може призвести до перетвореного аргументу. Можливо, це "інтелектуальна мастурбація", але, мабуть, є причина, що він чи вона це зробив, і тягар для вас буде придумати більш простий спосіб вирішити цю проблему - і якщо такого не існує, документуйте в коментарі, чому фактично мастурбаційний код був необхідним.


1
"... але, мабуть, є причина, що він чи вона це зробила ..." - Це велике припущення, яке ви робите. І ви також пропускаєте те, що в запитанні зазначено, що (на думку ОП) жодної проблеми не існує. Безумовно, тягар повинен бути на особі, яка пропонує "виправити", щоб продемонструвати, що існує справжня проблема, яку потрібно виправити. Немає сенсу пропонувати "простіше рішення" проблеми, яка не існує.
Стівен C

4
@StephenC так, і я притримуюсь думки, що ОП має принести користь сумніву в цьому випадку. Або ж це буде справді конфронтаційний огляд.
djechlin

3

Зробіть заявника доказом того, що його код вирішує його проблему. Якщо він може перевірити і показати вам докази, то ви є тим, хто помиляється, і вам слід просто кинути свою скаргу і вирішити це. Якщо він не може показати докази, які підтверджують його твердження, є проблема, і показати доказ того, що його виправлення виправляє проблему, я б відправив його назад до чергової дошки.

Звичайно, навколо цього може бути чутлива внутрішня політична ситуація. Але це я би пішов (приємно).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.