Стоит ли изучать старые книги по программированию — отвечают эксперты
Книг по программированию много, но не все из них новые. Стоит ли тратить время на старые книги и если да, то на какие? Спросим у экспертов.
Есть много новых книг по программированию, но они не всегда качественные. Более того, обучение очень быстро уходит в онлайн. Стоит ли тратить время на изучение старых книг по программированию (например выпущенных до 2010 года)? Если да, то на какие книги обратить внимание? Спросим у наших экспертов, а краткие выводы можно посмотреть в конце статьи.
Стоит ли изучать старые книги по программированию?
Если коротко ответить на этот вопрос — да, изучать стоит, но не все. Объясню, какие книги имеют ценность вне времени.
В основе программирования лежит алгоритмизация и булева алгебра. Потому такие книги как «Алгоритмы: Построение и анализ» Т. Кормена, «Алгоритмы» С. Дасгупты и «Структура и интерпретация компьютерных программ» Г. Абельсона содержат фундаментальные знания и обязательны к прочтению, на мой взгляд. Единственное, почему эти книги могут устареть, — если вдруг появятся издания с лучшей подачей того же материала. Я пока таких не встречал.
Также можно выделить нестареющие книги про собственно написание кода. Например «Искусство программирования» Д. Э. Кнута и «Совершенный код» С. Макконнелла. Знания, которые можно в них почерпнуть, применимы в работе с любым языком: вы просто учитесь хорошо писать код. Это умение всегда высоко ценится.
В итоге у каждого программиста вырабатывается свой профиль и индивидуальный стиль кода. Но знания алгоритмов и базовых правил в написании кода универсальны.
Безусловно, стоит изучать «старые книги». Например, по таким языкам программирования как Assembler и Си. Это позволит вам получить фундаментальные знания от том, как устроена память — как выделяется, изолируется, адресуется и освобождается. Что такое машинные инструкции, регистры и сегменты. Каким образом и в какой последовательности выполняются машинные инструкции. Что такое прерывания, условные и безусловные переходы. Эти знания значительно облегчат вам жизнь, даже если вы занимаетесь разработкой на высокоуровневых языках программирования, таких как JAVA, C#, Python.
Я считаю, что не стоит отрекаться от всех книг, которые устарели. Думаю, всё зависит от того, что конкретно мы хотим изучить.
Если это что-то фундаментальное, например, «Алгоритмы и структуры данных», то почему бы и нет. Первое, что появляется при запросе в Google, это книга, написанная Никлаусом Виртом в 1976 году. Да, она всё ещё популярна!
Также не устаревают книги, написанные по паттернам проектирования и каким-то общим областям программирования. Конечно, я не спорю, что более свежие книги, возможно, объёмней охватывают конкретную область с учётом нынешних тенденций, проблем и опыта.
Но если же мы хотим изучить что-то более узкоспециализированное в программировании, то чтение старых книг — не очень хорошая идея. Здесь всё довольно быстро устаревает. Объясню на своём примере. Решил я как-то изучить библиотеку React на JavaScript. Приобрёл себе книгу «React и Redux. Функциональная веб-разработка», написанную Алексом Бэнксом и Евой Порселло. При покупке я смотрел, чтобы год издания совпадал с нынешним (покупал я её в 2018 году). Во время прочтения книги я обнаружил, что часть представленного там кода просто нерабочая. Оказалось, что библиотека React уже давно обновилась и некоторые её функции были «deprecated». Да и вовсе оказалось, что книга была издана «O’Reilly» в 2017 году, а переведена и выпущена нашим издательством «Питер» только в 2018. Так что здесь нужно быть осторожным.
Однозначный ответ на этот вопрос дать тяжело. Многое зависит от языка программирования. Если речь идёт о таких языках как C++, Java и подобные, то здесь стоит задуматься над изучением старой литературы. Она позволит заложить хорошую базу для понимания основных принципов программирования. Но так как программирование — это сфера, подверженная стремительному развитию, чтобы оставаться востребованным специалистом, необходимо следить за трендами рынка. Тут, к сожалению, книги не помогут, а тем более старые. Я считаю, что наиболее полезным будет чтение форумов, посвящённых вашей сфере, а также участие в open-source проектах.
Древние волшебные книги, хранящие сакральные знания о тёмной магии, бывают только в фэнтези и истории религий. В реальном мире книга либо представляет собой букинистическую ценность, либо продаётся в -надцатом издании в любом магазине. Только не надо путать книги о программировании вообще и конкретные прикладные книги про особенности конкретных платформ. Первые не устареют никогда, и вечно переиздаваемый Кнут тому пример. Тут тоже есть смысл брать именно последнее издание, потому что тот же Дональд свою авторскую копейку не просто так собирает, а регулярно вносит в последующие издания какие-то изменения (которые не всегда печатает издатель, конечно, но это к вопросу уже не относится). Книги про платформы же устаревают вместе с платформами, и копаться во всём этом имеет смысл, только если вы увлекаетесь археологией или историей языков. Никто же сейчас на полном серьёзе не будет спорить о том, что писал Дарвин в своём «Происхождение видов» — труд знаковый, но для современной науки безнадёжно устаревший. Почитать, конечно, интересно, но про нынешнюю биологию лучше узнавать в современных трудах.
В общем, прекратите нервировать библиотекарей и покупайте современную литературу.
Подавляющее большинство современных книг по программированию имеет названия вида «X in action», «Y in nutshell» или «Z brain crash course», где места переменных занимают актуальные технологии или фреймворки. Очевидно, что их популярность и востребованность зависит от того, насколько быстро данная технология или фреймворк выйдут из моды или при выпуске новой версии изменятся до неузнаваемости.
Но с другой стороны есть книги, которые описывают подходы, практики или навыки, не привязываясь к конкретной реализации. Примером тому может служит книга «Design Patterns: Elements of Reusable Object-Oriented Software» (1994 год), по сей день являющаяся стандартом де-факто для вопросов на собеседовании в рамках ООП. Могу продолжить ряд «нетленок» в хронологическом порядке:
- The Mythical Man-Month: Essays on Software Engineering by Frederick P. Brooks Jr. — 1975;
- Refactoring: Improving the Design of Existing Code by Martin Fowler — 1999;
- Test Driven Development: By Example by Kent Beck — 2002;
- Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin — 2008.
Определённо стоит изучать «старые» книги по программированию и проектированию, это позволяет шире взглянуть на предметную область и разработать полноценные стабильные решения для промышленного использования.
Я считаю, что особого смысла в этом нет. Технологии развиваются настолько быстро, что уже через 8–10 лет практически любая книга, описывающая ту или иную технологию, становится неактуальной. А по «горячим» технологиям, таким как машинное обучение, книги часто устаревают к моменту печати русского перевода. Конечно, есть и «вечные ценности» — алгоритмическая база, которая нужна каждому программисту. Но и в этой области периодически выходят новые книги, в которых те же классические базовые понятия и алгоритмы описываются более современным языком и с учётом новых достижений.
Книги по алгоритмам устаревают гораздо медленнее, но всё равно устаревают. Многие знают, например, классическое «Искусство программирования» Кнута, книги Ахо, Хопкрофта и Ульмана. Но я бы порекомендовал более новые работы — Кормена и соавторов или ещё более актуальную книгу Клейнберга и Тардос.
Мне кажется, каждому программисту пригодится «Design Patterns: Elements of Reusable Object-Oriented Software». Книга известна также под именем «Gang of four» или GoF, потому что написали её четыре человека. Первое издание — 1994 год, но с тех пор она не потеряла актуальности.
GoF — книга о паттернах программирования. Она даёт понимание того, как может быть устроена программа, из каких кубиков её собирать, чтобы получилось красиво и надёжно. Бывает, человек пишет класс и даже не понимает, что применяет тот или иной паттерн или их агрегацию. Прочитай он GoF, понял бы, где в коде недостатки, как оптимально сложить кубики и убрать костыли. Применять или нет паттерны на практике — дело вкуса, но книга хотя бы даёт понимание, как в принципе может быть.
Читать советую строго на английском. В русской версии названия паттернов перевели: из «Bridge» получился «Мост», например. В итоге программиста, прочитавшего русскую версию, не поймут в профессиональной среде. Как минимум он будет выглядеть странно.
А если в целом, я делю книги на две группы:
1. Фундаментальные, которые условно не привязаны к языку программирования. GoF именно в этой группе. Да, в фундаментальных книгах примеры пишут на каком-то конкретном языке, но дело не в нём, а в акцентах. Суть не привязана к синтаксису, поэтому такие книги почти не стареют. Всем известный Кнут относится к этому же типу. Но за Кнута нужно браться, когда сам чётко понимаешь, зачем он тебе нужен. Иначе не зайдёт, лучше даже не начинать.
2. «Синтаксические» книги посвящены конкретному языку и его особенностям. Вот тут, пожалуй, можно обойтись не просто без старых книг, а без книг вовсе. Потому что любая книга отлита в бетоне и фиксирует состояние языка на момент её выхода. А язык развивается, если не брать какой-нибудь Cobol, и с появлением новых возможностей меняется принцип построения программ. Например, книга Страуструпа «Язык программирования C++» впервые вышла в 1986 году. Тогда C++ умел в разы меньше, чем сейчас, и сегодня книга представляет разве что исторический интерес. Следить за развитием языка эффективнее по документации, свежим статьям, примерам, через эксперименты.
Как любую профессиональную литературу, книги по программированию можно разделить на фундаментальные и нет. К фундаментальным, например, можно отнести книги по алгоритмам и структурам данных, написанию тестов, программированию в базах данных, шаблонам проектирования и языкам программирования, которые прочно вошли в отрасль (Java, C++, C#).
Такие книги не теряют свою актуальность со временем и, на мой взгляд, обязательны к прочтению всеми программистами, желающими стать востребованными профессионалами. К нефундаментальным можно отнести книги по инструментам и фреймворкам. Такие книги устаревают достаточно быстро, и тратить на них время или нет — это личное решение каждого. Кто-то может набить шишки без книг, кому-то нужно «пошуршать страницами». В любом случае пользоваться такими книгами можно как справочниками — их структура обычно к этому располагает. Стоит ли смотреть онлайн-курсы или читать бумажные книги — вопрос индивидуальный. Кто-то лучше воспринимает информацию с экрана монитора, кому-то нужен текст.
Итак, к фундаментальным книгам я бы отнёс следующую профессиональную литературу:
- Д. Кнут «Искусство программирования» (The Art of Computer Programming);
- Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (больше известные как GoF) «Приёмы объектно-ориентированного проектирования. Паттерны проектирования» (Design Patterns: Elements of Reusable Object-Oriented Software);
- Мартин Фаулер «Шаблоны корпоративных приложений» (Patterns of Enterprise Application Architecture);
- Роберт К. Мартин «Чистый код. Создание, анализ и рефакторинг» (Clean Code: A Handbook of Agile Software Craftsmanship);
- Стив Макконнелл «Совершенный код» (Code Complete);
- Мартин Грабер «Понимание SQL» (Mastering SQL).
Итак, стоит ли читать старые книги по программированию?
Эксперты сходятся во мнениях, что:
- Стоит читать книги, описывающие фундаментальные вещи вроде алгоритмов и структур данных или паттернов проектирования. Причина проста — они, как правило, не устаревают. К таким книгам относят:Д. Э. Кнут «Искусство программирования»;С. Макконнелл «Совершенный код»;Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес «Приёмы объектно-ориентированного проектирования. Паттерны проектирования»;Роберт К. Мартин «Чистый код. Создание, анализ и рефакторинг».
- Книги, привязанные к языку программирования, стоит рассматривать, если он нечасто или незначительно обновляется, и чтобы получить базовые знания о нём. Если вы хотите изучить какой-нибудь JavaScript-фреймворк, например, то лучше обойтись документацией или форумами, так как пока выйдет книга, фреймворк может измениться несколько раз.
- Если вы любите рисковать и хотите прочесть книгу по технологии, которая более-менее часто обновляется, то лучше читайте оригинал, так как перевод может затянуться на несколько лет.
Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.