Ответ 1
Я нашел, что стратегия Rubber Duck Debugging тоже работает.
Скажем, у вас есть ошибка, которая была обнаружена при функциональном тестировании довольно сложной части программного обеспечения. Это может быть связано с плохими/неожиданными данными в базе данных, коде среднего уровня или что-то в интерфейсе.
Fine. Мы все были там.
У вас есть модульные тесты для написания и запуска, отладки/протоколирования операторов для вставки, операторов sql для записи и запуска, вещей, которые вы хотите проверить с помощью FireBug и т.д.
Скажем, на первом этапе появляется список потенциальных причин, которые вы хотите исследовать.
Теперь вам нужно решить, какой порядок делать.
Вы:
У меня такое чувство, что первая стратегия чаще всего используется. Возможно, только потому, что я не работаю со многими младшими разработчиками, а более старшие разработчики склонны иметь приличную интуицию. Или, может быть, мы просто думаем, что у нас есть достойная интуиция, но на самом деле нужно использовать более систематический подход.
Любые мысли?
Я нашел, что стратегия Rubber Duck Debugging тоже работает.
По моему опыту, возможно, лучше всего пойти с чувством кишки (1) в течение 30 минут или около того.
Если ничего не выходит из этого, поговорите с кем-то еще об этом.
Удивительно, как можно разговаривать с кем-то другим (даже если они не являются техническими).
Промойте, налейте, повторите, пока не будет найдена первоначальная причина проблемы. Трудный и механический, но вы попадете туда.
Кроме того, иногда тесты на итерации этапа 3 не терпят неудачу; чаще всего потому, что некоторая не зависящая от системы память повреждает то, что приводит к недействительному состоянию, или потому что проблема связана с потоками/синхронизацией/неинициализацией данных, и введение тестов изменяет тайминги и/или структуру данных, чтобы изменить или скрыть симптомы. На данный момент для этого плаката, по крайней мере, процесс становится более интуитивным, чередуя между заменой тестов на здравомыслие с менее навязчивыми формами и выборочным отключением модулей, чтобы исключить источники коррупции.
Я бы сказал, что это не имеет значения, если оно документально и методично. Это странный маленький трюизм в программировании, который иногда делает вещи в случайном порядке, более эффективен, чем тратить много времени на то, чтобы выяснить "лучший" способ.
Никогда не недооценивайте чувства кишечника; этот опыт дает вам голову. Я почти всегда начинаю с того, что вы, вероятно, считаете моим чувством "кишки". Я смотрю на ошибку и проверяю шаги, которые, как я думаю, могут вызвать такую проблему.
Мой первый шаг в такой ситуации, как правило, заключается в том, чтобы проверять вещи в порядке, который наиболее быстро уменьшит количество вещей, оставшихся для проверки. Вы могли бы почти думать об этом, как делать двоичный поиск ошибки: "Ну, параметры POST выглядят правильно, поэтому я могу исключить все до отправки формы" и т.д.
Тем не менее, если у меня есть сильное чувство, что проблема может быть в определенном месте, я сначала проверю.
Я имею тенденцию идти с чувством кишки, и подход с разделением и победой; изолируя куски кода уменьшающегося размера, где я думаю, что "ошибка".
Это не работает, если вы не знаете или не понимаете кодовую базу - если это так, найдите того, кто это делает, и поймите с его чувством кишки.
Сначала я пытаюсь понять ошибку, затем я делаю все, что вы предлагаете, в порядке, основанном на чувстве кишки. Это действительно компромисс между тем, насколько вы уверены в конкретной причине и насколько легко это проверить.
Кроме того, когда я исследую причину, я пытаюсь напрямую добавить действительно быстрые проверки, поскольку я все равно проверяю код (добавьте временные отладочные операторы вывода, добавьте утверждения и т.д.)
Слушайте, как эксперты отлаживают программное обеспечение на радиотехнике Software Engineering:
Дэйв Томас говорит о программной археологии, которая имеет некоторые действительно отличные советы по отладке.
Андреас Целлер появляется в episode, посвященной отладке.
В общем, я начинаю с подмножества гипотез, которые я рассматриваю наиболее вероятных преступников, а затем сортирую это подмножество гипотез, насколько легко каждый должен опровергнуть и начинать с самого легкого.
Независимо от порядка, важно то, что вы делаете с вашей гипотезой. Начните пытаться опровергнуть каждую гипотезу, а не проверять ее, и вы охватите больше земли (см. Психология аналитического анализа Ричардс Дж. Хейер, младший, бесплатный PDF).
Я с @moonshadow, но я добавлю, что в какой-то степени это зависит от того, что происходит. То есть, некоторые виды сбоев имеют довольно известные причины, и я бы начал с известной причины
Например, в системах Windows ошибки "Нарушения доступа" почти всегда связаны с попыткой использовать или просматривать (доступ) нераспределенную память. Чтобы найти источник такой ошибки, рекомендуется рассмотреть все места, где память (или нет) выделена.
Если известно, что "проблема" связана с плохими данными, тогда исправление может потребовать изменений в проверке или получении данных даже после того, как ошибка будет отслежена до анализа.
Еще один момент, когда мы с помощью ошибки часто стараемся попытаться создать небольшую программу для ее создания.
Мой заказ:
Вот несколько полезных советов:
Я обычно делаю это:
1) Добавить новый функциональный тестовый пример в автоматическую систему тестирования регрессии. Обычно я запускаю программный проект с собственной регрессионной тестовой системой с
Эта цель для всего этого заключается в том, чтобы убедиться, что, как только обнаружена какая-либо ошибка, она больше не должна появляться в коде проверки или в производственной системе. Также легче воспроизвести случайные и долгосрочные проблемы.
Не проверяйте какой-либо код, если это не закончится с тестом на автоматическое регрессионное тестирование.
Я обычно пишу соотношение 1:1 между кодом продукта и кодом тестирования. 20k строк эксперта TCL для 20K строк кода С++. (5 лет назад.) Например:
Я не хочу, чтобы команда QA выполняла автоматическое тестирование с моей тестовой системой, так как весь мой код проверки должен пройти тесты. Обычно я выполняю тест на регрессию на 2 недели, прежде чем я отправлю код команде QA.
Команда QA, в которой выполняются ручные тестовые примеры, также гарантирует, что моя программа имеет достаточно встроенной диагностической информации для захвата любых будущих ошибок. Цель состоит в том, чтобы иметь достаточно диагностической информации для решения 95% ошибок в < 2 часа. Я смог сделать это в своем последнем проекте. (Оборудование для видеосети в сетях RBG.)
2) Добавьте диагностическую процедуру (веб-базу в настоящее время), чтобы получить всю внутреннюю информацию. (Текущее состояние, журналы и т.д.). > 50% моего кода (c/С++, специально) являются диагностическим кодом.
3) Добавьте более подробную информацию для проблемной области, которые я не понимаю.
4) Проанализируйте информацию.
5) Попробуйте исправить ошибку.
6) Проведите ночь/в течение регрессионных тестов в выходные дни. Когда я был в R & D, я обычно прошу в аренду 5-10 тестовых систем для проведения непрерывных регрессионных тестов 24x7. Это обычно помогает ID и решает проблему памяти, ресурса и долгосрочной производительности, прежде чем код попадет в SQA.
Как только встроенная система время от времени загружается в приглашение Linux. Я добавил тестовый пример, в котором он снова и снова запускает систему с программируемой розеткой и следит за тем, чтобы она могла "видеть" командную строку и запускать тест на ночь. Мы смогли быстро определить проблему с кодом FPGA и убедиться, что система всегда работает после 5000 циклов питания. Был добавлен тестовый пример и встроен новый код проверки Verilog/FPGA. Этот тест был запущен. Это никогда не было проблемой снова.
Я предлагаю прочитать "Отладка от мышления".
Андреас Целлер также проделал определенную работу по систематическим исследованиям отладки.