Як ви подолаєте власні ухили кодування під час передачі застарілого коду? [зачинено]


22

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

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

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


2
уау ... це питання мені зараз дійсно актуально.
WalterJ89

1
Якщо він не зламався, не виправляйте. :-)
Річард

Те, чого ти ніколи не повинен робити, і Big Ball Of Mud повинні бути обов’язковими для читання цієї теми для всіх програмістів.
Ян Худек

можливий дублікат роботи над чужим кодом
gnat

Відповіді:


31

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

Незалежно від того, гарно чи ні, потрібно спочатку мати впевненість, щоб можна було змінити, не порушуючи речі!


6
+1. Інші програми часто залежать від помилок у існуючому коді, не маючи на увазі його дивних способів робити. Перш ніж піти з ним на зв'язок, зрозумійте це!
Алекс Фейнман

У мене була така проблема одного разу. Я виправив помилку у наших внутрішніх бібліотеках, але виявилося, що дуже важливий код залежав від неправильної поведінки. Yikes.
Джонатан Стерлінг

Іноді написання цих тестів може бути дуже важким. Але, іноді, ви можете десь знайти вільну нитку , тестування цього блоку, а потім поширити тест-інфекцію далі. Тож вам, можливо, доведеться перепрофілювати купу речей, перш ніж дістатися до того твору, який ви насправді хотіли змінити.
Френк Шірар

5
Це передбачає, що ваша компанія використовує або навіть розуміє одиничні тести. Більшу частину часу немає тестів на код, немає документації та обмежений термін для його інтеграції / виправлення / зміни, щоб ви не могли просто "почати писати одиничні тести" для нього.
Уейн Моліна

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

30

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


3
Сталося зі мною кілька разів. Іноді краще просто залишити його в спокої
TheLQ

4
І якщо ви все-таки дізнаєтесь, будьте ласкаві до наступного хлопця та напишіть коментар!
Френк Ширар

11

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

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

І останнє, зрозумійте, що саме тому у вас є робота.


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

7

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

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


7

Виберіть свої битви. Знайте різницю між "я б не писав це так" і "це створює серйозну підтримку або підтримку"


Я вкраду цю відповідь. :-)
плакати

4

Часто мені здається корисним відчути те, що було оригінальним дияволом.

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

Іноді ви виявляєте, що оригінальний розробник був насправді поганим, але ви маєте уявлення про те, що поганого вони продавали тоді.

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

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


3

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

Це війна.


3

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

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


3

Коли застарілому коду більше двох років, він, можливо, був написаний таким чином через обмеження в мові чи операційних системах тощо, що існували на той час, коли код був написаний. Гей, це виглядає погано зараз, але це було погано тоді? Я намагаюся припустити, що у розробника була причина, що він чи вона зробили. Ця причина може більше не застосовуватися, але якщо припустити, що вона була замість просто загальної некомпетентності (молоді програмісти будуть думати те саме про ваш код через 5 років, можливо, навіть менше) змушує вас менше злитися на це. Якщо він працює, і з ним не пов’язано жодних проблем, шануйте цей спадковий код, яким би потворним він не був, оскільки він дозволить вам вирішити більш захоплюючі проблеми.


Ах, вікове питання ЧОМУ ...

1

У минулому, коли у мене не було часу спробувати набути чужий код і перебити його у свій "мій" стиль, мені довелося вдатися до дуже завдань:

Що я намагаюся додати до цього коду / виправити / зробити роботу?

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

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


1

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

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


1

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


0

Я працюю майже виключно над застарілим кодом у ці дні, і я завжди думаю: "О,% s, що вони думали?" . Тоді я починаю писати одиничні тести для коду, і саме тоді я дійсно повинен проаналізувати потік управління та залежності.

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

Для мене це допомагає думати, що мій код буде виглядати так само, коли я повернуся до нього через 12 місяців .


0

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

Ось кілька маркерів справді поганого коду:

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

Відсутність автоматизованих тестів не означає, що код поганий, але це означає, що проект поганий.

Це не питання смаку; ці практики значно покращують обслуговування програм.

Як ви готуєтесь?

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

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