Эффективное обучение крайне важно для разработчика программного обеспечения, ведь постижение нового — значительная часть его работы. Умение быстро осваивать новые языки/фреймворки/инструменты сделает вас намного продуктивнее. Это своего рода суперспособность. Как ее приобрести? Читайте в тексте Джоша Комо, эксперта с многолетним опытом в разработке ПО, ИТ-блогера и автора обучающего курса «CSS для разработчиков JavaScript». В статье Джош описывает практики и рекомендации, которые помогут начинающим специалистам (например, студентам и тем, кто переходит в разработку из какой-либо другой области) в развитии их профессиональных навыков. Под катом — наш перевод англоязычного материала.  Обращаем ваше внимание, что позиция автора не всегда может совпадать с мнением МойОфис. Часто говорят, что Интернет демократизировал образование: вся сумма человеческих знаний открыта для нас в поиске Google! Однако доступ к знаниям — это только половина дела; необходимо также уметь преобразовывать сырую информацию в полезные навыки. Для большинства из нас разрыв между этими двумя понятиями может привести к настоящему учебному аду — застрять на пути, выполнять задание за заданием и не ощущать никакого прогресса. В этом посте я поделюсь тем, что узнал о процессе обучения, и покажу, как мне удается быстро усваивать новые навыки.  Для себя я выделил две основных категории обучения: «Управляемое». Чтение учебников, прохождение курсов, просмотр видео на YouTube. То есть процессы, в которых вы действуете согласно инструкциям. «Независимое». Создание собственных проектов с нуля, «расширение» учебников, поиск информации в документации. Все, что не предполагает следования руководствам. Если вы будете постоянно следовать инструкциям, то непременно окажетесь в учебном аду. Вы не сможете развить навыки решения проблем, необходимые для достижения успеха в качестве разработчика. А когда вы попытаетесь создать свой собственный проект, вы не будете знать, с чего начать. Вам будет казаться, что вы потратили уйму времени на практику и при этом не развили никаких заметных практических навыков. С другой стороны, если вы полностью сосредоточитесь исключительно на «независимом» обучении, то потратите на этот процесс целую вечность. Без опытного проводника вам придется изобретать каждое колесо заново, тратить дни и недели на решение уже решенных проблем. Это долгий и разочаровывающий путь. В худшем случае вы можете вообще бросить эту работу, будучи убежденным (ошибочно!), что вы просто недостаточно умны для этого. Наша задача — пройти по натянутому канату между двумя крайностями, использовать «управляемое» и «независимое» обучение как одно целое. Для этого существует множество способов, и вот некоторые из них. Вполне возможно, что вы, как и я, не любите совершать ошибки. Вам важно, чтобы все прошло идеально, с первого раза. В целом такой образ мышления полезен в различных областях жизни. Для автомеханика ошибки могут стоить сотни долларов, которые впоследствии придется тратить на запчасти. Ошибка стоматолога может испортить чью-то улыбку. А вот при разработке программного обеспечения ошибки не столь критичны. Если допущена ошибка, нужно лишь вернуться в редактор, изменить код и попробовать снова. Более того, в ходе работы появляются полезные сообщения об ошибках: иногда они могут указать правильное направление. Это невероятная роскошь, которой многие пользуются не в полной мере. Мне нравится играть с кодом, даже когда я следую инструкции. Вместо того чтобы копировать/вставлять предоставленный код дословно, стоит попробовать поэкспериментировать с ним: что произойдет, если пропустить одну из строк? Или изменить некоторые значения? Я стараюсь вести себя, как ученый. Если у меня есть гипотеза о том, как именно должен работать конкретный код, я проверяю эту гипотезу, видоизменяя код и проверяя, работает ли он так, как я ожидаю. Если я понимаю, что моя гипотеза ошибочна, я могу отклониться от руководства и провести ресерч в Google. Также я могу добавить задачу в список того, что следует изучить позже, — если кроличья нора кажется слишком глубокой. Этот процесс помогает избежать бездумного следования учебнику на автопилоте, то есть копипаста кода без реального понимания того, что он делает, и зачем вообще это нужно. Обучение — активный процесс. Покопавшись в коде, разработчик можно мысленно построить для себя модель происходящего. Много лет назад во время обучения я использовал метод под условным названием "исчезновение учебника". Вот как это работает: Дословно следуйте учебному материалу, продвигайтесь шаг за шагом.  Как только вы закончите ту или иную задачу, верните код в первоначальное состояние и отложите учебник.   Посмотрите, как далеко вы сможете продвинуться без учебника. Откройте его, когда вам покажется, что вы попали в тупик. Как только вы продвинетесь дальше, снова отложите учебник. Повторяйте этот процесс до тех пор, пока не сможете выполнить все упражнения из учебника, с первого до последнего, без подглядывания в инструкции. Как и упомянутый мной выше образ мышления ученого, этот процесс полезен тем, что развивает вашу внимательность. Учебник исчезает, и вы привыкаете работать самостоятельно, без подсказок. Этот метод невероятно эффективен, хотя не всем нравится писать один и тот же код снова и снова. Тем не менее, желающим выбраться из ада учебных пособий, возможно, стоит попробовать! Представьте, что вы изучаете React, создавая игру «Крестики-нолики», строго по учебному пособию. Вот вы добрались до конца учебника и создали полнофункциональную, но минималистичную игру.  Можно дополнить игру занимательными мелочами: Система отслеживания побед каждого игрока Более эффектный вид пользовательского интерфейса за счет различных визуальных элементов Возможность изменять размер игровой площадки (4х4, 5х5) Добавление искусственного интеллекта, против которого игрок может вести игру Любые фишки! (анимация, звуковые эффекты, взрыв конфетти при победе и прочее) Будьте креативными и дополняйте игру тем, что вам самим было бы интересно в ней увидеть. Эта стратегия интересна тем, что вы избегаете так называемого страха белого листа. У вас уже есть полнофункциональный понятный проект. Теперь вы лишь добавляете кирпичики для укрепления вашей постройки. Дополнительный плюс стратегии: если вы добавите в учебный проект то или иное значительное расширение, то сможете похвастаться этим в своем портфолио. Более подробно об этой стратегии я рассказываю в своей книге «Создание эффективного портфолио разработчика». По завершению проекта «Крестики-нолики» вы, возможно, будете в некотором недоумении: что же делать дальше? Прежде чем переходить к новой учебной практике, попробуйте создать похожий проект с нуля. Например, сделать игру под названием «Бинго»! Вы сможете использовать некоторые из своих новых навыков, такие как управление состояниями и прослушивание событий, но уже в другом контексте. Вероятно, вы столкнетесь с непониманием, как сделать то или иное действие, потому что о нем не говорилось в учебнике; вы всегда можете посерфить в Google и найти решение! Если вы действительно не можете разобраться, то отложите на время проект «Бинго». Изучите еще несколько пособий, а позже вернитесь и посмотрите, освоили ли вы достаточно, чтобы продвинуться дальше. Данную стратегию описывают как «one on, one off». Изучите какой-нибудь ресурс в качестве учебника для выполнения той или иной задачи, а затем потратьте столько же времени на создание аналогичного проекта, но уже без инструкций. Если пособие учит вас, как создавать клон Instagram, попробуйте создать клон Twitter самостоятельно! На ранних этапах освоения новых навыков я стараюсь делать акцент на «управляемом» обучении. Достаточно сложно создать что-то без инструкций, пока я все еще не разобрался с синтаксисом и основами. Как только я чувствую себя увереннее и комфортнее, баланс меняется. Я трачу все больше времени на «независимое» обучение и создаю проекты, которые мне интересны. Я обращаюсь к учебникам, когда сталкиваюсь с новой и незнакомой мне сложностью, но по мере увеличения опыта таких случаев становится все меньше и меньше. Мой график обучения выглядит следующим образом: Линейный график показывает, как «управляемое» обучение стремится от высокого уровня к низкому, в то время как «независимое» обучение смещается от низкого уровня к высокому. Ваш график может выглядеть иначе, в конечном счете вы сами должны найти свой баланс. Главное, не фокусировать внимание только на «управляемом» или «независимом» обучении. Однажды, много лет назад, я пошел в боулинг с друзьями. Тогда я играл не особо хорошо. Большинство брошенных мной шаров не попадали в цель. К концу игры у меня был самый низкий результат среди нашей компании. Этот сценарий можно было интерпретировать двумя разными способами: Я не умею играть в боулинг и никогда не буду в нем хорош. Это просто не моя игра. Сейчас я плох в боулинге. Если я захочу, то стану играть превосходно. В данной ситуации может иметь место самосбывающееся пророчество: тот способ интерпретации, который вы выберете, станет единственно верным для вас. Если вы считаете, что ваш уровень игры в боулинг предопределен навечно, то так и окажется. А если вы верите, что можете совершенствоваться, то будете это делать! В разработке ПО никогда не бывает все гладко. Неизбежно возникают трудности, и код зачастую работает не так, как мы того ожидали. Это толкает нас либо к нисходящей спирали, полной разочарования и неуверенности в себе, либо открывает фантастические возможности обучения. Ничто не поможет вам учиться быстрее, чем сообщение об очередной допущенной ошибке, — но только если вы имеете при этом определенный образ мышления. В процессе борьбы и неудач мы учимся быстрее и эффективнее, чем при достижении легкого успеха. Если ваше мышление направлено на рост, эта борьба не всегда может быть увлекательной, — однако при этом наиболее продуктивной, как хорошая тренировка. Узнайте подробнее о развитии установки мышления на постоянный рост в рамках курса Khan Academy, который позволит понять, как люди преодолевают трудности и добиваются успеха.  Мы живем в мире социального медиа-шума, где легко ощутить на себе давление в духе: «чтобы оставаться актуальным, нужно изучать каждую модную JS-библиотеку, мелькающую в Twitter». Каждый раз, когда я пытался сделать нечто подобное, у меня ничего не получалось. Дело в том, что у меня нет особой мотивации учиться ради обучения. Для сохранения мотивации мне необходимо иметь в голове конкретную интересную цель. Например, несколько лет назад я открыл для себя Beat Saber — видеоигру дополненной реальности. В этой игре вы под музыку атакуете блоки световыми мечами. Каждая песня сопряжена с уникальной хореографией.  Существовало ПО для создания пользователями своей собственной хореографии (или как говорят игроки — «карт»), однако я не был его большим фанатом. Мне хотелось создать свой редактор карт для Beat Saber. Спустя несколько месяцев тяжелой и периодически нервной работы я достиг этой цели. (Если вам интересен этот проект, вы можете ознакомиться с ним вживую, посмотреть код на Github или выступление на конференции о его разработке). До этого проекта я не имел опыта работы с 3D и мне пришлось освоить тонну информации о WebGL, Three.js и React-three-fiber. Обучение было тяжелым: независимо от того, насколько твердо ваше мышление ориентировано на рост, всегда будут дни, когда что-то не получается.  Но благодаря наличию конкретной цели, которую я действительно хотел достичь, я смог перебороть сложности и продолжал делать успехи. Если бы я обучался из простого интереса или для упоминания конкретного опыта в моем резюме, скорее всего, я бы достаточно быстро сдался. Разных людей мотивируют абсолютно разные вещи, и я вовсе не говорю, что вам тоже необходимо найти свою нишу и начать создавать в ней проект. Но я думаю, крайне важно иметь у себя в голове цель, которая действительно увлекает. В противном случае будет трудно поддерживать мотивацию после того, как исчезнет первоначальное ощущение новизны проекта. У меня ужасная память. И это может доставить массу проблем; крайне сложно что-то выучить, если не можешь этого запомнить! К счастью, у меня есть система: интервальное повторение.  Вот основная идея интервального повторения: чтобы закрепить в памяти то или иное знание, нужно повторять его прямо перед тем, когда вы, кажется, вот-вот его забудешь. С каждой новой итерацией момент «забывания» будет наступать позже, чем предыдущий. Звучит сложно, однако существуют инструменты, которые будут регулировать процесс за вас. Лично я использую ящик Лейтнера — физический ящик, в котором хранится несколько сотен индексных карточек. Каждый день я просматриваю небольшую их горстку. Если вам интересно узнать больше об интервальном повторении, я настоятельно рекомендую ознакомиться с содержательным объяснением Ника Кейса «Как запомнить что-либо навечно». Предположим, вы решили посвятить семь часов в неделю изучению чего-то нового. Как вы думаете, что будет более эффективным: тратить на занятие по часу в день или же еженедельно по воскресеньям тратить на это по 7 часов? Лично я добился гораздо больших успехов, тратя небольшое количество времени, но чаще.  Я понимаю, что не у всех есть возможность структурировать обучение подобным образом, но если она у вас все-таки есть, то я настоятельно рекомендую попробовать тратить небольшое количество времени каждый день на предмет вашего изучения. У меня есть несколько гипотез о том, почему это эффективно: Каждый вечер мозг обрабатывает и запоминает то, что человек выучил за день. И этим важно пользоваться каждый день, а не только раз в неделю. Поскольку я практикуюсь ежедневно, то всегда могу продолжить с того момента, на котором остановился. Мне не нужно тратить кучу времени на то, чтобы освежить память и восстановить силы. Как я уже говорил, бывает трудно поддерживать мотивацию после того, как новизна улетучивается. Если включить обучение в свой распорядок дня, то не придется переживать о мотивации так сильно; это станет тем, что вы просто делаете, вне зависимости от того, как вы себя при этом чувствуете. Я большой фанат философии Свикса «Обучение на публике». Главная идея: публичная демонстрация того, что вы выучили, помогает вам в будущем. Когда вы исследуете нечто новое, то должны создать артефакт, который бы задокументировал ваш рост: например, статью, твит или видео на YouTube. Это может показаться несколько нелогичным; зачем тратить «время для обучения» на написание статьи? Не является ли это лишней тратой времени? У «обучения на публике» есть масса преимуществ, которые мне удалось обнаружить: Доводилось ли вам кому-то что-то объяснять с одной лишь целью — понять, что вы сами знаете это недостаточно хорошо? Написание статьи имеет тот же эффект. Это лучший способ обнаружить недостатки и пробелы вашей ментальной модели, чтобы впоследствии исправить их. Худшее чувство в мире — столкнуться с проблемой, которую вы до этого уже решали, но не можете вспомнить как именно. Если бы вы написали статью об этом, то смогли бы использовать ее в качестве подсказки! Делясь выученным, вы становитесь активным участником сообщества разработчиков. Вы можете завести друзей и полезные знакомства. Это может быть интересно, не говоря уже о том, что это способно помочь вам найти новую работу или начать новый проект. Одно предостережение: не попадите в ловушку, потратив несколько недель на создание идеального блога с нуля! Начните с публикации на платформе Dev или же просто в Твиттере. Я опубликовал десятки постов на Medium до того, как создал свой блог. Если вы поняли, что вам действительно нравится «обучение на публике», всегда сможете запустить и свой блог. Недавно я начал обучаться созданию 3D-иллюстраций в Blender. Я все еще новичок; на данный момент я вложил в этот навык около 150 часов. Но я смог создать несколько приличных работ. Ниже представлены несколько из них:  Мне удалось обучиться этому весьма быстро, благодаря всем техникам, которые я описываю в этой статье. Но в моем рукаве есть еще один туз — дополнительные навыки.  Суть в том, что умение создавать 3D-иллюстрации — не конкретный отдельный навык; можно сказать, что это набор из десятка индивидуальных навыков. Часть из них, такие как создание 3D-моделей, абсолютно новы для меня. И мне пришлось изучать их с нуля. Но остальные — это элементы одной большой сети, в исследовании которой у меня уже есть опыт. Например, в некоторой степени я фотограф-любитель. Много лет назад я узнал о композиции и о том, как расположить элементы в кадре таким образом, чтобы снимок был убедительным. Я могу использовать данные навыки при расположении объектов в моих рендерах.  Этот пример можно назвать конкретным, остальные же более туманны. Я потратил многие годы на развитие внимания к деталям в качестве front-end разработчика. Вся эта работа с пикселями помогла мне придумать подходящее значение для скосов и толщины. А моя работа над дизайном пользовательского интерфейса помогла мне понять теорию цвета и эстетику. Многие никогда бы не подумали, что навыки, которыми я уже овладел, станут моим подспорьем в создании 3D-иллюстраций, но по факту они дали мне до смешного несправедливое преимущество. С моей точки зрения, навыки — как богатство. Чем больше навыков вы приобретаете, тем быстрее они накапливаются. Идеи и техники, почерпнутые в одной области, могут помочь вам в другой. Я не говорю, что вы должны стать универсалом — однозначно стоит иметь глубокие знания в конкретной области. Но чем шире ваша сеть навыков, тем значительнее будет ваше преимущество, когда дело дойдет до изучения чего-то нового. Некоторые учебные ресурсы опираются на эту идею. Например, я работаю над курсом «CSS для разработчиков JavaScript». Я создаю его специально для разработчиков JS, поскольку знаю, что они могут применить множество уже имеющихся у них знаний для освоения CSS. Вместо старта с нуля и создания из ничего, мы используем знания JS в процессе понимания CSS, то есть копируем и вставляем уже имеющиеся ментальные модели.  Работайте не только с учебным материалом, но и развивайтесь в деле самостоятельно. Даже если вы пока не можете создать свой собственный проект с нуля, постепенно выходите за пределы того, что предлагают учебники и курсы. Сочетание «управляемого» и «независимого» обучения помогает развивать заметные практические навыки. Занимайтесь своими внутренними ресурсами: тренируйте мышление и находите источники мотивации. Для достижения успеха важно иметь цель, к которой вы с интересом будете стремиться. Сделать этот путь более эффективным поможет совершенствование собственной памяти и формирование полезных ежедневных привычек. Развивайте сеть навыков — идеи и техники, полученные в одной области, могут помочь вам в другой. И не стесняйтесь делиться освоенным: публикация тех или иных работ позволит не только выявить ваши слабые места и задокументировать ваш профессиональный рост, но и поможет завести новые важные знакомства.  В этой статье я рассказал много интересного, и действительно ценю то, что вы дочитали текст до конца. Желаю удачи в ходе вашего обучения! Технический редактор