Неделя 9 · Итоговая

Отладка и итоговый проект

Вот вы и добрались до последней недели. Теперь мы изучим повседневную работу каждого программиста — отладку, то есть поиск и исправление ошибок. Затем, объединив всё изученное, увидим, как строится итоговый проект. Это завершение вашего пути и одновременно начало настоящей дороги программиста.

Что вы узнаете на этом уроке

Что такое ошибка (bug) и три её основных вида
Прочитаете сообщения об ошибках от компилятора
Найдёте ошибку с помощью printf и отладчика
Распознаете и исправите самые частые ошибки
Спланируете проект и построите его шаг за шагом
Соберёте воедино всё, что изучили за весь курс

9.1 Что такое отладка?

Под отладкой (debugging) понимается процесс поиска и исправления ошибок (bug) в программе. Ни один программист в мире не пишет код без ошибок. На самом деле большая часть рабочего времени программиста уходит не на написание нового кода, а на исправление существующего. Значит, умение отлаживать — один из важнейших навыков программиста.

Хорошая новость: отладка — это навык, которому можно научиться. При системном подходе можно найти любую ошибку. На этой неделе мы рассмотрим виды ошибок, способы их поиска и самые частые ошибки.

История слова «bug» любопытна: в 1947 году настоящее насекомое (мотылёк), попавшее внутрь компьютера, стало причиной неисправности. С тех пор ошибку в программе называют «bug», а её исправление — «debugging».

9.2 Виды ошибок

Ошибки делятся на три основных вида, и каждый из них мы находим по-разному:

  • Синтаксическая ошибка: нарушено правило языка, например забыта точка с запятой. Компилятор вообще не создаёт программу.
  • Ошибка выполнения (runtime): программа запускается, но падает во время работы, например выход за границы массива.
  • Логическая ошибка: программа работает и не падает, но результат неверен. Их найти труднее всего, потому что компилятор не помогает.

Ниже выберите правильный вид для каждого случая:

Классифицируйте ошибку выберите вид
Для каждого случая нажмите правильный вид ошибки.

9.3 Чтение сообщения об ошибке

При синтаксической ошибке компилятор вам помогает: он говорит, в какой строке ошибка и в чём она. Поначалу эти сообщения кажутся пугающими, но если научиться их читать, отладка становится намного проще. В сообщении ниже есть имя файла, номер строки и описание ошибки:

terminal
1salom.c:4:18: error: expected ';' before 'return'
2 return 0
3 ^

Разберём его по частям: salom.c — это файл, 4 — это строка, 18 — это столбец, а expected ';' означает «здесь ожидалась точка с запятой». Значит, в 4-й строке мы забыли поставить ; перед return.

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

9.4 Отладка через printf

При логической ошибке компилятор молчит: программа работает, но ответ неверен. Самый простой и мощный способ — отладка через printf: вы ставите printf в подозрительных местах и смотрите значения переменных. Программа ниже должна складывать числа от 1 до 5 (ответ 15), но выдаёт 10. Почему?

Нажмите кнопку добавить printf и на каждом шаге смотрите значение sum:

Поиск ошибки с помощью printf добавить printf
yigindi.c
1int sum = 0;
2for (int i = 1; i < 5; i++)
3 sum = sum + i;
terminal

9.5 Исправьте ошибку

Теперь время практики. Ниже три самые частые ошибки. Каждая выделена красным. Выберите правильное исправление — код станет зелёным:

Исправьте ошибку выберите правильное исправление
ошибка:
tekshir.c

9.6 Отладчик

printf — это хорошо, но есть и специальный инструмент: отладчик (debugger). Он прогоняет программу строка за строкой по шагам и на каждом шаге показывает значения всех переменных. На самом деле это очень похоже на живые отладчики, которыми мы пользовались весь курс: отладчик цикла из 3-й недели, отладчик стека вызовов из 8-й недели — всё это идея отладчика.

Основные действия в отладчике:

  • Step (шаг): выполнить одну строку и перейти к следующей
  • Breakpoint (точка останова): остановить программу на определённой строке
  • Watch (наблюдение): постоянно следить за значением какой-либо переменной
Есть и самый мощный, но самый простой способ: резиновая уточка (rubber duck). Объясните свой код строка за строкой вслух кому-нибудь (или уточке). Часто в процессе объяснения вы сами находите ошибку.

9.7 Итоговый проект: планирование

Теперь вторая часть: построение большого проекта. Новички часто сразу принимаются писать код и запутываются. А опытный программист сначала планирует: разбивает большую задачу на маленькие, выполнимые шаги.

Например, мы хотим сделать простую программу «Список задач» (to-do). Разобьём её так:

  • Выбор структуры данных для хранения задач (массив или список)
  • Функция добавления новой задачи
  • Функция вывода задач на экран
  • Отметка задачи как выполненной
  • Сохранение всего в файл и последующее чтение

Обратите внимание: каждый шаг в этом списке — именно то, что вы изучили в этом курсе. Массив, функция, структура данных, файлы. Большой проект просто собирается из маленьких, знакомых частей.

9.8 Построение шаг за шагом

Когда план готов, мы не пишем всё сразу. Строим шаг за шагом: пишем одну маленькую часть, проверяем её, и если работает — переходим к следующей. Это важнейшая привычка, потому что если возникнет ошибка, она будет только в последней написанной маленькой части, и найти её легко.

Практические правила:

  • Сначала сделайте самую простую работающую версию, потом улучшайте
  • После каждой новой части запускайте и проверяйте программу
  • За один раз меняйте только одну вещь — тогда понятно, где ошибка
  • Сохраняйте работающие версии (ниже о git)
Не пытайтесь написать идеальный код сразу. Даже опытные программисты сначала делают работающую, простую версию, а потом постепенно её улучшают. Есть правило: «Сначала пусть работает, потом пусть будет красиво».

9.9 Завершение пути

Девять недель назад вы, возможно, ничего не знали о программировании. А сегодня вы знаете всё — от того, как работает компьютер, до рекурсии и структур данных. Ниже посмотрите весь путь: нажимая на каждую неделю, вспомните, что вы изучили:

Ваш путь нажмите на неделю

С этим фундаментом теперь открыто много дорог: строить свои проекты, изучать новый язык (Python, JavaScript) или углублять эти знания. Самое главное — вы научились программировать, а это значит, что вы научились учиться сами.

Сделайте прогноз

Сколько раз этот цикл выведет звёздочку в терминал?

main.c
1for (int i = 0; i <= 3; i++)
2 printf("*");
3 раза
4 раза
5 раз

9.10 Глубже advanced

Ещё два полезных понятия, чтобы продолжить путь.

Контроль версий (git)

Git — инструмент, который хранит историю вашего кода. Вы сохраняете каждую работающую версию, и если новое изменение сломает код, вы легко вернётесь к предыдущему состоянию. Кроме того, через сервисы вроде GitHub можно работать над кодом совместно с другими. Каждый серьёзный программист использует git.

Куда двигаться дальше

Раз вы знаете язык C, другие языки теперь дадутся вам намного легче. Python простой и популярен для искусственного интеллекта. JavaScript — для веб-сайтов. Или прямо здесь, с C, вы можете углубиться в создание игр и систем. Самое главное — постоянная практика: строить маленькие проекты, каждый день писать немного кода.

В программировании никогда нет точки, в которой «я изучил всё». Даже программисты с 20-летним опытом каждый день узнают что-то новое. Это путь постоянного обучения, и вы только что на него вступили.

Словарь терминов

bugошибка в программе.
debuggingпроцесс поиска и исправления ошибок.
синтаксическая ошибканарушено правило языка, находит компилятор.
логическая ошибкапрограмма работает, но результат неверен.
breakpointточка, останавливающая программу на определённой строке.
gitконтроль версий, хранящий историю кода.

9.11 Итоговый тест

16 вопросов — общее повторение по всему курсу. Чтобы завершить Foundation, ответьте правильно как минимум на 11 из них.

Поздравляем! Вы завершили курс Foundation!

За 9 недель вы прошли путь с нуля — от того, как работает компьютер, до алгоритмов, указателей, структур данных и рекурсии. Это серьёзное достижение. Теперь у вас есть настоящий фундамент программирования.

Это не конец, а начало. Пусть ваш путь будет открыт!