Я уже не раз писал, что далеко не все умные люди способны изобразить свой ум на бумаге. Классический пример из близкой мне области знания - Дональд Кнут. Его книги просто невозможно читать! Взать, скажем, "Всё про TeX" (цитирую по памяти). В предисловии он утверждает, что "всё, что вам нужно знать про TeX, где-нибудь в этой книге объясняется". Да, объясняется. Но как? Примерно так: "спросите у тех, кто уже работал с TeX'ом, как это сделать". Там же в предисловии подробно расписано, на что нужно обращать внимание при втором, а на что при третьем чтении этой книги. А на хрена, простите, мне читать такую муть аж три раза? Поэтому до появления такого замечательного продукта как MikTeX, я пользовался другими редакторами (в те далекие времена это были сначала ChiWriter, потом AmiPro).
То же можно сказать и про его знаменитое "Искусство программирования". Честно говоря, не знаю, почему эту книгу так хвалят. Но знаю, что ни один из хвалителей, с которыми я знаком лично, ее не читал. Большинство даже в руках не даржали. Просто есть "общепринятое мнение", что книги Кнута - это круто! Вот наши преподы и советуют студентам читать то, на что сами даже не взглянули. Я попытался было почитать. Но обнаружив "доказательства" примерно такого вида: "из упражнений 12, 45 и 68 следует..." (упражнения на 17 страницах идут в конце 4-х страничной главы), решил, что могу свое время потратить с большей пользой.
Ну ладно, черт с ним, с Кнутом. Вспомнил его лишь потому, что вчера очередной студенческий наставник рассказывал, как этот дядька замечательно излагает, а на мой вопрос "Читали?" замялся и замычал (не читал, то есть).
Сегодня я хотель написать про другого "священного гуру программирования" Никлауса Вирта. Известно, что в середине 70-х он написал книгу "Алгоритмы + структура данных = программы". Я прочитал ее в 1986 и мало что понял. Но на этот раз виноват не автор, а мой недостаточный в то время багаж знаний. К тому же в книге программы были на каком-то Паскале, а нам в школе приглашенный из Механа препод говорил, что писать надо на Фортране. Но по прошествии нескольких лет я ту книгу с большим удовольствием и пользой перечитал.
И вот недавно обнаружил в магазине книгу того же Вирта с похожим названием: "Алгоритмы и сруктуры данных", изданную в прошлом году. В предисловии переводчик Подшивалов пишет, что первое издание вышло еще в 1989-м. Затем он хвалит новые главы, добавленные в книгу при переработке. Главы эти посвящены поиску: линейный поиск, двоичный поиск, поиск подстроки. Затем Подшивалов гордо заявляет, что для приближения книги к целевой аудитории он перевел все программы с "Модулы-2" на Borland Pascal. Уж лучше бы он правильно переводил текст (об этом ниже)! Логика книги оказалась нарушенной. В тексте Вирт пишет, что исключение из Модулы-2 операторов ввода-вывода потребовало изменить некоторые главы. В частности, появилось понятие последовательности - некоторой абстракции файла с последовательным доступом. Для работы с последовательностями вводится несколько функций, сосредоточенных в отдельном модуле. В авторской реализации Модулы-2 для этой цели служит модуль InOut. И какого лешего читалелю теперь нужны эти построения, если ему в качестве примеров предлагаются программы на Паскале, в котором есть операторы ввода-вывода? Зачем читателю синтаксис Модулы-2 в приложении, если на Модуле-2 в книге нет ни строчки кода? Я не говорю уже о том, что в англоязычном издании 2004 года примеры даны Виртом даже не на Модуле, а на Обероне.
Теперь о качестве книги. Оно отвратительно. Причем ответственность за отвратительность делят между собой редактор, переводчик и автор. Нет, то, что перекочевало в книгу из варианта 1975 года осталось таким же. Ну, разве что формулы как были написаны небрежно, так таковыми и остались. Например, исследуя сортировку выбором, Вирт подсчитывает число обменов в среднем. Приближая гармонические числа выражением n*ln(n), он педантично удерживает слагаемое \gamma (константа Эйлера), но пренебрегает единицей. Поскольку \gamma и 1 одного порядка, непонятно, почему первая удостоилась чести остаться в асимтотической форуме, а вторая нет. Таких примеров несколько. Но это лишь блохи.
Слоны начинаются в новых главах, посвященных поиску. И если линейный и бинарный поиск изложены без огрех (странно было бы даже тут накосячить), то поиск подстроки, а именно алгоритмы Кнута-Мориса-Пратта и Бойера и Мура - это какой-то плевок в читателя! Я изрисовал карандашом каждую страницу этих глав, столько там было ошибок. Сначала я подумал, что виноват переводчик или издатель. Но отыскав электронный вариант английского издания на сайте Технологического института в Цюрихе, убедился, что безобразие на совести автора. При чтении у меня создалось впечатление, что Вирт имел намерение вывести алгоритм из инвариантов - логических выражений, сохраняющих истинность на любом этапе поиска, - но потом нашел это скучным и при описании алгоритма стал апеллировать к "здравому смыслу". Формулы из "здравого смысла" получились неправильные. Рисунки тоже. Но программы, как ни странно, верные. Причем программы, рисунки и формулы противоречат каждый каждому! Это, повторяю, грехи автора. Переводчик тоже внес свой вклад в бардак. Вот пример. В оригинале есть фраза: "The last example in Fig. 1.11 suggests that we can do even slightly better; had the character pj been an A instead of an F, we would know that the corresponding string character could not possibly be an A, because si pj terminated the loop". Подшивалов переводит так: "Последний пример на рис. 1.11 показывает, что мы можем поступить еще лучше; поскольку символ pj равен A, а не F, мы знаем..." Проблема в том, что рис. 1.11 показывает обратное: символ pj равен как раз F. Переводить нужно так: "...если бы символ pj был равен A вместо F, мы бы знали, что..."
В начале параграфа об алгоритме Бойера и Мура Вирт обещает сначала рассмотреть упрощенный вариант, а потом перейти к полному. Обещание он не выполняет: параграф, а с ним и вся глава, заканчивается упрощенным вариантом. Полагаю, достаточно было хотя бы раз прочитать написанное, чтобы заметить и исправить это несоответствие.
Такая высокая плотность ошибок заставляет спросить: почему автор, которому, надеюсь, дорога его репутация, допускает столь вопиющую небрежность? Тут может быть несколько ответов. Вирт мог не сам писать текст, а поручить, скажем, студенту. Проверять, разумеется, не стал, ибо не царское это дело, студенческие писульки читать. Могло быть и иначе. Вирт вполне осознает, что имеет большой авторитет, и что его слова вряд ли станут подвергать сомнению (а если и станут, то заведомые недруги, такие как Керниган). Следовательно, можно не утруждать себя деталями и писать, как пишется. "Я знаменит, следовательно, я прав!" Он же, в конце концов, не Лев Толстой, чтобы по семь раз переписывать "Войну и мир" (у Толстого, кстати, и компьютера-то не было). Может быть, были иные причины. Но какими бы они не были, автора это не извиняет.
В итоге, чтение очередной книги очередного "гения программирования" (не взирая на сказанное, я считаю заслуги Вирта без всякого преувеличения огромными) показало, что от трактатов "основоположников" лучше держаться подальше. Читать нужно не гениев, а тех, кто может правильно изложить мысли (без разницы, свои или чужие) на бумаге. А для этого не нужна гениальность, достаточно просто ответственно подойти к делу.
P.S. Кстати, мой зав. кафедрой переводил фразу "далеко не все ученые" на английский язык так: "not far from all scientists". И знаете почему? Потому что в школе ему сказали, что "not far from" - это "недалеко". :) Интересно, что мне это тоже в школе говорили, но я понимал, что речь идет о расстоянии.
То же можно сказать и про его знаменитое "Искусство программирования". Честно говоря, не знаю, почему эту книгу так хвалят. Но знаю, что ни один из хвалителей, с которыми я знаком лично, ее не читал. Большинство даже в руках не даржали. Просто есть "общепринятое мнение", что книги Кнута - это круто! Вот наши преподы и советуют студентам читать то, на что сами даже не взглянули. Я попытался было почитать. Но обнаружив "доказательства" примерно такого вида: "из упражнений 12, 45 и 68 следует..." (упражнения на 17 страницах идут в конце 4-х страничной главы), решил, что могу свое время потратить с большей пользой.
Ну ладно, черт с ним, с Кнутом. Вспомнил его лишь потому, что вчера очередной студенческий наставник рассказывал, как этот дядька замечательно излагает, а на мой вопрос "Читали?" замялся и замычал (не читал, то есть).
Сегодня я хотель написать про другого "священного гуру программирования" Никлауса Вирта. Известно, что в середине 70-х он написал книгу "Алгоритмы + структура данных = программы". Я прочитал ее в 1986 и мало что понял. Но на этот раз виноват не автор, а мой недостаточный в то время багаж знаний. К тому же в книге программы были на каком-то Паскале, а нам в школе приглашенный из Механа препод говорил, что писать надо на Фортране. Но по прошествии нескольких лет я ту книгу с большим удовольствием и пользой перечитал.
И вот недавно обнаружил в магазине книгу того же Вирта с похожим названием: "Алгоритмы и сруктуры данных", изданную в прошлом году. В предисловии переводчик Подшивалов пишет, что первое издание вышло еще в 1989-м. Затем он хвалит новые главы, добавленные в книгу при переработке. Главы эти посвящены поиску: линейный поиск, двоичный поиск, поиск подстроки. Затем Подшивалов гордо заявляет, что для приближения книги к целевой аудитории он перевел все программы с "Модулы-2" на Borland Pascal. Уж лучше бы он правильно переводил текст (об этом ниже)! Логика книги оказалась нарушенной. В тексте Вирт пишет, что исключение из Модулы-2 операторов ввода-вывода потребовало изменить некоторые главы. В частности, появилось понятие последовательности - некоторой абстракции файла с последовательным доступом. Для работы с последовательностями вводится несколько функций, сосредоточенных в отдельном модуле. В авторской реализации Модулы-2 для этой цели служит модуль InOut. И какого лешего читалелю теперь нужны эти построения, если ему в качестве примеров предлагаются программы на Паскале, в котором есть операторы ввода-вывода? Зачем читателю синтаксис Модулы-2 в приложении, если на Модуле-2 в книге нет ни строчки кода? Я не говорю уже о том, что в англоязычном издании 2004 года примеры даны Виртом даже не на Модуле, а на Обероне.
Теперь о качестве книги. Оно отвратительно. Причем ответственность за отвратительность делят между собой редактор, переводчик и автор. Нет, то, что перекочевало в книгу из варианта 1975 года осталось таким же. Ну, разве что формулы как были написаны небрежно, так таковыми и остались. Например, исследуя сортировку выбором, Вирт подсчитывает число обменов в среднем. Приближая гармонические числа выражением n*ln(n), он педантично удерживает слагаемое \gamma (константа Эйлера), но пренебрегает единицей. Поскольку \gamma и 1 одного порядка, непонятно, почему первая удостоилась чести остаться в асимтотической форуме, а вторая нет. Таких примеров несколько. Но это лишь блохи.
Слоны начинаются в новых главах, посвященных поиску. И если линейный и бинарный поиск изложены без огрех (странно было бы даже тут накосячить), то поиск подстроки, а именно алгоритмы Кнута-Мориса-Пратта и Бойера и Мура - это какой-то плевок в читателя! Я изрисовал карандашом каждую страницу этих глав, столько там было ошибок. Сначала я подумал, что виноват переводчик или издатель. Но отыскав электронный вариант английского издания на сайте Технологического института в Цюрихе, убедился, что безобразие на совести автора. При чтении у меня создалось впечатление, что Вирт имел намерение вывести алгоритм из инвариантов - логических выражений, сохраняющих истинность на любом этапе поиска, - но потом нашел это скучным и при описании алгоритма стал апеллировать к "здравому смыслу". Формулы из "здравого смысла" получились неправильные. Рисунки тоже. Но программы, как ни странно, верные. Причем программы, рисунки и формулы противоречат каждый каждому! Это, повторяю, грехи автора. Переводчик тоже внес свой вклад в бардак. Вот пример. В оригинале есть фраза: "The last example in Fig. 1.11 suggests that we can do even slightly better; had the character pj been an A instead of an F, we would know that the corresponding string character could not possibly be an A, because si pj terminated the loop". Подшивалов переводит так: "Последний пример на рис. 1.11 показывает, что мы можем поступить еще лучше; поскольку символ pj равен A, а не F, мы знаем..." Проблема в том, что рис. 1.11 показывает обратное: символ pj равен как раз F. Переводить нужно так: "...если бы символ pj был равен A вместо F, мы бы знали, что..."
В начале параграфа об алгоритме Бойера и Мура Вирт обещает сначала рассмотреть упрощенный вариант, а потом перейти к полному. Обещание он не выполняет: параграф, а с ним и вся глава, заканчивается упрощенным вариантом. Полагаю, достаточно было хотя бы раз прочитать написанное, чтобы заметить и исправить это несоответствие.
Такая высокая плотность ошибок заставляет спросить: почему автор, которому, надеюсь, дорога его репутация, допускает столь вопиющую небрежность? Тут может быть несколько ответов. Вирт мог не сам писать текст, а поручить, скажем, студенту. Проверять, разумеется, не стал, ибо не царское это дело, студенческие писульки читать. Могло быть и иначе. Вирт вполне осознает, что имеет большой авторитет, и что его слова вряд ли станут подвергать сомнению (а если и станут, то заведомые недруги, такие как Керниган). Следовательно, можно не утруждать себя деталями и писать, как пишется. "Я знаменит, следовательно, я прав!" Он же, в конце концов, не Лев Толстой, чтобы по семь раз переписывать "Войну и мир" (у Толстого, кстати, и компьютера-то не было). Может быть, были иные причины. Но какими бы они не были, автора это не извиняет.
В итоге, чтение очередной книги очередного "гения программирования" (не взирая на сказанное, я считаю заслуги Вирта без всякого преувеличения огромными) показало, что от трактатов "основоположников" лучше держаться подальше. Читать нужно не гениев, а тех, кто может правильно изложить мысли (без разницы, свои или чужие) на бумаге. А для этого не нужна гениальность, достаточно просто ответственно подойти к делу.
P.S. Кстати, мой зав. кафедрой переводил фразу "далеко не все ученые" на английский язык так: "not far from all scientists". И знаете почему? Потому что в школе ему сказали, что "not far from" - это "недалеко". :) Интересно, что мне это тоже в школе говорили, но я понимал, что речь идет о расстоянии.