Как проектировать программы книга

от admin

Книги о проектировании и разработке программного обеспечения

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

Джейсон Мак-Колм Смит Элементарные шаблоны проектирования : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2013. — 304 с.

Книга Мак-Колма более похожа на научный труд, чем на учебник, однако, является достаточно интересной и полезной. В первую очередь рассматриваются элементарные шаблоны — такие, как делегирование, наследование, рекурсия. Затем, показывает как из элементарных шаблонов построить более сложные — при этом шаблоны рассматриваются крайне подробно. Достаточно полезной показалась система обозначений PIN (Pattern Instance Notation), разработанная автором в качестве расширения UML. PIN используется на протяжении всей книги, т.к. позволяет элегантно отображать зависимости между паттернами, не вникая в детали их реализации. В конце приводится описание \(\rho\)-исчисления, являющегося формальной теорией, лежащей в основе шаблонов проектирования. Я рекомендую посмотреть книгу всем программистам, которые этого еще не сделали — будет интересно.

Влиссидес Джон. Применение шаблонов проектирования. Дополнительные штрихи. : Пер. англ. М.: Издательский дом Влиссидес Джон. Применение шаблонов проектирования. Дополнительные штрихи. : Пер. англ. М.: Издательский дом «Вильямс

Хорошее дополнение к книге Гаммы и Хелма с несколько другим способом изложения и местами более интересными примерами. Начинается книга с заблуждений о шаблонах — далеко не все, особенно студенты, понимают как ими пользоваться. По ходу книги автор ставит перед читателем ряд проблем и всякий раз выполняет поиск подходящих шаблонов проектирования, при этом приводится даже некоторый алгоритм выполнения такого поиска. Первым примером книги является проектирование файловой системы (с сущностями «Файл», «Каталог», «Ярлык»), на нем рассматриваются паттерны Composite, Proxy (для реализации «Ярлыка» файла — этот пример сильно отличается от того, что приведено в GoF), Visitor (тоже очень удачное применение) и Template Method (в контексте рефакторинга и инверсного управления). Затем, в пример добавляется владелец файла, но пользователей нужно создавать, а еще они объединяются в группы. На примере системы управления пользователями рассматриваются шаблоны Singleton и Mediator (для связи пользователей с группой «многие ко многим»). В конце второй главы приводится хорошая диаграмма «pattern: role annotation». В третьей главе рассматриваются тонкости и проблемы реализации шаблонов — начинаются с Singleton-а (проблема с зависимостями между несколькими Одиночками, параллельным программированием и освобождением памяти из под них). Затем также рассматривается Observer и Visitor (на мой взгляд, выбран слишком примитивный пример с построением графического интерфейса из двух полей ввода и кнопкой). В конце главы описывается «нестандартный» шаблон Generaton Gap — лично я про него читал впервые, применить вы его сможете лишь в тех случаях если ваша система генерирует исходный код программ, рассматривается он на примере генератора пользовательского интерфейса (типа Qt Designer), но отмечается что нечто подобное используется в YACC. Цель паттерна Generaton Gap — убрать зависимость между сгенерированным системой кодом и тем, что дописывает потом вручную пользователь, для этого предлагается, казалось бы очевидное решение — генерируемый код помещается в базовый класс, который пользователь может наследовать для увеличения функциональности (хотя я бы рассмотрел также вариант с композицией). Последним примером книги является система обработки событий (Event), при этом ставится проблема — типов событий много, но, получив событие, мы не хотим выполнять кучу dynamic_cast для установления его типа. На этом примере описаны шаблоны Mulicast и Typed Message — лично мне это показалось бесполезным. В конце книги приводится рекомендации по разработке шаблонов проектирования (семь правил, которые помогут вам придумать новый шаблон) — я бы назвал это правилами по изучению шаблонов (советую прочитать). В целом, хорошая книга, но с плохим переводом (очень много явных ляпов) и местами устаревшая (т.к. примеры написаны на С++, который развивался и сильно изменился, а книга старая) — например не совсем правильно подмечены недостатки Singleton-а Маерса и описан неактуальный подход с Double-Clecked Locking (хотя для истории и кругозора может пригодится).

Тепляков С. В. Паттерны проектирования на платформе .NET Тепляков С. В. Паттерны проектирования на платформе .NET – СПб.: Питер, 2015. – 320 с.

Замечательная книга от разработчика компании Microsoft и известного в узких кругах блогера (до выпуска книги Сергей много писал на тему паттернов проектирования на своем сайте). Не смотря на то, что в названии фигурирует .NET, книга будет полезна всем без исключения разработчикам (в книге Гаммы тоже приводятся примеры на Smalltalk, но это не мешает ей быть классикой). Главы книги можно читать в любом порядке, т.к. они не связаны друг с другом — как и в книге Гаммы разделение по главам осуществляется на основе типов паттернов (паттерны поведения, порождающие паттерны, структурные паттерны), кроме того, есть глава посвященная принципам SOLID. Рассматриваются вопросы unit-тестирования в контексте применения шаблонов проектирования.

UML и объектно-ориентированный анализ

ooad Буч Градди Объектно-ориентированный анализ и проектирование с примерами приложений, 3-е изд. / Буч Градди, Максимчук Роберт А., Энгл Майкл У., Янг Бобби Дж., Коналлен Джим, Хьюстон Келли А.: Пер с англ. — М.: ООО «И.Д. Вильямс», 2010. — 720 с.

Классическая книга по программированию от очень авторитетного автора. В книге есть множество интересных и важных для программиста вещей, но они обильно разбавлены рассуждениями на отвлеченные темы и, на мой взгляд, очень неудачными примерами про теплицы. Во второй вам расскажут про общие принципы ООП; в третьей главе — дополнят некоторыми обозначениями UML и интересным разделом про качество классов и объектов; в четвертой — рассматриваются различные подходы к классификации и уточнению абстракций. Пятая глава книги содержит описание 13 видов UML диаграмм, но на мой взгляд Буч выбрал не самые лучшие примеры и недостаточно времени уделил описанию назначения этих диаграмм. Шестая глава содержит описание процесса разработки программного обеспечения, при этом выделяются макропроцесс (жизненный цикл проекта) и микропроцесс (проектирование) — для них описываются стадии с видами деятельности на каждой из них. Седьмая глава завершает изложение очень коротким описанием организационных вопросов. Вторую половину книги составляют примеры приложений (можно посмотреть в каком порядке Буч предлагает их проектировать и какие виды диаграмм использовать).
Все главы кроме пятой очень обзорные — в них нет смысла вчитываться, по этим темам написаны отдельные толстые книги. Например, про качество ПО в нескольких книгах рассуждает Роберт Мартин, а про проектирование ПО (микропроцесс) написал отдельную книгу Розенберг — при этом он использует другой подход (ICONIX). Очень часто долгие рассуждения Буча касаются очевидных вещей и как бы вы не вчитывались — не получится узнать что-то новое, поэтому я считаю, что книгу достаточно бегло просмотреть. Наиболее полезные, на мой взгляд, части книги:

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

Книга посвящена разработке программного обеспечения в соответствии с процессом ICONIX, поэтому несмотря на то, что в названии фигурирует UML — рассматриваются всего 4 вида диаграмм (прецедентов, пригодности, последовательности и классов). Диаграмма пригодности не описана во многих других книгах по UML, т.к. в стандарте UML она описана в дополнении. В книге не только описываются сами диаграммы, но и процесс разработки ICONIX, который является итеративным, что оказывает влияние на процесс построения диаграмм. Каждому виду диаграммы посвящена отдельная глава, в конце которой приводится топ 10 ошибок — это тоже очень полезная и интересная часть. Книга в 7 раз тоньше произведения Буча, а полезной информации, на мой взгляд, в ней больше.

Буч Г., Рамбо Д., Джекобсон А. Язык UML Руководство пользователя - С-П.: Издательство «Питер», 2010 - 432 с. Буч Г., Рамбо Д., Джекобсон А. Язык UML Руководство пользователя — С-П.: Издательство «Питер», 2010 — 432 с.

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

Практически каждый программист слышал словосочетание Rational Rose, но обычно плохо себе представляет что это такое. Мало того, традиционна следующая ситуация: программист что-то услышал о программном продукте, с радостью его установил себе на компьютер (давайте не будем уточнять, как он достал себе копию), запустил программу… а она оказалась совсем не похожей на WinWord. Т.е., как нарисовать стрелку ясно, а что за ней стоит и как это потом использовать — непонятно.

Надо сказать, что использование CASE продуктов подразумевает наличие хотя бы базовых знаний об используемой технологии. Я сомневаюсь, что человек, основываясь на одном лишь здравом смысле, сможет понять зачем нужна Rational Rose. По крайней мере потому, что там используется специфическая терминология для выбранной нотации.

Так вот, эта книга, является одной из трех книг, написанных создателями UML. Это полное изложение UML, позволяющее читателю изучить его и приступить к практическому использованию. В книге не рассматриваются принципы объектно-ориентированного анализа, поэтому от читателя потребуется знакомство с ним (например, по соседней книге Буча).

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

Итог:
Книга, несомненно, достойна того, что бы ее прочитали хотя бы для ознакомления с нотацией. Она не является основополагающей, как «Объектно-ориентированный анализ и проектирование» Гради Буча, но все равно достаточно интересна.

Чистый код и рефакторинг

martin-fine-code Мартин Р. Чистый код. Создание, анализ и рефакторинг. Библиотека программиста. — СПб.: Питер, 2014. — 464 с.

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

fauler-refactoring Фаулер М. Рефакторинг. Улучшение существующего кода/ М. Фаулер. Символ-Плюс, 2008. 432 с.
bug_patterns_allen Аллен Э. Типичные ошибки проектирования / Э.Аллен: Пер. с англ. – СПб.: Питер, 2003. – 224 с.

Книги Мартина Фаулера и Эрика Аллена посвящены чистому коду и рефакторингу, но в отличии от книги Боба Мартина, в них делается попытка каталогизации видов рефакторинга (у Фаулера) или ошибок (у Аллена). Если вы разрабатывали что-то чуть-чуть сложнее тетриса — то книги читаются быстро т.к., значительная часть материала вам и так знакома. Книги стоит пролистать, бегло найти интересные моменты и посмотреть их более детально. Покупать их не стоит (я взял на работе почитать), вряд-ли вы будете это перечитывать. С другой стороны, знакомый тимлид требует от работников при рефакторинге указывать конкретный вид (название берется из каталога вот этой книги) в комментарии к коммиту в репозитории. Из книги Аллена мне больше всего понравились главы 2, 3 и 22 — в них можно кое-что узнать об экстремальном программировании, спецификации и тестировании, а также прочитать краткое (но достаточное) описание «паттернов проектирования для отладки». Советую читать именно эти главы.

Другое

Pro_git Чакон Скотт, Страуб Бен Git для профессионального программиста. — СПб.: Питер, 2016. — 496 с.: ил.

В книге автор рассказывает про систему контроля версий «git», при этом делает это не поверхностно (как многочисленные статьи в интернете), а очень подробно. Главы выстроены таким образом, чтобы читатель сразу мог начать пробовать некоторые команды git, а затем узнавать про различные варианты их использования. Очень помогает читать обилие иллюстраций к примерам. Книга настолько полно описывает git, что после нее по этой теме можно читать только stack overflow (какие-то конкретные вопросы все равно будут возникать), но вы будете уметь работать в команде, использующей git, выбирать оптимальный вариант использования git для своей команды, настраивать git на сервере и т.д.

С. Бобровский Технологии Пентагона на службе российских программистов. Программная инженерия. - СПб.: Питер, 2003. - 222 с.: ил. С. Бобровский Технологии Пентагона на службе российских программистов. Программная инженерия. — СПб.: Питер, 2003. — 222 с.: ил.

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

  1. Очень коротко описываются подходы, позволяющие повысить качество продукта (в т.ч. сократить число ошибок): гибкие практики (Agile), развитие качеств программиста — профессиональные и личностные качества, особое внимание уделяется обучению и мотивации.
  2. Описание истории развития языков программирования. Акцент делается на влияние на этот процесс спец. служб в 20 веке. Кроме того, много написано о том, что большая база кода на устаревших языках мешает забыть о них и, следовательно, препятствует развитию более совершенных языков.
  3. Очень коротко описываются подходы к управлению процессом разработки ПО — такие как C/SCSC и CMM. В частности это процессы управления рисками (превышения бюджета проекта или сроков). Из главы можно узнать о сути предлагаемого подхода их достоинствах и недостатках. Чтобы использовать методики информации недостаточно, к сожалению в книге нет ссылок на литературу, где эту информацию можно получить.
  4. Описаны 2 японских проекта связанных с разработкой систем параллельной обработки данных. Более подробного описания проекта ЭВМ 5 поколения на русском языке я не встречал.

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

Брукс, Ф. Мифический человеко-месяц или как создаются программные системы / Ф. Брукс. - М.: СПб: Символ-Плюс, 2016. - 304 c. Брукс, Ф. Мифический человеко-месяц или как создаются программные системы / Ф. Брукс. — М.: СПб: Символ-Плюс, 2016. — 304 c.

Эта книга не о программировании на конкретном языке. В ней очень ясным, живым языком рассказывается о тех выводах, к которым пришел автор в процессе руководства работы над операционной системой OS/360. Некоторые моменты, конечно же, устарели; например, проблема машинного времени уже не стоит в таком остром ракурсе перед программистами (во всяком случае, в большинстве проектов). Тем не менее, общие рекомендации по обеспечению работы большой группы программистов очень сложно переоценить. Например, вы можете сразу же ответить, что лучше: тысяча посредственных программистов, сто хорошиих или десять гениев? Имеется в виду, для реализации очень крупного проекта в разумное время. Я не говорю о том, что в книге есть ответ на этот вопрос — в книге есть очень полезные мысли на эту тему, которые пригодятся вам при начале работы и наборе сотрудников.

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

От первого издания отличается тем, что в него добавлена статья «Серебряной пули нет», в которой Брукс двадцать лет назад предупреждал о том, что в течение этих лет в программировании ничего революционного не произойдет и статьей, которая была написана специально для второго издания. Эта статья посвящена актуальным аспектам проектирования и ответу на вопрос о том, почему же «Мифический человеко-месяц» до сих пор остался современным.

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

С. Макконнелл Сколько стоит программный проект – СПб.: Питер – 2007

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

Помимо понимания зачем все это, что у нас есть и какой смысл это несет, самое главное что я вынес из книги для себя — это то что не нужно оценивать срок как таковой, пытаться угадать дату, нужно оценивать промежуток внутри которого наиболее вероятно завершение задачи, т.е. гораздо лучше что-то типа «с вероятностью 90% это сделаю от 1 недели до 5 месяцев», значит быстрее ну явно никак, только пистолет к виску приставить, и дольше будет только если случится что-то из ряда вон. Мы здесь ставим рамки проекта. Ну и по мере анализа, разработки и пр. можно давать более точную оценку, сужая этот промежуток, и в идеале реальный срок и эта оценка должны сойтись. Я конечно очень поверхностно идею передал, нужно понимать все тонкости и их тоже много, но суть примерно такая. Ну а вообще там много других оцень полезных мыслей, это лишь пример.

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

Как проектировать программы

Как проектировать программы

Название: Как проектировать программы. Введение в программирование и компьютерные вычисления
Авторы: Фелляйзен М. и др.
Год: 2022
Издательство: ДМК Пресс
Язык: русский
Формат: pdf
Страниц: 724
Размер: 10.1 Мб

В фокусе книги – общие принципы проектирования программ, поэтому используется не стандартный промышленный язык, а специализированный язык обучения Racket, а также среда программирования DrRacket, которая обеспечивает увлекательное обучение. Возможности среды растут по мере того, как читатель осваивает материал, – вплоть до поддержки полноценного языка, пригодного для решения всего спектра задач программирования.

Скачать Фелляйзен М. и др. Как проектировать программы. Введение в программирование и компьютерные вычисления

Топ-25 самых рекомендуемых книг по программированию

В интернете полно списков «Лучших книг по программированию за всё время» и многие из них советуют разные (не всегда хорошие) книги. Один программист решил узнать, какие книги рекомендуют чаще всего. Для этого он взял все эти списки, проанализировал их и выложил свою мета-подборку из 25 книг. Делимся ей с вами.

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

Немного о методологии

Автор загуглил что-то вроде «лучшие книги по программированию» и собрал найденные ссылки. После удаления дубликатов осталось 150 штук. По заголовкам страниц автор также сразу отбросил списки книг:

  • связанные с конкретной технологией/платформой;
  • привязанные к конкретному году;
  • состоящие только из бесплатных книг;
  • а также треды с Quora и Reddit.

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

Примечание Более подробное описание с примерами кода можно найти в оригинале статьи.

25 место

Обложка книги ««Continuous Delivery», Jez Humble & David Farley»

«Continuous Delivery», Jez Humble & David Farley

Getting software released to users is often a painful, risky, and time-consuming process. This groundbreaking new book sets out the principles and technical practices that enable rapid, incremental delivery of high quality, valuable new functionality to users. Through automation of the build, deployment, and testing process, and improved collaboration between developers, testers, and operations, delivery teams can get changes released in a matter of hours— sometimes even minutes–no matter what the size of a project or the complexity of its code base.

Jez Humble and David Farley begin by presenting the foundations of a rapid, reliable, low-risk delivery process. Next, they introduce the «deployment pipeline,» an automated process for managing all changes, from check-in to release. Finally, they discuss the «ecosystem» needed to support continuous delivery, from infrastructure, data and configuration management to governance.

24 место

Обложка книги ««Алгоритмы на Java», Роберт Седжвик, Кевин Уэйн»

«Алгоритмы на Java», Роберт Седжвик, Кевин Уэйн

Книга Седжвика и Уэйна «Алгоритмы на Java» является классическим справочным руководством в котором содержится необходимый объём знаний для программиста в области алгоритмов, накопленных за последние несколько десятилетий

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

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

23 место

Обложка книги ««Сам себе программист. Как научиться программировать и устроиться в Ebay?», Кори Альтхофф»

«Сам себе программист. Как научиться программировать и устроиться в Ebay?», Кори Альтхофф

Автор книги всего за год научился программировать, что само по себе немало. Однако Кори Альтхофф пошёл дальше, и научившись программировать, он устроился разработчиком в одну из самых серьёзных современных IT компаний — Ebay. Как ему удалось? Читайте эту книгу, изучайте программирование на языке Python по уникальной авторской методике — вам это тоже по силам!

22 место

Обложка книги ««Rapid Development», Steve McConnell»

«Rapid Development», Steve McConnell

Corporate and commercial software-development teams all want solutions for one important problem — how to get their high-pressure development schedules under control. In «Rapid Development», author Steve McConnell addresses that concern head-on with overall strategies, specific best practices, and valuable tips that help shrink and control development schedules and keep projects moving. Inside, you’ll find:

  • A rapid-development strategy that can be applied to any project and the best practices to make that strategy work;
  • Candid discussions of great and not-so-great rapid-development practices — estimation, prototyping, forced overtime, motivation, teamwork, rapid-development languages, risk management, and many others;
  • A list of classic mistakes to avoid for rapid-development projects, including creeping requirements, shortchanged quality, and silver-bullet syndrome;
  • Case studies that vividly illustrate what can go wrong, what can go right, and how to tell which direction your project is going;
  • Rapid Development is the real-world guide to more efficient applications development.

21 место

Обложка книги ««Кодеры за работой. Размышления о ремесле программиста», Питер Сейбел»

«Кодеры за работой. Размышления о ремесле программиста», Питер Сейбел

Программисты — люди не очень публичные, многие работают поодиночке или в небольших группах. Причем самая важная и интересная часть их работы никому не видна, потому что происходит у них в голове. Питер Сейбел, писатель-программист, снимает покров таинственности с этой профессии. Он взял интервью у 15 величайших профессионалов: Кена Томпсона, создателя UNIX, Берни Козелла, участника первой реализации сети ARPANET, Дональда Кнута, Гая Стила, Джейми Завински, Саймона Пейтон-Джонса, Питера Норвига, Дугласа Крокфорда, Джошуа Блоха, Брендана Айка, Джо Армстронга, Брэда Фицпатрика, создателя Живого Журнала, и других.

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

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

20 место

Обложка книги ««Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем», Эрик Эванс»

«Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем», Эрик Эванс

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

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

19 место

Обложка книги ««Искусство программирования», Дональд Кнут»

«Искусство программирования», Дональд Кнут

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

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

18 место

Обложка книги ««Структура и Интерпретация Компьютерных Программ», Абельсон Харольд, Сассман Джеральд Джей<br /> »

«Структура и Интерпретация Компьютерных Программ», Абельсон Харольд, Сассман Джеральд Джей

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

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

17 место

Обложка книги ««Шаблоны корпоративных приложений», Мартин Фаулер»

«Шаблоны корпоративных приложений», Мартин Фаулер

Создание компьютерных систем — дело далеко не простое. По мере того как возрастает их сложность, процессы конструирования соответствующего программного обеспечения становятся всё более трудоёмкими, причем затраты труда растут экспоненциально. Как и в любой профессии, прогресс в программировании достигается исключительно путём обучения, причем не только на ошибках, но и на удачах — как своих, так и чужих. Книга даёт ответы на трудные вопросы, с которыми приходится сталкиваться всем разработчикам корпоративных систем. Автор, известный специалист в области объектно-ориентированного программирования, заметил, что с развитием технологий базовые принципы проектирования и решения общих проблем остаются неизменными, и выделил более 40 наиболее употребительных подходов, оформив их в виде типовых решений. Результат перед вами — незаменимое руководство по архитектуре программных систем для любой корпоративной платформы. Это своеобразное учебное пособие поможет вам не только усвоить информацию, но и передать полученные знания окружающим значительно быстрее и эффективнее, чем это удавалось автору.

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

16 место

Обложка книги ««Жемчужины программирования», Джон Бентли»

«Жемчужины программирования», Джон Бентли

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

15 место

Обложка книги ««Человеческий фактор. Успешные проекты и команды», Том Демарко, Тимоти Листер»

«Человеческий фактор. Успешные проекты и команды», Том Демарко, Тимоти Листер

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

Читать:
Почему не работает камера на ноутбуке msi

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

14 место

Обложка книги ««Алгоритмы. Построение и анализ», Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн»

«Алгоритмы. Построение и анализ», Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн

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

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

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

13 место

Обложка книги ««Код. Тайный язык информатики», Чарльз Петцольд»

«Код. Тайный язык информатики», Чарльз Петцольд

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

Написанная живо, доступно, иногда иронично, книга богато иллюстрирована, состоит из 25 глав и предметного указателя.

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

12 место

Обложка книги ««Не заставляйте меня думать. Веб-юзабилити и здравый смысл», Стив Круг»

«Не заставляйте меня думать. Веб-юзабилити и здравый смысл», Стив Круг

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

11 место

Обложка книги ««Путь программиста», Джон Сонмез»

«Путь программиста», Джон Сонмез

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

10 место

Обложка книги ««Карьера программиста», Г. Лакман Макдауэлл»

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

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

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

9 место

Обложка книги ««Приемы объектно-ориентированного проектирования. Паттерны проектирования», Эрих Гамма, Джон Влисидис, Ричард Хелм, Ральф Джонсон»

«Приемы объектно-ориентированного проектирования. Паттерны проектирования», Эрих Гамма, Джон Влисидис, Ричард Хелм, Ральф Джонсон

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

Издание предназначено как для профессиональных разработчиков, так и для программистов, осваивающих объектно-ориентированное проектирование.

8 место

Обложка книги ««Эффективная работа с унаследованным кодом», Майкл Физерс»

«Эффективная работа с унаследованным кодом», Майкл Физерс

Учитесь извлекать максимум пользы из унаследованных систем, повышая их производительность, функциональность, надежность и сопровождаемость!

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

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

В этой книге освещаются следующие вопросы:

  • Представление о механизмах внесения изменений в программное обеспечение, включая ввод новых свойств, устранение программных ошибок, улучшение структуры кода, оптимизацию производительности.
  • Перенос унаследованного кода в средства тестирования.
  • Написание тестов, препятствующих внесению новых ошибок в код.
  • Применение методов, подходящих для любого языка или платформы, с примерами кода на Java, C++, C и C#.
  • Точное выявление мест в коде, где требуется внести изменения.
  • Работа с унаследованным кодом, который не является объектно-ориентированным.
  • Обращение с приложениями, у которых, на первый взгляд, нет вообще никакой структуры.

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

7 место

Обложка книги ««Идеальный программист. Как стать профессионалом разработки ПО», Роберт Мартин»

«Идеальный программист. Как стать профессионалом разработки ПО», Роберт Мартин

Всех программистов, которые добиваются успеха в мире разработки ПО, отличает один общий признак: они больше всего заботятся о качестве создаваемого программного обеспечения. Это — основа для них. Потому что они являются профессионалами своего дела. В этой книге легендарный эксперт Роберт Мартин (более известный в сообществе как «Дядюшка Боб»), рассказывает о том, что значит «быть профессиональным программистом», описывая методы, инструменты и практики разработки «идеального ПО». Книга насыщена практическими советами в отношении всех аспектов программирования: от оценки проекта и написания кода до рефакторинга и тестирования. Эта книга — больше, чем описание методов, она о профессиональном подходе к процессу разработки.

6 место

Обложка книги ««Мифический человеко-месяц», Фредерик Брукс»

«Мифический человеко-месяц», Фредерик Брукс

Эта книга об управлении проектами в области разработки программного обеспечения.

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

5 место

Обложка книги ««Head First. Паттерны проектирования», Эрик Фримен, Элизабет Робсон»

«Head First. Паттерны проектирования», Эрик Фримен, Элизабет Робсон

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

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

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

Особенностью данного издания является уникальный способ подачи материала, выделяющий серию «Head First» издательства O’Reilly в ряду множества скучных книг, посвященных программированию. Книга будет интересна широкому кругу веб-разработчиков, от начинающих до профессионалов, желающих освоить работу с паттернами проектирования.

4 место

Обложка книги ««Рефакторинг. Улучшение существующего кода», Мартин Фаулер»

«Рефакторинг. Улучшение существующего кода», Мартин Фаулер

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

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

3 место

Обложка книги ««Совершенный код. Мастер-класс», Стив Макконнелл»

«Совершенный код. Мастер-класс», Стив Макконнелл

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

2 место

Обложка книги ««Чистый код. Создание, анализ и рефакторинг», Роберт Мартин»

«Чистый код. Создание, анализ и рефакторинг», Роберт Мартин

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

Эта книга посвящена хорошему программированию. Она полна реальных примеров кода. Мы будем рассматривать код с различных направлений: сверху вниз, снизу вверх и даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший.
Книга состоит из трёх частей. В первой части излагаются принципы, паттерны и приёмы написания чистого кода; приводится большой объём примеров кода. Вторая часть состоит из практических сценариев нарастающей сложности. Каждый сценарий представляет собой упражнение по чистке кода или преобразованию проблемного кода в код с меньшим количеством проблем. Третья часть книги — концентрированное выражение её сути. Она состоит из одной главы с перечнем эвристических правил и «запахов кода», собранных во время анализа. Эта часть представляет собой базу знаний, описывающую наш путь мышления в процессе чтения, написания и чистки кода.

1 место

Обложка книги ««Программист-прагматик. Путь от подмастерья к мастеру», Дейв Томас, Энди Хант»

«Программист-прагматик. Путь от подмастерья к мастеру», Дейв Томас, Энди Хант

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

Как прокачаться в проектировании программного обеспечения — список книг

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

Сами книги я условно поделил на 3 категории, которые больше сфокусированы на отдельных вопросах

  • что делаем
  • как делаем
  • как эксплуатируем

И начнем мы с вопроса

Что делаем

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

Domain-Driven Design: Tackling Complexity in the Heart of Software

Каноническая книга, в которой Эрик Эванс изложил концепцию Domain Driven Design. Про нее часто говорят, но гораздо реже ее начинают читать, а дочитывают до конца только избранные. Возможно, причина этого станет ясна, если посмотреть на рис.1, где представлена заглавная страница книги:)

What Is Domain-Driven Design?

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

Как делаем

Fundamentals of Software Architecture

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

  1. Foundations
  2. Architecture Styles
  3. Techniques and Soft Skills

и раскрываются они хорошо. Подробности о книге можно прочитать в моем обзоре.

Building Evolutionary Architectures

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

  1. Software Architecture — про архитектуру в общем и эволюционную конкретно
  2. Fitness Functions — про подход с fitness function из генетических алгоритмов, которые позволяют отслеживать соответствие изменений системы архитектурным правилам и подходам
  3. Engineering Incremental Change — про то, как обеспечивать инкрементальность изменений
  4. Architectural Coupling — про модульность, гранулярность и типы архитектур. Эта часть гораздо подробнее изложена в первых двух частях книги Fundamentals of Software Architecture
  5. Evolutionary Data — глава про эволюцию данных, эволюционирование схем и как быть если ваши системы интегрированы через антипаттерн Shared Database Integration
  6. Building Evolvable Architectures — конкретные подходы для построения эволюционных архитектур, как с гринфилда, так и для существующих систем
  7. Evolutionary Architecture Pitfalls and Antipatterns — про грабли, на которые можно наступить на этом пути
  8. Putting Evolutionary Architecture into Practice — глава про применение методов и подходов из предыдущих глав в реальном мире

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

Designing Data-Intensive Applications

Читал эту книгу в переводе от издательства “Питер”, которое перевело название книги как “Высоконагруженные приложения”. Заметим, что ни слова про высокую нагрузку по данным:) В остальном перевод вышел довольно хорошим.

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

Книга разбита на три части и 12 глав:

  1. Основы информационных систем
  2. Распределенные данные
  3. Производные данные

Первая часть является вводной и состоит из глав:

  • 1. Надежные, масштабируемые и удобные в сопровождении системы
  • 2. Модели данных и языки запросов — SQL, NoSQL, Map Reduce, Cypher и SparQL
  • 3. Подсистемы хранения и извлечения данных — SSTables, LSM, B-Tree, Звезды и снежинки, столбцовое хранение данных
  • 4. Кодирование и эволюция — json, xml, thrift, protobuf, avro. Миграции данных:)

Вторая часть включает в себя главы:

  • 5. Репликация — синхронная/асинхронная, master/slave, master/master, no-master
  • 6. Секционирование — типа ключ/значение, по диапазонам ключе, секционирование и репликация, секционирование и вторичные индексы, перебалансировка секций
  • 7. Транзакции — ACID/BASE, 2PL(two-phase locking), SSI (serializable snapshot isolation)
  • 8. Проблемы распределенных систем — сбои и отказы, ненадежные сети, ненадежные часы, знание/истина/ложь
  • 9. Согласованность и консенсус

Часть 3 состоит из глав:

  • 10. Пакетная обработка
  • 11. Потоковая обработка
  • 12. Будущее информационных систем

Книга просто превосходна для тех, кому приходится проектировать/разрабатывать системы, которые хранят/обрабатывают данные:)

Designing Distributed Systems

Автор книги является сооснователем kubernetes, поэтому его опыт в проектировании распределенных систем является довольно актуальным:) Книга мне показалось хорошей, но одновременно слишком простой. Но за счет этого она отлично подойдет новичкам вступающим на запутанную дорожку distributed systems:)

Книга состоит из 3х частей:

  • одноузловые паттерны проектирования
  • паттерны проектирования обслуживающих систем
  • паттерны проектирования систем пакетных вычислений

Все паттерны даются в контексте контейнеров и их оркестрации, книга содержит практические примеры, для реализации которых используется инсталляция kubernetes и его примитивы, такие как pods, deployments, services, etc. Ближе к концу книги вы попробуете использовать helm для разворачивания etcd, kafka и иже с ним.

В первой части рассматриваются паттерны:

  • sidecar: для https, динамической конфигурации и метрик
  • ambassador: для использования шардированного сервиса и для сплита трафика для тестирования разных версий
  • adapters: мониторинг, журналирование

Во второй части рассматриваются:

  • репликация: для stateless сервсиов, sticky sessions, кеширование, …
  • шардирование: консистентный хеш, шардирование реплицированных сервисов, …
  • scatter-gather: распределенный поиск по документам
  • FaaS и events: преимущества и недостатки FaaS, реализация декораторов на функциях
  • выбор владельца: локи для распределенных систем

В третьей части рассматриваются паттерны проектирования систем пакетных вычислений:

  • системы на основе очередей задач
  • событийно-ориентированная пакетная обработка
  • координированная пакетная обработка

Architecting for Scale, 2nd Edition

Читать лучше на английском, т.к. на русском первое издание этой книги назвали как “Масштабирование приложений. Выращивание сложных систем”. Выращивать можно на даче картошку:) А тут все вертится относительно правильной архитектуры приложений, которая позволяет масштабироваться, сохраняя высокую доступность. Кстати, есть еще проблема, что переводные русские термины не сопровождаются их английскими аналогами — это приводит к тому, что не всегда очевидно о чем рассказывает переводчик. Приходиться восстанавливать это знание из контекста перевода:) Если абстрагироваться от перевода и заглянуть в содержание книги, то автор раскрывает следующие мысли:

  • Доступность vs Надежность. Это не одно и то же, дальше в книге обсуждается только доступность
  • Способы улучшения доступности (учитывать отказы при проектировании и разработке, думать о масштабировании, управляйте рисками, контролируйте доступность, имейте план реагирования на проблемы)
  • Введение в управление рисками в контексте ИТ-систем (что это такое, критичность и вероятность риска, матрица рисков, смягчение рисков, …)
  • Сервисы и микросервисы — куда же без них в 2017 году:) Преимущества и недостатки сервисов. Обсуждение зависимостей между сервисами и к чему она приводит в плане доступности
  • Масштабирование приложений (запас на две ошибки, владение сервисами, классы сервисов и их использование, SLA, непрерывное улучшение)
  • Облака — еще одна “горячая” тема. Автор рассказывает про AWS, в проектировании и создании которого он участвовал до того, как перешел в NewRelic
  • Ну и напоследок заключение, в котором автор подбил summary под содержанием книги

Cloud Native

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

Patterns of Enterprise Application Architecture

Каноническая книга, которой в следующем году исполнится 20 лет. Я не мог здесь ее не упомянуть, но читать стоит с осторожностью, т.к. все эти паттерны из мира Java приложений, которые были на рубеже тысячелетий:)

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

Книге уже больше пятнадцати лет, а она до сих пор актуальна почти целиком. Забавно, что единственная устаревшая глава называется “Новые стандарты и перспективы интеграции корпоративных приложений”.

А если серьезно, то в самом начале книги (2 глава) дается отличный обзор разных стилей интеграции приложений:

  • передача файла (file transfer)
  • общая база данных (shared database)
  • удаленный вызов процедуры (remote procedure invocation)
  • обмен сообщениями (messaging)

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

Дальше (в главе 3) авторы рассказывают про составные части системы обмена сообщениями, а в следующих главах подробно рассматривают паттерны для каждой из частей, а именно

  • каналы обмена сообщениями
  • построение сообщений
  • маршрутизация сообщений
  • преобразование сообщений
  • конечные точки обмена сообщениями

В конце (глава 11) рассматриваются вопросы управления системой, которые очень полезно рассмотреть, чтобы не погрязнуть в непроработанных заранее вопросах тестирования и отладки системы. Приятно, что в системе есть 3 практикума, где рассматривается создание несложных систем, с использованием только что рассмотренных паттернов. Изюминкой является рассмотрение процесса проектирования реальной системы по торговле облигациями в главе 13 данной книги.

Очень рекомендую почитать книгу тем, кто планирует или реализует архитектуру с использованием микросервисов:) Знание этих паттернов позволит вам не наступать на грабли и не изобретать велосипеды.

Monolith to Microservices

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

В новой книге Сэм Ньюман рассматривает такие темы как:

  • что такое микросервис и какого размера он может быть — по bounded context’у
  • какой логикой пользоваться для декомпозиции вашего монолита на микросервисы — внезапно тут активно упоминается очередной трехбуквенный акроним DDD (Domain Driven Design)
  • всегда ли вам нужны микросервисы — логично, что нет:)
  • как не облажаться с миграцией с монолита на микросервисы
  • как распиливать монолитный код
  • как быть с источниками данных — аля пилим базу данных
  • какие боли у вас возникнут когда вместо одного рантаймящегося монолита у вас появится коллекция микросервисов, в которой сложность эксплуатации возрастает на порядки, если использовать те же подходы, что для эксплуатации монолита

Во всех упоминавшихся выше темах автор приводит логичные аргументы

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

First, give yourself enough space and gather the right information to make rational decisions. Don’t just copy others; think instead about your problem and your context, assess the options, and move forward, while being open to change if you need to later. Second, remember that incremental adoption of microservices, and many of the associated technologies and practices, is key

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

Building Microservices, 2nd Edition

Если говорить кратко, то книга объективно хороша. Автор рассматривает проектирование программного обеспечения от и до.

В книге на примерах демонстрируется какие преимущества есть у монолита (да, они тоже есть) и какие у микросервисов (а их гораздо больше).

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

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

На закуску рассматриваются вопросы масштабирования микросервисов.

В общем, читайте книгу и не пожалеете.

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

Как эксплуатируем

Release It!, 2nd Edition

Начинается все с введения, где автор рассказывает о том, что побудило написать эту книгу, дальше он переходит к первой части, в которой рассматривается такое понятие как стабильность:)

Часть посвященная стабильности состоит из глав, в которых рассказывается о

  • крахе системы покупки билетов на самолеты, причем информация подана в виде небольшой детективной истории:)
  • антипаттернах стабильности
  • паттернах стабильности

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

Site Reliability Engineering

Книга определенно мне понравилась, но есть нюанс …

Нюанс заключается в том, что название SRE в головах людей получило коннотацию Devops, что в принципе неплохо, но … у кого из знакомых разработчиков я не спрашивал читали ли они эту книгу, то получал ответ в стиле “Нет, это вроде что-то для devops’ов”

На самом деле книга определенно хороша и ряд глав стоит прочесть разработчикам в первую очередь. Структура книги довольно проста и состоит из 5 частей:

  • Введение
  • Принципы
  • Практики
  • Управление
  • Выводы

В введении кратко описывается содержание книги, а вот уже в принципах начинается интересное и рассматриваются вопросы, касающиеся:

  • менеджмента рисков (глава 3)
  • определения качества обслуживание сервиса aka SLO, SLA, SLI (глава 4)
  • избавления от рутины (глава 5)
  • мониторинга распределенных систем (глава 6)
  • технологий выпуска ПО (глава 8) — эту главу рекомендую разработчикам
  • простоты (глава 9) — эту главу рекомендую разработчикам

В части, касающейся практик, приводится порядка 20 глав, среди которых особо важны для разработчиков главы касающиеся:

  • тестирования надежности систем (глава 17)
  • балансировки нагрузки на уровне фронтенда (глава 19)
  • балансировки нагрузки в датацентрах (глава 20)
  • способах борьбы с перегрузками (глава 21)
  • способах борьбы с каскадными сбоями (глава 22)
  • разрешениях конфликтов в распределенных системах и достижения консенсуса (глава 23)
  • распределенный cron (глава 24)
  • конвейеры обработки данных (глава 25)
  • сохранность данных (глава 26)

В части про управление рассказано о некоторых вопросах менеджмента команд SRE. А в последней части, называющейся “Выводы” проводятся параллели между разработкой ПО в Google и разработкой mission critical систем в авиастроении, кораблестроении, атомной энергетике и т.д.

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

The Site Reliability Workbook

Данная книга является продолжением предыдущей и рассказывает о том, как внедрить SRE подходы в вашей компании:)

Kubernetes Patterns

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

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

  • Foundational patterns — ключевые принципы и практики для построения контейнерных cloud native приложений
  • Behavioral patterns — поведенческие паттерны, описывающие взаимодействия разных типов контейнеров и платформы
  • Structural patterns — структурные паттерны, помогающие организовать контейнеры внутри пода
  • Configuration patterns — паттерны конфигурации для настройки cloud native приложений в k8s
  • Advanced patterns — продвинутые паттерны, которые покрывают темы, которые позволяют расширять саму платформы при помощи операторов (operator).

Мой краткий обзор этой книги доступен по ссылке.

Итоги

Список крутых и полезных для проектирования книг не исчерпывается теми, что указанны выше. Но изучения книг из этого списка определенно достаточно, чтобы сильно прокачать свой уровень в архитектуре:) Все перечисленные книги доступны в плейлисте на обучающей платформе O’Reilly.

Похожие статьи