Можно ли научиться мыслить, как программист?

18 апреля 2018, 16:47

Все, кто интересуется программированием, наверняка знают эту цитату Стива Джобса: «Каждый человек на планете должен учиться программированию на компьютере, потому что оно учит думать». До и после него многие задавались вопросом, что значит «думать, как программист», и как этому научиться. Ответы на эти вопросы предложил Ричард Райс в колонке на FreeCodeCamp.

Читать далее

Иллюстрация: Frames in Time

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

  1. пробуют один способ;
  2. если он не срабатывает, пробуют другой способ;
  3. если он не срабатывает, повторяют пункт 2, пока им не повезёт.

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

  1. выработать алгоритм,
  2. отработать его.

По результатам исследования навыков разработчиков, которое провёл сервис HackerRank в 2018 году, почти все работодатели ставят на первое место способность сотрудников решать задачи. Эта способность для них оказалась даже важнее, чем владение языками, а также навыки тестирования и системного проектирования. Вычислительное мышление — или способность разбивать комплексные проблемы на более доступные — ценится не меньше базовых технических умений.

На данную тему можно почитать много полезных книг, например, «The 4-Hour Chef» Тима Феррисса и «Думай как программист. Креативный подход к созданию кода» Антона Спрола. Советы, которые предлагают эти авторы, во многом схожи. Несмотря на то, что все люди разные и делают всё по-разному, если следовать некоторым проверенным советам, можно научить гораздо большему гораздо быстрее.

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

Вот какой алгоритм предлагает он для успешного решения проблем.

1. Понимание

Нужно чётко понимать суть задачи. Зачастую «сложные» задачи лишь кажутся таковыми потому, что человек неправильно их понимает. Выяснить это достаточно просто: понятную задачу легко сформулировать другому простым языком. Многим программистам знакомо чувство, когда, «застряв» на проблеме, они пытаются её объяснить, и сразу начинают замечать пробелы в логике, которых до этого не осознавали. Поэтому задачу нужно записать, нарисовать схему или попробовать рассказать о ней другому человеку (или «мысленному помощнику»).

«Если вы не можете объяснить что-либо простыми словами, вы это не понимаете». Ричард Фейнман.

2. План

Нельзя бросаться решать задачи без чёткого плана и надеяться кое-как довести дело до конца. Ничто не поможет, если человек не может разбить задачу на несколько конкретных шагов. Но не стоит забегать вперёд: мозгу необходимо некоторое время, чтобы проанализировать проблему и обработать имеющуюся информацию. Чтобы составить план, нужно ответить на вопрос: «какие шаги нужно предпринять, чтобы из условия А получить результат В?». Программисты обычно делают это в комментариях.

3. Анализ

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

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

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

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

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

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

1) отладка: нужно пошагово пройти по решению в поиске ошибок.

«Дебаггинг — это искусство отличать, что вы на самом деле сказали сделать программе, от того, что вы думали, что сказали ей сделать». Эндрю Сингер.

2) переоценка: нужно сделать шаг назад и посмотреть на проблему под другим углом. Возможно, какими-то деталями можно будет пренебречь в пользу более общего подхода.

«Иногда мы настолько увлекаемся деталями задачи, что упускаем из виду обобщённые принципы, которые помогли бы решить её на более общем уровне. Классический пример — сложение длинного ряда целых чисел: 1 + 2 + 3 + … + n. Гаусс сообразил, что подсчитать эту сумму можно просто по формуле n(n+1)/2, и это позволило избавиться от множества знаков сложения». Джордан Болл.

Ещё один потрясающе эффективный метод переоценки — начать всё заново. Нужно просто удалить всё написанное и посмотреть на задачу новым взглядом.

3) помощь друга: например, Google. Какой бы ни была задача, скорее всего кто-то другой уже решал что-то подобное. Искать альтернативные способы имеет смысл, даже если человек уже решил задачу самостоятельно: всегда полезно учиться на чужом опыте. Но нужно искать решение не комплексной задачи, а отдельных подзадач, потому что если не приложить хотя бы минимум усилий, невозможно чему-либо научиться. А если ничему не научиться — это просто пустая трата времени.

Практика

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

Успешные люди постоянно тренируются на таких небольших головоломках: Илон Маск, Рид Хоффман, Марк Цукерберг и многие другие предприниматели утверждают, что свои успешные компании им удалось построить именно благодаря видеоиграм. Это не означает, что достаточно просто стать геймером. Суть игр — тоже решение проблем, и чтобы отточить навык, нужно каждый день тренироваться решать задачи, находя в них одну основу.

«Когда вам кажется, что вы успешно справились с одним препятствием, возникает новое. Но именно это и делает жизнь интересной. […] Жизнь — постоянный процесс преодоления этих преград. Каждый раз вы чему-то учитесь. Каждый раз вы становитесь сильнее, мудрее и перспективнее. Каждый раз вы обходите ещё одного соперника, пока не станете лучшим: лучшей версией себя». Райан Холидей.

подписка на главные новости 
недели != спам
# ит-новости
# анонсы событий
# вакансии
Обсуждение