Думать как программист: уроки решения проблем

0
3842
views

Перевод статьи Ричарда Реиса «How to think like a programmer — lessons in problem solving».

Решение проблем

Если вы интересуетесь программированием, вы могли уже встречаться с этой цитатой:

«Каждому в этой стране стоит учиться программированию, потому что это учит вас думать»,

— Стив Джобс.

Вы также могли задаваться вопросом, что именно означает «думать как программист» и как вам начать думать так же.

Вкратце, это касается более эффективного способа решения проблем.

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

Почему это важно?

Решение проблем это мета-навык.

У всех нас есть проблемы. Большие и маленькие. То, как мы справляемся с ними, иногда бывает… достаточно произвольным.

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

  1. Попробовать решение.
  2. Если не сработало, попробовать другое.
  3. Если не сработало, повторять п.2, пока не повезет.

Послушайте: иногда вам везет. Но это наихудший способ решения проблем! И это огромная, огромная потеря времени.

Самый лучший способ предполагает: а) наличие схемы действий и б) следование ей.

«Практически все работодатели ставят на первое место навыки решения проблем.

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

Демонстрация вычислительного мышления или способности разбивать на составные части большие, комплексные проблемы имеет такую же (если не большую) ценность, что и основные технические навыки, требуемые для конкретной должности», –  Hacker Rank (2018 Developer Skills Report).

Схема действий

Для поиска подходящей схемы действий я воспользовался советами из книги Тима Ферриса, посвященной процессу обучения, – «The 4-Hour Chef».

Это привело меня к двум интервью с действительно впечатляющими людьми: Джорданом Боллом (номер 1 или 2 из 65,000+ пользователей Coderbyte) и Антоном Спролом (автором книги «Думай как программист. Вступление к креативному решению проблем»).

Я задавал им одни и те же вопросы, и их ответы были очень похожи!

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

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

– Антон Спрол.

Так что же нужно делать, встретившись с новой проблемой?

1. Поймите

Узнайте точно, что спрашивается. Большинство сложных проблем являются сложными потому что вы их не понимаете (поэтому понимание – первый шаг).

Как понять, что вы поняли проблему? Если можете объяснить ее простым языком, значит, поняли.

Помните, как вам случилось застопориться, а затем вы начали объяснять свою проблему и тут же увидели пробелы в логике, оставшиеся незамеченными?

Большинству программистов знакомо это чувство.

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

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

– Ричард Фейнман.

2. Спланируйте

Не погружайтесь сразу в решение, не имея плана и надеясь, что разберетесь по ходу дела. Спланируйте свое решение!

Вам ничто не поможет, если вы не способны записать конкретные шаги.

В программировании это означает дать своему мозгу время проанализировать проблему и обработать информацию.

Чтобы получить хороший план, ответьте на вопрос: «Если на входе мы имеем Х, то какие шаги нужно предпринять, чтобы на выходе получить Y?».

Примечание: у программистов есть отличный инструмент для этого – комментарии!

3. Разделяйте

Обратите внимание. Это самый важный шаг.

Не пытайтесь решать одну большую проблему. Ни к чему хорошему это не приведет.

Вместо этого разбейте ее на несколько под-проблем. С ними гораздо легче справиться.

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

Когда решите все под-проблемы, соедините точки.

Объединение всех ваших «под-решений» даст вам решение начальной проблемы. Мои поздравления!

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

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

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

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

Упрощайте проблему до уровня, на котором вы будете знать, как ее решить, и запишите решение. Затем немного расширьте проблему и перепишите решение, чтобы оно подходило к изменившимся условиям. Продолжайте, пока не вернетесь к тому, с чего начали», — Антон Спрол.

4. Застопорились?

К этому моменту вы, наверное, сидите и думаете: «Эй, Ричард… Это классно и все такое, но что если я застрял и не могу решить под-проблему?»

Во-первых, дышите глубоко. Во-вторых, не переживайте. Это со всеми случается!

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

Фактически, есть три вещи, которые можно попытаться сделать, повстречавшись с такой напастью:

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

«Искусство отладки в том, чтобы понять, что именно вы велели делать вашей программе, в противовес тому, что, по вашему мнению, вы ей велели делать», – Эндрю Сингер.

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

«Порой мы настолько теряемся в деталях проблемы, что упускаем основные принципы, которые решили бы проблему на более общем уровне.

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

Примечание: другой способ сделать переоценку – начать заново. Удалить все и начать снова со свежей головой. Я серьезно. Вы удивитесь, узнав, насколько это эффективно.

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

Предостережение: не ищите решение большой проблемы. Ищите решение под-проблем. Почему? Потому что без борьбы (даже маленькой) вы ничему не научитесь. А если вы не учитесь, вы зря тратите свое время.

Практика

Не стоит ожидать отличных результатов после первой же недели. Если вы хотите стать хорошим специалистом по решению проблем, решайте их побольше!

Практика. Практика. Практика. Пройдет какое-то время, прежде чем вы сможете распознавать, что «эта проблема легко решается с помощью <вставьте сюда нужный способ>».

Как практиковаться? Есть множество вариантов!

Шахматные задачи, математические проблемы, судоку, гоу, «Монополия», видеоигры – список бесконечен.

Фактически, успешных людей объединяет их привычка практиковаться в решении «микропроблем». Например, Питер Тиль играет в шахматы, а Илом Маск – в видеоигры.

«Байрон Ривз сказал, что если вы хотите увидеть, как может выглядеть лидерство в бизнесе через 3-5 лет, посмотрите, что происходит в онлайн-играх.

Вернемся к сегодняшнему дню. Илон [Маск], Рид [Хоффман], Марк Цукерберг и многие другие говорят, что игры были основой их успеха в построении их компаний», — Мэри Микер (2017 internet trends report).

Говорит ли это о том, что вы должны лишь играть в видеоигры? Вовсе нет.

Но что такое видеоигры? Верно, это решение проблем!

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

Например, мне нравятся задачи на написание кода. Я стараюсь решать хотя бы одну ежедневно (обычно на Coderbyte).

Как я уже сказал, все проблемы укладываются в общий шаблон.

Заключение

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

Фух! Здорово, правда?

Наконец, я хочу пожелать вам повстречаться со многими проблемами. Вы правильно прочитали. Теперь-то вы знаете, как их решать! К тому же, с каждым новым решением вы будете учиться и совершенствоваться.

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

Жизнь это процесс преодоления препятствий – череды линий обороны, которые мы должны прорывать.

Каждый новый случай учит вас чему-нибудь.

С каждым разом ваша сила, мудрость и умение видеть перспективу возрастают.

С каждым разом отсеивается немножко конкурентов. Так происходит, пока не останетесь только вы – ваша усовершенствованная версия», – Райан Холидей (The Obstacle is the Way).

А теперь – вперед, к решению проблем! И удачи вам в этом.



ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here