Подход к решению сложных задач в программировании и вообще

в 14:50, , рубрики: tdd, Песочница, Программирование, метки: ,

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

Это может быть реализация большого функционала, особенно используя новые технологии. Или большой рефакторинг legacy кода.

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

Подход к решению сложных задач в программировании и вообще
(картинка из внешнего источника, свою не сделал)


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

Сначала я попытался найти более подробные инструкции в интернете, но и от них было мало пользы, т.к. модели велосипедов немного отличались, ракурсы фотографий были не понятны и т.д. При этом на меня давило желание собрать по скорее, т.к. малыш уже хотел кататься. Я злился, уже готов был искать, кого звать на помощь, почти впал в отчаянье…

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

Мой подход

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

Подход к решению сложных задач в программировании и вообще

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

Еще чуть чуть о программировании и TDD

Иногда бывает, что задача кажется изначально такой монолитной, что от нее невозможно откусывать кусочки, и решить можно только нахрапом. Например, я иногда слышу от других программистов, мол, я уже 3 дня работают над этой задачей, но ещё не разу не запускал код. Я поражаюсь концентрации этих ребят, но для себя, не столь одарённого, вижу действенный, проверенный инструмент — TDD.

Когда говорят о TDD, обычно говорят о написании простых юнит тестов, которые мы пишем перед написанием какой-то функции. Но на практике, много вопросов в осмысленности таких действий. Я же вижу, такой подход как тесты вперёд, хорошим инструментом в решении сложных монолитных задач.

Продолжая аналогию со сборкой велосипеда, у меня всегда на коробке была фотография того что должно получиться. Т.е. я мог составить тест план: сверить то что у меня получилось с тем что на фотографии. Все намного прекрасней в программировании. Практически чтобы мы не реализовывали, у нас всегда есть что-то на входе (в лучшем случае входные данные, в худшем состояние) и на выходе (опять же, в идеале выходные данные, в худшем случае — изменение состояния). И не составит большого труда написать такой глобальный тест на 3 строчки:

1. создать входные данные
2. выполнить функцию
3. сверить выходные данные с эталонными

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

Такой финт ушами, не раз мне помог, справиться с неподъемными на первый взгляд задачами, и кроме того, получить в конце работы ещё и готовые тесты.

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

Спасибо за внимание.

Автор: lyapun

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js