# «Если хочешь денег — пиши банки»: путь архитектора WoT Blitz

Источник: https://www.youtube.com/watch?v=QQZmDWnV618
Канал: ITBeard
Опубликовано: 20.05.2020

---

«Если хочешь денег — иди пиши банки, там платят только за надежность и молчание», — утверждает Леонид, Lead Core Developer в WoT Blitz. Проделав путь от школьника со средним баллом 3,7 до архитектора игровых движков, он уверен: выбор крутого наставника важнее стека технологий, а обучение программированию на C++ без понимания «железа» — это профессиональное преступление.

## 🛠 Сломленные игрушки и жажда понимания: как рождается инженер
[[JUMP:01:11]]

История Леонида, ныне ведущего разработчика в Wargaming, начинается не с олимпиад по программированию, а с обычного дворового детства в Витебске. Учёба в средней школе №22 не была для него приоритетом: средний балл 3,7 и репутация «раздолбая» вполне устраивали будущего инженера [3:02]. Леонид открыто признаётся, что до сих пор считает школьную систему во многом избыточной — по его мнению, она важна для социализации и общения, но не для получения реальных знаний, которые при необходимости можно усвоить гораздо быстрее самостоятельно [3:23]. 

Несмотря на плохую успеваемость по гуманитарным предметам, где учителя ставили «тройки» просто за хорошее поведение и тишину в классе [4:09], в Леониде рано проснулось врождённое инженерное любопытство. Семья потомственных инженеров — отец, мать и дед — создала среду, в которой вопрос «как это устроено?» был естественным. Это любопытство часто принимало радикальные формы: новую игрушечную машину могли разобрать или разбить молотком уже через пять минут после покупки, чтобы просто посмотреть, почему у неё крутятся колёса и как работает мотор [4:52]. 

### Любопытство как метод познания мира
[[JUMP:12:39]]

Особое место в формировании технического склада ума заняли видеоигры и попытки понять логику работы электроники. Леонид вспоминает, как они с дедом часами разглядывали экран телевизора, замечая точки красного, синего и зелёного цветов (RGB), и задавались вопросом: как по двум жилам кабеля-«тюльпана» передаётся такое невероятное количество цветовой информации [15:04]. 

Ещё одним философским вопросом стала «магия» восьмибитных консолей. Леонида поразило, что приставка Dendy, не имея батареек или встроенных часов, каждый раз при включении баскетбольного симулятора NBA выдавала разные «рандомные» матчи в демо-режиме [13:05]. 
> «Я думал: это чудо, почему это происходит? Я вынимал из розетки, вставлял картридж, нажимал Reset и понимал, что железка была чуть умнее, чем кажется» [13:37].

Это стремление докопаться до самой сути — от устройства транзистора до работы ядра операционной системы — позже станет его главным преимуществом при изучении C++. В разговоре с Алексеем Картынником герой отмечает, что именно этот «низкоуровневый» интерес помог ему в будущем не просто писать код, а понимать, как виртуальная машина Java или компилятор C++ взаимодействуют с железом [5:23].

### Выбор пути: почему Могилёв, а не Минск?
[[JUMP:09:26]]

Путь в высшее образование был тернистым и начался с внезапного решения. После школы Леонид всерьёз планировал идти в армию, что очень расстраивало его мать [1:57]. Однако за две недели до вступительных экзаменов, лежа на пляже в Витебске и слушая разговоры сверстников, он внезапно осознал, что студенчество — это совершенно другой, захватывающий уровень жизни. Спешно собрав деньги на подачу документов, он начал искать варианты [2:26].

Ключевым фактором выбора вуза стала неуверенность в себе. Несмотря на то что в старших классах Леонид подтянул знания благодаря строгой дисциплине в витебской гимназии №1 (куда он перевёлся из-за любви к девушке) [17:21], он побоялся ехать в Минск.
> «Я выбрал Белорусско-Российский университет в Могилёве только по одной причине — я в себя не верил. Думал, что все умные поедут в Минск, и у меня там ноль шансов» [10:14].

Леонид поступил на специальность «Инженер информационных технологий» (бывшая АСУ). Учёба давалась ему легко: за две недели до экзаменов он мог прорешать все билеты прошлых лет и сдать математику на высший балл [16:26]. Уже в университете он впервые столкнулся с программированием на Borland C++, хотя в то время у него даже не было собственного компьютера — лабораторные работы приходилось делать в вузовских классах на старых машинах после пар [21:33]. Свой первый ПК с процессором «Атлон» и 128 МБ оперативной памяти он купил только на втором курсе [22:43].

### Эра EPAM: первая работа и промышленный подход
[[JUMP:19:17]]

Карьера в IT началась для Леонида на третьем курсе университета, когда он прошёл трёхмесячные курсы в могилёвском офисе EPAM [19:17]. Это было время до «хайпа» в индустрии: студентами двигал не заработок, а искреннее желание создавать игры [22:12]. 

В EPAM (или «Япам», как его иронично называет герой) Леонид получил первый опыт работы с промышленными технологиями:

*   Начинал с .NET (C#) версии 2.0, которая тогда только появилась [23:28].
*   Позже перешёл на Java, занимаясь фронтендом и простыми задачами на бэкенде [23:53].
*   Работал над проектом сайта по продаже запчастей для немецких заказчиков [24:40].

Работа в крупной аутсорс-компании дала Леониду понимание процессов, систем контроля версий и взаимодействия с клиентом. 
> «EPAM для молодого студента — это как крутой завод, который делает „Мерседесы“. Тебе сразу показывают правильные процессы: как работать с кодом, как общаться с заказчиком. Это была очень сильная школа» [25:09].

Интересно, что Леонид осознанно отказался переходить с платного обучения на бюджетное, когда на третьем курсе появилась такая возможность. Он посчитал, что зарплата в EPAM позволит ему быстро окупить учёбу, тогда как переход на «бесплатное» означал бы обязательное двухлетнее распределение после вуза, что было экономически невыгодно [19:42]. На тот момент он уже четко видел свою цель в индустрии, хотя до настоящего геймдева и системного программирования на C++ оставалось ещё несколько важных шагов. Ранее в разговоре они вскользь касались того, что C++ — далеко не самый простой язык для входа, и путь Леонида через Java и .NET лишь подтверждает это.

## 🎮 Переломный момент: от первой книги до создания собственных движков

[[JUMP:25:09]]

После трёх с половиной лет работы в EPAM, о которых Алексей Картынник и Леонид говорили ранее, наступил момент перехода в настоящий геймдев. Несмотря на то что в «Эпаме» Леонид получил хорошую базу и даже в свободное время писал на Java собственный движок с двухмерной физикой и танками [29:05], его тянуло к разработке игр на C++. Шанс представился, когда его пригласили в могилёвский офис компании AVM Games. Этот период стал для разработчика временем профессионального самоутверждения, но путь к нему лежал через глубокий личный кризис и осознание того, как на самом деле работают технологии.

### «Программирование игр для Windows» и первая слеза программиста

[[JUMP:30:37]]

Одним из самых эмоциональных моментов в карьере Леонида стал период после окончания первого семестра университета. Возвращаясь домой из Могилёва в Витебск на дизель-поездах с пересадкой в Орше, он оказался один в пустом вагоне [30:04]. В этот момент его накрыло осознание профессиональной беспомощности: полгода учёбы позади, он научился сортировать массивы «пузырьком», но так и не приблизился к пониманию того, как создаются игры. 

> «Мне было так больно, это меня так разочаровало, что я реально заплакал. В вагоне никого нет, можно поплакать тихонько. У меня было внутреннее желание получить источник информации — как же всё-таки делать игры?» [30:37]

Ответом на этот запрос стала книга Андре Ламота «Программирование игр для Windows». Леонид вспоминает её как «зелёную книгу в мягком переплете», на которую у него тогда даже не хватило денег — пришлось покупать вскладчину с другом и читать по очереди [31:09]. Чуть позже он приобрёл вторую часть уже в твёрдом переплете. 

Эта книга перевернула всё. За один месяц Леонид изучил её от корки до корки, пошагово разбирая путь от вывода одного пикселя на экран до микширования звука. К началу второго курса он почувствовал колоссальный отрыв от университетской программы: пока однокурсники только учились подключать заголовочные файлы, он уже знал, как создавать DLL и работать с графическим конвейером [32:20].

### AVM Games: Смутное время ZIP-архивов и внедрение Lua

[[JUMP:32:42]]

Придя в могилёвскую компанию AVM Games, Леонид столкнулся с суровыми реалиями локального геймдева тех лет. В компании не было систем контроля версий — код передавали друг другу в ZIP-архивах, добавляя дату в название файла [33:10]. Леониду пришлось буквально «продавливать» установку SVN-сервера, преодолевая скепсис коллег-старожилов.

В AVM Games он занимался разработкой собственного игрового движка. В индустрии того времени это было нормой:

*   Движок рассматривался как библиотека общих задач для определённого типа игр (логика поля, правила ходов, анимации) [34:42].
*   Написание своего движка позволяло быстро штамповать сиквелы и новые игры на отработанной механике [35:23].

Интересный эпизод произошёл с внедрением скриптового языка Lua. Когда проект был почти готов, руководитель предложил добавить «какую-нибудь Луа» для гибкости [33:48]. Леонид, до этого не знакомый со встраиваемыми языками, разобрался в вопросе и «прикрутил» скрипты всего за три дня [34:03]. В итоге в компании параллельно развивались два движка: один писал Леонид, другой — главный программист Игорь Сычев. Несмотря на внутреннюю конкуренцию, оба движка оказались успешными и принесли компаниям прибыль. Именно тогда Леонид выпустил свою первую игру для Windows — «Roman Sofrom» (название по транскрипту) [38:09].

### Глубокое выгорание: армия, развод и «мотивация» от дяди

[[JUMP:38:41]]

Период успеха сменился затяжной черной полосой. Леонид ушёл из стабильной компании в стартап к друзьям, который обернулся финансовым крахом. В это же время он совершил, по его собственному признанию, ошибку — женился, не имея стабильного дохода. Сочетание работы без зарплаты в течение года и семейных неурядиц привело к разводу и профессиональному выгоранию [40:00]. 

Леонид был вынужден вернуться в Витебск к родителям. Чтобы не попасть в армию (от которой он до этого успешно «бегал», переводя личное дело между военкоматами Могилёва и Витебска [37:21]), он устроился неофициальным помощником тренера в спортзал, где занимались его родственники-тяжелоатлеты. 

> «Я просто ходил в зал и тренировался сам, тренировал маленьких детей... так продолжалось до тех пор, пока мой дядя не сказал: "Что ты нам тут втираешь, что ты какой-то программист? Если бы ты был настоящим программистом, а не лохом, ты бы уже давно в Минске работал"» [42:47].

Эта грубая, но честная манипуляция сработала. Обида на «непризнанность» заставила Леонида мобилизоваться. Он увидел, как его бывший студент из Могилёва уже работает лидом в Wargaming на «больших танках», и решил отправить резюме. После успешного интервью Леонид попал в команду World of Tanks Blitz [44:56].

Этот опыт научил его двум важным вещам, которые он сейчас транслирует джунам:

1.  **Миф о «прыжках» по компаниям:** Идея менять работу каждые два года — вредна для продуктовых компаний. Первые полгода уходят только на погружение в нюансы legacy-кода, и только через пару лет разработчик начинает видеть проект насквозь и принимать качественные архитектурные решения [46:44].
2.  **Выбор босса:** Важнее зарплаты на старте — адекватный руководитель, у которого можно перенять привычки и глубокие технические знания [49:34].

Работая над Blitz уже более пяти лет, Леонид отмечает, что проект постоянно обновляется: например, команда перевела игру на стандарт C++17, чтобы поддерживать интерес инженеров к современным технологиям [47:45].

## 🛡️ Фундамент индустрии: почему C++ правит миром и как найти своего наставника

[[JUMP:50:33]]

В карьере разработчика наступает момент, когда технологии отходят на второй план, уступая место человеческому фактору. Обсуждая роль лида, герой подчёркивает: выбор руководителя гораздо важнее выбора стека [51:37]. Правильный наставник формирует не только профессиональные навыки, но и фундаментальные привычки. В качестве примера приводится бытовая ситуация: лид Паша предпочитает подниматься на шестой этаж пешком, игнорируя очередь к лифту [50:58]. Эта деталь — символ дисциплины и рациональности, которые со временем перенимает и команда.

Если бы нужно было дать совет начинающему специалисту, он звучал бы так: «Найди крутого босса и иди к нему, хоть кофе носи» [51:37]. За три года работы под руководством сильного лидера можно освоить больше, чем за десятилетие хаотичного самообразования. В контексте Wargaming это особенно актуально: позиция Lead Core Developer подразумевает работу над «движком», где приходится заниматься кроссплатформенностью (Windows, macOS, iOS, Android) и инфраструктурой, освобождая геймплей-программистов от рутины [52:06]. Хотя путь героя начинался с амбиций геймдизайнера, суровая реальность индустрии быстро превратила его в программиста, который видит красоту не только в «крутящейся башне танка», но и в чистоте архитектуры сборки [53:23].

### Архитектура реальности: C++ как скрытый двигатель цифрового мира
[[JUMP:53:52]]

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

Большинство пользователей видят интерфейс и JavaScript-код веб-страниц, но внутри Chrome работает движок V8, написанный на C++ [56:11]. Его задача — на лету превращать JS в байт-код или нативный код процессора, соблюдая при этом строгие ограничения «песочницы» [56:53]. Весь рендеринг, работа с сетью, звуком и файловой системой в Chromium реализованы на «плюсах» [57:25]. Более того, когда программа запрашивает память или открывает сокет, она обращается к операционной системе, чьё ядро и драйверы также написаны на C/C++ [58:26]. 

Эта иерархия неизменна:

*   Верхний уровень: JavaScript, Python, Java (удобство и скорость разработки).
*   Средний уровень: Виртуальные машины и движки (V8, JVM, .NET Core), написанные на C++ [59:51].
*   Нижний уровень: Ядро ОС и драйверы (C/C++) [58:26].

Даже если разработчик пишет на Java, рано или поздно в высоконагруженных системах ему придётся «спуститься» на уровень виртуальной машины, чтобы поправить Garbage Collector (сборщик мусора) под конкретные задачи бизнеса [1:00:12]. В геймдеве этот выбор предопределён: чтобы игра работала на «самом мертвом железе» пользователя, необходимо выжимать максимум из ресурсов, что невозможно без прямого контроля, который дает C++ [1:01:22].

### Детерминизм против хаоса: RAII и математическая строгость шаблонов
[[JUMP:1:09:49]]

Одним из главных преимуществ C++ перед конкурентами (Java, C#) является концепция RAII (Resource Acquisition Is Initialization) и наличие детерминированных деструкторов [1:09:49]. В управляемых языках программист не может точно знать, когда сработает сборщик мусора и будет ли вызван финализатор объекта в конкретный момент времени [1:10:34]. В C++ порядок создания и разрушения объектов строго задан: как только объект выходит из области видимости, ресурс (память, файл, сетевое соединение) гарантированно освобождается.

Это критично при работе с тяжелыми ресурсами, например, 4K-текстурами в играх. В то время как в .NET или Java программисту приходится вручную вызывать методы очистки для «жирных» объектов, C++ позволяет автоматизировать этот процесс через жизненный цикл объекта [1:11:38].

Второй столп «плюсов» — это их математическая природа, воплощенная Александром Степановым в библиотеке STL и принципах обобщенного программирования [1:12:07]. Шаблоны в C++ — это не просто способ избежать дублирования кода, а инструмент создания универсальных алгоритмов (например, `std::find_if`), которые описываются на языке математики [1:12:36]. 

Преимущества такого подхода:

1.  **Производительность:** Компилятор генерирует максимально быстрый нативный код под конкретный процессор [1:13:22].
2.  **Долговечность:** Правильно написанный шаблонный алгоритм будет работать и через 200 лет, адаптируясь к новым типам данных [1:14:01].
3.  **Абстракция без потерь:** Вы можете передать в стандартную сортировку `std::sort` структуру любого размера, и алгоритм эффективно переместит области памяти, даже не зная внутренней специфики объекта [1:14:59].

Несмотря на критику ООП как «не единственной и не всегда лучшей парадигмы» (что иллюстрируется комичным примером с объектом «Ботинок» и методом «Завязать(Шнурки)»), C++ остается непревзойденным инструментом за счет сочетания низкоуровневого контроля и мощных математических абстракций [1:07:11]. Ранее в разговоре они касались темы первого опыта в IT, но именно здесь становится ясно, почему после всех стартапов и кризисов C++ остается фундаментом индустрии.

## 🔋 Математический подход к коду и борьба за заряд батареи
[[JUMP:1:15:28]]

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

### Шаблоны и математический подход Степанова
[[JUMP:1:15:44]]

В отличие от чистого C, где программист часто вынужден писать универсальные, но не всегда оптимальные функции (например, одну версию быстрой сортировки для всех типов данных), C++ предлагает механизм шаблонов. Этот подход, заложенный ещё Александром Степановым при создании STL, позволяет достичь математической точности и максимальной производительности [1:16:34].

Суть в том, что на уровне токенов код может выглядеть одинаково (например, оператор «меньше»), но для разных типов данных — будь то координаты, денежные суммы или сложные геометрические фигуры — компилятор C++ генерирует специфические, максимально оптимизированные версии алгоритма [1:16:52]. Это обеспечивает так называемую «нулевую стоимость абстракций». Платой за такую эффективность становится время компиляции: C++ собирается значительно медленнее конкурентов именно из-за необходимости «разворачивать» и оптимизировать шаблоны под каждый конкретный случай [1:17:24].

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

### Энергоэффективность и производительность мобильных игр
[[JUMP:1:23:18]]

C++ остаётся незаменимым в сферах, где ресурсы ограничены, а требования к отклику максимальны. В мобильном геймдеве, и в частности при разработке *World of Tanks Blitz*, на первый план выходит не только чистая скорость, но и энергоэффективность [1:23:49]. 

Современные смартфоны имеют сложную архитектуру с производительными и энергоэффективными ядрами. C++ позволяет разработчику настолько тонко управлять нагрузкой, чтобы игра не «сжигала» аккумулятор и не заставляла устройство перегреваться в руках пользователя. В языках с автоматическим управлением памятью (Managed languages) «сборщик мусора» может включиться в самый неподходящий момент — например, во время ответственного боя или важной презентации приложения, что приведёт к заметным фризам [1:22:04]. В C++ такая ситуация исключена: программист полностью контролирует время выполнения каждой операции.

Как отмечает гость, многие игроки в *Blitz* сознательно занижают настройки графики не из-за слабого железа, а чтобы «хватило ещё на один бой» [1:23:49]. В этом контексте C++ доминирует, так как позволяет выжать максимум из каждого ватта энергии. Интересно, что обучение «плюсовика» до уровня уверенного специалиста занимает около полутора лет интенсивной работы в опытной команде — за это время разработчик не просто учит синтаксис, а начинает понимать работу операционной системы и «железа» на глубоком уровне [1:24:28].

### Библиотеки и фреймворки: Boost, Qt и SQLite
[[JUMP:1:32:43]]

Инструментарий разработчика на C++ огромен и разнообразен, но в нём есть свои «титаны».

*   **Boost** [1:32:43]: Самая популярная и масштабная библиотека. Многие её части со временем перетекают в стандарт языка (STL). Это своего рода полигон для «хакеров C++». Несмотря на мощь, Boost часто критикуют в геймдеве за «тяжеловесность» и раздувание исполняемых файлов, поэтому использовать её нужно осторожно, отключая лишние модули [1:34:04].
*   **SDL (Simple DirectMedia Layer)** [1:34:51]: Незаменимый инструмент для работы с мультимедиа. Библиотека берёт на себя всё взаимодействие с системой: от создания окон и обработки ввода с двух мышек одновременно до вывода звука и работы с джойстиками. Она лежит в основе почти каждого второго игрового движка.
*   **Qt (Kute)** [1:36:15]: Это не просто библиотека, а «целый мир». В Qt реализованы собственные аналоги всех стандартных контейнеров (списков, векторов, строк). Фреймворк используется повсеместно: от бортовых компьютеров Mercedes и BMW до сложного инженерного софта вроде AutoCAD [1:37:09]. Долгое время Qt заменял собой отсутствующие в стандарте функции, такие как кроссплатформенная работа с файловой системой (которая появилась в STL только в 2017 году) [1:38:31].
*   **SQLite** [1:39:24]: Встроенная база данных, которая де-факто является стандартом для мобильной разработки. Она присутствует в каждом Android-приложении по умолчанию. В C++ проектах SQLite часто используется как надежное промежуточное хранилище данных [1:39:50].

В завершение темы инструментария упоминается появление современных пакетных менеджеров, таких как **vcpkg** от Microsoft, которые наконец-то упрощают подключение сторонних библиотек, делая этот процесс похожим на опыт в более молодых языках программирования [1:40:36].

## 🛠 Инструментарий и графика: от Emacs до Vulkan
[[JUMP:1:40:36]]

Современный C++ долгое время находился в позиции догоняющего, поскольку за ним не стояла одна конкретная корпорация, как Oracle за Java или Microsoft за .NET. Развитием «плюсов» занимается международный конгломерат на добровольных началах [1:41:17]. Однако сегодня ситуация изменилась: технологические гиганты вроде Google и Microsoft начали вливать огромные средства в стандарт, осознав важность энергоэффективности, о которой Алексей Картынник и его гость упоминали ранее в контексте мобильной разработки [1:41:56]. Теперь C++ становится по-настоящему единым и кроссплатформенным, что диктует новые требования к инструментам, которыми пользуется разработчик.

### Консольные редакторы и философия Linux
[[JUMP:1:45:30]]

Путь системного программиста часто начинается с IDE, но Леонид уверен: для достижения профессиональной зрелости необходимо «выходить в консоль». Его собственная эволюция инструментов прошла через все классические стадии: от стандартного Блокнота и Notepad++ до Sublime Text [1:44:48]. Однако настоящий прорыв в продуктивности случился после знакомства с концепцией работы без мыши, впервые опробованной в Eclipse, а затем доведенной до идеала в Vim и Emacs [1:45:42].

Леонид выделяет несколько причин, почему новичку стоит сразу устанавливать Linux и осваивать консольные редакторы:

*   **Вездесущность Linux:** Все современные серверы — от Amazon и Google до VK — работают на Linux [1:47:29]. Умение работать в терминале позволяет подключаться к удаленной машине и править код даже при «отвалившейся» графической подсистеме [1:48:22].
*   **Долговечность инструментов:** Emacs существует более 40 лет, и его популярность не падает [1:49:33]. Это инвестиция в навык, который не устареет через пару лет, в отличие от модных IDE.
*   **Продуктивность:** Использование «десятипальцевого метода» печати и горячих клавиш Vim/Emacs ускоряет работу с текстом на 30% и снижает утомляемость [1:50:56]. 

«Я рекомендую новичкам не тратить время на Windows, а сразу погружаться в Linux-среду», — подчеркивает гость [1:47:16]. Для тех, кто хочет совместить лучшее из двух миров, он советует сборку Spacemacs, которая объединяет мощь Emacs с удобством навигации Vim [1:51:31]. Главное — освоить слепую печать. Несмотря на то что программист пишет всего около 300 строк полезного кода в день, скорость перевода мысли в текст критически важна для сохранения фокуса [1:53:07].

### Графические API: революция Vulkan и влияние Google Stadia
[[JUMP:1:53:47]]

Обсуждая будущее графики, Леонид отмечает, что мир стоит на пороге больших перемен. Выход спецификации Vulkan 1.2 стал важной вехой: в день релиза драйверы под Linux уже были готовы, что раньше казалось немыслимым [1:54:00]. Этот рывок произошел благодаря колоссальным инвестициям Google и Valve. 

Google, стремясь развивать свой облачный игровой сервис Stadia, вкладывает огромные ресурсы в то, чтобы игры на Linux работали так же быстро и стабильно, как на Windows [1:54:33]. Это избавляет индустрию от монопольной зависимости от Microsoft и их DirectX. 

Важные изменения в экосистеме графических драйверов:

1.  **Open Source драйверы:** Intel и AMD активно открывают исходный код своих драйверов [1:55:34].
2.  **Консольное наследие:** В новых поколениях консолей используются чипы AMD с открытыми драйверами, что напрямую помогает развитию графики на домашних ПК с Linux [1:55:55].
3.  **Кроссплатформенность:** Vulkan становится основным графическим API будущего для геймдева, позволяя коду эффективно работать на самых разных устройствах [1:53:47].

Леонид советует студентам, мечтающим о геймдеве, начинать эксперименты с дистрибутивами вроде Fedora уже сейчас [1:56:08]. К моменту окончания вуза такой специалист будет обладать «божественным» уровнем понимания системы.

### Проблема «черного ящика» IDE и путь к мастерству
[[JUMP:1:56:36]]

Современные IDE (особенно Visual Studio) часто «грешат» тем, что скрывают от разработчика процесс сборки проекта. Леонид называет это «барьером сложности», который на самом деле легко преодолеть [1:56:51]. Важно понимать, как работает компилятор и линкер отдельно от графической оболочки. Без этого знания любая задача по кроссплатформенной сборке библиотеки под macOS, Android и Windows превращается для студента в «космос» [1:58:11].

В качестве фундаментального источника знаний Леонид рекомендует серию книг Андрея Столярова «Введение в профессию» [2:00:25]. Это четырехтомник, который последовательно ведет ученика от основ программирования на Pascal к ассемблеру, а затем к языку C и устройству ядра операционной системы [2:03:01]. 

«Обучать C++ как первому языку — это преступление», — считает гость [2:00:45]. По его мнению, сначала нужно понять, как работают указатели, память и системные вызовы в C, и только потом погружаться в «хаос» C++. Книги Столярова дают это системное понимание: прочитав их, разработчик осознает, что нет принципиальной разницы между копированием байтов в сокет или в файл [2:05:33]. Это снимает страх перед сложностью системного ПО и готовит почву для осознанного использования C++.

## Фундаментальный подход: от «Hello World» до архитектуры игрового движка
[[JUMP:2:08:59]]

### Путь Столярова: почему программирование — это надолго
[[JUMP:2:06:04]]

Освоение C++ на высоком профессиональном уровне — это процесс, который невозможно уместить в краткосрочные курсы. По мнению гостя, качественное обучение занимает минимум два года интенсивной работы, а в стандартном темпе может растянуться и на пять лет институтской программы [2:06:04]. Популярные сегодня трехмесячные интенсивы способны дать лишь поверхностные основы, которых категорически недостаточно для серьезной разработки системного ПО или игровых движков.

В вопросе методологии обучения гость выделяет подход Андрея Столярова как наиболее фундаментальный и правильный. Этот путь подразумевает движение «снизу вверх»: от основ Pascal и низкоуровневого ассемблера к глубокому пониманию устройства операционных систем, и только затем — к C++ [2:07:10]. Такая последовательность позволяет разработчику не просто зазубривать синтаксис, а понимать, как код взаимодействует с «железом» и ресурсами ОС.

Критике подвергается и эволюция учебной литературы. Даже книги Бьёрна Страуструпа, создателя языка, со временем изменились: если ранние издания (до третьего) придерживались поэтапного, академического изложения, то современные версии ориентированы на максимально быстрый вход. Теперь обучение часто начинается с использования стандартной библиотеки шаблонов (STL) без объяснения того, как она устроена внутри [2:07:51]. Гость убежден, что в учебниках примеры должны быть написаны безупречно, даже лучше, чем в рабочем коде, чтобы с первых шагов прививать студенту правильную культуру написания программ [2:08:45].

### Тест на адекватность: цена одной ошибки в «Hello World»
[[JUMP:2:08:59]]

Для проверки базовых навыков и «адекватности» новичков гость использует классическое упражнение — написание программы Hello World. Однако простого вывода строки на экран недостаточно. Большинство студентов и даже авторов учебников допускают фундаментальную ошибку: они не проверяют состояние выходного потока и коды возврата [2:10:24]. 

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

Основные тезисы «теста на адекватность»:

*   **Проверка кодов возврата:** Команда `return 0` в функции `main` — это не формальность, а статус завершения процесса, который операционная система или вызывающий скрипт должны интерпретировать [2:11:16].
*   **Состояние потоков:** Студентов редко учат проверять, успешно ли прошла запись в `std::cout`. В критических системах, таких как медицинское оборудование (например, кардиостимуляторы), отсутствие проверки успешности передачи данных может привести к фатальным последствиям [2:12:47].
*   **Культура обработки ошибок:** Общество и система образования приучают «халтурить», не задумываясь о том, что произойдет при сбое [2:11:34]. Профессиональный разработчик на C++ должен мыслить категориями исключений и проверок на каждом этапе.

Интересно, что гость не пренебрегает даже литературой серии «для чайников». Он вспоминает, как книга «C++ для чайников» открыла ему глаза на простые, но важные вещи, которые часто опускаются в «умных» многотомниках: например, правила именования файлов для обеспечения кроссплатформенности между Windows и Linux [2:17:41].

### Архитектура игры: бесконечный цикл и симуляция мира
[[JUMP:2:20:20]]

Устройство любой игры, от простейшего Марио до сложных проектов вроде World of Tanks Blitz, подчинено логике «главного цикла» (Main Loop). Это бесконечная итерация, в рамках которой программа постоянно обновляет состояние мира и отрисовывает кадры [2:20:20].

Типовой игровой цикл состоит из нескольких этапов:

1.  **Считывание ввода:** Программа опрашивает устройства (геймпад, клавиатуру) и определяет действия игрока [2:25:06].
2.  **Обновление мира (Update):** На основе прошедшего времени (delta time) пересчитываются координаты объектов, физические взаимодействия и логика поведения персонажей.
3.  **Отрисовка (Render):** Измененное состояние мира передается на видеокарту. В современном геймдеве это происходит через графические API: Vulkan, DirectX, OpenGL или Metal [2:21:02].
4.  **Воспроизведение звука:** Команды отправляются на звуковую карту для микширования аудиопотоков (выстрелы, музыка, окружение) [2:26:29].

Для реализации логики поведения объектов (ботов, врагов, окружения) чаще всего используются конечные автоматы (Finite State Machines). Это математическая модель, где объект может находиться в одном из строго определенных состояний (например, «стоит», «бежит», «атакует»), а переходы между ними задаются таблицей условий [2:26:45]. Каждую 1/30 или 1/60 долю секунды программа проверяет эти условия, обсчитывает коллизии (столкновения) и обновляет кадр [2:27:34]. 

В многопользовательских играх, таких как Blitz, эта схема усложняется наличием сетевого слоя. Клиент не просто рисует картинку, он постоянно синхронизирует состояние с сервером, пытаясь сгладить лаги и задержки, чтобы игрок не замечал рывков при потере пакетов [2:29:42]. Ранее в разговоре собеседники упоминали важность производительности C++ для обеспечения плавности этого процесса на мобильных устройствах.

## 🛰 Сетевой код, синхронизация и «игра как база данных»
[[JUMP:2:30:53]]

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

### Проблема «кто выстрелил первым» и сетевая синхронизация
[[JUMP:2:31:05]]

В онлайн-игре сервер всегда является «главным», но пакеты от клиентов доходят до него с разной задержкой. Возникает дилемма: как честно разрешить ситуацию, когда два игрока выстрелили друг в друга практически одновременно? [2:31:05]. Если сервер будет ориентироваться только на время прихода пакета, выиграет тот, у кого лучше интернет-соединение. Однако, если учитывать время на стороне клиента («я выстрелил раньше, просто пакет шел долго»), открывается окно для читерства и взлома протокола [2:31:19]. 

Разработчику приходится балансировать между удобством управления техникой и строгостью физических расчётов. В быстрых играх использование TCP неприемлемо, поэтому приходится переходить на UDP и писать собственные протоколы [2:40:43]. Отладка таких систем — отдельный вид искусства: обычного дебаггера недостаточно, когда нужно отслеживать рассинхрон между клиентом и сервером в реальном времени [2:40:58]. 

### Игра как база данных реального времени
[[JUMP:2:34:45]]

Интересный взгляд на архитектуру игр заключается в том, что любую современную игру можно рассматривать как базу данных реального времени [2:34:45]. У вас есть огромное количество объектов, их связей и характеристик, которые необходимо обновлять с огромной частотой. Если расчеты происходят быстро — игрок получает плавный геймплей; если медленно — начинаются страдания [2:35:01].

Процесс разработки делится на два больших этапа:

1.  **Симуляция мира:** Расчет физики, правил игры и взаимодействия юнитов [2:35:45].
2.  **Визуализация и озвучка:** Отображение результатов этой симуляции на экране и вывод звука с той же частотой (минимум 25-30 кадров в секунду) [2:36:06].

На сервере происходит всё то же самое, но без этапа визуализации, что добавляет сложности в плане синхронизации состояний между удаленными машинами [2:36:20]. Ранее в разговоре они уже касались архитектуры Main Loop, и здесь этот принцип раскрывается через призму управления данными.

### Сложность AAA-проектов и роль движка
[[JUMP:2:36:35]]

Современные игровые движки — это колоссальные программные комплексы, которые берут на себя рендеринг, физику и сеть [2:36:35]. Однако для создания серьезного проекта уровня World of Tanks Blitz («трипл-эй») возможностей чистого движка, будь то Unreal или Unity, часто не хватает. Разработчикам приходится «пачкать руки» в исходном коде на C++ [2:38:06], чтобы оптимизировать систему под конкретный домен.

Разница в сложности между условным Mario и современным онлайн-шутером огромна. Если простую 2D-игру можно научить писать за три месяца курсов [2:38:44], то в больших проектах уровень математики и технических нюансов возрастает кратно. Например, реализация визуального эффекта преломления горячего воздуха над огнем требует глубокого понимания работы буферов рендеринга и математических моделей [2:39:36].

### Производительность, память и «адекватность» алгоритмов
[[JUMP:2:44:36]]

В C++ любая ошибка в управлении памятью мгновенно становится критической. При частоте 30 итераций в секунду даже небольшая утечка памяти «убьет» игру за пару боев [2:44:36]. Поэтому для геймдев-разработчика критически важно понимать, что происходит «под капотом» стандартных библиотек.

Например, при использовании стандартного алгоритма `std::sort` важно знать, выделяет ли он динамическую память [2:46:11]. Если во время жаркого боя игра внезапно обращается к операционной системе за новой страницей памяти (Memory Allocation), это может вызвать лаг [2:47:32]. ОС может начать искать свободное место, перемещать страницы, и маленькая функция сортировки, которая обычно работает мгновенно, внезапно «просядет» по времени, сделав игру неиграбельной [2:48:03].

### Блиц: от JavaScript до советов себе в прошлом
[[JUMP:2:50:15]]

В завершение беседы обсудили несколько острых тем:

*   **Множественное наследование:** Это часто называют «костылем», но иногда оно удобно для быстрой реализации интерфейсов или «примесей» (mixins), когда переписывать архитектуру неделю — нецелесообразно [2:50:27].
*   **Худший язык:** Худшим был назван JavaScript из-за непредсказуемого поведения типов и различий в реализации в разных браузерах (по крайней мере, в старых стандартах) [2:51:52].
*   **Динамическая типизация:** Прекрасна для скриптов и быстрой итерации идей, но неприемлема для высоконагруженных систем, где важна эффективность [2:53:05].
*   **C++ в Web:** Это имеет смысл только на масштабах гигантов вроде Facebook, которые экономят миллионы долларов на электричестве, переписывая PHP-код на C++ [2:54:39].

Оглядываясь на 15 лет назад, гость отмечает, что посоветовал бы себе сразу сосредоточиться на Unix, глубоком изучении C++ и переезде в крупный IT-хаб, не теряя времени на промежуточные этапы [2:49:08]. И, к сожалению для многих разработчиков, в титрах таких крупных игр, как танки, личные имена часто не указываются, что остается одним из «вишлистов» для индустрии [2:55:27].

## 🕹️ Вход в индустрию: от работы «за еду» до сохранения цифрового наследия
[[JUMP:2:55:55]]

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

### Карьерный старт в геймдеве: деньги против мотивации
[[JUMP:2:56:20]]

Вопрос о справедливой зарплате для начинающего разработчика игр вызывает у Леонида парадоксальную на первый взгляд реакцию: «Чем меньше, тем лучше. Ноль — это идеально» [2:56:34]. Такая позиция продиктована не желанием эксплуатировать труд, а поиском «дикой мотивации». По мнению гостя, если молодой специалист не обременен семьей и имеет жилье, работа за опыт позволяет развиваться максимально качественно и быстро [2:56:54].

В геймдеве существует жесткая корреляция между амбициями и реальностью: серьезные деньги приходят в индустрию примерно на пятый год работы [2:58:12]. Леонид проводит четкую черту между разработкой игр и банковским сектором:

*   **Банковский сектор:** Если главная цель — деньги, стоит идти в финтех. Там платят за надежность, честность и готовность работать с чувствительными данными под строгим контролем [2:57:39]. В банках не считают каждый байт производительности, зато обеспечивают качественное железо и высокие зарплаты за соблюдение регламентов [2:57:08].
*   **Геймдев:** Это среда, где на старте важнее не сумма в оффере, а возможность прикоснуться к технологиям. Леонид вспоминает собственный путь: его первая зарплата составляла всего $50, а через полгода выросла до $250, и на этой отметке он оставался около года [3:00:43].

Для современных джунов в Минске Леонид советует прагматичный подход: называть сумму, покрывающую базовые потребности (аренда жилья, питание, транспорт) плюс «подушка» в $200 на непредвиденные расходы [2:59:51]. В текущих реалиях это минимум около $500 [3:00:03]. При этом он с иронией отмечает, что многие выпускники курсов сразу претендуют на высокие позиции, не понимая реальной ценности своих навыков на старте [3:01:00].

### Преподавание как защита от «технологического забвения»
[[JUMP:3:01:47]]

Осознание своей миссии пришло к Леониду в возрасте 32 лет: он понял, что накопленные знания необходимо возвращать обществу [3:02:02]. Одной из причин ухода в преподавание стало плачевное состояние академического образования. По его наблюдениям, в школах и вузах катастрофически не хватает практикующих специалистов-мужчин, которые не готовы идти на низкие зарплаты педагогов [3:03:08].

Мотивация Леонида в преподавании (в частности, в «Анти-академии высокотехнологичного программирования») строится на нескольких столпах:

1.  **Преемственность знаний:** Ранее в разговоре упоминался редактор Emacs, горячие клавиши которого актуальны спустя 40 лет благодаря физиологии человека [3:06:03]. Леонид стремится передать эти фундаментальные принципы, чтобы каждое новое поколение не изобретало велосипед с нуля [3:06:20].
2.  **Борьба с потерей технологий:** Он приводит метафору древнеримского кубка из зеленого камня, технологию создания которого человечество утратило, несмотря на прогресс [3:04:47]. Если мастера перестанут учить, секреты «магии» программирования могут быть забыты [3:05:20].
3.  **Личный долг:** Леонид вспоминает свою юность, когда преподаватели не могли объяснить, как вывести пиксель на экран или сформировать звук [3:04:18]. Став профессионалом, он закрывает этот дефицит для других.

Несмотря на успешную работу в частных курсах, Леонид мечтает преподавать авторский курс в университете. Однако здесь он сталкивается с бюрократической преградой: для чтения лекций в вузе требуется ученая степень, которой у него в 35 лет нет [3:07:22]. Тем не менее он рассматривает возможность поступления в аспирантуру, чтобы к 50 годам официально делиться опытом со студентами [3:07:36].

### Завершение и конкурс для зрителей
[[JUMP:3:08:32]]

Блиц в конце интервью раскрыл личные предпочтения героя: его прическа с выбритой стрелкой — это отсылка не к логотипам компаний, а к мультсериалу «Легенда об Аанге» [3:08:19]. А на классический школьный вопрос о биссектрисе Леонид ответил каноничной шуткой про «крысу, которая бегает по углам и делит угол пополам» [3:09:18].

Завершая встречу, **Алексей Картынник** объявил конкурс за уникальную поясную сумку с белорусским орнаментом. Для победы зрителям нужно ответить на вопрос из начала интервью: почему в старых 8-битных играх (например, в симуляторах NBA) NPC-игроки начинали двигаться иначе после перезагрузки консоли и в чем заключалась «магия» этого процесса [3:10:00].