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

Читатель Талал спрашивает:

У меня есть вопрос:

1. Исчисление с одной переменной (MIT)

2. Математика для информатики (MIT)

3. Гарвард CS 50 (Гарвард)

4. Введение в алгоритмы (MIT)

5. Проектирование и анализ алгоритмов (MIT)

6. Проблемы с практикой использования литкода

Достаточно ли этих курсов, если я хочу получить работу в крупной технологической компании?

Не будучи профессиональным программистом, я буду уклоняться от специфики вопроса Талала. (Хотя любой, у кого есть опыт, может высказаться!)

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

Основы обучения и обратное обучение

В целом, я думаю, что есть два способа мышления, которые вы можете применить к обучению:

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

Оба подхода хороши, но у них разные сильные и слабые стороны.

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

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

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

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

Когда следует начинать с основ?

Начинать с основ и игнорировать конкретные критерии теста лучше всего при высокой когнитивной нагрузке.

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

Когнитивная нагрузка не является фиксированной для предмета — она зависит от вашего предыдущего опыта. Знакомые паттерны не потребляют столько умственной пропускной способности, как незнакомые. Вот почему выучить десятое слово на новом языке гораздо труднее, чем выучить 1010-е. К тому времени, когда вы доберетесь до последнего, основные модели произношения и орфографии будут настолько знакомы, что слово «щелкает».

Некоторые предметы по своей природе имеют более высокую когнитивную нагрузку, чем другие.

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

Напротив, более мелкие элементы программирования, такие как конкретное написание отдельных функций, могут быть малонагруженными — вы можете подобрать их только при регулярном использовании.

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

Когда вы должны начать с результата?

Начинать с конкретных требований к тесту имеет смысл после того, как вы освоите основы. Этому есть две причины:

1. Знания, необходимые для выступления, выходят за рамки основ.

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

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

2. Применение знаний начинает доминировать в приобретении знаний.

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

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

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

Объединение стратегий

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

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

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