воскресенье, 8 ноября 2015 г.

Как правильно развиваться?

Это несколько расширенная версия ответа на похожий вопрос, который был задан в русскоязычном ru.stackoverflow.com.


Эффективное развитие – это очень субъективная тема. Это значит, что если что-то подходит мне, это не обязательно подойдет и тебе. Самое главное для саморазвития – это стабильная мотивация в течение длительного времени. И только вы сможете найти правильный баланс между теорией и практикой, подобрать правильную частоту переключения между темами и найти стимул к изучению чего-то нового.
«Правильно» в этом вопросе означает баланс между затраченными усилиями и результатом, который будет оптимальным и эффективном именно для тебя. Несмотря на индивидуальность этого процесса, в процессе развития есть несколько важных моментов, которые могут упростить этот путь.

Хорошие источники
Упор на получение стабильных знаний
Итеративность обучения и практика
Относительно четкий план развития
Разнообразие тем
Мотивация


Теперь по порядку.
1. Хорошие источники
Каждый день, в мире выходит в день десятки книг, сотни статей и обучающих видео курсов. Если подходить к процессу выбора источника обучения необдуманно, то это будет крайне неэффективно. Есть очень много проверенных и качественных источников практически по любой теме.
Я достаточно основательно подхожу к выбору хороших источников, поскольку от этого зависит эффективность вашего развития. За последние несколько лет я сделал несколько подборок источников для самообразования: 

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

2. Упор на получение стабильных знаний
С одной стороны, может показаться, что наша индустрия развивается невероятно быстро, с другой же стороны, многие концепции, которые являются "новыми" в мире .NET/Java/C++ известны специалистам десятилетиями. Популярное нынче функциональное программирование старше структурного программирования и ООП, но лишь сейчас она набирает популярность.
Нет смысла стараться запомнить миллион фактов из всех возможных областей знаний. Значительно более эффективно получить каркас, на основе которых эти знания можно будет выводить и более эффективно получать новые.
Хорошее знание даже такого высокоуровневого языка как C# позволит быстрее освоить другие схожие языки, такие как Java. Понимание концепций СУБД позволит разобраться и с SQL Server, и с Postgre SQL, и с Oralcle. Понимание концепций многопоточности позволит эффективно работать на любой платформе, поскольку паттерны синхронизации везде очень похожи.
Этот пункт непосредственно связан с предыдущим: хорошая книга дает не просто сиюминутные знания, там описаны еще и основы, на которых эти знания держатся. Изучение хороших источников позволяет затем учиться быстрее путем повторного использования знаний.

3. Итеративность обучения и практика
Невозможно изучить с первого раза определенную тему достаточно глубоко. Точнее, это зависит от качества источников и текущих знаний, но в общем случае, подход к обучению, как и познанию в целом, является итеративным.
Восприятие новых знаний сильно зависит от текущего практического и теоретического опыта, и некоторые важные вещи просто не осядут в голове с первого раза.
Книгу Рихтера можно перечитывать несколько раз и каждый раз находиться для себя интересные вещи, на которые не обратил внимания раньше. Философские вещи, типа кодинга, ООП, ФП и тому подобного требуют еще большего времени для усвоения.
Очень важен баланс между теорией и практикой, когда теоретический матан становится осмысленной базой, на которой строится принятие практических решений. Звучит непонятно, но до тех пор, пока сам не столкнешься с проблемой инициализации синглтонов, не поверишь, что теоретические знания о beforefieldinit могут быть полезными на практике.
Именно поэтому, к тем же самым темам стоит периодически возвращаться и смотреть, как изменяется отношение к этому вопросу со временем. Это не значит, что нужно перечитывать одно и тоже (хотя это тоже возможно) или смотреть одни и те же видеокурсы, достаточно иметь подходящий набор источников.
Итеративность процесса обучения имеет ряд положительных сторон. Во-первых, невозможно слишком долго изучать одну тему, нужно иногда давать себе отдых и переключаться на что-то другое. Во-вторых, чтобы добиться более глубокого понимания одной темы, обычно нужно копнуть другую. Например, невозможно глубоко понимать C# без понимания CLR/JIT. А чтобы разобраться с этими темами нужно понимание ОС и других низкоуровневых вещей.
Аналогично, чтобы глубже разобраться с ООП, зачастую нужно посмотреть на другие парадигмы программирования, например, глянуть на проблемы структурного программирования и изучить основы функционального программирования.

4. Относительно четкий план развития
Не обязательно иметь план обучения, расписанный по дням на 10 лет вперед. Достаточно иметь простую mind map-у, в которой будут обозначены ключевые ветви развития: ООП, Кодинг, Философия программирования, Архитектура, Алгоритмы, Многопоточность, Управление проектами и т.п. (нечто подобное я описывал в заметке "Увлеченный программист"). При этом можно сделать даже подборку материалов в виде книг, статей или курсов, чтобы когда приспичит не пришлось тратить время на поиск подходящих материалов.
Идея в том, чтобы не метаться из стороны в сторону, когда вдруг появится желание взяться за изучение чего-то нового, а относительно четко понимать, в какую сторону следует направить свои интересы и куда переключиться со временем.
К тому же, важно хотя бы какое-то время уделить одной темы, а не пытаться одним махом объять необъятное.

5. Разнообразие тем
Этот аспект уже упоминался раньше, но хочется акцентировать на нем внимание.
Очень важно соблюдать правильный баланс между глубиной и широтой знаний. Нет смысла бесконечно рыть .NET, нет смысла ограничивать себя только вебом, только ООП, только С++, или только чем-то еще. Более того, зачастую, чтобы добиться более глубоких знаний, нужно копнуть смежные области.

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




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

Комментариев нет:

Отправить комментарий