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


29

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


3
Опис може бути правильним - перезавантажте та повторіть спробу!
NoChance

5
допишіть його на stackoverflow звичайно :)
Вільям

5
Чому ви зважилися на поріг у 10 годин? Це занадто довго - якщо ви не маєте гарного уявлення про те, що викликає несподівану поведінку протягом години-двох, ви потрапили в біду.
Вектор

5
"Коли перехід стає важким, жорсткий лягає спати і нехай підсвідомість працює над цим". - anon
Michael Easter

2
1. Запросіть когось допомогти. Дві людини - це обов’язково. 2. Звужте його, використовуючи надмірну кількість заяв про налагодження. Був файл, де кожному окремому рядку передував макрос налагодження, щоб точно визначити той, який сегментується.
СФ.

Відповіді:


9

Що стосується справді жахливих проблем, то моя стратегія зазвичай полягає в наступному.

  • Експериментуйте та google. Продовжуйте намагатися вирішити проблему. Більшість часу це вирішує проблему через годину чи менше.

  • Так що це не спрацювало. Відпочинь. Випити кави, поговорити про щось, що не має відношення до колеги. Виштовхнути проблему з розуму. Коли ви дивитесь на проблему через 5 або 10 хвилин, ви дивитесь на неї з дещо іншого погляду. Більшість часу це працює.

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

  • Попросіть колегу змусити вас довести всі свої припущення. це сеттер насправді викликає? Чи справді цей метод повертає те, про що ви заявляєте? Ви думаєте, що цей об’єкт не є нульовим - покажіть їм, що він не є нульовим.

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

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

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

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

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

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


79

Вийдіть. Ні, не ваша робота! Просто встань та йди додому. Ви закінчили на день або вихідні. 19 разів із 20, коли ви знову повернетесь до проблеми, рішення з’явиться протягом години.


17
Ви також можете спробувати гумовий накид. en.wikipedia.org/wiki/Rubber_duck_debugging
Дейв Найй

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

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

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

3
Був захоплюючий NOVA Science NOW за участю Ніла деГрассе Тайсона, який розповів про науку про сон. У ньому обговорювалося явище стукати головою по проблемі годинами, лягати спати, а прокидатися і вирішувати її відразу. Коли ми спимо, наш мозок перевертає події нашого дня знову і знову, аналізуючи це з багатьох куточків. Що вона залишає після себе - це нові нейронні шляхи, які насправді можуть допомогти нам побачити проблему зовсім по-новому підсвідомо, а потім насправді вирішити проблему. Досить приголомшливий.
Бирн Різ

44

Перед тим, як пройдуть десять годин, я отримав би допомогу.

  1. Опишіть проблему комусь іншому, комусь іншому, навіть гумовій качці .
  2. Попросіть когось іншого поглянути на код або перегляньте його з ними.
  3. Ізолюйте його. Видаліть купу матеріалів, а потім поверніть її трохи по черзі, поки проблема не з’явиться знову.
  4. Поспи трохи!

12
+1 для видалення всього, поки проблема не зникне.
Йона

4
Ви повинні зробити одну з таких речей до того, як пройде 1 година. Чим більше ви дивитесь, тим менше шансів домогтися свого проголошення. Я зазвичай вирішую проблему, просто розмовляючи з кимось.
Ben

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

17

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

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

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


Дуже дякую - я прочитав статтю про таймбокс у Вікіпедії, дуже корисну.
Адель

7

Поясніть проблему комусь іншому.

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

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

Я вважаю, що сон при проблемі (іноді на пару днів) також може допомогти.


1
"Хтось інший" не повинен бути людиною. Іноді я пояснюю речі кішці, і ага! Я знаходжу проблему.
DarenW

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

Хтось справді повинен зробити вирізану з Джона Скіта картону натурального розміру.
Дон Робі

5

У мене є три кроковий план:

  1. Отримайте каву чи інший смачний напій.
  2. Попрацюйте над чимось іншим протягом решти дня.
  3. "Телефон другові" та каракулі на дошці.

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


Приємна порада! Тож "Телефон другові" цитується, тому що його слід обмежити на 60 секунд, як у Мільйонера, так? Мені також подобається ідея дошки.
Адель

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

4

Спати над ним

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

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


3

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


3

Я, як правило, роблю одну з трьох:

  1. Прогуляйтеся на велосипеді ... Деякі, що відводять вас від комп'ютера.
  2. Пограйте з моєю собакою чи котом
  3. Якщо у вас є хобі, попрацюйте над цим деякий час.

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


3

Побудуйте тестову запряжку, щоб орієнтуватися на цей дефект та ізолювати його

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

Рекомендоване читання: Прагматичний програміст, зокрема, Розділ 10: Кулі відстеження


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

Прагматичний програміст чудовий
Адель

2

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


2

Редагувати:

Коротка відповідь:

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

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


Пояснення:

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

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

Крім того, коли ви пишете свій код, ви вже повинні знати, де і чому він може вийти з ладу.

Сказавши це - попросити однолітка, розмістити повідомлення про SO, відступити і відкотити свої кроки та зробити перерву - всі пропозиції, згадані вище, допоможуть.

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


Вміння відстежувати свої кроки є життєво важливим. Дякую!
Адель

> Життєздатне вміння відстежувати свої кроки. Програмне забезпечення SourceControl - це ключ до можливості відкату / відстеження. Будьте АНАЛЬними щодо цього, і якщо можете, встановіть свої налаштування, щоб змусити залишати коментарі при реєстрації.
Вектор

3
На жаль, як би добре ви не знали код, іноді проблема полягає у взаємодії з чужим (закритим вихідним) кодом.
Nate CK

2
+1 @Nate CK - дуже правда. Найгірші типи помилок трапляються, коли ти повертаєшся до якоїсь хитрості від веб-служби, на яку ти покладався. Нещодавно у мене був постачальник Saas, який тонко змінив деяку функціональність, не попереджаючи їх веб-служби. Мені довелося пояснити розробнику, як виправити власну помилку по телефону, коли він описав мені, як виглядає його код.
Морган Херлокер

1
Щоб визначити, що? Що в коді третьої сторони є проблема? Ця частина відносно проста. Важка частина полягає у з'ясуванні, які умови викликають її, і як обійти її, коли у вас немає джерела, постачальник не реагує, і, можливо, цього не відбувається у вашій тестовій системі. Якщо ви думаєте, що знання вашого коду вирішить все, що для вас, я пропоную, можливо, вам ніколи не доводилося з цим стикатися.
Nate CK

1

У мене була подібна проблема - очевидна пошкодження пам’яті в «Objective-C», з якою я боровся багато годин. Але потім я та мої колеги просто погуляли на обід, і я пояснив проблему (і один конкретний біт, пов’язаний із десеріалізацією об’єкта в його методі init), і в основному пояснив всю проблему самому собі.

(технічні подробиці: в основному я ініціалізував і повернув об'єкт на щось інше, ніж на себе, тому було два алоки, але повернувся лише один об’єкт. Пам'ять змістилася і збожеволіла, вибилася, і налагоджувач насправді не знав, що з цим робити це теж).


1
"Я ініціалізував і повернув об'єкт на щось інше, ніж на себе" - подібні помилки ТАКІ! Ви можете подивитися його понад 100 разів, а не зловити. Але ви не бачили двох виділень, простежуючи в налагоджувачі?
Вектор

1

введіть тут опис зображення

Прийми ванну.

Будь-які Родні Маккей шанувальників?

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

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


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

Якби легіон робочих кабінетів кожен мав таке приміщення.
Адель

1

Крок за кроком переходьте до складання. Хто що називає, перерва в доступі до пам'яті. Це, як правило, швидко вловлює помилку.

Якщо ні, погуляйте.


1

Поєднання всього перерахованого:

  • На деякий час відійдіть від нього, щоб він міг сидіти на спині пальника. Спи, відпочивай, їж, гуляй, що завгодно.

  • Більше вивчіть проблему, що ще робить це неправильно, які інші симптоми ви можете виявити?

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

  • Спробуйте щось інше . Робота навколо. Різна техніка налагодження. Валідатор. Інший комп’ютер.

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

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

  • Запитайте StackOverflow! Ми тут, щоб допомогти


1

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

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

  2. Що сталося з усіма? Добре, тепер зробіть історію перегляду коду та перевірте наявність останніх змін, які могли спричинити помилку, прямо чи опосередковано.

  3. Немає останніх змін? Якщо це дуже специфічна помилка (виняток), "stackoverflow it". Тепер це виглядає не краще, ніж "google it", але мені добре сказати, що спочатку шукаю stackoverflow для дослідження програм програмування, ніж Google. Якщо це дійсно відома проблема, велика ймовірність, що ви знайдете тут рішення. Якщо ні, то опублікуйте питання на відповідному сайті stackexchange. Ви можете отримати дуже швидку відповідь, або навіть якщо цього не зробите, ваше запитання буде там, поки ви будете проводити додаткові дослідження. Це вигода.

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

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

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

  7. Якщо ви все ще не маєте відповіді, смію сказати, що ви можете спробувати рефакторинг на більш дрібні завдання / методи / функції. Генрі Форд сказав щось на кшталт "Існує не така складна задача, яку неможливо виконати, розбивши її на більш дрібні завдання". На даний момент, якщо рішення занадто складне, і ви не з'ясували ні самостійно, ні за допомогою когось іншого, перефактуруйте код на більш дрібні завдання. Навіть якщо ви не закінчите робити це, це може допомогти вам знайти причину.

  8. Додайте в свій код інструментарій.

  9. Твіт про це ??


1

Вам потрібно відступити. Мій девіз: "Якщо проблема занадто сильна, то ви вирішите неправильну проблему". Які ваші припущення? не вірити нічого.

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

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


Настільки правдиво, що "чим дивніше проблема, тим смішніше рішення"
Адель

-1

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


-1
  1. Запишіть проблему.
  2. Думайте важко.
  3. Реалізуйте рішення.

Лаконічний, дуже гарний!
Адель

1
Власне, ні. Дуже важко розмірковувати над одними і тими ж треками - це лише найгірше, що можна зробити. "Оскаржуйте, перераховуйте, переглядайте та перевіряйте кожне з ваших припущень систематично" - рішення тут; люди обговорюють різні тактики досягнення цього.
smci
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.