Блог

Логические ошибки. Часть 2: диагностика алгоритма

Узнай, как улучшить алгоритм программы и найти скрытые баги, о которых молчит компилятор/интерпретатор.
11 июля 20185 минут8138

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

Главное правило проверки алгоритма — одинаковые вводные всегда должны вести к одному и тому же результату. Мы собрали несколько рекомендаций, которые помогут улучшить ваш алгоритм и созданный на его основе код.

Начните с малого и тренируйтесь «на кошках»

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

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

Пишите «от лица компьютера». Вы придумываете программу действий для машины, а не для себя. Если пишете на языке сравнительно низкого уровня (С++), «Сохранение документа» — это взгляд программиста. В языках типа Python, где код приближен к естественной речи, такая формулировка может быть понятна машине. Учитывайте это. Привыкайте смотреть на код с точки зрения компьютера, который ждет ответа на вопрос «Что делать?». В комментариях и пояснениях используйте настоящее время или повелительное наклонение: «выводим строку», «выведи строку».

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

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

Не беритесь за мелочи прежде, чем заработает алгоритм верхнего уровня. Ставьте заглушки — конечно, с условием, что вы представляете, чем их потом заменить (см. ниже пункт про бизнес-логику). В большинстве случаев идти сверху вниз не только быстрее, но и психологически проще, когда нужно мотивировать себя и не бросить начатое.

Делите код на самостоятельные блоки, которые можно проверить unit-тестированием. Иначе усложните себе поиск багов. Если участки кода, которые отвечают за конкретное поведение, не автономны — цепляются за внешний код и друг за друга — сложная структура и человеческий фактор доведут до ошибок. Работа тестировщика тоже усложнится. Вносите и тестируйте новый код небольшими кусочками, чтобы потом не запутаться в «простыне».

Посмотрите вебинар: «Быстро или медленно? Введение в анализ алгоритмов».

Не оставляйте бизнес-логику на потом

Для новичка это совет на будущее. Иногда заказчик тянет с проработкой бизнес-части, а программист уже пишет код и по своим прикидкам «оставляет место» под будущий функционал. Позже либо приходится все переписывать, либо итоговый продукт вызывает чувство стыда у всех причастных. Не начинайте работать без продуманной бизнес-логики: трясите тех, кто за это отвечает, и не пытайтесь сделать работу за них!

Если пока заказчик  — вы сами, срочно свяжитесь с собой и выясните детали.

Станьте следопытом кода

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

Когда простая слежка не приносит результатов, попробуйте старый метод под названием «Остановись, мгновенье!». Расставьте по участкам кода точки останова. На них выполнение кода прерывается, и можно экспериментировать в консоли. Проверяйте значения переменных, чтобы понять, все ли идет по плану. Затем возобновите исполнение кода до следующей точки.

Если запутались, сыграйте в настольную игру «Я — компьютер»

Правила просты:

  1. Распечатываете полный листинг своей программы.
  2. Отдельно распечатываете список переменных с начальными значениями.
  3. Берете чистый лист — это «бумажная консоль». Не смейтесь, профессиональные разработчики иногда так играют, потому что это помогает.
  4. Начинаете читать листинг с первой строки.
  5. Выполняете строку кода в голове.
  6. Фиксируете новые значения переменных на соответствующем листе.
  7. Пишете результаты в «консоль».
  8. Смотрите, ожидаем ли результат:
    1. Если нет — вы напали на след. Ищите причину несоответствия;
    2. Если да — переходите к следующей строке.
  9. Повторяете пункты 5–8 до обнаружения ошибки.
  10. Идете за компьютер и правите код.
  11. Вы победили! Салют — ламбада — пирожок.

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

Играйте с чужим кодом

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

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

Не игнорируйте математику

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

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

Многое будет зависеть от того, какое именно ПО вы будете разрабатывать. С новыми задачами появляются и новые потребности в знаниях  — программист начинает штудировать конкретные темы. Не говорите себе «стоп-слов», а поймите, что прикладная математика — это необходимо и посильно.

Начните с вебинара «Зачем программисту нужно знать математику?».

логикаошибки программистовразработка
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!
Posts popup