Самое главное, когда дело доходит до программирования, это конкретные знания, необходимые для решения задачи.

Меня всегда беспокоила мысль, что программирование — это просто решение проблем. Я думаю, что это беспокоит меня, потому что это обычно говорят в контексте совета по карьере в разработке программного обеспечения, и это типичный ответ на вопрос «Как стать лучше в программировании?»

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

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

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

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

Другими словами, чтобы решить задачу программирования, вам нужно иметь определенные знания в области программирования, чтобы решить ее. Конечно, Шерлок Холмс с его способностью к дедукции и логическому мышлению мог бы придумать что-то близкое к псевдокоду для решения FizzBuzz, но если он не знает, как писать на языке программирования, он не будет в состоянии действительно решить это. Ему нужно знать разницу между четными и нечетными числами (я уверен, что знает), а также особый синтаксис языка программирования, такой как операторы if и что такое модуль % делает оператор.

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

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

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

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

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