SICP, середина

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

Начну с плюсов. Как недавно заметил [info]infowatch, в «околокомпьютерных» областях достаточно велико количество самоучек, а «официальные» учебные планы зачастую неадекватны — следовательно, любой более-менее приличный «компьютерщик» в той или иной степени оказывается «самоучкой». Недостатки такого подхода очевидны — нет «систематичности» знаний и «единой картины мира».

Вообще, складывается такое впечатление, что отечественное программирование во многом представляет собой некий «карго-культ», копирующий внешние стороны такового в США. Кто-то рассказал про интервью при приеме на работу в Google и Microsoft — и все-все-все, включая распоследнюю «веб-студию», бросаются спрашивать про сортировку и красно-белые деревья. То, что когда-то эти вопросы позволяли Google и Microsoft набирать исключительно студентов-отличников ведущих американских ВУЗов — в расчет не принимается. Аналогичное впечатление производят и учебные планы — например, вопросы, связанные с индуктивными вычислениями и прочей рекурсией явно заимствованы из курсов с использованием Lisp наподобие SICP. На «традиционных» у нас C и Pascal они выглядят довольно дико. В общем, самоучки учат самоучек.

Что делать в такой ситуации? Наверное, лучше всего «забить» на попытки Рабиновича напеть Паваротти и «самоучиться» по первоисточникам — тем более, что ситуация с ними сегодня лучше, чем десяток лет назад. Например, SICP достаточно неплохо переведена, и теперь не придется вычленять «разумное, доброе, вечное» из кривого пересказа. Не надо «плеваться» от того, что эта книга — всего лишь «вводный курс» программирования. В свое время, например, кто-то обратил внимание на возраст присутствующих в аудитории на видеолекциях (в интернете выложены видеозаписи лекций по этому курсу) — и там было немало вполне взрослых людей, возможно даже и с опытом работы.

Более того, из-за особенностей применяемого диалекта Lisp, в SICP уже в конце первой главы переходят к вполне содержательным задачам — то есть демонстрирующим не какие-то конструкции языка, а различные подходы к программированию. Это отличает ее от других «вводных курсов», где берется какой-то язык программирования (раньше дико модным был Pascal), подробно изучаются его конструкции, а из «программирования» до обучающихся доводится лишь одна истина — что, оказывается, можно набрать на клавиатуре какой-то текст, затем нажать нужные кнопки и компьютер волшебным образом выполнит то, что хотел программист.

Что меня особенно удивило — я ни разу не видел более краткого описания ООП, чем один-единственный абзац в SICP (в начале 3 главы):

Существует мощная стратегия разработки, которая особенно хорошо подходит для построения программ, моделирующих физические системы: воспроизводить в структуре программы структуру моделируемой системы. Для каждого объекта в системе мы строим соответствующий ему вычислительный объект. Для каждого действия в системе определяем в рамках нашей вычислительной модели символьную операцию. Используя эту стратегию, мы надеемся, что расширение нашей модели на новые объекты или действия не потребует стратегических изменений в программе, а позволит обойтись только добавлением новых символьных аналогов этих объектов или действий. Если наша организация системы окажется удачной, то для добавления новых возможностей или отладки старых нам придется работать только с ограниченной частью системы.

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

Разумеется, что все рассматриваемые в SICP подходы к программированию можно показать и с использованием других языков. Например, встречаются решения задач оттуда на Common Lisp (это, правда, не считается — так как он все равно достаточно близок к Scheme), Python, Javascript и даже на C# — в общем, «на чем угодно». Правда, ни один из этих языков (за исключением, разве что, Common Lisp) не подходит для того, чтобы продемонстрировать все эти подходы сразу.

Теперь к недостаткам — благо «хвалебных» отзывов о SICP и без меня предостаточно. Можно было бы начать с классического «Не покупайте эту книгу«, но у меня к SICP другие претензии. Меня, как математика, поражают вольности с численными методами. Любой программист считает себя непревзойденным специалистом в этой области — но это далеко не так. Не последнее место в формировании этого заблуждения занимают книги по программированию, в которых численные методы рассматриваются в отрыве от их «содержания», как обычные алгоритмы.

Например, в главе 1.3.1 приводятся формулы численного интегрирования, и утверждается, что «определенный интеграл … можно численно оценить с помощью формулы» («the definite integral … can be approximated numerically using the formula «) — при этом не раскрывается ни законность этой оценки (что можно «простить»), ни ее точность. Правда, вычисляются два приближения для одного интеграла, меньшее значение переменной dx соответствует большей точности — и только! В упражнении 1.29 приводится формула Симпсона, утверждается, что она представляет собой «более точный метод численного интегрирования» (в чем эта точность заключается — не объясняется), а затем предлагается проинтегрировать с ее помощью кубический многочлен — якобы это должно «доказать», что она «более точна». Удивительно, но результат оказывается ближе к истинному значению — но это не сходимость, как в первом случае, а просто свойство формулы Симпсона — она дает точное значение при интегрировании кубических многочленов.

Чуть дальше появляются более «страшные» вольности. Например, в «определении» производной (оно необходимо для метода Ньютона) предлагается заменить стремящееся к 0 dx каким-то «очень малым» значением. Сказать, что это приближение, видимо, религия не позволяет.

В конце раздела 1.3 находим упражнение 1.45 — от которого я пришел в ужас. Сообщается, что метод Ньютона не работает для некоторых функций, например, для извлечения корня n-й степени. Предлагается использовать многократное «торможение усреднением» (average damping — этот термин я не встречал нигде, кроме SICP), а «кратность» его применения установить — держитесь — экспериментально! Да, читатель SICP, скорее всего, не сможет доказать полученное утверждение — но предложение «экспериментально» доказать математическое утверждение, согласно современным представлениям, дико само по себе. Может, не стоит вообще давать такие задачи?

Практически весь раздел 1.3 посвящен численным методам в том или ином виде — и везде есть какие-то «косяки». Да, большинство читателей их не заметит — но здесь я не могу разделять их восторгов по поводу книги. Тут требуется несколько более высокий уровень строгости в изложении. В целом книга крайне хороша с «программистской» точки зрения, но как только речь заходит о математических вопросах — то начинается «тушите свет, сливайте воду». Численные методы — хорошая демонстрация для абстракций, связанных с использованием «функций высших порядков» (для которых, правда, в математике придуманы свои термины — например, «функционал» или «оператор»), но они требуют все же несколько другого подхода.

Продолжение, как говорится, следует.

Про качество и статистику

Как-то написал я страшилочку уровня гаражных баек о том, как купил мужик дорогую иномарку, а та вдруг возьми да сломайся на все деньги. golergka засомневался в том, что это тенденция, а не единичный случай. Хочу его расстроить — это «прямое попадание» в статистику. Вот что пишут про современные фольксвагеновские двигатели, которые устанавливаются в том числе и на Audi:

Распространенные современные ДВС VAG литража 1.8/2.0 — прирожденные маслоеды . Едят много, со вкусом и чаще всего — прямо с завода. Первая ссылка в гугле по «VW CDA» — обсуждение проблемы расхода масла этими двигателями. И таких тем — сотни. Главной причиной чаще всего является конструктивная ошибка в расчете пружинной функции колец — кольца слишком «слабые», со слабым прилеганием. Они достаточно быстро коксуются на рекомендуемом производителем масле и его расход даже на малом пробеге может достигать 1 л на 2-3 ткм и более, что, разумеется, запредельно много. Свечи таких, почти новых, в общем-то, моторов, уже через 15-20 ткм покрываются высокотемпературными масляными отложениями, катализаторы постепенно забиваются, выхлоп начинает «кислить», через 3-4 года они окончательно забьются и авто перестанет тянуть, не говоря о фактически предремонтном состоянии мотора вообще…

http://bmwservice.livejournal.com/23492.html

Разумеется, что дилеры ждут «до последнего» — пока не закончится гарантия и объясняют, что такой расход масла производитель считает нормой. Если же двигатель ломается быстрее — то это банальное невезение дилера :)

Кстати, на Audi из того поста-страшилочки проявляются и широко известные проблемы с АКПП:

http://dsg7.com/

Юридический псто

Вот что пишут юристы по поводу защиты в одном недавнем деле:

Особенно порадовали «экспертизы» защиты. не соответствующие УПК, и вообще проведенные «про другую статью», не по всем текстам и без методик… Это на туда с лохов бабки стригли общественности пожертвования собирали?

Ну и заявление защитнегов о привлечении специалистов для… оценки следственной экспертизы без подтверждения квалификации специалистов — это хорошо, да-а… «А давайте нам бомжи скажут што экспертиза не катит».

http://ryurikov.livejournal.com/373830.html

В общем, у меня и раньше к поведению адвокатов было много вопросов, ну а теперь вынужден всё же согласиться [info]flinter_ab, что они просто из того же креативного класса, которым похер на подзащитных, и которые просто хотят попиариться на громком деле. Мудаки, одним словом.

http://smart-lawyer.livejournal.com/3116275.html

Вспоминается анекдот:

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

А вы все еще думаете, что в Интернете существует «объективная точка зрения»?

Известный тролль [info]fritzmorgen пишет о фактах «политических» накруток на Dirty.ru. Якобы на ресурсе выявили глубоко законспирированную сеть ботов-накрутчиков, поднимавших «карму» политизированным постам определенной направленности (а противовоположной — опускавших).

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

А почему? А так там принято.

Хорошо быть депутатом

Депутат муниципального собрания «Щукино» Максим Кац пишет:

5 августа стартует Экспедиция изучения городов. Начнем с Германии, потом поедем в Швейцарию, Францию, Нидерланды, Данию и Швецию, возможно, зацепим Италию и Прибалтику. Как вы понимаете, оттуда будет много интересных постов, видео, фоток и прочего контента.

<…>

Генеральный спонсор экспедиции: Информационный центр Правительства Москвы.

И чуть ниже в комментах:

Генеральный спонсор платит миллион. Финансового отчёта у них не спрашивал, как они платят это их дела — я смотрел только нормальная ли организация (не нашисты ли или еще что-то такое). А как у них там деньги циркулируют это их дела

http://maxkatz.livejournal.com/89794.html

Внимание, вопрос: а чем в данном случае Кац отличается, скажем, от съездивших за казенный счет в Италию волгоградских чиновников, которые, разумеется, после этой поездки были мгновенно записаны в коррупционеры и растратчики?

ГАЗ-3111 от Max Models, 1:43

Приобрел вот такое чудо, по рекомендациям в «Клубе владельцев ГАЗ-3111». В природе существует еще как минимум два других варианта коллекционной модели ГАЗ-3111 — но один был выпущен в количестве 20 экземпляров, именно его несут в левом углу на фото:

3111putin

Второй вариант выпускается фирмой «Киммерия» и отличается довольно грубой проработкой деталей и некоторыми «геометрическими» огрехами.

gaz3111kimmeria

В общем, до недавнего времени качественной масштабной модели ГАЗ-3111 не существовало от слова совсем. Модель от Max Models сделана в соответствии с «заводской» 3D-моделью кузова и может быть названа лучшей из доступных. Лучшей, но, к сожалению, не идеальной.

3111maxmodels

К кузову претензий нет — выполнен он весьма точно и близко к оригиналу. Но вот «ходовая часть» и салон модели позаимствованы от выпускаемых Max Models вариаций на тему «Волги» (если точнее, то ходовая взята от ГАЗ-24 с добавлением «двухниточного» выхлопа, а салон довольно грубо переделан из ГАЗ-3110).

3111maxmodels-2

У настоящей ГАЗ-3111 спереди стоит бесшкворневая подвеска с нижними рычагами оригинальной формы, а сзади — неразрезной «чайковский» мост.

3111below

Салон у 3111 совершенно свой, с большой-большой натяжкой кресла от 3110 можно «принять» за деталь от 3111 (и то — все «выдают» кнопки за рычагом КПП, а не рядом с ним — вот такое тут качество проработки деталей), а вот передняя панель совершенно не похожа. То же самое — с дверными картами.

3111salonjpg

На колесные диски жаловаться не буду — у меня стоят похожие, Slik L1828, хотя стоит заметить, что резина все-таки чуть более высокопрофильная, а заводские диски отличались дизайном.

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

ЗЫ Кстати, глянул сейчас 3D-модель ГАЗ-3111, сделанную пионерами для ГТА. Беру свои слова обратно — рядом с ней то, что делает «Киммерия», даже похоже на настоящий автомобиль.

3111gta