вторник, 12 марта 2013 г.

Как я читаю книги?

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

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

При текущих темпах развития нашей отрасли мы просто не можем позволить себе тратить время на некачественный материал. С одной стороны, все вокруг постоянно меняется, а с другой стороны – многие «новомодные» технологии, которые становятся “mainstream”-ом сегодня, известны в узких кругах десятки лет. Нам стоит научиться использовать знания повторно, а качественные и проверенные книги в этом вопросе просто незаменимы.

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

Заметки служат разным целям; они помогают вернуться к интересным вопросам позднее и посмотреть, не изменилась ли твоя точка зрения со временем. Мне всегда интересно просматривать заметки, сделанные пару лет назад, возникает чувство, будто общаешься с самим собой через пространство и времяJ Дополнительные размышления и критический взгляд на мысли автора тоже могут быть полезными; у меня это обычно выливается в обсуждение с коллегами или в дискуссии в Г+.

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

В-третьих, я стараюсь минимизировать переключение контекста обучения. Одной из самых больших проблем, которые я замечал в разговоре с коллегами, является проблема метания от одной темы к другой. Я точно также не могу прочитать Мейера (1.5К станиц) за раз; поэтому в моем read list-е всегда есть парочка книг, между которыми я переключаюсь, когда одна из них мне надоедает. При этом интервал переключения составляет несколько недель или несколько сотен страниц; более частое переключение просто не позволяет держать в голове задачу достаточно долго, чтобы относительно просто можно было к ней вернуться со временем.

Я не вижу никакого смысла "догрызать" книгу и не браться за другую только потому, что нужно же довести дело до конца. Поэтому, если книга не идет, то я переключаюсь на другую и возвращаюсь к ней позже (например, начал и бросил читать книгу Эванса по DDD - ну вообще пока не пошла!).

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

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

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

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

Английский или русский? В бумаге или в цифре?

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

Что касается языка, то здесь все несколько сложнее. Для небольших книг (200-300 страниц) или книг по языку или технологии язык не принципиален. Но книги по дизайну (Эванса), ООП (Мейера) или дизайну (Брукса) я предпочту русский вариант, при условии хорошего перевода. Для таких книг требуется больше сосредоточенности, да и язык у них будет посложнее.

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

Заключение

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

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

Ссылки по теме

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

  1. Несколько личных наблюдений из опыта чтения книг:

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

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

    * использовать предсонное состояние. Взять перед сном книгу, которую собираешься когда-нибудь прочитать или которую читал давным-давно, и пролистать: просмотреть содержание, "посмотреть картинки"; даже при беглом просмотре глаз может зацепиться за что-нибудь интересное.

    ОтветитьУдалить
  2. Что-то вспомнил хабр
    http://habrahabr.ru/post/165753/

    ОтветитьУдалить
  3. Кроме книг по программированию и IT вообще, существуют и другие, например теоретический минимум Ландау и Лившица или там автобиография Софьи Ковалевской.

    ОтветитьУдалить
  4. Лично я ждал этого поста с момента публикации классических книг по программированию :)

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

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

    Или над скоростью не стоит заморачиваться? :)

    ОтветитьУдалить
  5. @Alex: я не слишком быстро читаю. Но все сильно зависит не от скорости чтения, а от скорости "переваривания" информации.

    Так, книгу Мейера я читал полтора (календарных) года. Чистого времени - не менее полугода. Но книгу Мартина (она же тоже не очень маленькая) одолел за недели 3. Даже с описанием всех своих возражений на ее пережевывание уходит меньше времени, чем на Мейера.

    А по поводу постов, то по ним нельзя судить о скорости чтения, поскольку это могут быть "накопленные" книги, которые на 2/3 прочитаны уже некоторое время назад и за последнее время, добиты до конца.

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

    ОтветитьУдалить
  6. Поделюсь своей технологией чтения.
    При чтении всегда веду краткий конспект технических тонкостей, для того, чтобы потом при повторном чтении или кратком пересказе самому себе помнить детали. Так же у меня есть перед собой всегда оглавление книги (своего рода карта памяти). Конспект является дополнением и уточнением этой карты памяти. Для навигации в конспекте пишу название главы и пункт главы. Для всех остальных тонкостей пишу номер страницы на полях по мере необходимости (если дополнение из другой книги, то ссылка на книгу+ страницу).
    При изучении, каждая новая книга будет дополнять данный конспект. За основу конспекта беру как правило фундаментальную книгу. Конспект пишу в блочной тетради, чтобы в любое место можно было добавить еще листочков. Так же использую переменную скорость чтения. Т.е. читать от корки до корки смысла не вижу.
    В дополнение сначала в блокноте, потом переношу в эл. вариант вопросы для дальнейшего рассмотрения (это своего рода практика по пройденному материалу).
    По итогам могу сказать, что на первую книгу уходит много времени, на все последующие по этой тематике значительно меньше.
    Ну и следует помнить, что знания технологии, в некотором роде, дает иллюзию опыта. По этому когда читаете, очень желательно попрактиковаться. Ну и по сути технология обучения стара как мир: теория, конспект, практика.

    ОтветитьУдалить
  7. Для ускорения чтения можно еще заняться скорочтением, каждый может найти полезные для себя техники и приемы. Но ожидать сильного прироста не стоит, особенно в первое время.

    ОтветитьУдалить
  8. @Слава: спасибо за дополнения.
    Да, ИМХО, мысль совершенно верная; суть эффективного обучения заключается в максимальном погружении в тему всеми доступными способами: решением упражнений, пометками, майнд-мапами и чем угодно другим.

    ОтветитьУдалить
  9. Здравствуйте, Сергей.
    Подскажите, как вы работаете непосредственно с материалом из книги по программированию, технологии? Как лучше закреплять полученные знания? Некоторые рекомендуют переписывать каждый пример из книги, выполнять упражнения после каждой главы, но упражнений часто нету в книгах. Хотелось услышать конкретный способ. Буду благодарен за советы

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

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

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

      Удалить
    2. Сергей, спасибо за совет. Я уточню немного свой вопрос. Речь идет о языках программирования или технологиях. Моя цель сейчас поиск новой работы и улучшения своих знаний и навыков. Сейчас я читаю книгу C# 5.0 Джозеф Албахари. Но практики у меня никакой по книге нету Про то, чтобы писать свой проект я уже много раз. Но все говорят достаточно абстрактно про этот способ. Говорят вещи такого плана: берите несколько книг по технологиям и пишите свой проект. Не понятно как это все совмещать вместе? В каком порядке, прочитать к примеру пару книг и начинать писать домашний проект? Когда и какую тему применять в своем проекте? Что вы посоветуете?

      Удалить
    3. > Я уточню немного свой вопрос. Речь идет о языках программирования или технологиях.
      Ок, это проясняет ситуацию.

      > Про то, чтобы писать свой проект я уже много раз. Но все говорят достаточно абстрактно про этот способ. Говорят вещи такого плана: берите несколько книг по технологиям и пишите свой проект.
      Совет и правда хорош, и мой совет будет подобным...

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

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

      В целом, есть два подхода к практике: (1) набить руку для начала и (2) заняться серьезным проектом. Обычно после первого этапа уже будет достаточно опыта, чтобы пройти собеседование по данному языку программирования и уже серьезным проектом заниматься в рабочее время. Серьезным проектом можно заниматься и дома, но нужно понимать, что на серьезный проект тратиться серьезное время! Даже если есть возможность сразу взяться за серьезный проект, я все же рекомендую взяться за несколько мелких, что позволит дать базовое понимание конструкций языка и идиом, и предотвратит от ненужных переделок серьезного проекта.

      В качестве первого этапа изучения языка программирования можно придумать вот что:

      1. Выдумываем домашний проект: в зависимости от технологии это может быть Web Crawler, реализация алгоритма External Sort, просмотрщик огромных файлов; это может быть своя собственная реализация xUnit фреймворка (с графическим интерфейсом пользователя), свой мини-браузер, штуку для трекания своих TODO, twitter клиент или что-то еще.
      2. Реашем задачи: тот же project euler будет отличным подспорьем для изучения алгоритмов, а также изучения, например, LINQ-а.
      3. Code Kata: это техника предложенная "прагматичным" Дейвом (http://codekata.com/) и заключается в решении определенных типовых задач для развития навыков программирования.
      4. Koans: это новый и довольно популярный сейчас способ обучения языку программирования, когда "учитель" предоставляет набор тестов, а "ученик" должен заполнить их и выполнить. Коэны появлиись для большинства современных языков программирования (а начались, если не ошибаюсь, с Ruby). В качестве примера, вот коэны для F#: https://github.com/relevance/functional-koans/tree/FSharp

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

      > Не понятно как это все совмещать вместе? В каком порядке, прочитать к примеру пару книг и начинать писать домашний проект?
      Полдня чтения, полдня практики, во время которой придется гуглить для решения текущих задач или возвращаться к читаемой в этот момент книге.
      Ну и вообще, никто кроме тебя не скажет, как лучше. Если мне лучше читать по 15 минут или по две недели, это же не значит, что тебе тоже подойдет такой вариант.
      Мне лично подходит пара часов чтения и пара часов практики.

      > Когда и какую тему применять в своем проекте? Что вы посоветуете?
      Тут нужно понимать, что не все темы из того же Албахари вообще нужны (те же стримы, например), но в общем случае я не могу ничего конкретного посоветовать. Просто выберите пет-проект из списка выше, а уже тематика этого проекта подскажет, что вам нужно подтянуть.

      Удалить
    4. Сергей, спасибо за детальный совет. С прочитанного я правильно понял, если подытожить полдня чтения, полдня практики(небольшой проект, или project euler, или Code Kata, или Koans). Изучаю основы. Прохожу собеседование и улучшаю знания на серьезном проекте. Правильно я вас понял?

      Удалить
    5. Меня заинтересовали следующие проекты: "свой мини-браузер, штуку для трекания своих TODO, twitter клиент". Проект будет десктоп приложение.
      1. В случае 1 и 3 проекта, можно ли использовать сторонние библиотеки для реализации части функционала?
      2. Что имеется виду под "штуку для трекания своих TODO?"
      3. Хотелось проект для взаимодействия с БД. К примеру проект, каталог музыкальных файлов, нормальный будет? не уровень студенческой лабораторной?

      Удалить
    6. 1. В рамках .NET Framework, вы не сможете обойтись совсем библиотек, а о каких "сторонних библиотеках" речь, я не понял.

      2. Поищите что-то по поводу TODO Tracker.

      3. Любая из задач выше может работать с БД.
      Уровень студенческой лабораторной определяется не задачей, а решением. Каждая из этих задач может быть настолько сложной, что потребует несколько человеко-лет усилий. Все зависит от того, что за функционал будет и насколько качественным будет решение.

      Удалить
    7. Этот комментарий был удален автором.

      Удалить
    8. моя цель изучить технологии asp.net mvc, js, jquery, html, css для прохождения собеседования. Можете посоветовать небольшие проекты для данных технологий? Нужно ли asp.net разработчику иметь навыки верстки?

      Удалить
    9. > Можете посоветовать небольшие проекты для данных технологий?
      Антон, а чем не подходят для этих целей предложенные выше проекты?

      > Нужно ли asp.net разработчику иметь навыки верстки?
      Не знаю, я сам вебом никогда в жизни не занимался;)

      Удалить
  10. Этот комментарий был удален автором.

    ОтветитьУдалить
  11. Этот комментарий был удален автором.

    ОтветитьУдалить
  12. Добрый день Сергей!

    Прочитал о вашем способе чтения книг:
    "Еще несколько лет назад я был ярым противником электронных читалок, но в последнее время я изменил свою точку зрения. Сейчас я предпочту электронную версию, поскольку это позволяет делать более обширные заметки и упрощает их последующий поиск. Да и тот факт, что вся библиотека находится у тебя под рукой делает этот вариант для меня более привлекательным."

    У меня вопрос возник, - скажите пожалуйста, на каком планшенте читаете и какой программой пользуетесь?
    Хочу взять "на вооружение" себе. Пока предпочитаю читать в бумажном виде книги.

    ОтветитьУдалить
    Ответы
    1. Я читаю на iPad-е, с помощью GoodReader-а. Эта штука умеет хорошо "разрисовывать" pdf-ки. Можно и текстовые заметки, подчеркивания, выделения и т.п. Ну и работает шустро.

      Удалить
    2. Спасибо!

      Хорошее совпадение - я тоже (когда есть настроение и не болят глаза от компьютера) читаю на iPad'e и купил GoodReader :) . Думал что есть еще "что-то" еще лушее (и из планшетов и из прорамм) - лучшее, в смысле - для глаз. Т.к. единственное что сейчас меня останавливает от длительного чтения на iPad'e, так это то, что при переключении с монитора на другой тип "светящейся читательной по верхности" глаза начинают существенно болеть. Еденственное из читалок что не напрягает глаза, так это Kindle reader.

      Удалить
    3. Интересно, что у меня раньше устает мозг, а не глаза:))

      Я пробовал читать на киндле, но это был не paper white, а предыдущая модель. Прочитал несколкьо книг (художественных), но особой разницы для своих глаз не заметил. Перешел на iPad. Видно, есть какие-то особенности в восприятии.

      Удалить
  13. Здравствуйте сергей. Подскажите, как закреплять прочитанное на практике? Со временем изученный материал забывается, а не реальном проекте не всегда есть возможность закрепить изученный материал. К примеру сейчас изучаю книгу по asp.net mvc

    ОтветитьУдалить
    Ответы
    1. > как закреплять прочитанное на практике?
      Практиковаться:). Сделать один или несколько учебных проектов (серьезность зависит от времени/желания). Можно вести заметки на полях книги или сразу публиковать в блог. Последнее особенно полезно, поскольку копнуть для написания статьи придется больше, чем при простом изучении. Второй плюс блоггания - будет восстановить знания по своим собственным статьям, поскольку в голове быстрее всплывет вся картина по своим собственным записям.

      Удалить
    2. На счет учебного проекта, делать проект после каждой прочтенной главы или после прочтения книги делать проект?

      Удалить
    3. Я не могу ответить на этот вопрос:) Все зависит от того, насколько понятен материал, куда хочется копнуть и т.п.

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

      Удалить
  14. Сергей, интересно с какой частотой и в какое время суток читаете книги :) Выделяете как-то специально для этого время или читаете в свободное время? И еще вопрос - к чтению книг вы относите именно книги или блоги/статьи в интернете тоже?
    Спасибо!

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

      По поводублогов/статей: нет, я их не ставлю в один ряд с книгами. Для меня, блоги/статьи служат одной из трех целей: я сейчас изучаю что-то конкретное и ищу любую доступную информацию (например, я пишу статью и мне нужна дополнительная информация); новости; изучение чего-то в процессе решения проблемы по работе. Иногда в процессе ничегонеделания попадаются интересные статьи, но бывает сложно переключиться с расслабленного режима на полноценный режим познания. Поэтому чаще всего такие статьи попадают в закладки и никогда из них не выбираются.

      Книги же для меня - это более планомерное обучение, которое требует большего фокуса и дает мне большую отдачу.

      Удалить
  15. Сергей, добрый день!
    В Вашем профиле на goodread 121 книга числится как прочитанная. По моим меркам это очень и очень много. Поделитесь секретом, как удается выделить столько времени на чтение? Используйте приемы тайм-менеджмента?

    ОтветитьУдалить
    Ответы
    1. По моим меркам, 120 книг - это не много. Я ставлю цель читать 20-25 книг в год, что даст за десяток лет не менее 200 книг. Но вот справляюсь пока с этой целью с трудом:))

      По поводу чтения: обычно происходит все такими-себе скачками. Взялся за определенную тему, выбрал несколько книг и стараюсь уделить чтению порядка часа в день. Лучше больше, но не всегда выходит.

      По поводу тайм-менеджмента, тут все просто, ИМХО. Чтобы выделить время на что-то нужное, нужно уменьшить время на что-то ненужное. К ненужному обычно относятся всякие убийцы времени, типа фейсбуков и телевизора. Я провожу там время, но стараюсь его ограничивать разумными рамками.

      Удалить
  16. Спасибо, добрый человек, за всю твою книжную рубрику!
    Прошу совет, скорее общий для обучения, чем по чтению книг, раз уж ты так глубоко копаешь в этой части.
    Если я выхватываю основы по какому-то языку/технологии/теории, но чувствую, что знания сыры - мне тем не менее очень сложно уже с этой позиции взяться за какую-либо книгу, посмотреть видео-урок, чтобы закрыть пробелы. Сложно(очень скучно, очень тяжело идёт), допустим, вычитать всю главу по нужному вопросу, т.к. кажется, что я всё это знаю, а найти среди 20 страниц(2-х часов видео) те недостающие несколько ценных строк, не просмотрев всё целиком - огромная трата времени. В итоге я не могу сказать, что имею полноценные знания по теме, что часто проявляется, если я сразу пытаюсь браться за более сложный(продвинутый) уровень. Т.е. необходимость очевидна, а как к этим знаниям пробиться сквозь кажущуюся неимоверную скуку не знаю. Думаю, это легко почувствовать, если любой опытный эксперт попробует засесть за основы, чтобы что-то там вычитать новенькое или освежить знания перед лекцией.
    Я понимаю, что на практических примерах(не книжных закрепляющих упражнениях, а, скорее, домашних проектах) процесс обучения идёт интересно и интенсивно, но во-первых, где ж взять столько идей, тем более для начальных и средних знаний, а во-вторых, именно такой подход в общем и создаёт эту ситуацию с обрывками, клочками нахватанных так-сяк знаний вместо комплексного владения.
    Короче, очевидно, что это проблема из области как раз процесса обучения. Может, есть какие-нибудь рекомендации на этот счёт?
    Ещё раз спасибо!

    ОтветитьУдалить
  17. В тему отработки навыков при изучении нового языка я бы добавил www.codingame.com, т.к.: там есть редактор с поддержкой множества языков, решение проверяется посредством прогонки контрольных тестов, ну и там есть довольно любопытные задачи.

    ОтветитьУдалить