Как изучать Структуру и Интерпретацию Компьютерных Программ (SICP)

Как изучать Структуру и Интерпретацию Компьютерных Программ (SICP)

СИКП — одноименная книга и легендарный учебный курс в MIT (Массачусетский технологический институт).

СИКП — не книга про языки программирования или разработку программного обеспечения, не книга по ООП, функциональному программированию или паттернам проектирования.

СИКП — книга об информатике (computer science). Восприятии компьютеров как абстрактных машин, используемых для манипулирования данными. Несмотря на то, что книга впервые опубликована в 1979, она до сих пор не потеряла свою актуальность и не потеряет в будущем. СИКП неизменно находится в топе лучших книг по обучению программированию на протяжении десятков лет.

This is one of the great classics of computer science. I bought my first copy 15 years ago, and I still don't feel I have learned everything the book has to teach. — Paul Graham.

Стоит ли её читать? Однозначно стоит всем разработчикам на любых языках программирования с любым опытом. СИКП — достаточно сложная книга, поэтому появилось руководство, которое вы прямо сейчас читаете.

Очень краткое содержание

Абстракция с помощью функций

  1. Элементы программ
    • Выражения
    • Вычислительные стратегии
    • Подстановочная модель вычислений
  2. Функции и процессы порождаемые ими
    • Линейная рекурсия и итерация
    • Древовидная рекурсия
  3. Функции высшего порядка
    • Функции как аргументы
    • Функции как обобщения
    • Функции как возвращаемые значения

Абстракция с помощью данных

  1. Введение в абстракцию данных
    • Барьеры абстракции
    • Что такое данные?
  2. Иерархические данные и свойство замыкания
    • Представление последовательностей
    • Иерархические структуры
    • Последовательности как стандартные интерфейсы
  3. Символьные данные
    • Цитирование
  4. Множественные представления абстрактных данных
    • Тегирование данных
    • Программирование управляемое данными. Аддитивность.

Модульность, Объекты и Состояние

  1. Присваивание и локальное состояние
    • Преимущества присваивания
    • Недостатки присваивания
  2. Модель с окружениями
    • Правила вычисления
    • Применение
    • Фреймы как репозитории локального состояния
  3. Моделирование с изменяемыми данными
    • Изменяемый список
    • Представление очереди
    • Представление таблиц
  4. Многозадачность
  5. Потоки

Метаязыковые абстракции

...

Вычисление с помощью регистровых машин

...


Рекомендации

Первое, что нужно понимать: СИКП — не просто книга. Это университетский курс, записанный в виде книги. Он сложный и объёмный, его бесполезно проходить без практики. Практику придумывать не придётся. После каждой главы есть блок задач, которые авторы просят выполнить. Некоторые из них сугубо математические (просят что-то доказать), либо подразумевают хорошую математическую базу. Их можно и даже нужно пропускать, иначе вы можете очень быстро потерять мотивацию.

Сколько читать

СИКП условно можно разделить на две части. В первую часть входят главы 1, 2 и 3. Во вторую — 4 и 5. Разница в том, что во вторую часть входят главы, копающие очень глубоко, и пройти сквозь них может только по-настоящему увлеченный человек. По этой причине Хекслет рекомендует поставить себе планкой прохождение первых трех глав. Остальное можно с легкостью отложить на потом.

Язык

Для примеров и практики в книге используется язык Scheme (Ским), созданный авторами курса. Это один из диалектов семейства Lisp. Как и полагается любому Lisp-языку, Scheme имеет примитивный синтаксис, который можно изучить буквально за несколько часов. Он очень необычен для тех, кто имел дело только с широко распространенными языками, но обладает рядом серьезных достоинств, о которых говорится в книге.

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

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

Сам язык Scheme, это в первую очередь стандарт языка плюс разные реализации этого стандарта. На данный момент один из самых развитых -- и продолжающих развиваться -- потомков Scheme, это язык Racket. Хекслет рекомендует проходить СИКП именно на Racket. Специально для этого гайда мы подготовили репозиторий, который можно использовать как основу для кода. В репозиторий стоит заглянуть хотя бы для того, чтобы узнать, как настроить Racket на совместимость именно с тем стандартом Scheme, который используется для примеров кода в книге: немногие существующие реализации Scheme позволяют воссоздать "то самое" окружение, к счастью, Racket может! Не забудьте правильно настроить редактор: Lisp языки относятся к тем языкам, для которых нужна поддержка со стороны редактора для комфортной работы.

Оформление

На Гитхабе можно найти множество репозиториев, в которых лежат решения задач из СИКП на всех возможных языках программирования. Мы настоятельно рекомендуем поступать так же: создать репозиторий в своем аккаунте и выкладывать в него все свои решения. Идеально, если каждое решение будет сопровождаться тестами. Такой подход хорош не только тем, что вы дополнительно прокачиваетесь в git и получаете дополнительную мотивацию, но и тем, что у вас появляется код, который можно показать при поиске работы. Более того, велика вероятность, что собеседовать вас будет человек, знающий про СИКП. Это добавит очков в карму и даст возможность продуктивно пообщаться.

Дополнительные ссылки

Исходный код (github)
Кирилл Мокевнин