Развитие больших навыков программирования

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

Работа экспертов основана на постепенном развитии навыков

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

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

Продвинутые навыки программирования зависят от фундаментальных навыков программирования

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

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

Как овладеть фундаментальными навыками программирования

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

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

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

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

Есть две переменные, значения которых нужно поменять местами. Введите третью переменную, часто называемую временным значением, и присвойте ей значение первой переменной. Затем присвойте значение второй переменной первой переменной. Наконец, присвойте значение временной переменной второй переменной.

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

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

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

Изучение и практика передовых навыков программирования

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

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

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

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

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

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

Где найти проблемы для решения

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

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

Три из этих книг, которые я нашел полезными: Programming Interviews Exposed Джона Монгана и Ноя Киндлера; Cracking the Coding Interview Гейл МакДауэлл; и Daily Coding Problem Лоуренса Ву и Эндрю Миллера.

Вот два примера проблем из Daily Coding Problem, начиная с проблемы структуры данных, за которой следует проблема алгоритма:

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

Учитывая массив, состоящий исключительно из символов, R, G и B, разделите значения массива так, чтобы все символы R идут первыми, G идут вторыми, а B идут последними. Менять местами можно только элементы массива.

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

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

Опыт - это путешествие, а не пункт назначения

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

Первоначально опубликовано на https://thelearningprogrammer.com 9 февраля 2020 г.