Організовувати коментований, брудний код?


22

Я хотів би задати вам кілька питань щодо брудного коду. Є деякі початківці, які кодували середній проект. Код - це дуже величезна кулька грязі. Вони не передові програмісти. Вони просто знають, як трохи використовувати клавіатуру щодо Java. Вони щойно написали код з 12 000 рядків у своєму головному класі, хоча 6 000 рядків належить саме NetBeans.

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

Тепер у мене є наступні питання:

  1. Чи слід ремонтувати код і змінити його на ООП? Зараз ми налагоджуємо це.
  2. У коді немає коментарів, жодної документації, конкретного стилю програмування тощо. Міняти це дійсно дорого і забирає багато часу. Що ми можемо зробити з цього приводу?
  3. Як я можу навчити їх дотримуватися всіх правил (коментування, OOP, хороша якість коду тощо)?
  4. Код помилковий і схильний до помилок. Що ми можемо зробити? Тестування? Ми майже пишемо два-три документи формату А4 для виправлення, але це здається нескінченним.

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


Це потрібно розділити на два-три питання, наразі це занадто широко.
Джон Хопкінс

2
Чи цей проект знаходиться під контролем версій?
JBRWilkinson

2
Чи існує поточний код у виробництві?
JeffO

Так, Джефф. Це виробничий, проект управління для управління фінансовими питаннями!
Саліван

Вибачте, JBR, вони не чули подібного. Просто створення купівлі кодів для копіювання пасти на весь жорсткий диск - це техніка для контролю версій.
Саліван

Відповіді:


36

Крок 0: Резервне копіювання в SCM

Тому що, як натякав JBRWilkinson у коментарях, контроль версій - це ваша перша лінія захисту від (незворотної) катастрофи.

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

Крок 1: Перевірте спочатку

Потім почніть з написання тестів :

  • для того, що працює,
  • і за те, що не вдається.

Незалежно від того, що ви вирішили зробити, ви охоплені. Тепер ви можете:

  • починати з нуля і переписувати ,
  • або виправити .

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

Крок 2: Перевірка та моніторинг

Створіть систему безперервної інтеграції (щоб доповнити крок 0 та крок 1 ) та систему безперервної перевірки (підготуватися до кроку 4 ).

Крок 3: Встаньте на плечі велетнів

(як завжди слід ...)

Крок 4: Очистити

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

Тоді ви також можете запустити форматформа коду, що вже трохи допоможе в господарстві.

Крок 5: Огляд

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

Крок 6: Підтвердження майбутнього процесу розвитку

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


Але справді, тест . Дуже багато .


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

@JBRWilkinson: хороший момент! Дійсно, повністю припустив, що вони це зробили.
haylem

2
Спочатку запустити контроль версій; краще пізно, ніж ніколи.
JeffO

@Jeff O: так, це вже те, що я додав у відповідь.
haylem

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

15

Особисто я б не запускав цей проект, доки не маю під рукою копію програми « Ефективно працювати із застарілим кодом» . Серйозно, це було написано саме для такого типу речей. Тут повно стратегій поводження з хитромудрим кодом, і йдеться про набагато більше деталей, ніж я можу дати вам тут.


1
+1 для використання широкої зовнішньої посилання, яка говорить про все.
haylem

На жаль, тут люди не мають уявлення про читання книг. Просто розробка проекту, який він працює - це все, що їм потрібно. Я почав читати згадану вами книгу, і КОД ЗАВДАННЯ 2 теж. Дозвольте сказати, що вони чудово написані.
Саліван

1
@Salivan - Можливо, у них просто нікого не було переконати, що такі книги варто прочитати. Якби там була людина, яка працювала з ними, яка була зацікавлена ​​читати такі книги ...
Джейсон Бейкер,

1
@Salivan - головне - знайти швидку виграш або два. Зробіть щось, що має майже негайну віддачу. Як і контроль над версіями, тому наступного разу, коли хтось скаже «як це сталося», ви можете це переглянути. Потім наведіть їх на кілька пропозицій із читання вашої копії WELC. Не кидайте на них книгу.

2
@Salivan Ви можете читати книги для них та капати вміст до них як пораду. Ви можете стати гуру команди.
MarkJ

8

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

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

Справа в рефакторингу (як у книзі Фаулера та в одній http://www.industriallogic.com/xp/refactoring/ Керієвського ) полягає в тому, що вона підтримує роботу системи, можливо, рефакторинг забирає подвійний час, але ризики дорівнюють нулю.

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

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


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

2
Само собою зрозуміло ... Я вважаю TDD реквізитом для будь-якого хорошого коду (він же новий).
Уберто

Писати з самого початку - дуже гарна ідея. Але спочатку потрібно скласти кілька діаграм твору. Але що ви зробите, якщо вам доведеться проаналізувати код для вилучення відносин? Крім того, розмір проекту робить неможливим, або він змусить нас найняти деяких інших програмістів.
Саліван

Тест-керований розвиток цінується!
Саліван

"Але що ви зробите, якщо вам доведеться проаналізувати код для вилучення відносин?" -> якщо це так, це означає, що проект не є ні крихітним, ні зламаним. Ака я почну робити рефакторинг по одній штуці за один раз. Дивіться також метод Мікадо. danielbrolund.wordpress.com/2009/03/28/…
Уберто

2

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

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


Скільки коштувало б переписати його повністю проти ітеративного вдосконалення? Який підхід дав би швидкий результат?
JBRWilkinson

@JBRWilkinson Це залежить. Ітеративний підхід хороший, коли у вас є робочий код.
duros

1
@duros, для зламаного коду, так. Цей код працює у виробництві.

2

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

Приємний блог, який розповідає, чому Netscape розпущений


2
Починаючи новий проект, під час оновлення / налагодження старої версії в середній час (і ви цього не можете уникнути, тому про це не мрійте) намагається стріляти по декількох рухомих цілях.
JeffO

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

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

1

Якщо він працює, переробляйте його. Є інструменти, які допоможуть вам це зробити. Якщо це не працює, скористайтеся командою вдосконалення магічного коду, тобто deltreeв Windows Resp. rm -rfна Linux.


2
Запропонувати "повністю стерти весь код" особливо непомітно - у вас є більш конструктивна відповідь?
JBRWilkinson

ЛОЛ. Я повністю з вами згоден, ammoQ!
Саліван

JBRWilkinson: Зробити новий перезапуск, швидше за все, кращий підхід, ніж намагатися зробити безлад і чистим. Компанія, над якою я працювала, намагалася, і рік за роком вони витрачали багато ресурсів і абсолютно ніде не потрапляли.
користувач281377

@ammoQ, вам потрібен старий код, щоб побачити, що він насправді робив, коли ви помиляєтесь.

1
Торбйорн: Ми говоримо про код, який не працює , правда? Аналіз коментованого, брудного коду, який не робить правильно, розповідає мені більше про психічний стан його творців, ніж будь-що інше.
користувач281377

1

Чи слід ремонтувати код і змінити його на ООП? Зараз ми налагоджуємо це. [... містить помилки, відсутні документи ...]

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

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

Як я можу навчити їх виконувати всі правила?

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


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

0

Моя пропозиція - це комбінація відповідей @ duros & @Manoj R.

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

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

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