Содержимое
Как искать ошибки в коде Мне достаточно часто присылают в бота вопрос: «А где у меня тут ошибка?» и дальше целая страница кода. В целом такая постановка вопроса выглядит достаточно наивной, так как новичкам кажется, что более опытному разработчику будет легко найти ошибку в любом случайном и совершенно незнакомом куске кода. На самом деле же поиск ошибки даже в своём собственном коде - это порой самая долгая и муторная часть работы. В худших случаях поиск ошибок и отлаживание кода занимает 90% всего времени разработчика. Еще сложнее найти ошибку в чужом коде, который видишь в первый раз в жизни. Даже в коде, который просто и понятно написан. А новички чаще всего пишут ну очень сложный и запутанный код - его даже прочитать и понять с третьей попытки сложно, не то что найти там ошибку. Поэтому, когда вопрос звучит: «А где у меня тут ошибка» - это на разработческий язык переводится как: «Привет! Сделай, пожалуйста за меня 90% работы - ну у тебя же есть лишний час времени, правда?». Но это лирическое вступление. А пост о том, как искать ошибки в коде. Из всего того, что вы мне присылаете в бота, я могу сделать один основной вывод: новички часто не понимают код, который сами же написали. И, что еще хуже - даже не стремятся его понять, надеются, что и так сойдет. В итоге всё, что вы используете в коде - циклы, переменные, списки/массивы - используется как-то наугад, без четкого понимания, как это вообще работает. Ну и, естественно, часто такой подход не даёт ожидаемого результата. Поэтому если ваш код работает не так, как хочется, первое что надо сделать - убедиться, что вы его понимаете. Каждая строчка, каждое действие в нем должно иметь для вас смысл. Если вы не до конца понимаете, как работает ваш цикл - скорее всего, из-за этого код и не получился. И уж точно не надо пытаться что-то наугад поменять в коде и надеяться, что он заработает. В принципе, если вы понимаете каждую строчку своего кода, значит в нём действительно нет ошибок. В идеальном мире. В реальности мы можем в упор не замечать какую-то опечатку или неверное действие. Поэтому чтобы найти ошибку - хорошо бы сформулировать гипотезу, и даже несколько. Где я мог ошибиться? И, в идеале, написать тест, который либо опровергнет, либо подтвердит гипотезу (про тесты тут было 2 поста). Увидев, что гипотеза подтверждается, и тест её показывает - исправляем ошибку, и убеждаемся, что теперь тест проходит без ошибки. Также для отладки кода существуют специальные удобные инструменты - дебаггеры или отладчики, они часто встроены в IDE. Эти инструменты позволяют запустить код с любого места (и в любом месте приостановить его выполнение), и проследить каждый шаг, который выполняет код, посмотреть на значение каждой переменной в любой момент времени. Таким образом, медленно, но верно, можно увидеть, где программа идёт не по тому пути, по которому она должна идти и наконец добиться того, о чем я говорила на первом шаге - идеального понимания, как работает ваша программа, вплоть до каждого шага. Есть и множество других приёмов - например, добавить в разных местах кода вызовы print, чтобы вывести информацию на экран, и по ней понять, где в коде ошибка. Можно удалять поочередно куски кода и запускать код без них - и смотреть, появляется ли ошибка - так можно будет понять, в каком месте она возникла, а какие куски кода работают верно. В общем, таких приёмов можно придумать массу, но начните с главного - убедитесь, что вы понимаете код, который пишете. Иначе в дальнейшей учебе или работе просто нет смысла, программирование - это не магия.