Як витратити менше часу на налагодження? [зачинено]


15

Дотримуючись правила Парето, програміст витрачає лише 20% свого часу на дійсно корисні речі.

Я витрачаю 80% свого часу на налагодження, виправляючи дрібниці, щоб все працювало.

Чи є спосіб витратити менше часу на налагодження?


9
Я не впевнений, що саме так я би трактував принцип Парето.
c_maker

6
<meme> Подивіться на TDD. </meme>
StuperUser

1
Що ви насправді робите під час налагодження?

3
вам потрібно більше часу приділяти своїй увазі деталям

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

Відповіді:


5

Код в Агді чи Кок . Після того, як ваш код складеться, він запрацює. Якщо це занадто хардкор, виберіть мову зі слабкою системою типу, наприклад, Haskell або F #.

Але все-таки в більшості випадків ви будете набагато продуктивніше витрачати 20% свого часу на кодування та 80% на тестування та налагодження. 100% на тиждень - це набагато більше 20% години. Якщо налагодження - це те, що вам потрібно зробити, то налагодження - це не марна трата часу, і ви не повинні перейматися «покращенням» цієї пропорції.


1
Окрім того, що щось працює, це не означає, що у ньому немає помилок. Помилки часто є результатом того, що код робить неправильну справу.
HLGEM

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

2
@HLGEM, то ваше поняття "налагодження" є досить креативним і далеко не основним. І в будь-якому випадку, при такому підході пропорція між кодуванням та "налагодженням" була б далеко не 20/80. Тож, будь ласка, зауважте, пояснюючи свою заяву.
SK-логіка

1
@HLGEM, він не був у переліку вимог до ОП. Нічого не відомо про те, скільки там розробників, хто відповідальний і т. Д. Єдине питання було "як оцінити співвідношення 20/80", а використання статично підтвердженої мови явно є найбільш очевидною відповіддю на це. Але, як я вже говорив, ця відповідь застосовна лише в дуже рідкісних випадках, і загалом дотримання правила 20/80 є набагато кращим варіантом.
SK-логіка

1
@ uhbif19 Кнут мав на увазі бути жартівливим. Ви знаєте, що він насправді мав на увазі?
Філ

44

Блок тестування.

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

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


Я використовую Unit-Tests і повністю згоден з вами. Але я не можу все перевірити.
uhbif19

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

8
@Fredrik, ви не можете належним чином перевірити тест навіть a + bфрагмента коду (якщо ваш тест не охоплює весь діапазон вашого арифметичного типу даних).
SK-логіка

"Після сеансу налагодження я просто виправив код." - Дійсно? Я думаю, що після сеансу налагодження я просто представив більше помилок - я просто не знаю, де вони.
B Сім

35
  • Тестування блоку, щоб ви дізналися, чи працює ваш код в першу чергу.
  • Принаймні деяку кількість попереднього дизайну, щоб ви знали, що кодуєте.
  • Код оглядів, тому що дві голови краще однієї, а чотири ока - краще, ніж дві. Не кажучи вже про те, що навіть спроба пояснити свій код комусь іншому виявляє багато проблем.
  • Керування версіями, щоб ви могли швидко виділити, які зміни, можливо, спричинили помилку.
  • Рефакторинг, щоб код не перетворився на жахливий незрозумілий безлад.
  • Прочитайте «Чистий код» Роберта К. Мартіна і робіть те, що він вам каже. Ви будете вражені результатами.

5
Саме так - жодна практика (наприклад, тестування одиниць) не накаже покращити порядок, але комбінація практик може. Іншими словами ... срібної кулі немає.
Майкл

Я б додав TDD (де це можливо).
Том

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

1
@JanHudec Refactoring + чистий код + тести = TDD
Том

1
@Tom: Так, але різні його частини мають різний вплив. Навчитися писати чистий код допоможе вам скоротити час налагодження без тестів. Тести існують, щоб ви могли протестувати модулі до того, як їх використання буде впроваджене, і таким чином ви зможете перевірити, чи не ви змінювали поведінку під час рефактора - що потрібно для очищення старого безладного коду.
Ян Худек

8

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

Це отримає вам більшу частину шляху, але для 99,999% проектів вам все одно потрібно буде час відладжувати речі. Найкраще, що тут я вважаю, це зробити 4 речі:

  1. використовуйте незмінні типи, де це можливо - якщо щось має неправильне значення, ви точно знатимете, де слід шукати негайно (де це будується).
  2. примусово виконувати інваріанти в коді - якщо ви знаєте, що значення точно не дозволено, тоді перевірте його та киньте виняток у пунктах введення методам та конструкторам. Якщо поєднувати це з непорушними типами, то ви також можете почати робити певні припущення щодо того, що є дійсним чи ні.
  3. переконайтеся, що у вас є адекватний журнал - розпочніть це на початку, і він дасть вам багато важливої ​​інформації про те, коли все піде не так. Тут дуже добре працює AOP. Ведення журналу як заздалегідь, як правило, трохи сміття - отримайте його на початку, як частина налаштування проекту.
  4. якщо база вашого коду досить велика / складна, уникайте використання примітивів - наприклад, майте тип під назвою "Age", а не просто використання int. Спочатку це здасться трохи безглуздим, але можливість вистежувати всі потреби чогось за мить - це величезна виграш налагодження.

6

Мої 80% - це налагодження. Я виправляю прості помилки і намагаюся зробити так, щоб все працювало.

Почніть з написання одиничних тестів і намагайтеся мати якомога більше покриття. Хтось згадав TDD, але я б пішов з BDD .

Зрештою, ви, швидше за все, витратите 80% на налагодження складних помилок.


6

Як витратити менше часу на налагодження? Напишіть менше коду.

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


4

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


3

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


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

3

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

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

    • Використання гілок допоможе вам відокремити області розвитку, і ви зможете побачити, у якій області розвитку є помилка, а в якій ні.
    • Дізнайтеся, як використовувати бісекцію у своєму VCS, Git має це вбудований. Якщо ви використовуєте інший VCS, який не має вбудованої бісекції, шукайте інструмент, який працює як git bisect, але для вашого VCS (я знаю, що це існує для SVN та не має бути занадто важким для створення для інших ДКС). Це допоможе вам звузити зміну коду, яка ввела помилку, що допоможе дізнатися, куди вказати ваш налагоджувач. Цей процес розбиття буде більш швидким, якщо у вас є тести на помилку, і знаючи, яка фіксація містить правопорушну зміну, буде корисніше, якщо ви практикуєте атомні коміти.
  • Удосконалити розуміння мови програмування, якою ви користуєтесь.

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

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

2

Додавання до коментарів для Unit Testing, але це справді добре, лише якщо ваш код відокремлений для його підтримки (наприклад, MVC). Якщо ви не можете реалізувати MVC (або подібний) (застарілий проект), одиничні тести взагалі не працюють для вашого інтерфейсу. Тоді я б додав автоматичне тестування інтерфейсу користувача (Microsoft Coded UI Tests, WaitN), оскільки це зменшить помилки в тій частині вашого коду.

Я також дуже рекомендую запускати інструменти статичного аналізу (наприклад, FxCop / Microsoft Code Analysis, Resharper, JustCode для світу MS). Вони можуть знайти всілякі поширені проблеми кодування, які можуть зменшити нерозумні завдання налагодження та зосередити увагу на налагодженні бізнес-логіки.


2

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


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

2

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

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

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

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

- Використовуйте абстракцію, де це доречно. Короткочасна пам'ять слабка.

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

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

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


1

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


1

Хоча я повністю підтримую тестування модулів, запропоновані вище, TDD або BDD будуть мати велике значення, оскільки вам потрібно спочатку подумати про проблему та рішення.

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

Іноді швидка писанка на аркуші паперу допомагає побачити більші з'єднані частини головоломки.

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

PS. Я маю на увазі 5, може, десять хвилин, а не години написання величезної специфікації.


1

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

Вчитися на своїх помилках. Не продовжуйте робити одні і ті ж знову і знову.

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

Зверніть увагу на вимогу. Навіть якщо він працює, але не виконує вказану вимогу, це помилка.

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


0

Мої дві головні думки: 1) Напишіть кращий код, який вийде з ладу, коли ви зробите щось несподіване 2) Станьте кращим у налагодженні

Мій код завалений

if(value!=null) throw new NotImplementedException();
if(obj.v>0) throw new Exception(); //sometimes i dont write NotImplementedException
if(value=="thing") throw ...;

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

Щоб покращити налагодження безладу з стеком викликів, точками переривання (з умовами), безпосереднім вікном (також відомим як вікно підказок або відбивання), змінними "спостерігати" та ще.

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