Отладка и итоговый проект
Вот вы и добрались до последней недели. Теперь мы изучим повседневную работу каждого программиста — отладку, то есть поиск и исправление ошибок. Затем, объединив всё изученное, увидим, как строится итоговый проект. Это завершение вашего пути и одновременно начало настоящей дороги программиста.
Что вы узнаете на этом уроке
9.1 Что такое отладка?
Под отладкой (debugging) понимается процесс поиска и исправления ошибок (bug) в программе. Ни один программист в мире не пишет код без ошибок. На самом деле большая часть рабочего времени программиста уходит не на написание нового кода, а на исправление существующего. Значит, умение отлаживать — один из важнейших навыков программиста.
Хорошая новость: отладка — это навык, которому можно научиться. При системном подходе можно найти любую ошибку. На этой неделе мы рассмотрим виды ошибок, способы их поиска и самые частые ошибки.
9.2 Виды ошибок
Ошибки делятся на три основных вида, и каждый из них мы находим по-разному:
- Синтаксическая ошибка: нарушено правило языка, например забыта точка с запятой. Компилятор вообще не создаёт программу.
- Ошибка выполнения (runtime): программа запускается, но падает во время работы, например выход за границы массива.
- Логическая ошибка: программа работает и не падает, но результат неверен. Их найти труднее всего, потому что компилятор не помогает.
Ниже выберите правильный вид для каждого случая:
9.3 Чтение сообщения об ошибке
При синтаксической ошибке компилятор вам помогает: он говорит, в какой строке ошибка и в чём она. Поначалу эти сообщения кажутся пугающими, но если научиться их читать, отладка становится намного проще. В сообщении ниже есть имя файла, номер строки и описание ошибки:
Разберём его по частям: salom.c — это файл, 4 — это строка, 18 — это столбец, а expected ';' означает «здесь ожидалась точка с запятой». Значит, в 4-й строке мы забыли поставить ; перед return.
9.4 Отладка через printf
При логической ошибке компилятор молчит: программа работает, но ответ неверен. Самый простой и мощный способ — отладка через printf: вы ставите printf в подозрительных местах и смотрите значения переменных. Программа ниже должна складывать числа от 1 до 5 (ответ 15), но выдаёт 10. Почему?
Нажмите кнопку добавить printf и на каждом шаге смотрите значение sum:
9.5 Исправьте ошибку
Теперь время практики. Ниже три самые частые ошибки. Каждая выделена красным. Выберите правильное исправление — код станет зелёным:
9.6 Отладчик
printf — это хорошо, но есть и специальный инструмент: отладчик (debugger). Он прогоняет программу строка за строкой по шагам и на каждом шаге показывает значения всех переменных. На самом деле это очень похоже на живые отладчики, которыми мы пользовались весь курс: отладчик цикла из 3-й недели, отладчик стека вызовов из 8-й недели — всё это идея отладчика.
Основные действия в отладчике:
- Step (шаг): выполнить одну строку и перейти к следующей
- Breakpoint (точка останова): остановить программу на определённой строке
- Watch (наблюдение): постоянно следить за значением какой-либо переменной
9.7 Итоговый проект: планирование
Теперь вторая часть: построение большого проекта. Новички часто сразу принимаются писать код и запутываются. А опытный программист сначала планирует: разбивает большую задачу на маленькие, выполнимые шаги.
Например, мы хотим сделать простую программу «Список задач» (to-do). Разобьём её так:
- Выбор структуры данных для хранения задач (массив или список)
- Функция добавления новой задачи
- Функция вывода задач на экран
- Отметка задачи как выполненной
- Сохранение всего в файл и последующее чтение
Обратите внимание: каждый шаг в этом списке — именно то, что вы изучили в этом курсе. Массив, функция, структура данных, файлы. Большой проект просто собирается из маленьких, знакомых частей.
9.8 Построение шаг за шагом
Когда план готов, мы не пишем всё сразу. Строим шаг за шагом: пишем одну маленькую часть, проверяем её, и если работает — переходим к следующей. Это важнейшая привычка, потому что если возникнет ошибка, она будет только в последней написанной маленькой части, и найти её легко.
Практические правила:
- Сначала сделайте самую простую работающую версию, потом улучшайте
- После каждой новой части запускайте и проверяйте программу
- За один раз меняйте только одну вещь — тогда понятно, где ошибка
- Сохраняйте работающие версии (ниже о git)
9.9 Завершение пути
Девять недель назад вы, возможно, ничего не знали о программировании. А сегодня вы знаете всё — от того, как работает компьютер, до рекурсии и структур данных. Ниже посмотрите весь путь: нажимая на каждую неделю, вспомните, что вы изучили:
С этим фундаментом теперь открыто много дорог: строить свои проекты, изучать новый язык (Python, JavaScript) или углублять эти знания. Самое главное — вы научились программировать, а это значит, что вы научились учиться сами.
Сделайте прогноз
Сколько раз этот цикл выведет звёздочку в терминал?
9.10 Глубже advanced
Ещё два полезных понятия, чтобы продолжить путь.
Контроль версий (git)
Git — инструмент, который хранит историю вашего кода. Вы сохраняете каждую работающую версию, и если новое изменение сломает код, вы легко вернётесь к предыдущему состоянию. Кроме того, через сервисы вроде GitHub можно работать над кодом совместно с другими. Каждый серьёзный программист использует git.
Куда двигаться дальше
Раз вы знаете язык C, другие языки теперь дадутся вам намного легче. Python простой и популярен для искусственного интеллекта. JavaScript — для веб-сайтов. Или прямо здесь, с C, вы можете углубиться в создание игр и систем. Самое главное — постоянная практика: строить маленькие проекты, каждый день писать немного кода.
Словарь терминов
9.11 Итоговый тест
16 вопросов — общее повторение по всему курсу. Чтобы завершить Foundation, ответьте правильно как минимум на 11 из них.
Поздравляем! Вы завершили курс Foundation!
За 9 недель вы прошли путь с нуля — от того, как работает компьютер, до алгоритмов, указателей, структур данных и рекурсии. Это серьёзное достижение. Теперь у вас есть настоящий фундамент программирования.
Это не конец, а начало. Пусть ваш путь будет открыт!