Що мені робити як рецензент, коли код "повинен бути" поганим?


18

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

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

Як я повинен поводитися щодо цього конкретного огляду? Чи є спосіб я зберегти цілісність і залишатися конструктивним?

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


1
Чи розробник документував, чому це робиться так, і, можливо, навіть написав проблему для основної проблеми в трекері проблем?
Люк Франкен

Мізерно, і ні.
Червоний

4
Чи є апетит у вашій організації зробити щось щодо технічної заборгованості?
Роберт Харві

5
Якщо код не є правильним, враховуючи середовище, я б не атакував його. Переважно з того часу, як ви писали, в даний момент не бачите можливого реального покращення. Це створило б конфлікт без можливості покращитись. Що я хотів би зробити, це навчити краще документувати як перший крок. По-друге, створіть процедуру, щоб вони писали чіткі питання. Це призведе до двох речей: документація з питання, щоб наступна могла працювати швидше. На додаток до цього ви отримуєте перелік конкретних питань, які потенційно можуть бути виправлені. Мені подобається згадування GitHub, тому що ви бачите, скільки разів він повторюється, якщо вони тегують його.
Люк Франкен

Відповіді:


25

Простий:

1. Документуйте свою технічну заборгованість

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

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

2. Поступово повертайте борг

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

Як тільки ви досягли точки, коли у вас більше немає технічного дефіциту, ви на шляху до більш здорової бази даних :)


5

Як бічна примітка: пошук нової роботи. Цей не став би кращим.

Цілями коду, який ви переглядаєте, є:

  • Поставити функцію, яка повинна працювати відповідно до вимог.

  • Щоб зменшити зростання технічної заборгованості.

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

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

  • Зовнішній код - не моя вина. Я просто реалізую цю функцію і не хвилююся про всю кодову базу.

    У цьому ракурсі код буде копіювати недоліки кодової бази і так неминуче збільшуватиме технічну заборгованість: більше поганого коду завжди гірше.

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

  • Написання нового коду - це можливість рефакторного застарілого.

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

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

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

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

Ваш колега реалізує ще одну особливість і дуже здивований відсутністю ORM, де можна було б зробити ідеальний розмір. Тож він починає використовувати ORM.

Ні ви, ні ваш колега не можете пройти сотні тисяч рядків коду, щоб використовувати MVC, або систему реєстрації журналів, або ORM скрізь. Власне, це вимагало б місяців роботи: уявіть, щоб запровадити MVC; скільки часу це займе? А як щодо ORM у ситуаціях, коли запити SQL хаотично генерувались шляхом конкатенації (з випадковими місцями для ін'єкцій SQL), всередині коду ніхто не міг зрозуміти?

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

  • Старий спосіб обробки запитів,

  • Шлях MVC,

  • Старий механізм лісозаготівель,

  • Рамка реєстрації,

  • Прямий доступ до бази даних із SQL-запитами, побудованими на льоту,

  • ОРМ.

В одному проекті, над яким я працював, було чотири (!) Рамки ведення журналу, які використовувались поряд (плюс ручний журнал). Причина полягає в тому, що кожного разу, коли хтось хотів вести журнал, не було спільного підходу до цього, тому замість вивчення нового фреймуворку (який у всіх випадках використовувався лише у 5% кодової бази), просто додавали б ще одного вже знає. Уявіть безлад.

Кращим підходом було б переробляти кодову базу покроково. Взявши ще раз приклад ведення журналу, рефакторинг складається з наступних невеликих кроків:

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

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

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

  • Використовуйте щойно відновлені методи в новій функції.

  • Перехід до системи реєстрації журналів: єдиний код, на який впливає, - код у спеціальній бібліотеці.


1
Чудова відповідь до останнього абзацу. Незалежно від того, чи ви це задумали чи ні, ви маєте на увазі, що добрі практики не слід використовувати для нового коду. -1
RubberDuck

2
@RubberDuck: мова не йде про добрі практики, а про те, щоб писати код кардинально відрізняється від решти кодових баз. Я був таким розробником і бачив наслідки того, що я зробив: різко кращий код серед поганого коду робить тільки гірше; що покращує базу коду за допомогою невеликих кроків рефакторингу. Я додам приклад у своїй відповіді через кілька хвилин.
Арсеній Муренко

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

@RubberDuck: Справа не в тому, щоб додати другий фреймворк журналів, а перший. Хлопець, який додає другий фреймворк, робить це лише тому, що перший використовується лише для однієї невеликої функції; якби кодова база була відновлена, як я радив, цього не сталося.
Арсеній Муренко

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

3

Якщо ви робите перевірку коду в рамках свого процесу розробки; тоді ви повинні встановити правила, за якими ви «судите» код, який ви переглядаєте.

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

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

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


3

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

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

Іншими словами, головне - регулярно пропонувати менші зміни до початку проектів, а не збивати, пропонуючи більші зміни до кінця.


2

У тих місцях, де я робив перегляд коду, я б прийняв і затвердив подання коду, якщо це буде зобов'язане зробити (принаймні) деякий рефакторинг. Будь-то як подана помилка, як історія чи обіцянка надіслати ще один огляд із виконанням (деякого) рефакторингу.

У цих випадках, якщо я є особою, яка пише код для перегляду, я, як правило, готую дві зміни, одну з моїми новими функціями чи виправленнями помилок, а потім іншу, яка має та ІНТИЧНЕ очищення. Таким чином, зміни очищення не погіршують нову (-і) функцію (-и) чи виправлення (-ів) помилок, але її легко вказують як лексему "так, я знаю, це не вирішує цих проблем, але все-таки є" чисте прибирання "що робить".

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