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

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

Проблема: боковой треугольник

Инструкции: напишите программу, которая использует не более двух операторов вывода для печати бокового треугольника из символов #, например:

#
##
###
####
###
##
#

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

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

Другими словами, я открыл свой редактор кода и разбил алгоритм решения этой проблемы на более мелкие шаги, напечатанные простым английским языком в виде комментариев, вот так.

// Create a method definition called sideways_triangle.
// Inside the method:
// create a variable called Row with an initial value of 1;
// create a variable called Iterations with an initial value of 1;
// use a loop to print out #'s equal to the value of Iterations;
// add a newline character to the end of each line of #s;
// if the value of Row is less than or equal to 4, increment the value of Iterations by 1 after each new loop cycle;
// else if the value of Row is greater than 4, decrement the value of Iterations by 1 after each new loop cycle;
// increment the value of Row by 1 with each new loop cycle;
// end the loop when either the Rows variable equals 8 or the Iterations variable equals 0.

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

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

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

Решив решить эту проблему в Ruby, я пришел к следующему решению (обратите внимание на равенство псевдокода и кода Ruby).

// Create a method definition called sideways_triangle.
def sideways_triangle
// Inside the method:
// create a variable called Row with an initial value of 1;
  row = 1
// create a variable called Iterations with an initial value of 1;
  iterations = 1
// use a loop to print out #'s equal to the value of Iterations;
  while row < 8 do
// add a newline character to the end of each line of #s;
// if the value of Row is less than or equal to 4, increment the value of Iterations by 1 after each new loop cycle;
    if row < 4
      print "#" * iterations + "\n"
      iterations += 1
// else if the value of Row is greater than 4, decrement the value of Iterations by 1 after each new loop cycle;
    else
      print "#" * iterations + "\n"
      iterations -=1
    end
// increment the value of Row by 1 with each new loop cycle;
    row += 1
// end the loop when either the Rows variable equals 8 or the Iterations variable equals 0.
  end
end

Бум! Это работает. И если бы я ушел прямо сейчас, я бы успешно написал алгоритм для решения проблемы бокового треугольника на Ruby.

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

def sideways_triangle
  row = 1
  iterations = 1
  while row < 8 do
    if row < 4
      print "#" * iterations + "\n"
      iterations += 1
    else
      print "#" * iterations + "\n"
      iterations -=1
    end
    row += 1
  end
end

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

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям ». - Мартин Фаулер

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