Ваши маячки в густом тумане
Как лучше спланировать и построить обучение (в том числе обучение программированию)?
Знание, не пропущенное через тело, - просто слухи (“Новый код НЛП” Т. Гагин)
Доброго времени суток, дорогие читатели!
Не так давно я написал в блоге свою историю о том, как я начинал изучать программирование. Также я написал первую часть из цикла статей с полезными ссылками для программистов. Я очень рад, что вы выслушали и нормально восприняли то, о чём я пишу. Недавно в социальных сетях меня нашёл один из пользователей GeekBrains и попросил дать пару советов о том, что ему следует изучить. В разговоре с ним оказалось, что мало дать человеку набор источников информации, важнее объяснить, что за чем учить и что делать, чтобы получаемая информация улеглась и могла быть заимствована вашим мозгом из вашей памяти в нужный момент.
В сети полно всяких мотивационных статей про то, как надо ставить себе цели перед изучением программирования, и прочей лабуды. В этих статьях, на мой взгляд, не учитываются многие факторы. В итоге человек намечает себе: "Я хочу стать Senior Java Developer”. Далее он начинает что-то читать (статьи, книги), пробует что-то писать. Хорошо, если пройдёт какие-то курсы. Чаще всего эти попытки заканчиваются ничем. Поэтому сейчас я попытаюсь акцентировать ваше внимание не на должностях и глобально-абстрактных вещах. Поверьте, цель стать сеньором хорошая, но многие и малейшего понятия не имеют о том, куда двигаться, чтобы её достичь. Зачем тогда ставить такие цели?
Мотивация
Без этого не обходится никто. Без мотивации вообще ничего не бывает. У каждого свои причины заниматься теми или иными вещами. Почему сегодня многие идут в программирование:
- достойная оплата труда;
- стабильность;
- востребованность.
Это очевидные и весомые причины окунуться в мир IT. Правда, не определяющие. Если в вашей жизни основным рычагом являются деньги, то у меня для вас плохие новости: вы будете жить в дискомфорте и стрессе. То, чем вы хотели бы заниматься нужно если и не любить, то как минимум уважать и постоянно этим интересоваться, понимать, какую нематериальную пользу вам это даёт. В случае с программированием лично я вижу следующие ценнейшие плюсы:
- Креатив. В ваших проектах и заданиях вам придётся проявлять смекалку, танцевать с бубном и давать волю вашему воображению. Программирование - это уже не сухая математика, тут нужен и творческий подход.
- Вариативность. Задачи тут разные, как и проекты. Да, многое будет шаблонным. Если вы веб-мастер, то будете из раза в раз писать формы регистрации пользователей и прочие штучки, однако всегда есть место чему-то новому. Технологии меняются, появляются новые библиотеки, фреймворки, скучать вам не придётся.
- Постоянно поступающие знания. Каждый новый проект - это не только новые технические решения, но ещё и новая информация из разных областей. Если вы пишите проект для медицинского учреждения или какого-то завода, вы неизбежно внедряетесь в некоторые тонкости этих областей. Разве это не круто?
Это те причины, которые я перечислил навскидку, список можно продолжить, но идею вы поняли. Теперь поговорим о мотивации. Я думаю, стоит отметить мотивацию "от противного" и "сознательную мотивацию". В первом случае вы недовольны текущим положением дел, хотите работу стабильнее и прибыльнее, во втором - вы в принципе живёте неплохо, но хотели бы какого-то разнообразия, более интересного ремесла. В каком случае мотивация сильнее? Конечно же в первом! Но это не значит, что в остальных случаях вы не сможете ничего добиться. Тем не менее, нужно найти для себя причину начать заниматься (в нашем случае) программированием.
Следует учитывать ещё один фактор. Решение чем-то заниматься должно быть принято лично вами. Если вы это делаете для родителей или друзей, или чтобы не быть неудачником, - это неправильная цель. Она должна быть нужна только вам. Объясню почему. Однажды мой хороший друг, узнав, что я отжимаюсь дома, попросил написать ему программу тренировок. Я спросил его, зачем ему это? Он овтетил, что хочет подкачать бицепс на лето, чтобы "козырять" перед девочками на пляже. Через 3 недели занятий он забросил тренировки. Это произошло из-за неправильной постановки цели. Цели “для кого-то” и цели, ориентированные только на материальную сторону вопроса, никогда НЕ принесут полного удовлетворения (и могут даже навредить). Запомните это.
Резюмирую всё вышесказанное: ещё раз сядьте и подумайте, зачем вам нужно программирование. Я не говорю о том, что вы должны напрочь отбросить мысли о высоких зарплатах программистов. Нет, высокая зарплата - хороший стимул. Я пытаюсь донести до вас мысль о том, что всё не должно сводиться только к материальному вознаграждению, это неправильный подход. Поэтому подумайте, чем программирование вас привлекает и определитесь для себя лично, хотели бы вы им заниматься, или нет?
Расскажу свою небольшую историю
После университета мне нужны были деньги. Какое-то время я проработал менеджером по продажам в строительной компании. Это был отличный опыт! Мы работали по 6 дней в неделю (причем 6-ой был почти полным), зарплата была чуть ниже средней. Сначала всё было интересно, однако через месяц я заскучал. В один из дней меня осенило: “А ведь в технических специальностях всегда что-нибудь новое бывает!” И я стал думать, чем я хотел бы заняться (я же инженер-связист по образованию), а также думать об увольнении. В один из дней я предложил коллегам ходить по стройкам и общаться с прорабами, архитекторами и презентовать нашу компанию (дело было летом). Тогда было очень жарко днём, температура поднималась до +40. Инициатива, как известно, имеет инициатора. Я 2-3 раза выходил в самое пекло (утром и вечером я был нужен в офисе), бродил по стройкам в частном секторе и общался с прорабами. В один из таких дней, запыхавшийся и насквозь мокрый, я сел на лавочку и понял, что нужно срочно что-то менять. Я быстро узнал про курсы в своём городе, ужал свои "хотелки" и одну зарплату потратил на тренинги по С++.
Как видите, в моём случае была мотивация "от противного", но появился и сознательный интерес. Я человек, который любит вариативность. Также я постоянно интересуюсь разными вещами, и мне нравится что-то изучать. Программирование - это нечто похожее на учёбу, только тут нет сессий и тебе ещё за это платят.
О целях
Я надеюсь, после этих абзацев вы уже смогли чётко сформировать для себя цель и разобрались в причинах того, почему вы решили попробовать свои силы в IT. Сейчас я хочу поговорить о целях. Я уже писал о такой цели, как “я хочу стать сеньором”. Это цель абстрактная и глобальная. В ней нет ничего плохого, но и полезного тоже мало. На начальных этапах вы толком не понимаете, что должен знать и уметь "сеньор". И если вы ставите такую цель на год или два, то это вовсе спорное решение. Каждый человек индивидуален и по-разному усваивает информацию. Если один человек изучит технологию за неделю, другому может потребоваться месяц. Как выдумаете, разумно ли, намечая цель, ограничивать себя временными рамками (в данном случае)?
И вот мы плавно подходим к следующему: есть цель глобальная, есть промежуточные. Глобальная цель составляется из промежуточных, по кирпичикам (ваш кэп). Исходя из этого, цели лучше сформулировать так:
- Определитесь в какой области вы хотите кодить.
- Поставьте глобальную цель "стать хорошим специалистом в этой области".
- Если вы новичок и без опыта работы, поставьте себе промежуточную цель стать "джуниором", или стажером в IT-компании.
- Изучите требования к этим позициям. Обычно требуют ядро <технологии + какие-то фреймворки, базы данных>. Если мы говорим о Java-программистах, то сначала вам будут необходимы: процедурное программирование, принципы ООП, алгоритмы, Java Core, знание SQL, возможно что-то ещё (в зависимости от компании требования могут варьироваться).
- Поставьте цель попасть на стажировку, или стать "джуниором".
- Поставьте себе цель по очереди изучать технологии (чтобы с чего-то начать), которые есть в вашем списке. В таком случае вы можете вводить временные рамки. В процессе вы даже сможете их корректировать.
- Напишите какой-то проект, а лучше несколько. Также назначайте временные рамки.
- Попав на стажировку, ставьте цель стать "миддлом".
- Для этого нужны знания и опыт, поэтому постарайтесь сделать как можно больше заданий по проектам, продолжайте по чуть-чуть учиться в свободное время и пилите домашние проекты для себя.
Я наметил основные цели, абстрактные, рядышком расписал локальные цели, более конкретные. К глобальным целям вы сможете прийти только достигнув промежуточных. Эта цепочка - пример того, как поступил бы я. Это не идеальный алгоритм. Я думаю, что тут можно поставить себе ещё несколько промежуточных целей, но основную суть моей идеи, надеюсь, вы прослеживате. Итак, мы уже определились с мотивацией и поставили себе нужные цели. Идём дальше!
Обучение
Мы плавно подошли к самому интересному. Итак, вы решили изучить, например, Java. Задача требует промежуточной цели - Java Core. Обычная Java - это стандартные конструкции, операторы, ООП-парадигмы, исключения, коллекции и потоки (поправьте в комментариях, если что-то забыл). У нас есть следующие источники информации и формы обучения:
- курсы (в том числе и онлайн, интерактивные курсы);
- книги;
- видео (вебинары, семинары).
Все эти источники вам нужно использовать, если вы хотите разобраться в предметной области. Возникает вопрос, как их использовать? Начинать стоит с курсов. Лучше, если это будут занятия “в живую”, offline и в небольших группах, чтобы учитель мог уделить вам больше внимания. Если нет возможности, занимайтесь онлайн. Далее штудируете форумы, где говорится о лучшей литературе в данной области. Про Java не писал разве что ленивый. У вас на выбор прекрасные книги Шилдта, Эккеля, Троелсена, книга серии HeadFirst (список литературы по Java я дам в другой своей статье) и других именитых авторов. В идеале лучше бы найти их все (дальше объясню почему). После каждого занятия читаете нужный раздел в книгах. То есть: прошли оператор if, найдите тему по нему в книжках и прочитайте - это будет полезно. На курсах (если они толковые) у вас будут домашние задания. Если их по какой-то причине нет или мало, в книгах вы всегда сможете найти задачки в конце главы (по Java есть прекрасный портал javarush, где вы найдёте тонну задач), решайте их. Поймите главное - в программировании знания без практики равны если не нулю, то некоторой совсем малой величине. Забудьте университетский подход, где все строчат тоннами конспекты и раз в неделю проводится лабораторная. В программировании нужно практиковаться. И чем больше, тем лучше. Поэтому выполняйте все задания и ищите дополнительные.
В конце концов вы изучите Java Core - самое время написать домашний проект. Если он потребует базу данных, тогда вам следует познакомиться с SQL (сделать это можно, прочитав хотя бы книгу Бена Форты “SQL за 10 минут”). Далее вы можете проанализировать требования к позиции "джуниора" и доучить необходимое самостоятельно. Если в требованиях есть какой-то фреймворк, напишите мини-проект с его использованием и только после этого штурмуйте IT-компании.
Теперь рассмотрим второй вариант, когда у вас нет возможности заплатить за курсы. Основной фишкой курсов является возможность общения с преподавателем, который расскажет, покажет, объяснит и исправит ваши ошибки. Если вы не ходите на курсы, вы лишаетесь возможности консультироваться с преподавателем. Но не унывайте, учиться можно и самому, правда выйдет чуть дольше. Итак, вы делаете всё тоже самое, но старайтесь искать помощь в интернете. Официальные коммьюнити, stackoverflow могут быть очень полезны. Тут следует сразу дать правильный алгоритм вашего запроса у знающих людей. У вас что-то не получается и не ясно в чем дело? Ищите решения в google, уделите этому время. Если решение не нашлось, пишите на форум:
- что вы хотели сделать;
- что пробовали;
- ваш код (код того, что вы пробовали);
- задаете чётко свой вопрос.
Почему стоит делать именно так? Дело в том, что у знающих людей время не безграничное и за вас выполнять задачу "с нуля" никто бесплатно не станет, но найти ошибку и дать совет люди могут. Для этого вы должны чётко описать сложившуюся ситуацию. Тем самым вы экономите время себе и окружающим. Относитесь к пользователям стека и коммьюнити с уважением и в ответ будете получать тоже уважение. В остальном вы делаете всё тоже самое, как если бы проходили курсы. Я рекомендую завести вам тетрадку или блокнот. Это станет вашим конспектом. Не впадайте в крайности и не пишите все лекции в блокнот разными по цвету ручками. От вас требуется записать важные синтаксические конструкции, какой-то интересный код, полезные примеры программ и возможно какой-то интересный термин, факт. Также ведите список технологий. На каждом семинаре, курсе проскакивают названия разных технологий, записывайте их и на досуге смотрите, что они из себя представляют.
Ещё несколько замечаний
Выше я советовал все толковые книги по интересующей вас теме и рекомендовал работать параллельно со всеми сразу. Почему? Отвечу так:
- Не смотря на то, что суть у них одна, форма подачи материала всё равно отличается, как и примеры, слог автора и т.д.
- Порой, чтобы что-то понять, нужно перечитать несколько книг, потому что знание это ещё далеко не всё. Вам нужно осознание. Чтобы полученное знание интегрировалось в общую картину восприятия того, что вы делаете.
Резюмирую всё вышесказанное историей из личного опыта. Ещё на занятиях по С++ я никак не мог понять вложенные циклы. Вернее теоретически я понимал, что это такое, но на практике впадал в ступор. Я перечитал кучу статей, пересмотрел кучу примеров, голова пухла, казалось, мне не дано это понять. В конце концов, я нашёл объяснение в книжке Паоло Франка "С++. Учебный курс". Сама по себе книга не очень подходящая для новичка, я купил её по неопытности. Тем не менее она мне помогала в те моменты, когда я зависал. "Что я там нашёл?" - спросите вы. Отвечу: отличную метафору! Вложенные циклы там сравнили с:
- занятиями спортом. К примеру, вы поднимаете штангу. Вы делаете в общей сложности 4 подхода - 1 цикл на 4 итерации, в каждом подходе 10 повторений - 2 цикл на 10 итераций, который повторится 4 раза.
- приёмом лекарств. Вы пьёте таблетки. Курс рассчитан на неделю, таблетку нужно пить 2 раза в день. Думаю, понятно, где здесь какой цикл.
После этих метафор мой мозг сказал: ”Эврика!” Больше таких вопросов не возникало. Поэтому я и рекомендую найти кучу источников информации и пользоваться ими потихоньку. И не отчаивайтесь, если до вас что-то не доходит. В какой-то книге или статье есть объяснение, которое подойдёт именно вам. Ваш мозг должен быть страждущим, не прекращайте поиски решения проблемы.
Наше восприятие
Теперь я хочу затронуть ещё одну немаловажную тему. Данные выводы пришли ко мне спонтанно. Мне кажется, что при обучении любому делу стоит принимать во внимание то, о чём я сейчас напишу. Я уверен, что каждого из вас посещала мысль о том, что порой информация воспринимается лучше, когда она расписана схематически, а не воспринимается на слух? Преподаватель может два часа пыхтеть, объяснять, а вы всё равно не поймёте тему. Но прочитав потом главу на 5 страничек до вас дойдёт. При этом у ваших одногруппников понимание материала может возникнуть уже после объяснения преподавателя. Что это значит? Ни в коем случае не думайте, что вы "тормоз" или вам не дано. Такие мысли вредны для здоровья. Жизнь слишком клёвая штука, чтобы гнобить себя! Относитесь к непониманию с юмором. Юмор - великая вещь.
Почему же так происходит? Мы воспринимаем окружающую реальность посредством пяти каналов восприятия: визуальный, кинестетический, аудиальный, канал вкуса, канал запаха. Эти каналы также иногда называют "модальностями". В случае с преподавателем и студентами работают аудиальный и визуальный каналы. Они отвечают за восприятие информации. Я не думаю, что на лекции вы задействуете кинестетику, пробуете преподавателя на вкус и обнюхиваете его. По предмету это не даст никакой информации. А вот аудиальный и визуальный каналы дадут. Сейчас мы плавно подходим к ответу на вопрос: "почему вы не поняли преподавателя, который 2 часа прыгал у доски?" Потому что восприятие информации посредством модальностей не равно. Каждый человек по-своему воспринимает информацию. Кому-то достаточно просто объяснить устно, а кому-то потребуется показать наглядно. То есть у каждого из нас доминирует своя модальность. Поэтому нет ничего плохого в том, что вы быстрее поняли тему лекции, прочитав книгу. У вас просто лучше развито визуальное восприятие.
К чему я клоню? Вам нужно обратить внимание на то, в каких случаях информация усваивается легче. Мне, например, страшно тоскливо смотреть долгие видео-лекции. Я больше люблю читать статьи, смотреть схемы. Так до меня быстрее доходит. Мой друг же предпочитает обратный метод - всегда смотрит видео-гайды, а статья читает редко. В вашем арсенале должны быть и книги и видео-материалы, но упор следует делать на ту форму подачи информации, которая воспринимается легче.
Давайте себе отчёт
В одной из статей уже писали о том, что неплохо завести блокнот, в котором вы запишете план обучения. Заведите себе такой. Туда вносите интересные идеи, а также ваши результаты. Это будет вашим мини-дневником. Прошли какой-то курс - записали: “такое-то число, прошёл такой-то курс там-то там-то”. Рядышком комментарий о том, что, например, курс толковый, что нового узнали, может, есть что-то, что потом стоит пересмотреть и освежить в памяти? Вносите туда технологии, с которыми вы познакомились, хотя бы поверхностно. И также комментарии. Такая практика полезна тем, что вы сможете отследить свой успех и "поднажать" на себя, если обленитесь. А ещё это пригодится, когда вы будете составлять CV.
Развивайте себя
Кроме программирования в вашей жизни обязательно должно быть что-то, на что вы могли бы отвлекаться. Книги, хобби, всё, что угодно. У вас ни в коем случае не должно быть замкнутого круга "дом-работа-учеба-дом" или "дом-учеба-дом". Стереотип о том, что программист - это нелюдимое создание, которое круглыми сутками торчит за компьютером, уже канул в летах. Сегодня программисты по большей части являются разносторонними личностями и помимо работы интересуются ещё многими вещами. Творческое полушарие мозга тоже должно работать. Имейте это в виду.
Заключение
На этом вроде бы всё. В этой статье я попытался ответить на основные вопросы, которые часто возникают у начинающих программистов. Всего конечно не охватить. Если всё ещё что-то не понятно, вы можете спросить меня об этом в комментариях. И если вопросов будет много, я постараюсь ответы на них объединить в другой статье чуть позже. Ещё раз подчеркну, что данная статья не является научным трудом, а скорее результатом постоянно обновляющегося личного опыта автора (то есть меня) и она может не являться "истиной". Ещё раз хочу пожелать удачи начинающим: пробуйте, упирайтесь, если что-то не получается, и гребите вперёд. Поначалу всё тяжело, но со временем придут и перемены к лучшему. Достаточно проявить терпение.