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

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

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

Нельзя сказать, что повторение не имеет значения; оно делает. Однако одно лишь повторение не раскрывает сути дела. Процесс делает.

У меня есть личный интерес к этой теме: я хочу научиться лучше решать проблемы, чтобы совершенствоваться как программист. Итак, я предлагаю свой план атаки. Безусловно, здесь задействованы представители - и многое другое.

1. Решайте множество задач на различных платформах.

«Я был одержим HackerRank, когда начал учиться программировать», - сказал преподаватель курса Python, который я проходил. Хотя иметь любимую платформу - это нормально, не ограничивайте себя одной. И вот почему: нужно быть готовым ко всему.

Одна из моих целей - плавно переключаться между разными типами проблем и на разных платформах. Задачи на Interview Cake отличаются от задач в книге Реувена Лернера Python Workout. Точно так же я считаю, что формулировки проблем в Еженедельном упражнении Лернера по Python отличаются от формулировок в HackerRank.

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

Вот некоторые примеры:

  • LeetCode
  • Cracking the Coding Interview Гейл Лаакманн Макдауэлл
  • Упражнения
  • Торт для интервью
  • Python Workout, Реувен Лернер
  • Еженедельное упражнение на Python, Реувен Лернер

По воскресеньям, когда я составляю свой план на неделю вперед, я выбираю несколько задач из перечисленных выше ресурсов. Я обдумываю это. Например, я выберу задачу о двоичном поиске из LeetCode. Затем мы рассмотрим структуры данных из одного из источников Реувена Лернера.

Эта практика не дает мне слишком комфортно чувствовать себя. Я не могу полагаться на ту же структуру данных или технику. Мне нужно выбрать лучший инструмент для работы. Я должен уметь поворачиваться.

Это также бросает мне вызов. Это потому, что я выбираю проблемы, которые доводят меня до предела моих возможностей - особенность того, что психолог Андерс Эрикссон называет «осознанной практикой».

Сознательная практика - это все о развитии навыков. Это полностью сфокусированные, сознательные усилия, которые выводят вас из «зоны комфорта», сосредотачиваются на конкретной цели и «требуют почти максимальных усилий», - объясняет Эрикссон в своей превосходной книге Peak.

Другими словами, вы не выполняете движения, делая что-то легкое или естественное. «Отличительный признак. . . сознательная практика, - пишет Эрикссон, - заключается в том, что вы пытаетесь сделать то, что не можете сделать.

2. Тренируйте свой программистский мозг.

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

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

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

В моей нынешней книге по математике стоит отметить: Искусство решения проблем. Да, он обеспечивает упомянутые выше преимущества кросс-тренинга. Но он делает нечто большее: помогает мне развить интуицию для решения проблем.

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

3. Учитесь на своих решениях

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

Часто на этом обучение останавливается. Решив проблему, нам не терпится двигаться дальше. Но не надо.

Математик Ричард Хэмминг предполагает, что именно с этого и следует начинать обучение.

«Я считаю изучение успехов более важным, чем изучение неудач… есть так много способов ошибиться и так мало быть правым, изучение успехов более эффективно», - пишет Хэмминг в своей книге The Искусство заниматься наукой и разработкой.

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

Итак, одно из самых больших изменений, которые я внес в свой процесс решения проблем, - это применить слова Хэмминга на практике. Я хорошо помню решение своей первой проблемы, связанной со связанным списком, структурой данных, которая была для меня новой в то время. Решив проблему, я внимательно ее изучил. Я скопировал свое решение в файл Google Doc и использовал комментарии, чтобы объяснить себе код.

Я хотел убедиться, что четко понимаю что и почему по этой важной причине: чтобы я мог сделать это снова.

4. Получите обратную связь

Осведомленность может быть прекрасным учителем.

Не думайте, что ваши решения хороши. Убедитесь сами, получив обратную связь. Обратная связь - критический фактор, когда дело доходит до улучшения. Это также компонент осознанной практики.

Есть два способа получить обратную связь.

Сначала, решив задачу, я изучаю решения других. Иногда такие ресурсы, как LeetCode и Cracking the Coding Interview, предоставляют решение. В других случаях я нахожу решение программиста, который решил ту же проблему. Иногда используют и то, и другое.

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

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

Если есть что-то новое для меня, я исследую это. Я сравниваю их код со своим. Я учусь. Я оцениваю. Я учу. Это трудный процесс, но я так много получаю от него.

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

В обратной связи есть смысл: примените ее! Применяйте полученные знания на практике.

5. Будьте последовательны

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

На эту повседневную практику есть обычная реакция: «Слишком многому нужно научиться. Я не могу каждый день тратить время на решение проблем ».

Мой ответ двоякий. Во-первых, всегда есть чему поучиться, всегда.

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

Это искусство

Многие люди считают решение проблем искусством. Я согласен с этим мнением. То же самое можно сказать и о самом процессе.

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

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

Первоначально опубликовано на amymhaddad.com.