Как я уже говорил, проект, связанный с книгой «Программирование: введение в профессию», я закрывать не собираюсь; есть два очевидных направления дальнейшей работы — это подготовка второго издания всей книги и создание сборника задач, упражнений и заданий практикума, который бы покрывал все разделы книги.
Начну со второго издания. Очевидно, что в ходе его подготовки должны быть исправлены все найденные к нынешнему моменту огрехи и опечатки, а найдено их уже немало; но это далеко не всё. Всё-таки первые два тома, в том числе части, посвящённые Паскалю и Си, я писал около пяти лет назад, и с тех пор произошло одно крайне важное событие: до меня внезапно допёрло (именно "допёрло", другие слова не столь адекватно выражают суть происшедшего), в чём конкретно заключается многократно упоминавшаяся мной «сишность головного мозга» и как именно Си, если с него начать, уродует мышление обучаемого.
В только что вышедшем четвёртом томе есть параграф 9.3.2, озаглавленный «Концептуальное отличие Си от Паскаля», и в нём этот момент я постарался изложить настолько подробно, насколько возможно, но если кратко — то ключевым словом оказывается побочный эффект: Си построен так, что выполнение программы на этом языке состоит из побочных эффектов, то есть не то чтобы там «допускались» или «часто использовались» побочные эффекты, там просто нет ничего другого. Именно это, а не что-то другое, формирует специфический «сишный» стиль кодирования, при котором программа превращается в скопище хаков и трюков.
Следует отметить, что и про сишность головного мозга, и про искалеченное мышление новичков, которых пытаются сразу учить писать на Си, я раньше и говорил, и писал неоднократно, но внятного ответа на вопросы вроде «какие конкретно трюки и хаки допустимы и как их отличить от бессмысленного лихачества» я ещё три года назад дать не мог, как и на вопросы о том, чем же всё-таки Си калечит мышление и в чём это проявляется. Теперь такой ответ есть, и (надеюсь) достаточно подробный.
Следствием этого, если угодно, «озарения» (хотя я по-прежнему настаиваю, что слово «допёрло» здесь адекватнее описывает происшедшее) становится необходимость довольно серьёзной переработки двух из двенадцати частей книги — именно, частей про Паскаль и про Си. Из паскалевской части должны исчезнуть некоторые примеры, в которых я сам, увы, использую побочные эффекты по-сишному; из части про Си — все без исключения случаи побочного эффекта в заголовке if (с циклами не всегда так, но для if побочный эффект в заголовке оправданий не имеет). И, конечно, само понятие побочного эффекта, сейчас лишь вскользь упоминаемое в этих двух частях книги, должно там выйти едва ли не на первый план, на нём должно быть тщательно сакцентировано внимание.
Пожалуй, такая переделка двух частей, притом двух самых больших частей книги, займёт самое большое количество времени при подготовке рукописи к новому изданию, хотя есть, конечно, и другие места, которые хотелось бы слегка изменить.
Ещё во втором издании я хотел бы слегка пересмотреть разбивку материала по томам. Сейчас (с первым изданием) у меня получилось три сравнительно тонких томика и один потолще; более правильной кажется сделать три тома, примерно одинаковых по толщине. Достичь этого я хочу раздербаниванием нынешнего второго тома: его первую часть, посвящённую ассемблеру, объединить с материалом первого тома, а вторую, посвящённую Си, утащить в следующий том (второй в новой нумерации), включив туда же материал по операционным системам и сетям, ныне составляющий третий том. Структура четвёртого тома, по-видимому, останется без изменений, просто он станет третьим. Таким образом я сохраню имеющуюся последовательность частей и логику изложения, но томов станет на один меньше, что позволит, кстати, немного сэкономить на типографии (обложка, она же переплёт, стоит довольно ощутимых денег, которые почти не зависят от толщины книги).
Выпустить все три тома нового издания я хочу одномоментно, чтобы не получилось, как сейчас — первые тома уже распроданы, а последний только-только вышел. Это же позволит сэкономить на предисловиях, ограничившись таковыми только в первом томе, и сделать корректными все ссылки, в том числе и между томами (сейчас, увы, первые два тома содержат ощутимое количество ссылок вперёд, которые к моменту выхода поздних томов, особенно четвёртого, оказались невалидны, поскольку нумерация частей изменилась в сравнении с тем, что исходно предполагалось). К сожалению, такое издание разом всего трёхтомника порождает определённые трудности финансового характера, но об этом позже.
Отдельное происшествие — задачник, которого, похоже, публика активно ждёт. Работу над ним я намерен вести параллельно, но его объём мне пока совершенно непонятен, и, конечно, я никак не могу назвать сроки окончания этой работы. Больше того, я даже не понимаю, что будет готово раньше — задачник или второе издание книги.
По срокам могу сказать определённо только одно: раньше, чем через год-полтора, не появится ни то, ни другое :-)
Теперь собственно меркантильная финансовая часть вопроса. Если предположить, что российская экономика не рухнет стремительным домкратом, а будет трепыхаться где-то на тех же уровнях, что и сейчас, монетарные расходы на выпуск всех трёх томов нового издания составят что-то вроде 450–500 тысяч рублей (при всё том же тираже 300 экземпляров). В отличие от первого издания, здесь я не смогу финансировать последующие тома за счёт продажи экземпляров предыдущих, так что эти полмиллиона (или больше, если рубль всё-таки не удержится) придётся выложить одномоментно. С другой стороны, здесь будет проще понять, каким тиражом это всё издавать и не следует ли сэкономить, уменьшив тираж, или, наоборот, увеличить его — в зависимости от того, сколько поступит пожертвований. Ну а с третьей стороны — мне однозначно самому такую сумму не потянуть, то есть издание будет возможно только при нахождении проекта в плюсе, близком к обозначенным целям. Это, кстати, означает, что в свободную продажу новое издание если и поступит, то в небольшом количестве и, как следствие, ненадолго.
По времени я планирую уложиться в 200 часов (раньше думал, что хватит и ста, но опыт четвёртого тома заставляет меня быть осторожнее — я больше пятидесяти часов убил на одно только внесение корректуры с неизбежными "последнемоментными" правками). С этим тоже связан один нетривиальный момент. 7 января 2015 года, когда проект был анонсирован, я объявл, что за час времени, потраченный на работу с рукописью, буду списывать в свою пользу компенсацию в размере 600 рублей, чтобы можно было частично отказаться от подработок и всякой другой времяпожирающей деятельности. С тех пор я эту цифру не пересматривал, хотя, как можно заметить, инфляция всё это время на месте не стояла. Увы, в нынешних реалиях 600р. в час — это уже совсем ни о чём, так что, благополучно завершив всё, что обещал, на новую часть проекта я размер своей компенсации увеличиваю до 800р. в час. Как и пять лет назад, я здесь должен подчеркнуть, что реальная стоимость моего времени выше в разы, а эта несчастная компенсация нужна не для того, чтобы заработать денег, а исключительно чтобы работа не встала колом из-за необходимости зарабатывать на жизнь.
Что касается задачника, то с ним пока что вообще больше неизвестных, чем известных; единственное, что можно про него сказать — это что времени на него тоже уйдёт вагон. Только не спрашивайте «вагон — это сколько». Не знаю. Вряд ли меньше тех же двухсот часов.
Итого, что мы имеем сейчас: (200+200)*800 + 450000 = 770'000.
На текущий момент проект в плюсе, но, увы, всего на 16'000. Можно надеяться, что тысяч пятьдесят я смогу получить с продаж четвёртого тома, хотя когда это теперь будет — непонятно, да и будет ли вообще; сейчас, во всяком случае, единственная точка, где мои книги продавались в розницу, закрыта, и кто б мог сейчас сказать, откроется ли она и если да, то когда. Общее количество собранных пожертвований на текущий момент составляет 1186498 рублей; если исходить из оптимистичного сценария, набрать мне нужно ещё 700 тысяч с небольшим. Оставив для ровного счёта 13,5 тысяч на эластичность, получаем новую цель краудфандинга: 1'900'000.
Что я могу предложить донэйторам в этот раз? Ну, упоминание на сайте и в предисловии к книге — это само собой (на всякий случай: предисловие в этот раз будет одно на все три тома). Сувенирные диски оказались никому толком не нужны, во всяком случае пока ни одного не востребовано; так что, видимо, следующая ступенька — сразу весь комплект из трёх томов нового издания при пожертвованиях от 3500р. (точно могу сказать, что розничная цена за этот новый трёхтомник будет намного выше, если он вообще будет продаваться, что, увы, не факт). Несколько сложнее с задачником, я пока не могу оценить себестоимости его бумажного экземпляра; могу твёрдо пообещать его при пожертвованиях от 900 рублей, а если пойму, что он получается тоньше, чем ожидалось — то, возможно, я эту планку явочным порядком снижу. Ну и пусть, например, при пожертвовании от 4000 рублей плюшкой (пока) служит и то и другое. Как обычно, я оставляю за собой право в будущем пересмотреть условия для получения этих поощрительных призов, что никак не повлияет на тех, кто успел внести пожертвование до момента изменений.
Для тех, кто меня уже успел финансово поддержать, могу пообещать вот что: если общая сумма ваших пожертвований на текущий момент превышает сумму, которая была необходима, чтобы получить положенные вам (на момент внесения пожертвования) плюшки, на те же 3500 или больше, то новое издание вам полагается автоматически — в дополнение к тому, что вам уже положено. Это, в частности, касается практически всех, чьи пожертвования попали в список «главных спонсоров».
Ну и стандартный дисклаймер (извините, без него не могу никак): всё это станет возможно только при условии успешности этой вот «второй фазы» проекта. Посему всё сказанное о плюшках не может и не должно рассматриваться как предложение материального товара в обмен на деньги. Основной целью ваших пожертвований является написание соответствующих книг и их размещение в открытом доступе, а все материальные плюшки — не более чем некое приятное дополнение. Тут всё-таки сбор пожертвований, а не предпродажи.
Спасибо всем, кто по-прежнему следит за проектом!
(и, кстати, спонсоры, востребуйте ваши плюшки! пока что это мало кто сделал — но время ещё есть)
Уточнение
Хотел бы уточнить, выход второго издания возможен до завершения работы над задачником или они выйдут только вместе при условии, что наберется сумма и на учебник, и на задачник?
Это две
Это две независимые задачи. Я не знаю, что из них выйдет раньше, пока у меня вполне неплохо идёт подготовка второго издания, отвлечься от неё на задачник желания не возникает. Может, во-первых, случиться так, что я в какой-то момент упрусь во что-нибудь в тексте и всё-таки захочется сменить контекст; во-вторых, возможно, я закончу подготовку второго издания, но нужной суммы у меня "прямо сейчас" не окажется. Всё это даёт шанс задачнику выйти раньше, то есть теоретически это возможно.
Привязывать одно к другому я не планировал.
у меня вполне
у меня вполне неплохо идёт подготовка второго издания, отвлечься от неё на задачник желания не возникает.
Желаю вам, чтобы все так и продолжалось. :) Просто хочется, чтобы задачник не повлиял негативно на срок выхода второго издания.
Кстати, вы планируете опубликовать как-нибудь пост с информацией о том, на каком этапе ваша работа?
о текущем состоянии дел
Последний пост об этом был не так давно, вот: http://www.stolyarov.info/node/296 Но вообще, конечно, планирую, надо только хоть до какой-то точки это довести.
машина Joseph Marie-Jacquard
Обращаю ваше внимание на машину Joseph Marie-Jacquard, которая уже существовала в 1803 году для программирования узоров в текстильной индустрии. Надеюсь эта машина заслуживает упоминания в главе Истории.
Тогда уж и
Тогда уж и шарманку приплести, чего там. В них тоже мелодия "программировалась" (зубцами на валике).
пристальное внимание к побочным эффектам
И, конечно, само понятие побочного эффекта, сейчас лишь вскользь упоминаемое в этих двух частях книги, должно там выйти едва ли не на первый план, на нём должно быть тщательно сакцентировано внимание.
Так, глядишь, к 5-му изданию всё будет полностью переписано с использованием Haskell, вместо Си и Паскаля.
Шучу. ;-)
Вообще-то наоборот
Функциональное программирование хорошо лишь до той поры, пока программа может обходиться без побочных эффектов. Это как максимум какой-нибудь фильтр — поток ввода, поток вывода, вывод на ввод никак не влияет.
Любые попытки написать хоть что-то интерактивное (взаимодействующее даже не обязательно с пользователем, хотя бы даже с другими программами — клиентами, серверами, мало ли с чем) приводят к тому, что побочные эффекты становятся неизбежны. А вот потуги писать функционально, но с побочными эффектами — это ещё хуже императивщины, в императивной программе хотя бы действия записываются в том же порядке, в котором они будут происходить. Функциональная конструкция вида f(g(h(x))) при условии, что все три функции имеют побочный эффект, предполагает, что выполнены будут h, g и f — в порядке, обратном тому, в котором они записаны. По мне так это в плане запутывания программы ещё хуже, чем goto. А уж сочетание побочных эффектов с ленивыми вычислениями (здравствуйте, монады) — ну, в общем, если скрестить ежа и ужа, будет пять метров колючей проволоки. Или очередной Лисп, который только делает вид, что он функциональный, или Хаскель с мозгоразрывными монадами, или вообще Си (я встречал людей, утверждающих, что Си относится к функциональным языкам; ей-богу, реально такие люди бывают).
Функциональная
Функциональная конструкция вида f(g(h(x))) при условии, что все три функции имеют побочный эффект
Я не уверен, что в Хаскеле такая конструкция при таком условии вообще возможна. В отличие от Си или Лиспа.
Потому и пошутил про Хаскель, а не функциональное программирование вообще. Других языков, где так тщательно выделены побочные эффекты, я не встречал.
Хаскель с мозгоразрывными монадами
Хаскель весь мозгоразрывный. Просто монады -- это первое, на что натыкаются.
Я не уверен, что
Я не уверен, что в Хаскеле такая конструкция при таком условии вообще возможна
Я думаю, невозможна. Если бы она была возможна, то последовательность побочных эффектов была бы не "обратной", а неопределённой, ибо ленивость.
Других языков, где так тщательно выделены побочные эффекты, я не встречал.
Это не от хорошей жизни. Ленивые вычисления с побочными эффектами несовместимы. А не встречали вы их исключительно потому, что ленивых языков в мире раз-два и обчёлся. Хоуп мёртв (если что, там вообще побочных эффектов нет). Миранда проприетарная, формально она вроде бы ещё существует, но если за единственную существующую реализацию хотят денег, то это примерно то же самое, как если бы её вообще не было. Остаётся Клин (Clean) — вот про него вообще не могу ничего сказать, не было времени попробовать его в деле; но вроде бы монад там нет, есть что-то другое. А больше-то, собственно, ленивых языков и нет. Вообще нет, ни живых, ни мёртвых.
Хаскель весь мозгоразрывный.
Согласен :-)
Опубликован исходный код компилятора Miranda
https://www.linux.org.ru/news/development/15557354
ага, слонЪ сдохЪ
Самое интересное, что я эту новость на ЛОРе упустил, так что спасибо. На статус Миранды я последний раз смотрел в начале ноября, перед тем как писать главу про Хоуп. Тогда она ещё была закрытой. Открылись бы они на три месяца раньше — возможно, я бы Миранду в книжке описывал вместо Хоупа. Ну хотя очень условное это "возможно" — я ведь ещё не видел Миранду — ни сам язык не знаю, ни его реализацию не трогал.
Короче, надо будет на неё посмотреть, когда буду готовить новое издание. Может, и заменю эту главу. А может, и нет — будет зависеть от множества факторов.
NetBSD как система для обучения
если кратко — то ключевым словом оказывается побочный эффект: Си построен так, что выполнение программы на этом языке состоит из побочных эффектов
С целью обучения программированию, на мой взгляд, NetBSD является идеальной первой системой для обучения. В NetBSD гораздо меньше хаков. Более того, в неё не принимают код, если он выглядит как хак, имеет побочный эффект или вызывает сомнения.
Не воспринимайте, пожалуйста, этот комментарий как критику или совет, я не в праве вам их давать, но если вдруг у вас будет возможность, желание, время, обратите, пожалуйста, внимание на эту систему. Порог вхождения у неё повыше, чем у Linux, но она гораздо более идеологически правильная Unix система. Хотя и немного академичная, но в данном случае это хорошо.
Спасибо за ваш труд.
Очевидно, вы не
Очевидно, вы не понимаете смысла термина "побочный эффект". Настоятельно рекомендую это исправить, хотя бы даже с помощью того же параграфа 9.3.2, где этот момент подробно разжёван. Например, просто для того, чтобы не позориться.
На всякий случай: если бы в ядро NetBSD, как вы говорите, "не принимали код, содержащий побочные эффекты", то его бы просто не существовало, как и любой (именно так: абсолютно любой) программы, написанной на Си. Ещё раз подчёркиваю: любая программа на Си, за исключением разве что небезызвестных /bin/true и /bin/false, выполняется в виде последовательности побочных эффектов, это основа семантики языка Си. Я даже больше скажу — это не так уж ужасно, если уже уметь нормально программировать к моменту знакомства с Си. На Си можно писать (я сам на нём пишу), главное — не думать на Си.
Что до NetBSD в роли учебной системы, то никто её не мешает использовать при обучении по моим книгам. Я не случайно рассматриваю конвенции системных вызовов для Linux и FreeBSD; судя по тому, что мои примеры для BSD работают даже под Mac OS (чего я сам не ожидал), весьма вероятно, они и под NetBSD работать будут точно так же. А за пределами ассемблерной части вообще нет никаких привязок к конкретным nix-системам. Но вот навязывать её ученикам я не буду по причине очень простой: барьер вхождения здесь слишком критичен, чтобы его завышать.
Астрологи объявили месяц BSD-систем :)
Что-то отовсюду, по поводу и без, суют (точнее суём) свои советы и вопросы относящиеся к BSD системам.
Это и не плохо, а мне так даже нравится, учитывая что я и сам к этому пару сообщений приложил. Просто забавно :)
П.С.
Андрей Викторович, я устав бороться с вашей, уже вошедшей мне кажется в историю успешных примеров борьбы с идиотами - капчёй, зарегистрировался на сайте, и один хрен капча требует чтобы её ввели.
Спасибо за
Спасибо за сообщение про капчу, вроде поправил настройки — не должно теперь спрашивать. Если опять потребует — скажите :-)