Баг — это ошибка в программе, из-за которой она работает неправильно. Найти причину, исправить её и проверить результат — значит провести отладку. В англоязычных уроках ты встретишь слово debugging.
Представь: герой собирает монеты, а очки уменьшаются. Игра запускается, персонаж двигается — но ошибка всё равно есть. Чтобы её найти, нужно сравнить два результата: что должно было произойти и что получилось на самом деле. С этого начинается отладка, которой занимаются и начинающие, и опытные программисты.
Как найти ошибку: шесть шагов
Отладка похожа на работу детектива: ты собираешь подсказки, выдвигаешь предположение и проверяешь его. Вот как это выглядит на примере игры с монетами:
- Определи ожидаемый результат. Например: «За каждую монету счёт увеличивается на одно очко».
- Повтори проблему. Запусти игру и снова собери монету. Запомни действия, после которых возникает ошибка.
- Найди расхождение. Ожидалось, что счёт изменится с 0 до 1, а получилось −1.
- Собери подсказки. Проверь команды, которые меняют счёт: названия переменных, математические знаки и значения. Если появилось сообщение об ошибке, прочитай его.
- Проверь предположение. Допустим, вместо плюса стоит минус. Исправь этот знак. Меняй по одной предполагаемой причине за раз — так легче понять, что помогло.
- Проверь исправление. Собери одну монету, затем ещё несколько. Убедись, что счёт меняется правильно и связанные с ним действия по-прежнему работают.
Если программа сработала один раз, это ещё не подтверждает, что она правильно обрабатывает все случаи. Например, начисление очков стоит проверить и в начале игры, и после нескольких собранных монет.
Какие ошибки бывают
Для начала удобно различать три группы. Разберём их на примерах Python.
| Вид ошибки | Что происходит | Пример |
|---|---|---|
| Синтаксическая | Нарушены правила записи кода. | После условия if пропущено двоеточие. |
| Ошибка во время выполнения | При выполнении команды возникает проблема. | Программа пытается разделить число на ноль. |
| Логическая | Код выполняется, но результат не соответствует задаче. | За монету снимается очко вместо начисления. |
Синтаксическая ошибка: нарушены правила записи
У языка программирования есть свои правила — примерно как грамматика у русского языка. В Python после условия if нужно двоеточие. Здесь его не хватает:
age = 12
if age >= 12
print("Можно играть")
Исправленный вариант:
age = 12
if age >= 12:
print("Можно играть")
Обрати внимание и на отступ перед print(): он показывает, что эта строка относится к условию. Без нужного отступа возникнет IndentationError — разновидность синтаксической ошибки.
Рекомендация по оформлению Python-кода — четыре пробела на каждый уровень отступа. Внутри одного блока отступы должны быть согласованы.
Ошибка во время выполнения: команду не удалось выполнить
Код может быть записан по правилам языка, но столкнуться с проблемой при выполнении:
result = 10 / 0
print(result)
Деление на ноль вызовет ZeroDivisionError. В этом примере выполнение остановится, и до строки print(result) программа не дойдёт.
Другой случай — опечатка pritn вместо print. Сама запись допустима, но если имя pritn нигде не определено, при выполнении возникнет NameError.
Логическая ошибка: программа делает не то, что нужно
Допустим, за монету нужно добавить одно очко. Переменная score хранит счёт, а в коде написано:
score = 0
score = score - 1
print(score)
Получится −1. Для Python вычитание допустимо, поэтому сообщения об ошибке не будет. Но правилам игры результат не соответствует.
Замени вторую строку на score = score + 1 — получишь 1. Чтобы заметить такую ошибку, нужно знать, какой результат ожидается.
Как читать сообщения об ошибках в Python
Если написать:
pritn("Привет!")
Python сообщит:
NameError: name 'pritn' is not defined
Здесь NameError — тип ошибки, pritn — имя, которое не удалось найти, а is not defined означает «не определено». Первая подсказка: проверь написание print.
Вот ещё несколько названий, которые полезно узнавать:
| Сообщение | Что проверить |
|---|---|
SyntaxError |
Правила записи: двоеточия, скобки, кавычки и другие символы. |
NameError |
Написание имени и то, определено ли оно к моменту использования. |
TypeError |
Подходит ли операция для используемых типов данных. |
ZeroDivisionError |
Не оказался ли делитель равен нулю. |
IndentationError |
Отступы в блоках команд. |
Начни с последней строки сообщения: обычно там указаны тип ошибки и пояснение. Затем посмотри на файл и строку, к которым оно относится. Это место обнаружения проблемы; её причина иногда находится раньше — например, в предыдущей строке.
Две частые ловушки: кавычки и типы данных
В записи name = Anna Python воспринимает Anna как имя, а не текст. Если оно не определено, возникнет NameError. Для текста нужны кавычки: name = "Anna".
А выражение "Возраст: " + 10 вызовет TypeError: так складывать строку и число нельзя. Один из способов исправления — преобразовать число в строку:
print("Возраст: " + str(10))
На экране появится Возраст: 10.
Что помогает найти причину ошибки
Пройти код по строкам
Небольшую программу можно проверить на бумаге. Записывай, как меняется значение переменной после каждой команды:
score = 0
score = score + 5
score = score * 2
print(score)
Сначала score равно 0, после сложения — 5, после умножения — 10. Если поменять сложение и умножение местами, получится другой результат: сначала 0 × 2, затем +5. Такая проверка помогает заметить ошибку в порядке действий.
Посмотреть значения через print()
Функция print() позволяет увидеть, что происходит с данными во время выполнения программы:
score = 0
print("Начальный счёт:", score)
score = score + 1
print("Счёт после монеты:", score)
Результат:
Начальный счёт: 0
Счёт после монеты: 1
Так можно проверить, выполняется ли нужная строка и какое значение получается после неё.
Остановить программу в отладчике
Отладчик, или debugger, — специальный инструмент для исследования работающей программы. Он позволяет приостанавливать выполнение, проходить код по шагам и смотреть значения переменных.
Место, где программа должна приостановиться, называют точкой останова — breakpoint. Это похоже на паузу в мультфильме: можно рассмотреть происходящее, прежде чем двигаться дальше.
Для первых небольших задач часто хватает бумаги и print(). Отладчик пригодится, когда захочется подробнее проследить выполнение кода.
Объяснить код игрушке
У этого приёма есть название — метод резинового утёнка, или rubber duck debugging. Возьми игрушку и объясни ей, что должна делать программа и что делает каждая строка на самом деле.
Например: «Здесь я создаю счёт. Здесь меняю его после монеты. Подожди, почему я вычитаю очко?» Иногда объяснение вслух помогает заметить расхождение, которое при чтении ускользало.
Практика: проверь границу условия
Допустим, ты придумал игру, в которую по её правилам можно играть с 12 лет. Программа проверяет возраст так:
age = 12
if age > 12:
print("Доступ разрешён")
else:
print("Доступ запрещён")
Код запускается, но двенадцатилетнему игроку отказывает. Причина в знаке >: он означает «строго больше». Для условия «с 12 лет» нужен знак >= — «больше или равно».
Исправь условие на if age >= 12: и проверь три значения:
| Возраст | Ожидаемый результат |
|---|---|
| 11 | Доступ запрещён. |
| 12 | Доступ разрешён. |
| 13 | Доступ разрешён. |
Это проверка границы условия: берём само граничное значение и ближайшие значения по обе стороны от него. Если проверить только возраст 13 лет, ошибку можно не заметить.
Как искать ошибки в Scratch и без компьютера
Для знакомства с отладкой необязательно знать Python. В Scratch тоже можно сравнивать задуманный результат с действиями персонажа. Если он поворачивает в другую сторону, проследи последовательность блоков, найди поворот, исправь его и запусти проект снова.
Игра «Робот с ошибкой»
Понадобятся лист бумаги в клетку, карандаш и два участника.
- Нарисуйте поле со стартом и финишем. Отметьте стрелкой, куда робот смотрит в начале.
- Договоритесь о командах: «вперёд» — шаг в соседнюю клетку, «налево» и «направо» — поворот на 90 градусов без перемещения.
- Первый участник составляет и проверяет маршрут до финиша. Затем меняет одну команду так, чтобы робот сбился с пути.
- Второй участник получает маршрут и выполняет команды буквально.
- Вместе найдите ошибку, исправьте её и пройдите маршрут заново со старта.
Затем поменяйтесь ролями. Чтобы усложнить игру, добавьте препятствия, ограничьте количество команд или спрячьте две ошибки. Задача — объяснить, какая команда привела к неверному результату, и проверить своё предположение.
Попробуй сам: три задания
1. Почему не появилось сообщение?
message = "Привет!"
pritn(message)
Найди опечатку и исправь её.
2. Почему очки уменьшаются?
score = 5
score = score - 1
print(score)
По правилам игры за новую монету нужно добавить одно очко. Какую строку следует изменить?
3. Что появится на экране?
points = 2
points = points + 3
points = points * 2
print(points)
Вычисли результат на бумаге, затем проверь себя запуском программы.
Ответы и объяснения
- Нужно заменить
pritn(message)наprint(message). - Правильная строка —
score = score + 1. Получится 6. - Получится 10: сначала 2 + 3 = 5, затем 5 × 2 = 10.
Если ответ не совпал, пройди строки ещё раз и запиши промежуточные значения. Так будет видно, на каком шаге возникло расхождение.
Как взрослым помочь ребёнку
Начинайте с инструмента, который ребёнок уже немного знает: подойдут и Scratch, и Python, и маршрут на бумаге. Попросите его объяснить, что должно произойти, а затем вместе проследите выполнение команд.
Полезные вопросы: «Какой результат ты ожидал?», «На каком шаге получилось иначе?», «Как проверить твою догадку?» Они помогают разобраться в причине ошибки.
Если поиск зашёл в тупик, сделайте перерыв или попросите подсказку у преподавателя. При обращении за помощью покажите код, сообщение об ошибке и расскажите, какой результат ожидался. Вопрос «Почему здесь возникает ошибка?» поможет получить объяснение, а не только готовое исправление.
Источники и материалы для продолжения
Материалы ниже — на английском языке:
- Scratch Foundation — приёмы отладки и задания для занятий.
- CodeMonkey — объяснение отладки для детей.
- Документация Python — ошибки и исключения.
- Документация Python — отладчик pdb.
- AWS — как устроен процесс отладки.
- IBM — методы и инструменты отладки.
