«В январе 2019 года я взял на себя обязательство научиться программировать на Python, широко используемом объектно-ориентированном языке программирования…

…за последние 300 дней я изучил множество различных ресурсов для изучения программирования, в том числе: создание сайтов для «геймификации»; МООК (массовые открытые онлайн-курсы); техническая документация, журналы, книги, подкасты и видеоуроки. Ни один ресурс не был полезен с самого начала и до конца моего учебного пути, но некоторые из них были полезны в определенное время. Помимо отдельных ресурсов, я хотел бы поделиться некоторыми принципами обучения, которые я считаю полезными и которые можно применить к любому языку программирования.

У меня беспокойная семейная жизнь, маленький ребенок и работа на полную ставку. Мне нужно было использовать гибкие ресурсы самообучения, которые можно было вписать в непредсказуемый график. Из-за этого любое интенсивное обучение в стиле «учебного лагеря» было исключено, и моя связь в реальном времени с другими учениками или наставниками была ограничена; поскольку я не мог предсказать время суток, я сидел и кодировал.

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

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

  1. Превратите программирование в привычку

"Мы делаем то, что постоянно делаем. Таким образом, совершенство — это не действие, а привычка».

- Аристотель (384–322 до н. э.)

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

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

Я обнаружил, что важно ежедневно погружаться в код, чтобы продолжать двигаться вперед, несмотря на жизненные отвлекающие факторы. Активное обучение (обучение действием) было основной стратегией, которую я использовал. Обычно это включало ввод кода в редактор кода, запуск его и надежду, что он сработает (и попытку понять, почему, если это не так!).

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

Я обнаружил, что учиться понемногу каждый день гораздо эффективнее, чем запихивать код в выходные; этот постепенный подход хорошо подтверждается исследованиями в области когнитивной психологии, преимущества обучения от регулярной практики по сравнению с зубрежкой хорошо известны, см.: A Mind for Numbers (Oakley, B., 2014). Принятие кода в конечном итоге стало таким же автоматическим, как чистка зубов, требующим небольшой силы воли, запасы которой, как мы все знаем, ограничены!

Если вас интересует, как формируются и поддерживаются привычки, я настоятельно рекомендую: The Power of Habit(Duhigg, C., 2012), в котором обсуждается, как вести форум и поддерживать положительные привычки.

2. Найдите сообщество

Чтобы укрепить мою ежедневную привычку писать код, я нашел огромное сообщество в Твиттере, которое поддерживало меня вокруг задачи #100DaysOfCode (Спасибо Александру Каллауэю — внешний веб-сайт)

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

3. Выберите один язык программирования и придерживайтесь его, пока не освоите основы

Если вы новичок в программировании, не отвлекайте внимание, переключаясь между языками программирования. Научитесь программировать, применяя принципы одного языка. Как только вы освоите основы программирования (например, циклы, операторы if/else, различные типы данных), которые по большей части не зависят от языка, вам будет намного проще изучать другие языки.

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

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

Если вы хотите начать с языка программирования, который относительно прост в освоении, широко используется в академических кругах и бизнесе, имеет множество обучающих ресурсов, является мощным и бесплатным — попробуйте Python :-)

4. Не попадитесь в ловушку учебника «Бермудский треугольник»

Мое знакомство с программированием на Python было серией видео и лекций от Dr. Чарльз «Чак Северанс», на платформе Coursera. Я нашел это, чтобы быть удивительным введением как полный новичок. Доктор Чак — фантастический учитель, и он сделал обучение кодированию приятным, разбивая концепции с помощью полезных объяснений и аналогий.

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

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

Я нашел этот совет в субреддите r/learnprogramming (еще один отличный ресурс для изучения кода):

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

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

Я решил работать через: Подумайте о Python! (2nd Edn), (Downey, A., 2016), который является довольно всеобъемлющим и предлагает мне соответствующие уровни сложности для поддержки перехода от начинающего программиста к программисту среднего уровня. Я систематически работал над книгой и упражнениями, пока у меня не было достаточного понимания основ кодирования, чтобы начать свои собственные проекты.

5. Создайте что-нибудь

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

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

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

Однако процесс попытки создать проект привел к взрыву новых знаний; включая новые методы достижения желаемого результата.

Совершение ошибок побудило меня пересмотреть принципы и концепции, которые, как мне казалось, я «знал» из руководств. Окли (2014) описывает опасность «иллюзии компетентности», когда знакомство с материалом и знакомство с ним заставляют нас думать, что мы действительно понимаем предмет. Я был знаком с большим количеством синтаксиса и структуры из руководств, но создание чего-то с нуля действительно подчеркивало мои собственные иллюзии компетентности и побуждало к более глубокому пониманию и улучшениям в моем прогрессе кодирования.

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

Все мое изучение кода теперь сосредоточено вокруг конкретных проектов, если я не знаю, как встроить какую-то функциональность в свой код, я использую Google и лучшего друга программистов: stack-overflow.com. Затем я дополняю свои существующие знания этим новым обучением.

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

6. Читайте код других программистов

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

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

– Неизвестно (Цитируется по Conway, 2005 г.)

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

7. Отслеживайте свое обучение

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

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

Я создал репозиторий Github(онлайн-сайт для хранения кода и совместной работы)и начал заполнять его блокнотами Jupyter Notebooks,каждый из которых посвящен определенному конкретная область концепций Python.

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

Наряду с каждой темой я создал банки тестовых вопросов, которые требовали от меня написания управляемых фрагментов кода, основанных на этой тематической области. После изучения определенной темы и ответов на вопросы по материалу я записываю результаты, чтобы отслеживать прогресс с течением времени, и помещаю все, что я выучил, в график интервальных повторений — календарь для просмотра того, что я выучил через 7, 14, 28 дней. и не только.

Когда я вернулся к своим блокнотам для кодирования в соответствующий день, я снова не стал пассивно перечитывать их, поскольку активное вспоминание (ответы на вопросы, основанные на материале) в сочетании с преднамеренной практикой в ​​областях, которые вы считаете наиболее трудными, гораздо эффективнее. Если вам интересно узнать об этом больше, я рекомендую книгу Make it Stick (Brown et al, 2014).

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

Итак, научился ли я программировать?

Что ж… Я учусь программировать уже почти год(300 «в основном» дней подряд, 457 часов), и, по правде говоря, я только начинаю. Есть так много всего, что нужно понять, усвоить и применить, и меня это устраивает. Я не верю, что кто-то когда-либо заканчивал учиться кодировать, мы все находимся где-то на континууме способностей от новичка до эксперта.

Сказав это, я доволен своим прогрессом: у меня есть четкое понимание основ Python, и, по крайней мере, я чувствую уверенность (если еще не компетентность), что могу начать строить что угодно с моими текущие знания; учитывая достаточное количество времени, поиск с переполнением стека и черный кофе!

Одна из лучших статей об обучении кодированию, которую я нашел, написана Питером Норвигом, директором по исследованиям в Google и соавтором Стюарта Рассела ИИ: современный подход. Статья Питера озаглавлена:Научитесь программировать за десять лет и частично была написана как контраргумент к статье Научитесь программировать за 24 часа. заблуждение, которое так широко распространено в культуре.

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

"Как насчет того, чтобы усердно работать над постоянным улучшением в течение 24 месяцев? Что ж, теперь вы начинаете что-то понимать…”

Норвиг, П

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

Огромное спасибо всем, кто поддерживал меня последние 300 дней :-)

Росс.

Заявление о раскрытии информации/позиционировании:

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