Программирование может быть чем-то вроде американских горок. Бывают моменты, когда все идет хорошо, код вылетает из ваших рук, компилируется и работает так, как должен. Но неизбежно также будут ситуации, когда ваша программа просто не делает то, что вы от нее хотите, и кажется, что ошибку невозможно найти. Вы столкнулись с ошибкой.

Когда ваше приложение падает, вы обычно можете прочитать трассировку стека и оттуда быстро выяснить, какой фрагмент кода в какой строке вызвал сбой. Часто это просто простые ошибки, которые легко исправить. Но все становится очень сложно, если ваша программа работает, но не так, как вы хотите, например, возвращает неправильный результат вычисления или выполняет что-то в неподходящее время.

За свою короткую жизнь программиста у меня были ситуации, когда я думал, что моя Android Studio, мой эмулятор или сам Android сломаны. Я мог бы поклясться, что мой код был правильным, но он вел себя непостижимым для меня образом. Конечно, Android не был сломан, просто в моем коде были ошибки. Но ошибки были настолько тонкими и скрытыми, что было очень трудно понять, что не так. И это были даже не большие программы, а маленькие хобби-проекты. Поиск неприятной ошибки в большой кодовой базе может оказаться совершенно другой задачей.

Когда вы вот так застряли, просто сидеть и пытаться понять это силой мысли может показаться невозможным. К счастью, есть и другие действия, которые вы можете предпринять, чтобы решить эти головоломки реального мира, и некоторые из них довольно нетрадиционны.

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

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

Прежде всего, сделайте глубокий вдох

Проблемы с программированием и компьютером могут быть очень неприятными, но вы, скорее всего, найдете решение раньше или позже, так что сохраняйте спокойствие. Вы более эффективны, если не злитесь, не злитесь и не раздражаетесь. Закройте глаза, сделайте глубокий вдох, примите свои негативные эмоции и напомните себе, что каждая проблема — это возможность расти и учиться. Если вы никогда не застреваете, это просто означает, что ваши задачи слишком просты для вас.

Так что сделайте глубокий вдох прямо сейчас. Вы расслаблены? Здорово! Переходим к следующему шагу.

Используйте отладчик

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

В большинстве современных IDE по умолчанию реализован отладчик. Недавно я начал учиться использовать тот, который поставляется с Android Studio (IntelliJ IDEA), и хотя на первый взгляд он выглядит очень сложным, на самом деле он довольно прост в использовании и супер мощен, не только для поиска ошибок, но и для улучшения понять, как работает ваш код. Как обычно, я сжал знания, полученные в процессе обучения, в виде видеоурока, чтобы вам не пришлось проходить такой же утомительный процесс. Нажмите здесь, чтобы добраться до него. Если вы разработчик Android, обязательно просмотрите это руководство, потому что знание того, как использовать отладчик, — это то, что вы не сможете понять в долгосрочной перспективе. Серьезно, зайдите прямо сейчас на видео и хотя бы добавьте его в закладки.

Отладчик — самый мощный инструмент в этом списке, но он не заменит понимания кода. Если вы хотите найти ошибки, вам нужно иметь представление о том, что должна делать ваша программа, а затем сравнить это с реальным поведением. Приведенные ниже шаги помогут вам в этом, и отладчик следует использовать в сочетании с ними, а не в качестве замены.

Попросите помощи онлайн

Хорошо, этот шаг может показаться очевидным, но потерпите меня. Если вы еще этого не сделали, изложите свою проблему в любом из многочисленных онлайн-сообществ программистов. Таким образом, вы не только заставите других опытных разработчиков взглянуть на ваш код, но и сам процесс записи вашей проблемы и попытки объяснить ее уже может помочь вам найти решение самостоятельно, потому что это заставляет вас пройтись по вашему коду. более подробно и объясните ожидаемое и фактическое поведение, не пропуская ничего важного. Это может вывести на поверхность логические ошибки, которых вы раньше не замечали.

Когда мы просто размышляем о проблеме сами, мы склонны пропускать определенные части или не продумывать их полностью, потому что они кажутся незначительными. Хотя отладчик дает вам инструменты для просмотра каждой строки кода одну за другой и детальной проверки каждой переменной по пути, он не заставляет делать это, а значит, вы все равно будете быть склонным пропускать некоторые шаги. Однако эти, казалось бы, неважные части могут оказаться важными элементами решения вашей проблемы, и подробное объяснение вашего кода заставит вас присмотреться к ним поближе.

Но где вы должны задать свой вопрос? У меня есть отдельная запись в блоге со списком различных замечательных сообществ Android и общих программистов, помимо Stackoverflow, которые вы можете найти здесь.

Но прежде чем опубликовать сообщение в любом из них, воспользуйтесь их функцией поиска, чтобы проверить, не был ли уже ответ на аналогичный вопрос на сайте ранее. Особенно на Stackoverflow это защитит вас от неприятных отрицательных голосов и возможного бана. Кроме того, я не думаю, что вы должны открывать вопрос для каждой небольшой проблемы с программированием, с которой вы сталкиваетесь, потому что это приучит вас позволять другим людям думать за вас. Если вы спрашиваете, имейте в виду, что другие тоже ценят свое время. На хорошо подготовленный, короткий и конкретный вопрос гораздо больше шансов получить ответы, чем на тот, в котором вы даже не пытались разобраться сами. Поэтому, на мой взгляд, лучший подход — как можно тщательнее исследовать вашу конкретную проблему самостоятельно, использовать имеющиеся у вас инструменты отладки, а затем спрашивать только в том случае, если вы чувствуете, что не можете найти решение самостоятельно. Это также поможет вам учиться намного лучше, чем вываливать каждую проблему на онлайн-форум и ждать, пока кто-то другой ее решит.

Кроме того, вы не гарантируете, что найдете ответ в Интернете. Если ваша проблема вызвана какой-то сложной ошибкой, которая очень специфична для вашего конкретного кода, маловероятно, что кто-то на форуме или даже в Stackoverflow погрузится достаточно глубоко в ваш проект, чтобы понять это. В этих случаях вы, вероятно, сначала найдете решение самостоятельно. Кроме того, вы можете попросить друга или коллегу программиста.

Сделай перерыв

Обычно я делаю этот шаг после того, как разместил свой вопрос в Интернете, потому что потребуется некоторое время, пока кто-то не ответит на него (если кто-то вообще ответит на него).

Когда вы застряли, перерыв может помочь чудесам. Я не знаю, что именно происходит в нашем мозгу, когда мы отходим от проблемы, но я знаю, что подсознание продолжает работать над ней в фоновом режиме. И эта фоновая обработка может привести к озарениям, которые казались невозможными для понимания, пока мы активно пытались решить проблему. Этот феномен внезапного просветления еще называют Эврика-эффектом или Ага! момент, и я уверен, что вы испытали это раньше. Однако, чтобы получить эти спонтанные озарения, вам сначала нужно активно заняться проблемой, поэтому не делайте перерыв в тот момент, когда вы что-то не понимаете.

Конечно, вы можете провести свой перерыв так, как вам нравится, но я думаю, что будет очень полезно, если вы займетесь физической активностью в это время, потому что это поможет вашему разуму отвлечься от проблемы, не нагружая его другой когнитивной задачей. Кроме того, существует множество исследований, которые показали, как физические упражнения улучшают общее состояние мозга и, следовательно, ваши мыслительные способности.

У программистов есть клише, что они в плохой форме и неспортивны, но я думаю, что это ненужный недостаток, потому что такая мозгоемкая задача, как написание кода, прекрасно сочетается со спортом. Не навязывайте себе глупые роли, вы не обязаны вписываться в клише. Если вы не хотите делать что-то утомительное, по крайней мере, отправляйтесь на долгую приятную прогулку на природе.

Скажи это своей резиновой утке

Это может показаться забавным, но отладка резиновых уточек на самом деле вещь. Ранее я упоминал, что, задавая свой вопрос в Интернете, вы можете найти решение еще до того, как получите ответ, потому что, когда вам нужно объяснять проблему шаг за шагом, вы не пропускаете кажущиеся неважными части, как вы это делаете, когда просто думаете о ней. или работайте над своим кодом самостоятельно. Чтобы добиться такого эффекта, на самом деле не имеет значения, кому вы объясняете свой код, потому что речь идет об акте объяснения, а не об ответе. Таким образом, вместо того, чтобы спрашивать других разработчиков (и занимать их время), вы могли бы объяснить свою проблему кому-то, совершенно не связанному с программированием. Это может быть друг или член семьи, который ничего не знает о коде, это может быть ваша собака, или это может быть, ну, ваша резиновая уточка. На самом деле объяснение вашего кода тому, кто ничего не знает о программировании, может быть даже более действенным, потому что это заставляет вас углубляться в детали и создавать логичный и понятный ход мыслей. Загвоздка здесь в том, что (если это не человек) вы должны притворяться, что объект, которому вы это объясняете, может понять, что вы говорите.

Термин отладка резиновой уточки был придуман в книге Прагматичный программист Эндрю Ханта и Дэвида Томаса, и вот как это работает:

Во-первых, возьмите резиновую утку. Если у вас его еще нет, купите его на Amazon. Опишите утке шаг за шагом, что должен делать ваш код. Пройдитесь по каждой строке, объясните, что она делает и каков логический следующий шаг. Выскажите все в устной форме. Это заставит вас замедлиться, потому что мы думаем быстрее, чем говорим. Ничего не пропускайте, даже если это кажется неважным. Помните, что утка понимает, что вы говорите, она просто не имеет ни малейшего представления о программировании, поэтому вы должны быть предельно ясны. Ваша программа делает именно то, что вы ей говорите, а это означает, что вы в конечном итоге дойдете до точки, где ваш предполагаемый следующий шаг на самом деле не соответствует введенным вами инструкциям. Это ваша ошибка.

Конечно, это не всегда так просто и прямолинейно, особенно когда ваш код большой и сложный, но, по крайней мере, попробуйте. Просто объяснение вашего кода уже поможет вам учиться.

Переписать чертову вещь

Если размер кода с ошибками и возможные сроки позволяют, рассмотрите возможность полного удаления функции и переписывания ее с нуля. Это часто не вариант, если вы работаете в компании, и некоторые разработчики (с большим опытом, чем у меня) даже говорят, что вы должны никогда не делать этого и вместо этого всегда пытаться исправить существующий код. Но я думаю, по крайней мере, для тех, кто все еще учится, это может быть разумным вариантом. Если вы работаете над хобби-проектом, практика важнее, чем быстрое завершение приложения. Если вы переписываете части кода с нуля, вы можете не только исправить скрытые ошибки, но и улучшить общее качество и структуру кода, закрепив при этом то, что вы уже знаете.

Если вы столкнулись с ошибкой, просто помните, что проблемы и разочарование являются частью процесса обучения. Примите это, даже если это трудно. Это означает, что вы на правильном пути.

Также рассмотрите возможность присоединиться к группе Facebook Coding in Flow, где мы помогаем друг другу с проблемами кодирования. Учиться легче с единомышленниками.

Удачного кодирования, и пусть вы исправите все ошибки на своем пути!

Поделись этим!