Фреймворк для поиска сложных ошибок и становления умнее, пока вы это делаете

Это похоже на вас (или кого-то из ваших знакомых), когда вы пытаетесь исправить ошибку?

Догадайтесь, что можно исправить, измените код…

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

Прочтите другую статью о stackoverflow…

Сделайте еще одно случайное предположение…

Вы когда-нибудь говорили другому инженеру, своему боссу или заказчику: «Он не работает без причины!»?

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

Если что-то из вышеперечисленного похоже на вас, пора усилить когнитивные процессы, связанные с отладкой.

Я считаю отладку процессом сравнения байесовских моделей. Что я имею в виду под моделью? Я имею в виду некоторое описание причины возникновения ошибки и того, что можно сделать, чтобы ее исправить. У меня ошибка. Я разрабатываю N моделей или гипотез о том, почему возникает эта ошибка, на основе моего текущего ограниченного [1] понимания системы . Я назначаю каждой модели вероятность того, что она верна, а затем ранжируйте мои модели по вероятности. Затем я приступаю к выполнению мини-экспериментов, чтобы получить информацию о системе, чтобы проверить или отклонить мои гипотезы и повторно ранжировать свои модели, пока не обнаружу и не исправлю ошибку. Например:

Хм, мне интересно, действительно ли get_transactions () возвращает только действительные транзакции, а не все транзакции. Или, может быть, сериализатор впоследствии отфильтровывает недопустимую транзакцию.

Что, если я запустил get_transactions () для пользователя, у которого, как я знаю, есть недействительные транзакции, а затем вызову is_valid для каждой из них? Бьюсь об заклад, все они действительны.

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

О, это забавно, я предсказал, что num_blergs будет 15, а это 35! Интересно, что там происходит ...

Всякий раз, когда вы сталкиваетесь с неожиданным результатом; радуйтесь - вы нашли один из пробелов в своих знаниях. Думайте о своих знаниях как о карте мира, и от точности вашей карты зависит ваша способность эффективно ориентироваться в мире.

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

Контроль над реальностью - это забавный способ сказать «способность эффективно взаимодействовать с внешним миром для достижения желаемых результатов», или в нашем случае… ваша способность исправить эту чертову ошибку.

Когда я провожу эти небольшие эксперименты, я пытаюсь улучшить свою карту, то есть улучшить свою мысленную модель системы. Помимо исправления этой ошибки, это дает огромные преимущества! Это поможет вам исправить другие ошибки в будущем (с более точной мысленной моделью вы с большей вероятностью прочитаете отчет об ошибке и скажете: «Ага! Я точно знаю, где и почему это происходит!») И вы будете лучше подготовлены к проектируйте вещи так, чтобы они не сломались в будущем.

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

При описании поведения системы вы можете столкнуться с областями, в которых ваши знания неполны. Особенно, если вы застряли, и у вас заканчиваются гипотезы или заканчиваются идеи для экспериментов для проверки ваших гипотез, попробуйте использовать технику Фейнмана. Техника Фейнмана - это когда вы записываете все, что знаете о предмете, в максимально ясных терминах, и когда вы замечаете, что ваше описание кажется немного расплывчатым, или вы пытаетесь ясно и точно описать, как работает система… снова радуйтесь! Вы нашли пустое место на карте. Это возможность расширить свои знания о системе. Продолжайте описывать систему и отмечать пустые места на карте, затем выберите те, которые, по всей вероятности, могут раскрыть что-то информативное об ошибке, с которой вы имеете дело [2].

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

[Эта статья изначально распространяется внутри компании LeadGenius]

Более полезное чтение:

Техника Фейнмана: https://curiosity.com/topics/learn-anything-in-four-steps-with-the-feynman-technique-curiosity/

Https://mattyford.com/blog/2014/1/23/the-feynman-technique-model

Закон дырявых абстракций

Https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/

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

Http://lesswrong.com/lw/i3/making_beliefs_pay_rent_in_anticipated_experiences/

Http://lesswrong.com/lw/ip/fake_explanations/

Http://lesswrong.com/lw/is/fake_causality/

и все эти эссе https://wiki.lesswrong.com/wiki/Map_and_Territory

Сноски

[1] Ваше понимание всегда ограничено, потому что мы строим абстракции поверх абстракций. Вы не можете вместить в голову все махинации и колебания, которые происходят, когда в Python вы делаете request.get (url)!

[2] Если вы не уверены, какой маршрут будет наиболее информативным, спросите кого-нибудь из более опытных в вашей команде, где они могут искать решение ошибки X, и сверьте его ответ с вашим списком пустых мест… или просто выберите одно из них. В худшем случае вы чему-нибудь научитесь!