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

Польза не во многих, но в хороших книгах.

Сенека

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

В этой статье мы рассмотрели не все книги из золотого фонда программерской мысли. Следующие Х книг ты найдешь в десятом номере.

С. Макконнелл «Совершенный код»

Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.

Сложно найти гуру программирования, который не читал «Совершенный код» Стива Макконнелла. Действительно, одна книга, хоть и немаленькая (чуть менее 900 страниц), покрывает практически все аспекты разработки ПО: от рецептов написания высококачественного кода, механизмов тестирования и отладки до стратегий оптимизации кода и психологических факторов, влияющих на разработку. Представь себе: библиография книги занимает 20 страниц и содержит более 500 источников! Книга «Совершенный код» - одно из самых полезных и, как следствие, популярных изданий по разработке ПО. Она неоднократно доказала это, возглавляя рейтинги книг по программированию (goo.gl/3q0kx). Благодаря простой манере изложения, особому стилю и чувству юмора Стива книга читается очень легко.

Говоря о проектировании и конструировании программных систем, Макконнелл выделает Главный Технический Императив Разработки ПО - управление сложностью. Простота и ясность исходного кода и архитектуры системы определяют ее качество. Большая часть книги посвящена написанию высококачественного кода. Макконнелл, как никто другой осознавая значимость мелочей, детально описывает все правила, которыми необходимо руководствоваться при написании хорошего кода. Необходимый уровень абстракции, разработка качественных интерфейсов классов и пакетов, написание высококачественных методов, выбор удачных имен переменных, упрощение управляющих структур, комментирование кода - ничто не ускользает от внимания автора. Например, общим принципам использования переменных отведен целый раздел книги более чем на 100 страниц. Только вопросу выбора имен переменных посвящена целая глава на 30 страниц. При этом все правила и советы даются исключительно с практической точки зрения.

В части, в которой говорится о качестве ПО в целом, Макконнелл формулирует Главный Закон Качества ПО: повышение качества системы снижает расходы на ее разработку. Причина ясна - большую часть времени программисты занимаются чтением и отладкой написанного кода, тогда как на собственно написание уходит около 10% рабочего времени. Поэтому поддержание качества кода системы на высоком уровне экономит много времени и тем самым повышает КПД программиста.

Автор не обходит вниманием и различные методики разработки. Подробно описывается парное программирование, ревизии кода, формальные и неформальные инспекции, разработка на основе тестирования. «Рефакторинг» - единственная глава книги, которую можно назвать «слабоватой». При рассмотрении методов рефакторинга приводится лишь длинный список его видов из книги М. Фаулера «Рефакторинг». При этом нет ни одного конкретного примера кода. Раздел носит скорее ознакомительный характер.

Говоря о повышении производительности ПО, автор приводит убедительные доводы против преждевременной оптимизации, когда программист в процессе разработки интуитивно распознает «узкие» места в программе и незамедлительно принимает меры по оптимизации в ущерб качеству кода. Приводимая статистика показывает, что в 9 из 10 своих предположений программист ошибается.

Подвести итоги можно словами Джона Роббинса: «Это просто самая лучшая книга по конструированию ПО из всех, что когда-либо попадались мне в руки. Каждый разработчик должен иметь ее и перечитывать от корки до корки каждый год. Я ежегодно перечитываю ее на протяжении вот уже девяти лет и все еще узнаю много нового!»

М. Фаулер «Рефакторинг»

Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям.

М. Фаулер

Практически любое издание о рефакторинге ссылается на книгу Мартина Фаулера «Рефакторинг». Действительно, в этой книге Фаулер сделал невозможное - в предельно понятной форме донес до читателей почти полностью исчерпывающее описание понятия «рефакторинг», его назначение, особенности и методы реализации.

При немалом объеме (400 страниц) книга читается буквально за пару вечеров, от нее просто невозможно оторваться. Главная причина головокружительного успеха книги - ее практическая направленность. Все мы знаем, что самая сложная задача при подаче материала - привести хороший показательный пример. В этом Фаулеру нет равных. Книга начинается с примера улучшения программы, который сразу с головой затягивает читателя в мир рефакторинга. Всего 40 страниц примера дают нам вполне конкретное представление о рефакторинге, его целях, принципах и основных методах реализации. Мартин определяет рефакторинг как «изменение во внутренней структуре ПО, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения». Но когда необходимо проводить данное изменение? Какой код должен подвергаться переработке? Автор дает исчерпывающие ответы на эти вопросы. Он вводит правило «трех ударов»: «После трех ударов начинайте рефакторинг». То есть когда вы делаете что-то аналогичное в третий раз, это сигнал для начала рефакторинга. Раздел «Код с душком» дает нам четкое представление о том, какой же код требует улучшения. К признакам такого кода относятся: длинный метод, большой класс, длинный список параметров метода, дублирование кода, операторы типа switch, временные поля, отказ от наследства, неуместная близость классов и многое другое.

Фаулер, как сторонник TDD (Test-driven development), посвящает главу книги созданию автоматических тестов и описанию среды JUnit. Если обнаружена ошибка, сначала необходимо написать автоматический тест, выявляющий ее, и лишь затем проводить исправление. Это позволит в будущем не наступать на одни и те же грабли. Аналогично перед проведением рефакторинга следует написать тест для улучшаемого кода, чтобы обеспечить неизменность его поведения.

Бо́льшую часть книги занимает каталог методов рефакторинга. Он содержит разделы, посвященные составлению методов, перемещению функций между объектами, организации данных, упрощению условных выражений и вызовов методов, решению задач обобщения и крупным архитектурным рефакторингам. Многие из методов рефакторинга автоматизированы в популярных IDE. Например, Visual Studio предоставляет возможности по автоматическому выделению метода (ExtractMethod), удалению параметра (RemoveParameter), выделению интерфейса (ExtractInterface) и пр. В качестве крупных рефакторингов уровня системы Фаулер приводит следующие: разделение иерархии наследования, выполняющей более одной задачи, преобразование процедурного подхода к проектированию в объектно-ориентированный подход, отделение предметной области от уровня представления, а также выделение иерархии, подразумевающее разбиение большого класса на целую иерархию значительно меньших по размеру и более специализированных подклассов.

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

Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес «Паттерны проектирования»

Проектирование объектно-ориентированных программ - нелегкое дело, а если их нужно использовать повторно, то все становится еще сложнее.

Э. Гамма

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

Очень часто начинающий разработчик самостоятельно берется за решение уже более тысячи раз решенной до него задачи проектирования и изобретает очередную разновидность пятиколесного велосипеда, истинно гордясь своим «новшеством». Владение языком паттернов позволяет решить множество задач проектирования наиболее оптимальным способом, затрачивая при этом минимум усилий. Всего двадцать описанных в книге паттернов предоставляют инструментарий для решения огромного спектра задач проектирования ПО. Материал книги довольно сложен и требует от читателя определенных знаний в области объектно-ориентированного проектировании. Для освоения паттернов недостаточно просто прочитать книгу, необходимо основательно над ней «попотеть». Впрочем, твои усилия не пройдут даром. Книга содержит 350 страниц и состоит из двух частей. В первой части дается общее понятие паттернов проектирования, описывается их практическое применение на примере создания визуального редактора документов Lexi. Вторая часть книги содержит каталог паттернов с подробным описанием назначения, структуры, особенностей реализации и примерами применения каждого паттерна.

Коллектив авторов известен как Gang of Four («Банда четырех»), поэтому представленные в книге паттерны называют GoF. Авторы разбивают все множество представленных паттернов на три группы: порождающие паттерны, структурные паттерны и паттерны поведения. Порождающие паттерны решают задачу инстанцирования (создание экземпляров) классов. К самым популярным паттернам в данной группе можно отнести AbstractFactory (абстрактная фабрика), FactoryMethod (фабричный метод) и Singleton (одиночка).

Структурные паттерны предназначены для решения вопросов компоновки системы на основе классов и объектов. К ним относятся такие важнейшие паттерны, как Adapter (адаптер), Bridge (мост), Composite (компоновщик), Proxy (заместитель) и Façade (фасад). Паттерны поведения связаны с алгоритмами и вопросами распределения обязанностей между классами. Здесь необходимо упомянуть Strategy (стратегия), TemplateMethod (шаблонный метод), Observer (наблюдатель), Command (команда) и Iterator (итератор).

Единственное, что может смутить читателя, - некоторые примеры в книге написаны на малоизвестном на сегодняшний день языке программирования Smalltalk, а для изображения диаграмм классов вместо привычного UML используется OMT (Object Modeling Technique).

Гуру ООАиП Мартин Фаулер пишет: «Паттерны GoF - это лучшая из когда-либо изданных книг по объектно-ориентированному проектированию. Эта книга чрезвычайно влиятельна в индустрии программного обеспечения - только посмотрите на библиотеки Java и.NET, которые буквально кишат паттернами GoF». Не существует специалиста в области объектно-ориентированного проектирования, незнакомого с паттернами GoF, а если такой и есть, то в этом случае его, скорее всего, нельзя назвать специалистом.

Р. Мартин «Чистый код»

Умение писать код - тяжелая работа. Она не ограничивается знанием паттернов и принципов. Над кодом необходимо попотеть.

Р. Мартин

«Чистый код» - одна из наиболее удачных книг, посвященных написанию высококачественного кода. Размер книги - 360 страниц, не считая приложений. При этом она настолько увлекательна и доступна, что за два-три вечера запросто прочитаешь ее от корки до корки. В дружеской манере «дядюшка» Боб рассказывает нам, какими же принципами нужно руководствоваться, чтобы писать хороший код. Книга изобилует примерами из реальных приложений, с которыми автор сталкивался в своей практике. Среди них такие известные продукты, как JUnit, FitNesse, JDepend, Ant и TomCat.

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

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

Необходимо поддерживать его чистоту с течением времени, чтобы предотвратить «загнивание». Поэтому он вводит «правило бойскаута»: «Оставь место стоянки чище, чем оно было до твоего прихода». То есть с каким бы участком кода мы ни работали, нужно пытаться в итоге сделать его качественнее, чем он был. В таком случае, код не будет загнивать и останется чистым.

При создании функций во главу угла ставятся компактность, правило одной операции и одного уровня абстракции - очевидные на первый взгляд принципы, которые так часто нарушаются программистами. Будучи ярым адептом TDD, Мартин указывает на важность «чистоты» не только кода конечного продукта, но и кода модульных тестов. Он иронически замечает: «Какими отличительными признаками характеризуется чистый тест? Тремя: удобочитаемостью, удобочитаемостью и удобочитаемостью».

Пожалуй, единственный недостаток книги - это ее Java-ориентированность. Все представленные примеры написаны исключительно на языке Java. При этом большое количество советов и «запахов кода» характерны в основном для Java-кода.

В начале книги Роберт приводит ответы мэтров программирования на вопрос, что же такое «чистый код». Грэди Буч отвечает: «Чистый код прост и прямолинеен. Чистый код читается, как хорошо написанная проза. Чистый код никогда не затемняет намерения проектировщика; он полон четких абстракций и простых линий передачи управления». Программисты, которые стремятся писать «чистый код», просто обязаны прочитать эту книгу.

Д. Кнут «Искусство программирования»

Лучший способ в чем-то разобраться до конца - это попробовать научить этому компьютер.

Д. Кнут

Программист, у которого нет книги «Искусство программирования», как священнослужитель, у которого нет Библии. Монографию Дональда Кнута часто называют «Библией программиста». Она содержит подробное описание и анализ важнейших фундаментальных алгоритмов, используемых в информатике, а также множество практических задач для усвоения и закрепления представленного материала. Журнал American Scientist включил работу Кнута в список двенадцати лучших физико-математических монографий XX века наряду с работой Эйнштейна по теории относительности. Успех книги определило качество изложения и глубина анализа общих вопросов программирования.

Кнут начал работу над «Искусством программирования» еще в 1962 году. По замыслу автора монография должна состоять из семи томов. Пока было издано три первых тома, а также первая половина четвертого. Все изданные на сегодняшний день материалы составляют почти 3000 страниц. Читать книгу совсем не просто (как, впрочем, и Библию), главным образом потому, что все примеры рассматриваются на низкоуровневом языке программирования - ассемблере для гипотетического выдуманного автором компьютера MIX. Поэтому у программиста вряд ли получится использовать книгу в качестве набора готовых рецептов для решения конкретных задач. Эта книга дает программисту не рыбу, а скорее хорошую удочку, с помощью которой он сможет не без определенных усилий самостоятельно наловить рыбы.

Первый том посвящен основным алгоритмам и состоит из двух глав. Первая глава подготавливает читателя к работе над книгой. Здесь рассматриваются основные математические понятия и теоремы, на которых базируется весь материал. Читатель знакомится с «полиненасыщенным компьютером» MIX, его архитектурой и его языком ассемблера. Вторая глава посвящена информационным структурам и алгоритмам работы с ними. Здесь рассматриваются деревья, многосвязные структуры, линейные списки, в том числе стеки, очереди, деки, циклические и дважды связанные списки и прочее.

Второй том включает в себя третью и четвертую главы. Третья глава посвящена работе со случайными числами и последовательностями. В четвертой главе описываются вопросы арифметики, а именно различные виды систем счисления, арифметика чисел с плавающей точкой и рациональных чисел, полиномиальная арифметика и другое. Третий том посвящен алгоритмам сортировки и поиска (соответственно, главы 5 и 6). Из четвертого тома опубликованы материалы седьмой главы, описывающей вопросы комбинаторного поиска.

Исходя из планов автора, в четвертый том также войдет восьмая глава, в которой рассматриваются рекурсивные алгоритмы. Пятый том будет содержать материалы по синтаксическим алгоритмам, в том числе по лексикографическому и синтаксическому поиску. Ожидающие издания шестой и седьмой тома будут посвящены теории языков и компиляторам.

В своем отзыве о работе Кнута Билл Гейтс сказал: «Если вы считаете себя действительно хорошим программистом… прочитайте „Искусство программирования“ (Кнута)… Если вы сможете прочесть весь этот труд, то вам определенно следует отправить мне резюме». Цитата лишний раз подчеркивает, что, несмотря на сложность материала, настоящий профессионал обязательно должен осилить труд Дональда Эрвина Кнута «Искусство программирования».

Э. Хант, Д. Томас «Программист-прагматик»

Программисты-прагматики не уклоняются от ответственности. Вместо этого они испытывают радость, принимая вызовы и распространяя свой опыт.

Эндрю Хант

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

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

Одним из самых замечательных принципов программирования, которым мы обязаны авторам, является принцип DRY (Don’t Repeat Yourself), что в переводе на русский означает: «Не повторяй самого себя». Это значит, что каждый фрагмент знания должен иметь единственное и однозначное представление в системе. Следование данному принципу позволяет повысить надежность, доступность и простоту сопровождения программного продукта.

В главе, посвященной общей философии прагматичного программирования, мы узнаем, каким авторы видят программиста-прагматика: он всегда принимает ответственность за свой код, следит за состоянием своего продукта, постоянно совершенствуется, общается и находит компромисс с пользователями. Глава «Прагматический подход» говорит об общих методиках разработки и оценки трудоемкости проектов. Важнейшая глава «Гибкость против хрупкости» рассказывает, каким же образом необходимо создавать действительно гибкие и устойчивые к изменению системы. Из главы «Перед тем, как начать проект» можно узнать о процедуре формирования и утверждения требований к системе. «Прагматические проекты» знакомят нас с критическими аспектами создания реальных проектов, такими как работа в команде, тестирование и формирование документации.

Единственное, что может подпортить впечатление о книге, так это недостаточно качественный перевод на русский язык и наличие множества опечаток. Книгу лучше всего читать в оригинале на английском языке. Нельзя не согласиться с отзывом Кента Бека: «Главное в этой книге то, что она поддерживает процесс создания программ в хорошей форме. [Книга] способствует вашему постоянному росту и явно написана людьми, знающими толк в программировании». Если вы стремитесь к постоянному росту как программист, эта книга обязательна к прочтению.

Заключение

Значение хороших книг по программированию сложно переоценить. Каждая из описанных книг позволяет совершить огромный скачок в развитии. «Искусство программирования» закладывает прочный фундамент, обучая нас фундаментальным алгоритмам и приемам программирования. «Совершенный код» позволяет выйти на новый качественный уровень конструирования ПО. «Чистый код» и «Рефакторинг» учат нас внимательнее относиться к качеству кода и поддерживать его в идеальном состоянии. «Программист-прагматик» подсказывает, как же реально добиться практического успеха при разработке ПО. «Паттерны проектирования» вооружают тяжелой артиллерией паттернов для решения множества задач проектирования.

Как известно, одна из основополагающих заповедей успешного программиста – никогда не прекращать обучение, что неизменно связано с чтением профессиональной литературы. Сегодня мы поговорим про лучшие книги по программированию из числа тех, что не имеют привязки к определённому языку или среде. Вот 12 из них:

Совершенный код , Стив Макконнелл

Если вы планируете построить успешную карьеру программиста, то это та книга, которую прочитать вы просто обязаны. Абсолютно неважно, в какой среде вы планируете работать, какой ваш уровень подготовки, новичок вы или уже руководитель – здесь найдётся полезная информация для каждого, кто хоть как-то связан с процессом создания кода. Совершенного кода.

Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию , Г. Лакман Макдауэлл

Не обращайте внимание на российского название, в оригинале это «Cracking the Coding Interview: 150 Programming Interview Questions and Solution», то есть просто 150 наиболее часто задаваемых вопросов на собеседованиях в крупных IT-компаниях. Ответы, разумеется, прилагаются. Помогает не только потренировать собственный мозг, но и получить представление об образе мышления в Amazon, Apple, Facebook, Google и Microsoft.

Начинающие программисты часто спрашивают, какие книги по программированию читать и как, чтобы лучше усвоился материал. Отвечаем на эти вопросы.

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

Зачем нужны книги по программированию?

Провоцирует данный вопрос изобилие курсов и видеотуториалов, которые якобы сводят пользу чтения на нет, хотя это далеко не так. Книга – довольно объемный ресурс, предназначенный для основательного изучения материала. Техническая книга предоставляет не только информацию о техниках и советы, но также взгляд с высоты птичьего полета на определенные концепции, идеи и общее понимание предмета.

Техническая книга не читается за один вечер подобно художественной литературе. Зачастую она забирает дни, недели, а иногда и месяцы. Но даже столь «растянутый» срок не гарантирует, что вы быстро освоите все изложенное. Таким образом, брать в самом начале большую техническую книгу (а то и две) и просто читать – малоэффективный метод.

Сперва определитесь, что планируете осваивать.

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

Например, если сперва программировать на Java или Python, а затем перейти на что-то вроде языка C, пытаясь его изучить с помощью туториалов, – ничего не выйдет. Низкоуровневое управление памятью, указатели, массивы и уйма других интересных вещей, о которых вы ранее даже не догадывались, не позволят сделать что-либо стоящее.

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

Другой пример:

Если начинаете изучать несложные технологии, где в рамках первых экспериментов достаточно знать несколько простых фактов, читать целую книгу нет смысла. По крайней мере, с самого начала.

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

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

Подытожим:

  1. Начинаете изучать что-то новое и не знаете, насколько оно сложное? Попробуйте для начала пробежаться по быстрым курсам, статьям и туториалам. Не помогло? Тогда ищите книги по программированию для основательного углубления в теорию.
  2. Уверены, что технология не является «rocket science» (сложной)? В этом случае книгу можно отложить до лучших времен, когда вы обрастете некоторым опытом: так она окажется намного более понятной и полезной.
  3. Если же точно знаете, что будет непросто (язык со сложными конструкциями, парадигмами, разработка под конкретную платформу, etc.), сразу ищите книгу, но также не забывайте о параллельной практике.

Как лучше читать книги по программированию?

Высшая математика – это зачастую исключительно теория. Программирование же в большинстве случаев является практикой.

Книги по технологиям (языки программирования, web-разработка, создание мобильных приложений) переполнены практическими примерами и заданиями, а потому нужно основательно «набить руку»: только так материал правильно осядет в голове.

Правило первое: только практика набивает руку.

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

Правило второе: перечитывайте.

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

Правило третье: пять книг не лучше, чем одна.

Погоня за количеством в надежде забить свой шкаф «умными» книжками ни к чему не приведет. Изучая новое, бывает тяжело заставить себя перейти к практике. Чтобы оставаться в зоне комфорта, мы часто утешаем себя тем, что мало знаем, и попадаем в ловушку под названием «Вечный Студент» – человек, который постоянно что-то учит, но на самом деле ничего со своими знаниями не делает.

Чтобы начать работать над новой для нас технологией, достаточно пройти одну базовую книгу. Если вы считаете иначе – поделитесь в комментариях своими мыслями по этому поводу: будет интересно подискутировать на тему.

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

Какие книги по программированию читать?

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

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

10. С. Скиен «Алгоритмы. Руководство по разработке»

Прекрасное пособие по разработке алгоритмов, которое пригодится программисту любого уровня, от новичка до senior’a. Издание, по сути, является структурированным сборником из алгоритмических задач, сопутствующей им теории, решению с разбором и самостоятельных упражнений для закрепления материала, где чётко и ясно, хоть и немного суховато, рассматриваются такие темы как графы, численные методы, анализ алгоритмов, сортировки, структуры данных и т.д.

9. Э. Свейгарт «Автоматизация рутинных задач с помощью Python: практическое руководство для начинающих»


Отличное руководство, которое можно смело порекомендовать любому пользователю компьютера. Также издание прекрасно подойдёт в качестве первой книги для знакомства с языком программирования Python. Материал изложен в доступной форме, с большим количеством простых примеров кода и соответствующих пояснений там, где это нужно. Здесь вы найдёте информацию о том, как заставить компьютер выполнять за вас такие задачи как поиск определенного текста в файле или в множестве файлов, обновление и форматирование данных в электронных таблицах Excel любого размера и прочие рутинные задачи.

8. А. Бхаргава «Грокаем алгоритмы. Иллюстрированное пособие для программистов и начинающих»


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

7. Г. Макдауэлл «Карьера программиста»


Если вы хотите устроиться на работу в сфере информационных технологий в приличную компанию, то вы обязаны как минимум тщательно ознакомиться с данным литературным творением. Это руководство объединяет в себе рекомендации по тому, как следует вести себя при устройстве на работу, собрание фундаментальных знаний по всем основным технологиям, включая C/C++, Java, базы данных, структуры данных, оптимизацию и теорию сложности алгоритмов, а также сборник наиболее значимых и каверзных задач и вопросов по всем перечисленным аспектам.

6. С. Бабин «Инструментарий хакера»


Издание, в первую очередь ориентированное на тех, кто ещё только начинает знакомиться со сферой информационной безопасности. В книге довольно подробно и с множеством иллюстраций описываются такие вещи, как перехват паролей, атаки на Wi-Fi-роутеры, подмена MAC-адресов, способы оставаться невидимым в Интернете. Также описаны методы защиты с помощью соответствующих программных инструментов, приводятся советы по безопасности для пользователей программ типа «клиент-банк». Характерной особенностью этой книги является то, что сам её автор не является профессиональным программистом, поэтому некоторые вопросы, которые профессионалы в данной области решают сами путём написания своих скриптов или же изменения существующих, писатель решает путем гугления в интернете уже готовых решений, не вдаваясь в подробности реализации скачанной программы.


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

4. Т. О’Коннор «Жестокий Python:настольная книга хакеров, аналитиков и инженеров по безопасности»


Издание, которое одинаково хорошо подходит и для новичков в Python, и для тех, кто уже имеет знания по данной технологии. Автор пошагово объясняет, как писать скрипты для автоматизации крупномасштабных сетевых атак и получения метаданных, проводить экспертизы добытых «артефактов». Также описывается, как писать код для перехвата и анализа сетевого трафика, обмана устройств для атаки через Wi-Fi или Bluetooth и как избегать современных антивирусов. Для новичков в Python в пособии есть первая глава под названием введение, где объясняются основы использования и написания скриптов на Python.

3. М. Абрамян «1000 задач по программированию»

Данный сборник задач ориентирован на школьников и студентов начальных курсов математических специальностей. Структура данного пособия делится на 3 части: 1) Скалярные типы данных, управляющие операторы, процедуры и функции; 2) Минимумы и максимумы, одномерные и двумерные массивы, символы и строки, двоичные файлы; 3) Текстовые файлы, составные типы данных в процедурах и функциях, рекурсия, указатели и динамические структуры. Следует отметить, что в приведённом издании не представлено никакой теории, только задачи, поэтому новичкам придётся искать дополнительные источники информации по основам программирования и алгоритмам.

2. М. Грабер «SQL для простых смертных»


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

… часто спрашивают на форумах по веб-разработке.

Распространённое заблуждение

Когда вопрос «Какие книги посоветуете?» задают новички в веб-технологиях и начинающие программисты, в ответ часто можно услышать предложения прочитать фундаментальные книги. Эти книги переворачивают взгляд на код, позволяют упорядочить знания, правильно проектировать сложные программные системы и программировать профессионально. Их советуют из добрых побуждений: если они так классно помогли кому-то, то (логично ведь?) помогут и всем остальным. Это очень распространённый совет профессионалов: читайте профессиональные книги. И это очень распространённое заблуждение.

Спойлер: там, в конце, есть ссылка на примеры кода «Привет, мир!» на 500+ языках программирования и генераторы текста песенки «99 bottles of beer» на 600+ языках программирования и 34 варианта решения одной задачи «поиск 25ти самых частых слов» на Python разного уровня сложности. Ищи внимательно.

Прежде чем открыть «Чистый код»

Возможно, что тебе тоже посоветовали «Чистый код» и «Банду четырёх». И теперь ты в раздумьях: читать или не читать? Или ты уже прочитал пару глав и в тебе зародилось сомнение: а не зря ли ты взялся за эту тему? Это же просто китайская грамота какая-то, а не книга. Как можно читать такой труд и не понимать ни строчки? Может что-то не так в тебе … ? Стоп!

Четыре года назад я начал программы поддержки начинающих и стажировку по веб-технологиям. В большинстве случаев ко мне обращались те, кто вообще ничего не знает ни о программировании, ни о веб-технологиях. Слово «сервер» для них означает большой компьютер. «Клиент» — это покупатель в магазине или посетитель банка. «Hello, World» в программном коде никогда не видели.
Конечно же, мы совместно подбирали литературу. И прежде чем попытаться предложить профессиональные супер книги, я всегда мысленно вставал на сторону новичка: насколько ужасно будет попытаться прочитать страницу и АБСОЛЮТНО НИЧЕГО НЕ ПОНЯТЬ? Не вызовет ли это страх от непонимания или отвращение из-за сложности? Да, вызовет.

Простое объяснение:

  • прежде чем писать, надо читать
  • прежде чем читать «Чистый код», надо научиться писать грязный неуклюжий код
  • прежде чем правильно проектировать большие программные системы, надо неправильно спроектировать свою маленькую программу

Нужно научиться читать программы

Вот таким образом нужно изучать все фрагменты кода, которые ты встретишь в книге или статье.

Если нет понимания, нужно либо прочитать об этом, либо спросить кого-либо. И даже когда расписал всё и вроде как понял — нужно убедиться, что ты понял правильно. Для этого нужно выполнить фрагмент кода. Или, опять же, дать кому-нибудь твоё описание, чтобы проверить понимание написанного.

Научись мысленно выполнять код. Фрагмент из книг серии «Head First» без разрешения автора, извиняюсь.

В университете почти год тратится на то, чтобы научиться понимать фрагменты кода длиной от двух до двадцати строк. Две строки кода, Карл! В C++/Javascript/C# и многих других языках — одна точка с запятой в другом месте и смысл меняется. В Python — пропустил один пробел и алгоритм работает по-другому. Повторно инициализировал переменную и её значение внезапно исчезло. Не дописал один знак равенства в условии и его значение поменяется на противоположное.

В голове у меня живёт браузер и веб-сервер. Часть кода JS/CSS/HTML я вполне могу интерпретировать и отобразить мысленно, как браузер. Где-то рядом с ним — консоль PHP, Python, Bash, Power Shell — пока я скольжу глазами по коду, он уже выполняется строка за строкой.
Пример 1. На собеседовании мне дали лист кода на PHP. Пока ведущий собеседования искал вопрос, соответствующий этому листу, я уже карандашом исправил все ошибки и пометил значками (!) места, в которых мог быть SQL Injection. Он только вздохнул.
Пример 2. Есть немало людей, которые проходили за несколько минут и без ошибок.
Просто мы это уже видели, пробовали повторить и знаем, как оно работает. Когда-то я мог закопаться в том листе, а в анкете не поставить ни одного ответа.

Далее предстоит научиться писать грязный неуклюжий код

Что писать? Повторять примеры из книг, статей, видео-курсов.

Нужно выработать в себе 2 чувства: скептическое отношение к мнению автора и острое желание повторить. Не доверять автору, мысленно спорить, смотреть на его примеры с ехидной такой ухмылочкой: «Да ну? Врёшь ведь!». И проверять на практике все предлагаемые куски кода. Шаг в сторону поощряется. За прыжки дают медаль «За отвагу». Ты представь, что автор тебе пудрит мозг, а ты должен вывести его на чистую воду. Ну просто детектив, а не программирование!

Более того, лично у меня возникло стойкое убеждение, что несмотря на второй, третий, десятый выпуск книги, там ошибки в программном коде (это называется листинг) не исправляются. Читаешь и видишь — код делает одно, а судя по его описанию должно быть другое. И, я предполагаю, что делается это намеренно.

Ещё больше ошибок в пиратских электронных версиях книг, отсканированных и распознанных с помощью программ OCR. Количество ошибок там невероятно большое.

И, наконец, надо писать свои программы. Ну и пусть такие же точно программы уже написали 100 000 других программистов. Ну и пусть в твоей программе неуклюжая логика. Ну и пусть по 1500 строк в одном файле или по одной строке в 1500 файлах. Ну и пусть там всё написано строго поперёк каких-то там «Правил хорошего кода», принципов S.O.L.I.D., D.R.Y и K.I.S.S, о которых твердят книги и вторят на habrahabr и в других интернетах. Пусть там будет большое количеством жёстко прописанной логики. Путь там не будет комментариев. Пусть всё это работает без файлов конфигурации. Пусть любая тупая мартышка может взломать твою систему.

У каждого был и будет свой «велосипед», «говнокод» и «костыли». Даже профи такое пишут, причём прямо сейчас, потому что им некогда писать правильно, потому что надо программу на один раз или потому что им просто лень.

Когда я познакомился с веб, JavaScript был прост и неуклюж. Никто не заморачивался областью видимости, замыканиями, объектами, классами. Тогда актуальным было обсуждать, стоит ли делать навигацию с помощью выпадающего списка (хотя актуально и сейчас):

Не более сложной была анимация смены изображения:


Green Black

И именно эта примитивность очень легко запоминалась, потому что легко понять и запомнить функцию из 4-5 строк.

На чём ещё тренироваться?

var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello, World!\n"); }).listen(8080); console.log("Server started");

Для его запуска тоже нужен дистрибутив NodeJS. Затем можно выполнить файл с указанным скриптом и открыть в браузере страницу http://127.0.0.1:8080/

Начинать с букваря

Новичку супер книги не нужны . Нужны мини-книжки, серии «%что-то% для чайников», «%язык% за 21 день». Учитель начальных классов подтвердит: процесс обучения начинается с алфавита и счётных палочек. И под каждого школьника свой алфавит не изобретают, не практично это — все учатся по одинаковым букварям, только издательство разное и год выпуска, а принцип одинаковый.

Математику начинают не с дифференциальных уравнений, а с арифметики на счётных палочках. Потом сложение/вычитание, умножение/деление, скорость, время, расстояние, дроби и так далее. К дифурам дело подойдёт постепенно.

Спроси у преподавателя английского языка, будут ли его курсанты на первом уроке писать статью на первую полосу New York Times на чистейшем английском? Он скажет: нет, мы будем учить алфавит, учить слова и формы глаголов, переводить тексты туда-сюда, писать сочинения, делать устные доклады, общаться в группе между собой, слушать голос с аудио-диска, смотреть видео-ролики, выполнять контрольные письменные и устные работы. До статей в газету дело дойдёт не скоро.

В отличие от них, я — профессиональный веб-архитектор, а не педагог, и то, чему учили их в педуниверситете, до меня дошло опытным путём при работе по программам менторской поддержки .

В целом, конечно, умные книги принесут пользу, но начинать надо не с них.

Самая простая, самая типичная задача для новичков, чтобы «потрогать» язык — вывести «Hello, World!». Вот примеры кода «Hello, World!» на 500+ языках программирования (зеркало на случай, если этот сервер упал: http://www.roesler-ac.de/wolfram/hello.htm).
Или вот ещё песенка 99 бутылок пива на 600+ языках программирования .
Или вот один (условно) язык программирования и 34 варианта одной и той же задачи «поиск самых популярных слов в тексте «.

Без метафор

Если откинуть все метафоры про буквари, то начитать надо с обзорных статей и видео-уроков, чтобы для себя понять — нравится или нет. Это касается как языков программирования, так и технологий в целом.

Есть так называемые тесты для профессиональной ориентации, они позволяют определить личные предпочтения и на основе этого сделать прогноз о будущей профессии. Потрать время, оцени заранее — будет ли интересно. Когда-то очень давно аналогичный тест показал мне, что специальности, связанные с логикой и знаковыми системами будет мне наиболее подходящими, а именно юриспруденция, экономика и информационные технологии. В итоге сейчас я веб-архитектор с опытом разработки в областях, связанных с экономикой и правом (биллинговая система для управляющих компаний, расчёты по IP-телефонии, электронным деньгам, учёту и прогнозу экономии энергоресурсов). Меня прогнозы не обманули. Вот несколько сайтов с анкетами: один , два, три .

Далее — простая книга «для чайников», чтобы узнать термины, синтаксис, основы и, опять же, понять — нравится или нет. Не стесняйтесь названий «для чайников» или «для нубов». Нуб — это заимствованное слово «newby» (англ. новичок). «Чайник» — в англ. «dummy» — это лишь сленговое словечко, установившийся разговорный термин, означающий «дилетант» или «не специалист».

Затем много практики. Много, много, много практики. Она измеряется сотнями или даже тысячами часов, хотя, конечно, что-то будет работать и с первого дня. Это месяцы и годы, и бояться их не стоит. Если понравится, то это будут месяцы и годы занятий интересным делом, которое приносит удовольствие и, что уж говорить, довольно высокий доход .

Если ты думаешь, что я несу околесицу, ведь на каком-нибудь Codecademy с первых минут новички уже пишут программы, то я скажу, что тестовое окружение в таких системах — это идеальная среда исполнения, изолированная от реальности, оставляющая за рамками курса 90% внешних факторов, например, различие версий интерпретаторов и компиляторов. Там решение даже подсказывается и вместо того, чтобы посмотреть справочник по языку, можно просто нажать кнопку помощи и скопировать оттуда полностью рабочий код. А также отмечу, что в большинстве областей прикладного программирования (то есть те, где программирование реально решает какие-то практические проблемы) знание синтаксиса языка — это только базовый навык и ещё много всякого, весьма интересного лежит глубже, чем умение записывать мысли в форме команд. Аналогично, в некоторых областях математики умение решать дифференциальные уравнения является знанием уровня алфавита, то есть ничего. Аналогично, умение свободно говорить и писать на иностранном языке — это всёго лишь владение языком как инструментом, что никак не связанно с тем, что и как именно человек будет писать, пользуясь этим языком.

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

Последние материалы раздела:

Интересные факты о физике
Интересные факты о физике

Какая наука богата на интересные факты? Физика! 7 класс - это время, когда школьники начинают изучать её. Чтобы серьезный предмет не казался таким...

Дмитрий конюхов путешественник биография
Дмитрий конюхов путешественник биография

Личное дело Федор Филиппович Конюхов (64 года) родился на берегу Азовского моря в селе Чкалово Запорожской области Украины. Его родители были...

Ход войны Русско японская 1904 1905 карта военных действий
Ход войны Русско японская 1904 1905 карта военных действий

Одним из крупнейших военных конфликтов начала XX века является русско-японская война 1904-1905 гг. Ее результатом была первая, в новейшей истории,...