Эволюция метода Janki. Советы, комбинации клавиш, пересмотр первоначальной версии метода


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

Пост решил оформить в виде пунктов – так будет проще и мне и вам. Каждый пункт – принцип, который я вывел для своей системы обучения, общая цель которой – изучение как можно большего объема информации за как можно более короткий срок.

1. Скриншоты vs. текст

Изначально, создавая карточки, я просто вставлял фрагменты кода в виде текста. Теперь же я делаю скриншоты примеров кода (с помощью горячих клавиш) из редактора, книг о программировании, и веб-сайтов типа Stack Overflow. Таким образом я экономлю время – не нужно копировать код в Anki. Также у меня перед глазами правильный синтаксис, что делает карточки более наглядными и ускоряет процесс повторения.

Позвольте в добавок ввернуть «научное» наблюдение в стиле Тима Ферриса: Я считаю, что снимок изучаемого объекта позволяет запомнить ответ гораздо быстрее поскольку:
  • зрительная память – самая долговечная, и
  • цвета, шрифт, ссылка на сайт – гораздо более легко усвояемая пища для ума, нежели очередная пресная «текстовая» карточка.



2. Знание практического применения важнее подробного описания

Поначалу в каждой карточке я подробно расписывал информацию о каждой функции, включая класс, возвращаемые значения и их типы, списки параметров, их порядок. За годы изучения я понял, что эту информацию очень сложно удерживать в голове, когда в колоде начинают появляться новые языки программирования, особенно те, у которых встречаются функции со схожими названиями (напр. each()), но немного другим применением. Двигаясь от одного языка к другому, я понял, что подробная информация таки ускоряет процесс освоения языка, но через короткое время столь мелкие подробности все равно вылетают из головы. Однако я рад, что в моем арсенале есть один «родной» язык (Ruby), который я изучил вдоль и поперек – благодаря этому я могу быстро и легко набросать сервисную программку, скрипт или хак.

Более важно запоминать то, какие встроенные функции существуют в языке и какие сервисы доступны в той или иной операционной системе или протоколе. Я создаю карточки с различными командами в Linux или всякими полезностями для Javascript.



Иногда я создаю – как я их сам называю – карточки-гибриды, которые включают и описание команды и то, как она работает. Для этого, на обычный вопрос «что такое…» следует ответ в виде подробного объяснения, либо скриншот примера использования кода (с конкретными переменными и результатами) – подобно тому, как люди, изучающие иностранный язык, закрепляют новое слово примером его использования. Когда я повторяю карточки, я могу пробежаться по примеру использования функции, но не стараюсь выучить все наизусть. Если возникнет необходимость использовать данную функцию для какого-нибудь проекта, я могу отдельно и детально изучить необходимые карточки, что позволяет функционал Anki.

Пример карточки-гибрида



3. Вырезки

У каждого графического дизайнера в том или ином виде есть «альбом вырезок» в котором он хранит работы людей, которыми восхищается. И каждый раз, когда необходимо вдохновение, он просто заглядывает в свой «альбом». То же самое могут делать и программисты. Когда вам попадается особенно остроумный, находчивый прием, скопируйте его или сделайте скриншот, а затем поместите его в виде карточки в свою колоду.



Зачем писать код, когда проблему решит обычная gif-ка



Полезный совет, который я подсмотрел в видео одного опытного программера

Чтобы адаптировать эти знания под Anki в виде карточки вопрос/ответ, я поступаю следующим образом: в поле вопроса перед скриншотом я пишу что-то вроде: «чем хорош этот код?», в поле же ответа я по пунктам перечисляю преимущества выбранного приема, тем самым заставляя себя поработать мозгами и облечь в слова то, что я выучил, вместо того, чтобы просто поместить фрагмент удачного кода в рамочку для безмолвного созерцания и восторгания.



Анализ имен переменных

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

4. Информация, в которой важен порядок, не слишком хорошо «анкифицируется»

Раньше я думал, что любое техническое знание можно без труда поместить в Anki. Однако опыт заставил убедиться в том, что не все так замечательно. Я заметил одно важное исключение – информация, для которой важен порядок/структура материала. К примеру, я создал набор достаточно объемных карт по настройке ключей SSH для сервера – достаточно сложному и многоуровневому процессу. Но, несмотря исправное штудирование карточек в Anki, я не мог запомнить порядок действий в данном процессе, и мне постоянно приходилось прибегать к помощи онлайн-обучалок. И все то время, которое я потратил на создание карточек в Anki, посвященных ключам SSH, по сути, пропало даром.

Я не готов ответить, что послужило причиной неудачи. Возможно, я изначально неправильно подошел к созданию карточек под подобную тематику. Возможно, стоило исправить ситуацию добавлению в колоду карточек, которые включали бы вопрос: какое действие следует за каким? Однако я считаю, что создание такого количества дополнительных/вспомогательных карточек не стоит того огромного количества времени, которого оно требует. Я лучше буду иметь под рукой справочный материал, в котором можно подсмотреть порядок выполнения операций.

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

Для себя я решил, что второстепенные технологии (языки, библиотеки, наборы функциональных возможностей и понятия, которые я редко использую в своей работе) не столь важны, чтобы включать их в ежедневную процедуру повтора карточек, поэтому после того, как я заношу подобную информацию в базу программы в ходе выполнения связанного с ними проекта (к примеру, использование Backbone в веб-приложении в прошлом году), я откладываю их изучение. Если появляется проект, работа над которым связана с использованием этих технологий, я использую настройки Anki, и повторяю соответствующие карточки. Если же такой проект не появляется, я оставляю эти карточки в режиме «suspend» на неопределенный срок. Возможно, мне никогда не доведется к ним вернуться.

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

6. Снижайте интенсивность

Стандартная процедура интервального повторения (за которую выступал П. Возняк) заключается в повторении всех карт, чей срок настал к моменту этого самого повторения. Таким образом информация максимально надежно сохраняется в долгосрочной памяти. Я следовал этой процедуре около двух лет, однако пришел к выводу, что таким образом процесс обучения становится излишне насыщенным. Чтобы немного упростить себе жизнь, я ставлю ограничение в 40 карточек в день, а также в настройках увеличиваю интервал между повторениями карт, ответ на которые я нахожу простым, а также интервал между повторениями карт вообще (interval modifier). В итоге, простые карты всплывают реже (это в основном несложные вопросы, касающиеся основ, на которых строятся и включают в себя более сложные понятия, поэтому здесь все логично), а interval modifier просто увеличивает временной промежуток между всеми повторениями, вне зависимости от сложность вопроса. Таким образом, количество карточек, которое нужно повторить утром, уменьшается.

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



Окно настроек, в котором можно изменить интервалы повторения

7. Читаешь книгу – делай пометки

Когда я читаю бумажный учебник по программированию, я помечаю цифрами (1, 2, 3…) на полях те фрагменты, которые я планирую позже занести в Anki. Также я делаю небольшую приписку-напоминание типа «эффективная система сортировки файлов». По прочтении книги я еще раз пробегаюсь по страницам и превращаю в карточки все те фрагменты, которые считаю того достойными.

Делаю я это именно таким образом вот почему:
  • не хочу отвлекаться от чтения, откладывать книгу и садиться за ноут, чтобы создать новую карточку, и
  • часто авторы книг более полно раскрывают суть понятия в последующих главах – я использую в карточках только самые удачные и понятные объяснения.

8. Уделяйте особое внимания моментам, общим для разных языков

По мере обучения языкам программирования и библиотек, я понял, что ценность использования метода Janki в постижении моего первого языка – Ruby – заключается в том, что я попутно учил так называемые «мемы», которые встречаются и в других языках.

К примеру, такие модули, как each(), map(), select(), reject(), и zip() встречаются в том же или схожем виде в Javascript, Lisp, Python и различных библиотеках (таких, как Javascript Underscore). Знание значения и применения этих функций значительно сокращает время изучения новых языков.

9. Не можешь запомнить код – примени его на практике

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

10. Найдите знанию практическое применение. Или удалите карточку.

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


Внизу дописываю способы применения

11. Выделяйте основное жирным шрифтом

Вам нужно делать все возможное для того, чтобы сократить время, которое тратится на повторения карточек. Есть одно простое и эффективное решение – выделять ключевые слова или основную мысль жирным шрифтом. Это особенно полезно если в вашей колоде имеется целый ряд карточек, посвященных похожим вопросам, например, описанию исключений в каком либо пространстве имен либо классе. Ваши глаза, натренированные годами просмотра интернет страниц, научены моментально выхватывать из текста фрагменты, выделенные жирным шрифтом. Также я обнаружил, что они особенно прочно западают в память – стоит их увидеть, и в голове тут же возникает правильный ответ, и уже не нужно полностью вычитывать весь текст карточки. Максимально используйте подобные «триггеры», и процесс повторения ускорится в разы.



Без выделения



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

12. Карточки с лучшими практиками

Откуда бы я ни взял пример лучшей практики – будь то работа с более квалифицированным программистом, обучающее видео, или коммент на Github, я превращаю идею в карточку. Пока ничего нового, правда? Так вот, мой подход к карточкам из категории «лучшие практики» отличается от подхода к изучению прочих карт. Я нажимаю кнопку «не помню» если последнее время не использовал данный метод в своей работе. В отличие от обычных карточек, мне вовсе не нужно помнить о существовании тех или иных эффективных практик. Цель этого вида карточек заключается в их применении, а тот факт, что я постоянно «не помню» заставляет меня двигаться в нужном направлении.



Лучшая практика: я что, не могу использовать нормальные имена для переменных?



Лучшая практика: своди пространство имен к минимуму

13. Карточки с примерами и разъяснениями

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


Без объяснения эта карточка не столь эффективна


Объяснение делает карточку гораздо полезнее

Похожий вариант – карты с решением однократного бага/команды с подробным описанием.


Разбивайте команду на составляющие

Оригинал статьи — Janki Method Refined

1 комментарий

avatar
Проблема из пункта 4 решается с помощью Cloze Deletion (сочетание клавиш Ctrl+Shift+C в Anki). Просто описываем последовательность действий, которую нужно запомнить в одной карточке, применяем пропуски для каждого пункта, и в итоге получаем количество карточек, равное количеству пунктов:


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

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