Мыслить как программист - уроки о решение проблем

Мыслить как программист - уроки о решение проблем

Nuances of programming

Перевод статьи Richard Reis: How to think like a programmer — lessons in problem solving

Если вы интересуетесь программированием, то скорее всего вы слышали эту цитату:

Возможно, вы думали над тем, что же это значит, мыслить, как программист? И как вы можете это делать??

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

В этой статье моя цель научить вас этому.

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

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

Умение решать проблемы это навык, который всегда пригодится.

Все мы имеем проблемы. Большие или маленькие. Наше решение проблем иногда бывает совершенно случайным...

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

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

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

Лучший способ включает в себя наличие фреймворка и практики с ним.

Иметь фреймворк

Для того, чтобы найти правильный фреймворк, я следовал совету из книги "4-ёх часовой шеф-повар" Тима Ферриса.

Это привело меня к интервью с двумя по-настоящему впечатляющими людьми.

Джордан Болл(первый или второй ранг из 65,000+ пользователей на Coderbyte) и Энтон Спроул(автор книги "Думай как программист. Знакомство с креативным решением проблем").

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

Скоро вы тоже их узнаете.

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

Так что же вы должны делать, когда встречаете новую проблему?

Вот шаги, которые вы должны предпринять:

1. Понимание

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

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

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

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

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

2. План

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

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

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

Чтобы получить хороший план, ответьте на вопрос:

"Даётся ввод Х, какие нужны шаги, чтобы вернуть вывод Y?"

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

3. Разделение

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

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

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

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

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

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

Объединение всех ваших решений поменьше даст вам решение оригинальной проблемы. Поздравляю!

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

4. Застряли?

Сейчас, вы, наверное, сидите там и думаете: "Ричард, это всё, конечно, прикольно и всё такое, но что если я застрял и не могу решить даже мелкую проблему??"

Во-первых, вздохните поглубже. Во-вторых, это справедливое замечание.

Не волнуйтесь, друзья, такое случается со всеми.

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

Есть три вещи, которые вам следует попробовать, когда вы встретились с тяжёлой проблемой:

  • Дебаггинг. Попробуйте пройти шаг за шагом в вашем решении, чтобы найти место, где что-то идёт не так. Программисты зовут это дебаггингом(и, в общем говоря, это всё, что делает дебаггинг).
  • Переоценка. Шагните назад, посмотрите на проблему с другой перспективы. Есть ли что-то, что можно отнести к более общему подходу?

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

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

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

Практика

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

Практика, практика и ещё раз практика. Это только дело времени, когда вы поймёте, что "эта проблема могла быть решена намного проще с помощью <вставьте_здесь_название_концепции>."

Как практиковаться? Есть куча вариантов!

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

Обычное поведение для успешных людей - это их привычка практиковаться в "решение мелких проблем". Например, Питер Тиль играет в шахматы, а Илон Маск в видеоигры.

Значит ли это, что вам просто нужно играть в видеоигры? Конечно же нет.

Но о чём вообще видеоигры? Правильно, о решение проблем!

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

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

Как я говорил, у всех проблем схожие шаблоны.

Заключение

На этом всё, ребята!

Теперь вы лучше знаете, что значит "мыслить как программист".

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

Если этого было недостаточно, то обратите внимание на то, что теперь вы ещё и знаете как улучшить свои навыки решения проблем!

Фух, достаточно круто, не правда ли?

Ну и наконец, я надеюсь вы повстречаетесь с моими проблемами.

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

А теперь идите и решите пару проблем!

И побольше вам удачи (:

Статью перевёл Дмитрий Хирш