Как изучать Структуру и Интерпретацию Компьютерных Программ (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. Во вторую — 4 и 5. Разница в том, что во вторую часть входят главы, копающие очень глубоко, и пройти сквозь них может только по-настоящему увлеченный человек. По этой причине Хекслет рекомендует поставить себе планкой прохождение первых трех глав. Остальное можно с легкостью отложить на потом.
Язык
Для примеров и практики в книге используется язык Scheme (Ским), созданный авторами курса. Это один из диалектов семейства Lisp. Как и полагается любому Lisp-языку, Scheme имеет примитивный синтаксис, который можно изучить буквально за несколько часов. Он очень необычен для тех, кто имел дело только с широко распространенными языками, но обладает рядом серьезных достоинств, о которых говорится в книге.
Его выбор, в качестве основного языка для курса обоснован тем, что Scheme позволяет сосредоточиться на сути вещей вместо синтаксиса, увидеть чистые концепции в первозданном виде. Scheme как и любой Лисп, обладает невероятно высокой выразительностью благодаря тому, что в языке всё есть выражение, а инструкции отсутствуют вообще.
Вторая причина — гомоиконность. Свойство языков, в которых данные и код — одно и тоже. Этот тезис сложно понять на словах, его нужно прочувствовать на практике. Есть еще и третья причина — макросы, но они в книге не используются.
Сам язык Scheme, это в первую очередь стандарт языка плюс разные реализации этого стандарта. На данный момент один из самых развитых -- и продолжающих развиваться -- потомков Scheme, это язык Racket. Хекслет рекомендует проходить СИКП именно на Racket. Специально для этого гайда мы подготовили репозиторий, который можно использовать как основу для кода. В репозиторий стоит заглянуть хотя бы для того, чтобы узнать, как настроить Racket на совместимость именно с тем стандартом Scheme, который используется для примеров кода в книге: немногие существующие реализации Scheme позволяют воссоздать "то самое" окружение, к счастью, Racket может! Не забудьте правильно настроить редактор: Lisp языки относятся к тем языкам, для которых нужна поддержка со стороны редактора для комфортной работы.
Оформление
На Гитхабе можно найти множество репозиториев, в которых лежат решения задач из СИКП на всех возможных языках программирования. Мы настоятельно рекомендуем поступать так же: создать репозиторий в своем аккаунте и выкладывать в него все свои решения. Идеально, если каждое решение будет сопровождаться тестами. Такой подход хорош не только тем, что вы дополнительно прокачиваетесь в git и получаете дополнительную мотивацию, но и тем, что у вас появляется код, который можно показать при поиске работы. Более того, велика вероятность, что собеседовать вас будет человек, знающий про СИКП. Это добавит очков в карму и даст возможность продуктивно пообщаться.