В предыдущих статьях (Вы разве их не читали?) я поделился с Вами мыслями о подготовке к обучению и выборе направления обучения. Что ж, думаю, многие из Вас уже выбрали, какой язык будет целью и каким образом он будет изучаться. Вы сделали очень важную часть дела, но впереди долгий путь. И в этой статье я расскажу о том, как лучше осваивать новый язык программирования и эффективно закреплять полученные знания вне зависимости от того, сами Вы изучаете предмет или занимаетесь на курсах.
Путь ученика
Когда Вы учились в школе, процесс обучения был выстроен строго в соответствии с установленной стандартизированной программой обучения. Плохо это или хорошо, решать явно не мне, но в этом есть один интересный факт — Вы не задумывались о том, как учиться. В большинстве школ существовал понятный и обкатанный алгоритм: «Теория на уроке -> Решение практических задач -> Домашнее задание -> Контрольная -> Следующая тема». Как бы это странно ни звучало, но такой алгоритм имеет много общего с современными методиками разработки программного обеспечения, например, с DevOps.
В этой методологии жизненный цикл программы цикличен: сначала идет анализ существующего функционала (Результаты контрольной в школе), затем создаются требования к новому функционалу(Изучение новой темы), после разрабатывается код (Решение примеров + домашняя работа), потом прогоняются автоматические тесты новой функциональности (Контрольная работа) и в конце концов обновленное ПО подвергается повторному анализу (мы вернулись к первому шагу).
Как только Вы поступаете в институт, на Вас сваливается невиданная свобода. Кто-то поддаётся ей и испытывает проблемы с сессией, кто-то закапывается в учебниках, пропуская такой важный в жизни период, как студенческая жизнь. Так или иначе, строгий школьный процесс разрушается, уступая место собственным подходам. Но все они сводятся к ощутимому на коротком промежутке времени воздействию — экзаменационной сессии, а в долгосрочной перспективе — получению диплома о высшем образовании. Таким образом, у Вас остаётся мощный мотиватор, который явно говорит Вам, где находится Ваша цель и как она выглядит.
Но вот Вы получаете заветный диплом. Кто-то уже работает, кому-то только предстоит начать поиски работы. Система обучения здесь кардинально меняется. Она становится узконаправленной. Вы больше не изучаете, скажем, ряды Фурье. Вы изучаете применение в работе используемой в компании CRM или стандарты ведения финансовой отчетности. Цель остаётся, но она перестаёт быть универсальной и может быть совершенно бесполезной в других компаниях. Мотивация также меняется. На смену сессии приходит зарплата в качестве позитивной мотивации и риск увольнения в качестве нижней границы качества работы. Помимо этого, Вы можете ставить себе долгосрочные цели в развитии своей карьеры, которые будут нивелировать риск увольнения — Ваш опыт будет на определенном уровне гарантировать Вам трудоустройство в другой компании.
Так как же всё это связано с процессом обучения? Описанные мной примеры служат практическим отражением тех положений вещей, которым стоит следовать в процессе обучения. Как видите, жизнь уже предоставила Вам предостаточно ситуаций, из которых нужно выносить опыт и применять его для улучшения своих условий существования.
Школьный подход к обучению
Что можно взять из школьного опыта? Конечно же, регулярность и цикличность обучения. Я постоянно говорю своим студентам о том, что простое прослушивание курса или прочтение книги не делают из Вас программиста. Вам нужна практика, которая применяется на живых примерах. Возьмите для себя за правило заниматься 2-3 раза в неделю по 2-3 часа. Это вполне приемлемый график даже для тех, кто работает и уделяет время своей семье. Но отключитесь от мира — все раздражающие факторы должны быть максимально устранены. В психологии выделяется особенное состояние Вашего сознания — состояние потока. Состояние потока — это наилучшее состояние сознания человека, в котором он сосредоточен на выбранном занятии и погружен в него.
Я пишу эту статью в состоянии потока. У меня в ушах изолирующие внешний звук наушники, мобильный в беззвучном режиме, мессенджеры переведены в режим «не беспокоить», почта работает в фоне. Я максимально сосредоточен, чтобы передать Вам свои знания в наилучшем качестве. Также и Вы старайтесь находиться в состоянии потока в процессе обучения. О том, как оно достигается и удерживается, я могу написать в будущих статьях, если Вам это интересно.
Не учитесь через силу — это усугубит результат. Процесс должен приносить Вам удовольствие. Но будьте аккуратны. Где-то совсем рядом находится грань прокрастинации, за которой Ваш мозг будет всегда говорить Вам, что он не готов к обучению, но готов к играм в приставку или уборке рабочего стола!
Теперь немного о содержании занятий. Очевидно, что на первых неделях обучения Вы будете читать книги, технические руководства и реализовывать «Hello, World!» примеры. Но что делать, когда эта стадия пройдена? Здесь надо практиковаться много и также регулярно. Конечно, для новичка будет довольно сложно выдумать самому себе задачу, но в сети Интернет есть много полезных ресурсов для тренировки навыков на различных языках. Вы можете выбрать любой из понравившихся и подходящих Вам ресурсов. Вот некоторые из них:
- Codingbat — ресурс с задачами по Java и Python
- Topcoder — ресурс с практическими задачами на реализацию алгоритмов и решению приближенных к реальности бизнес-задач на время
- Codewars — ресурс с практическими задачами для разных языков программирования, разбитых по уровням сложности
- Hackerrank — ещё одна платформа с задачами на программирование
- Сheckio — игровая платформа при поддержке JetBrains для программистов JavaScript и Python
Регулярная практика на этих ресурсах позволит Вам увереннее ощущать себя в мире IT, решать реальные ненадуманные задачи и в скором времени выйти на рынок для получения своих первых заказов и предложений о работе.
Цикличность обучения также важна. Решая задачи, отмечайте технологии, которые пока Вам неизвестны, чтобы впоследствии изучить их, заполнив пробелы в знаниях. Смотрите на решения других программистов, сравнивая со своими. Будьте объективны и критичны к себе. Всегда ищите решение лучше, чем придумано Вами, но не зацикливайтесь на этом. Пользуйтесь принципом разумной достаточности. Алгоритм тут все тот же:
- Анализ уровня своих знаний, поиск пробелов
- Изучение новых областей, закрывающих пробелы в знаниях
- Применение знаний на практике
- Оптимизация решений, сравнение своих решений с чужими
- Переход к шагу 1
Институтский подход к обучению
Перейдём теперь к опыту обучения в институте. Несомненными плюсами в приведенном мной выше примере являются свобода выбора и четко сформированная цель.
В обучении программированию Вы вполне вольны выбирать, что именно Вам нужно. Не старайтесь изучить все модные технологии, которые встретите в описаниях вакансий на сайтах поиска работы. Вам необходимо сформировать некий начальный список технологий, которые требуются начинающему программисту. Посмотрите несколько вакансий на Junior-программиста или стажера, выделите те вещи, которые для них являются общими. Это и будет Ваш начальный список. Также Вы можете посоветоваться со старшими товарищами на тематических форумах — они наверняка дадут Вам дельные советы. Да, и не кормите троллей, которые гарантированно сбегутся пообсуждать навыки новичка — Вам ведь нужно учиться, а не спорить. Игнорируйте их едкие комментарии.
Полученный список непременно будет расти по мере Вашего обучения, если Вы будете следовать цикличному подходу к обучению, который я описал выше. Поэтому комбинируйте подходы и используйте лучшие практики обучения.
Обязательно сформируйте цель, которой хотите достичь. Студент стремится к диплому, гонщик ралли — к финишу, программист к работе в Google. Просто хотеть стать программистом — это не цель. Для постановки целей есть прекрасная методология SMART. Согласно ей цель должна быть следующей:
- Specific (Конкретной) — Вы знаете, чего хотите достичь. К примеру, «получить работу программиста».
- Measurable (Измеримой) — Вы знаете, как измерить результаты движения к своей цели. К примеру, «зарабатывать в месяц 100 тысяч рублей».
- Attainable, Achievable (Достижимой) — Вы понимаете шаги, которые нужно сделать для того, чтобы достичь цели. У Вас уже есть список навыков, материалы к обучению и практические задачи. В комплексе они дают пошаговые меры по достижению цели.
- Relevant (Актуальной) — Меры, применяемые для достижения целей должны быть действительно полезны. «Вам правда потребуется изучение данной технологии для того, чтобы начать зарабатывать деньги?»
- Time-bound (Ограниченной во времени) — Если не поставить себе сроки, то задача никогда не будет завершена. Ставьте сроки, соблюдайте их, пересматривайте их с течением времени (ведь обстоятельства могут измениться), но будьте строги и критичны сами к себе.

Я помогу Вам с постановкой первой цели. Согласно методологии SMART, хорошей целью будет «Изучить язык программирования N и заработать через полгода обучения 5000 рублей на первом заказе». Эта цель:
- Конкретно описывает, к чему Вы стремитесь. После неё вполне можно поставить более сложную цель.
- Вполне измерима, т.к. у Вас есть финансовый показатель
- Достижима, ведь Вы четко понимаете список технологий и точки закрепления знаний по ним
- Актуальна, ведь она позволит Вам добавить выполненную работу в своё портфолио и использовать для получения последующих заказов или прикрепления к резюме
- Имеет deadline в полгода — это нормальный срок вхождения в среду при активном, регулярном и цикличном изучении предмета
Рабочий подход к обучению
Рабочий подход к обучению подсказывает нам, что стоит выбирать для изучения технологии, которые помогут решить не только сиюминутные задачи, но помогут Вам в дальнейшем развитии. Здесь Вам надо применять стратегическое мышление. Те, кто читал мои предыдущие статьи, помнят, что я рекомендовал следить за трендами в IT, ведь в этом мире они сменяются просто молниеносно.
Будьте в курсе новых течений. Помимо форумов старайтесь читать такие ресурсы, как habrahabr, geektimes и прочие. Но не поддавайтесь резко растущим веяниям. В мире IT существуют фундаментальные основы и столпы, которые от года к году сохраняют свои уверенные позиции.
Даже если в процессе работы Вам приходится работать с узконаправленной технологией, не забывайте о том, что нужно узнавать новое постоянно. Уделяйте достаточно времени последующему самообучению. Совершенствуйте свои знания в выбранном направлении. Вполне реально изучить второй язык программирования.
Неплохой идеей будет завести свой блог, где Вы будете делиться своими новыми познаниями с миром. Не бойтесь критики, ведь в ней Вы сможете найти те свои ошибки, о которых и не догадываетесь.
Хорошая компания всегда заботится о развитии своих специалистов и мотивации их для работы в команде на протяжении долгих лет. Рынок IT имеет дефицит на качественные кадры, поэтому программист, который постоянно работает над уровнем и качеством своих знаний, всегда будет востребован компаниями. Также как и лояльный специалист, не меняющий место работы раз 3-6 месяцев. Компания не будет вкладывать ресурсы в человека, который уйдёт через полгода. Именно поэтому четко сформированные цели помогут и на работе. Вы должны понимать, чего хотите достичь в данной позиции. Вопрос «Кем Вы видите себя через пять лет?» должен задаваться не HR-специалистом, а программистом самому себе. SMART-цели применимы здесь как нельзя лучше.
Резюме aka TL;DR
- Изучайте программирование, создав для себя четкое расписание занятий: по 2-3 часа 2-3 раза в неделю
- Обучение должно приносить удовольствие и чувство удовлетворения
- Практикуйтесь в полученных знаниях много и в сложных задачах
- Анализируйте результаты своего обучения, всегда ищите лучшие решения и пробелы в знаниях
- Имейте чёткую SMART-цель и мотивацию
- Не стремитесь изучать всё подряд, выбирайте наиболее востребованные и необходимые технологии
- Постоянно совершенствуйтесь и имейте собственную стратегию развития своих профессиональных навыков
Надеюсь, моя статья поможет Вам улучшить свой процесс обучения, в котором я как всегда желаю Вам успехов!