Перевод статьи Richard Reis: How to think like a programmer — lessons in problem solving
Если вы интересуетесь программированием, то скорее всего вы слышали эту цитату:
"Каждый в этой стране должен учиться программировать компьютер, потому что это учит вас думать." - Стив Джобс
Возможно, вы думали над тем, что же это значит, мыслить, как программист? И как вы можете это делать??
Почти всегда это о более эффективном способе решения проблем.
В этой статье моя цель научить вас этому.
К концу статьи вы узнаете какие шаги вам нужно предпринять, чтобы начать лучше решать свои проблемы.
Почему это важно?
Умение решать проблемы это навык, который всегда пригодится.
Все мы имеем проблемы. Большие или маленькие. Наше решение проблем иногда бывает совершенно случайным...
Если только у вас нет устоявшейся системы, то это, скорее всего, ваш способ "решения" проблем(так делал и я, когда только начинал кодить):
- Попробовать решение.
- Если это не сработало, попробовать другое.
- Если это не сработало, то повторять шаг 2, пока не повезёт.
И иногда вам всё-таки везёт. Но это наихудший способ решения проблем! И это огромнейшая трата времени.
Лучший способ включает в себя наличие фреймворка и практики с ним.
"Почти всегда у нанимателей первым в приоритете навыков стоит умение решать проблемы.Решение проблем почти единогласно наиболее интересный навык для нанимателей. Более важный, чем знание языка программирования, дебаггинга или конструкции системы.Демонстрация вычислительного мышления или способность решать большие, сложные проблемы, настолько же важно(если не больше), как и обыкновенное владение техническими навыками, необходимыми для работы." — Hacker Rank (2018 Developer Skills Report)
Иметь фреймворк
Для того, чтобы найти правильный фреймворк, я следовал совету из книги "4-ёх часовой шеф-повар" Тима Ферриса.
Это привело меня к интервью с двумя по-настоящему впечатляющими людьми.
Джордан Болл(первый или второй ранг из 65,000+ пользователей на Coderbyte) и Энтон Спроул(автор книги "Думай как программист. Знакомство с креативным решением проблем").
Я задал им одинаковые вопросы и знаете что? Их ответы были очень похожи!
Скоро вы тоже их узнаете.
Примечание: это не значит, что они всё делали одним способом. Каждый отличается. Вы отличаетесь. Но если вы начнёте с принципов, которые мы все считаем хорошими, то продвинетесь дальше куда быстрее.
"Самая большая проблема, которую допускают новые программисты - это фокусирование на изучении синтаксиса, вместо того, чтобы решать проблемы." - Энтон Спроул
Так что же вы должны делать, когда встречаете новую проблему?
Вот шаги, которые вы должны предпринять:
1. Понимание
Понимайте, что у вас спрашивают. Большинство сложных проблем сложные по той причине, что вы их не понимаете(следовательно поэтому они и сложные).
Как узнать, что вы понимаете проблему? Когда вы её понимаете - вы можете её объяснить на своём языке.
Помните ли вы, как когда вы застряли на чём-то и пытаетесь это объяснить, то сразу видите пробелы в логике, которые не замечали до этого?
Большинство программистов знают это чувство.
Поэтому вы должны записать вашу проблему, набросать диаграмму или рассказать кому-нибудь об этом(или чему-нибудь... некоторые люди используют метод резиновой утки).
Если вы не можете объяснить что-то простыми словами - вы это не понимаете. - Ричард Файнман
2. План
Не бросайтесь прямо в решение без плана(надеясь, что вы кое-как сможете решить вашу проблему). Создайте план для своего решения.
Ничто не может вам помочь, если вы не запишете точные шаги.
В программирование это значит не лететь напролом к решению проблемы. Дайте своему мозгу время для анализирования проблемы и обработки информации.
Чтобы получить хороший план, ответьте на вопрос:
"Даётся ввод Х, какие нужны шаги, чтобы вернуть вывод Y?"
Примечание: У программистов есть великолепный инструмент для этого - комментарии!
3. Разделение
Обратите внимание. Это самый важный шаг из всех.
Не пытайтесь решить одну большую проблему, вам же хуже.
Вместо этого, разбейте это на проблемы поменьше. Таким образом вашу задачу будет гораздо легче решить.
Далее просто решите каждую меньшую проблему одну за другой, начиная с самой простой. Самая простая значит, что вы знаете ответ(или близки к ответу).
Также это значит, что решение этой проблемы не зависит от решения других.
Когда вы решили все мелкие проблемы - объедините всё в одно целое.
Объединение всех ваших решений поменьше даст вам решение оригинальной проблемы. Поздравляю!
Этот шаг краеугольный камень решения проблем. Запомните это(и прочитайте заново, если не уверены, что запомнили).
"Если бы вы могли научить каждого начинающего программиста одному умению для решения проблем, то это была бы 'техника уменьшения проблемы'.Представьте, что вы начинающий программист и вас просят написать программу, которая читает 10 чисел и выясняет, какое число третье наибольшее. Для совершенно нового программиста это может быть тяжёлое поручение, даже не смотря на то, что оно требует знаний только базового синтаксиса.Если вы застряли, то вам стоит уменьшить проблему до чего-нибудь попроще. Вместо того, чтобы находить третье наибольшее число, почему бы не найти просто самое большое? Всё ещё сложно? Тогда что на счёт того, чтобы найти самое больше из трёх чисел? Или из двух?Уменьшите проблему до той точки, когда вы сможете придумать и написать для неё решение. Затем расширьте проблему немного и перепишите ваше решение. И так до тех пор, пока вы не вернётесь туда, с чего начали." - Энтон Спроул
4. Застряли?
Сейчас, вы, наверное, сидите там и думаете: "Ричард, это всё, конечно, прикольно и всё такое, но что если я застрял и не могу решить даже мелкую проблему??"
Во-первых, вздохните поглубже. Во-вторых, это справедливое замечание.
Не волнуйтесь, друзья, такое случается со всеми.
Разница в том, что лучшие программисты больше любопытны о природе бага/ошибки, чем раздражены.
Есть три вещи, которые вам следует попробовать, когда вы встретились с тяжёлой проблемой:
- Дебаггинг. Попробуйте пройти шаг за шагом в вашем решении, чтобы найти место, где что-то идёт не так. Программисты зовут это дебаггингом(и, в общем говоря, это всё, что делает дебаггинг).
"Искусство дебаггинга - это понять, что вы действительно сказали программе сделать вместо того, что вам казалось, что вы ей сказали." - Эндрю Сингер
- Переоценка. Шагните назад, посмотрите на проблему с другой перспективы. Есть ли что-то, что можно отнести к более общему подходу?
"Иногда мы теряемся в деталях проблемы и забываем об общих принципах, которые могут решить проблему на более общем уровне. [...]В качестве классического примера можно привести метод математической индукции для ряда возрастающих чисел. 1 + 2 + 3 + ... + n. Решением может послужить формула n(n+1)/2, которая поможет нам избежать бесконечного сложения чисел." - Джордан Болл
Примечание: другой способ переоценки - это начать заново. Удалить всё и начать заново со свежими мыслями. Я серьёзно. Вы будете удивлены тому, насколько это эффективно.
- Поиски. Хороший добрый гугл всегда поможет. Вы прочитали это верно. Не важно, какая у вас проблема, скорее всего кто-то её уже решил. Найдите этого человека/решение. Вообще, делайте это, даже если вы уже нашли решение!(вы можете узнать много нового из решений других людей).
Предостережение: не ищите решений для больших проблем. Ищите только для маленьких проблем. Почему? Потому что пока вы не повозитесь со своей проблемой(даже немного), вы ничему не научитесь. Если вы ничему не учитесь, то вы тратите время впустую.
Практика
Не ожидайте стать самым лучшим спустя одну неделю. Если вы хотите хорошо решать проблемы, то решайте много проблем!
Практика, практика и ещё раз практика. Это только дело времени, когда вы поймёте, что "эта проблема могла быть решена намного проще с помощью <вставьте_здесь_название_концепции>."
Как практиковаться? Есть куча вариантов!
Шахматные задачи, математические проблемы, Судоку, Го, Монополия, видеоигры и бла-бла-бла...
Обычное поведение для успешных людей - это их привычка практиковаться в "решение мелких проблем". Например, Питер Тиль играет в шахматы, а Илон Маск в видеоигры.
"Байрон Ривс сказал: 'Если вы хотите увидеть, как может выглядеть бизнес-лидерство в течении трёх-пяти лет, то посмотрите, что происходит с онлайн-играми.'Быстрая аналогия для сегодняшнего дня. Илон Маск, Рэид Хоффман, Марк Цукерберг и многие другие говорят, что игры были основанием для их успеха в построении компаний." - Мэри Микер (2017 internet trends report)
Значит ли это, что вам просто нужно играть в видеоигры? Конечно же нет.
Но о чём вообще видеоигры? Правильно, о решение проблем!
Поэтому то, что вам нужно найти - это способ попрактиковаться. Что-то, что поможет вам решать большое количество маленьких проблем(в идеале то, от чего вы получаете удовольствие).
Например, я люблю решать программистские задачки. Каждый день я пытаюсь решить как минимум одну задачку(обычно на Coderbyte).
Как я говорил, у всех проблем схожие шаблоны.
Заключение
На этом всё, ребята!
Теперь вы лучше знаете, что значит "мыслить как программист".
Вы также знаете, что решение проблем это невероятное умение, чтобы его культивировать(всегда необходимое умение).
Если этого было недостаточно, то обратите внимание на то, что теперь вы ещё и знаете как улучшить свои навыки решения проблем!
Фух, достаточно круто, не правда ли?
Ну и наконец, я надеюсь вы повстречаетесь с моими проблемами.
Вы прочитали это правильно. По крайней мере теперь вы знаете, как их решить!(а также узнаете, что с каждым решением вы становитесь лучше).
"Прямо когда вы думали, что успешно обошли одну проблему, обязательно появится другая. Но это то, что делает жизнь интересной.[...]Жизнь - это процесс прохождения через эти препятствия. Череда укреплённых линий, через которые мы должны пробиться. И каждый раз вы будете чему-то учиться.Каждый раз вы будете развивать силу, ум и перспективу.Каждый раз, всё больше испытаний будет отпадать. До тех пор, пока не останется только лучшая версия вас." - Райан Холидей (Препятствия - это путь)
А теперь идите и решите пару проблем!
И побольше вам удачи (:
Статью перевёл Дмитрий Хирш