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

Новинка: “Алгоритмы на языке Go”

Алгоритмы на языке Go

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

Для Go-разработчиков

.

Современный бэкенд от API баз данных до вставок на TypeScript

Современный бэкенд от API баз данных до вставок на TypeScript, от небольших утилит до криптографических модулей и процедур для ускорения ядра Linux невозможно представить себе без кода на языке Go.

В этой книге рассмотрены алгоритмы и их реализации на языке Go, относящиеся к следующим предметным областям:

  • Понятие о структурах данных
  • Поиск, сортировка и сжатие данных
  • Алгоритмы достижения консенсуса
  • Алгоритмы для распределенных систем
  • Криптографические алгоритмы
  • Создание и защита цифровых подписей

Артём Михайлов — опытный программист, специалист по высоконагруженным системам, в настоящее время работает в стартапе, занятым высоконагруженными приложениями, ранее работал в научном кластере «Иннополис», компаниях «МТС» и «Тензор». Постоянно делится своим опытом на Хабре, пишет статьи для корпоративных блогов «Росатом», «ВТБ», «VK», «IBS», «OTUS».

Книгу “Алгоритмы на языке Go” можно купить в нашем интенет-магазине.

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

– Глава 1 –
Алгоритмы, сложности и структуры данных. 9

Структуры данных: массивы, списки, хеш-таблицы, деревья. 11

Массивы.. 11

Связные списки. 13

Хеш-таблицы.. 14

Деревья. 15

Структуры данных в Go. 18

Массивы и срезы в Go. 18

Связные списки в Go. 20

Хеш-таблицы (отображения) в Go. 22

Деревья в Go. 24

– Глава 2 –
Поиск, сортировка и сжатие данных. 28

Алгоритмы поиска. 28

Двоичный поиск. 28

Интерполяционный поиск. 30

Поиск Фибоначчи. 31

Алгоритмы сортировки. 33

Быстрая сортировка. 34

Сортировка слиянием.. 36

Пирамидальная сортировка. 37

Поразрядная сортировка. 39

Алгоритмы сжатия данных. 42

Алгоритм Хаффмана. 42

Алгоритм LZW… 45

Алгоритм Brotli 48

Алгоритм Snappy. 50

Алгоритмы поиска подстроки. 52

Алгоритм Кнута–Морриса–Пратта. 52

Алгоритм Бойера–Мура. 54

Алгоритм Рабина–Карпа. 57

Алгоритмы кратчайших путей. 59

Алгоритм Дейкстры.. 60

Алгоритм Беллмана–Форда. 65

Алгоритм A*: эвристический поиск. 68

Примеры использования алгоритмов кратчайшего пути. 72

Сравнение алгоритмов кратчайших путей. 73

Потоки в сетях. 73

Сети и потоки. 73

Задача о максимальном потоке: найти поток наибольшей величины.. 74

Алгоритм Форда-Фалкерсона. 74

Алгоритм Диница. 76

Применения. 79

Теорема о максимальном потоке и минимальном разрезе. 79

– Глава 3 –
Распределенные алгоритмы.. 81

Что делает распределенные системы сложными?. 82

CAP-теорема: фундаментальный компромисс. 83

Три свойства. 84

Теорема. 84

Почему нельзя всё сразу?. 84

А что с CA?. 85

Примеры систем.. 85

Критика и уточнения. 86

Модели согласованности. 86

Строгая согласованность (Strong Consistency / Linearizability) 86

Последовательная согласованность (Sequential Consistency) 87

Причинная согласованность (Causal Consistency) 87

Read Your Writes (прочитайте ваши записи) 87

Eventual Consistency (согласованность в конечном счете) 88

Eventual Consistency. 88

Разрешение конфликтов. 90

Кворумы: настраиваемая согласованность. 93

Окно несогласованности. 94

Практические паттерны.. 94

Saga — для распределенных транзакций. 94

Outbox — для надежной публикации событий. 96

Idempotency key — для идемпотентных операций. 97

Circuit breaker — для устойчивости. 98

– Глава 4 –
Алгоритмы консенсуса. 101

Что такое консенсус и зачем он нужен?. 101

Формальное определение. 102

Практические применения. 102

Невозможность: почему это так сложно?. 103

Проблема двух генералов. 103

Почему это невозможно?. 103

FLP-невозможность. 104

Интуиция доказательства. 105

Как жить с невозможностью?. 105

Paxos: алгоритм, изменивший всё. 106

Одна инстанция Paxos. 106

Номера предложений (proposal numbers) 107

Протокол: две фазы.. 107

Почему это работает?. 110

Пример выполнения. 110

Сценарий 1: простой случай. 110

Сценарий 2: конкурирующие proposers. 111

Проблема прогресса: дуэль proposers. 113

Multi-Paxos: от одного значения к журналу. 114

Практические соображения. 115

Недостатки Paxos. 116

Raft: консенсус для смертных. 116

Философия Raft 116

Роли и термы.. 117

Выбор лидера. 118

Репликация журнала. 120

AppendEntries RPC.. 120

Алгоритм follower’а. 121

Алгоритм лидера. 122

Log Matching Property: свойство сопоставления с журналом.. 124

Leader Completeness Property: свойство безопасности. 124

Почему лидер не коммитит записи прошлых термов напрямую?. 125

Кластерное членство: Joint Consensus. 125

Снэпшоты и компактификация журнала. 126

Клиентское взаимодействие. 127

Полный пример: минимальный Raft на Go. 127

Системы на Raft 133

Заключение. 133

– Глава 5 –
Распределенные транзакции. 134

ACID в распределенном мире. 134

Проблема атомарного коммита. 134

Two-Phase Commit (2PC) 135

Фаза 1: Prepare (голосование) 135

Фаза 2: Commit/Abort (фиксация) 135

Проблемы 2PC.. 136

Пример: перевод денег. 137

Three-Phase Commit (3PC) 137

Saga. 138

Оркестрация. 139

Хореография. 140

TCC: Try-Confirm-Cancel 140

Outbox Pattern: надежная публикация событий. 141

Таблица outbox. 142

Идемпотентность. 142

Сравним подходы.. 143

Когда что использовать?. 143

– Глава 6 –
Криптографические алгоритмы.. 144

От Цезаря до Тьюринга: краткая история шифров. 144

Фундаментальные понятия. 146

Симметричное шифрование. 147

Одноразовый блокнот: идеал, недостижимый на практике. 148

Потоковые и блочные шифры.. 149

Реализация AES на Go. 151

Асимметричное шифрование. 153

Хеш-функции: MD5, SHA-256, Blake2, Argon2. 157

Исторический путь: от CRC до Argon2. 158

Односторонность, коллизии и эффект лавины.. 160

Зачем нужны разные хеш-функции?. 161

MD5 — эпоха надежд и коллизий. 163

SHA-256 — надежный наследник. 164

Blake2 — быстрее, сильнее, современнее. 167

Argon2 — хеширование паролей на стероидах. 169

Выбор хеш-функции. 171

– Глава 7 –
Реализация цифровых подписей и протоколов безопасности. 174

Математическая сущность цифровых подписей. 174

Схемы подписей на эллиптических кривых. 175

Реализация Ed25519 в Go. 177

– Глава 8 –
Атаки на цифровые подписи. 178

Replay-атаки и временны́е метки. 178

Подмена контекста (context substitution) 178

Слепые подписи и их применение. 179

Пороговые подписи. 179

BLS-подписи и агрегация. 180

JWT и stateless-аутентификация. 181

Идея: зашифровать сессию в токене. 181

Анатомия JWT: три части. 182

Жизненный цикл JWT.. 182

Симметричная и асимметричная подпись. 184

Распространение публичного ключа: JWKS. 185

Теперь про уязвимости. 186

Атака Algorithm substitution. 186

Уязвимость None algorithm… 187

Слабые секреты HMAC.. 187

Атаки JKU и X5U.. 188

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

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

Встречайте: Разработка программного обеспечения. Практическое руководство для новичков в IT-команде

Разработка программного обеспечения. Практическое руководство для новичков в IT-команде

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

Для начинающих IT-специалистов

Системное понимание процессов разработки в российских реалиях

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

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

Что внутри:

  • Как устроены российские IT-компании и доступные карьерные пути
  • Практическое руководство по процессам разработки
  • Эффективная коммуникация в команде и участие в рабочих встречах
  • Пошаговый план развития: от адаптации до оценки результатов и повышения
  • Современные инструменты и методы работы с учётом российской специфики

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

Для начинающих специалистов всех направлений — аналитиков, тестировщиков, продуктовых менеджеров, продуктовых дизайнеров  (UX/UI) и разработчиков, которые хотят быстро влиться в команду и понять, как устроена разработка ПО.


Книгу “Разработка программного обеспечения. Практическое руководство для новичков в IT-команде
” можно купить в нашем интенет-магазине.

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

Бестселлер! Большие языковые модели на практике: Понимание языка и генерация текстов

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

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

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

Из книги вы узнаете:

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

Книга объясняет:

  • как устроены трансформерные языковые модели, обеспечивающие высокое качество генерации и представления текста;
  • как создавать продвинутые конвейеры на базе больших языковых моделей (LLM) для кластеризации документов и исследования их тематического содержания;
  • как применять такие методы, как векторный поиск и переранжирование, чтобы строить семантические поисковые системы, не ограниченные поиском по ключевым словам;
  • как использовать генеративные модели — от техники составления запросов (промпт-инжиниринг) до генерации с дополненной выборкой (RAG);
  • как глубже разобраться с методами обучения LLM и способами их оптимизации для конкретных задач, используя дообучение генеративных моделей, сравнительное дообучение и контекстное обучение.

Понимание языка и генерация текстов

В своей книге Джей и Маартен продолжают традиции увлекательного, красочного и доходчивого объяснения самых сложных вопросов. Это незаменимое пособие для тех, кто хочет изучить основные способы создания больших языковых моделей
Эндрю Ын, основатель DeepLearning.AI

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

Книгу “Большие языковые модели на практике: Понимание языка и генерация текстов” можно купить в нашем интенет-магазине.

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

Вышла книга “Основы разработки приложений для iOS”

Основы разработки приложений для iOS

Книга рассказывает о практических основах разработки приложений для iOS с использованием SwiftUI, языка Swift и Xcode. Рассматривается программирование на Swift, от базовых конструкций до структурированного параллелизма и объектно-ориентированного программирования, работа со Swift Playgrounds, декларативный подход SwiftUI, построение пользовательских интерфейсов с помощью стеков, фреймов и сеток, управление состоянием и данными, навигация, анимация, графика и диаграммы. Отдельное внимание уделено созданию собственных представлений и контейнеров, разработке виджетов и Live Activities, использованию SwiftData, Core Data и CloudKit, интеграции SwiftUI и UIKit, а также подготовке и публикации приложений в App Store. В книге представлены практические примеры и пошаговые инструкции.

Для iOS-разработчиков

Эта книга — практическое руководство по созданию современных приложений для iOS с использованием SwiftUI, языка Swift и Xcode.

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

Большой раздел посвящен SwiftUI и разработке в Xcode: дается детальный обзор Xcode в режиме SwiftUI, показано создание собственных представлений, построение пользовательских интерфейсов, работа со стеками, фреймами, формами и архитектурой проектов.

Отдельно разбирается работа с данными, включая обработку данных с помощью свойств состояния и объектов observable, state и environment. Рассматриваются вопросы дизайна пользовательского интерфейса: модификаторы, списки, представления с вкладками, контекстные меню, элементы навигации по пользовательскому интерфейсу и структурные группы. В продвинутых темах охватываются графика и построение диаграмм, применение анимации в пользовательском интерфейсе, трансформация представлений и обработка жестов, WidgetKit, Live Activities, приложения на основе документов, Core Data, SwiftData и CloudKit.

Подробно рассматривается интеграция с UIKit, включая интеграцию SwiftUI-представления в существующие проекты на базе UIKit и интеграцию кода UIKit в SwiftUI. В завершающей части содержится пошаговое руководство по упаковке приложения и его размещению в App Store. Материал сопровождается практическими пошаговыми инструкциями и наглядными примерами.

• Установка и изучение Xcode
• Изучение программирования на Swift
• Эксперименты со Swift Playgrounds
• Освоение декларативного синтаксиса SwiftUI
• Проектирование интерфейсов с использованием стеков, фреймов и сеток
• Использование предиктивного автодополнения кода
• Создание графики и диаграмм
• Добавление анимации в приложения
• Создание собственных представлений и контейнеров
• Разработка виджетов и Live Activities
• Хранение данных с помощью SwiftData

Книгу “Основы разработки приложений для iOS” можно купить в нашем интенет-магазине.

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

Встречайте: Программируем на Python с использованием искусственного интеллекта

Программируем на Python с использованием искусственного интеллекта

Книга представляет собой практическое руководство по интеграции искусственного интеллекта в процесс разработки на Python. Рассматривается применение ИИ-ассистентов, включая ChatGPT и аналогичные языковые модели, для повышения эффективности на всех этапах жизненного цикла ПО: от сбора требований и проектирования до написания кода, тестирования, развертывания и мониторинга. На примере сквозного проекта (USB T-Shirt Launcher) и реальных сценариев шаг за шагом показано, как использовать ИИ для автоматизации рутинных задач, генерации чистого и безопасного кода, рефакторинга по принципам SOLID, написания тестов, настройки CI/CD и развертывания в облаке. Изложенная методология универсальна и позволяет применять описанные принципы с любым доступным ИИ-инструментом, превращая его в эффективного помощника для ускорения разработки и повышения качества кода.

Для Python-разработчиков

Прокачайте навыки с ИИ — десятикратно умножьте эффективность разработки

Эта книга — практическое руководство по интеграции ИИ (ChatGPT и аналогичных языковых моделей) в полный цикл разработки на Python.

На примере сквозного проекта «USB T-Shirt Launcher» рассматривается применение ИИ-ассистента на всех этапах жизненного цикла ПО (SDLC).

Книга ведет читателя от планирования (формулирование OKR и сбор требований) к проектированию архитектуры.

Далее рассматривается фаза разработки: генерация кода, рефакторинг по принципам SOLID, написание модульных и интеграционных тестов. Завершается цикл развертыванием и эксплуатацией — настройкой CI/CD-пайплайнов, облачным деплоем и мониторингом производительности с помощью Grafana Cloud.Читатель освоит не работу с одним инструментом, а универсальную методологию применения ИИ для устранения рутины — от генерации документации и сообщений для фиксаций кода до автоматической отладки и анализа кода на уязвимости.

Акцент делается на промт-инжиниринге, критической оценке ответов модели и бесшовной интеграции ИИ в ежедневный рабочий процесс для достижения максимальной скорости и качества разработки в реальных проектах.

КЛЮЧЕВЫЕ ОСОБЕННОСТИ КНИГИ

  • Сквозной практический проект: все методики применяются шаг за шагом к единому проекту — от идеи до работающего приложения
  • Фокус на полный SDLC: выход за рамки генерации кода к комплексному улучшению всего процесса разработки
  • Переносимые навыки: принципы промт-инжиниринга и интеграции ИИ не зависят от конкретной модели и остаются актуальными

ЧТО ВЫ ОСВОИТЕ

  • Практику промт-инжиниринга для сложных задач: от декомпозиции функциональных требований до написания сообщений к коммитам
  • Автоматизацию проектирования, написания чистого кода и рефакторинга с соблюдением SOLID
  • Создание тестов, проверку безопасности и настройку пайплайнов CI/CD с помощью ИИ
  • Стратегии облачного развертывания и настройку производительности с использованием ChatGPT
  • Критическую оценку ответов ИИ и его интеграцию в ежедневный рабочий процесс

Книгу “Программируем на Python с использованием искусственного интеллекта” можно купить в нашем интенет-магазине.

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

Новинка: “Kotlin. Краткий курс”

Kotlin. Краткий курс

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

Для программистов

Руководство по рефакторингу

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

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

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

ВЫ ИЗУЧИТЕ:

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

разработку различных типов решений, включая REST API и бессерверные приложения.

 

Елена Ван Энгелен - Маслова

Елена ван Энгелен – Маслова (Elena van Engelen – Maslova) — эксперт-инженер с более чем 20-летним опытом создания высоконагруженных и легко поддерживаемых программных решений. Обладая учеными степенями в области вычислительной техники и программной инженерии, а также сертификатами AWS и Azure, она специализируется на современных технологиях: Kotlin, микросервисной и событийно-ориентированной архитектуре.
Ее карьера, построенная в ведущих компаниях телекоммуникационного, финансового и e-commerce секторов, — это практическое воплощение ее убеждения: качественное программное обеспечение способно трансформировать бизнес и улучшать жизнь людей. Свои глубокие профессиональные знания, подкрепленные опытом руководства командами, она переносит на страницы книг, делая сложные концепции доступными для разработчиков.

Книгу “Kotlin. Краткий курс” можно купить в нашем интенет-магазине.

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

Вышла книга: “Анализ данных. Как стать профессионалом”

Анализ данных. Как стать профессионалом

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

Для начинающих аналитиков данных

Книга предназначена для начинающих аналитиков данных.Дэвид Эсбот — автор книги, архитектор ПО и преподаватель курсов по Data Science, один из ведущих подкаста Half Stack Data Science.


Отзывы о книге

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

Отличный материал для любого амбициозного исследователя данных!
 Эндрю Р. Фрид, компания IBM

Дэвид выстроил ясный и легко воспроизводимый аппарат, который поможет вам справиться с не до конца сформулированными требованиями заказчика и найти решение гораздо быстрее, чем от вас ожидают!
 Шон Макгирр, компания DevOn Software Services

В этой книге маститый аналитик данных рассказывает, как справляться с распространёнными проблемами, возникающими на практике, не забыв о тех коварных приемах мастеров, говорить о которых не принято.
 Рэнди Ау, компания Google

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

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

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

Вы научитесь:

  • моделировать данные;
  • вычленяя пользовательские запис;
  • ориентироваться в плохо очерченных метриках;
  • извлекать данные из PDF — и многому другому;
  • подхватывать и доводить до конца незавершенные проекты;
  • в кратчайшие сроки создавать прототипы, опираясь на реальные данные.

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

Основные библиотеки, на материале которых автор строит примеры, — Pandas и NumPy. Вооружившись этими знаниями, вы обзаведетесь внушительным портфолио — не забудьте похвастаться им на собеседовании.

 

Книгу “Анализ данных. Как стать профессионалом” можно купить в нашем интенет-магазине.

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

Новинка: Нескучная робототехника

Нескучная робототехника

Книга содержит разнообразные занимательные задания, связанные с робототехникой, и способствует развитию логики, памяти, внимания у детей от 10 до 12 лет. Она поможет им содержательно провести свободное время и узнать много интересного из мира роботов.

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

Книгу “Нескучная робототехника” можно купить в нашем интенет-магазине.

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

Встречайте: Генеративный ИИ на практике: трансформеры и диффузионные модели

Генеративный ИИ на практике: трансформеры и диффузионные модели

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

Трансформеры и диффузионные модели

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

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

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

Книгу “Генеративный ИИ на практике: трансформеры и диффузионные модели” можно купить в нашем интенет-магазине.

Отзывы о книге……………………………………………………………………………………… 11

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

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

Предварительная подготовка…………………………………………………………………………………………………… 14

Чему вы научитесь…………………………………………………………………………………………………………………….. 14

Как следует читать эту книгу…………………………………………………………………………………………………… 15

Требования к программному и аппаратному обеспечению………………………………………………….. 15

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

Использование примеров кода…………………………………………………………………………………………………. 17

Комплект цветных изображений………………………………………………………………………………………………. 17

Актуальность книги…………………………………………………………………………………………………………………… 17

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

Часть I. Использование открытых моделей……………………….. 21

Глава 1. Введение в генеративные медиа……………………………………………….. 23

Генерация изображений……………………………………………………………………………………………………………. 24

Генерация текста……………………………………………………………………………………………………………………….. 26

Создание аудио………………………………………………………………………………………………………………………….. 28

Этические и социальные последствия……………………………………………………………………………………… 28

Где мы были раньше и как обстоят дела сейчас…………………………………………………………………….. 29

Как создаются генеративные ИИ-модели………………………………………………………………………………… 30

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

Глава 2. Трансформеры………………………………………………………………………….. 33

Языковая модель в действии…………………………………………………………………………………………………….. 34

Токенизация текста………………………………………………………………………………………………………… 34

Прогнозирование вероятностей…………………………………………………………………………………….. 37

Генерация текста……………………………………………………………………………………………………………. 40

Генерализация с нулевым выстрелом (Zero-shot)………………………………………………………… 49

Генерализация с несколькими выстрелами (Few-shot)………………………………………………… 51

Блок трансформера……………………………………………………………………………………………………………………. 53

Генеалогия модели-трансформера…………………………………………………………………………………………… 55

Задачи «последовательность-последовательность»…………………………………………………… 55

Модели, имеющие только энкодер……………………………………………………………………………….. 57

Сила предварительного обучения……………………………………………………………………………………………. 60

Краткий обзор трансформеров…………………………………………………………………………………………………. 63

Ограничения……………………………………………………………………………………………………………………. 65

Помимо текста………………………………………………………………………………………………………………… 66

Создание проекта: использование языковой модели для генерации текста………………………… 70

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

Вопросы……………………………………………………………………………………………………………………………………… 72

Практика…………………………………………………………………………………………………………………………………….. 72

Глава 3. Сжатие и представление информации………………………………………. 75

Автоэнкодеры…………………………………………………………………………………………………………………………….. 77

Подготовка данных………………………………………………………………………………………………………… 78

Энкодер……………………………………………………………………………………………………………………………. 80

Декодер……………………………………………………………………………………………………………………………. 83

Обучение…………………………………………………………………………………………………………………………. 84

Исследование латентного пространства……………………………………………………………………… 89

Визуализация латентного пространства……………………………………………………………………… 93

Вариационные автоэнкодеры…………………………………………………………………………………………………… 97

Энкодеры и декодеры VAE……………………………………………………………………………………………. 98

Выборка из распределения энкодера…………………………………………………………………………… 99

Обучение VAE………………………………………………………………………………………………………………. 102

Использование VAE для генеративного моделирования………………………………………….. 110

CLIP…………………………………………………………………………………………………………………………………………… 111

Контрастные потери…………………………………………………………………………………………………….. 111

Использование CLIP, шаг за шагом……………………………………………………………………………. 113

Классификация изображений с нулевым выстрелом с помощью CLIP…………………… 118

Конвейер классификации изображений с нулевым выстрелом……………………………….. 120

Варианты использования CLIP…………………………………………………………………………………… 121

Альтернативы CLIP…………………………………………………………………………………………………………………. 122

Время проекта: семантический поиск изображений…………………………………………………………….. 122

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

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

Задачи………………………………………………………………………………………………………………………………………. 126

Глава 4. Модели диффузии…………………………………………………………………… 127

Итеративное уточнение — ключ к пониманию моделей диффузии……………………………………. 128

Обучение моделей диффузии………………………………………………………………………………………………….. 131

Данные…………………………………………………………………………………………………………………………… 132

Добавление шума…………………………………………………………………………………………………………. 134

UNet……………………………………………………………………………………………………………………………….. 135

Обучение……………………………………………………………………………………………………………………….. 137

Выборка………………………………………………………………………………………………………………………… 139

Оценка……………………………………………………………………………………………………………………………. 140

Графики шума………………………………………………………………………………………………………………………….. 142

Зачем надо добавлять шум?………………………………………………………………………………………… 143

Начинаем с простого……………………………………………………………………………………………………. 144

Математика…………………………………………………………………………………………………………………… 146

Влияние входного разрешения и масштабирования…………………………………………………. 151

Подробный разбор: UNet и альтернативы…………………………………………………………………………….. 153

Простая модель UNet……………………………………………………………………………………………………. 154

Улучшение UNet…………………………………………………………………………………………………………… 157

Альтернативные архитектуры…………………………………………………………………………………….. 158

Подробный разбор: цели диффузии……………………………………………………………………………………….. 159

Время проекта: обучение собственной модели диффузии…………………………………………………… 161

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

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

Задачи………………………………………………………………………………………………………………………………………. 163

Глава 5. Stable Diffusion и обусловленная генерация…………………………….. 165

Добавление контроля: модели с условиями………………………………………………………………………….. 165

Подготовка данных………………………………………………………………………………………………………. 166

Создание модели, обусловленной классом……………………………………………………………….. 168

Обучение модели………………………………………………………………………………………………………….. 169

Выборка………………………………………………………………………………………………………………………… 171

Повышение эффективности: Latent Diffusion………………………………………………………………………… 174

Stable Diffusion: подробнее о компонентах…………………………………………………………………………… 175

Энкодер текста……………………………………………………………………………………………………………… 176

Вариационный автоэнкодер (VAE)…………………………………………………………………………….. 178

UNet……………………………………………………………………………………………………………………………….. 181

Stable Diffusion XL………………………………………………………………………………………………………… 183

FLUX, Stable Diffusion 3 и генерация видео……………………………………………………………….. 185

Руководство без классификаторов……………………………………………………………………………… 185

Собираем все вместе: аннотированный цикл выборки………………………………………………………… 187

Открытые данные, открытые модели…………………………………………………………………………………….. 190

Закат LAION-5B……………………………………………………………………………………………………………. 191

Альтернативы……………………………………………………………………………………………………………….. 192

Добросовестное и коммерческое использование………………………………………………………. 192

Время проекта: создание интерактивной демомодели с помощью Gradio…………………………. 193

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

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

Задачи………………………………………………………………………………………………………………………………………. 195

Часть II. Перенос обучения для генеративных моделей 197

Глава 6. Тонкая настройка языковых моделей…………………………………….. 199

Классификация текста…………………………………………………………………………………………………………….. 200

Определение набора данных………………………………………………………………………………………. 201

Определение типа модели……………………………………………………………………………………………. 202

Выбор хорошей базовой модели………………………………………………………………………………… 203

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

Определение оценочных метрик…………………………………………………………………………………. 206

Обучение модели………………………………………………………………………………………………………….. 208

Все еще актуально?……………………………………………………………………………………………………… 216

Генерация текста……………………………………………………………………………………………………………………… 217

Выбор правильной генеративной модели………………………………………………………………….. 217

Обучение генеративной модели………………………………………………………………………………….. 221

Инструкции………………………………………………………………………………………………………………………………. 225

Краткое введение в адаптеры…………………………………………………………………………………………………. 230

Краткое введение в квантование……………………………………………………………………………………………. 234

Собираем все вместе……………………………………………………………………………………………………………….. 237

Более глубокое погружение в оценку…………………………………………………………………………………….. 243

Время проекта: поисково-дополненная генерация………………………………………………………………. 246

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

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

Задачи………………………………………………………………………………………………………………………………………. 249

Глава 7. Тонкая настройка Stable Diffusion…………………………………………… 251

Тонкая настройка полной модели Stable Diffusion………………………………………………………………. 251

Подготовка набора данных…………………………………………………………………………………………. 252

Тонкая настройка модели……………………………………………………………………………………………. 254

Вывод модели……………………………………………………………………………………………………………….. 257

DreamBooth………………………………………………………………………………………………………………………………. 259

Подготовка набора данных…………………………………………………………………………………………. 261

Сохранение предыдущих знаний……………………………………………………………………………….. 261

Подготовка модели с помощью DreamBooth…………………………………………………………….. 262

Вывод…………………………………………………………………………………………………………………………….. 263

Обучение LoRA………………………………………………………………………………………………………………………… 264

Предоставление для Stable Diffusion новых возможностей…………………………………………………. 267

Inpainting……………………………………………………………………………………………………………………….. 267

Дополнительные входы для специальных обусловливаний……………………………………. 267

Время проекта: самостоятельное обучение модели SDXL с помощью DreamBooth и LoRA 268

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

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

Задачи………………………………………………………………………………………………………………………………………. 270

Часть III. Двигаемся дальше…………………………………………………….. 271

Глава 8. Творческое применение моделей text-to-image………………………… 273

Преобразование изображения в изображение………………………………………………………………………. 273

Inpainting…………………………………………………………………………………………………………………………………… 275

Взвешивание промптов и редактирование изображений…………………………………………………….. 277

Взвешивание и слияние промптов………………………………………………………………………………. 277

Редактирование диффузионных изображений с помощью Semantic Guidance………. 280

Редактирование реальных изображений с помощью инверсии………………………………………….. 283

Редактирование с помощью LEDITS++………………………………………………………………………. 284

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

ControlNet…………………………………………………………………………………………………………………………………. 288

Изображения в качестве промптов и вариации изображений……………………………………………… 291

Вариации изображений……………………………………………………………………………………………….. 291

Изображения в качестве промптов……………………………………………………………………………… 293

Перенос стиля……………………………………………………………………………………………………….. 293

Дополнительный контроль………………………………………………………………………………….. 295

Время проекта: ваш творческий холст………………………………………………………………………………….. 296

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

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

Глава 9. Генерация аудио…………………………………………………………………….. 299

Аудиоданные……………………………………………………………………………………………………………………………. 301

Осциллограмма…………………………………………………………………………………………………………….. 305

Спектрограммы…………………………………………………………………………………………………………….. 306

Преобразование речи в текст с использованием архитектур на основе трансформеров…. 314

Техники на основе энкодеров……………………………………………………………………………………… 315

Техники на основе энкодер-декодера…………………………………………………………………………. 319

От модели к конвейеру…………………………………………………………………………………………………. 323

Оценка……………………………………………………………………………………………………………………………. 325

Генерация аудио……………………………………………………………………………………………………………………… 331

Генерация звука с помощью моделей Sequence-to-Sequence……………………………………. 332

Выход за рамки генерации речи с помощью Bark…………………………………………………….. 337

AudioLM и MusicLM…………………………………………………………………………………………………….. 339

AudioGen и MusicGen……………………………………………………………………………………………………. 342

Audio Diffusion и Riffusion…………………………………………………………………………………………… 343

Dance Diffusion……………………………………………………………………………………………………………… 346

Подробнее о моделях диффузии для генерации звука………………………………………………. 347

Оценка систем генерации звука……………………………………………………………………………………………… 348

Что дальше?……………………………………………………………………………………………………………………………… 348

Время проекта: сквозная диалоговая система………………………………………………………………………. 349

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

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

Задачи………………………………………………………………………………………………………………………………………. 353

Глава 10. Быстро развивающиеся направления в области
генеративного ИИ………………………………………………………………………………… 355

Оптимизация предпочтений……………………………………………………………………………………………………. 355

Длинные контексты…………………………………………………………………………………………………………………. 357

Смесь экспертов……………………………………………………………………………………………………………………….. 360

Оптимизации и квантование…………………………………………………………………………………………………… 362

Данные……………………………………………………………………………………………………………………………………… 364

Одна модель, чтобы править всеми……………………………………………………………………………………….. 365

Компьютерное зрение……………………………………………………………………………………………………………… 365

Компьютерное зрение 3D………………………………………………………………………………………………………… 368

Генерация видео………………………………………………………………………………………………………………………. 369

Мультимодальность………………………………………………………………………………………………………………… 370

Сообщество………………………………………………………………………………………………………………………………. 373

Приложение A. Инструменты с открытым исходным кодом………………… 375

Стек Hugging Face…………………………………………………………………………………………………………………….. 375

Данные……………………………………………………………………………………………………………………………………… 376

Обертки…………………………………………………………………………………………………………………………………….. 377

Локальный вывод…………………………………………………………………………………………………………………….. 377

Инструменты развертывания………………………………………………………………………………………………….. 378

Приложение B. Требования к памяти для моделей LLM………………………. 379

Требования к памяти вывода………………………………………………………………………………………………….. 379

Требования к памяти для обучения……………………………………………………………………………………….. 380

Для дополнительного чтения………………………………………………………………………………………………….. 380

Приложение C. Сквозная генерация, дополненная поиском………………… 381

Обработка данных…………………………………………………………………………………………………………………… 381

Эмбеддинги документов………………………………………………………………………………………………………….. 383

Извлечение……………………………………………………………………………………………………………………………….. 384

Генерация…………………………………………………………………………………………………………………………………. 385

RAG на уровне производства…………………………………………………………………………………………………. 387

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

Об авторах……………………………………………………………………………………………. 393

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

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

Game++. Устройство и оптимизация игрового движка

Game++. Устройство и оптимизация игрового движка

Книга рассказывает о тонкостях разработки игрового движка на языке C++.  На материале компьютерных игр AAA-класса подробно разобран полный спектр работы со сложными программами на C++, способы оптимизации кода, структуры данных и их выбор для достижения максимальной производительности. Особое внимание уделено стандартной библиотеке шаблонов (STL) языка C++, многопоточной обработке, а также решению непредвиденных проблем, связанных с неопределённым поведением, поддержкой и обновлением сложнейших баз кода, а также поддержке работоспособности высоконагруженных систем.

Для программистов С++

 

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

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

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

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

Ключевые темы:

  • Архитектура игровых движков
  • Работа с памятью в компьютерных играх AAA-класса и других приложениях с высокими требованиями к производительности
  • Структуры данных языка С++
  • Работа со стандартной библиотекой шаблонов C++ (STL)
  • Обработка исключений
  • Неопределённое поведение и способы его предотвращения
  • Память и аллокаторы
  • Оптимизация в C++
  • Многопоточность
  • Классические паттерны проектирования применительно к разработке игр
Кушниренко Сергей Сергеевич

Сергей Кушниренко — разработчик с более чем двадцатилетним опытом программирования и создания игр. Выпускник Национального исследовательского университета ИТМО. Начинал карьеру с разработки программного обеспечения для военно-морских тренажеров, навигационных систем и сетевых решений. Последние пятнадцать лет специализируется на разработке игр: в Electronic Arts занимался оптимизацией игр The Sims и SimCity BuildIt, в Gaijin Entertainment руководил переносом игр на платформы Nintendo Switch и Apple TV. Активно участвует в проектах с открытым исходным кодом, включая библиотеку ImSpinner и проект восстановления игры Pharaoh (1999).

Книгу “Game++. Устройство и оптимизация игрового движка” можно купить в нашем интенет-магазине.

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

Disclaimer……………………………………………………………………………………………….. 13

От автора……………………………………………………………………………………………….. 15

Отзыв…………………………………………………………………………………………………….. 17

Кому стоит прочитать эту книгу?…………………………………………………………… 19

Часть I. Основы……………………………………………………………………………….. 21

0x10. С++, движки и архитектуры………………………………………………………….. 23

Почему С++?………………………………………………………………………………………………………………………………. 23

Что такое игровой движок?……………………………………………………………………………………………………….. 24

Первый главный вопрос — зачем?…………………………………………………………………………………………… 25

Второй главный вопрос — а надо ли?…………………………………………………………………………………….. 28

Либы + cmake != движок……………………………………………………………………………………………………………. 28

Полезности…………………………………………………………………………………………………………………………………. 30

Программирование……………………………………………………………………………………………………………………. 31

Главное окно (Main window)…………………………………………………………………………………………………….. 31

Игровой цикл………………………………………………………………………………………………………………………………. 32

Пользовательский ввод……………………………………………………………………………………………………………… 32

Графика………………………………………………………………………………………………………………………………………. 34

Ресурсы……………………………………………………………………………………………………………………………………….. 35

Вывод звука………………………………………………………………………………………………………………………………… 37

Физика…………………………………………………………………………………………………………………………………………. 37

AI…………………………………………………………………………………………………………………………………………………. 38

…Behavior Trees (BT)………………………………………………………………………………………………………….. 39

…GOAP (Goal-Oriented Action Planning)…………………………………………………………………………….. 39

…FSM (Finite State Machine)………………………………………………………………………………………………. 39

…Utility AI……………………………………………………………………………………………………………………………. 40

…экзотика: HTN, ML, Neural Nets, RL……………………………………………………………………………….. 40

…pathfinding………………………………………………………………………………………………………………………… 41

…navmesh……………………………………………………………………………………………………………………………. 41

…AI — это не про “умных врагов”…………………………………………………………………………………….. 42

Скрипты и конфиги…………………………………………………………………………………………………………………….. 42

…это не про производительность и не про fps…………………………………………………………………. 43

…это про удобство и скорость разработки………………………………………………………………………. 43

…на удивление, это про безопасность……………………………………………………………………………… 43

…это про реконфигурабельность проекта в целом………………………………………………………….. 44

…это дверь для комьюнити………………………………………………………………………………………………… 44

…это — всем не угодишь……………………………………………………………………………………………………. 44

Сеть……………………………………………………………………………………………………………………………………………… 45

…синхронизация состояний………………………………………………………………………………………………. 45

…предсказание ввода и откат (rollback netcode)……………………………………………………………… 46

…интерполяция, экстраполяция, сглаживание………………………………………………………………… 46

…безопасный протокол общения………………………………………………………………………………………. 47

…шифрование (параноиками просто так не становятся)………………………………………………… 47

…репликация объектов………………………………………………………………………………………………………. 47

…логирование и отладка……………………………………………………………………………………………………. 48

…борьба с читерами…………………………………………………………………………………………………………… 48

UI…………………………………………………………………………………………………………………………………………………. 48

Tools…………………………………………………………………………………………………………………………………………….. 49

…конвертеры уровня………………………………………………………………………………………………………….. 50

…проверка ресурсов…………………………………………………………………………………………………………… 50

Архитектура……………………………………………………………………………………………………………………………….. 50

…нет архитектуры — тоже архитектура………………………………………………………………………….. 51

…godobject — тоже архитектура………………………………………………………………………………………. 51

…ECS — модно! Но…………………………………………………………………………………………………………….. 52

Игра-движок……………………………………………………………………………………………………………………………….. 52

0x11. Архитектуры игровых движков…………………………………………………….. 55

Unity (Unitary Architecture)………………………………………………………………………………………………………… 57

Big Ball of Mud……………………………………………………………………………………………………………………. 58

Unreal Engine (Layered Architecture)………………………………………………………………………………………….. 62

CryEngine (Microkernel Architecture)…………………………………………………………………………………………. 66

Dagor (Data-driven Architecture)………………………………………………………………………………………………… 70

X-Ray Engine (Monolith Architecture)………………………………………………………………………………………… 72

Godot (Modules/Services Architecture)……………………………………………………………………………………….. 76

Часть II. Оптимизации…………………………………………………………………. 79

0x20. Какие бывают оптимизации…………………………………………………………. 81

Оптимизации на уровне архитектуры (~50% прироста)………………………………………………………… 83

Оптимизации на уровне алгоритмов/структур (~30%)…………………………………………………………… 84

Оптимизации на уровне исходного кода (~10%)…………………………………………………………………….. 85

Игровые реплеи (~?%)……………………………………………………………………………………………………………….. 91

Изоляция компонентов (~5%)……………………………………………………………………………………………………. 91

Специфичные низкоуровневые оптимизации (<3%)……………………………………………………………….. 92

Все остальное (~10%)………………………………………………………………………………………………………………… 92

Тесты производительности (Benchmarks)……………………………………………………………………………….. 92

Измерения…………………………………………………………………………………………………………………………………… 94

Изменения и интуиция инженера……………………………………………………………………………………………… 95

“Горячие” функции и “бутылочные горлышки”………………………………………………………………………. 96

“Горячие” функции (Hotspots)…………………………………………………………………………………………… 97

“Бутылочное горлышко” (Bottlenecks)……………………………………………………………………………… 97

Заблуждения и мифы…………………………………………………………………………………………………………………. 99

Инструменты……………………………………………………………………………………………………………………………. 102

Теория и термины…………………………………………………………………………………………………………….. 103

История одной оптимизации…………………………………………………………………………………………………… 106

Упаковка булевых значений…………………………………………………………………………………………………… 111

Без упаковки……………………………………………………………………………………………………………………… 112

std::bitset……………………………………………………………………………………………………………………………. 114

сustom_bitset……………………………………………………………………………………………………………………… 114

Выводы……………………………………………………………………………………………………………………………………… 120

0x21. Оптимизации строк…………………………………………………………………….. 123

Пул строк (String interning)………………………………………………………………………………………………………. 123

Не совсем строки……………………………………………………………………………………………………………………… 126

Реализация xstring……………………………………………………………………………………………………………………. 129

Как использовать…………………………………………………………………………………………………………………….. 131

Влияние на архитектуру…………………………………………………………………………………………………………. 132

Идентификаторы (Identifiers)………………………………………………………………………………………………….. 133

Короткие строки (Short String Optimisation)…………………………………………………………………………… 135

Короткоживущие строки (Short Live String)…………………………………………………………………………… 137

Долгоживущие строки (Long Live String)……………………………………………………………………………….. 141

Арены строк……………………………………………………………………………………………………………………………… 142

0x22. Оптимизации массивов……………………………………………………………….. 145

Оптимизация массивов (Cooking vectors)………………………………………………………………………………. 145

Недостатки векторов……………………………………………………………………………………………………………….. 150

Фиксированный массив (Fixed array)……………………………………………………………………………………… 155

Размерность стека……………………………………………………………………………………………………………………. 159

Статический вектор (Static vector)………………………………………………………………………………………….. 160

Гибридный вектор (Hybrid vector)………………………………………………………………………………………….. 164

“Холодные” и “горячие” данные (Hot/Cold data layout)……………………………………………………….. 166

0x23. Оптимизации аллокаторов………………………………………………………….. 169

Такие разные аллокаторы (Dancing with allocators)……………………………………………………………… 169

Управление памятью (Memory management)……………………………………………………………………….. 170

Ручное управление памятью (Manual memory management)……………………………………………… 172

Подсчет ссылок (RC, References counting)…………………………………………………………………………….. 173

Автоматический подсчет ссылок (ARC)………………………………………………………………………………… 174

Уникальное владение (Unique ownership)………………………………………………………………………………. 177

Фрагментация (Fragmentation)……………………………………………………………………………………………….. 178

Внутренняя фрагментация (Internal fragmentation)………………………………………………………. 178

Внешняя фрагментация (External fragmentation)…………………………………………………………… 179

Блок, заголовок, время жизни (block, header, lifetime)…………………………………………………………… 180

Получение ресурса есть инициализация (RAII, Resource Acquisition Is Initialization)………. 181

Утечка памяти (Memory leak)…………………………………………………………………………………………………. 182

Повторное освобождение (Double free)………………………………………………………………………………….. 183

“Висячие” указатели (Dangling pointers)…………………………………………………………………………………. 184

Повреждения кучи (Heap corruption)……………………………………………………………………………………… 185

Оборонительное программирование (Defensive programming)……………………………………………. 186

Умные указатели (Smart pointers)…………………………………………………………………………………………… 187

Собственные менеджеры памяти (Custom allocators)…………………………………………………………… 187

Отложенное освобождение (Lazy destroy)…………………………………………………………………………….. 188

Выделенная область памяти (Мemory arena)……………………………………………………………………….. 189

Дескрипторы объектов (Object handle)………………………………………………………………………………….. 190

Зависимости (Dependencies)……………………………………………………………………………………………………. 191

Каскадная очистка (Cascade cleanup)……………………………………………………………………………………. 193

Гонки данных (Data race)………………………………………………………………………………………………………… 194

Память-безопасные алгоритмы (Memory-safe algorithms)…………………………………………………… 195

Внутренняя изменяемость (Interior mutability)………………………………………………………………………. 196

Регистры процессора (CPU registers)………………………………………………………………………………………. 197

Отображение памяти (Memory mapping)………………………………………………………………………………. 198

Динамическая оперативная память (DRAM, Dynamic Random Access Memory)………………. 199

Прямой доступ к памяти (DMA, Direct memory access)………………………………………………………… 199

Выравнивание (Alignment)………………………………………………………………………………………………………. 200

Жизненный цикл инструкций………………………………………………………………………………………………….. 201

Предвыборка данных (Prefetching)…………………………………………………………………………………………. 203

Стек и куча (Stack vs Heap)…………………………………………………………………………………………………….. 204

Линейный аллокатор (Linear allocator)………………………………………………………………………………….. 205

Линейный аллокатор с откатом (Step-back allocator)…………………………………………………………… 208

Фреймовый аллокатор (Frame allocator)……………………………………………………………………………….. 210

Двойной фреймовый аллокатор (Double-frame allocator)…………………………………………………….. 212

Пример несогласованного поведения…………………………………………………………………………….. 215

N-фреймовый аллокатор (N-Frame allocator)………………………………………………………………………… 217

Стековый аллокатор (Stack allocator)……………………………………………………………………………………. 218

Двойной стековый аллокатор (Double-stack allocator)…………………………………………………………. 223

Двойной стековый аллокатор с общим началом (Pointed Double-Stack Allocator)……………. 227

Тройной стековый аллокатор (Triple-stack allocator)……………………………………………………………. 229

Пул памяти (Pool allocator)……………………………………………………………………………………………………… 233

Аллокатор со списком свободных блоков (Free list allocator)………………………………………………. 238

Аллокатор со свободными блоками под разные размеры (Segregated free lists)………………… 243

Парадокс скорости vs фрагментации…………………………………………………………………………………….. 246

Аллокатор готовых объектов (Slab-allocator)……………………………………………………………………….. 246

Аллокатор методом близнецов (Buddy allocator)…………………………………………………………………. 248

Арена объектов (Region-Based allocator)……………………………………………………………………………….. 251

Аллокатор с локальным кэшем для потока (Thread-cache allocator)………………………………….. 257

Фибоначчи аллокатор (Fibonacci allocator)…………………………………………………………………………… 261

Сжимающий аллокатор (Compacting allocator)……………………………………………………………………. 264

Двухуровневый аллокатор с разделением по размерам (Two-Level Segregated Fit)………….. 267

“Цветной” аллокатор (Color-based allocator)…………………………………………………………………………. 271

Аллокатор с отслеживанием времени жизни
(TTL Allocator, Time-to-live, Tracked- time-live)……………………………………………………………………… 273

Аллокатор с агрессивной рандомизацией адресов (Chaos allocator)…………………………………. 273

Аллокаторы != “серебряная пуля”………………………………………………………………………………………….. 275

0x24. Оптимизации контейнеров………………………………………………………….. 277

Контейнеры………………………………………………………………………………………………………………………………. 277

Инвалидация итераторов………………………………………………………………………………………………………… 278

Фиксированный массив (Fixed array)……………………………………………………………………………………… 279

Матрица (Matrix)……………………………………………………………………………………………………………………… 281

Неравномерная матрица (Ragged matrix, jagged arrays)………………………………………………………. 282

Динамическая матрица (Dynamic matrix)……………………………………………………………………………… 285

Динамический массив (Dynamic array, vector)………………………………………………………………………. 286

Стабильный вектор (Stable vector)…………………………………………………………………………………………. 288

Разреженный массив (Sparse array/vector)…………………………………………………………………………….. 292

Парадокс “ленивой сортировки”…………………………………………………………………………………….. 294

Упакованный вектор (Packed vector)……………………………………………………………………………………… 294

Гибридный вектор (Small/Hybrid vector)……………………………………………………………………………….. 296

Парадокс малых размеров………………………………………………………………………………………………. 300

Массив с отложенным удалением (Dirty vector)……………………………………………………………………. 300

Массив с чередованием (Buddy array)…………………………………………………………………………………… 304

Двусторонняя очередь (Deque, Double Ended Queue)…………………………………………………………… 306

Двусторонняя очередь со сжатием (Block-compressed deque)…………………………………………….. 308

Двусторонняя очередь с приоритетами (Bounded priority deque)……………………………………….. 310

Интрузивная двусторонняя очередь/список (Intrusive deque/list)………………………………………… 313

Пополняемый массив (Expandable vector)…………………………………………………………………………….. 316

Структурированное дерево данных (LSM, Level structured merge)…………………………………….. 318

Октодерево (Octree)………………………………………………………………………………………………………………….. 320

Квадродерево (Quadtree/btree)……………………………………………………………………………………………….. 325

Кольцевой буфер (Circular buffer)…………………………………………………………………………………………… 326

Хеш-таблица с мемоизацией (Memoization hashtable)…………………………………………………………. 330

Массив дескрипторов (Handle array)……………………………………………………………………………………… 333

Текстурный атлас (Texture atlas)……………………………………………………………………………………………. 337

Слотовый массив (Slot array)………………………………………………………………………………………………….. 341

0x25. Нескучное программирование…………………………………………………….. 345

Что такое нескучное программирование (Heapless programming)………………………………………. 345

Стек (Stack)………………………………………………………………………………………………………………………………. 353

Динамическая память (Heap)………………………………………………………………………………………………….. 359

Статическая память (Static)…………………………………………………………………………………………………….. 365

Компромиссы динамических объектов………………………………………………………………………………….. 367

Детерминизм стека…………………………………………………………………………………………………………………… 369

Утечки и оптимизации…………………………………………………………………………………………………………….. 370

Не использовать new?……………………………………………………………………………………………………………… 371

Локальные строки……………………………………………………………………………………………………………………. 373

Локальный полиморфизм (Ad-hoc polymorphism)………………………………………………………………… 375

std::get_if…………………………………………………………………………………………………………………………… 376

std::visit……………………………………………………………………………………………………………………………… 377

std::variant::index……………………………………………………………………………………………………………… 378

Оптимизируем векторы……………………………………………………………………………………………………………. 379

Оптимизация тайловой карты………………………………………………………………………………………………… 386

Работа с размеченной памятью (Preallocations)……………………………………………………………………. 388

“Тяжелые” логи………………………………………………………………………………………………………………………… 392

Часть III. Библиотека C++…………………………………………………………… 397

0x30. STL и алгоритмы…………………………………………………………………………. 399

Нестандартные стандарты…………………………………………………………………………………………………….. 399

Использование SIMD………………………………………………………………………………………………………………. 402

Алгоритмы………………………………………………………………………………………………………………………………… 404

Ортогональность данных и алгоритмов………………………………………………………………………………… 407

Итераторы………………………………………………………………………………………………………………………………… 409

Кэширование шейдеров (практический пример)………………………………………………………………….. 413

Как сделать через алгоритмы?……………………………………………………………………………………….. 415

Часто используемые алгоритмы…………………………………………………………………………………………….. 415

all_of………………………………………………………………………………………………………………………………….. 416

all_of (вредные советы)……………………………………………………………………………………………………. 417

any_of………………………………………………………………………………………………………………………………… 418

any_of (вредные советы)………………………………………………………………………………………………….. 419

find, find_if, find_if_not……………………………………………………………………………………………………. 420

find (вредные советы)………………………………………………………………………………………………………. 420

adjacent_find…………………………………………………………………………………………………………………….. 422

adjacent_find (вредные советы)………………………………………………………………………………………. 423

move, move_backward……………………………………………………………………………………………………….. 424

move (вредные советы)…………………………………………………………………………………………………….. 425

copy, copy_n, copy_if, copy_backward…………………………………………………………………………….. 425

count, count_if…………………………………………………………………………………………………………………… 426

count (вредные советы)……………………………………………………………………………………………………. 426

mismatch…………………………………………………………………………………………………………………………….. 427

mismatch (вредные советы)………………………………………………………………………………………………. 428

equal………………………………………………………………………………………………………………………………….. 429

equal (вредные советы)……………………………………………………………………………………………………. 429

is_permutation…………………………………………………………………………………………………………………… 431

is_permutation (вредные советы)…………………………………………………………………………………….. 431

search, search_n………………………………………………………………………………………………………………… 433

search (вредные советы)…………………………………………………………………………………………………… 433

replace, replace_if, replace_copy, replace_copy_if…………………………………………………………. 434

replace (вредные советы)…………………………………………………………………………………………………. 435

transform……………………………………………………………………………………………………………………………. 436

transform (вредные советы)……………………………………………………………………………………………… 437

remove, remove_if, remove_copy, remove_copy_if……………………………………………………………. 438

remove (вредные советы)………………………………………………………………………………………………….. 439

unique, unique_copy…………………………………………………………………………………………………………. 439

unique (вредные советы)………………………………………………………………………………………………….. 440

fill, fill_n……………………………………………………………………………………………………………………………. 441

fill (вредные советы)………………………………………………………………………………………………………… 441

generate, generate_n…………………………………………………………………………………………………………. 442

generate (вредные советы)……………………………………………………………………………………………….. 443

sort, partial_sort………………………………………………………………………………………………………………… 443

partial_sort (вредные советы)………………………………………………………………………………………….. 445

nth_element……………………………………………………………………………………………………………………….. 446

nth_element (вредные советы)…………………………………………………………………………………………. 446

reverse, reverse_copy…………………………………………………………………………………………………………. 447

merge………………………………………………………………………………………………………………………………….. 448

merge (вредные советы)……………………………………………………………………………………………………. 449

Часть IV. Многопоточность…………………………………………………….. 451

0x40. Мультипоточное программирование…………………………………………… 453

Конкурентность (Concurrency)……………………………………………………………………………………………….. 453

Масштабируемость (Scalability)…………………………………………………………………………………………….. 454

Cоперничество за ресурс (Contention)…………………………………………………………………………………… 455

Изолированное состояние (Separate state)…………………………………………………………………………….. 456

Общее состояние (Shared state)………………………………………………………………………………………………. 457

Копия состояния (Shadow state)……………………………………………………………………………………………… 458

Работа с потоками…………………………………………………………………………………………………………………… 459

Аналогия с реальным миром…………………………………………………………………………………………… 460

Проблемы потоков…………………………………………………………………………………………………………… 461

История одного бага, или многопоточный AI, который всех победил……………………………….. 465

Неблокирующая логика………………………………………………………………………………………………….. 465

Как было до С++11?………………………………………………………………………………………………………………… 467

Неблокирующие алгоритмы (non-blocking, lock-free, wait-free)…………………………………………… 471

Зачем куда-то уходить от мьютексов?…………………………………………………………………………………… 473

Атомарные операции………………………………………………………………………………………………………………. 475

Спинлок…………………………………………………………………………………………………………………………………….. 476

“Голодание” потоков (Thread starvation)……………………………………………………………………………….. 477

Алгоритмическое “голодание”………………………………………………………………………………………… 478

Эффекты кэша…………………………………………………………………………………………………………………… 479

Хороший спинлок для игры…………………………………………………………………………………………………….. 495

Практические советы………………………………………………………………………………………………………………. 498

Задачи (Tasks)………………………………………………………………………………………………………………………….. 500

Подвисания, подтормаживания (Hitching, Stutters)……………………………………………………………….. 502

Обращение к системе ресурсов (I/O hitching)………………………………………………………………… 502

Неправильная работа с потоками (Thread hitching)……………………………………………………… 503

Сборка мусора (GC hitching)…………………………………………………………………………………………… 504

Проблемы железа (Graphics hitching/stutters)…………………………………………………………………. 504

Рабочие потоки (Workers)……………………………………………………………………………………………………….. 505

Схема “один поток на ядро”……………………………………………………………………………………………. 505

Схема “два потока на ядро”……………………………………………………………………………………………. 507

Модель независимых задач (Embarrassingly Parallel Model)………………………………………………… 508

Модель с выборкой данных (Stateless workers)……………………………………………………………………… 511

Цепочки задач (Workers chain)……………………………………………………………………………………………….. 512

Часть V. Паттерны………………………………………………………………………… 521

0x50. Паттерны разработки………………………………………………………………….. 523

Фреймворки умирают, математика не стареет……………………………………………………………………… 523

Cиняя книга………………………………………………………………………………………………………………………………. 525

Синдром фломастера………………………………………………………………………………………………………………. 527

Уровни паттернов……………………………………………………………………………………………………………………. 528

Команда (Command)……………………………………………………………………………………………………………….. 530

Недостатки……………………………………………………………………………………………………………………….. 533

Возможности для расширения………………………………………………………………………………………… 533

Совместимость…………………………………………………………………………………………………………………. 534

Плохие примеры внедрения…………………………………………………………………………………………….. 534

Состояние (State)……………………………………………………………………………………………………………………… 536

Конечный автомат (Finite State Machine)………………………………………………………………………………. 537

Детерминированный конечный автомат (Deterministic [basic] FSM)…………………………… 539

Недетерминированный конечный автомат (Nondeterministic FSM)…………………………….. 540

Автомат состояний со стеком (FSM + pushdown states)………………………………………………… 541

Конечный автомат на основе состояний (State-based/Object-model FSM)…………………. 542

Возможности для расширения………………………………………………………………………………………… 544

Влияние на архитектуру…………………………………………………………………………………………………. 545

Недостатки……………………………………………………………………………………………………………………….. 546

Плохие примеры использования…………………………………………………………………………………….. 547

Разделяемый объект / Приспособленец (Flyweight)………………………………………………………………. 549

Влияние на архитектуру…………………………………………………………………………………………………. 551

Недостатки……………………………………………………………………………………………………………………….. 552

Совместимость…………………………………………………………………………………………………………………. 553

Плохие примеры использования…………………………………………………………………………………….. 553

Наблюдатель (Observer)………………………………………………………………………………………………………….. 555

Возможности для расширения………………………………………………………………………………………… 559

Влияние на архитектуру…………………………………………………………………………………………………. 560

Недостатки……………………………………………………………………………………………………………………….. 560

Совместимость…………………………………………………………………………………………………………………. 561

Примеры плохого использования…………………………………………………………………………………… 562

Шина событий (Event bus)………………………………………………………………………………………………………. 564

Возможности для расширения………………………………………………………………………………………… 566

Влияние на архитектуру…………………………………………………………………………………………………. 567

Недостатки……………………………………………………………………………………………………………………….. 568

0x51. “Ленивая” логика……………………………………………………………………….. 569

Флаг изменения (Dirty flag)……………………………………………………………………………………………………… 569

Влияние на архитектуру…………………………………………………………………………………………………. 572

Недостатки……………………………………………………………………………………………………………………….. 572

Совместимость…………………………………………………………………………………………………………………. 573

Примеры плохого использования…………………………………………………………………………………… 574

Слой логики (Update layer)……………………………………………………………………………………………………… 576

Ближний слой (Close Layer)…………………………………………………………………………………………….. 576

Средний слой (Mid Layer)……………………………………………………………………………………………….. 577

Дальний слой (Far Layer)…………………………………………………………………………………………………. 577

“Замороженные” объекты (Frozen Layer)……………………………………………………………………….. 578

Реализация………………………………………………………………………………………………………………………… 579

Влияние на архитектуру…………………………………………………………………………………………………. 580

Недостатки……………………………………………………………………………………………………………………….. 580

Совместимость…………………………………………………………………………………………………………………. 581

Примеры плохого использования…………………………………………………………………………………… 581

Что дальше?……………………………………………………………………………………………………………………………… 583

0xFF. Игры — это искусство………………………………………………………………… 585

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

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