Посмотрим правде в глаза, книги по программированию — отстой. Эти общие книги по распределённым системам, науке о данных и так далее — их можно читать бесконечно. Но за редким исключением у практических руководств по языку/фреймворку/СУБД/кексопечке есть нечто общее. Зверюшка на обложке, примеры вычурных приложений, они так легко забываются, так банальны, настолько… ничему не учат.

Думаю, я наконец-то понял, почему они мне не нравятся. И не только потому что они учат навыкам, которые скоро станут устаревшими. Это их педагогический подход в целом. Алгоритм обучения как будто такой: напиши эти программы, где мы говорим всё, что нужно сделать, и теперь ты знаешь этот язык/фреймворк/базу данных/кексопечку. Главное в этих книгах — длинные листинги кода, которые читатель должен воспроизвести. Вот пример из одной из лучших книг этой категории.

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

Традиционно есть два способа изучить такую страницу:

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

В первом случае, как и в лекциях, код переходит со страницы книги на экран читателя, минуя мозг. Второй вариант — это как пытаться собирать автомобили, разбирая ремень безопасности и стереосистему: вы просто играетесь с маленькими кусочками. Оба варианта не подходят для обучения.

Опытный наставник на станет обучать вас страничкой с кодом. Но уж такие книги у нас есть. Как же читать их так, чтобы следовать принципам обучения? Разберёмся.

Мысленные образы


По словам К. Андерса Эрикссона в его книге Peak, экспертиза — это процесс построения ментальных репрезентаций (мысленных образов). Мы можем их увидеть, потому что умы экспертов хранят знания в сжатом виде. Музыкант способен запомнить страницу с мелодией гораздо быстрее, чем страницу со случайными нотами. Опытный шахматист, которому сказали запомнить позицию на доске, сделает это гораздо лучше любителя, но если ошибётся, то перепутает целую группу фигур.

Такое возможно, потому что в музыке и шахматной композиции есть структура, из-за которой они выглядят совершенно иначе, чем страница случайных нот или случайная расстановка фигур. Технически говоря, у них более низкая перплексивность, чем у случайного шума. Таким образом, хотя в английском алфавите 26 букв, Клод Шеннон показал, что информационное содержание английского языка составляет около 1 бита на букву: зная случайное начало абзаца, люди угадывают следующую букву примерно в половине случаев.

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



(Как работают эти мысленные образы? Моя коллега Зенна Таварес утверждает, что это структуры данных, чувствительные к распространению).

Это именно то, чего лишён подход «просто введите код»: ничто не заставляет ваш ум представлять программу как нечто лучшее, чем просто последовательность символов. Тем не менее, если заставить свой ум сделать это, то вы быстрее ухватите суть концепции. Вот идея 200-летней давности, как этого добиться.

Метод Бенджамина Франклина


Не знаю, что более впечатляет: что Бенджамин Франклин стал светилом во всём, от политики до физики, или что для этого ему не понадобились современные методы образования, такие как школы, учителя или StackOverflow. Вместо этого он открыл мощный метод самообучения. Позволю ему сказать самому (или можете прочитать чужой краткий пересказ).

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

—Бенджамин Франклин. Автобиография

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

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

Но в отношении книг по программированию основная идея особенно проста, и в то же время эффективна.

Как это работает:


  1. Читайте книгу как обычно. Когда попадётся образец кода, прочитайте его.
  2. Закройте книгу.
  3. Попробуйте набрать код.

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

Комментарии (17)


  1. crmMaster
    26.02.2018 17:11

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


  1. invzbl3
    27.02.2018 08:30

    И продебажить, конечно. Очень удобно проследить за каждой веткой кода и рассмотреть принципы работы программы. Ещё отмечу серию книг Head First, т.к. дельно подается материал и прекрасно усваиваться. Спасибо за данную публикацию.


  1. stiverb
    27.02.2018 08:30

    Книга может и лучшая, но код для понимания(не только новичкам) можно сделать читабельнее:

    User.rb
    class 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
    


  1. Noserdan
    27.02.2018 08:30

    Ви-таки хотите сказать, что я буду собирать автомобиль по памяти, все так же не понимая как он работает?)


    1. Alexeyslav
      27.02.2018 14:38

      Именно! На 100-й детали к вам придёт мысль что таки надо понимать как он работает и что именно для этого ВАМ надо искать. Чтобы не пересобирать по нескольку раз одно и тоже только потому что «забыл там шайбу положить». В этом и состоит цель обучения на собственных ошибках, когда в процесс включается мозг. Начинаешь думать заранее а нужна ли тут шайба, чтобы через 2 часа не пришлось разбирать узел чтобы её туда вставить.


  1. TemaAE
    27.02.2018 09:11

    Курсе на втором матфака вывел для себя метод подготовки к сдаче теоретической части экзаменов.
    Брал список билетов с вопросами. И по порядку — читал вопрос, находил теорему и читал ее доказательство. Не стараясь запоминать, но так чтобы было понятно откуда что берется.
    Прочитывал таким образом 10-12 теорем, закрывал лекции-учебники. Брал лист бумаги и пытался доказать их последовательно уже самостоятельно. Стопорясь в каком-то месте, подсматривал это место и снова самостоятельно шел дальше. «Помарочные» доказательства (в процессе которых приходилось подглянуть) не переписывал заново и не возвращался к ним пока все билеты не были пройдены. Если перед экзаменом оставалось время — проходил еще на один раз. Если нет, то уже было все равно не страшно.

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

    И еще важно — в эти периоды спал кроме ночи 2-3 за день по часу.

    В итоге шпаргалка понадобилась только один раз за весь период обучения.


    1. brickerino
      27.02.2018 15:53

      Да, прочитать и потом самому доказать легче, чем запомнить всё целиком. На экзамене главное вспомнить откуда и куда надо прийти (т. е. про что билет\теорема), и иметь общее понимание курса.


  1. AlexGin65
    27.02.2018 13:44
    -1

    Подход к изучению различних тем по программированию (в т.ч. и используя книги), должен быть следующий:
    1) Прочитал текст, разобрался в теоретических аспектах;
    2) Выполнил, под Debug-ером приведенный в первоисточнике пример;
    3) По мативам данного примера, сделал свой, другой пример, основанный на том, что описано в первоисточнике;
    4) Поискал ещё публикации по данной теме (в интернете, в книгах) проанализировал их;
    5) Дополнил свой пример, на основании анализа и осмысления.

    Вот, ИМХО, подход современного IT специалиста.


    1. artmmslv
      27.02.2018 14:11
      +1

      C++ за 21 год



    1. begemoth3663
      27.02.2018 18:30

      так и вижу, как тимлид/скрам-мастер/пм "невозмутимо" взирают на неукоснительное исполнение пп1-5...


      N.B. бляха-муха, такие все "правильные", что непонятно, откуда такое кол-во г@в#0кода...


  1. tema_sun
    27.02.2018 14:31

    Программирование в книге и в реальности
    image


  1. evgenWebm
    27.02.2018 21:28
    +1

    Хорошая книга по программированию это справочник.
    Даже основы программирования можно написать как справочник.
    Но нет, мы напишем книгу в 800 страниц, где пройдемся по 3/2 аспектам программирования, причем поверхностно и с тоннами воды.
    В 99% книги бесполезны.

    З.Ы. Последняя попытка прочитать книгу у меня закончились психами. Я прочел больше половины книги и дошел до темы «Указатели». Где мне написали, чтобы я не заморачивался если не понимаю что такое указатели. Мол даже матерые программисты не понимают, что это такое. Бросил книгу нафиг. Спасибо господа. Вместо объяснения, мне сказали не думать.
    И это не единичный случай.


    1. Noserdan
      28.02.2018 08:13

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

      Заголовок спойлера
      Прошу прощения за политоту, но таким народом проще управлять)


      1. begemoth3663
        28.02.2018 15:05

        ай, как Вы правы!..
        но я не против книг. и даже шаблонов. для себя же понял, что не смотря на все неудобства и боль лучше читать оригинал (на английском). теперь другая проблема: как быстро [по обложке ;)] определить "потянешь" книгу или нет?.. ;)


        1. brickerino
          28.02.2018 20:15

          Знаете, пословица есть, что-то про книги, обложки и суждение.

          У вас что, нет времени отзывы прочитать на книгу? Или сначала почитать рекомендации, а потом купить, что советуют?


          1. Alexeyslav
            01.03.2018 15:00

            Отзывы основаны на личных предпочтениях, которые далеко не всегда совпадают с вашими.
            Очень хорошо это видно на рейтингах фильмов. По рейтингу 9+ балов из 10, а фильм отстой…