Вы знаете их, те ошибки, которые не имеют смысла. Там, где кажется, что гремлин просто запрыгнул в ваши фишки и что-то напутал. Вы гуляете, пишете вещи, звоните дяде?
Вы знаете их, те ошибки, которые не имеют смысла. Там, где кажется, что гремлин просто запрыгнул в ваши фишки и что-то напутал. Вы гуляете, пишете вещи, звоните дяде?
Ответы:
Для этих действительно ужасных проблем моя стратегия обычно выглядит следующим образом.
Эксперимент и Google. Продолжайте пытаться решить проблему. В большинстве случаев это решает проблему за час или меньше.
Так что это не сработало. Сделать перерыв Выпей кофе, поговори о чем-то не связанном с коллегой. Выбросьте проблему из головы. Когда вы смотрите на проблему 5 или 10 минут спустя, вы смотрите на нее с несколько иной точки зрения. Большую часть времени это работает.
В этом случае это не так. Поэтому потратьте еще 10 - 30 минут на это. Тогда позвони коллеге. Но прежде чем сделать, сделайте несколько заметок; Вы хотите продемонстрировать проблему, воспроизвести ее, затем перечислить вещи, которые вы пробовали, и, самое главное, доказать, что вы их пробовали. Так что сначала пробуйся. Установите в коде несколько закладок, закройте лишние открытые документы и т. Д. Таким образом, вы можете либо решить проблему самостоятельно, либо когда продемонстрируете проблему, вы не будете тратить свое время.
Попросите своего коллегу заставить вас доказать все свои предположения. этот сеттер действительно вызывается? Этот метод действительно возвращает то, что вы утверждаете? Вы думаете, что объект не нулевой - покажите им, что он не нулевой.
В большинстве случаев, если вы продемонстрируете проблему, вы поймете, что вы не использовали все возможности, или ваш коллега увидит вашу ошибку.
Если это не работает, пришло время стать серьезным. Документируйте точно, что вы пытаетесь сделать, что вы пытались и почему это не сработало. Отправьте это по электронной почте всем своим коллегам. Разместите это на ТАК. На данный момент документ должен быть идеальным вопросом SO.
Пока вы ждете ответов, Google Google Google. Попробуйте каждую перестановку вопроса, который у вас есть. Откройте кучу вкладок. Вы, вероятно, не получите ответ к этому моменту, но вы ищете идеи, возможности, различные способы решения проблемы.
Сделайте что-нибудь еще, если вы потратили 5 часов на проблему, самое время оставить ее на другой день. Может быть, вы получите полезный ответ. Возможно, когда вы атакуете проблему на следующий день, это будет очевидно.
Если ничего из этого не работает, пришло время искать другое решение. Может быть, вы можете использовать другой метод, другую технологию. Возможно, вам стоит подумать об отказе от этой функции. Вы выставляете счет клиенту по часам? Вы работаете на компанию по внутреннему приложению? Вам нужно передать это владельцу и сказать ему: «Послушайте, я потратил на это х часов и не добился прогресса, стоит ли экономическая выгода?». Вы не хотите идти к своему боссу и говорить им, что вы потратили 16 часов на проблему только для того, чтобы они обернулись и сказали, что это не важно, пропустите это для этого выпуска. Вы должны выяснить это раньше.
А если это не сработает? Что ж, ваши единственные варианты - продолжать заниматься проблемой или искать отраслевой опыт. Спросите технологических экспертов в твиттере. Напишите вашему поставщику технологий.
Уволиться. Нет, не твоя работа! Просто встань и иди домой. Вы сделали для дня или выходных. 19 раз из 20, когда вы вернетесь к следующей проблеме, решение появится в течение часа.
До того, как пройдут десять часов, я получу некоторую помощь.
Одним словом, timebox
выделите ограниченное количество времени для работы над чем-то, и если это не решено, перейдите к чему-то другому и вернитесь к этому на следующий день со свежим взглядом.
Этот и другой набор глаз всегда стоят больше, чем любое время, которое вы можете потратить, уставившись на что-то.
Я бы никогда не потратил больше 45 минут на час, пытаясь решить что-то за один присест, это нарушает закон убывающей отдачи.
Объясните проблему кому-то еще.
Объясняя проблему кому-то еще, вы должны прояснить ее: это часто позволяет увидеть решение.
(Один из профессиональных компьютерных журналов Великобритании однажды предложил продавать картонные вырезы старшего программиста в натуральную величину специально для этой цели.)
Я считаю, что спать по проблеме (иногда в течение нескольких дней) также может помочь.
У меня есть план три шага:
Каждый этап является эскалацией, если предыдущий шаг не удался. Почти всегда есть что-то еще, над чем я могу работать на втором этапе.
Я обычно делаю одно из трех:
Любой из трех хорошо отвлекает себя от сложившейся ситуации. Я считаю, что отвлекающие факторы позволяют моему подсознанию некоторое время что-то пережевывать. Примерно через час, Бэм, есть решение :-).
Постройте тестовый жгут, чтобы нацелиться именно на этот дефект и изолировать его
Просто продолжайте устранять хороший код .. пока копируете дефект. Пока вы не нацелились на точный фрагмент кода, содержащий ошибку. Затем проследите код.
Рекомендуемое чтение: прагматичный программист, в частности, глава 10: пули Tracer
Все эти предложения великолепны. Тем не менее, я часто использую технику, о которой я не упоминал. Составьте списки, чтобы организовать ваши мысли о проблеме. Если у меня возникает проблема с проблемами, я обычно выписываю несколько списков, таких как: факты, предположения, вопросы, симптомы и т. Д. Я нахожу, что часто в процессе организации вещей таким образом я обнаруживаю предположения, которые я не осознавал ( это часто оказывается неправильным), вопросы, которые я не осознавал, нужно задавать, другие варианты, которые я могу проверить, и т. д.
Редактировать:
Краткий ответ:
В: Как вы решаете действительно странные ошибки, которые ставят вас в тупик более 10 часов?
A: Убедитесь, что они никогда не произойдут: поймите ваш дизайн, узнайте ваш код, научитесь использовать ваш отладчик.
Объяснение:
«Там, где кажется, что гремлин просто запрыгнул в ваши фишки и что-то напутал»
Этого никогда не должно случиться. Если это ваш код, вы должны очень хорошо понять, что является причиной ошибки, прежде чем пытаться ее исправить.
Более того, когда вы пишете свой код, вы уже должны знать, где и почему он может потерпеть неудачу.
Сказав это, - попросив сверстника, разместив на SO, повторив и откатив свои шаги и сделав перерыв - все предложения, упомянутые выше, помогут.
Другое дело, что вы должны знать свои инструменты - свой набор инструментов для отладки. Регистрация сообщений в подозрительных точках в вашем коде, тщательная проверка стека вызовов, использование условных точек останова, отслеживание и т. Д. И т. Д. Навыки отладки не являются дополнительными - они являются частью программирования.
У меня была похожая проблема - явное повреждение памяти в Objective-C, с которым я боролся в течение многих часов. Но затем я и мои коллеги просто прогулялись на обед, и я объяснил проблему (и один конкретный момент, связанный с десериализацией объекта в его методе init), и в основном объяснил всю проблему самому себе.
(подробности: в основном, я инициализировал и возвращал объект на что-то другое, кроме self, так что было два выделения, но возвращался только один объект. Память сдвинулась и сошла с ума, вылетает, и отладчик действительно не знал, что делать с это тоже).
Принимать ванну.
Есть ли фанаты Родни Маккея ?
Серьезно, однако, если среди всех этих ответов есть одна общность, это сделать перерыв и сделать что-то еще .
Мне нравится думать об этом как о передаче проблемы вашему подсознанию. Даже если мы иначе не осознаем, наш разум (кажется) продолжает работать над проблемой, даже когда мы делаем что-то еще, например, принимаем ванну .
Сочетание всего этого:
Отойди от этого на некоторое время, чтобы он мог сесть на задний план. Спи, отдыхай, ешь, гуляй, что угодно.
Изучите проблему больше, что еще она делает не так, какие еще симптомы вы можете найти?
Исследуйте проблему, посмотрите, что вы можете найти. Не забудьте попробовать разные ключевые слова
Попробуйте что-то другое . Работа вокруг. Другая техника отладки. Валидатор. Другой компьютер.
Поговори с кем-нибудь . Даже если они не могут помочь, или даже не программист, иногда разговоры вызовут идею лампочки
Перезапуск! Если уместно, попробуйте перезагрузить компьютер, сервер и т. Д. Если ничего другого, вы можете использовать время, чтобы подумать.
Спросите StackOverflow! мы здесь, чтобы помочь
Мне действительно не понравился ответ с наибольшим количеством голосов, потому что, хотя это иногда срабатывает, иногда вам просто нужно выяснить это в тот же день, поэтому я бы порекомендовал в следующем порядке:
Подтвердите, что это происходит не только с вами. Это может сэкономить вам много времени. Возможно, вы удалили обязательный компонент или внесли изменения в вашу среду, и где-то в вашем коде проглочено исключение. Если бы это случилось только с вами, я бы использовал инструмент сравнения окружения. Недавно я читал о программном обеспечении под названием Envy, которое позволяет вам делать это, хотя оно и не бесплатное, оно стоит 10 долларов США.
Бывает со всеми? Хорошо, теперь сделайте View History в коде и проверьте последние изменения, которые могли вызвать ошибку, прямо или косвенно.
Там нет каких-либо недавних изменений? Если это очень специфическая ошибка (исключение), «stackoverflow it». Теперь это звучит не лучше, чем «Google это», но я рад сказать, что я сначала ищу стекопоток для исследования программирования, чем Google. Если это действительно известная проблема, вполне вероятно, что вы найдете решение здесь. Если нет, то разместите вопрос на соответствующем сайте stackexchange. Вы можете получить очень быстрый ответ, или даже если вы этого не сделаете, ваш вопрос будет там, пока вы будете проводить дополнительные исследования. Это преимущество.
Если вы не нашли ответ в Интернете или это не общая ошибка, пошагово пройдитесь по коду, проверяя, имеют ли полученные результаты каждого шага смысл для ожидаемого результата. Начните, чтобы закончить на каждом методе, и снизу вверх на многоуровневом решении. (то есть, если вы устраняете неполадки с производительностью, начните с кода, который извлекает записи. Не имеет смысла запускать в пользовательском интерфейсе, если вы можете быстро определить, является ли первый шаг проблемой).
Если, пройдя код несколько раз, вы все равно не нашли, что не так, позвоните кому-нибудь, чтобы поговорить об этом. Как кто-то уже упоминал, говорить об этом вслух может лампочка. Плюс парное программирование действительно полезно.
В этот момент, если это возможно, уйдите на какое-то время или на день. Вчера я прочитал очень правдивый твит, в котором говорилось: «Я лег спать, думая« как, черт возьми », и проснулся, думая« но, конечно » Это точно.
Если у вас все еще нет ответа, я бы осмелился сказать, что вы можете попробовать рефакторинг на более мелкие задачи / методы / функции. Генри Форд сказал что-то вроде: «Нет такой сложной задачи, которую нельзя решить, разбив ее на более мелкие задачи». На этом этапе, если решение слишком сложное и вы не разобрались ни с самим собой, ни с помощью кого-либо еще, реорганизуйте код в более мелкие задачи. Даже если вы не закончите это, это поможет вам найти причину.
Добавьте инструментарий к своему коду.
Чирикать об этом ??
Вы должны сделать шаг назад. Мой девиз: «Если проблема слишком сложная, значит, вы решаете не ту проблему». Каковы ваши предположения? не доверяй ничему
Следствием этого является «чем страннее проблема, тем страннее решение». Сила компьютера заключается в его логике, поэтому вы не можете выиграть на логике. У тебя есть мозг, и ты должен обдумать это.
В наше время в системе взаимодействует множество других вещей - брандмауэры, антивирусные программы, антишпионское ПО, автоматические обновления, которые происходят каждую ночь, - вам приходится иметь дело с движущимися целями.