Опубликовано

Представляем книгу “Конвейеры данных. Карманный справочник”

Конвейеры данных. Карманный справочник

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

Для специалистов по обработке данных

Сбор и обработка данных для аналитики

Конвейеры данных — это фундамент успеха в анализе данных.

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

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

Дополнительные материалы (примеры кода, упражнения и т.д.) доступны для загрузки по адресу https://github.com/jamesdensmore/datapipelinesbook

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

Книгу “Конвейеры данных. Карманный справочник” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие……………………………………………………………….. 1

Для кого эта книга………………………………………………………………………………… 1

Условные обозначения, используемые в этой книге………………………….. 2

Скачивание примеров кода………………………………………………………………….. 3

Благодарности………………………………………………………………………………………. 4

Глава 1. Введение в конвейеры данных……………………… 5

Что такое конвейеры данных?…………………………………………………………….. 5

Кто строит конвейеры данных?…………………………………………………………… 6

Основы SQL и хранилища данных…………………………………………… 7

Python и/или Java………………………………………………………………………. 7

Распределенные вычисления……………………………………………………. 7

Основы системного администрирования………………………………… 8

Понимание общих целей…………………………………………………………… 8

Зачем создавать конвейеры данных?…………………………………………………. 8

Как строятся конвейеры?……………………………………………………………………… 9

Глава 2. Современная инфраструктура данных………… 11

Разнообразие источников данных…………………………………………………….. 12

Принадлежность исходной системы……………………………………… 12

Интерфейс сбора и структура данных………………………………….. 13

Объем данных………………………………………………………………………….. 15

Чистота и достоверность данных………………………………………….. 15

Задержка и пропускная способность исходной системы……. 17

Облачные хранилища данных и озера данных……………………………….. 17

Инструменты сбора данных………………………………………………………………. 18

Инструменты преобразования и моделирования данных………………. 19

Платформы для оркестровки рабочих процессов……………………………. 21

Направленные ациклические графы (DAG)………………………….. 22

Настройка вашей инфраструктуры данных…………………………………….. 23

Глава 3. Стандартные шаблоны конвейеров данных.. 25

Шаблоны ETL и ELT………………………………………………………………………….. 25

Преимущество ELT перед ETL………………………………………………………….. 27

Подшаблон EtLT…………………………………………………………………………………. 30

ELT в анализе данных………………………………………………………………………… 31

ELT в науке о данных…………………………………………………………………………. 32

ELT для информационных продуктов и машинного обучения………. 33

Этапы конвейера для машинного обучения…………………………. 33

Включение обратной связи в конвейер………………………………….. 35

Дополнительная литература по конвейерам
машинного обучения………………………………………………………………. 36

Глава 4. Сбор данных: начнем с извлечения…………….. 37

Настройка среды Python……………………………………………………………………. 38

Настройка облачного хранилища файлов………………………………………. 40

Извлечение данных из БД MySQL…………………………………………………….. 43

Полное или инкрементное извлечение таблицы MySQL……… 44

Репликация двоичного журнала данных MySQL…………………. 54

Извлечение данных из БД PostgreSQL………………………………………………. 64

Полное или инкрементное извлечение таблицы Postgres…….. 65

Репликация данных с использованием журнала упреждающих записей        67

Извлечение данных из MongoDB………………………………………………………. 68

Извлечение данных из REST API………………………………………………………. 74

Сбор потоковых данных с помощью Kafka и Debezium…………………. 79

Глава 5. Сбор данных: загрузка в хранилище…………… 83

Настройка хранилища Amazon Redshift в качестве места назначения        83

Загрузка данных в хранилище Redshift……………………………………………. 85

Инкрементные и полные загрузки……………………………………………………… 89

Загрузка данных, извлеченных из журнала CDC……………………………. 92

Настройка хранилища Snowflake в качестве пункта назначения…. 94

Загрузка данных в хранилище Snowflake………………………………………… 96

Использование вашего файлового хранилища в качестве
озера данных………………………………………………………………………………………. 98

Фреймворки с открытым исходным кодом……………………………………….. 99

Коммерческие альтернативы…………………………………………………………… 100

Глава 6. Преобразование данных……………………………. 103

Неконтекстные преобразования……………………………………………………… 104

Удаление дубликатов записей в таблице……………………………. 104

Парсинг URL-адресов…………………………………………………………… 109

Когда лучше выполнять преобразование?…………………………………….. 113

Основы моделирования данных……………………………………………………… 114

Ключевые термины моделирования данных………………………. 114

Моделирование полностью обновляемых данных……………. 115

Медленно меняющиеся измерения для полностью обновленных данных       119

Моделирование инкрементно собираемых данных…………… 122

Моделирование данных только для добавления……………….. 127

Моделирование данных об изменениях……………………………… 137

Глава 7. Оркестровка конвейеров…………………………… 143

Направленные ациклические графы………………………………………………. 143

Настройка и знакомство с Apache Airflow……………………………………… 144

Установка и настройка…………………………………………………………. 145

База данных Airflow………………………………………………………………. 146

Веб-сервер и пользовательский интерфейс……………………………………. 148

Планировщик…………………………………………………………………………. 152

Исполнители………………………………………………………………………….. 152

Операторы……………………………………………………………………………… 153

Создание DAG Airflow………………………………………………………………………. 154

Простой DAG…………………………………………………………………………. 154

Конвейер ELT и DAG…………………………………………………………….. 157

Дополнительные задачи конвейера………………………………………………… 162

Оповещения и уведомления………………………………………………….. 162

Проверка данных…………………………………………………………………… 163

Расширенные конфигурации оркестровки……………………………………… 163

Связанные и несвязанные задачи конвейера………………………. 164

Когда следует разделять DAG……………………………………………… 164

Координация нескольких DAG с сенсорами……………………….. 165

Управляемые варианты развертывания Airflow…………………………….. 168

Другие фреймворки для оркестровки……………………………………………… 169

Глава 8. Проверка данных в конвейерах………………… 171

Проверяйте раньше, проверяйте чаще……………………………………………. 171

Качество данных исходной системы…………………………………… 172

Риски процесса сбора данных……………………………………………… 173

Проверка данных с участием аналитиков………………………….. 174

Простой фреймворк проверки данных……………………………………………. 175

Простой фреймворк проверки данных………………………………… 175

Структура проверочного теста……………………………………………. 179

Запуск проверочного теста………………………………………………….. 181

Использование фреймворка в DAG Airflow…………………………. 182

Когда нужно остановить конвейер, а когда предупредить и продолжить       183

Дополнения к фреймворку……………………………………………………. 185

Примеры проверок……………………………………………………………………………. 189

Дубликаты записей после сбора данных……………………………. 190

Неожиданное изменение числа строк после сбора
данных……………………………………………………………………………………. 191

Колебания значения показателя………………………………………….. 194

Коммерческие и открытые фреймворки проверки данных…………… 199

Глава 9. Передовые методы обслуживания
конвейеров……………………………………………………………… 201

Как реагировать на изменения в исходных системах…………………… 201

Добавление абстракции……………………………………………………….. 201

Поддержка контрактов данных……………………………………………. 202

Ограничения схемы при чтении…………………………………………… 204

Масштабирование сложности конвейеров…………………………………….. 206

Стандартизация сбора данных……………………………………………. 206

Повторное использование логики модели данных…………….. 208

Обеспечение целостности зависимостей…………………………….. 211

Глава 10. Измерение и мониторинг производительности конвейера            215

Ключевые показатели конвейера……………………………………………………. 215

Подготовка хранилища данных……………………………………………………… 216

Структура данных………………………………………………………………… 216

Журналирование и получение данных о производительности……. 217

Получение истории выполнения DAG из Airflow………………… 218

Добавление журналирования в инструмент проверки данных 222

Преобразование данных о производительности…………………………… 228

Коэффициент успешного выполнения DAG………………………… 229

Отслеживание времени выполнения DAG…………………………… 230

Объем выполненных тестов и доля успешных
результатов……………………………………………………………………………. 232

Оркестровка конвейера производительности………………………………… 235

DAG конвейера производительности…………………………………… 235

Раскрытие информации о производительности…………………………….. 237

Предметный указатель……………………………………………. 239

Об авторе………………………………………………………………… 241

Об изображении на обложке…………………………………… 243

Денсмор Джеймс

Джеймс Денсмор (James Densmore) — технический директор HubSpot, а также основатель и главный консультант Data Liftoff. Он имеет более чем 10-летний опыт руководства группами данных и построения инфраструктуры данных в Wayfair, O’Reilly Media, HubSpot и Degreed. Джеймс получил степень бакалавра компьютерных наук в Северо-Восточном университете и степень магистра делового администрирования в Бостонском колледже.

Опубликовано

Новинка: “Современная разработка игр на Unity”

Современная разработка игр на Unity

Базовая книга об игровом движке Unity для разработки 2D- и 3D-игр на языке C# с применением специальных сценариев и библиотек. Рассмотрены базовые вопросы программирования игр: прототипирование, создание визуальных эффектов, разработка физики, оформление интерфейса, повышение производительности и отзывчивости программы. Уделено внимание специфике игрового движка Unity, подготовке игр к релизу, работе со скриптами на C#, юзабилити, развитию и усовершенствованию игр-прототипов.

Для разработчиков игр, компьютерной графики и мобильных приложений

Изучите Unity и научитесь им пользоваться для создания потрясающих видеоигр!

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

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

В этой книге:

  • Всё, что требуется знать о геймдизайне, процессах разработки игр и движках Unity 2D и 3D
  • Несложные пошаговые инструкции по проектированию игровых систем, проработке геймплея и повышению производительности
  • Подсказки и советы по разработке прототипов, релизу игр и оттачиванию удобства интерфейса

Перейдите по ссылке https://rebrand.ly/49fe95, чтобы скачать примеры кода и цветные изображения к книге.
Примеры кода для книги также размещены на сайте GitHub. Если код будет обновлен, изменения отобразятся в данном репозитории GitHub.

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

  • Научитесь пользоваться игровым редактором Unity и ресурсами Unity для создания 3D-анимаций и игр
  • Освойте важные концепции, которые пригодятся при разработке игр в различных жанрах
  • Разберитесь со встроенными в Unity элементами пользовательского интерфейса, системами рендеринга, игровой физики и графики
  • Создавайте собственный оригинальный геймплей и игровые элементы, пользуясь скриптами на языке C#
  • Узнайте, как довести до совершенства уже имеющийся прототип игры

Книгу “Современная разработка игр на Unity” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторе……………………………………………………………………………………………….. 14

Благодарности……………………………………………………………………………………….. 15

Предисловие…………………………………………………………………………………………… 16

Примеры кода и цветные изображения………………………………………………….. 19

Глава 1. Движок Unity……………………………………………………………………………. 20

Содержание главы…………………………………………………………………………………………………………………….. 22

Цель главы………………………………………………………………………………………………………………………………….. 22

Unity в общих чертах…………………………………………………………………………………………………………………. 22

Установка Unity…………………………………………………………………………………………………………………………. 23

Дополнительные возможности и учебные материалы…………………………………………………………… 25

Наш первый проект……………………………………………………………………………………………………………………. 27

Интерфейс редактора Unity………………………………………………………………………………………………………. 29

Панели Scene и Game…………………………………………………………………………………………………………. 30

Сцена…………………………………………………………………………………………………………………………………… 31

Панель Hierarchy………………………………………………………………………………………………………………… 31

Панель Inspector…………………………………………………………………………………………………………………. 33

Объекты GameObject………………………………………………………………………………………………………….. 34

Размещение объектов на сцене…………………………………………………………………………………………. 34

Перемещение объектов………………………………………………………………………………………………………. 37

Кнопка Play………………………………………………………………………………………………………………………… 39

Добавление второго объекта…………………………………………………………………………………………….. 40

Использование Visual Studio……………………………………………………………………………………………………… 42

Проверяем все на практике……………………………………………………………………………………………………….. 44

Дополнительно: наглядная работа со сценариями………………………………………………………………… 45

Заключение………………………………………………………………………………………………………………………………… 46

Вопросы……………………………………………………………………………………………………………………………………… 46

Основные понятия……………………………………………………………………………………………………………………… 47

Глава 2. Компоненты и префабы……………………………………………………………. 49

Содержание главы…………………………………………………………………………………………………………………….. 49

Цель главы………………………………………………………………………………………………………………………………….. 49

Подробно о компонентах………………………………………………………………………………………………………….. 50

Примеры компонентов………………………………………………………………………………………………………………. 50

Добавление компонентов к объекту…………………………………………………………………………………………. 53

Класс MonoBehaviour……………………………………………………………………………………………………………….. 53

Сценарий для компонента PlayerController……………………………………………………………………………. 54

Расширение компонентов в редакторе Unity…………………………………………………………………………… 57

Добавляем возможность прыжка……………………………………………………………………………………………… 59

Создание и генерация префабов в игре……………………………………………………………………………………. 60

Создаем реалистичную монетку………………………………………………………………………………………………. 61

Обнаружение столкновений……………………………………………………………………………………………………… 62

Триггеры……………………………………………………………………………………………………………………………………… 63

Превращение объекта в префаб……………………………………………………………………………………………….. 65

Генерация множества монет…………………………………………………………………………………………………….. 66

Дополнительные преимущества префабов……………………………………………………………………………… 69

Сообщения об отладке………………………………………………………………………………………………………………. 69

Основы разработки игр: итерирование и прототип геометрии……………………………………………… 70

Заключение………………………………………………………………………………………………………………………………… 71

Вопросы……………………………………………………………………………………………………………………………………… 71

Основные понятия……………………………………………………………………………………………………………………… 72

Глава 3. Основы боевой системы…………………………………………………………… 74

Содержание главы…………………………………………………………………………………………………………………….. 74

Цель главы………………………………………………………………………………………………………………………………….. 74

Основы разработки игр: риск и вознаграждение……………………………………………………………………. 75

Подсистемы………………………………………………………………………………………………………………………………… 75

Создание системы управления здоровьем………………………………………………………………………………. 76

Раскадровка получения урона…………………………………………………………………………………………………. 81

Шипы: первая опасность…………………………………………………………………………………………………………… 83

Компонент HealthModifier………………………………………………………………………………………………………… 88

Создаем простой снаряд…………………………………………………………………………………………………………… 91

Визуализация урона………………………………………………………………………………………………………………….. 95

Менеджер игровых сессий………………………………………………………………………………………………………… 98

Заключение………………………………………………………………………………………………………………………………. 101

Вопросы……………………………………………………………………………………………………………………………………. 101

Основные понятия……………………………………………………………………………………………………………………. 102

Глава 4. Знакомство с пользовательским интерфейсом………………………… 103

Содержание главы…………………………………………………………………………………………………………………… 103

Цель главы………………………………………………………………………………………………………………………………… 104

Игровые поток и процесс………………………………………………………………………………………………………… 104

Распределение игрового потока…………………………………………………………………………………………….. 104

Система пользовательского интерфейса Unity……………………………………………………………………… 106

Объект Image…………………………………………………………………………………………………………………….. 107

Объект Text (TextMeshPro)……………………………………………………………………………………………….. 107

Объект Button (TextMeshPro)…………………………………………………………………………………………… 107

Объект Canvas………………………………………………………………………………………………………………….. 108

Ассеты шрифтов……………………………………………………………………………………………………………….. 108

Привязка элементов…………………………………………………………………………………………………………. 108

Растягивание объектов…………………………………………………………………………………………………….. 109

Холст главного меню………………………………………………………………………………………………………………. 109

Компонент Rect Transform……………………………………………………………………………………………….. 109

Компонент Canvas……………………………………………………………………………………………………………. 111

Компонент Canvas Scaler………………………………………………………………………………………………… 112

Главное меню: добавление элементов пользовательского интерфейса…………………………….. 113

Предустановки привязок…………………………………………………………………………………………………. 115

Главное меню: добавление сценария…………………………………………………………………………….. 120

Главное меню: действия для кнопок………………………………………………………………………………. 121

Добавление сцен в настройки сборки…………………………………………………………………………….. 122

Базовый HUD-интерфейс………………………………………………………………………………………………………… 124

Сценарий MainGameHUD………………………………………………………………………………………………… 129

Окончание игры……………………………………………………………………………………………………………………….. 131

Заключение………………………………………………………………………………………………………………………………. 134

Вопросы……………………………………………………………………………………………………………………………………. 134

Основные понятия……………………………………………………………………………………………………………………. 134

Глава 5. Основы разработки………………………………………………………………… 136

Содержание главы…………………………………………………………………………………………………………………… 136

Цель главы………………………………………………………………………………………………………………………………… 137

Важность вех……………………………………………………………………………………………………………………………. 137

Критикуйте!……………………………………………………………………………………………………………………………… 137

Управляем камерой…………………………………………………………………………………………………………………. 139

Улучшение уровня…………………………………………………………………………………………………………………… 142

Профессиональные инструменты…………………………………………………………………………………………… 144

Разработка уровня…………………………………………………………………………………………………………………… 146

Лучшие враги…………………………………………………………………………………………………………………………… 149

Взрывное исчезновение…………………………………………………………………………………………………………… 151

Азы разработки игр: постоянство………………………………………………………………………………………….. 154

Поиск багов………………………………………………………………………………………………………………………………. 154

Бездонная пропасть…………………………………………………………………………………………………………. 154

Снаряды с багами…………………………………………………………………………………………………………….. 155

Бесконечный боезапас…………………………………………………………………………………………………….. 156

Экспорт сборки………………………………………………………………………………………………………………………… 157

Заключение………………………………………………………………………………………………………………………………. 159

Вопросы……………………………………………………………………………………………………………………………………. 160

Основные понятия……………………………………………………………………………………………………………………. 160

Глава 6. Управление физическими явлениями……………………………………… 162

Обзор главы……………………………………………………………………………………………………………………………… 162

Цель главы………………………………………………………………………………………………………………………………… 162

Система физики Unity………………………………………………………………………………………………………………. 163

Компоненты физики…………………………………………………………………………………………………………………. 163

Базовые формы коллайдеров………………………………………………………………………………………………….. 163

Коллайдер на основе мешей…………………………………………………………………………………………… 165

Компонент RigidBody………………………………………………………………………………………………………………. 165

Сочленения………………………………………………………………………………………………………………………………. 166

Программирование физики……………………………………………………………………………………………………… 169

Игровой процесс: передвигаемые блоки……………………………………………………………………………….. 173

Игровой процесс: движущиеся платформы…………………………………………………………………………… 176

Игровой процесс: трамплины…………………………………………………………………………………………………. 179

Игровой процесс: область ветра наносит удар…………………………………………………………………….. 180

Передача теней………………………………………………………………………………………………………………………… 184

Палитра игрового процесса……………………………………………………………………………………………………. 186

Заключение………………………………………………………………………………………………………………………………. 187

Основные понятия……………………………………………………………………………………………………………………. 187

Контрольные вопросы…………………………………………………………………………………………………………….. 188

Глава 7. Увлекательные анимации………………………………………………………. 190

Содержание главы…………………………………………………………………………………………………………………… 190

Цель главы………………………………………………………………………………………………………………………………… 191

Принципы анимации……………………………………………………………………………………………………………….. 191

Создание основного героя………………………………………………………………………………………………………. 194

Поза покоя………………………………………………………………………………………………………………………………… 200

Панель Animation…………………………………………………………………………………………………………………….. 200

Ключевые кадры и интерполяция………………………………………………………………………………………….. 202

Циклы бега……………………………………………………………………………………………………………………………….. 207

Анимация в действии……………………………………………………………………………………………………………….. 212

Организация файлов………………………………………………………………………………………………………………… 215

Заключение………………………………………………………………………………………………………………………………. 216

Вопросы……………………………………………………………………………………………………………………………………. 216

Основные понятия……………………………………………………………………………………………………………………. 217

Глава 8. Искусственный интеллект противников………………………………… 218

Содержание главы…………………………………………………………………………………………………………………… 218

Искусственный интеллект……………………………………………………………………………………………………….. 218

Простые противники……………………………………………………………………………………………………………….. 219

Компонент AIBrain…………………………………………………………………………………………………………… 221

Тип UnityEvent и события искусственного интеллекта………………………………………………… 223

Выслеживание игрока……………………………………………………………………………………………………… 224

Настройка искусственного интеллекта…………………………………………………………………………. 226

Навигационный меш………………………………………………………………………………………………………… 230

Агенты NavMesh……………………………………………………………………………………………………………….. 231

Тестирование противника……………………………………………………………………………………… 233

Заключение………………………………………………………………………………………………………………………………. 234

Вопросы……………………………………………………………………………………………………………………………………. 235

Основные понятия……………………………………………………………………………………………………………………. 235

Глава 9. Создание системы вооружения……………………………………………….. 237

Содержание главы…………………………………………………………………………………………………………………… 237

Цель главы………………………………………………………………………………………………………………………………… 238

Палки и камни………………………………………………………………………………………………………………………….. 238

Сцена-песочница для тестирования оружия…………………………………………………………………………. 238

Снаряжение персонажа оружием…………………………………………………………………………………………… 245

Компонент Weapon………………………………………………………………………………………………………………….. 247

Настройка оружия ближнего боя…………………………………………………………………………………………… 248

Настройка оружия дальнего боя……………………………………………………………………………………………. 250

Эффект отбрасывания……………………………………………………………………………………………………………… 251

Анимация атаки……………………………………………………………………………………………………………….. 251

Шлейфы…………………………………………………………………………………………………………………………………….. 255

Продвинутые боевые приемы…………………………………………………………………………………………………. 256

Заключение………………………………………………………………………………………………………………………………. 257

Вопросы……………………………………………………………………………………………………………………………………. 258

Основные понятия……………………………………………………………………………………………………………………. 258

Глава 10. Звуковое сопровождение………………………………………………………. 260

Содержание главы…………………………………………………………………………………………………………………… 260

Цель главы………………………………………………………………………………………………………………………………… 261

Аудиокомпоненты……………………………………………………………………………………………………………………. 261

Аудиослушатель………………………………………………………………………………………………………………. 261

Источник звука…………………………………………………………………………………………………………………. 261

Источники музыки и звуковых эффектов……………………………………………………………………………….. 263

Наём музыканта……………………………………………………………………………………………………………….. 263

Библиотеки Royalty Free………………………………………………………………………………………………….. 263

Бесплатные аудиофайлы………………………………………………………………………………………………… 263

Магазин Unity Asset Store………………………………………………………………………………………………… 263

Импорт аудиофайлов………………………………………………………………………………………………………………. 267

Создание менеджера звука……………………………………………………………………………………………… 269

Основы объемного звучания…………………………………………………………………………………………………… 271

Объемное звуковое сопровождение предметов…………………………………………………………….. 273

Объемное звуковое сопровождение оружия………………………………………………………………….. 276

Мастеринг звука с помощью аудиомикшеров………………………………………………………………. 277

Поддержка разных платформ…………………………………………………………………………………………………. 279

Заключение………………………………………………………………………………………………………………………………. 279

Вопросы……………………………………………………………………………………………………………………………………. 280

Основные понятия……………………………………………………………………………………………………………………. 280

Глава 11. Улучшение графики……………………………………………………………… 281

Содержание главы…………………………………………………………………………………………………………………… 281

Цель главы………………………………………………………………………………………………………………………………… 282

Художественные инструменты Unity…………………………………………………………………………………….. 282

Загрузка дополнительных материалов…………………………………………………………………………………. 283

Инструмент ProBuilder……………………………………………………………………………………………………………. 285

Создание фигур………………………………………………………………………………………………………………… 286

Создание полифигур………………………………………………………………………………………………………… 287

Сглаживание…………………………………………………………………………………………………………………….. 287

Редактор материалов………………………………………………………………………………………………………. 287

UV-редактор……………………………………………………………………………………………………………………… 288

Центральная поворотная точка……………………………………………………………………………………… 289

Выдавливание меша клавишей <Shift>………………………………………………………………………….. 289

Кирпичные блоки…………………………………………………………………………………………………………………….. 291

Привязка к сетке и размещение ассетов…………………………………………………………………………………. 294

Префабы для постройки уровней…………………………………………………………………………………………… 296

Китбашинг………………………………………………………………………………………………………………………………… 301

Скайбокс…………………………………………………………………………………………………………………………………… 304

Генерация тумана……………………………………………………………………………………………………………………. 306

Очистка рабочего пространства……………………………………………………………………………………………. 307

Постобработка…………………………………………………………………………………………………………………………. 308

Заключение………………………………………………………………………………………………………………………………. 312

Вопросы……………………………………………………………………………………………………………………………………. 312

Основные понятия……………………………………………………………………………………………………………………. 312

Глава 12. Системы частиц……………………………………………………………………. 315

Содержание главы…………………………………………………………………………………………………………………… 315

Цель главы………………………………………………………………………………………………………………………………… 315

Обзор эффектов частиц……………………………………………………………………………………………………………. 316

Заполнение трехмерного пространства………………………………………………………………………………… 317

Эффекты оружия………………………………………………………………………………………………………………………. 323

Эффекты взрывов……………………………………………………………………………………………………………………… 330

Пакет Unity Particle Pack………………………………………………………………………………………………………… 339

Заключение………………………………………………………………………………………………………………………………. 342

Вопросы……………………………………………………………………………………………………………………………………. 342

Основные понятия……………………………………………………………………………………………………………………. 343

Глава 13. Прогресс игрока……………………………………………………………………. 345

Содержание главы…………………………………………………………………………………………………………………… 345

Цель главы………………………………………………………………………………………………………………………………… 346

Кривая сложности……………………………………………………………………………………………………………………. 346

Управление сложностью…………………………………………………………………………………………………………. 348

Адаптация и обучение игрока………………………………………………………………………………………………… 348

Режим обучения……………………………………………………………………………………………………………………….. 349

Освещение пути……………………………………………………………………………………………………………………….. 350

Обучение игрока………………………………………………………………………………………………………………. 354

Проверка навыков игрока……………………………………………………………………………………………….. 358

Испытания и мастерство…………………………………………………………………………………………………. 360

Ритмизация………………………………………………………………………………………………………………. 361

Деревья прогрессии………………………………………………………………………………………………… 362

Достижения……………………………………………………………………………………………………………… 362

Новая расширенная игра……………………………………………………………………………………….. 362

Карта мира………………………………………………………………………………………………………………. 363

Заключение………………………………………………………………………………………………………………………………. 368

Вопросы……………………………………………………………………………………………………………………………………. 369

Основные понятия……………………………………………………………………………………………………………………. 369

Глава 14. Пользовательский опыт……………………………………………………….. 371

Содержание главы…………………………………………………………………………………………………………………… 371

Цель главы………………………………………………………………………………………………………………………………… 372

Что такое опыт взаимодействия?……………………………………………………………………………………………. 372

Влияние интерфейса на опыт взаимодействия……………………………………………………………………… 373

Иконографика…………………………………………………………………………………………………………………………… 373

Типографика…………………………………………………………………………………………………………………………….. 377

Подсказки в игровом мире………………………………………………………………………………………………………. 379

О важности первых 10 минут………………………………………………………………………………………………….. 385

Ознакомительный уровень……………………………………………………………………………………………………… 385

Достижение победы…………………………………………………………………………………………………………………. 389

Плавный переход между сценами………………………………………………………………………………………….. 394

Заключение………………………………………………………………………………………………………………………………. 398

Вопросы……………………………………………………………………………………………………………………………………. 399

Основные понятия……………………………………………………………………………………………………………………. 399

Глава 15. 2D в сравнении с 3D……………………………………………………………… 401

Содержание главы…………………………………………………………………………………………………………………… 402

Цель главы………………………………………………………………………………………………………………………………… 402

2D- и 3D-игры…………………………………………………………………………………………………………………………… 402

Создание 2D-проекта………………………………………………………………………………………………………………. 403

Спрайты……………………………………………………………………………………………………………………………………. 405

Листы спрайтов……………………………………………………………………………………………………………………….. 408

Карты плиток…………………………………………………………………………………………………………………………… 410

Исследование затерянной гробницы……………………………………………………………………………………… 416

Физика и перемещение в 2D-играх…………………………………………………………………………………………. 418

Анимация в 2D-играх………………………………………………………………………………………………………………. 419

Кинематографическая камера………………………………………………………………………………………………… 422

Сила параллакса……………………………………………………………………………………………………………………… 425

Заключение………………………………………………………………………………………………………………………………. 426

Вопросы……………………………………………………………………………………………………………………………………. 427

Основные понятия……………………………………………………………………………………………………………………. 427

Глава 16. Игровые жанры……………………………………………………………………. 429

Содержание главы…………………………………………………………………………………………………………………… 429

Цель главы………………………………………………………………………………………………………………………………… 430

Масштабы проектов………………………………………………………………………………………………………………… 430

Сайд-скроллеры и платформеры……………………………………………………………………………………………. 431

Игры с видом сверху………………………………………………………………………………………………………………… 435

Шутеры от первого лица…………………………………………………………………………………………………………. 438

Игры от третьего лица…………………………………………………………………………………………………………….. 441

Ролевые игры……………………………………………………………………………………………………………………………. 443

Стратегии…………………………………………………………………………………………………………………………………. 444

Головоломки…………………………………………………………………………………………………………………………….. 445

Креативные сочетания концепций…………………………………………………………………………………………. 446

Ожидания игроков……………………………………………………………………………………………………………………. 448

Заключение………………………………………………………………………………………………………………………………. 449

Вопросы……………………………………………………………………………………………………………………………………. 450

Основные понятия……………………………………………………………………………………………………………………. 450

Глава 17. Платформы и издание…………………………………………………………… 451

Содержание главы…………………………………………………………………………………………………………………… 451

Цель главы………………………………………………………………………………………………………………………………… 452

Выбор платформы…………………………………………………………………………………………………………………… 452

Windows/macOS/Linux…………………………………………………………………………………………………………….. 453

Мобильные устройства…………………………………………………………………………………………………………… 454

Консоли…………………………………………………………………………………………………………………………………….. 458

WebGL………………………………………………………………………………………………………………………………………. 459

Устройства виртуальной/дополненной реальности…………………………………………………………….. 460

Публикация игры……………………………………………………………………………………………………………………… 462

Сотрудничество с издателями игр…………………………………………………………………………………………. 463

Заключение………………………………………………………………………………………………………………………………. 464

Вопросы……………………………………………………………………………………………………………………………………. 465

Основные понятия……………………………………………………………………………………………………………………. 465

Глава 18. От идеи к финалу………………………………………………………………….. 467

Содержание главы…………………………………………………………………………………………………………………… 467

Цель главы………………………………………………………………………………………………………………………………… 468

Препроизводство……………………………………………………………………………………………………………………… 468

Проектная документация………………………………………………………………………………………………………… 469

Бумажные прототипы……………………………………………………………………………………………………………… 471

Концепт-арт……………………………………………………………………………………………………………………………… 472

Макеты……………………………………………………………………………………………………………………………………… 474

Будьте креативны…………………………………………………………………………………………………………………….. 475

Управление проектом……………………………………………………………………………………………………………… 477

Вертикальный срез………………………………………………………………………………………………………………….. 479

Тестирование игры………………………………………………………………………………………………………………….. 479

Аналитика………………………………………………………………………………………………………………………………… 480

Приоритеты отзывов……………………………………………………………………………………………………………….. 481

Вехи, динамика и моральный дух………………………………………………………………………………………….. 482

Ранний доступ………………………………………………………………………………………………………………………….. 484

Маркетинг………………………………………………………………………………………………………………………………… 485

Выпуск в производство¼ и не только!………………………………………………………………………………….. 487

Заключение………………………………………………………………………………………………………………………………. 488

Вопросы……………………………………………………………………………………………………………………………………. 488

Основные понятия……………………………………………………………………………………………………………………. 489

Предметный указатель…………………………………………………………………………. 492

Scott Tykoski

Скотт Тыкоски (Scott Tykoski) более 23 лет работает в индустрии видеоигр, принимал участие в создании и распространении более 25 игр и приложений на различных платформах (ПК, мобильные устройства, Xbox, Meta Quest 2, HoloLens). Скотт возглавлял несколько команд разработчиков и за свою карьеру занимал практически все возможные должности: разработчик, художник, дизайнер, писатель, аниматор, продюсер, маркетолог. Он регулярно выступает с лекциями об игровом дизайне в школах и на местных встречах разработчиков игр.

Опубликовано

Вышла книга “Node.js: разработка приложений в микросервисной архитектуре с нуля”

Node.js: разработка приложений в микросервисной архитектуре с нуля

Базовая книга по построению микросервисной архитектуры с практическими примерами на Node.js. Также рассмотрена работа с оркестратором Kubernetes и контейнерами Docker в среде Docker Compose. Разобраны основные принципы и техники разработки распределенных систем, в частности показано, как написать и развернуть три микросервиса, управлять СУБД, настроить брокер сообщений Kafka, внедрить кэш Redis. Объяснены паттерны проектирования. Особое внимание уделено распределенным транзакциям и разворачиванию микросервисов на удаленном сервере. Показано, как обеспечить расширяемость и отказоустойчивость приложений, как успешно бороться с усложнением клиентских интерфейсов, поддерживая высокую скорость загрузки страниц и приложений и не забывая о том, чтобы сайт оставался красивым и удобным в использовании. Электронный архив на сайте издательства содержит дополнительные материалы к книге.

Для начинающих веб-разработчиков

Микросервисы на JavaScript: осваиваем аккуратную декомпозицию

Современная практика enterprise-разработки и возникающие вызовы связаны, прежде всего, с обеспечением отказоустойчивости и расширяемости приложений. Сложно рассчитывать на реализацию таких качеств без применения микросервисной архитектуры. В книге по порядку рассматривается создание целого приложения с нуля. На материале готового продукта показано, как написать и развернуть три микросервиса, управлять СУБД, настроить брокер сообщений Kafka, внедрить кэш Redis и объединить эти решения в среде Docker-Compose и оркестраторе Kubernetes. Все паттерны, актуальные при проектировании микросервисов для веб-архитектуры, разобраны на практических примерах.

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

Электронный архив с дополнительными материалами, не вошедшими в печатную версиюкнигу, можно скачать по ссылке https://zip.bhv.ru/ 9785977519359.zip, а также со страницы книги на сайте bhv.ru

Вы узнаете, как:

  • разрабатывать микросервисы на Node.js
  • выстраивать синхронное и асинхронное взаимодействие между микросервисами,
  • выполнять распределенные транзакции,
  • организовать взаимодействие между микросервисами,
  • использовать паттерны проектирования,
  • разворачивать микросервисы в облаке,
  • использовать и настраивать Docker, Docker-Compose,
  • настраивать Kubernetes в удаленной среде.

Для кого эта книга?

Основное внимание в ней уделяется именно практическим навыкам написания микросервисов. Она пригодится тем, кто достаточно глубоко владеет знаниями о JavaScript и TypeScript. Упор делается именно на конкретный стек технологий: Node.js, NestJS, PostgreSQL, Kafka, Redis, Docker, Docker-Compose, Kubernetes и некоторые другие. Желательно, чтобы у вас был опыт написания приложений на NestJS, т. к. глубоко в сами технологии мы погружаться не станем. Главный акцент сделан на микросервисах, проблемах, с которыми вы можете столкнуться при их разработке, и путях их решения.

Обзор Node.js
Node.js — это в первую очередь платформа, позволяющая применять язык Java-Script для бэкенда. Веб-разработку в наши дни невозможно представить без Java-Script. Это основной язык и инструмент фронтенд-разработчика. С него начинается TypeScript и всевозможные фреймворки, ускоряющие разработку, — например, такие как ReactJS, Angular, Vue. Однако фронтенд не может жить без бэкенда, и долгое время в роли бэкенда для веб-разработки использовались в основном PHP и Java.
Node.js стоит, как говорится, на двух китах: библиотеке libuv и движке V8 от Google, применяемом в браузере.

Книгу “Node.js: разработка приложений в микросервисной архитектуре с нуля” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Введение………………………………………………………………………………………………….. 7

Для кого эта книга?……………………………………………………………………………………………………………………… 7

Обзор Node.js………………………………………………………………………………………………………………………………… 7

Выбор фреймворка: NestJS или Express.js?……………………………………………………………………………… 10

Сравнение монолитной и микросервисной архитектуры………………………………………………………. 13

Список литературы и источников……………………………………………………………………………………………. 14

Глава 1. Разработка первого микросервиса (User)………………………………….. 15

Настройка локального окружения…………………………………………………………………………………………… 15

Редактор кода и плагины…………………………………………………………………………………………………… 15

Node.js и пакетные менеджеры…………………………………………………………………………………………. 16

NVM…………………………………………………………………………………………………………………………………….. 18

Установка NestJS………………………………………………………………………………………………………………… 19

Git…………………………………………………………………………………………………………………………………………. 21

Codestyle……………………………………………………………………………………………………………………………… 23

Docker и Docker-Compose………………………………………………………………………………………………….. 24

Тестирование API………………………………………………………………………………………………………………. 27

Вывод………………………………………………………………………………………………………………………………….. 29

Создание структуры проекта……………………………………………………………………………………………………. 29

Подключение необходимых библиотек…………………………………………………………………………………… 37

Переменные окружения……………………………………………………………………………………………………… 37

ORM…………………………………………………………………………………………………………………………………….. 39

Swagger………………………………………………………………………………………………………………………………… 45

Библиотеки сlass-transformer и class-validator………………………………………………………………… 47

Настройка ESLint………………………………………………………………………………………………………………………. 48

Проектирование базы данных PostgreSQL………………………………………………………………………………. 52

Что такое «база данных» и какие они бывают?………………………………………………………………. 52

Нормализация данных………………………………………………………………………………………………………. 54

Первая нормальная форма (1НФ)……………………………………………………………………………. 54

Вторая нормальная форма (2НФ)……………………………………………………………………………. 55

Третья нормальная форма (3НФ)…………………………………………………………………………….. 56

Разработка бизнес-логики и маршрутизации для модуля User……………………………………………… 57

Тестирование микросервиса…………………………………………………………………………………………………….. 74

Список литературы и источников……………………………………………………………………………………………. 77

Глава 2. Разработка микросервиса авторизации и аутентификации (Auth) 79

Теоретический обзор способов авторизации и аутентификации………………………………………….. 79

Аутентификация, идентификация и авторизация……………………………………………………………. 79

Аутентификация по паролю……………………………………………………………………………………………… 80

Аутентификация по сертификатам…………………………………………………………………………………… 81

Аутентификация по одноразовым паролям…………………………………………………………………….. 82

Аутентификация по ключам доступа……………………………………………………………………………….. 83

Аутентификация по токенам……………………………………………………………………………………………… 83

Базовые меры предосторожности от возможных уязвимостей……………………………………………… 85

Переполнение буфера………………………………………………………………………………………………………… 86

Состояние гонки…………………………………………………………………………………………………………………. 86

Атаки проверки ввода………………………………………………………………………………………………………… 86

Атаки аутентификации………………………………………………………………………………………………………. 87

Атаки авторизации…………………………………………………………………………………………………………….. 87

Атаки на стороне клиента…………………………………………………………………………………………………. 88

Разработка модуля Auth……………………………………………………………………………………………………………. 88

Список литературы и источников………………………………………………………………………………………….. 101

Глава 3. Способы взаимодействия между микросервисами………………….. 103

HTTP-протокол………………………………………………………………………………………………………………………… 103

Модель OSI……………………………………………………………………………………………………………………….. 103

Физический уровень……………………………………………………………………………………………….. 104

Канальный уровень………………………………………………………………………………………………… 104

Сетевой уровень……………………………………………………………………………………………………… 105

Транспортный уровень…………………………………………………………………………………………… 105

Сеансовый уровень…………………………………………………………………………………………………. 105

Уровень представления………………………………………………………………………………………….. 106

Прикладной уровень………………………………………………………………………………………………. 106

Устройство HTTP-протокола………………………………………………………………………………………….. 106

Структура HTTP-запроса………………………………………………………………………………………. 107

Cтруктура HTTP-ответа…………………………………………………………………………………………. 108

gRPC………………………………………………………………………………………………………………………………………….. 108

RabbitMQ………………………………………………………………………………………………………………………………….. 112

Apache Kafka……………………………………………………………………………………………………………………………. 115

Redis………………………………………………………………………………………………………………………………………….. 117

Разработка интеграции сервисов Auth и Account…………………………………………………………………. 118

Список литературы и источников………………………………………………………………………………………….. 136

Глава 4. Разработка модуля Transaction……………………………………………….. 137

Проектирование базы данных………………………………………………………………………………………………… 137

Нормальная форма Бойса — Кодда (НФБК) — частная форма
третьей нормальной формы…………………………………………………………………………………………….. 137

Четвертая нормальная форма…………………………………………………………………………………………. 139

Пятая нормальная форма………………………………………………………………………………………………… 139

Доменно-ключевая нормальная форма………………………………………………………………………….. 140

Шестая нормальная форма……………………………………………………………………………………………… 140

Понятия миграций и транзакций в контексте базы данных PostgreSQL……………………………… 141

Миграции………………………………………………………………………………………………………………………….. 141

Индексы…………………………………………………………………………………………………………………………….. 144

Транзакции……………………………………………………………………………………………………………………….. 150

ACID…………………………………………………………………………………………………………………………. 151

Параллельные транзакции…………………………………………………………………………………….. 151

Уровни изоляции транзакций в SQL……………………………………………………………………… 152

Разработка модуля Transaction………………………………………………………………………………………………. 153

Интеграция Transaction и Account………………………………………………………………………………………….. 167

Проблема распределенных транзакций………………………………………………………………………………… 183

Двухфазная фиксация………………………………………………………………………………………………………. 184

Saga……………………………………………………………………………………………………………………………………. 185

Реализация паттерна Saga……………………………………………………………………………………… 186

Список литературы и источников………………………………………………………………………………………….. 209

Глава 5. Развертывание микросервисов……………………………………………….. 211

Обертывание микросервисов в docker-контейнеры………………………………………………………………. 225

Масштабирование при помощи оркестратора Kubernetes………………………………………………….. 238

Заключение………………………………………………………………………………………………………………………………. 247

Список литературы и источников………………………………………………………………………………………….. 247

Приложение. Описание электронного архива………………………………………. 249

Предметный указатель…………………………………………………………………………. 251

Попова Юлия Юрьевна, практикующий инженер-программист, занимающейся разработкой коммерческих продуктов более 5 лет.

Опубликовано

Новинка: “Python. Красивые задачи для начинающих”

Python. Красивые задачи для начинающих

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

Для начинающих программистов

Python — это красиво!

Главная причина популярности языка Python — его лаконичность, простота и выразительность. Один и тот же алгоритм на этом языке можно запрограммировать по-разному – так, что будет казаться, будто программа написана на разных языках. В этой книге приводятся алгоритмы решения задач на Python, которые автор считает красивыми — все они имеют несколько вариантов решений и формируют алгоритмическое мышление. Эти алгоритмы – часть хорошего IT-образования. Рассмотрев предложенные задачи, знакомый с основами Python читатель сможет проверить, действительно ли он умеет программировать, а изучив их решения, значительно улучшит свои алгоритмические навыки. Ценность книги состоит в том, что в ней приводится детальное пошаговое описание процесса написания программы для решения каждой поставленной задачи.

  • Структурное программирование
  • Динамическое программирование
  • Объектно-ориентированное программирование
  • Функциональное программирование

Книгу “Python. Красивые задачи для начинающих” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………….. 7

На кого рассчитана эта книга?………………………………………………………………………………………………… 10

Структура книги………………………………………………………………………………………………………………………… 11

Благодарности…………………………………………………………………………………………………………………………… 12

Глава 1. Условия……………………………………………………………………………………. 13

1.1. Квадратное уравнение, комплексные корни…………………………………………………………………….. 13

Задача………………………………………………………………………………………………………………………………….. 13

1.2. Кирпич и дыра в стене………………………………………………………………………………………………………… 18

Задача………………………………………………………………………………………………………………………………….. 18

Версия 1……………………………………………………………………………………………………………………… 19

Версия 2……………………………………………………………………………………………………………………… 20

Версия 3……………………………………………………………………………………………………………………… 21

Глава 2. Структурное программирование………………………………………………. 23

2.1. Полупроходной балл………………………………………………………………………………………………………….. 23

Задача 1………………………………………………………………………………………………………………………………. 23

Версия 1……………………………………………………………………………………………………………………… 24

Версия 2……………………………………………………………………………………………………………………… 25

Задача 2………………………………………………………………………………………………………………………………. 28

Версия 3……………………………………………………………………………………………………………………… 28

Версия 4……………………………………………………………………………………………………………………… 29

Задача 3………………………………………………………………………………………………………………………………. 31

Версия 5……………………………………………………………………………………………………………………… 32

2.2. Метеостанция……………………………………………………………………………………………………………………… 33

Задача………………………………………………………………………………………………………………………………….. 33

Версия 1……………………………………………………………………………………………………………………… 34

Версия 2……………………………………………………………………………………………………………………… 37

2.3. Седловина матрицы……………………………………………………………………………………………………………. 40

Задача………………………………………………………………………………………………………………………………….. 40

2.4. Максимальный квадрат в матрице, заполненный нулями………………………………………………. 43

Задача………………………………………………………………………………………………………………………………….. 43

2.5. Чемпионат по игре в тетрис……………………………………………………………………………………………….. 46

Задача………………………………………………………………………………………………………………………………….. 46

2.6. Проверка правильности расстановки скобок…………………………………………………………………… 51

Задача………………………………………………………………………………………………………………………………….. 51

Глава 3. Функции………………………………………………………………………………….. 57

3.1. Решето Эратосфена и числа-близнецы…………………………………………………………………………….. 57

Задача………………………………………………………………………………………………………………………………….. 57

3.2. Решето Сундарама……………………………………………………………………………………………………………… 65

Задача………………………………………………………………………………………………………………………………….. 65

3.3. Лесенка………………………………………………………………………………………………………………………………… 67

Задача………………………………………………………………………………………………………………………………….. 67

3.4. Линейный и медианный фильтры………………………………………………………………………………………. 73

Задача 1………………………………………………………………………………………………………………………………. 73

Задача 2………………………………………………………………………………………………………………………………. 84

3.5. Алгоритм Евклида………………………………………………………………………………………………………………. 85

Задача………………………………………………………………………………………………………………………………….. 85

3.6. Гипероператоры…………………………………………………………………………………………………………………. 91

Задача………………………………………………………………………………………………………………………………….. 91

3.7. Ханойские башни……………………………………………………………………………………………………………… 102

Задача……………………………………………………………………………………………………………………………….. 102

3.8. Отображения списков……………………………………………………………………………………………………….. 109

Задача……………………………………………………………………………………………………………………………….. 109

Глава 4. Поиск в длину и ширину, бэктрекинг,
динамическое программирование………………………………………………………… 119

4.1. Лабиринт……………………………………………………………………………………………………………………………. 119

Задача 1…………………………………………………………………………………………………………………………….. 120

Версия 1…………………………………………………………………………………………………………………… 120

Версия 2…………………………………………………………………………………………………………………… 125

Версия 3…………………………………………………………………………………………………………………… 130

Версия 4…………………………………………………………………………………………………………………… 134

Задача 2…………………………………………………………………………………………………………………………….. 139

4.2. Задача о восьми ферзях……………………………………………………………………………………………………. 143

Задача……………………………………………………………………………………………………………………………….. 143

Версия 1…………………………………………………………………………………………………………………… 143

Версия 2…………………………………………………………………………………………………………………… 156

4.3. Поиск индекса элемента в списке……………………………………………………………………………………. 161

Задача……………………………………………………………………………………………………………………………….. 161

Версия 1…………………………………………………………………………………………………………………… 161

Версия 2…………………………………………………………………………………………………………………… 162

Версия 3…………………………………………………………………………………………………………………… 163

4.4. Сжатие строки…………………………………………………………………………………………………………………… 167

Задача……………………………………………………………………………………………………………………………….. 167

4.5. Укладка рюкзака………………………………………………………………………………………………………………. 176

Задача……………………………………………………………………………………………………………………………….. 176

4.6. Подпоследовательность максимальной длины……………………………………………………………… 180

Задача……………………………………………………………………………………………………………………………….. 181

Версия 1…………………………………………………………………………………………………………………… 181

Версия 2…………………………………………………………………………………………………………………… 184

Версия 3…………………………………………………………………………………………………………………… 186

Версия 4…………………………………………………………………………………………………………………… 191

4.7. Палиндром наибольшей длины……………………………………………………………………………………….. 199

Задача……………………………………………………………………………………………………………………………….. 199

4.8. Гиперсфера………………………………………………………………………………………………………………………… 208

Задача……………………………………………………………………………………………………………………………….. 209

Глава 5. Объектно-ориентированное программирование…………………….. 219

5.1. Графы с помощью словарей…………………………………………………………………………………………….. 219

Задача 1…………………………………………………………………………………………………………………………….. 220

Задача 2…………………………………………………………………………………………………………………………….. 220

Задача 3…………………………………………………………………………………………………………………………….. 224

Задача 4…………………………………………………………………………………………………………………………….. 225

Задача 5…………………………………………………………………………………………………………………………….. 226

Задача 6…………………………………………………………………………………………………………………………….. 227

Задача 7…………………………………………………………………………………………………………………………….. 228

Задача 8…………………………………………………………………………………………………………………………….. 228

5.2. Родословное древо……………………………………………………………………………………………………………. 230

Задача 1…………………………………………………………………………………………………………………………….. 230

Задача 2…………………………………………………………………………………………………………………………….. 238

Задача 3…………………………………………………………………………………………………………………………….. 243

5.3. Период в числовой последовательности………………………………………………………………………… 252

Задача……………………………………………………………………………………………………………………………….. 252

Версия 1…………………………………………………………………………………………………………………… 252

Версия 2…………………………………………………………………………………………………………………… 253

Версия 3…………………………………………………………………………………………………………………… 254

5.4. Треугольник Паскаля и сочетания………………………………………………………………………………….. 257

Задача 1…………………………………………………………………………………………………………………………….. 257

Задача 2…………………………………………………………………………………………………………………………….. 259

Отступление про функторы……………………………………………………………………………………. 262

5.5. Гиперкуб в многомерном пространстве………………………………………………………………………….. 266

Задача……………………………………………………………………………………………………………………………….. 266

Глава 6. Функциональное программирование……………………………………… 287

6.1. Интеграл…………………………………………………………………………………………………………………………….. 288

Задача……………………………………………………………………………………………………………………………….. 288

6.2. Отображения, сохраняющие внутреннюю структуру…………………………………………………… 298

Общая задача……………………………………………………………………………………………………………………. 298

Задача 1…………………………………………………………………………………………………………………………….. 299

Задача 2…………………………………………………………………………………………………………………………….. 302

Задача 3…………………………………………………………………………………………………………………………….. 304

6.3. Цепочки функций………………………………………………………………………………………………………………. 305

Задача……………………………………………………………………………………………………………………………….. 305

6.4. Монады……………………………………………………………………………………………………………………………… 309

Задача……………………………………………………………………………………………………………………………….. 309

6.5. Карринг……………………………………………………………………………………………………………………………… 319

Задача……………………………………………………………………………………………………………………………….. 319

6.6. Функторы…………………………………………………………………………………………………………………………… 331

Задача……………………………………………………………………………………………………………………………….. 331

Выводы по главам 3, 4 и 6……………………………………………………………………………………………………….. 342

Глава 7. Сюрреализм……………………………………………………………………………. 345

7.1. Фрактальные списки…………………………………………………………………………………………………………. 345

7.2. Фрактальный словарь………………………………………………………………………………………………………. 346

7.3. Бесконечные вызовы функции…………………………………………………………………………………………. 346

7.4. Функтор с бесконечными вызовами………………………………………………………………………………… 347

Заключение………………………………………………………………………………………….. 349

Предметный указатель…………………………………………………………………………. 351

Добряк Павел Вадимович

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

Опубликовано

Встречайте: “Дата-ориентированное программирование”

Дата-ориентированное программирование

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

Для аналитиков данных, программистов, руководителей команд и преподавателей

Код, одновременно обрабатывающий и данные, и их поведение (такая ситуация обычна в объектно-ориентированном программировании), порой чрезмерно усложняется, и управлять его состоянием становится практически невозможно. Новая парадигма «дата-ориентированное программирование» (DOP – data-oriented programming) решает эту проблему, поскольку здесь данные приложений содержатся в неизменяемых обобщённых структурах, а вычисления над ними выполняются при помощи обобщённых функций. Парадигма DOP, как и ООП, универсальна и не зависит от конкретного языка. Научитесь работать в таком стиле – и в ваших приложениях больше не будет ошибок, связанных с состоянием, станет легче понимать и поддерживать код.

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

В книге рассказано, как:

  • отделить код от данных;
  • заключать информацию в универсальные структуры данных;
  • управлять состоянием, не изменяя данных;
  • управлять конкурентностью в активно масштабируемых системах;
  • писать дата-ориентированные модульные тесты;
  • очерчивать контуры данных.

Книга предназначена для  программистов, имеющих опыт работы с высокоуровневыми языками программирования, в частности, JavaScript, Java, Python, C#, Clojure, Ruby, а также для руководителей и исследователей, решающих широкий спектр задач по обработке данных.

Книгу “Дата-ориентированное программирование” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Вступительное слово………………………………………………………………………………. 13

Введение………………………………………………………………………………………………… 17

Благодарности…………………………………………………………………………………………………………………………… 18

Об этой книге……………………………………………………………………………………………………………………………… 19

Кто должен прочитать эту книгу?……………………………………………………………………………………. 19

Как организована эта книга: дорожная карта………………………………………………………………… 19

О коде………………………………………………………………………………………………………………………………….. 21

Дискуссионный форум liveBook……………………………………………………………………………………….. 22

Об авторе……………………………………………………………………………………………………………………………………. 23

Об иллюстрации на обложке……………………………………………………………………………………………………. 23

Персонажи пьесы……………………………………………………………………………………………………………………….. 23

Часть 1. Гибкость……………………………………………………………………………. 25

Глава 1. Сложность объектно-ориентированного программирования……. 27

1.1. Дизайн ООП: классический или традиционный?…………………………………………………………….. 28

1.1.1. Этап проектирования………………………………………………………………………………………………. 28

1.1.2. UML 101……………………………………………………………………………………………………………………. 30

1.1.3. Объяснение каждой части диаграммы классов…………………………………………………….. 33

Класс Library…………………………………………………………………………………………………………………… 33

Классы Librarian, Member и User………………………………………………………………………………….. 33

Класс Catalog…………………………………………………………………………………………………………………. 35

Класс Book………………………………………………………………………………………………………………………. 35

Класс BookItem……………………………………………………………………………………………………………….. 35

1.1.4. Этап реализации………………………………………………………………………………………………………. 36

1.2. Источники сложности…………………………………………………………………………………………………………. 36

1.2.1. Множество отношений между классами……………………………………………………………….. 38

1.2.2. Непредсказуемое поведение кода…………………………………………………………………………… 40

1.2.3. Нетривиальная сериализация данных…………………………………………………………………… 42

1.2.4. Сложные иерархии классов…………………………………………………………………………………….. 44

Итоги…………………………………………………………………………………………………………………………………………… 48

Глава 2. Разделение кода и данных……………………………………………………….. 51

2.1. Две части системы ДОП……………………………………………………………………………………………………… 52

2.2. Объекты данных………………………………………………………………………………………………………………….. 54

2.3. Модули кода……………………………………………………………………………………………………………………….. 56

2.4. Системы ДОП просты для понимания………………………………………………………………………………. 61

2.5. Системы ДОП являются гибкими……………………………………………………………………………………….. 64

Итоги…………………………………………………………………………………………………………………………………………… 68

Глава 3. Основные манипуляции с данными…………………………………………. 69

3.1. Разработка модели данных……………………………………………………………………………………………….. 70

3.2. Представление записей в виде карт…………………………………………………………………………………… 74

3.3. Манипулирование данными с помощью универсальных функций……………………………….. 81

3.4. Вычисление результатов поиска……………………………………………………………………………………….. 85

3.5. Обработка записей различных типов……………………………………………………………………………….. 93

Итоги…………………………………………………………………………………………………………………………………………… 98

Глава 4. Управление состоянием………………………………………………………….. 101

4.1. Несколько версий системных данных…………………………………………………………………………….. 102

4.2. Структурное совместное использование………………………………………………………………………… 104

4.3. Реализация структурного совместного использования…………………………………………………. 110

4.4. Безопасность данных……………………………………………………………………………………………………….. 112

4.5. Фиксационный этап изменения……………………………………………………………………………………….. 114

4.6. Обеспечение целостности состояния системы……………………………………………………………….. 116

4.7. Восстановление предыдущих состояний……………………………………………………………………….. 117

Итоги…………………………………………………………………………………………………………………………………………. 120

Глава 5. Основы контроля конкурентности…………………………………………. 123

5.1. Оптимистичный контроль конкурентности……………………………………………………………………. 124

5.2. Согласование между конкурентными изменениями………………………………………………………. 126

5.3. Сокращение коллекций…………………………………………………………………………………………………….. 129

5.4. Структурная разница……………………………………………………………………………………………………….. 131

5.5. Имплементация алгоритма согласования………………………………………………………………………. 140

Итоги…………………………………………………………………………………………………………………………………………. 142

Глава 6. Модульные тесты…………………………………………………………………… 145

6.1. Простота дата-ориентированных тестовых кейсов………………………………………………………. 145

6.2. Модульные тесты для кода манипулирования данными……………………………………………… 147

6.2.1. Дерево вызовов функций……………………………………………………………………………………….. 149

6.2.2. Модульные тесты для функций вниз по дереву…………………………………………………… 150

6.2.3. Модульные тесты для узлов в дереве…………………………………………………………………… 154

6.3. Модульные тесты для запросов………………………………………………………………………………………. 157

6.4. Модульные мутационные тесты……………………………………………………………………………………… 162

Движение вперед……………………………………………………………………………………………………………………… 171

Итоги…………………………………………………………………………………………………………………………………………. 172

Часть 2. Масштабируемость……………………………………………………. 175

Глава 7. Основы валидации данных……………………………………………………. 179

7.1. Валидация данных в ДОП………………………………………………………………………………………………… 179

7.2. Суть JSON-схемы………………………………………………………………………………………………………………. 181

7.3. Гибкость и строгость схемы…………………………………………………………………………………………….. 188

7.4. Композиция схемы……………………………………………………………………………………………………………. 193

7.5. Сведения о сбоях при валидации данных………………………………………………………………………. 197

Итоги…………………………………………………………………………………………………………………………………………. 202

Глава 8. Расширенный контроль конкурентности……………………………….. 203

8.1. Сложность блокировок…………………………………………………………………………………………………….. 203

8.2. Потокобезопасный счетчик с атомами…………………………………………………………………………… 205

8.3. Потокобезопасный кеш с атомами………………………………………………………………………………….. 211

8.4. Управление состоянием с помощью атомов…………………………………………………………………… 213

Итоги…………………………………………………………………………………………………………………………………………. 215

Глава 9. Персистентные структуры данных…………………………………………. 217

9.1. Потребность в персистентных структурах данных………………………………………………………. 217

9.2. Эффективность персистентных структур данных…………………………………………………………. 221

9.3. Библиотеки персистентных структур данных……………………………………………………………….. 227

9.3.1. Персистентные структуры данных в Java……………………………………………………………. 228

9.3.2. Персистентные структуры данных в JavaScript………………………………………………….. 229

9.4. Персистентные структуры данных в действии………………………………………………………………. 232

9.4.1. Написание запросов с персистентными структурами данных………………………….. 232

9.4.2. Операции изменения при работе с персистентными структурами данных………. 235

9.4.3. Сериализация и десериализация………………………………………………………………………….. 236

9.4.4. Структурная разница…………………………………………………………………………………………….. 237

Итоги…………………………………………………………………………………………………………………………………………. 240

Глава 10. Операции с базой данных…………………………………………………….. 243

10.1. Извлечение данных из базы данных……………………………………………………………………………… 244

10.2. Хранение данных в базе данных…………………………………………………………………………………… 251

10.3. Простая манипуляция данными…………………………………………………………………………………….. 254

10.4. Продвинутая обработка данных…………………………………………………………………………………… 258

Итоги…………………………………………………………………………………………………………………………………………. 266

Глава 11. Веб-сервисы………………………………………………………………………….. 269

11.1. Другой запрос функции………………………………………………………………………………………………….. 270

11.2. Создание внутренностей, подобных внешностям……………………………………………………….. 270

11.3. Представление запроса клиента в виде карты…………………………………………………………….. 273

11.4. Представление ответа сервера в виде карты……………………………………………………………….. 276

11.5. Дальнейшая передача информации……………………………………………………………………………… 281

11.6. Расширение результатов поиска в действии………………………………………………………………… 284

11.7. Доставка в срок……………………………………………………………………………………………………………….. 295

Итоги…………………………………………………………………………………………………………………………………………. 296

Часть 3. Удобство сопровождения………………………………………… 297

Глава 12. Расширенная проверка данных……………………………………………. 299

12.1. Проверка аргументов функции………………………………………………………………………………………. 299

12.2. Проверка возвращаемого значения………………………………………………………………………………. 308

12.3. Расширенная проверка данных…………………………………………………………………………………….. 310

12.4. Автоматическое создание диаграмм модели данных…………………………………………………. 314

12.5. Автоматическая генерация модульных тестов на основе схемы……………………………….. 316

12.6. Новый подарок……………………………………………………………………………………………………………….. 324

Итоги…………………………………………………………………………………………………………………………………………. 326

Глава 13. Полиморфизм……………………………………………………………………….. 327

13.1. Сущность полиморфизма……………………………………………………………………………………………….. 327

13.2. Мультиметоды с единичной отправкой……………………………………………………………………….. 332

13.3. Мультиметоды с множественной отправкой……………………………………………………………….. 337

13.4. Мультиметоды с динамической отправкой………………………………………………………………….. 343

13.5. Интеграция мультиметодов: производство………………………………………………………………….. 346

Итоги…………………………………………………………………………………………………………………………………………. 351

Глава 14. Расширенная обработка данных…………………………………………… 353

14.1. Обновление значения на карте с помощью выразительности……………………………………. 353

14.2. Манипулирование вложенными данными……………………………………………………………………. 357

14.3. Использование наилучшего инструмента для работы……………………………………………….. 360

14.4. Легкое разматывание……………………………………………………………………………………………………… 365

Итоги…………………………………………………………………………………………………………………………………………. 370

Глава 15. Отладка………………………………………………………………………………… 371

15.1. Детерминизм в программировании……………………………………………………………………………….. 371

15.2. Репродуцируемость с числами и строками………………………………………………………………….. 375

15.3. Репродуцируемость с любыми данными………………………………………………………………………. 379

15.4. Модульные тесты……………………………………………………………………………………………………………. 383

15.5. Работа с внешними источниками данных…………………………………………………………………….. 392

Прощание…………………………………………………………………………………………………………………………………. 394

Итоги…………………………………………………………………………………………………………………………………………. 394

Приложение A. Принципы дата-ориентированного программирования. 397

A.1. Принцип № 1: отделяйте код от данных………………………………………………………………………… 398

A.1.1. Иллюстрация к принципу № 1………………………………………………………………………………. 399

Нарушение принципа № 1 в ООП……………………………………………………………………………….. 399

Нарушение принципа № 1 в ФП………………………………………………………………………………….. 400

Соблюдение принципа № 1 в ООП……………………………………………………………………………… 400

Соблюдение принципа № 1 в ФП………………………………………………………………………………… 401

A.1.2. Преимущества принципа № 1……………………………………………………………………………….. 401

Преимущество № 1: код может быть повторно использован в различных контекстах 402

Преимущество № 2: код может быть протестирован изолированно……………………….. 405

Преимущество № 3: системы, как правило, менее сложны………………………………………. 406

A.1.3. Издержки принципа № 1……………………………………………………………………………………….. 408

Издержка № 1: отсутствие контроля над тем, какой код к каким данным
может получить доступ……………………………………………………………………………………………….. 408

Издержка № 2: отсутствие пакетирования…………………………………………………………………. 408

Издержка № 3: системы состоят из большего количества объектов……………………….. 409

A.1.4. Основная суть принципа № 1……………………………………………………………………………….. 409

A.2. Принцип № 2: представляйте данные с помощью обобщенных структур………………….. 410

A.2.1. Иллюстрация к принципу № 2………………………………………………………………………………. 410

A.2.2. Преимущества принципа № 2……………………………………………………………………………….. 411

Применение функций, которые не ограничены определенным случаем использования……….. 412

Гибкая модель данных…………………………………………………………………………………………………. 412

A.2.3. Издержки принципа № 2……………………………………………………………………………………….. 413

Издержка № 1: снижение производительности………………………………………………………….. 413

Издержка № 2: отсутствие схемы данных………………………………………………………………….. 414

Издержка № 3: отсутствует проверка данных на валидность
во время компиляции……………………………………………………………………………………………………. 414

Издержка № 4: необходимость явного приведения типов………………………………………… 415

A.2.4. Основная суть принципа № 2……………………………………………………………………………….. 416

A.3. Принцип № 3: данные неизменяемы……………………………………………………………………………….. 417

A.3.1. Иллюстрация к принципу № 3………………………………………………………………………………. 417

A.3.2. Преимущества принципа № 3……………………………………………………………………………….. 419

Преимущество № 1: надежный доступ к данным для всех……………………………………….. 419

Преимущество № 2: предсказуемое поведение кода…………………………………………………. 419

Преимущество № 3: быстрая проверка равенства…………………………………………………….. 420

Преимущество № 4: безопасность конкурентности без затрат………………………………… 420

A.3.3. Издержки принципа № 3……………………………………………………………………………………….. 420

Издержка № 1: снижается производительность………………………………………………………… 421

Издержка № 2: требуется библиотека для персистентных структур данных………… 421

A.3.4. Основная суть принципа № 3……………………………………………………………………………….. 421

A.4. Принцип № 4: отделяйте схему данных от представления данных…………………………….. 422

A.4.1. Иллюстрация к принципу № 4………………………………………………………………………………. 422

A.4.2. Преимущества принципа № 4……………………………………………………………………………….. 424

Преимущество № 1: возможность свободно выбирать, какие данные
следует валидировать………………………………………………………………………………………………….. 424

Преимущество № 2: наличие опциональных полей………………………………………………….. 426

Преимущество № 3: наличие расширенных условий валидации данных………………. 428

Преимущество № 4: возможность автоматического создания визуализации модели данных  428

A.4.3. Издержки принципа № 4……………………………………………………………………………………….. 429

Издержка № 1: слабая связь между данными и их схемой……………………………………….. 430

Издержка № 2: небольшое снижение производительности………………………………………. 430

A.4.4. Основная суть принципа № 4……………………………………………………………………………….. 430

Заключение………………………………………………………………………………………………………………………………. 431

Приложение B. Обобщенный доступ к данным
в статически типизированных языках…………………………………………………. 433

B.1. Динамические геттеры для строковых карт…………………………………………………………………… 433

B.1.1. Доступ к невложенным полям карты с помощью динамических геттеров………. 434

B.1.2. Доступ к вложенным полям карты с помощью динамических геттеров…………… 435

B.2. Геттеры значений для карт……………………………………………………………………………………………… 436

B.2.1. Доступ к невложенным полям карты с помощью геттеров значений……………….. 437

B.2.2. Доступ к вложенным полям карты с помощью геттеров значений…………………… 438

B.3. Типизированные геттеры для карт…………………………………………………………………………………. 440

B.3.1. Доступ к невложенным полям карты с помощью типизированных геттеров…… 440

B.3.2. Доступ к вложенным полям карты с помощью типизированных геттеров………. 441

B.4. Обобщенный доступ к членам класса……………………………………………………………………………. 443

B.4.1. Обобщенный доступ к не вложенным членам класса………………………………………… 443

B.4.2. Обобщенный доступ к членам вложенного класса…………………………………………….. 447

B.4.3. Автоматическая сериализация объектов JSON…………………………………………………… 450

Итоги…………………………………………………………………………………………………………………………………………. 451

Приложение C. Дата-ориентированное программирование:
звено в цепи парадигм программирования…………………………………………… 453

C.1. Хронология……………………………………………………………………………………………………………………….. 453

C.1.1. 1958 год: Lisp…………………………………………………………………………………………………………. 453

C.1.2. 1981 год: значения и объекты………………………………………………………………………………. 453

C.1.3. 2000 год: идеальные хеш-деревья………………………………………………………………………… 455

C.1.4. 2006 год: «Из ямы со смолой»………………………………………………………………………………. 455

C.1.5. 2007 год: Clojure…………………………………………………………………………………………………….. 455

C.1.6. 2009 год: неизменяемость для всех………………………………………………………………………. 455

C.2. Принципы ДОП как наилучший подход…………………………………………………………………………. 456

C.2.1. Принцип № 1: отделяйте код от данных……………………………………………………………… 456

C.2.2. Принцип № 2: представляйте данные с помощью обобщенных структур……….. 456

C.2.3. Принцип № 3: данные неизменяемы…………………………………………………………………….. 456

C.2.4. Принцип № 4: отделяйте схему данных от представления данных………………….. 457

C.3. ДОП и другие парадигмы, связанные с данными………………………………………………………….. 458

C.3.1. Дата-ориентированная разработка…………………………………………………………………….. 458

C.3.2. Дата-управляемое программирование………………………………………………………………… 458

C.3.3. Дата-ориентированное программирование (ДОП)…………………………………………….. 459

Итоги…………………………………………………………………………………………………………………………………………. 459

Приложение D. Ссылки на Lodash……………………………………………………….. 461

Йонатан Шарвит

Йонатан Шарвит (Yehonathan Sharvit) более двадцати лет занимается программированием, ведёт блог, выступает на конференциях и проводит семинары по дата-ориентированному подходу во всём мире.

Опубликовано

Новинка: “Параллельное программирование – так ли это сложно?”

Параллельное программирование – так ли это сложно?

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

 Для специалистов по параллельному программированию, Linux, работе с памятью и ресурсами в операционных системах

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

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

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

В книге рассмотрены:

  • Цели параллельного программирования и альтернативы этого подхода
  • Физические и аппаратные ограничения
  • Примитивы и средства конкурентного программирования: блокировки, подсчёт ссылок, синхронизация, мьютексы и др.
  • Отладка конкурентных программ, включая их формальную верификацию
  • Параллельное программирование в режиме реального времени
  • Экстремально низкоуровневые темы: упорядочивание памяти и атомарные операции
  • Примеры практических задач: подсчёт ссылок, выход из лабиринта, связные списки, хеш-таблицы и др.
  • Тенденции развития параллельного программирования
Параллельное программирование

А также

– Более 500 быстрых вопросов для самопроверки
– Более 600 библиографических источников
– Более 1000 страниц

Как читать книгу

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

Книгу “Параллельное программирование – так ли это сложно?” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие к русскому изданию.. 15

От автора. 16

Параллельное программирование: сложно или возможно?. 17

Нормативные положения. 17

Цветные изображения. 18

Глава 1. Как пользоваться этой книгой. 19

1.1 Структура книги. 20

1.2 Экспресс-тесты. 21

1.3 Альтернативы этой книге. 22

1.4 Пример исходного кода. 24

1.5 О чем эта книга?. 24

Глава 2. Введение. 27

2.1 Исторические трудности параллельного программирования. 28

2.2 Цели параллельного программирования. 29

2.2.1 Производительность. 30

2.2.2 Продуктивность. 32

2.2.3 Универсальность. 33

2.3 Альтернативы параллельному программированию.. 37

2.3.1 Несколько экземпляров последовательного приложения. 37

2.3.2 Использование существующего параллельного ПО.. 37

2.3.3 Оптимизация производительности. 38

2.4 Почему параллельное программирование такое сложное?. 39

2.4.1 Разделение работы. 40

2.4.2 Управление параллельным доступом. 41

2.4.3 Разделение и репликация ресурсов. 42

2.4.4 Взаимодействие с оборудованием. 42

2.4.5 Комбинированные возможности. 43

2.4.6 Как языки и среда помогают в решении этих задач?. 43

2.5 Обсуждение. 44

Глава 3. Аппаратное обеспечение и с чем его едят. 45

3.1 Обзор. 45

3.1.1 Конвейерные процессоры. 46

3.1.2 Ссылки на память. 49

3.1.3 Атомарные операции. 50

3.1.4 Барьеры памяти. 51

3.1.5 Промахи кэша. 51

3.1.6 Операции ввода-вывода. 52

3.2 Накладные расходы. 53

3.2.1 Архитектура аппаратной системы. 53

3.2.2 Затраты на операции. 55

3.2.3 Аппаратная оптимизация. 59

3.3 Бесплатные обеды. 60

3.3.1 3D-интеграция. 61

3.3.3 Свет вместо электронов. 62

3.3.4 Ускорители специального назначения. 63

3.3.5 Существующее параллельное программное обеспечение. 64

3.4 Результаты проектирования программного обеспечения. 64

Глава 4. Инструментарий. 66

4.1 Языки сценариев. 66

4.2 Многопроцессорность в системах POSIX.. 68

4.2.1 Создание и уничтожение процессов POSIX.. 68

4.2.2 Создание и уничтожение потоков POSIX.. 71

4.2.3 Блокировка в POSIX.. 72

4.2.4 Блокировка чтения-записи POSIX.. 77

4.2.5 Атомарные операции (GCC Classic) 82

4.2.6 Атомарные операции (C11) 83

4.2.7 Атомарные операции (Современный GCC) 83

4.2.8 Потоковые переменные. 83

4.3 Альтернативы операциям POSIX.. 84

4.3.1 Организация и инициализация. 84

4.3.2 Создание, уничтожение потоков и управление ими. 85

4.3.3 Блокировка. 88

4.3.4 Доступ к общим переменным. 89

4.3.5 Атомарные операции. 102

4.3.6 Переменные для каждого процессора. 103

4.4 Как выбрать подходящий инструмент?. 105

Глава 5. Подсчет. 106

5.1 Что сложного в конкурентном счете?. 107

5.2 Статистические счетчики. 111

5.2.1 Дизайн. 111

5.2.2 Реализация на основе массива. 111

5.2.3 Реализация на основе переменной потока. 113

5.2.4. Реализация с достижимой согласованностью.. 116

5.2.5 Обсуждение. 118

5.3 Приблизительные предельные счетчики. 119

5.3.1 Дизайн. 119

5.3.2 Реализация простого счетчика пределов. 121

5.3.3 Простой счетчик пределов. 127

5.3.4 Реализация приближенного счетчика предельных значений. 128

5.3.5 Приближенный счетчик предельных значений. 129

5.4 Точные счетчики предельных значений. 129

5.4.1 Реализация атомарного предельных значений. 130

5.4.2 Атомарный счетчик предельных значений: обсуждение. 138

5.4.3 Дизайн счетчика предельных значений с кражей сигналов. 138

5.4.4 Реализация счетчика предельных значений на основе кражи сигналов. 139

5.4.5 Счетчик предельных значений с кражей сигналов: обсуждение. 146

5.4.6 Применение точных счетчиков предельных значений. 146

5.5 Обсуждение параллельного подсчета. 148

5.5.1 Валидация параллельного подсчета. 148

5.5.2 Производительность параллельного счета. 149

5.5.3 Специализации параллельного счета. 150

5.5.4 Уроки параллельного подсчета. 151

Глава 6. Проектирование разделения и синхронизации. 154

6.1 Упражнения на разделение. 155

6.1.1 Проблема обедающих философов. 155

6.1.2 Двусторонняя очередь. 157

6.1.3 Пример разделения: обсуждение. 168

6.2 Критерии дизайна. 168

6.3 Детализация синхронизации. 171

6.3.1 Последовательная программа. 172

6.3.2 Кодовая блокировка. 174

6.3.3 Блокировка данных. 175

6.3.4 Владение данными. 178

6.3.5 Детализация и производительность блокировки. 179

6.4 Параллельный быстрый путь. 182

6.4.1 Блокировка чтения-записи. 183

6.4.2 Иерархическая блокировка. 184

6.4.3 Кэши распределителя ресурсов. 185

6.5 Методы без разделения?. 192

6.5.1 Решатель параллельных лабиринтов с очередью работ. 192

6.5.2 Альтернативный решатель параллельного лабиринта. 195

6.5.3 Проверка лабиринта. 198

6.5.4 Сравнение производительности I 198

6.5.5 Альтернативный последовательный решатель лабиринта. 201

6.5.6 Сравнение производительности II 201

6.5.7 Направления дальнейшего развития и выводы. 203

6.6 Разделение, параллелизм и оптимизация. 204

Глава 7. Блокировка. 205

7.1 Остаться в живых. 206

7.1.1 Взаимная блокировка. 206

7.1.2 Динамическая блокировка и голодание. 218

7.1.3 Несправедливость. 220

7.1.4 Неэффективность. 221

7.2 Типы блокировок. 222

7.2.1 Эксклюзивные блокировки. 222

7.2.2 Блокировки чтения-записи. 223

7.2.3 Прочие средства, помимо блокировок чтения-записи. 225

7.2.4 Блокировка с ограниченной областью действия. 226

7.3 Проблемы с реализацией блокировки. 230

7.3.1 Пример реализации эксклюзивной блокировки на основе атомарного обмена. 230

7.3.2 Другие реализации эксклюзивной блокировки. 231

7.4 Гарантии существования на основе блокировки. 234

7.5 Блокировка: герой или злодей?. 237

7.5.1 Блокировка приложений: герой! 237

7.5.2 Блокировка в параллельных библиотеках: еще один инструмент. 238

7.5.3 Блокировка при распараллеливании последовательных библиотек:
злодей! 242

7.6 Резюме. 245

Глава 8. Владение данными. 246

8.1 Несколько процессов. 247

8.2 Частичное владение данными и pthreads 247

8.3 Доставка функций. 248

8.4 Назначенный поток. 249

8.5 Приватизация. 249

8.6 Другие разновидности владения данными. 250

Глава 9. Отложенная обработка. 252

9.1 Пример запуска. 252

9.2 Подсчет ссылок. 255

9.3 Указатели опасности. 259

9.4 Блокировки последовательности. 267

9.5 Механизм Read-Copy-Update (RCU) 274

9.5.1 Введение в RCU.. 275

9.5.2 Основы RCU.. 285

9.5.3 API RCU ядра Linux. 297

9.5.4 Использование RCU.. 314

9.5.5 Работа, связанная с RCU.. 343

9.6 Что же выбрать?. 348

9.6.1 Что выбрать? Обзор. 348

9.6.2 Что выбрать? Подробный обзор. 350

9.6.3 Что выбрать? Использование в производстве. 354

9.7 А что насчет обновлений?. 356

Глава 10. Структуры данных. 357

10.1 Мотивирующее приложение. 357

10.2 Разделяемые структуры данных. 358

10.2.1 Дизайн хэш-таблицы. 358

10.2.2 Реализация хэш-таблицы. 359

10.2.3 Производительность хэш-таблицы. 363

10.3 Структуры данных преимущественно для чтения. 365

10.3.1 Реализация хэш-таблицы с защитой RCU.. 365

10.3.2 Проверка защищенной RCU хэш-таблицы. 367

10.3.3 Производительность защищенной RCU хэш-таблицы. 368

10.3.4 Хэш-таблицы с защитой RCU: обсуждение. 372

10.4 Неразделяемые структуры данных. 374

10.4.1 Дизайн хэш-таблицы с изменяемым размером. 374

10.4.2 Реализация хэш-таблицы с изменяемым размером. 376

10.4.3 Хэш-таблицы изменяемого размера: обсуждение. 385

10.4.4 Другие хэш-таблицы с изменяемым размером. 386

10.5 Прочие структуры данных. 390

10.6 Микрооптимизация. 392

10.6.1 Специализация. 392

10.6.2 Биты и байты. 393

10.6.3 Аппаратные соображения. 394

10.7 Резюме. 396

Глава 11. Валидация. 397

11.1 Введение. 398

11.1.1 Откуда берутся ошибки?. 398

11.1.2 Необходимый образ мышления. 400

11.1.3 Когда должна начинаться валидация?. 402

11.1.4 Путь с открытым исходным кодом. 403

11.2 Трассировка. 405

11.3 Утверждения. 406

11.4 Статический анализ. 407

11.5 Рецензирование кода. 408

11.5.1 Инспекция. 408

11.5.2 Пошаговый разбор. 409

11.5.3 Самопроверка. 409

11.6 Вероятности и гейзенбаги. 412

11.6.1 Статистика в дискретном тестировании. 413

11.6.2 Злоупотребление статистикой для дискретного тестирования. 415

11.6.3 Статистика непрерывного тестирования. 416

11.6.4 Охота на гейзенбаги. 418

11.7 Оценка производительности. 424

11.7.1 Эталонные тесты. 425

11.7.2 Профилирование. 425

11.7.3 Дифференциальное профилирование. 426

11.7.4 Микроэталонные тесты. 426

11.7.5 Изоляция. 428

11.7.6 Обнаружение помех. 429

11.8 Резюме. 434

Глава 12. Формальная верификация. 436

12.1 Поиск в пространстве состояний. 436

12.1.1 Promela и Spin. 437

12.1.2 Как использовать Promela. 443

12.1.3 Пример Promela: блокировка. 447

12.1.4 Пример Promela: QRCU.. 450

12.1.5 Promela Parable: dynticks и RCU с вытесняющим выполнением. 461

12.1.6 Проверка RCU с вытесняющим выполнением и dynticks 467

12.2 Поиск в пространстве состояний специального назначения. 496

12.2.1 Анатомия лакмусовой бумажки. 497

12.2.2 Что означает эта лакмусовая бумажка?. 499

12.2.3 Запуск лакмусовой бумажки. 500

12.2.4 Обсуждение PPCMEM.. 501

12.3 Аксиоматические подходы. 503

12.3.1 Аксиоматические подходы и блокировка. 505

12.3.2 Аксиоматические подходы и RCU.. 507

12.4 SAT-решатели. 511

12.5 Средства проверки моделей без сохранения состояния. 513

12.6 Резюме. 514

12.7 Выбор плана проверки. 516

Глава 13. Собираем все вместе. 520

13.1 Головоломки со счетчиками. 520

13.1.1 Подсчет обновлений. 520

13.1.2 Подсчет поисковых запросов. 521

13.2 Вернемся к подсчету ссылок. 521

13.2.1 Реализация категорий подсчета ссылок. 523

13.2.2 Оптимизации счетчика. 530

13.3 Помощники указателя опасности. 530

13.3.1 Масштабируемый счетчик ссылок. 530

13.4 Блокировка последовательности. 531

13.4.1 Дуэльные блокировки последовательности. 531

13.4.2 Коррелированные элементы данных. 532

13.4.3 Атомарное перемещение. 533

13.4.4 Превращение в писателя. 535

13.5 RCU спешит на помощь. 535

13.5.1 RCU и статистические счетчики на основе переменных потока. 535

13.5.2 RCU и счетчики съемных устройств ввода-вывода. 539

13.5.3 Массив и длина. 540

13.5.4 Коррелированные поля. 542

13.5.5 Удобный для обновления обход. 543

13.5.6 Масштабируемый счетчик ссылок 2. 543

13.5.7 Перезапущенные периоды простоя. 544

Глава 14. Продвинутая синхронизация. 548

14.1 Как избежать блокировки. 548

14.2 Неблокирующая синхронизация. 549

14.2.1 Простой NBS. 550

14.2.2 Применимость преимуществ NBS. 554

14.2.3 Обсуждение NBS. 557

14.3 Параллельные вычисления в реальном времени. 558

14.3.1 Что такое вычисления в реальном времени?. 558

14.3.2 Кому нужен режим реального времени?. 565

14.3.3 Кому нужен параллельный режим реального времени?. 566

14.3.4 Реализация параллельных систем реального времени. 567

14.3.5 Реализация параллельных операционных систем реального времени. 569

14.3.6 Реализация параллельных приложений реального времени. 586

14.3.7. Реальное время против реального быстрого: как выбрать?. 591

Глава 15. Продвинутая синхронизация: порядок памяти. 594

15.1 Упорядочение: зачем и как?. 595

15.1.1 Почему аппаратное обеспечение нарушает порядок?. 596

15.1.2 Как принудительно выполнить упорядочение?. 599

15.1.3 Базовые эмпирические правила. 603

15.2 Трюки и ловушки. 605

15.2.1 Переменные с несколькими значениями. 605

15.2.2 Переупорядочивание ссылок на память. 609

15.2.3 Адресные зависимости. 612

15.2.4 Зависимости данных. 615

15.2.5 Зависимости управления. 616

15.2.6 Когерентность кэша. 618

15.2.7 Атомарность множественных копий. 620

15.3 Ужасы времени компиляции. 635

15.3.1 Ограничения по ссылке на память. 636

15.3.2 Проблемы с зависимостями от адреса и от данных. 637

15.3.3. Проблемы с зависимостями управления. 642

15.4 Примитивы более высокого уровня. 648

15.4.1 Выделение памяти. 648

15.4.2 Блокировка. 649

15.4.3 RCU.. 656

15.5 Особенности аппаратного обеспечения. 670

15.5.1 Alpha. 673

15.5.2 Armv7-A/R. 677

15.5.3 Armv8. 678

15.5.4 Itanium.. 679

15.5.5 MIPS. 680

15.5.6 POWER / PowerPC. 681

15.5.7 SPARC TSO.. 683

15.5.8 x86. 684

15.5.9 z Systems 685

15.6 Где требуется упорядочение памяти?. 685

Глава 16. Простота использования. 688

16.1 Что такое «простота»?. 688

16.2 Шкала Расти при проектировании API 689

16.3 Стрижка множества Мандельброта. 690

Глава 17. Противоречивые взгляды на будущее. 693

17.1 Будущее процессорных технологий стало не таким, каким должно было. 693

17.1.1 Однопроцессорность превыше всего. 695

17.1.2 Потокомания. 695

17.1.3 Атака клонов. 696

17.1.4 Краш-тест о стену памяти. 696

17.1.5 Поразительные ускорители. 698

17.2 Транзакционная память. 698

17.2.1 Внешний мир. 699

17.2.2 Модификация процесса. 704

17.2.3 Синхронизация. 710

17.2.4 Обсуждение. 716

17.3 Аппаратная транзакционная память. 719

17.3.1 Преимущества HTM при блокировке WRT. 720

17.3.2 Слабые стороны HTM по сравнению с блокировкой. 722

17.3.3. Слабые стороны HTM по сравнению с блокировкой и не только. 731

17.3.4 Где лучше всего использовать HTM?. 735

17.3.5 Что может повлиять на ситуацию.. 736

17.3.6 Выводы. 740

17.4 Формальное регрессионное тестирование?. 741

17.4.1 Автоматический перевод. 741

17.4.2 Среда. 743

17.4.3 Накладные расходы. 743

17.4.4 Поиск ошибок. 745

17.4.5 Минимальный набор инструментов. 746

17.4.6 Релевантные ошибки. 747

17.4.7 Формальная система оценки регрессии. 748

17.5 Функциональное программирование в параллелизме. 750

17.6 Резюме. 752

Глава 18. Подведем итоги и наметим перспективы.. 753

Приложение А. Важные вопросы.. 757

А.1 Почему параллельные программы не всегда быстрее?. 757

А.2 Почему бы не убрать блокировку?. 758

А.3 Который сейчас час?. 758

А.4 Что значит «после»?. 760

А.5 Сколь сильным должно быть упорядочение?. 764

А.5.1 Где находятся определяющие данные?. 765

А.5.2 Согласованные данные используются последовательно?. 766

А.5.3 Разделяема ли задача?. 766

А.5.4 А если все это неверно?. 766

А.6 В чем разница между «конкурентным» и «параллельным»?. 767

А.7 Почему программа глючит?. 768

Приложение Б. «Игрушечные» реализации RCU.. 769

Б.1 RCU на основе блокировки. 769

Б.2 RCU на основе блокировки потока. 770

Б.3 Простой RCU на основе счетчика. 772

Б.4 RCU без голодания на основе счетчика. 774

Б.5 Масштабируемый RCU на основе счетчиков. 778

Б.6 Масштабируемый RCU на основе счетчиков с общими периодами простоя. 781

Б.7 RCU на основе автономного счетчика. 784

Б.8 RCU с вложенностью на основе автономного счетчика. 787

Б.9 RCU на основе состояний покоя. 790

Б.10 Краткий обзор «игрушечных» реализаций RCU.. 793

Приложение В. Зачем нужны барьеры памяти?. 795

В.1 Структура кэша. 795

В.2 Протоколы когерентности кэша. 798

В.2.1 Состояние MESI 798

В.2.2 Сообщения протокола MESI 799

В.2.3 Диаграмма состояний MESI 800

В.2.4 Пример протокола MESI 802

В.3 Сохранения порождают ненужные простои. 803

В.3.1 Буферы сохранения. 804

В.3.2 Переадресация хранения. 805

В.3.3. Буферы хранения и барьеры памяти. 806

В.4 Последовательности сохранения приводят к ненужным задержкам. 809

В.4.1 Очереди недействительности. 810

В.4.2 Очереди недействительности и подтверждения недействительности. 810

В.4.3 Очереди недействительности и барьеры памяти. 811

В.5 Чтение и запись барьеров памяти. 814

В.6 Примеры последовательностей барьера памяти. 815

В.6.1 Враждебная порядку архитектура. 815

В.6.2 Пример 1. 816

В.6.3 Пример 2. 817

В.6.4 Пример 3. 818

В.7 Барьеры памяти с нами навсегда?. 818

В.8 Советы разработчикам аппаратного обеспечения. 819

Приложение Г. Ответы на быстрые тесты.. 821

Г.1 Как пользоваться этой книгой. 821

Г.2 Введение. 822

Г.3 Аппаратное обеспечение и его привычки. 829

Г.4 Инструментарий. 835

Г.5 Подсчет. 845

Г.6 Разбиение на разделы и синхронизация. 868

Г.7 Блокировка. 877

Г.8 Владение данными. 889

Г.9 Отложенная обработка. 891

Г.10 Структуры данных. 915

Г.11 Проверка. 924

Г.12 Формальная верификация. 935

Г.13 Собираем все вместе. 947

Г.14 Продвинутая синхронизация. 953

Г.15 Продвинутая синхронизация:  упорядочение памяти. 956

Г.16 Простота использования. 976

Г.17 Противоречивые взгляды на будущее. 977

Г.18 Важные вопросы. 987

Г.19 «Игрушечные» реализации RCU.. 988

Г.20 Зачем нужны барьеры памяти?. 998

Глоссарий. 1004

Библиография. 1014

Благодарности. 1058

Советник LATEX.. 1058

Рецензенты. 1058

Владельцы машин. 1059

Оригинальные публикации. 1059

Авторство рисунков. 1060

Прочая поддержка. 1061

Акронимы.. 1062

Предметный указатель. 1063

Указатель API 1070

Paul Mckenney

Пол Маккинни (Paul Mckenney) — профессор, ведущий специалист по поддержке ядра Linux (функционал RCU), член комитета по стандартизации ISO SC22 WG21 (C++), один из авторов действующей в Linux модели памяти. Сфера научных интересов: технологии валидации и надёжная реализация сложных конкурентных вычислений. Более 50 лет занимается программированием, в том числе 30 лет исследует параллельное программирование. Автор более 200 публикаций и обладатель 150 патентов на различные разработки в области информатики. Является активным контрибьютором ядра Linux.

Опубликовано

Новинка: “Объектно-ориентированное программирование: с нуля к SOLID и MVC””

Объектно-ориентированное программирование: с нуля к SOLID и MVC

Базовая книга по приёмам объектно-ориентированного программирования (ООП) с примерами на языке C++. Разобраны основные принципы и техники разработки объектно-ориентированных программ, объяснены шаблоны проектирования (паттерны), особое внимание уделено принципам SOLID, архитектуре MVC (модель-представление-контроллер) и особенностям работы с ООП в С++.

Для начинающих разработчиков, специалистов по C++, студентов вузов

MVC и SOLID для уверенного понимания паттернов проектирования

Вот уже более 30 лет объектно-ориентированное программирование (ООП) остаётся основной парадигмой разработки программного обеспечения, доминирующей в академической информатике и в прикладном программировании на C++, Java, C#, Python и других языках, лидирующих в рейтинге TIOBE. При этом многие современные книги по ООП представляют собой огромные фолианты и не подходят для базового изучения этой темы.

Данная книга, написанная на основе многолетних наработок автора в преподавании и индустрии программного обеспечения, раскрывает тему ООП максимально доступно и просто. Кроме базовых основ ООП, книга описывает паттерны проектирования, принципы SOLID, архитектуру MVC (модель-представление-контроллер), а также затрагивает особенности ООП в языке С++.
Материал подходит в качестве вводной книги по ООП. Книга будет интересна студентам, осваивающим C++ и ООП, но и опытные специалисты тоже найдут в ней интересные детали об использовании паттернов проектирования.

Вы узнаете, как:

– инкапсулировать данные и код в объекты,
– работать с объектами в С++ и других востребованных языках,
– управлять композицией и взаимодействием объектов,
– управлять временем жизни объектов,
– использовать паттерны проектирования,
– применять принципы SOLID,
– создавать событийно-ориентированные приложения,
– решать задачи с помощью архитектуры MVC.

Книгу “Объектно-ориентированное программирование: с нуля к SOLID и MVC” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Посвящения и благодарности……………………………………………………………… 5

Введение……………………………………………………………………………………………… 7

Некоторые обозначения и сокращения………………………………………………………………………………… 7

Что это и для кого…………………………………………………………………………………………………………………… 7

Зачем это всё…………………………………………………………………………………………………………………………… 8

Методическая проблема……………………………………………………………………………………………………….. 9

Глава 1. Основы ООП……………………………………………………………………….. 11

1.1. Основные понятия…………………………………………………………………………………………………………. 11

1.2. Хватит бла-бла-бла, давайте уже код!………………………………………………………………………… 16

1.3. Определение классов и создание объектов…………………………………………………………………. 17

1.4. Работа с объектами……………………………………………………………………………………………………….. 20

1.5. Методы…………………………………………………………………………………………………………………………… 23

1.6. Сокрытие свойств и методов………………………………………………………………………………………… 26

1.7. Конструкторы и деструкторы, жизненный цикл объектов………………………………………… 29

1.8. Наследование………………………………………………………………………………………………………………… 38

1.9. Расширение и изменение объектов при наследовании………………………………………………. 45

1.10. Композиция………………………………………………………………………………………………………………….. 46

1.11. Глубокое и поверхностное копирование, value- и reference-семантика…………………. 51

1.12. Наследование, композиция, агрегация, ассоциация, зависимость…………………………. 52

1.13. Диаграммы классов, последовательностей, состояний и прочий UML…………………. 55

1.14. Композиция или наследование?………………………………………………………………………………… 60

1.15. Помещение объектов в переменные различных типов…………………………………………….. 63

1.16. Полиморфизм……………………………………………………………………………………………………………….. 66

1.17. Приведение типов………………………………………………………………………………………………………… 74

1.18. Передача и возврат объектов из функций в C++………………………………………………………. 83

1.19. Проблемы работы с памятью и не только, в C++ и не только…………………………………. 87

1.20. Технологии и практики управления долгоживущими объектами в C++………………… 90

Глава 2. Приемы ООП……………………………………………………………………….. 99

2.1. Демистификация паттернов ООП…………………………………………………………………………………. 99

2.2. Обычные приемы и антиприемы ООП, паттерны и антипаттерны…………………………. 100

2.3. Template Method………………………………………………………………………………………………………….. 103

2.4. Prototype……………………………………………………………………………………………………………………….. 106

2.5. Бесклассовое (прототипно-ориентированное) ООП………………………………………………… 109

2.6. Интерфейсы………………………………………………………………………………………………………………….. 110

2.7. Множественное наследование…………………………………………………………………………………… 113

2.8. Примеси (миксины, mixins)…………………………………………………………………………………………. 115

2.9. Singleton………………………………………………………………………………………………………………………… 116

2.10. Chain of Responsibility……………………………………………………………………………………………….. 119

2.11. Делегирование, объектная шизофрения………………………………………………………………….. 126

2.12. Strategy……………………………………………………………………………………………………………………….. 130

2.13. Adapter……………………………………………………………………………………………………………………….. 135

2.14. Iterator………………………………………………………………………………………………………………………… 142

2.15. Шаблоны C++. Осторожно по минному полю………………………………………………………… 150

2.16. Стандартные контейнеры STL…………………………………………………………………………………. 152

2.17. Decorator…………………………………………………………………………………………………………………….. 154

2.18. Proxy…………………………………………………………………………………………………………………………… 160

2.19. Composite…………………………………………………………………………………………………………………… 163

2.20. Observer сам по себе и как пример mixin…………………………………………………………………. 167

2.21. Command…………………………………………………………………………………………………………………… 171

2.22. Factory Method, Abstract Factory……………………………………………………………………………… 179

2.23. Abstract Factory еще раз……………………………………………………………………………………………. 187

2.24. Memento…………………………………………………………………………………………………………………….. 190

2.25. Bridge………………………………………………………………………………………………………………………….. 193

2.26. Visitor………………………………………………………………………………………………………………………….. 201

2.27. Одинарная и двойная диспетчеризация………………………………………………………………….. 209

2.28. SOLID-принципы……………………………………………………………………………………………………….. 211

2.29. Объектная интроспекция и рефлексия…………………………………………………………………….. 221

2.30. Событийно-управляемое приложение: событие, типы событий, сообщение, обработчик, механизм обмена сообщениями, очередь сообщений…………………………………………………………………………………………………… 225

2.31. Архитектура Model-View-Controller (MVC) и ее варианты.
Самый простой способ ее нарушить и исправить………………………………………………….. 237

Приложение. Ликбез по переменным и указателям в C++………………… 249

П.1. Обозначения………………………………………………………………………………………………………………… 249

П.2. Краткое описание объявления и примеры использования……………………………………… 249

П.3. Полное описание………………………………………………………………………………………………………… 250

П.3.1. Переменная………………………………………………………………………………………………………. 250

П.3.2. Память………………………………………………………………………………………………………………. 251

П.3.3. Адрес переменной……………………………………………………………………………………………. 252

П.3.4. Переменные-указатели……………………………………………………………………………………. 253

П.3.5. Операции с указателями…………………………………………………………………………………. 256

П.3.6. Массивы……………………………………………………………………………………………………………. 257

П.3.7. Ссылки………………………………………………………………………………………………………………. 259

П.4. Вопросы для самоконтроля……………………………………………………………………………………….. 262

Список литературы………………………………………………………………………….. 265

Предметный указатель…………………………………………………………………….. 267

Макеев Григорий Анатольевич

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

Опубликовано

Встречайте 2-е издание книги: “Программирование инфраструктуры”

Программирование инфраструктуры. 2-е издание

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

Для системных администраторов, инженеров по облачным сервисам, программистов,  DevOps-специалистов

Практики IaC постепенно развивались от поддержки серверов до управления полнофункциональными стеками. Но за новые возможности приходится расплачиваться усложнением систем. Эта книга позволит вам не только освоить паттерны проектирования облачных систем, но и вывести автоматизацию серверов на новый уровень.
Патрик Дебуа, основатель конференции DevOpsDays

Как создаются адаптивные облачные системы

Ещё несколько лет назад тема программируемой инфраструктуры (Infrastructure as Code – IaC) была в новинку. Но сегодня даже самые консервативные организации, например крупные банки, постепенно переносят инфраструктуру в облака, и становится важно поддерживать её конфигурацию в виде обширных баз кода.

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

В книге рассмотрены:

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

Книгу “Программирование инфраструктуры. 2-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 18

Зачем я написал эту книгу………………………………………………………………………………………………………… 19

Что нового и особенного во втором издании…………………………………………………………………………… 19

Что дальше…………………………………………………………………………………………………………………………………. 21

Чего ожидать и чего не стоит ожидать от этой книги…………………………………………………………….. 21

Исторический контекст программирования инфраструктуры………………………………………………. 22

Для кого эта книга……………………………………………………………………………………………………………………… 22

Принципы, практики, паттерны………………………………………………………………………………………………… 23

Примеры с ShopSpinner……………………………………………………………………………………………………………… 24

Соглашения, используемые в книге………………………………………………………………………………………….. 24

Благодарности…………………………………………………………………………………………………………………………… 25

Часть I. Основы……………………………………………………………………………….. 27

Глава 1. Что такое программирование инфраструктуры………………………… 29

Из железного века в облачный………………………………………………………………………………………………….. 30

Программирование инфраструктуры………………………………………………………………………………………. 31

Достоинства программирования инфраструктуры………………………………………………………………… 32

Программирование инфраструктуры как оптимизация в расчете на изменения…………………. 32

Возражение: «мы не так часто вносим изменения, поэтому их автоматизация не столь нужна»            33

Возражение: «сначала систему нужно построить, а уже потом автоматизировать». 34

Возражение: «приходится выбирать между скоростью и качеством»………………………. 35

Четыре ключевые метрики………………………………………………………………………………………………………… 37

Три ключевые практики для программирования инфраструктуры………………………………………. 37

Ключевая практика: все определяется как код……………………………………………………………. 38

Ключевая практика: вся текущая работа непрерывно тестируется и сдается…………. 38

Ключевая практика: создаются небольшие простые фрагменты, которые поддаются изменениям независимо друг от друга………………………………………………………………………………………………………………………………… 39

Заключение………………………………………………………………………………………………………………………………… 39

Глава 2. Инфраструктурные принципы для облачного века………………….. 40

Принцип: исходим из того, что системы ненадежны……………………………………………………………… 40

Принцип: все нужно делать воспроизводимым………………………………………………………………………. 41

Западня: системы-снежинки……………………………………………………………………………………………………… 42

Принцип: создавайте такие компоненты, которые легко пустить в расход…………………………. 43

Принцип: минимизируем вариативность…………………………………………………………………………………. 44

Конфигурационная энтропия………………………………………………………………………………………… 45

Принцип: убедитесь, что любой процесс сможете повторить……………………………………………….. 47

Заключение………………………………………………………………………………………………………………………………… 48

Глава 3. Инфраструктурные платформы………………………………………………… 49

Из каких частей состоит инфраструктурная система…………………………………………………………….. 49

Инфраструктурные платформы……………………………………………………………………………………………….. 51

Инфраструктурные ресурсы…………………………………………………………………………………………………….. 53

Вычислительные ресурсы……………………………………………………………………………………………… 54

Ресурсы для хранения данных………………………………………………………………………………………. 55

Сетевые ресурсы…………………………………………………………………………………………………………….. 56

Заключение………………………………………………………………………………………………………………………………… 59

Глава 4. Ключевая практика: все определяется как код………………………… 60

Зачем следует определять инфраструктуру так, чтобы ее можно было программировать.. 60

Что можно определить как код…………………………………………………………………………………………………. 61

Выбирайте инструменты, конфигурация которых вынесена наружу……………………….. 61

Управление вашим кодом в системе контроля версий………………………………………………… 62

Языки для программирования инфраструктуры…………………………………………………………………….. 63

Скрипты для обслуживания инфраструктуры…………………………………………………………….. 64

Декларативные инфраструктурные языки…………………………………………………………………… 66

Программируемые императивные инфраструктурные языки…………………………………….. 68

Сравнение декларативных и императивных языков в контексте инфраструктуры…. 69

Предметно-ориентированные инфраструктурные языки……………………………………………. 69

Языки общего назначения в сравнении с инфраструктурными DSL…………………………. 71

Принципы реализации при определении инфраструктуры, которую планируется программировать              71

Разделяем декларативный и императивный код………………………………………………………….. 72

Обращайтесь с инфраструктурным кодом точно как с «настоящим»……………………….. 72

Заключение………………………………………………………………………………………………………………………………… 73

Часть II. Работа с инфраструктурными стеками………………. 75

Глава 5. Программирование инфраструктурных стеков………………………… 77

Что такое инфраструктурный стек…………………………………………………………………………………………… 77

Код стека…………………………………………………………………………………………………………………………. 78

Инстанс стека………………………………………………………………………………………………………………….. 79

Конфигурирование серверов в стеке…………………………………………………………………………….. 79

Низкоуровневые инфраструктурные языки…………………………………………………………………. 80

Высокоуровневые инфраструктурные языки………………………………………………………………. 81

Паттерны и антипаттерны структурирования стеков……………………………………………………………. 82

Антипаттерн: монолитный стек…………………………………………………………………………………….. 82

Зачем это нужно…………………………………………………………………………………………………….. 82

Применимость…………………………………………………………………………………………………………. 83

Последствия……………………………………………………………………………………………………………. 83

Внедрение……………………………………………………………………………………………………………….. 84

Смежные паттерны………………………………………………………………………………………………… 84

Паттерн: стек группы приложений……………………………………………………………………………….. 84

Зачем это нужно…………………………………………………………………………………………………….. 85

Применимость…………………………………………………………………………………………………………. 85

Последствия……………………………………………………………………………………………………………. 85

Внедрение……………………………………………………………………………………………………………….. 86

Смежные паттерны………………………………………………………………………………………………… 86

Паттерн: сервисный стек……………………………………………………………………………………………….. 86

Зачем это нужно…………………………………………………………………………………………………….. 86

Применимость…………………………………………………………………………………………………………. 87

Последствия……………………………………………………………………………………………………………. 87

Внедрение……………………………………………………………………………………………………………….. 87

Смежные паттерны………………………………………………………………………………………………… 87

Паттерн: микростек………………………………………………………………………………………………………… 87

Зачем это нужно…………………………………………………………………………………………………….. 88

Последствия……………………………………………………………………………………………………………. 88

Внедрение……………………………………………………………………………………………………………….. 88

Смежные паттерны………………………………………………………………………………………………… 88

Заключение………………………………………………………………………………………………………………………………… 88

Глава 6. Создание окружений с помощью стеков…………………………………… 89

Зачем вообще нужны окружения……………………………………………………………………………………………… 89

Окружения для доставки………………………………………………………………………………………………… 89

Множество продакшен-окружений………………………………………………………………………………. 90

Окружения, согласованность и конфигурация…………………………………………………………….. 91

Паттерны построения окружений…………………………………………………………………………………………….. 92

Антипаттерн: один стек на несколько окружений………………………………………………………. 92

Зачем это нужно…………………………………………………………………………………………………….. 92

Последствия……………………………………………………………………………………………………………. 93

Смежные паттерны………………………………………………………………………………………………… 93

Антипаттерн: копирование и вставка окружения……………………………………………………….. 94

Зачем это нужно…………………………………………………………………………………………………….. 94

Применимость…………………………………………………………………………………………………………. 94

Последствия……………………………………………………………………………………………………………. 94

Внедрение……………………………………………………………………………………………………………….. 95

Смежные паттерны………………………………………………………………………………………………… 95

Паттерн: переиспользуемый стек………………………………………………………………………………….. 95

Зачем это нужно…………………………………………………………………………………………………….. 96

Применимость…………………………………………………………………………………………………………. 97

Последствия……………………………………………………………………………………………………………. 97

Внедрение……………………………………………………………………………………………………………….. 97

Смежные паттерны………………………………………………………………………………………………… 97

Построение окружений с использованием множества стеков……………………………………………….. 98

Заключение………………………………………………………………………………………………………………………………… 99

Глава 7. Конфигурирование инстансов стеков…………………………………….. 100

Использование параметров стека для создания уникальных идентификаторов………………. 101

Пример параметров стека……………………………………………………………………………………………………….. 102

Паттерны конфигурирования стеков……………………………………………………………………………………… 103

Антипаттерн: установка параметров стека вручную……………………………………………….. 103

Зачем это нужно…………………………………………………………………………………………………… 103

Последствия………………………………………………………………………………………………………….. 104

Внедрение……………………………………………………………………………………………………………… 104

Смежные паттерны………………………………………………………………………………………………. 104

Паттерн: переменные окружения стека……………………………………………………………………… 105

Зачем это нужно…………………………………………………………………………………………………… 105

Применимость………………………………………………………………………………………………………. 105

Последствия………………………………………………………………………………………………………….. 105

Внедрение……………………………………………………………………………………………………………… 106

Смежные паттерны………………………………………………………………………………………………. 107

Паттерн: скрипты для ввода параметров…………………………………………………………………… 107

Зачем это нужно…………………………………………………………………………………………………… 107

Применимость………………………………………………………………………………………………………. 107

Последствия………………………………………………………………………………………………………….. 108

Внедрение……………………………………………………………………………………………………………… 108

Смежные паттерны………………………………………………………………………………………………. 110

Паттерн: конфигурационные файлы стека………………………………………………………………… 110

Зачем это нужно…………………………………………………………………………………………………… 110

Применимость………………………………………………………………………………………………………. 111

Последствия………………………………………………………………………………………………………….. 111

Внедрение……………………………………………………………………………………………………………… 111

Смежные паттерны………………………………………………………………………………………………. 113

Паттерн: стек-обертка………………………………………………………………………………………………….. 113

Зачем это нужно…………………………………………………………………………………………………… 114

Последствия………………………………………………………………………………………………………….. 114

Внедрение……………………………………………………………………………………………………………… 115

Смежные паттерны………………………………………………………………………………………………. 116

Паттерн: конвейеризация параметров стека……………………………………………………………… 116

Зачем это нужно…………………………………………………………………………………………………… 117

Применимость………………………………………………………………………………………………………. 117

Последствия………………………………………………………………………………………………………….. 117

Внедрение……………………………………………………………………………………………………………… 118

Смежные паттерны………………………………………………………………………………………………. 119

Паттерн: реестр параметров стека……………………………………………………………………………… 119

Зачем это нужно…………………………………………………………………………………………………… 120

Применимость………………………………………………………………………………………………………. 120

Последствия………………………………………………………………………………………………………….. 120

Внедрение……………………………………………………………………………………………………………… 121

Смежные паттерны………………………………………………………………………………………………. 122

Конфигурационный реестр…………………………………………………………………………………………………….. 122

Внедрение конфигурационного реестра…………………………………………………………………….. 123

Реестры инструмента, предназначенного для автоматизации инфраструктуры 123

Продукты, которые могут послужить конфигурационным реестром
общего назначения………………………………………………………………………………………………. 123

Сервисы реестра, предоставляемые на платформе………………………………………….. 124

Конфигурационные реестры «сделай сам»……………………………………………………….. 124

Один или множество конфигурационных реестров…………………………………………………… 125

Обращение с секретами как с параметрами………………………………………………………………………….. 125

Шифрование секретов………………………………………………………………………………………………….. 126

Несекретная авторизация……………………………………………………………………………………………. 126

Инъекция секретов во время выполнения…………………………………………………………………… 127

Одноразовые секреты…………………………………………………………………………………………………… 127

Заключение………………………………………………………………………………………………………………………………. 128

Глава 8. Ключевая практика: непрерывное тестирование и доставка….. 129

Зачем непрерывно тестировать инфраструктурный код……………………………………………………… 130

Что такое непрерывное тестирование………………………………………………………………………… 130

Что следует тестировать на уровне инфраструктуры………………………………………………. 132

Сложности с тестированием инфраструктурного кода……………………………………………………….. 134

Проблема: тесты для декларативного кода обычно не слишком ценны…………………. 135

Тестирование изменчивого декларативного кода…………………………………………….. 136

Тестирование сочетаний декларативного кода………………………………………………… 137

Проблема: тестирование инфраструктурного кода идет медленно………………………… 137

Проблема: зависимости усложняют тестовую инфраструктуру……………………………… 139

Прогрессивное тестирование………………………………………………………………………………………………….. 140

Тестовая пирамида………………………………………………………………………………………………………. 141

Модель тестирования по принципу швейцарского сыра………………………………………….. 143

Конвейеры доставки для работы с инфраструктурой………………………………………………………….. 144

Этапы работы конвейера…………………………………………………………………………………………….. 145

Масштаб компонентов, тестируемых на этапе…………………………………………………………. 146

Масштаб зависимостей, используемых на этапе конвейера……………………………………. 146

Платформенные элементы, требуемые на этапе конвейера…………………………………….. 147

Программы и сервисы для организации конвейера доставки………………………………….. 148

Тестирование в продакшене…………………………………………………………………………………………………… 150

Что невозможно воспроизвести вне продакшена………………………………………………………. 151

Управление рисками тестирования в продакшене……………………………………………………. 152

Заключение………………………………………………………………………………………………………………………………. 153

Глава 9. Тестирование инфраструктурных стеков……………………………….. 154

Пример инфраструктуры………………………………………………………………………………………………………… 154

Пример стека…………………………………………………………………………………………………………………. 155

Пример стека и конвейер для него………………………………………………………………………………. 156

Офлайновые этапы тестирования стеков………………………………………………………………………………. 156

Проверка синтаксиса……………………………………………………………………………………………………. 157

Офлайновый статический анализ кода………………………………………………………………………. 157

Статический анализ кода с применением API…………………………………………………………… 158

Тестирование с применением имитационного API……………………………………………………. 158

Онлайновые этапы тестирования стеков………………………………………………………………………………. 159

Предпросмотр: проверяем, какие изменения могут быть внесены…………………………… 160

Верификация: выдвижение гипотез об инфраструктурных ресурсах……………………… 161

Результаты: убеждаемся, что инфраструктура работает корректно………………………. 162

Использование тестовых контекстов для обращения с зависимостями……………………………… 163

Тестовые двойники для восходящих зависимостей…………………………………………………… 164

Тестовые контексты для нисходящих зависимостей…………………………………………………. 165

Проводим рефакторинг компонентов так, чтобы их легко было изолировать……….. 167

Паттерны жизненного цикла для тестовых инстансов стеков…………………………………………….. 167

Паттерн: персистентный тестовый стек……………………………………………………………………… 168

Зачем это нужно…………………………………………………………………………………………………… 168

Применимость………………………………………………………………………………………………………. 168

Последствия………………………………………………………………………………………………………….. 168

Внедрение……………………………………………………………………………………………………………… 169

Смежные паттерны………………………………………………………………………………………………. 169

Паттерн: эфемерный тестовый стек……………………………………………………………………………. 169

Зачем это нужно…………………………………………………………………………………………………… 170

Применимость………………………………………………………………………………………………………. 170

Последствия………………………………………………………………………………………………………….. 170

Внедрение……………………………………………………………………………………………………………… 170

Смежные паттерны………………………………………………………………………………………………. 170

Антипаттерн: сдвоенные этапы с персистентными и эфемерными стеками…………… 170

Зачем это нужно…………………………………………………………………………………………………… 171

Применимость………………………………………………………………………………………………………. 171

Последствия………………………………………………………………………………………………………….. 171

Внедрение……………………………………………………………………………………………………………… 171

Смежные паттерны………………………………………………………………………………………………. 172

Паттерн: периодическая пересборка стека……………………………………………………………….. 172

Зачем это нужно…………………………………………………………………………………………………… 172

Применимость………………………………………………………………………………………………………. 172

Последствия………………………………………………………………………………………………………….. 172

Внедрение……………………………………………………………………………………………………………… 173

Смежные паттерны………………………………………………………………………………………………. 173

Паттерн: серийный сброс стека………………………………………………………………………………….. 173

Зачем это нужно…………………………………………………………………………………………………… 174

Применимость………………………………………………………………………………………………………. 174

Последствия………………………………………………………………………………………………………….. 174

Внедрение……………………………………………………………………………………………………………… 174

Смежные паттерны………………………………………………………………………………………………. 174

Оркестрация тестов…………………………………………………………………………………………………………………. 175

Поддержка локального тестирования………………………………………………………………………… 175

Избегайте плотного связывания с инструментами конвейера………………………………….. 176

Инструменты оркестрации тестов………………………………………………………………………………. 176

Заключение………………………………………………………………………………………………………………………………. 177

Часть III. Работа с серверами и другими платформами исполнения приложений…………………………………………………………………………………… 179

Глава 10. Среды выполнения приложений…………………………………………… 181

Исходно облачная инфраструктура под потребности приложений…………………………………… 182

Цели для сред исполнения приложений………………………………………………………………………………… 183

Развертываемые части приложения……………………………………………………………………………. 183

Пакеты для развертывания………………………………………………………………………………………….. 184

Развертывание приложений на серверах………………………………………………………………………………. 185

Упаковка приложений в контейнерах………………………………………………………………………… 185

Развертывание приложений в серверных кластерах………………………………………………… 186

Развертывание приложений в кластерах приложений…………………………………………………………. 187

Пакеты для развертывания приложений в кластерах………………………………………………………….. 188

Развертывание серверного приложения по модели FaaS…………………………………………………….. 190

Данные приложений………………………………………………………………………………………………………………… 190

Структуры и схемы данных………………………………………………………………………………………… 191

Исходно облачная инфраструктура для хранения приложений……………………………… 192

Соединяемость приложений…………………………………………………………………………………………………… 192

Обнаружение сервисов……………………………………………………………………………………………………………. 193

Заключение………………………………………………………………………………………………………………………………. 195

Глава 11. Сборка серверов в коде…………………………………………………………. 196

Что на сервере………………………………………………………………………………………………………………………….. 197

Откуда что берется………………………………………………………………………………………………………………….. 198

Код для конфигурации сервера………………………………………………………………………………………………. 199

Модули кода для конфигурации сервера…………………………………………………………………… 200

Проектирование модулей для конфигурации серверного кода……………………………….. 201

Версионирование и продвижение серверного кода………………………………………………….. 202

Серверные роли……………………………………………………………………………………………………………. 203

Тестирование серверного кода………………………………………………………………………………………………. 204

Прогрессивное тестирование серверного кода………………………………………………………….. 204

Что тестировать в серверном коде………………………………………………………………………………. 205

Как тестировать серверный код………………………………………………………………………………….. 206

Создание нового серверного инстанса………………………………………………………………………………….. 207

Сборка нового серверного инстанса вручную………………………………………………………….. 208

Создаем сервер с помощью скрипта…………………………………………………………………………… 209

Создание сервера с помощью инструмента управления стеком……………………………… 209

Конфигурирование платформы для автоматического создания серверов……………… 210

Как собрать сервер с помощью сетевого инструмента предоставления ресурсов… 211

Заблаговременная сборка серверов………………………………………………………………………………………. 212

Горячее клонирование сервера…………………………………………………………………………………… 212

Использование серверного снимка……………………………………………………………………………… 213

Создание чистого серверного образа…………………………………………………………………………. 213

Конфигурирование нового серверного инстанса…………………………………………………………………. 214

Зажаривание серверного инстанса…………………………………………………………………………….. 215

Выпекание серверных образов……………………………………………………………………………………. 216

Комбинируем выпекание и зажаривание…………………………………………………………………… 216

Применение серверной конфигурации при создании сервера………………………………….. 217

Заключение………………………………………………………………………………………………………………………………. 218

Глава 12. Управление изменениями, поступающими на серверы…………. 219

Паттерны управления изменениями: когда применять изменения………………………………………. 220

Антипаттерн: применять по факту изменений…………………………………………………………… 220

Зачем это нужно…………………………………………………………………………………………………… 220

Применимость………………………………………………………………………………………………………. 221

Последствия………………………………………………………………………………………………………….. 221

Внедрение……………………………………………………………………………………………………………… 221

Смежные паттерны………………………………………………………………………………………………. 221

Паттерн: непрерывная синхронизация конфигурации……………………………………………… 222

Зачем это нужно…………………………………………………………………………………………………… 222

Применимость………………………………………………………………………………………………………. 223

Последствия………………………………………………………………………………………………………….. 223

Внедрение……………………………………………………………………………………………………………… 223

Смежные паттерны………………………………………………………………………………………………. 223

Паттерн: неизменяемый сервер…………………………………………………………………………………… 224

Зачем это нужно…………………………………………………………………………………………………… 224

Применимость………………………………………………………………………………………………………. 224

Последствия………………………………………………………………………………………………………….. 224

Внедрение……………………………………………………………………………………………………………… 225

Смежные паттерны………………………………………………………………………………………………. 225

Как применять код конфигурации сервера……………………………………………………………………………. 226

Паттерн: конфигурация сервера методом push…………………………………………………………. 226

Зачем это нужно…………………………………………………………………………………………………… 226

Применимость………………………………………………………………………………………………………. 226

Последствия………………………………………………………………………………………………………….. 227

Внедрение……………………………………………………………………………………………………………… 227

Смежные паттерны………………………………………………………………………………………………. 228

Паттерн: конфигурация сервера методом pull…………………………………………………………… 228

Зачем это нужно…………………………………………………………………………………………………… 228

Применимость………………………………………………………………………………………………………. 229

Внедрение……………………………………………………………………………………………………………… 229

Смежные паттерны………………………………………………………………………………………………. 230

Другие события серверного жизненного цикла…………………………………………………………………….. 230

Останов и перезапуск серверного инстанса………………………………………………………………. 231

Замена серверного инстанса……………………………………………………………………………………….. 232

Восстановление отказавшего сервера……………………………………………………………………….. 233

Заключение………………………………………………………………………………………………………………………………. 234

Глава 13. Образы серверов как код……………………………………………………… 235

Сборка серверного образа……………………………………………………………………………………………………… 235

Зачем собирать серверный образ……………………………………………………………………………….. 236

Как собрать серверный образ……………………………………………………………………………………… 237

Инструменты для сборки серверных образов……………………………………………………………. 237

Процесс онлайновой сборки образа…………………………………………………………………………… 238

Инфраструктура для сборочного инстанса………………………………………………………. 239

Конфигурирование сборочного инстанса…………………………………………………………. 239

Процесс офлайновой сборки образа…………………………………………………………………………… 241

Исходное содержимое для серверного образа……………………………………………………………………… 242

Сборка на основе стандартного серверного образа…………………………………………………. 243

Сборка серверного образа с нуля……………………………………………………………………………….. 243

Происхождение серверного образа и его содержимое……………………………………………… 243

Изменение серверного образа………………………………………………………………………………………………… 244

Разогреть или испечь свежий?…………………………………………………………………………………….. 244

Версионирование серверного образа…………………………………………………………………………. 245

Обновление серверных инстансов при изменении образа……………………………………….. 247

Предоставление серверного образа для совместного использования несколькими командами              248

Как работать с крупными изменениями, вносимыми в образ…………………………………… 249

Использование конвейера для тестирования и доставки серверного образа…………………….. 250

Стадия сборки серверного образа………………………………………………………………………………. 250

Стадия тестирования серверного образа…………………………………………………………………… 252

Стадии доставки серверного образа………………………………………………………………………….. 253

Использование множества серверных образов…………………………………………………………………….. 253

Серверные образы для разных инфраструктурных платформ………………………………… 254

Серверные образы для разных операционных систем……………………………………………… 254

Серверные образы для разных аппаратных архитектур…………………………………………. 254

Серверные образы для разных ролей…………………………………………………………………………. 255

Многослойное расположение серверных образов……………………………………………………. 255

Совместное использование кода в разных серверных образах……………………………….. 256

Заключение………………………………………………………………………………………………………………………………. 257

Глава 14. Сборка кластеров в коде………………………………………………………. 258

Решения с кластерами приложений……………………………………………………………………………………….. 259

Кластер как услуга………………………………………………………………………………………………………. 259

Распространение кластеров в упакованном виде……………………………………………………… 260

Топологии стеков для кластеров приложений………………………………………………………………………. 261

Монолитный стек, использующий кластер как услугу…………………………………………….. 262

Монолитный стек для упакованного кластерного решения…………………………………….. 263

Конвейер для стека, в котором реализован монолитный кластер приложений……… 264

Пример: множество стеков в одном кластере…………………………………………………………….. 267

Стратегии совместного использования кластеров приложений…………………………………………. 269

Один большой кластер на все случаи жизни……………………………………………………………… 270

Отдельные кластеры для стадий доставки………………………………………………………………… 271

Кластеры для управления……………………………………………………………………………………………. 272

Кластеры для команд…………………………………………………………………………………………………… 273

Сервисная сеть……………………………………………………………………………………………………………… 273

Инфраструктура для бессерверных FaaS-сервисов……………………………………………………………… 275

Заключение………………………………………………………………………………………………………………………………. 277

Часть IV. Проектирование инфраструктуры……………………… 279

Глава 15. Ключевая практика: небольшие простые фрагменты…………… 281

Модульное проектирование…………………………………………………………………………………………………… 281

Характеристики хорошо спроектированных компонентов……………………………………… 282

Правила проектирования компонентов……………………………………………………………………… 283

Избегайте дублирования……………………………………………………………………………………… 283

Правило композиции……………………………………………………………………………………………. 284

Принцип единственной ответственности…………………………………………………………… 284

Проектируйте компоненты на основе концепций предметной области,
а не на основе технических концепций………………………………………………………………. 284

Закон Деметры……………………………………………………………………………………………………… 285

Никаких циклических зависимостей………………………………………………………………….. 285

Используйте тестирование для принятия проектных решений………………………………… 286

Модульная инфраструктура…………………………………………………………………………………………………… 286

Компоненты стека по сравнению со стеками в качестве компонентов…………………… 286

Использование сервера в стеке……………………………………………………………………………………. 288

Проведение границ между компонентами…………………………………………………………………………….. 291

Устанавливайте границы по паттернам естественных изменений………………………….. 292

Устанавливайте границы по жизненным циклам компонентов……………………………….. 292

Устанавливайте границы по организационным структурам…………………………………… 294

Создавайте границы, поддерживающие устойчивость…………………………………………….. 295

Создавайте границы, поддерживающие масштабирование…………………………………….. 295

Устанавливайте границы по проблемам безопасности и управления……………………. 298

Заключение………………………………………………………………………………………………………………………………. 299

Глава 16. Построение стеков из компонентов………………………………………. 300

Языки инфраструктуры для компонентов стека…………………………………………………………………… 301

Повторное использование декларативного кода с модулями………………………………….. 301

Динамическое создание элементов стека с применением библиотек……………………… 302

Паттерны для компонентов стека…………………………………………………………………………………………… 303

Паттерн: фасадный модуль…………………………………………………………………………………………. 303

Зачем это нужно…………………………………………………………………………………………………… 304

Применимость………………………………………………………………………………………………………. 304

Последствия………………………………………………………………………………………………………….. 304

Внедрение……………………………………………………………………………………………………………… 305

Смежные паттерны………………………………………………………………………………………………. 305

Антипаттерн: модуль обфускации……………………………………………………………………………… 305

Зачем это нужно…………………………………………………………………………………………………… 306

Применимость………………………………………………………………………………………………………. 306

Последствия………………………………………………………………………………………………………….. 306

Внедрение……………………………………………………………………………………………………………… 306

Смежные паттерны………………………………………………………………………………………………. 306

Антипаттерн: неразделяемый модуль………………………………………………………………………… 306

Зачем это нужно…………………………………………………………………………………………………… 307

Применимость………………………………………………………………………………………………………. 307

Последствия………………………………………………………………………………………………………….. 307

Внедрение……………………………………………………………………………………………………………… 307

Смежные паттерны………………………………………………………………………………………………. 307

Паттерн: модуль бандла……………………………………………………………………………………………… 308

Зачем это нужно…………………………………………………………………………………………………… 309

Применимость………………………………………………………………………………………………………. 309

Последствия………………………………………………………………………………………………………….. 309

Внедрение……………………………………………………………………………………………………………… 309

Смежные паттерны………………………………………………………………………………………………. 309

Антипаттерн: спагетти-модуль…………………………………………………………………………………… 309

Зачем это нужно…………………………………………………………………………………………………… 311

Последствия………………………………………………………………………………………………………….. 311

Внедрение……………………………………………………………………………………………………………… 311

Смежные паттерны………………………………………………………………………………………………. 312

Паттерн: сущность домена инфраструктуры…………………………………………………………….. 312

Зачем это нужно…………………………………………………………………………………………………… 313

Применимость………………………………………………………………………………………………………. 313

Внедрение……………………………………………………………………………………………………………… 313

Смежные паттерны………………………………………………………………………………………………. 313

Построение уровня абстрагирования……………………………………………………………………………………. 314

Заключение………………………………………………………………………………………………………………………………. 315

Глава 17. Использование стеков в качестве компонентов……………………. 316

Обнаружение зависимостей между стеками…………………………………………………………………………. 316

Паттерн: сопоставление ресурсов………………………………………………………………………………. 317

Зачем это нужно…………………………………………………………………………………………………… 318

Применимость………………………………………………………………………………………………………. 318

Последствия………………………………………………………………………………………………………….. 318

Внедрение……………………………………………………………………………………………………………… 319

Смежные паттерны………………………………………………………………………………………………. 319

Паттерн: поиск данных в стеке……………………………………………………………………………………. 320

Зачем это нужно…………………………………………………………………………………………………… 320

Применимость………………………………………………………………………………………………………. 320

Последствия………………………………………………………………………………………………………….. 321

Внедрение……………………………………………………………………………………………………………… 321

Смежные паттерны………………………………………………………………………………………………. 322

Паттерн: поиск по реестру интеграции………………………………………………………………………. 322

Зачем это нужно…………………………………………………………………………………………………… 323

Применимость………………………………………………………………………………………………………. 324

Последствия………………………………………………………………………………………………………….. 324

Внедрение……………………………………………………………………………………………………………… 324

Смежные паттерны………………………………………………………………………………………………. 325

Внедрение зависимости……………………………………………………………………………………………….. 325

Проблемы со смешиванием зависимости и кода определения………………………… 326

Отделение зависимостей от их обнаружения……………………………………………………. 326

Заключение………………………………………………………………………………………………………………………………. 328

Часть V. Доставка инфраструктуры……………………………………… 329

Глава 18. Организация кода инфраструктуры……………………………………… 331

Организация проектов и репозиториев………………………………………………………………………………….. 331

Один репозиторий или много?…………………………………………………………………………………….. 332

Один репозиторий для всего………………………………………………………………………………………… 332

Один репозиторий, несколько сборок………………………………………………………………… 333

Отдельный репозиторий для каждого проекта (микрорепозиторий)………………………. 334

Несколько репозиториев с несколькими проектами………………………………………………….. 335

Организация различных типов кода………………………………………………………………………………………. 336

Файлы поддержки проекта………………………………………………………………………………………….. 336

Межпроектные тесты…………………………………………………………………………………………………… 337

Хранение интеграционных тестов в проекте…………………………………………………….. 338

Отдельные проекты интеграционных тестов…………………………………………………………….. 338

Организация кода по концепции предметной области……………………………………………… 339

Организация файлов конфигурационных значений………………………………………………….. 340

Управление инфраструктурным кодом и кодом приложения……………………………………………… 341

Доставка инфраструктуры и приложений…………………………………………………………………. 341

Тестирование приложений с инфраструктурой………………………………………………………… 342

Тестирование инфраструктуры перед интеграцией………………………………………………….. 343

Использование инфраструктурного кода для развертывания приложений……………. 344

Заключение………………………………………………………………………………………………………………………………. 346

Глава 19. Доставка инфраструктурного кода……………………………………….. 347

Доставка инфраструктурного кода……………………………………………………………………………………….. 347

Сборка инфраструктурного проекта………………………………………………………………………….. 348

Инфраструктурный код упаковки как артефакт………………………………………………………… 349

Использование репозитория для доставки инфраструктурного кода……………………… 349

Специализированный репозиторий артефактов……………………………………………….. 350

Репозиторий инструмента…………………………………………………………………………………… 350

Общий репозиторий для хранения файлов………………………………………………………… 351

Доставка кода из репозитория исходного кода………………………………………………… 351

Интеграция проектов……………………………………………………………………………………………………………….. 351

Паттерн: интеграция проекта во время сборки………………………………………………………….. 353

Зачем это нужно…………………………………………………………………………………………………… 353

Применимость………………………………………………………………………………………………………. 354

Последствия………………………………………………………………………………………………………….. 354

Внедрение……………………………………………………………………………………………………………… 354

Смежные паттерны………………………………………………………………………………………………. 355

Паттерн: интеграция проекта во время доставки………………………………………………………. 355

Зачем это нужно…………………………………………………………………………………………………… 356

Применимость………………………………………………………………………………………………………. 357

Последствия………………………………………………………………………………………………………….. 357

Внедрение……………………………………………………………………………………………………………… 357

Смежные паттерны………………………………………………………………………………………………. 358

Паттерн: интеграция проекта во время применения…………………………………………………. 358

Зачем это нужно…………………………………………………………………………………………………… 359

Применимость………………………………………………………………………………………………………. 359

Последствия………………………………………………………………………………………………………….. 359

Внедрение……………………………………………………………………………………………………………… 359

Смежные паттерны………………………………………………………………………………………………. 360

Использование скриптов для обертывания инструментов инфраструктуры…………………….. 361

Сборка значений конфигурации…………………………………………………………………………………. 361

Упрощение скриптов-оболочек…………………………………………………………………………………… 362

Заключение………………………………………………………………………………………………………………………………. 363

Глава 20. Командные рабочие процессы………………………………………………. 364

Люди…………………………………………………………………………………………………………………………………………. 365

Кто пишет инфраструктурный код?………………………………………………………………………………………. 367

Применение кода к инфраструктуре………………………………………………………………………………………. 369

Применение кода с вашей локальной рабочей станции…………………………………………… 369

Применение кода из централизованной службы……………………………………………………….. 370

Персональные инфраструктурные инстансы…………………………………………………………….. 371

Ветви исходного кода в рабочих процессах……………………………………………………………… 373

Предотвращение конфигурационной энтропии……………………………………………………………………. 374

Сведите к минимуму задержку автоматизации…………………………………………………………. 374

Избегайте непродуманного применения изменений………………………………………………….. 375

Применяйте код непрерывно……………………………………………………………………………………….. 375

Неизменяемая инфраструктура…………………………………………………………………………………… 375

Управление в конвейерно-ориентированном потоке задач…………………………………………………. 376

Перетасовка обязанностей………………………………………………………………………………………….. 377

Сдвиг влево……………………………………………………………………………………………………………………. 378

Пример процесса для инфраструктуры как кода с управлением…………………………….. 378

Заключение………………………………………………………………………………………………………………………………. 379

Глава 21. Безопасное изменение инфраструктуры……………………………….. 380

Уменьшите объем изменений………………………………………………………………………………………………….. 380

Небольшие изменения………………………………………………………………………………………………….. 382

Пример рефакторинга………………………………………………………………………………………………….. 384

Отправка неполных изменений в продакшен………………………………………………………………………… 385

Параллельные инстансы……………………………………………………………………………………………… 386

Обратно совместимые преобразования……………………………………………………………………… 389

Переключатели функций……………………………………………………………………………………………… 390

Изменение действующей инфраструктуры……………………………………………………………………………. 392

Инфраструктурная хирургия………………………………………………………………………………………. 394

Расширение и сжатие…………………………………………………………………………………………………… 396

Изменения нулевого времени простоя………………………………………………………………………… 399

Сине-зеленые изменения……………………………………………………………………………………… 400

Преемственность……………………………………………………………………………………………………………………… 400

Преемственность за счет предотвращения ошибок…………………………………………………… 401

Непрерывность за счет быстрого восстановления……………………………………………………. 402

Непрерывное аварийное восстановление………………………………………………………………….. 403

Хаос-инжиниринг…………………………………………………………………………………………………………. 404

Планирование неудач………………………………………………………………………………………………….. 404

Непрерывность данных в меняющейся системе……………………………………………………………………. 406

Блокировка……………………………………………………………………………………………………………………. 407

Разделение…………………………………………………………………………………………………………………….. 407

Репликация……………………………………………………………………………………………………………………. 407

Перезагрузка…………………………………………………………………………………………………………………. 407

Смешение подходов к обеспечению непрерывности данных………………………………….. 408

Заключение………………………………………………………………………………………………………………………………. 408

Предметный указатель…………………………………………………………………………. 410

Об авторе……………………………………………………………………………………………… 416

Kief Morris

Киф Моррис (Kief Morris) – директор по облачной инженерии в компании ThoughtWorks, помогает организациям развивать облачную и внутрикорпоративную IT-инфраструктуру. Более 20 лет занимается проектированием, выстраиванием и эксплуатацией автоматизированной серверной инфраструктуры. На заре карьеры занимался сценариями командной строки и языком Perl, а затем осваивал CFengine, Puppet, Chef, Terraform и многие другие технологии, как только они появлялись.

Опубликовано

Удивительная книга для детей: “Мама, не отвлекай. Я Python учу!”

Мама, не отвлекай. Я Python учу!

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

Для детей младшего и среднего школьного возраста

Читать и программировать можно весело и непринужденно

Телефон есть практически у каждого ребенка 10+ лет. Осталось только купить эту книгу, чтобы ребенок полностью самостоятельно смог изучить основы самого популярного языка программирования Python.

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

Первую программу на Python можно выполнить за пару минут, еще даже не открыв книгу, а только считав телефоном QR-код с ее обложки!

Прочитав всю книгу, ребенок

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

Книгу “Мама, не отвлекай. Я Python учу!” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Лазаревский Игорь Вадимович

Лазаревский Игорь Вадимович – программист, автор книг и курсов, преподаватель Американского университета в Центральной Азии, основатель онлайн-школы по программированию Khasang со стажем преподавания современных языков программирования более 10 лет, вырастивший десятки высококлассных Senior-разработчиков с полного нуля. Ведет личный блог igor.kg.

Опубликовано

Изучаем программирование на Kotlin для Android

Программирование на Kotlin для Android

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

Для программистов

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

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

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

Книгу “Программирование на Kotlin для Android” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторах. 11

Предисловие. 13

Кому адресована эта книга. 14

Почему мы написали эту книгу. 15

Как организована эта книга. 15

Условные обозначения и соглашения. 16

Примеры кода. 17

Благодарности. 17

ГЛАВА 1. Основы языка Kotlin. 19

Система типов Kotlin. 20

Примитивные типы. 20

Null-безопасность. 21

Тип Unit 23

Функциональные типы. 24

Обобщенные типы. 25

Переменные и функции. 25

Переменные. 26

Лямбда-выражения. 26

Функции-расширения. 27

Классы. 29

Инициализация класса. 29

Свойства. 31

Модификатор lateinit 32

Свойства с отложенной инициализацией. 34

Делегаты. 35

Объекты-компаньоны. 36

Классы данных. 37

Классы перечислений. 38

Запечатанные классы. 40

Модификаторы видимости. 41

Резюме. 42

ГЛАВА 2. Фреймворк коллекций Kotlin. 45

Основные понятия. 45

Совместимость с Java. 46

Изменяемость. 46

Перегруженные операторы. 48

Создание контейнеров. 49

Функциональное программирование. 50

Сравнение функционального и процедурного программирования:
простой пример. 50

Функциональное программирование в Android. 51

Функции-преобразователи. 52

Булевы функции. 52

Фильтры. 53

Функция map. 53

Функция flatMap. 55

Группировка. 56

Сравнение итераторов и последовательностей. 57

Пример. 59

Проблема. 59

Реализация. 60

Резюме. 66

ГЛАВА 3. Основы Android. 67

Стек Android. 67

Аппаратное обеспечение. 67

Ядро. 68

Системные службы. 68

Среда выполнения Android. 69

Приложения. 69

Прикладное окружение Android. 69

Намерения и фильтры намерений. 70

Контекст. 73

Компоненты приложения Android: строительные блоки. 75

Компонент Activity и его друзья. 76

Службы. 80

Провайдеры контента. 85

BroadcastReceiver 86

Архитектуры приложений Android. 88

MVC: основы. 88

Виджеты. 89

Локальная модель. 89

Паттерны Android. 90

Model-View-Intent 90

Model-View-Presenter 90

Model-View-ViewModel 91

Резюме. 92

ГЛАВА 4. Параллельное программирование в Android. 94

Потокобезопасность. 95

Атомарность. 95

Видимость. 96

Модель многопоточного выполнения Android. 97

Пропуск кадров. 98

Утечка памяти. 101

Инструменты для управления потоками. 103

Looper/Handler 104

Исполнители Executors и объекты ExecutorService. 106

Инструменты для управления заданиями. 107

JobScheduler 109

WorkManager 111

Резюме. 112

ГЛАВА 5. Потокобезопасность. 113

Пример проблемы, связанной с потокобезопасностью.. 113

Инварианты. 115

Мьютексы. 116

Потокобезопасные коллекции. 116

Привязка к потоку. 119

Конфликт потоков. 120

Сравнение блокирующего и неблокирующего вызовов. 121

Очереди работ. 122

Противодавление. 123

Резюме. 125

ГЛАВА 6. Организация параллелизма с использованием обратных вызовов. 127

Пример: функция обработки покупок. 128

Создание приложения. 130

Компонент ViewModel 130

Представление. 131

Реализация логики. 135

Обсуждение. 136

Ограничения модели многопоточного выполнения. 138

Резюме. 139

ГЛАВА 7. Сопрограммы.. 141

Что такое сопрограмма?. 141

Наша первая сопрограмма. 142

Функция async. 144

Краткий обзор структурированного параллелизма. 146

Связь “родитель — потомок” в структурированном параллелизме. 148

CoroutineScope и CoroutineContext 150

Функции, поддерживающие возможность приостановки. 155

Функции, поддерживающие возможность приостановки, “под капотом”. 156

Использование сопрограмм и функций, поддерживающих возможность
приостановки: практический пример. 160

Не ошибитесь с модификатором suspend. 163

Резюме. 164

ГЛАВА 8. Структурированный параллелизм и сопрограммы.. 166

Функции, поддерживающие возможность приостановки. 166

Настройка места действия. 167

Традиционный подход с использованием java.util.concurrent.ExecutorService. 168

Вспомним, что такое HandlerThread. 172

Использование приостанавливаемых функций и сопрограмм. 175

Сравнение приостанавливаемых и традиционной многопоточности: итоги. 179

Отмена. 179

Жизненный цикл сопрограмм. 180

Отмена сопрограммы. 182

Отмена задачи, делегированной сторонней библиотеке. 184

Сопрограммы, которые действуют согласованно, чтобы их можно было отменить. 188

Функцию delay() можно отменить. 190

Обработка отмены. 191

Причины отмены. 192

Супервизия. 195

Функция supervisorScope. 197

Параллельная декомпозиция. 197

Автоматическая отмена. 199

Обработка исключений. 199

Необработанные и открытые исключения. 199

Открытые исключения. 201

Необработанные исключения. 204

Резюме. 207

Размышления напоследок. 208

ГЛАВА 9. Каналы.. 209

Обзор каналов. 209

Рандеву-канал. 211

Неограниченный канал. 215

Объединенный канал. 216

Буферизованный канал. 217

Функция produce. 218

Взаимодействующие последовательные процессы. 219

Модель и архитектура. 219

Первая реализация. 220

Выражение select 225

Собираем все воедино. 227

Мультиплексор и демультиплексор. 228

Проверка производительности. 229

Противодавление. 231

Сходства с моделью акторов. 232

Последовательное выполнение внутри процесса. 232

Размышления напоследок. 233

Взаимоблокировки в CSP. 233

Каналы и взаимоблокировки. 236

Ограничения каналов. 236

“Горячие” каналы. 238

Резюме. 239

ГЛАВА 10. Потоки. 241

Введение в потоки. 241

Более реалистичный пример. 242

Операторы. 244

Терминальные операторы. 245

Примеры использования холодного потока. 246

Вариант 1: интерфейс с API на базе функции обратного вызова. 246

Вариант 2: параллельное преобразование потока значений. 251

Вариант 3: создание собственного оператора. 253

Обработка ошибок. 257

Блок try/catch. 257

Разделение ответственности важно. 260

Нарушение прозрачности исключения. 260

Оператор catch. 261

Материализация исключений. 264

Горячие потоки и SharedFlow. 267

Создаем SharedFlow. 268

Регистрируем подписчика. 268

Отправляем значения в SharedFlow. 269

Использование SharedFlow для потоковой передачи данных. 269

Использование SharedFlow в качестве шины событий. 275

StateFlow: специализированная версия SharedFlow. 276

Пример использования StateFlow. 277

Резюме. 279

ГЛАВА 11. Вопросы производительности и инструменты
профилирования Android. 280

Android Profiler 282

Network Profiler 285

CPU Profiler 291

Energy Profiler 301

Memory Profiler 303

Обнаружение утечек памяти с помощью LeakCanary. 308

Резюме. 312

ГЛАВА 12. Снижение потребления ресурсов за счет оптимизации производительности  314

Достижение плоской иерархии представлений с помощью ConstraintLayout 315

Сокращение количества операций рисования с помощью экземпляров
класса Drawable. 319

Минимизация данных в сетевых вызовах. 324

Организация пула и кэширование объектов Bitmap. 324

Избавляемся от ненужной работы. 326

Использование статических функций. 329

Минификация и обфускация с R8 и ProGuard. 329

Резюме. 331

Предметный указатель. 333

Нет фото

Майк Данн (Mike Dunn) работал ведущим инженером по мобильным технологиям в издательстве O’Reilly Media.Один из авторов книги «Нативная разработка мобильных приложений. Перекрестный справочник для iOS и Android».

 

 

Лоранс Пьер-Оливье

Пьер-Оливье Лоранс (Pierre-Olivier Laurence) — ведущий инженер-программист компании Safran Aircraft Engines, со штаб-квартирой в окрестностях Парижа.

 

 

G.Blake_Meike

Дж. Блейк Мик (G. Blake Meike) — старший инженер-программист компании Couchbase и автор нескольких книг, среди которых «Программирование под Android».

 

 

Amanda Hinchman-Dominguez

Аманда Хинчман-Домингес (Amanda Hinchman-Dominguez) — эксперт по языку Kotlin в программе Google Developer Expert. Работает разработчиком для Android в компании Groupon и является активным участником глобального сообщества Kotlin.