Как вы решаете действительно странные ошибки, которые ставят вас в тупик более 10 часов? [закрыто]

29

Вы знаете их, те ошибки, которые не имеют смысла. Там, где кажется, что гремлин просто запрыгнул в ваши фишки и что-то напутал. Вы гуляете, пишете вещи, звоните дяде?

Адель
источник
3
Ваше описание может быть правильным - перезагрузите компьютер и попробуйте снова!
NoChance
5
опубликовать его на stackoverflow конечно :)
Уильям
5
Почему вы определились с порогом в 10 часов? Это слишком долго - если у вас нет четкого представления о том, что вызывает неожиданное поведение в течение часа или двух, у вас проблемы.
вектор
5
«Когда наступают тяжелые времена, тяжелые ложатся спать и позволяют подсознанию работать над этим». - скоро
Майкл Пасха
2
1. Попросите кого-нибудь помочь. Два человека является обязательным. 2. Сузьте его, используя чрезмерное количество отладочных операторов. Был файл, в котором каждой отдельной строке предшествовал макрос отладки, чтобы точно определить тот, который был поврежден.
SF.

Ответы:

9

Для этих действительно ужасных проблем моя стратегия обычно выглядит следующим образом.

  • Эксперимент и Google. Продолжайте пытаться решить проблему. В большинстве случаев это решает проблему за час или меньше.

  • Так что это не сработало. Сделать перерыв Выпей кофе, поговори о чем-то не связанном с коллегой. Выбросьте проблему из головы. Когда вы смотрите на проблему 5 или 10 минут спустя, вы смотрите на нее с несколько иной точки зрения. Большую часть времени это работает.

  • В этом случае это не так. Поэтому потратьте еще 10 - 30 минут на это. Тогда позвони коллеге. Но прежде чем сделать, сделайте несколько заметок; Вы хотите продемонстрировать проблему, воспроизвести ее, затем перечислить вещи, которые вы пробовали, и, самое главное, доказать, что вы их пробовали. Так что сначала пробуйся. Установите в коде несколько закладок, закройте лишние открытые документы и т. Д. Таким образом, вы можете либо решить проблему самостоятельно, либо когда продемонстрируете проблему, вы не будете тратить свое время.

  • Попросите своего коллегу заставить вас доказать все свои предположения. этот сеттер действительно вызывается? Этот метод действительно возвращает то, что вы утверждаете? Вы думаете, что объект не нулевой - покажите им, что он не нулевой.

  • В большинстве случаев, если вы продемонстрируете проблему, вы поймете, что вы не использовали все возможности, или ваш коллега увидит вашу ошибку.

  • Если это не работает, пришло время стать серьезным. Документируйте точно, что вы пытаетесь сделать, что вы пытались и почему это не сработало. Отправьте это по электронной почте всем своим коллегам. Разместите это на ТАК. На данный момент документ должен быть идеальным вопросом SO.

  • Пока вы ждете ответов, Google Google Google. Попробуйте каждую перестановку вопроса, который у вас есть. Откройте кучу вкладок. Вы, вероятно, не получите ответ к этому моменту, но вы ищете идеи, возможности, различные способы решения проблемы.

  • Сделайте что-нибудь еще, если вы потратили 5 часов на проблему, самое время оставить ее на другой день. Может быть, вы получите полезный ответ. Возможно, когда вы атакуете проблему на следующий день, это будет очевидно.

  • Если ничего из этого не работает, пришло время искать другое решение. Может быть, вы можете использовать другой метод, другую технологию. Возможно, вам стоит подумать об отказе от этой функции. Вы выставляете счет клиенту по часам? Вы работаете на компанию по внутреннему приложению? Вам нужно передать это владельцу и сказать ему: «Послушайте, я потратил на это х часов и не добился прогресса, стоит ли экономическая выгода?». Вы не хотите идти к своему боссу и говорить им, что вы потратили 16 часов на проблему только для того, чтобы они обернулись и сказали, что это не важно, пропустите это для этого выпуска. Вы должны выяснить это раньше.

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

Роберт Антон Риз
источник
79

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

Дэйв Най
источник
17
Вы могли бы также попробовать резину пригнуться. en.wikipedia.org/wiki/Rubber_duck_debugging
Дейв Най
2
19 из 20, да. Мой худший никогда не был решен, только работал вокруг. Никакая тестовая среда никогда не показывала это, только полную производственную среду в действии - мы не могли даже воспроизвести это после нескольких часов.
Лорен Печтел
3
Избавиться от чего-то, что вас раздражает, может быть очень трудно - но я обнаружил, что на протяжении многих лет это всегда лучшее, что можно сделать. Подсознание может работать над проблемой, пока вы едите, спите, отдыхаете, смотрите телевизор ... и на следующий день (или послезавтра) дела идут лучше. Одно слово предостережения: собирать информацию, прежде чем уйти ... Уходить - это не то же самое, что игнорировать ее и притворяться, что ее там нет. Вам все еще нужна тяжелая работа!
быстро,
1
Я не знаю около часа. Я обычно решаю большинство этих проблем в душе, когда просыпаюсь утром. Второй наиболее частый случай - это когда я почти сплю ночью и, наконец, позволил себе перестать думать об этом.
SoylentGray
3
Нил де Грас Тайсон провел увлекательную научно-исследовательскую программу NOVA Science NOW, в которой рассказывалось о науке о сне. В ней обсуждалось явление, когда вы часами бьете головой о проблеме, засыпаете, сразу же просыпаетесь и решаете ее. Когда мы спим, наш мозг переворачивает события нашего дня снова и снова, анализируя его с разных точек зрения. То, что он оставляет, - это новые нейронные пути, которые на самом деле могут помочь нам увидеть проблему совершенно новым способом подсознательно, а затем фактически решить проблему. Довольно круто.
Бирн Риз
44

До того, как пройдут десять часов, я получу некоторую помощь.

  1. Опишите проблему кому-то еще, кому-нибудь еще, даже вашей резиновой утке .
  2. Попросите кого-нибудь еще взглянуть на код или пройтись вместе с ним.
  3. Изолировать это. Удалите кучу вещей, затем возвращайте их постепенно, пока проблема не появится снова.
  4. Поспи!
Кевин Клайн
источник
12
+1 за удаление всего, пока проблема не исчезнет.
Иона
4
Вы должны сделать одну из этих вещей до того, как пройдет 1 час. Чем больше вы смотрите, тем меньше у вас шансов достичь своего прозрения. Обычно я решаю проблему, просто обсуждая это с кем-то.
Бен
Пятно на. Часто я выясняю проблему (или приближаюсь к ней), сначала описав проблему. Часто это происходит при написании описания проблемы для вопроса StackOverflow. Что также требует сокращения (изоляции), а затем провала этого, периода ожидания, когда вы
отходите
17

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

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

Я бы никогда не потратил больше 45 минут на час, пытаясь решить что-то за один присест, это нарушает закон убывающей отдачи.

user7519
источник
Огромное спасибо - я прочитал статью о timebox в Википедии, очень полезную.
Адель
7

Объясните проблему кому-то еще.

Объясняя проблему кому-то еще, вы должны прояснить ее: это часто позволяет увидеть решение.

(Один из профессиональных компьютерных журналов Великобритании однажды предложил продавать картонные вырезы старшего программиста в натуральную величину специально для этой цели.)

Я считаю, что спать по проблеме (иногда в течение нескольких дней) также может помочь.

MZB
источник
1
«Кто-то другой» не обязательно должен быть человеком. Иногда я объясняю вещи кошке, ага! Я нахожу проблему.
ДаренВ
Я действительно должен купить кошку тоже. Я тренировал это, чтобы почесать голову по требованию.
Адель
Кто-то действительно должен сделать вырез из картона в натуральную величину Джона Скита.
Дон Роби
5

У меня есть план три шага:

  1. Получить кофе или другой вкусный напиток.
  2. Работайте над чем-то еще до конца дня.
  3. «Позвони другу» и нарисуй на доске.

Каждый этап является эскалацией, если предыдущий шаг не удался. Почти всегда есть что-то еще, над чем я могу работать на втором этапе.

Flexo
источник
Хороший совет! Так что «Звони другу» цитируется, потому что оно должно быть ограничено 60 секундами, как на «Миллионере», да? Мне тоже нравится идея доски.
Адель
1
Я считаю, что доска действительно помогает продумать это методично. Цитаты были потому, что часто друг находится в одном офисе, поэтому на самом деле звонить было бы странно. Но это вроде как спасательный круг из телешоу.
Флекс
4

Спи над этим

В противном случае позвоните кому-нибудь поблизости и попросите его быстро просмотреть код.

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

Акаша
источник
3

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

compman
источник
3

Я обычно делаю одно из трех:

  1. Прогуляйтесь / покатайтесь на велосипеде ... некоторые из них отвлекают вас от компьютера.
  2. Играть с моей собакой или кошкой
  3. Если у вас есть хобби, поработайте над этим некоторое время.

Любой из трех хорошо отвлекает себя от сложившейся ситуации. Я считаю, что отвлекающие факторы позволяют моему подсознанию некоторое время что-то пережевывать. Примерно через час, Бэм, есть решение :-).

toddward
источник
3

Постройте тестовый жгут, чтобы нацелиться именно на этот дефект и изолировать его

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

Рекомендуемое чтение: прагматичный программист, в частности, глава 10: пули Tracer

дебилы
источник
все это хорошо и хорошо, но само собой разумеется, что ошибка была и может быть воспроизведена. Что, если 19 часов, проведенных до сих пор, были именно этим ... попыткой найти способ воспроизвести проблему детерминистическим и систематическим образом ... что тогда? Для меня это суть вопроса здесь!
Ньютопия
Прагматичный программист превосходен
Адель
2

Все эти предложения великолепны. Тем не менее, я часто использую технику, о которой я не упоминал. Составьте списки, чтобы организовать ваши мысли о проблеме. Если у меня возникает проблема с проблемами, я обычно выписываю несколько списков, таких как: факты, предположения, вопросы, симптомы и т. Д. Я нахожу, что часто в процессе организации вещей таким образом я обнаруживаю предположения, которые я не осознавал ( это часто оказывается неправильным), вопросы, которые я не осознавал, нужно задавать, другие варианты, которые я могу проверить, и т. д.

RationalGeek
источник
2

Редактировать:

Краткий ответ:

В: Как вы решаете действительно странные ошибки, которые ставят вас в тупик более 10 часов?

A: Убедитесь, что они никогда не произойдут: поймите ваш дизайн, узнайте ваш код, научитесь использовать ваш отладчик.


Объяснение:

«Там, где кажется, что гремлин просто запрыгнул в ваши фишки и что-то напутал»

Этого никогда не должно случиться. Если это ваш код, вы должны очень хорошо понять, что является причиной ошибки, прежде чем пытаться ее исправить.

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

Сказав это, - попросив сверстника, разместив на SO, повторив и откатив свои шаги и сделав перерыв - все предложения, упомянутые выше, помогут.

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

Майки
источник
Возможность повторить свои шаги жизненно важна. Спасибо!
Адель
> Возможность повторять свои шаги жизненно важна. Программное обеспечение SourceControl является ключом к возможности отката / восстановления. Будьте ANAL об этом, и, если вы можете, установите свои настройки, чтобы заставить вас оставлять комментарии при регистрации.
Вектор
3
К сожалению, независимо от того, насколько хорошо вы знаете свой код, иногда проблема заключается во взаимодействии с чужим (закрытым исходным кодом) кодом.
Nate CK
2
+1 @Nate CK- очень верно. Худшие типы ошибок случаются, когда вы получаете какую-то тарабарщину от веб-службы, на которую вы полагались. Некоторое время назад у меня был поставщик Saas, который слегка изменил некоторые функции без предупреждения в своем веб-сервисе. Мне пришлось объяснить разработчику, как исправить его собственную ошибку по телефону, так как он рассказал мне, как выглядит его код.
Морган Херлокер
1
Чтобы определить что? Что есть проблема в стороннем коде? Эта часть относительно проста. Сложнее всего выяснить, какие условия вызывают его, и как обойти его, когда у вас нет источника, поставщик не реагирует, и, возможно, это не происходит в вашей тестовой системе. Если вы думаете, что знание вашего кода решит все это за вас, я полагаю, возможно, вам никогда не приходилось сталкиваться с этим.
Nate CK
1

У меня была похожая проблема - явное повреждение памяти в Objective-C, с которым я боролся в течение многих часов. Но затем я и мои коллеги просто прогулялись на обед, и я объяснил проблему (и один конкретный момент, связанный с десериализацией объекта в его методе init), и в основном объяснил всю проблему самому себе.

(подробности: в основном, я инициализировал и возвращал объект на что-то другое, кроме self, так что было два выделения, но возвращался только один объект. Память сдвинулась и сошла с ума, вылетает, и отладчик действительно не знал, что делать с это тоже).

Ктулху
источник
1
«Я инициализировал и возвращал объект на что-то другое, чем на себя» - такие ошибки, как TOUGH! Вы можете посмотреть его более 100 раз и не поймать. Но разве вы не могли видеть два распределения, прослеживая в отладчике?
Вектор
1

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

Принимать ванну.

Есть ли фанаты Родни Маккея ?

Серьезно, однако, если среди всех этих ответов есть одна общность, это сделать перерыв и сделать что-то еще .

Мне нравится думать об этом как о передаче проблемы вашему подсознанию. Даже если мы иначе не осознаем, наш разум (кажется) продолжает работать над проблемой, даже когда мы делаем что-то еще, например, принимаем ванну .

Paperjam
источник
Отличная идея ... теперь мне просто нужно, чтобы босс поставил полдюжины ванн в офисе.
Дейв Най
Если бы у легиона рабочих кабинок была такая комната.
Адель
1

Шаг за шагом, вниз, в сборку. Кто что называет, точка останова на доступ к памяти. Обычно это очень быстро ловит ошибку.

Если нет, прогуляйся.

кодер
источник
1

Сочетание всего этого:

  • Отойди от этого на некоторое время, чтобы он мог сесть на задний план. Спи, отдыхай, ешь, гуляй, что угодно.

  • Изучите проблему больше, что еще она делает не так, какие еще симптомы вы можете найти?

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

  • Попробуйте что-то другое . Работа вокруг. Другая техника отладки. Валидатор. Другой компьютер.

  • Поговори с кем-нибудь . Даже если они не могут помочь, или даже не программист, иногда разговоры вызовут идею лампочки

  • Перезапуск! Если уместно, попробуйте перезагрузить компьютер, сервер и т. Д. Если ничего другого, вы можете использовать время, чтобы подумать.

  • Спросите StackOverflow! мы здесь, чтобы помочь

rlb.usa
источник
1

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

  1. Подтвердите, что это происходит не только с вами. Это может сэкономить вам много времени. Возможно, вы удалили обязательный компонент или внесли изменения в вашу среду, и где-то в вашем коде проглочено исключение. Если бы это случилось только с вами, я бы использовал инструмент сравнения окружения. Недавно я читал о программном обеспечении под названием Envy, которое позволяет вам делать это, хотя оно и не бесплатное, оно стоит 10 долларов США.

  2. Бывает со всеми? Хорошо, теперь сделайте View History в коде и проверьте последние изменения, которые могли вызвать ошибку, прямо или косвенно.

  3. Там нет каких-либо недавних изменений? Если это очень специфическая ошибка (исключение), «stackoverflow it». Теперь это звучит не лучше, чем «Google это», но я рад сказать, что я сначала ищу стекопоток для исследования программирования, чем Google. Если это действительно известная проблема, вполне вероятно, что вы найдете решение здесь. Если нет, то разместите вопрос на соответствующем сайте stackexchange. Вы можете получить очень быстрый ответ, или даже если вы этого не сделаете, ваш вопрос будет там, пока вы будете проводить дополнительные исследования. Это преимущество.

  4. Если вы не нашли ответ в Интернете или это не общая ошибка, пошагово пройдитесь по коду, проверяя, имеют ли полученные результаты каждого шага смысл для ожидаемого результата. Начните, чтобы закончить на каждом методе, и снизу вверх на многоуровневом решении. (то есть, если вы устраняете неполадки с производительностью, начните с кода, который извлекает записи. Не имеет смысла запускать в пользовательском интерфейсе, если вы можете быстро определить, является ли первый шаг проблемой).

  5. Если, пройдя код несколько раз, вы все равно не нашли, что не так, позвоните кому-нибудь, чтобы поговорить об этом. Как кто-то уже упоминал, говорить об этом вслух может лампочка. Плюс парное программирование действительно полезно.

  6. В этот момент, если это возможно, уйдите на какое-то время или на день. Вчера я прочитал очень правдивый твит, в котором говорилось: «Я лег спать, думая« как, черт возьми », и проснулся, думая« но, конечно » Это точно.

  7. Если у вас все еще нет ответа, я бы осмелился сказать, что вы можете попробовать рефакторинг на более мелкие задачи / методы / функции. Генри Форд сказал что-то вроде: «Нет такой сложной задачи, которую нельзя решить, разбив ее на более мелкие задачи». На этом этапе, если решение слишком сложное и вы не разобрались ни с самим собой, ни с помощью кого-либо еще, реорганизуйте код в более мелкие задачи. Даже если вы не закончите это, это поможет вам найти причину.

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

  9. Чирикать об этом ??

silverCORE
источник
1

Вы должны сделать шаг назад. Мой девиз: «Если проблема слишком сложная, значит, вы решаете не ту проблему». Каковы ваши предположения? не доверяй ничему

Следствием этого является «чем страннее проблема, тем страннее решение». Сила компьютера заключается в его логике, поэтому вы не можете выиграть на логике. У тебя есть мозг, и ты должен обдумать это.

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

JQA
источник
Настолько верно, что «чем страннее проблема, тем страннее решение»
Адель
-1

Поищи в Гугле. Stackoverflow это. Разместите его на форумах. В основном, если вы не можете решить это самостоятельно, попросите людей помочь.

Pacerier
источник
-1
  1. Запишите проблему.
  2. Серьезно подумай.
  3. Реализуйте решение.
Инго
источник
Лаконично, очень хорошо!
Адель
1
Вообще-то, нет. Думать слишком усердно на одном и том же треке - это самое худшее, что вы можете сделать. «Задача, систематически пересматривать, пересматривать и проверять каждое из ваших предположений» - вот решение; люди обсуждают разные тактики достижения этого.
smci