Думаю, я наконец-то понял, почему они мне не нравятся. И не только потому что они учат навыкам, которые скоро станут устаревшими. Это их педагогический подход в целом. Алгоритм обучения как будто такой: напиши эти программы, где мы говорим всё, что нужно сделать, и теперь ты знаешь этот язык/фреймворк/базу данных/кексопечку. Главное в этих книгах — длинные листинги кода, которые читатель должен воспроизвести. Вот пример из одной из лучших книг этой категории.
class User < ApplicationRecord
attr_accessor :remember_token
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
# …далее ещё 30 строчек...
end
Традиционно есть два способа изучить такую страницу:
- Ввести каждую строку кода вручную.
- Скопипастить код с их сайта, возможно, поиграться и внести небольшие изменения.
В первом случае, как и в лекциях, код переходит со страницы книги на экран читателя, минуя мозг. Второй вариант — это как пытаться собирать автомобили, разбирая ремень безопасности и стереосистему: вы просто играетесь с маленькими кусочками. Оба варианта не подходят для обучения.
Опытный наставник на станет обучать вас страничкой с кодом. Но уж такие книги у нас есть. Как же читать их так, чтобы следовать принципам обучения? Разберёмся.
Мысленные образы
По словам К. Андерса Эрикссона в его книге Peak, экспертиза — это процесс построения ментальных репрезентаций (мысленных образов). Мы можем их увидеть, потому что умы экспертов хранят знания в сжатом виде. Музыкант способен запомнить страницу с мелодией гораздо быстрее, чем страницу со случайными нотами. Опытный шахматист, которому сказали запомнить позицию на доске, сделает это гораздо лучше любителя, но если ошибётся, то перепутает целую группу фигур.
Такое возможно, потому что в музыке и шахматной композиции есть структура, из-за которой они выглядят совершенно иначе, чем страница случайных нот или случайная расстановка фигур. Технически говоря, у них более низкая перплексивность, чем у случайного шума. Таким образом, хотя в английском алфавите 26 букв, Клод Шеннон показал, что информационное содержание английского языка составляет около 1 бита на букву: зная случайное начало абзаца, люди угадывают следующую букву примерно в половине случаев.
Вот почему опытный программист может читать код как художественную литературу, останавливаясь лишь на необычных битах, в то время как новичок пыхтит, читая строчку за строчкой. Именно поэтому умный инструмент автодополнения угадывает длинную последовательность кода из первой пары строк. Более качественные мысленные образы просто облегчают понимание кода.
(Как работают эти мысленные образы? Моя коллега Зенна Таварес утверждает, что это структуры данных, чувствительные к распространению).
Это именно то, чего лишён подход «просто введите код»: ничто не заставляет ваш ум представлять программу как нечто лучшее, чем просто последовательность символов. Тем не менее, если заставить свой ум сделать это, то вы быстрее ухватите суть концепции. Вот идея 200-летней давности, как этого добиться.
Метод Бенджамина Франклина
Не знаю, что более впечатляет: что Бенджамин Франклин стал светилом во всём, от политики до физики, или что для этого ему не понадобились современные методы образования, такие как школы, учителя или StackOverflow. Вместо этого он открыл мощный метод самообучения. Позволю ему сказать самому (или можете прочитать чужой краткий пересказ).
Примерно в это время мне попался в руки разрозненный том «Зрителя». Это был том третий. До сих пор я ещё не видел ни одного. Я купил его, неоднократно перечитывал от корки до корки и был от него в совершенном восхищении. Слог показался мне бесподобным, и я решил, насколько возможно, ему подражать. С этой целью я взял некоторые очерки и кратко записал смысл каждой фразы, затем я отложил их на несколько дней, а потом попытался восстановить текст, не заглядывая в книгу и излагая смысл каждой фразы так же полно и подробно, как в оригинале, для чего я прибегал к таким выражениям, которые мне казались уместными. Затем я сравнил своего «Зрителя» с подлинником, обнаружил некоторые свои ошибки и исправил их.
—Бенджамин Франклин. Автобиография
Этот процесс немного похож человеческий вариант автокодировщика в машинном обучении. Автокодировщик представляет собой нейронную сеть, которая пытается воспроизвести на выходе такие же данные, какие были на входе, но с прохождением через промежуточный слой, который слишком мал, чтобы полностью представлять данные. В ходе этой процедуры ему приходится выучить более компактную репрезентацию данных. Здесь в качестве нейронной сети выступает скопление дендронов в вашей голове.
К. Андерс Эрикссон уподобляет метод тому, как художник практикуется, пытаясь сымитировать некоторые известные работы. Математик учится доказывать теоремы самостоятельно, не читая книгу или научную статью — даже если не получится, потом ему будет проще свести доказательство к основному инсайту. Я использовал этот процесс, чтобы лучше понимать графический дизайн; это было похоже на лазерную коррекцию зрения.
Но в отношении книг по программированию основная идея особенно проста, и в то же время эффективна.
Как это работает:
- Читайте книгу как обычно. Когда попадётся образец кода, прочитайте его.
- Закройте книгу.
- Попробуйте набрать код.
Просто, верно? Но попробуйте и посмотрите, как приходится изучать и понимать структуру.
Всё очень похоже на то, что вы делали раньше, только с более качественным обучением.
Комментарии (17)
invzbl3
27.02.2018 08:30И продебажить, конечно. Очень удобно проследить за каждой веткой кода и рассмотреть принципы работы программы. Ещё отмечу серию книг Head First, т.к. дельно подается материал и прекрасно усваиваться. Спасибо за данную публикацию.
stiverb
27.02.2018 08:30Книга может и лучшая, но код для понимания(не только новичкам) можно сделать читабельнее:
User.rbclass User < ApplicationRecord VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i attr_accessor :remember_token validates :email, format: { with: VALID_EMAIL_REGEX } validates :email, length: { maximum: 255 } validates :email, presence: true validates :email, uniqueness: { case_sensitive: false } validates :name, length: { maximum: 50 } validates :name, presence: true validates :password, length: { minimum: 6 } validates :password, presence: true before_save { self[:email] = email.downcase } has_secure_password class << self # Returns the hash digest of the given string. def digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # Returns a random token. def new_token SecureRandom.urlsafe_base64 end end # Remembers a user in the database for use in persistent sessions. def remember self[:remember_token] = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # Returns true if the given token matches the digest. def authenticated?(remember_token) BCrypt::Password.new(remember_digest).is_password?(remember_token) end # Forgets a user. def forget update_attribute(:remember_digest, nil) end end
Noserdan
27.02.2018 08:30Ви-таки хотите сказать, что я буду собирать автомобиль по памяти, все так же не понимая как он работает?)
Alexeyslav
27.02.2018 14:38Именно! На 100-й детали к вам придёт мысль что таки надо понимать как он работает и что именно для этого ВАМ надо искать. Чтобы не пересобирать по нескольку раз одно и тоже только потому что «забыл там шайбу положить». В этом и состоит цель обучения на собственных ошибках, когда в процесс включается мозг. Начинаешь думать заранее а нужна ли тут шайба, чтобы через 2 часа не пришлось разбирать узел чтобы её туда вставить.
TemaAE
27.02.2018 09:11Курсе на втором матфака вывел для себя метод подготовки к сдаче теоретической части экзаменов.
Брал список билетов с вопросами. И по порядку — читал вопрос, находил теорему и читал ее доказательство. Не стараясь запоминать, но так чтобы было понятно откуда что берется.
Прочитывал таким образом 10-12 теорем, закрывал лекции-учебники. Брал лист бумаги и пытался доказать их последовательно уже самостоятельно. Стопорясь в каком-то месте, подсматривал это место и снова самостоятельно шел дальше. «Помарочные» доказательства (в процессе которых приходилось подглянуть) не переписывал заново и не возвращался к ним пока все билеты не были пройдены. Если перед экзаменом оставалось время — проходил еще на один раз. Если нет, то уже было все равно не страшно.
В процессе сдачи не приходилось принудительно вспоминать целиком само доказательство, просто начинаешь доказывать сам как-будто решаешь некую задачу задачу, упираешься как правило в те же микро-места где упирался при подготовке и помнишь как их проходить — а это несравнимо меньший объем для запоминания.
И еще важно — в эти периоды спал кроме ночи 2-3 за день по часу.
В итоге шпаргалка понадобилась только один раз за весь период обучения.brickerino
27.02.2018 15:53Да, прочитать и потом самому доказать легче, чем запомнить всё целиком. На экзамене главное вспомнить откуда и куда надо прийти (т. е. про что билет\теорема), и иметь общее понимание курса.
AlexGin65
27.02.2018 13:44-1Подход к изучению различних тем по программированию (в т.ч. и используя книги), должен быть следующий:
1) Прочитал текст, разобрался в теоретических аспектах;
2) Выполнил, под Debug-ером приведенный в первоисточнике пример;
3) По мативам данного примера, сделал свой, другой пример, основанный на том, что описано в первоисточнике;
4) Поискал ещё публикации по данной теме (в интернете, в книгах) проанализировал их;
5) Дополнил свой пример, на основании анализа и осмысления.
Вот, ИМХО, подход современного IT специалиста.begemoth3663
27.02.2018 18:30так и вижу, как тимлид/скрам-мастер/пм "невозмутимо" взирают на неукоснительное исполнение пп1-5...
N.B. бляха-муха, такие все "правильные", что непонятно, откуда такое кол-во г@в#0кода...
tema_sun
27.02.2018 14:31Программирование в книге и в реальностиevgenWebm
27.02.2018 21:28+1Хорошая книга по программированию это справочник.
Даже основы программирования можно написать как справочник.
Но нет, мы напишем книгу в 800 страниц, где пройдемся по 3/2 аспектам программирования, причем поверхностно и с тоннами воды.
В 99% книги бесполезны.
З.Ы. Последняя попытка прочитать книгу у меня закончились психами. Я прочел больше половины книги и дошел до темы «Указатели». Где мне написали, чтобы я не заморачивался если не понимаю что такое указатели. Мол даже матерые программисты не понимают, что это такое. Бросил книгу нафиг. Спасибо господа. Вместо объяснения, мне сказали не думать.
И это не единичный случай.
Noserdan
28.02.2018 08:13Видится мне в этом общая нынче тема: вместо того, чтобы обучать думать, людей учат использовать шаблоны.
Заголовок спойлераПрошу прощения за политоту, но таким народом проще управлять)begemoth3663
28.02.2018 15:05ай, как Вы правы!..
но я не против книг. и даже шаблонов. для себя же понял, что не смотря на все неудобства и боль лучше читать оригинал (на английском). теперь другая проблема: как быстро [по обложке ;)] определить "потянешь" книгу или нет?.. ;)brickerino
28.02.2018 20:15Знаете, пословица есть, что-то про книги, обложки и суждение.
У вас что, нет времени отзывы прочитать на книгу? Или сначала почитать рекомендации, а потом купить, что советуют?Alexeyslav
01.03.2018 15:00Отзывы основаны на личных предпочтениях, которые далеко не всегда совпадают с вашими.
Очень хорошо это видно на рейтингах фильмов. По рейтингу 9+ балов из 10, а фильм отстой…
crmMaster
Хороший совет, но есть еще более расширенный вариант этого совета — не переписывать код подчистую, а пытаться его применить в разрабатываемом учебном проекте. Тогда кроме вопроса «как» закрывается еще и вопрос «зачем», который у опытных разработчиков возникает куда чаще, чем «как»