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

Как проверить вызов внешней службы?

Как создать свой собственный драгоценный камень?

Как мне реализовать минимакс в крестики-нолики?! (текущая проблема, с которой я борюсь)

Какой настоящий вопрос, как решить проблему, когда у меня есть только смутное представление, с чего начать? Или как разбить большую проблему на более мелкие части?

псевдокод

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

# To build the best lineup
# I will play the players projected to score the most points
# The players that score the most points are the ones that play on the best offenses
# And will score more if they play bad defenses
# And will score less if they have an injury

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

#Players will score no ponits if they don't play
#Players score will be significantly less if they are listed as doubtful
#Players score will only be slightly effected if they are listed as probable

Тестирование

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

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

(describe "point-reduction"
  (it "reduces a players points because of injury"
    (should= 0
      (point-reduction "Tom Brady" "Out")

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

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

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