среда, 8 апреля 2015 г.

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

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

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

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

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

Теперь по порядку.

1. Хорошие источники

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

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

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

2. Упор на получение стабильных знаний

С одной стороны, может показаться, что наша индустрия развивается невероятно быстро, с другой же стороны, многие концепции, которые являются "новыми" в мире .NET/Java/C++ известны специалистам десятилетиями. Популярное нынче функциональное программирование старше структурного программирования и ООП, но лишь сейчас она набирает популярность.

Нет смысла стараться запомнить миллион фактов из всех возможных областей знаний. Значительно более эффективно получить каркас, на основе которых эти знания можно будет выводить и более эффективно получать новые.

Хорошее знание даже такого высокоуровневого языка как C# позволит быстрее освоить другие схожие языки, такие как Java. Понимание концепций СУБД позволит разобраться и с SQL Server, и с Postgre SQL, и с Oralcle. Понимание концепций многопоточности позволит эффективно работать на любой платформе, поскольку паттерны синхронизации везде очень похожи.

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

3. Итеративность обучения и практика

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

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

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

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

Именно поэтому, к тем же самым темам стоит периодически возвращаться и смотреть, как изменяется отношение к этому вопросу со временем. Это не значит, что нужно перечитывать одно и тоже (хотя это тоже возможно) или смотреть одни и те же видеокурсы, достаточно иметь подходящий набор источников.

Итеративность процесса обучения имеет ряд положительных сторон. Во-первых, невозможно слишком долго изучать одну тему, нужно иногда давать себе отдых и переключаться на что-то другое. Во-вторых, чтобы добиться более глубокого понимания одной темы, обычно нужно копнуть другую. Например, невозможно глубоко понимать C# без понимания CLR/JIT. А чтобы разобраться с этими темами нужно понимание ОС и других низкоуровневых вещей.

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

4. Относительно четкий план развития

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

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

К тому же, важно хотя бы какое-то время уделить одной темы, а не пытаться одним махом объять необъятное.

5. Разнообразие тем

Этот аспект уже упоминался раньше, но хочется акцентировать на нем внимание.

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

6. Мотивация

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

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

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

clip_image002

Небольшой бонус для тех, кто осилил пост до конца.

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

19 комментариев:

  1. Пункт №4 самый сложновыполнимый для меня - адски манит всё!

    ОтветитьУдалить
    Ответы
    1. Ну, тут нужно понимать, что мы не являемся всемогуторами, которые могут делать 100 500 вещей одновременно:)) У меня эта проблема проявляется так: взялся за одно, копнул другое, оказалось тоже интересным, перешел на третье и так далее. Через пару часов очнулся и понял, что занимался все это время какой-то ерундой:)

      Удалить
    2. Как мне это знакомо! Правда, в процессе часто находятся пара-тройка других интересных вещей :)

      Удалить
    3. У меня из-за этого пункта вообще сложилась болезнь "книга-недочитвания": беру книгу по шаблонам Head First, например. Читаю половину. Потом беру Clean Code и тоже читаю половину. Потом Совершенный Код. Тоже половину. Потом как-то начинаю читать Кристофера Александра. Меньше половины. Потом ещё пару книг не заканчиваю. Потом надоедает на недели 2. Потом... новая итерация в том же духе. Знакомо или это только я такой?

      Удалить
  2. Сергей, к теме книг, да и просто любопытно, около Нового Года вы обронили что-то о том, что собираетесь "добить" свою собственную книгу по паттернам проектирования: каковы перспективы, скоро ли книга увидит свет?

    ОтветитьУдалить
    Ответы
    1. Максим, книга сдана изадетлю и в ближайшее время должна быть опубликована.

      Удалить
  3. "Самообучение начинает себя окупать лишь спустя годы постоянных занятий. Нужно попробовать сделать так, чтобы это стало частью повседневной деятельности, которая тебя радует, а не напрягает. Здесь очень важно, чтобы доставлял удовольствие сам процесс, а не эфемерный результат." - вот это знаю по себе.

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

      Удалить
  4. Когда вы начинали как программист был ли у вас какая-то конкретная цель, например, за 1 год стать профессионалом по ASP.Net или, например, через 10 лет попасть в Microsoft? Или же вами просто двигал интерес к программированию и конкретной глобальной цели вы не имели, а просто строили небольшие цели, а по достижению их сами по себе возникали новые?

    ОтветитьУдалить
    Ответы
    1. У меня никогда не было подобных целей. Более того, я правда считаю, что подобная цель может не столько помочь, сколько навредить.

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

      Я часто привожу пример детского воспитания в этом контексте. Какой ребенок лучше узнает определенную область, тот которому мама сказала, что это полезно, или тот, которому это было интересно? Можно, конечно, спорить, что мы же взрослые люди, а не дети и следуем другим законам. Но, как правило, мы не очень далеко ушли от детей.

      Поэтому я всегда стараюсь найти что-то, что будет интересно или найти интерес в чем-то даже довольно рутинном. Это помогает сохранить мотивацию на должном уровне.

      На самом деле, я не совсем честен в этом вопросе. У меня всегда была (и остается цель) стать классным специалистом или просто быть интересным человеком. Но я никогда не рассматриваю это с карьерной точки зрения.

      Удалить
    2. Это радует. Дело в том, что у меня такая же цель - стать профессионалом своего дела, но конкретной "глобальной" с точки зрения карьеры цели я так и не смог для себя определить, и у меня возникал вопрос, насколько правильно то, что у меня нет такой цели, но есть огромный интерес к программированию. Исходя из вашего ответа, я пришел к выводу, что я на верном пути.

      Удалить
  5. Прекрасная статья. Я бы еще пункт по мотивации поставил бы на первое место с жирным заголовком. И добавил бы слово - осознанность. Каким бы делом мы не занимались и имея желание расти в той области, которую мы выбрали, вставая каждое утро приходиться себя мотивировать. Для кого ты это делаешь, для чего и тп.

    План действий. это хорошо. но нужно еще определиться куда будешь рости - либо по технической стороне или уйдешь в менеджмент. А то можно план составить и никуда не прийти.

    ОтветитьУдалить
  6. По 4-му пункту хорошей практикой является составление плана саморазвития на год, например, перед новым годом ты говоришь себе, хочу в следующем году прокачать алгоритмы, подтянуть математику, освоить хаскель, и постепенно в течении года занимаешься по данным направлениям. Т.е. должно быть 3-4 прозрачных и выполнимым цели.

    ОтветитьУдалить
    Ответы
    1. Все правильно, лишь бы не было вот так: https://habrastorage.org/files/884/b9a/cad/884b9acad9ea4d9fb82d8b7dfb802ce3.jpeg

      Удалить
    2. Хз, но я чего-то не могу картинку нормально вставить в комментарии... И это 2015 год на дворе:)))

      Удалить
  7. Если программист не будет учиться вне рабочего времени, то на первом же повороте (судьбы) вылетит из профессии. Точно так уже вылетели 1) радисты, 2) электроники и 3) программисты (которые за еду работали на отечественных предприятиях). Куховарить могут позволить пока ещё программисты-офшорники. Но это только пока. Жизнь не сидит на месте.

    ОтветитьУдалить
    Ответы
    1. Андрей, вынужден не согласиться с этим умозаключением:)
      Просто не так много людей в целом готовы развиваться в нерабочее время и программисты здесь не исключение.

      Есть статистика, которая говорит, что не больше 10% программистов читают хотя бы по одной статье в неделю. Может быть это и не нормально, но это факт. При этом интеллекта многих людей хватает, чтобы хватать что-то на работе и развиваться именно в рабочее время.

      Индустрия просто не может потерять 90% людей при первом повороте.

      Но, с другой стороны, это скорее хорошая новость для тех, кому что-то интересно, кто постоянно к чему-то стремится и развивается;)

      З.Ы. Даже в МС-е количество людей, которые развиваются в нерабочее время не такое и большое.

      Удалить
    2. Откуда такая статистика? Вижу по окружающим -- каждый день по тому или иному вопросу лезут на хабр или другие логи -- не специально "почитать", а "по-нужде"

      Сам только по-необходимости туда залажу. Ну или по субботам за утренним интернетом, но только из-за загруженности и потому, что променял хабр на книги

      Я, конечно, встречал людей, которые абсолютно не "в тренде" -- но таких единицы и они меня бесконечно удивляли

      Удалить
    3. Была неплохая статейка на английском примерно с таким содержанием: "если вы сейчас читаете эти строки, то поздравляю, вы входите в 1% людей, которые интересуются своим самообразованием". Попробую поискать.

      Тут ты сам дал ответ на свой же вопрос. Есть минимум 3 причины, почему люди лезут что-то читать, в частности, на хабр:

      1. Они ищут ответ на возникший вопрос/проблему
      2. Они прокрастинируют
      3. Они что-то реально изучают

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

      Удалить