Витрачає занадто багато часу на налагодження


24

Вчора я розгорнув версію веб-проекту v1.0, над яким я витратив близько 6 тижнів (увімкнено і вимкнено, тобто). Я не робив точних записів свого часу, але, згідно зі своїм досвідом, я підрахував би, що з усього часу, що я провів програмування, половина була витрачена на налагодження. Я вважаю, що приблизно 15-20 годин витратять на налагодження, що для мене - це дорогоцінний час, який можна було б краще витратити на написання нового коду чи завершення проекту раніше. Це особливо не допомагає, що я буду першокурсником в коледжі через 5 тижнів.

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

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


22
Коли я був першокурсником, я теж був повільним кодером. Просто дайте йому 20 років.
Робота

27
еге, удачі в цьому. "Якщо налагодження - це процес видалення помилок. Тоді програмування має бути процесом їх введення." -Edsger Dijkstra
Метт

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

5
Це називається "досвід" і допоможе вам у вашому наступному проекті.

4
Говорячи про кінець 40-х, Моріс Уілкс писав: "Як тільки ми розпочали програмування, ми здивували, що не так просто налагодити програми, як ми думали. Налагодження потрібно було виявити. Це було на одному з мої подорожі між кімнатою EDSAC та пробиваючим обладнанням, яке "вагається під кутом сходів", зрозуміло, що я знав, що значну частину мого життя я витратив на пошук помилок у власних програмах ".
Тревор Пауелл

Відповіді:


35

Ви просите священний Грааль програмної інженерії, і ніхто ще не має "" відповіді на це питання.

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

Професіонали використовують систему відстеження помилок, щоб вони могли (1) знати, що потрібно виправити, а також (2) проаналізувати, що потрібно було виправити після факту. Вам не потрібно бути настільки офіційним - просто ведення обліку в зошиті для вас може бути добре.

Дефекти сценічного дизайну

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

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

Помилки кодування

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

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

Якщо ви програмуєте на Perl, включіть strictі warningsщоб чути , що він говорить.

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

Дефекти стадії інтеграції

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

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

І так далі...

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

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

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


1
Це чудова відповідь, але ІМХО на різко інше питання. ОП говорить, що я витратив 6 тижнів на / виписання чогось, і мені довелося витратити багато часу на налагодження. Ми ще нічого не знаємо, наприклад, про якість, ремонтопридатність, масштабованість його товару. Якщо припустити TDD, гарний дизайн, відстеження помилок, все ще виникає питання, як ми пишемо код (включаючи тестовий код, який також потрібно налагодити) з меншими дефектами. Попередження, використання ворсинок тощо - хороші пропозиції. Більше тих із школи важких стукачів? :-)
Гай Сіртон

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

37

Пишіть одиничні тести

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

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

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


+1 для одиничних тестів - чим раніше в процесі розробки виходять помилки, тим дешевше і простіше їх виправити.
Пол Р

26

50% для налагодження (в широкому сенсі) - це не все так погано. Зазвичай люди витрачають набагато більше часу на розробку, тестування, виправлення помилок, рефакторинг та написання одиниць тестів, ніж ви пишете фактичний код. Це частина роботи.

І якщо чесно сказати, в програмуванні технічного обслуговування це набагато гірше - досить часто я витрачав годину, з'ясовуючи, що саме піде не так, потім п’ять хвилин писати код, щоб його виправити, а потім півгодини тестувати всю справу. Це трохи більше 5% кодування проти майже 95% некодування.

Є кілька речей, які можна зробити, щоб скоротити час налагодження:

  • Напишіть налагоджувальний код . Це означає: правильне поводження з помилками (з деякою думкою), структурування вашого коду, щоб зробити його легким для виконання, використовуючи твердження, сліди та все інше, що полегшить життя налагоджувача. Уникайте складних ліній; рядок, який робить більше ніж одну річ, слід розділити так, щоб ви переходили через них окремо.
  • Напишіть тестовий код . Розподіліть свій код на прості функції (або будь-яку іншу мову, яку ви обираєте); уникайте побічних ефектів, оскільки їх важко зафіксувати в одиничних тестах. Створіть свої функції так, щоб вони могли працювати ізольовано. Уникайте багатоцільових функцій. Уникайте крайових корпусів. Документуйте, що повинні виконувати ваші функції.
  • Пишіть тести . Наявність одиничних тестів означає, що ви знаєте, що ваші функції працюють принаймні підмножиною їх входів; це також означає, що у вас є перевірка обгрунтованості, щоб підтвердити, що зміни нічого не порушують. Переконайтеся, що ви розумієте поняття покриття коду та покриття входу, а також обмеження тестування одиниць.
  • Налаштуйте «робочий стіл» . Як саме ви це зробите, залежить від мови, про яку йде мова. Деякі мови, такі як Python чи Haskell, оснащені інтерактивним перекладачем, і ви можете завантажити в нього свій існуючий код, щоб грати з ним. Це ідеально, оскільки ви можете викликати свої функції в будь-якому вподобаному вами контексті, з мінімальними зусиллями - неоціненним інструментом пошуку та ізоляції помилок. Інші мови не мають такої розкоші, і вам доведеться вдаватися до написання невеликих інтерактивних тестових програм.
  • Напишіть читабельний код . Створіть звичку писати свій код, щоб висловити свої наміри якомога чіткіше. Документуйте все, що не зовсім очевидно.
  • Напишіть простий код . Якщо у вашого власного мозку є проблеми з розумінням всієї бази коду, то це не просто, і навряд чи хтось інший зможе повністю зрозуміти це. Ви не можете ефективно налагоджувати код, якщо ви не розумієте, що він повинен робити.
  • Будьте легкі за допомогою кнопки "Видалити" . Будь-який код, який вам зараз не потрібен, належить до кошика. Якщо вам це потрібно пізніше, відновіть його з управління джерелами (досвід показує, що це вкрай рідко). Чим більше ви розпоряджаєтесь кодом, тим менша поверхня налагодження.
  • Рефактор рано і часто. Без рефакторингу ви не можете тримати код у стані, що виводиться з ладу, додаючи нові функції.

1
Також світ може поводитись інакше, ніж ви очікуєте, у разі проблем. Це може спричинити дуже тонкі помилки.

2
+1. Я б сказав, що лише витратити 50% на налагодження зусиль досить низько, особливо, але не тільки у встановленій кодовій базі. Якщо мені присвоєно помилку, якщо це не вимагає майже повного переписування відповідних частин коду (навряд чи), я можу витратити набагато більше, ніж ця частка загального часу, лише з'ясовуючи, що відбувається не так, а потім тестувати виправлення. Саме виправлення часто буває швидким, часто становить лише один або кілька рядків зміненого коду.
CVn

@ ThorbjørnRavnAndersen Чорт, так, особливо з такими веб-проектами, як ОП. На цьому тижні ми чудово проводимо кодування символів на роботі ...
Ізката

5

Більше планування

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

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


1
+1, тому що це я роблю, щоб скоротити час налагодження. Коли я починаю новий проект, я
виписую

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

5

Працюйте більш ретельно

Це програмний еквівалент "відміряти двічі один раз":

  • Не кодуйте, якщо ви відчуваєте розгубленість або втому.
  • Витратьте достатньо часу на роздуми над проблемою, щоб мати чітке та елегантне рішення. Прості рішення рідше можуть мати проблеми.
  • Приділіть всю свою увагу завданню. Фокус.
  • Прочитайте свій код швидко після кодування, щоб спробувати пошукати помилки. Самоогляд коду.
  • Не чекайте занадто довго між кодуванням і тестуванням. Для покращення важливий негайний відгук.
  • Уникайте вчинків, які зазвичай призводять до помилок. Читайте про кодові запахи .
  • Підберіть потрібні інструменти для роботи.

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


4

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

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

Зараз очевидно, що різниця між "технічним обслуговуванням" та "налагодженням" трохи суб'єктивна. Чи вважаєте ви "помилки" проблемами з кодом, які виявляються після його виходу, і користувачі скаржилися на них? Або це будь-яка дрібниця, що помиляється з вашим кодом, коли ви щось додали (знайдені у ваших власних етапах тестування перед випуском)? У нетривіальній програмній системі (залежно від моделей використання) одна може бути значно більшою, ніж інша. Але в будь-якому випадку, для цього потрібне програмування чогось більшого, ніж іграшка "Hello world" - багато і багато технічного обслуговування та налагодження. Деякі люди навіть кажуть щось на кшталт " очікується, що все після першого рядка коду буде" режимом обслуговування ",

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


2

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

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


1
Мене дивують люди, яких я бачу, які не вчаться на своїх помилках (або намагаються згадати те, що вони дізналися). І одразу після того, як щось в них вибухнуло великим способом, вони обертаються і роблять точно те саме в наступному проекті.
HLGEM

2

БЕЗПЕЧНА ІНТЕГРАЦІЯ (CI) - це відповідь.

Постійна інтеграція = Система управління конфігурацією (а саме: Git, Mercurial, SVN тощо) + Інструмент CI + Тести одиниць + Тести диму

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


1

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

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


1

Тестова розробка може допомогти скоротити час налагодження за допомогою:

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

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


1

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

Вам слід звикнути писати чистий код та видаляти шкідливі звички, такі як копіювати код вставки та писати довгі методи тощо.

Крім того, час від часу вам слід переробляти код. Я пропоную вам прочитати книгу Мартіна Фаулера: Рефакторинг: вдосконалення дизайну існуючого коду


1

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

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

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


0

Чудові відповіді вище, але ніхто не зазначив прямо (хоча більшість натякав на це):

ЧИТАЙТЕ ЧИТАЙТЕ ЧИТАЙТЕ і на нудоту ...

Чим більше ви знаєте, тим менше ви не знаєте. Трохи кліше, але все ж основна правда.

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

Це питання дизайнерського рішення? Читайте про шаблони дизайну.

Це було недостатнє знання рамки чи мови? Кістки на цьому!

тощо

Є дві речі, від яких (живий) розробник ніколи не може уникнути: зміни (єдина константа в ІТ) та RTFMing ...


0

Одиничні тести та твердження

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

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


0

Коли ви починаєте проект, скільки альтернативних підходів ви визначаєте?

У вас є від двох до чотирьох різних підходів із плюсами та мінусами для кожного? Ви робите обґрунтований вибір серед них?

Тоді, найголовніше, чи є ви простота ваги як дуже важлива?

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

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


0

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

  • Запишіть його в журнал запису дефектів , який включає:

    • тип дефекту
    • фаза, в яку вводили дефект
    • фаза, в якій її було видалено
    • фіксувати час
    • опис проблеми та виправлення
  • Прийміть керівництво стилем для нормалізації стилю коду, який ви пишете

  • Інтегруйте правила безпечного кодування в процес перегляду коду

  • Візуалізуйте контрольний потік і дані

Список літератури

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