пятница, марта 30, 2007

SICP: Впечатления от прочтения

Не прошло и полгода с момента закупки SICP, и я наконец-то ее прочел!

Сразу скажу: SICP — это не учебник по Lisp, это книга по Программированию. Если вы просто хотите изучить Lisp или Scheme, то SICP не для вас, лучше попробовать что-нибудь попроще.

Книга стала пожалуй одним из самых интересных и серьезных текстов, прочитанных мною за последнее время. После книг Кернигана и Ритчи, Страуструпа, книг по OCaml, Haskell, кучи тьюториалов, мануалов, статей и прочей литературы, SICP стала для меня чем то вроде откровения, откровения о том, какой должна быть книга по программированию.

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

В отличии от обычных книг, SICP не учит синтаксису (его у лиспа почти нет), а учит базовым вещам, необходимым для понимания того, как надо программировать. Причем, выбор этих базовых вещей и уровень их объяснения поистине шедеврален.

Уже на 20-й, 30-й странице мы узнаем о нормальном порядке вычислений, lexical scoping, рекурсивных и итеративных процессах, функциях высших порядков, lambda-выражениях, замыканиях и прочих вещах, о которых я узнал гораздо позже, чем надо. А к концу второй главы знаний хватает на то, чтобы писать 90% встречающегося кода. И мы еще не дошли до изменяемого состояния, модулей и объектов!

А когда нам говорят про состояние, мы узнаем, что это не всегда самый лучший способ решения задач, объясняют плюсы и минусы. Не знаю, поймут ли это первокурсники, для которых предназначена книга, но для меня это было понятно до боли.

И вот мы доходим до модулей, объектов, потоков, параллелизма, распространения ограничений. Вы думаете, сейчас вам будут рассказывать, как пользоваться готовыми фреймворками или специально заточенными элементами языка программирования? Фигушки! Вам объяснят, как это сделать с нуля, из тех самых базовых кирпичиков, изученных в первых двух главах. Ничего больше не нужно! Это потом, в других языках (или на следующем курсе), вы увидите, как это можно сделать короче и запутаннее. Сейчас вы должны понять основы, как это сделать самому. И что самое приятное, все это сопровождается общими объяснениями, жизненными примерами и интересными упражнениями.

Теперь, казалось бы, мы знаем основные методики программирования. Только этого мало. Для лучшего понимания процесса вычислений нам надо построить несколько интерпретаторов: самой Scheme, схемы с ленивыми вычислениями, с недетерминистским вычислением, а также интерпретатор для среды логического программирования. Четвертая глава вам в этом поможет.

Что, скилл в вычислениях прокачан и карма аж светится? Но ведь вы все это время были далеки от железа и не знаете, как все это работает уровнем ниже Scheme! Тут то (в заключительной главе) вам и расскажут про регистровые машины, даже парочку-троечку спроектируют. Чтобы было на чем их проверять, вам опишут имитатор регистровых машин. Вы узнаете про стек. Вам расскажут про сборку мусора (и конечно покажут, как ее сделать с нуля ;). Чтобы прокачать понимание регистровых машин, вы напишете интерпретатор Scheme на своеобразном ассемблере. Но ведь интерпретатор — это медленно, надо написать компилятор! А компилятор сам по себе не очень удобен (нет интерактивной разработки), так что скрестим его с интерпретатором. Страшно? Ничего, ребята действительно хорошо все объясняют.

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

Выводы

Если Вы только начинающий программист, SICP обязательна к прочтению. Многие вещи, которые Вы будете изучать потом, будут казаться Вам знакомыми.

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

PS: Paul Graham сказал про SICP:

„Я впервые прочел ее 15 лет назад и до сих пор не уверен, что усвоил все, чему эта книга может научить.“

16 комментариев:

dulanov комментирует...

Отличный пост! Как много у тебя сохранилось сделанных упражнений, может поделишся? Читая SICP и выполняя небанальные упражнения частенько хочется сравнить с другими вариантами решений.

Vladimir Shabanov комментирует...

Упражнений у меня практически не осталось. Я книгу в основном в метро читал, так что упражнения в уме делал, а к 4-й, 5-й главе почти перестал делать.

Alex Ott комментирует...

да, SICP - замечательная книга, как хорошо, что она вышла на русском языке.
Я надеюсь, что в скором времени будет выпущен еще один перевод классической книжки (курса лекций) по функциональному программированию - "Введение в фукнциональное программирование" Харрисона. Сейчас идет ее перевод. Статус можно псмотреть тут. И кстати - нужны будут люди для вычитки, если будет время, то велком :-)

Alex Ott комментирует...

да, еще. попробуйте посмотреть видео-лекции SICP - очень интересно, хотя и длинные - порядка 10 гигабайт

Vladimir Shabanov комментирует...

Читал в свое время Харрисона. Про лямбда-исчисление я тогда все пропустил. Читал, как введение в ML.

Не очень нравится то, что он использует Caml Light вместо OCaml (особенно в некоторых местах, где функции с большой, а конструкторы типов с маленькой буквы — не совместимо с ocaml). Было бы неплохо весь код сделать совместимым с OCaml.

Мельком посмотрел на переведенные 1-ю и 8-ю главы. Первое, что бросилось в глаза — отсутствие русских кавычек и тире. Ну и с оформлением кода пока еще разброд. Еще фокусы из-за отсутвия неразрывных пробелов предисловии: Я[перевод строки]сохранил; в части Part[перевод строки]II.

А так, если по содержанию что не понравится, куда писать?

Vladimir Shabanov комментирует...

Из лекций я только самую первую посмотрел. После прочтения, наверное, еще посмотрю. Я просто английский на слух плохо воспринимаю. Заодно и потренируюсь :).

olpa комментирует...

Замечательная рецензия! Может, поместить её на mustread.ru? Тогда она будет на первой странице в выдаче яндекса-гугла по названию книги, и её прочитают многие.

Vladimir Shabanov комментирует...

Поместить то можно. Только рецензии по-моему должны быть достаточно хладнокровными, а тут почти реклама. Хотя, может оно и к лучшему :)

olpa комментирует...

Не, хладнокровные рецензии -- это для стандартных книг. А для SICP нужно что-то забойное, ка ктут.

В общем, добавил задачу в TODO. Что использовать для рекламной ссылки? www.vshabanov.ru, vshabanov-ru.blogspot.com? Если у тебя партнёрские ID для books.ru/ozon.ru/amazon.com?

Vladimir Shabanov комментирует...

www.vshabanov.ru -- это не моё. Партнерских ID нет. Так что этот блог и записать, как источник.

Анонимный комментирует...

Какой правильный ответ на упражнение 1.6 ? У меня второй вариант вычисления корня(там где new-if используется) работает нормально. Результаты теже, что и при использовании обычного if. Но судя по вопросу("Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных корней?") результы должны быть неправильными.

Vladimir Shabanov комментирует...

Не понятно, почему у Вас получается правильный ответ. По идее, функцию должно зациклить.

olpa комментирует...

Не прошло и три года... Опубликовано: http://mustread.ru/isbn/5791300727.html

Vladimir Shabanov комментирует...

Отлично! Только наверное стоит добавить ссылку на издательство, т.к. во всех остальных магазинах ее уже давно нет.

Оттуда же можно взять картинку обложки (она там побольше) и, из Википедии, картинку английской обложки (а то на mustread она какая-то очень замыленная.

Sergey Khenkin комментирует...

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

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

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

Dmitriy Kosyh комментирует...

Не просто прочитать, а ещё выполнить выполнить упражнения. Потому что от простого чтения эффект 1%. Проверено на себе.