Memorizing a programming language using spaced repetition software

Оригинал Перевод

2013-01-06

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



Моя история


Признаюсь, я достаточно посредственный программист. У меня нет специального образования. Я просто учился кое-чему ввиду необходимости – я запустил небольшой сайт CD Baby, который со временем стал разрастаться, и поскольку я не мог позволить себе нанять специалиста, я просто потратил около 25$ на книги по PHP, SQL, Linux и Apache. Из них я почерпнул тот минимум знаний, который помог мне поддерживать сайт в рабочем состоянии. Годами я использовал этот скромный набор.

Однако позже, когда мне довелось работать бок о бок с НАСТОЯЩИМИ программистами, я был просто поражен объемом их знаний. Все эти команды и функции просто отскакивали от их пальцев. Мы пользовались одним и тем же языком, однако они хранили в памяти такое невероятное количество информации, что я почувствовал себя третьеклассником рядом с профессором университета. Мне захотелось добиться такой же скорости работы.

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

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



Интервальное повторение


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

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

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

forgetting curve

Предположим, вы выучили новое иностранное слово. Повторите его спустя несколько минут после того, как услышали его, затем – через пару часов, затем – через день, затем – через 2 дня, затем – через 5 дней, затем – через 10 дней, 3 недели, 6 недель, 3 месяца, 8 месяцев и т.д. Через некоторое время оно накрепко засядет в вашей голове – нужно будет лишь изредка его повторять.

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

По этой ссылке: apps.ankiweb.net можно скачать программу Anki – бесплатную и самую популярную программу такого рода. Существуют версии для Mac, Windows, Linux, iPhone, Android и т.д. Написана на Python.

Ну а теперь поговорим непосредственно о программировании.

Что если бы вы могли запомнить все в изучаемом вами языке программирования? Все команды, параметры, функции. Решения для сотен самых распространенных проблем – все это практически на уровне мышечной памяти? Представьте, как читаете книгу или документ и запоминаете все в мельчайших подробностях!

Ну ладно, пора переходить от вступления к делу.



Для начала выучи!


Начну с того, что проясню одну важную вещь:

Карточки нужны для того, чтобы запомнить то, что выучил.

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

(Именно поэтому использование чужих колод не так эффективно. Это же просто напоминалки.)



Формулируйте знания в виде небольших фактов


Вам предстоит создать огромное количество карточек. Вопрос — с одной стороны. Ответ – с другой.

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

example chinese flash card question
example chinese flash card answer

example chinese flash card question
example chinese flash card answer

С другими дисциплинами не все так просто – от вас потребуется немного творческого мышления.

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

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

Заменяйте долгие описания примерами с использованием кода

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

«Оператор сложения (+)… если хотя бы один операнд – строковый, второй также преобразуется в строковый, таким образом, результат сложения – объединение двух строковых операндов.»

Вы проверяете эту информацию на практике, изучаете вопрос вдоль и поперек, в итоге выясняете, что 1 + '1' таки равно '11'. После чего создаете карточку, которая поможет запомнить этот факт:


	var a = 5 + '5';
	// what is a?

	'55'
	If either side of + is a string, the other is
	converted to a string before adding like strings.
			

Ставьте себе вопросы с подвохом

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

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

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

			
	var a = new Array('5');
	// what is a?

	An array with one item, the string '5': ['5'];
			

… и за ней – практически идентичный вопрос…


	var a = new Array(5);
	// what is a?

	An empty array with a length of 5.
			

Когда программа будет вас проверять, она будет выдавать карточки с вопросами вперемешку, поэтому подвох вас ждет – как обычно – в самый неожиданный момент.

Можете попробовать более изощренные варианты, которые заставят вас надолго запомнить «интересные» карточки:


	var a = [20, 10, 5, 1];
	// what is a.sort()?

	[1, 10, 20, 5]
	// sort treats all values as strings
			

Не забывайте также задавать себе небольшие задачки:


	var a = [20, 10, 5, 1];
	// sort these in numeric order

	function compare(v1, v2) { return(v1 — v2); }
	a.sort(compare);
			

Запоминайте интересные приемы

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

			
	var albums = [
		{name: 'Beatles', title: 'White Album', price: 15},
		{name: 'Zeppelin', title: 'II', price: 7}];
	// make this work:
	albums.sort(by('name'));
	albums.sort(by('title'));
	albums.sort(by('price'));

	function by(propName) {
		return function(obj1, obj2) {
			v1 = obj1[propName];
			v2 = obj2[propName];
			if (v1 < v2) { return -1; }
			else if (v1 > v2) { return 1; }
			else { return 0; }
		};
	}
			

Задавайте вопросы с несколькими вариантами ответов

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


	s = 'string like this'
	# In Ruby, show two ways to turn it into 'String Like This'

	s.split.map(&:capitalize).join(' ')
	s.gsub(/\b\S/) {|x| x.upcase}
			

Учите объемные понятия посредством коротких примеров

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


	/(a(b)((c)d))/.match('abcd')
	# What will $1, $2, $3, $4 be?

	$1 = 'abcd'
	$2 = 'b'
	$3 = 'cd'
	$4 = 'c'
			

Другой пример:


	class C
		self
	end
	class D < C
	end
	d1 = D.new
	# which object is self?

	class D
			

Прочитайте «20 Rules of Formulating Knowledge» Петра Возняка

Рекомендую на эту тему почитать статью Петра Возняка “20 Rules of Formulating Knowledge” – там вы найдете очень много полезных советов. Статья находится здесь: supermemo.com/en/articles/20rules.



Занимайтесь каждый день


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

Вы можете запомнить тысячи фактов, тратя на них по 20 минут в день. Для меня это утренний ритуал. Наливаю чашечку горячего чая. Открываю Anki. Пью чаек.

Можно сделать все гораздо интереснее – заставить себя отвечать на вопросы как можно быстрее.

Мне это напоминает воркаут для мозга. 20 минут «тяжелой атлетики» в день окупятся в виде моментальных и долгосрочных результатов.

Добавляйте все новые и новые карточки, и вы будете удивлены, насколько свежа вся эта информация в вашей голове.



Заключение


Я уже год практикую этот метод, и могу сказать, что он ЗНАЧИТЕЛЬНО повысил мою продуктивность. Поэтому я крайне настоятельно его рекомендую и вам.

Вы можете использовать этот подход в изучении чего угодно. Вдохновить на это может эта статья.

Не стесняйтесь, пишите мне в любое время, задавайте вопросы или просто делитесь успехами.



Читайте подробнее:


"Janki Method Refined" Джека Кинселлы - отличная статья о подобном подходе, объясняющая его даже лучше, чем я здесь.

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

"Augmenting Long-term Memory" Майкла Нильсена - замечательная статья об использовании Anki для изучения чего угодно.

Прочтите интервью с Петром Возняком на сайте wired.com, чтобы узнать о человеке, который довел это до предела.