Если вы интересуетесь программированием, возможно, вы уже видели эту цитату раньше:
«Каждый в этой стране должен научиться программировать компьютер, потому что он учит думать». - Стив Джобс
Вы, наверное, также задавались вопросом, что именно значит думать как программист? И как этому научиться ??
По сути, все дело в более эффективном способе решения проблем .
В этом посте моя цель - научить вас этому.
К концу вы будете точно знать, какие шаги нужно предпринять, чтобы лучше решать проблемы.
Почему это важно?
Решение проблем - это мета-навык.
У всех есть проблемы. Серьезные и не совсем. То, как мы с ними справляемся, иногда, довольно случайное событие.
Если у вас нет системы, вероятно, вы «решаете» проблемы следующим образом (что я и делал, когда начинал писать код):
- Пробуете найти решение.
- Если оно не срабатывает, пробуете другое.
- Если и оно не срабатывает, повторяйте шаг 2, пока вам не повезет.
Бывает такое, что тебе везет, но это худший способ решения проблем! И пустая трата времени.
Лучший способ - это иметь структуру решения проблемы и практиковать ее.
«Практически все работодатели в первую очередь отдают предпочтение навыкам решения проблем.
Навыки решения проблем почти единодушно являются наиболее важной квалификацией, которую ищут работодатели больше, чем знание языков программирования, отладку и системное проектирование.
Демонстрация вычислительного мышления или способности разбирать большие сложные задачи столь же ценно (если не больше), чем базовые технические навыки, необходимые для работы ». - Hacker Rank ( Отчет о навыках разработчиков за 2020 г. )
«Самая большая ошибка, которую делают новички, - это сосредоточение внимания на изучении синтаксиса, а не на том, как решать проблемы». - В. Антон Спраул
Итак, что делать, если вы столкнулись с новой проблемой?
1. Понятие задачи
Точно знайте, о чем спрашивают. Большинство сложных проблем сложны, потому что вы их не понимаете.
Как узнать, что вы понимаете проблему? Когда вы можете объяснить это на простом языке.
Вы помните, как застряли на проблеме, начинаете ее объяснять и сразу видите дыры в логике, которых не видели раньше?
Большинству программистов знакомо это чувство.
Вот почему вы должны записать свою проблему, нарисовать схему или рассказать об этом кому-нибудь (некоторые также используют метод резиновой уточки ).
«Если вы не можете объяснить что-то простым языком, значит, вы этого не понимаете». - Ричард Фейнман
2. План
Не погружайтесь в решение задачи без плана. Спланируйте свое решение!
Ничего не поможет, если вы не сможете записать точные шаги.
Дайте своему мозгу время проанализировать проблему и обработать информацию.
Чтобы получить хороший план, ответьте на этот вопрос:
«Учитывая вход X, какие шаги необходимо сделать, чтобы вернуть выход Y?»
Примечание: у программистов есть отличный инструмент, чтобы помочь им в этом… Комментарии!
3. Разделите основную задачу на подзадачи
Это очень важный шаг. Не пытайтесь решить одну большую проблему, это будет гораздо сложнее и вы скорее всего запутаетесь.
Вместо этого разбейте задачу на подзадачи. Эти подзадачи решить гораздо проще.
Затем решайте каждую подзадачу одну за другой. Начиная с самой простой. Самая простая означает, что вы знаете ответ (или находитесь близко к нему).
После этого самая простая означает, что решение этой подзадачи не зависит от решения других.
Решив каждую подзадачу, соедините точки.
Соединение всех ваших «дополнительных решений» даст вам решение исходной проблемы. Поздравляю!
«Если бы я мог научить каждого начинающего программиста одному навыку решения проблем, это был бы метод «уменьшения проблем».
Например, предположим, что вы программист новичок, и вас попросили написать программу, которая считывает десять чисел и вычисляет, какое число является третьим по величине. Для новичка в программировании это может оказаться непростой задачей, даже если для этого требуется только базовый синтаксис программирования.
Если вы застряли, вам следует свести проблему к чему-нибудь попроще. А как насчет того, чтобы найти наибольшее число вместо третьего по величине? Все еще слишком трудно? А как насчет того, чтобы найти наибольшее из трех чисел? Или больший из двух?
Сведите проблему к тому, что вы будете знать как ее решить, и напишите решение. Затем немного расширьте проблему и перепишите решение, чтобы оно соответствовало, и продолжайте, пока не вернетесь к тому, с чего начали ». - В. Антон Спраул
4. Что делать если я не могу решить подзадачу?
К этому моменту вы, вероятно, сидите и думаете: «Это все конечно круто, но что, если я застрял и не могу даже решить подзадачу ??»
Во-первых, сделайте глубокий вдох, не волнуйтесь, это случается со всеми!
Разница в том, что лучшие программисты больше интересуются ошибками и больше думают над тем как решить ее, нежели раздражаются.
На самом деле, вот три вещи, которые нужно попробовать перед тем, как снова приступить к обдумыванию решения:
- Отладка: шаг за шагом исследуйте свое решение, пытаясь найти, где вы ошиблись. Программисты называют это отладкой.
«Искусство отладки - это выяснить, что вы на самом деле сказали своей программе, а не то, что, как вы думали, вы сказали ей делать». - Эндрю Сингер
- Переоценка: сделайте шаг назад. Взгляните на проблему с другой стороны. Есть ли что-нибудь, что можно абстрагировать до более общего подхода?
«Иногда мы настолько теряемся в деталях проблемы, что упускаем из виду общие принципы, которые позволили бы решить проблему на более общем уровне. […]
Классическим примером этого, конечно же, является суммирование длинного списка последовательных целых чисел 1 + 2 + 3 +… + n, которое очень молодой Гаусс быстро понял, это просто n (n + 1) / 2, что позволяет избежать усилие, необходимое для складывания всех чисел ».
- К. Джордан Болл
Примечание: еще один способ переоценки - начать все сначала. Удалите все и начните заново свежим взглядом. Я серьезно. Вы будете ошеломлены тем, насколько это эффективно.
- Исследование: Ах, старый добрый Google. Вы правильно прочитали. Независимо от того, какая у вас проблема, наверняка кто-то ее решил. Найдите этого человека / решение. Фактически, сделайте это, даже если вы решили проблему! (Вы можете многому научиться на решениях других людей).
Предупреждение: не ищите решения большой проблемы. Ищите решения только для подзадач. Почему? Потому что, если вы не будете бороться (даже немного), вы ничему не научитесь. Если вы ничему не научитесь, вы зря потратите время.
Практика
Не ожидайте, что вы станете успешным уже через неделю. Если вы хотите хорошо решать проблемы, решайте кучу проблем!
Практика. Практика. Практика. Это будет лишь вопросом времени, когда вы поймете, что «эту проблему можно легко решить с помощью <вставить концепцию сюда>».
Как практиковаться?
Шахматные головоломки, математические задачи, судоку, монополия, видеоигры и т.д.
На самом деле, среди успешных людей распространена привычка практиковать «решение микропроблем». Например, Питер Тиль играет в шахматы, а Илон Маск - в видеоигры.
«Байрон Ривз сказал:« Если вы хотите увидеть, как может выглядеть бизнес-лидерство через три-пять лет, посмотрите, что происходит в онлайн-играх ».
Перенесемся в сегодняшний день. Илон [Маск], Рид [Хоффман], Марк Цукерберг и многие другие говорят, что игры стали основой их успеха в построении своих компаний ». - Мэри Микер
Значит ли это, что вам нужно просто играть в видеоигры? Нет.
Но что такое видеоигры? Правильно, решение проблем!
Итак, что вам нужно сделать, это найти выход для практики. То, что позволяет решать множество микропроблем (в идеале, то, что вам нравится).
Например, мне нравится программировать. Каждый день я пытаюсь решить хотя бы одну задачу (обычно на Coderbyte ).
Как я уже сказал, все проблемы имеют схожие закономерности.
Заключение
Вот и все, ребята!
Теперь вы лучше знаете, что значит «думать как программист».
Вы также знаете, что решение проблем - это невероятный навык, который нужно развивать (мета-навык).
Так же обратите внимание на то, как вы практикуете свои навыки решения проблем и практикуете ли вообще? Если нет, то вам стоит попробовать!
Наконец, желаю вам столкнуться с множеством проблем.
Вы правильно прочитали. Только сталкиваясь с проблемами вы сможете научиться программированию.
«Когда вы думаете, что успешно преодолели одно препятствие, возникает другое. Но это то, что делает жизнь интересной. […]
Жизнь - это процесс преодоления этих препятствий - серии укрепленных линий, которые мы должны преодолеть.
Каждый раз вы узнаете что-то новое.
Каждый раз вы будете развивать ум, становиться мудрее.
С каждым разом конкуренция немного уменьшается. Пока не останетесь только вы: лучшая версия вас ». - Райан Холидей ( Препятствие - это путь )
А теперь идите решите несколько проблем!