Ошибка в коде или в кодере?
Для разработчиков одним из основных последствий неудовлетворенности на работе является застревание на проблеме, а теперь представьте себе это с дедлайном. Обычно мы стремимся быстро все исправить, даже если не знаем точно, как это работает.
Непонимание проблемы, того, как ее реализовать, и поиск самого достойного решения, а не самого простого или самого сложного, — вот основные проблемы, с которыми мы сталкиваемся при поиске и устранении ошибок.
Эффективная отладка заключается в следовании процессу, в ходе которого мы постоянно убеждаемся, что находимся на правильном пути к исправлению ошибки, начиная с кода без предупреждений, спокойно воспроизводимой ошибки, внимательно читая сообщение об ошибке и понимая это, используя точки останова, тестируя код, и если нет способа, мы можем решить это самостоятельно, обратившись за помощью к нужному человеку.
Что такое отладка?
В компьютерном программировании и разработке программного обеспечения отладка — это процесс поиска и устранения ошибок (дефектов или проблем, препятствующих правильной работе) в компьютерных программах, программном обеспечении или системах.
Термины баг и отладка в народе приписываются адмиралу Грейс Хоппер в 1940-х годах. Пока она работала над компьютером Mark II в Гарвардском университете, ее коллеги обнаружили мотылька, застрявшего в реле и тем самым мешающего работе, после чего она заметила, что они отлаживают систему.
В настоящее время у нас все еще есть ошибки в системе, хотя и не летающие.
Помните, что никто не пишет идеальное программное обеспечение, поэтому отладка займет большую часть вашего дня. Давайте рассмотрим некоторые проблемы, связанные с отладкой, и некоторые общие стратегии поиска неуловимых ошибок и их исправления.
Типы ошибок и как их избежать?
Логические ошибки
Логическая ошибка — это ошибка в исходном коде программы, которая приводит к непредвиденному и ошибочному поведению. Логическая ошибка классифицируется как тип ошибки времени выполнения, которая может привести к неправильному выводу программы. Это также может привести к сбою программы во время работы.
Пример:
В чем ошибка?
Как мы видим, функция должна вернуть сумму чисел в массиве, но цикл for не считает первый элемент, поэтому оператор печати будет false.
Как избежать этой ошибки?
Инициализация цикла for в i=0
Синтаксические ошибки
Синтаксическая ошибка возникает, когда во время компиляции компилятор находит что-то в вашем коде, но не знает, что это значит, или не знает, как перевести то, что вы написали. Компилятор всегда сообщит вам о синтаксических ошибках, даже если иногда он может ошибаться в строке (или строках), где произошла ошибка.
Пример:
В чем ошибка?
В строке 11:40 мы пытаемся сравнить, равен ли результат sumNumbersInArray 10, но в JavaScript не существует оператора === =.
Как избежать этой ошибки?
Удаление оператора равенства (===).
Ошибки компиляции
Компиляция — это процесс преобразования языка программирования высокого уровня в язык более низкого уровня, который может быть лучше понят компьютером. Ошибки компиляции возникают, когда компилятор не может правильно преобразовать высокоуровневый код в низкоуровневый. Это предотвращает запуск или тестирование программного обеспечения.
Как их избежать?
Хорошо понимать язык. Один из самых важных способов избежать ошибок при компиляции на любом языке — это хорошо понимать язык.
Ошибки выполнения
Эти ошибки возникают, когда код «не работает» на другом компьютере, даже если он отлично работал на собственном компьютере разработчика. Эти ошибки особенно неприятны, потому что они напрямую влияют на конечного пользователя и делают приложение ненадежным или даже полностью сломанным.
Как их избежать?
- Избегайте использования переменных, которые не были инициализированы. Для них может быть установлено значение 0 в вашей системе, но не на платформе кодирования.
- Проверяйте каждое вхождение элемента массива и убедитесь, что он не выходит за границы.
- Избегайте объявления слишком большого объема памяти. Проверьте лимит памяти, указанный в вопросе.
- Избегайте объявления слишком большого объема памяти стека. Большие массивы следует объявлять глобально вне функции.
- Используйте return в качестве конечного оператора.
- Избегайте ссылок на свободную память или нулевые указатели.
Арифметические ошибки
Эти ошибки такие же, как логические ошибки, но с математикой. Например, уравнение деления может потребовать от компьютера деления на ноль. Поскольку это математически невозможно, это приводит к ошибке, которая препятствует правильной работе программного обеспечения.
Как их избежать?
Лучший способ избежать вычислительных ошибок — избегать вычислений. Разработайте общие алгоритмы для любого количества, которое вы ищете, а затем переходите к «подключи и пыхти» в качестве последнего шага. Однако математика требует точности, и вы часто не можете избежать утомительного прочесывания своей работы.
Ошибки ресурсов
Иногда программа может заставить компьютер, на котором она работает, попытаться выделить больше ресурсов (мощность процессора, оперативная память, дисковое пространство и т. д.), чем у него есть. Это приводит к ошибкам в программе или даже к сбою всей системы.
Как их избежать?
Оптимизация является ключом к предотвращению такого рода ошибок.
Ошибки интерфейса
Эти ошибки обычно возникают, когда входные данные, которые получает программное обеспечение, не соответствуют принятым стандартам. При неправильной обработке эти ошибки могут выглядеть как ошибки на вашей стороне, даже если они на стороне вызывающей стороны, и наоборот.
Пример:
В чем ошибка?
В строке 3 мы определяем возраст в пользовательском интерфейсе как строковый тип, а в строке 11 мы передаем функции printUser возраст в виде числа.
Как мы можем избежать ошибок такого типа?
В соответствии с контрактом с интерфейсом в этом случае возраст передается как (строка) «22».
Инструменты отладки
Выписки для печати
Отладка операторов печати — это процесс, в котором разработчик использует в своем приложении операторы «printf» для создания вывода во время выполнения программы.
Использование операторов печати — это хороший способ проследить код и устранить потенциальные проблемы. Кроме того, операторы печати можно использовать для регистрации и диагностики.
Разработчики часто используют отладку печати, чтобы получить представление о том, что происходит в процессах, которые они выполняют. Они будут выводить при вызове определенных функций, значения аргументов функций, значения переменных, используемых в алгоритмах, и при обмене сообщениями с другими процессами. Но при масштабировании и в сложных системах с параллельными процессами отладка печати быстро становится неудобной для использования в качестве единственного метода отладки.
Плюсы:
- Легко добавить
- Легко увидеть, что происходит в программе во время ее работы.
- Уровни вывода на печать можно контролировать.
Минусы:
- Создает дополнительную точку обслуживания в коде.
- Трудно понять, что происходит, когда генерируется слишком много вывода.
- Трудно определить последовательность процессов.
Контрольные точки
Точки останова — один из самых важных методов отладки в наборе инструментов вашего разработчика. Вы устанавливаете точки останова везде, где хотите приостановить выполнение отладчика. Например, вы можете захотеть увидеть состояние переменных кода или просмотреть стек вызовов в определенной точке останова.
Использование отладчика — лучший способ найти самые сложные ошибки, но это также и самый продвинутый метод, и он не нужен, когда работают другие методы.
Есть еще несколько приемов, которые нужно знать при отладке: условные точки останова, счетчики обращений и многое другое! Эти расширенные типы точек останова помогают сократить время, необходимое для отладки определенного состояния приложения или логического потока, позволяя нам быть более продуктивными при отладке.
Условные точки останова. Предположим, что в кодовой базе нашего приложения нас интересует только приостановка выполнения в точке останова, когда выполняется определенное условие. Например, мы можем захотеть приостановить выполнение только в точке останова в цикле, когда мы работаем с определенным значением для отладки одного конкретного случая на основе этого значения.
Счетчики обращений. При работе с циклами или при повторении набора элементов, поступающих из базы данных, может быть полезно приостановить выполнение программы только первые пару раз или только после того, как мы выполнили итерацию. более 1000 позиций.
Плюсы:
- Отладка — это швейцарский армейский нож разработчика. Точки останова — отличные инструменты для запроса внутреннего состояния или вызова API в заданной точке кода. При динамической оценке кода можно легко вызвать метод или функцию с соответствующими входными данными для изучения их результатов.
- Вы можете проверить все состояние программы, а не только значения, которые вы хотели распечатать заранее. Это может значительно ускорить процесс отладки, сократив цикл обратной связи до менее секунды. Особенно важно, когда требуется некоторое время, чтобы добраться до жука.
- Вы можете увидеть, откуда пришли вызовы, и даже проверить значения в трассировке стека.
Минусы:
- Лучше всего использовать точки останова только в локальных сеансах отладки.
- Требуется ручное вмешательство, чтобы опросить отлаживаемую систему, чтобы получить соответствующие данные каждый раз, когда программа останавливается в точке останова. Из-за этих двух событий очень трудно уловить спорадические события, происходящие в течение длительного времени.
- Если вы сегодня что-то отлаживаете, то завтра уже не можете полагаться на эти знания, так как система может вести себя совсем по-другому.
Роберт К. Мартин разделяет схожие взгляды на отладчики. Следующая цитата из его поста Отладчики — это расточительная трата времени от 2003 года:
Я считаю отладчики наркотиком — зависимостью. Программисты могут приобрести ужасную привычку полагаться на отладчик, а не на свой мозг. ИМХО отладчик - это крайняя мера. После того, как вы исчерпали все другие способы диагностики и тщательно продумали, просто ли переписать проблемный код,товам может понадобиться отладчик.
Принципы отладки
Решайте проблему, не обвиняйте
Дело не в ваших коллегах, дело не в вас, это проблема, и вы должны ее решить. Брать на себя ответственность, когда что-то идет не так, крайне важно для построения доверительных отношений с другими и обучения на своих ошибках.
В следующий раз, когда вы обратитесь к людям непосредственно над вами, вместо того, чтобы спрашивать, все ли уже исправили эти ленивые люди наверху, вы должны спросить: «Что мы можем сделать, чтобы исправить это сегодня?
Не паникуйте
Начинающему программисту или специалисту по эксплуатации (или devops) может быть сложно иметь дело с журналами, сообщениями, метриками и другой возможной релевантной информацией, которая поступает к вам в такой момент.
Сделайте паузу, вздохните, обдумайте, выберите, сделайте.
Даже когда вы в панике, старайтесь придерживаться научного подхода к отладке. Проверьте свои предположения, сформулируйте гипотезу о причинах проблемы и проверьте эту гипотезу. Но это не научная статья, здесь должна быть строгость, но и скорость; использовать «теорию достаточно близких», быстро формулировать гипотезы и проверять их.
Наблюдайте (1) за тем, что произошло, (2) за тем, что происходит и (3) за тем, что должно произойти. Ориентируйте себя на проблему, применяя свои знания о системе к наблюдениям, Решите причину и Действуйте над ней. Затем снова наблюдайте, чтобы убедиться, что вы были правы. Это общий подход, известный как петля НОРД (наблюдай, ориентируйся, решай, действуй), и первоначально он был описан полковником американских ВВС. Но в армии это не задержалось, такой подход используется в судебных разбирательствах, правоохранительных органах, бизнесе. Я думаю, что это также работает как общая стратегия для отладки. Главное, не делайте поспешных выводов.
Не тратьте время на глупую ошибку
Мир продолжает вращаться
Это будет не первая ваша ошибка и не последняя, не принимайте близко к сердцу.
Делайте перерывы, сидение +8 часов не делает вас более продуктивным, частые перерывы дают разуму и телу время для перезарядки.
Перерывы в работе действительно повышают производительность, даже если машины и компьютеры простаивают в течение нескольких минут. Короткое время отсутствия дает сотрудникам возможность размять уставшие мышцы, найти облегчение в постоянных положениях и позах и сохранить любую информацию, которую они могли узнать за последний час или около того.
Работать больше часов также плохая идея, наиболее распространенная ситуация – переутомление, и есть больше побочных эффектов, таких как: может заставить вас больше пить, снижает вашу продуктивность, очень трудно успокоиться ваш ум перед сном, ваш стресс будет увеличиваться и т. д.
Берите на себя ответственность, но не будьте глупыми.
Стратегии отладки
Начальная точка
Мы должны начать в чистой среде, без изменений, ошибок и предупреждений, не связанных с проблемой, которую мы пытаемся решить.
Когда вы пытаетесь решить проблему, вам необходимо собрать все соответствующие данные.
Как только вы думаете, что знаете, что происходит, пришло время выяснить, что, по мнению программного обеспечения, происходит.
Сделайте это воспроизводимым
Расслабьтесь, это не значит, что наши ошибки действительно множатся. Мы говорим о разном типе воспроизводства.
Лучший способ начать исправлять ошибку — сделать ее воспроизводимой. В конце концов, если вы не можете воспроизвести его, как вы узнаете, что он когда-либо исправлен?
Прочтите и поймите сообщение об ошибке
ПРОЧИТАЙТЕ СООБЩЕНИЕ ОБ ОШИБКЕ
Что это говорит, что это значит, на какой линии это происходит? Эта линия действительно существует (вы шутите?).
А если это не авария? А если это просто плохой результат?
Войдите туда с отладчиком и используйте свой неудачный тест, чтобы вызвать проблему.
Прежде всего, убедитесь, что вы также видите неправильное значение в отладчике.
Поговорите с резиновой уткой
Очень простой, но особенно полезный прием для поиска причины проблемы — просто объяснить ее кому-то другому или просто представить, что вы объясняете проблему кому-то другому.
Простое объяснение, шаг за шагом, что должен делать код, часто приводит к тому, что проблема выпрыгивает за пределы экрана и объявляет о себе.
Разделяй и властвуй
Разделяй и властвуй — это тип дизайна алгоритма. Он работает, рекурсивно разбивая проблему на две (или более) меньшие проблемы аналогичного характера.
Прямое использование принципа «разделяй и властвуй» в отладке состоит в том, чтобы разделить кодовую базу пополам и добавить туда журнал. Если журнал работает и печатает правильные данные, мы можем считать, что до этого момента все работает нормально; если нет, то ошибка в первой половине кода.
Если ваша команда внесла ошибку во время набора выпусков, вы можете использовать тот же метод. Создайте тест, который приведет к сбою текущей версии. Затем выберите промежуточный выпуск между настоящим моментом и последней известной рабочей версией. Запустите тест еще раз и решите, насколько сузить поиск.
Тест для кода
Простая концепция TDD (разработка через тестирование) заключается в написании тестов для проверки кода. Это помогает избежать дублирования кода, поскольку мы пишем небольшой объем кода за раз, чтобы пройти тесты.
В TDD есть три основных шага:
- [RED], это означает, что сначала мы реализуем модульные тесты. Он называется [RED], потому что у нас еще не было реализации кода. Таким образом, модульные тесты поначалу будут терпеть неудачу. Мы должны отметить, что мы должны найти различные условия при создании модульных тестов, чтобы иметь лучшее качество кода. Думайте и создавайте модульные тесты так же, как если бы вы были непослушным пользователем, пытающимся найти ошибки в своей системе ради себя, используя все возможности.
- [ЗЕЛЕНЫЙ], внедрите минимальный код для прохождения тестов. Если код по-прежнему не проходит тесты, напишите больше кода (но все же минимум кода), чтобы пройти тесты. Следуя этому, мы можем убедиться, что наша реализация не имеет повторяющихся кодов.
- [REFACTOR], сделайте это, если еще есть возможности улучшить и усовершенствовать ваш код без провала тестов. Убедитесь, что наша новая, расширенная и улучшенная реализация не изменяет исходное поведение нашей старой реализации.
погугли это
Google/duckduckgo или любая другая поисковая система, которую вы используете, — ваш лучший друг.
Как сделать хороший поиск?
- Используйте ключевое слово related:, чтобы найти похожие веб-сайты.
- Используйте ключевое слово search: для поиска на веб-сайте.
- Используйте ключевое слово … для поиска в пределах временных рамок.
- Используйте ключевое слово *, чтобы заменить пропущенные слова.
- Если вы ищете определение слова, используйте ключевое слово define:, чтобы найти определение.
- Используйте сайт: для поиска определенного веб-сайта или контента.
Такие места, как StackOverflow и официальная документация по технологии, которую вы используете, в большинстве случаев полезны.
НЕ застревайте, спрашивайте!
Я не думаю, что существует определенное минимальное или максимальное время, в течение которого можно обратиться за помощью, но убедитесь, что вы выполнили домашнее задание, прежде чем просить о помощи. Нехорошо спрашивать своих коллег, если вы даже не пробовали.
Когда вы не можете что-то исправить, вы должны обратиться за помощью, не тратьте свое время, пытаясь решить то, что выходит за рамки вашего опыта.
Ваши коллеги также являются вашими лучшими друзьями (по крайней мере, на работе).
Как попросить о помощи на работе?
- Делай свою домашнюю работу.
Первый шаг к тому, чтобы обратиться за помощью, — это не просто спросить, а подтвердить, стоит ли задавать ваш вопрос. Это значит делать домашнее задание.
- Найдите лучшего человека в лучшее время.
Когда у вас есть вопрос, который имеет смысл задать, следующим шагом будет определение наименее разрушительного и, следовательно, наиболее эффективного способа обращения к другим людям. Здесь может быть полезно задать себе три вопроса:
- Кого лучше спросить?
- Когда лучше спросить?
- Где лучше спросить?
- Покажите свою домашнюю работу (и свою благодарность).
Когда дело доходит до вопроса, стиль может быть столь же важен, как и содержание. То, как вы сформулируете свой вопрос, может означать разницу между получением помощи, которая вам нужна (или нет), и созданием хорошей профессиональной репутации (или нет). Чтобы произвести наилучшее впечатление, не просто задайте свой вопрос; поделитесь всей тяжелой работой, которую вы проделали, чтобы помочь себе, прежде чем привлекать других людей.
Примите тот факт, что отладка — это просто решение проблемы, и атакуйте ее как таковую.
Спасибо за чтение и удачной отладки!
👋 Давайте дружить! Подпишитесь на меня в Twitter и свяжитесь со мной в LinkedIn. Не забудьте также подписаться на меня здесь, на Medium.
Рекомендации
- https://en.wikipedia.org/wiki/Отладка
- https://www.r-bloggers.com/2022/04/dont-panic-a-scientific-approach-to-debugging-production-failure/
- https://www.work-fit.com/blog/how-efficient-breaks-at-work-increase-productivity
- https://www.healthline.com/health/working-too-much-health-effects#5.-Your-hearts-working-overtime,-too-
- https://hbr.org/2021/04/how-to-ask-for-help-at-work