«Если хочешь денег — иди пиши банки, там платят только за надежность и молчание», — утверждает Леонид, Lead Core Developer в WoT Blitz. Проделав путь от школьника со средним баллом 3,7 до архитектора игровых движков, он уверен: выбор крутого наставника важнее стека технологий, а обучение программированию на C++ без понимания «железа» — это профессиональное преступление.
🛠 Сломленные игрушки и жажда понимания: как рождается инженер 1:11
История Леонида, ныне ведущего разработчика в Wargaming, начинается не с олимпиад по программированию, а с обычного дворового детства в Витебске. Учёба в средней школе №22 не была для него приоритетом: средний балл 3,7 и репутация «раздолбая» вполне устраивали будущего инженера . Леонид открыто признаётся, что до сих пор считает школьную систему во многом избыточной — по его мнению, она важна для социализации и общения, но не для получения реальных знаний, которые при необходимости можно усвоить гораздо быстрее самостоятельно .
Несмотря на плохую успеваемость по гуманитарным предметам, где учителя ставили «тройки» просто за хорошее поведение и тишину в классе , в Леониде рано проснулось врождённое инженерное любопытство. Семья потомственных инженеров — отец, мать и дед — создала среду, в которой вопрос «как это устроено?» был естественным. Это любопытство часто принимало радикальные формы: новую игрушечную машину могли разобрать или разбить молотком уже через пять минут после покупки, чтобы просто посмотреть, почему у неё крутятся колёса и как работает мотор .
Любопытство как метод познания мира 12:39
Особое место в формировании технического склада ума заняли видеоигры и попытки понять логику работы электроники. Леонид вспоминает, как они с дедом часами разглядывали экран телевизора, замечая точки красного, синего и зелёного цветов (RGB), и задавались вопросом: как по двум жилам кабеля-«тюльпана» передаётся такое невероятное количество цветовой информации .
Ещё одним философским вопросом стала «магия» восьмибитных консолей. Леонида поразило, что приставка Dendy, не имея батареек или встроенных часов, каждый раз при включении баскетбольного симулятора NBA выдавала разные «рандомные» матчи в демо-режиме .
«Я думал: это чудо, почему это происходит? Я вынимал из розетки, вставлял картридж, нажимал Reset и понимал, что железка была чуть умнее, чем кажется» .
Это стремление докопаться до самой сути — от устройства транзистора до работы ядра операционной системы — позже станет его главным преимуществом при изучении C++. В разговоре с Алексеем Картынником герой отмечает, что именно этот «низкоуровневый» интерес помог ему в будущем не просто писать код, а понимать, как виртуальная машина Java или компилятор C++ взаимодействуют с железом .
Выбор пути: почему Могилёв, а не Минск? 9:26
Путь в высшее образование был тернистым и начался с внезапного решения. После школы Леонид всерьёз планировал идти в армию, что очень расстраивало его мать . Однако за две недели до вступительных экзаменов, лежа на пляже в Витебске и слушая разговоры сверстников, он внезапно осознал, что студенчество — это совершенно другой, захватывающий уровень жизни. Спешно собрав деньги на подачу документов, он начал искать варианты .
Ключевым фактором выбора вуза стала неуверенность в себе. Несмотря на то что в старших классах Леонид подтянул знания благодаря строгой дисциплине в витебской гимназии №1 (куда он перевёлся из-за любви к девушке) , он побоялся ехать в Минск.
«Я выбрал Белорусско-Российский университет в Могилёве только по одной причине — я в себя не верил. Думал, что все умные поедут в Минск, и у меня там ноль шансов» .
Леонид поступил на специальность «Инженер информационных технологий» (бывшая АСУ). Учёба давалась ему легко: за две недели до экзаменов он мог прорешать все билеты прошлых лет и сдать математику на высший балл . Уже в университете он впервые столкнулся с программированием на Borland C++, хотя в то время у него даже не было собственного компьютера — лабораторные работы приходилось делать в вузовских классах на старых машинах после пар . Свой первый ПК с процессором «Атлон» и 128 МБ оперативной памяти он купил только на втором курсе .
Эра EPAM: первая работа и промышленный подход 19:17
Карьера в IT началась для Леонида на третьем курсе университета, когда он прошёл трёхмесячные курсы в могилёвском офисе EPAM . Это было время до «хайпа» в индустрии: студентами двигал не заработок, а искреннее желание создавать игры .
В EPAM (или «Япам», как его иронично называет герой) Леонид получил первый опыт работы с промышленными технологиями:
- Начинал с .NET (C#) версии 2.0, которая тогда только появилась .
- Позже перешёл на Java, занимаясь фронтендом и простыми задачами на бэкенде .
- Работал над проектом сайта по продаже запчастей для немецких заказчиков .
Работа в крупной аутсорс-компании дала Леониду понимание процессов, систем контроля версий и взаимодействия с клиентом.
«EPAM для молодого студента — это как крутой завод, который делает „Мерседесы“. Тебе сразу показывают правильные процессы: как работать с кодом, как общаться с заказчиком. Это была очень сильная школа» .
Интересно, что Леонид осознанно отказался переходить с платного обучения на бюджетное, когда на третьем курсе появилась такая возможность. Он посчитал, что зарплата в EPAM позволит ему быстро окупить учёбу, тогда как переход на «бесплатное» означал бы обязательное двухлетнее распределение после вуза, что было экономически невыгодно . На тот момент он уже четко видел свою цель в индустрии, хотя до настоящего геймдева и системного программирования на C++ оставалось ещё несколько важных шагов. Ранее в разговоре они вскользь касались того, что C++ — далеко не самый простой язык для входа, и путь Леонида через Java и .NET лишь подтверждает это.
🎮 Переломный момент: от первой книги до создания собственных движков 25:09
После трёх с половиной лет работы в EPAM, о которых Алексей Картынник и Леонид говорили ранее, наступил момент перехода в настоящий геймдев. Несмотря на то что в «Эпаме» Леонид получил хорошую базу и даже в свободное время писал на Java собственный движок с двухмерной физикой и танками , его тянуло к разработке игр на C++. Шанс представился, когда его пригласили в могилёвский офис компании AVM Games. Этот период стал для разработчика временем профессионального самоутверждения, но путь к нему лежал через глубокий личный кризис и осознание того, как на самом деле работают технологии.
«Программирование игр для Windows» и первая слеза программиста 30:37
Одним из самых эмоциональных моментов в карьере Леонида стал период после окончания первого семестра университета. Возвращаясь домой из Могилёва в Витебск на дизель-поездах с пересадкой в Орше, он оказался один в пустом вагоне . В этот момент его накрыло осознание профессиональной беспомощности: полгода учёбы позади, он научился сортировать массивы «пузырьком», но так и не приблизился к пониманию того, как создаются игры.
«Мне было так больно, это меня так разочаровало, что я реально заплакал. В вагоне никого нет, можно поплакать тихонько. У меня было внутреннее желание получить источник информации — как же всё-таки делать игры?»
Ответом на этот запрос стала книга Андре Ламота «Программирование игр для Windows». Леонид вспоминает её как «зелёную книгу в мягком переплете», на которую у него тогда даже не хватило денег — пришлось покупать вскладчину с другом и читать по очереди . Чуть позже он приобрёл вторую часть уже в твёрдом переплете.
Эта книга перевернула всё. За один месяц Леонид изучил её от корки до корки, пошагово разбирая путь от вывода одного пикселя на экран до микширования звука. К началу второго курса он почувствовал колоссальный отрыв от университетской программы: пока однокурсники только учились подключать заголовочные файлы, он уже знал, как создавать DLL и работать с графическим конвейером .
AVM Games: Смутное время ZIP-архивов и внедрение Lua 32:42
Придя в могилёвскую компанию AVM Games, Леонид столкнулся с суровыми реалиями локального геймдева тех лет. В компании не было систем контроля версий — код передавали друг другу в ZIP-архивах, добавляя дату в название файла . Леониду пришлось буквально «продавливать» установку SVN-сервера, преодолевая скепсис коллег-старожилов.
В AVM Games он занимался разработкой собственного игрового движка. В индустрии того времени это было нормой:
- Движок рассматривался как библиотека общих задач для определённого типа игр (логика поля, правила ходов, анимации) .
- Написание своего движка позволяло быстро штамповать сиквелы и новые игры на отработанной механике .
Интересный эпизод произошёл с внедрением скриптового языка Lua. Когда проект был почти готов, руководитель предложил добавить «какую-нибудь Луа» для гибкости . Леонид, до этого не знакомый со встраиваемыми языками, разобрался в вопросе и «прикрутил» скрипты всего за три дня . В итоге в компании параллельно развивались два движка: один писал Леонид, другой — главный программист Игорь Сычев. Несмотря на внутреннюю конкуренцию, оба движка оказались успешными и принесли компаниям прибыль. Именно тогда Леонид выпустил свою первую игру для Windows — «Roman Sofrom» (название по транскрипту) .
Глубокое выгорание: армия, развод и «мотивация» от дяди 38:41
Период успеха сменился затяжной черной полосой. Леонид ушёл из стабильной компании в стартап к друзьям, который обернулся финансовым крахом. В это же время он совершил, по его собственному признанию, ошибку — женился, не имея стабильного дохода. Сочетание работы без зарплаты в течение года и семейных неурядиц привело к разводу и профессиональному выгоранию .
Леонид был вынужден вернуться в Витебск к родителям. Чтобы не попасть в армию (от которой он до этого успешно «бегал», переводя личное дело между военкоматами Могилёва и Витебска ), он устроился неофициальным помощником тренера в спортзал, где занимались его родственники-тяжелоатлеты.
«Я просто ходил в зал и тренировался сам, тренировал маленьких детей... так продолжалось до тех пор, пока мой дядя не сказал: "Что ты нам тут втираешь, что ты какой-то программист? Если бы ты был настоящим программистом, а не лохом, ты бы уже давно в Минске работал"» .
Эта грубая, но честная манипуляция сработала. Обида на «непризнанность» заставила Леонида мобилизоваться. Он увидел, как его бывший студент из Могилёва уже работает лидом в Wargaming на «больших танках», и решил отправить резюме. После успешного интервью Леонид попал в команду World of Tanks Blitz .
Этот опыт научил его двум важным вещам, которые он сейчас транслирует джунам:
- Миф о «прыжках» по компаниям: Идея менять работу каждые два года — вредна для продуктовых компаний. Первые полгода уходят только на погружение в нюансы legacy-кода, и только через пару лет разработчик начинает видеть проект насквозь и принимать качественные архитектурные решения .
- Выбор босса: Важнее зарплаты на старте — адекватный руководитель, у которого можно перенять привычки и глубокие технические знания .
Работая над Blitz уже более пяти лет, Леонид отмечает, что проект постоянно обновляется: например, команда перевела игру на стандарт C++17, чтобы поддерживать интерес инженеров к современным технологиям .
🛡️ Фундамент индустрии: почему C++ правит миром и как найти своего наставника 50:33
В карьере разработчика наступает момент, когда технологии отходят на второй план, уступая место человеческому фактору. Обсуждая роль лида, герой подчёркивает: выбор руководителя гораздо важнее выбора стека . Правильный наставник формирует не только профессиональные навыки, но и фундаментальные привычки. В качестве примера приводится бытовая ситуация: лид Паша предпочитает подниматься на шестой этаж пешком, игнорируя очередь к лифту . Эта деталь — символ дисциплины и рациональности, которые со временем перенимает и команда.
Если бы нужно было дать совет начинающему специалисту, он звучал бы так: «Найди крутого босса и иди к нему, хоть кофе носи» . За три года работы под руководством сильного лидера можно освоить больше, чем за десятилетие хаотичного самообразования. В контексте Wargaming это особенно актуально: позиция Lead Core Developer подразумевает работу над «движком», где приходится заниматься кроссплатформенностью (Windows, macOS, iOS, Android) и инфраструктурой, освобождая геймплей-программистов от рутины . Хотя путь героя начинался с амбиций геймдизайнера, суровая реальность индустрии быстро превратила его в программиста, который видит красоту не только в «крутящейся башне танка», но и в чистоте архитектуры сборки .
Архитектура реальности: C++ как скрытый двигатель цифрового мира 53:52
Существует распространенное заблуждение о доминировании высокоуровневых языков. Однако, если разобрать технологический стек любого современного продукта, в его основании неизменно обнаружится «сишка». Алексей Картынник и его гость подробно разбирают этот «пирог» на примере обычного браузера.
Большинство пользователей видят интерфейс и JavaScript-код веб-страниц, но внутри Chrome работает движок V8, написанный на C++ . Его задача — на лету превращать JS в байт-код или нативный код процессора, соблюдая при этом строгие ограничения «песочницы» . Весь рендеринг, работа с сетью, звуком и файловой системой в Chromium реализованы на «плюсах» . Более того, когда программа запрашивает память или открывает сокет, она обращается к операционной системе, чьё ядро и драйверы также написаны на C/C++ .
Эта иерархия неизменна:
- Верхний уровень: JavaScript, Python, Java (удобство и скорость разработки).
- Средний уровень: Виртуальные машины и движки (V8, JVM, .NET Core), написанные на C++ .
- Нижний уровень: Ядро ОС и драйверы (C/C++) .
Даже если разработчик пишет на Java, рано или поздно в высоконагруженных системах ему придётся «спуститься» на уровень виртуальной машины, чтобы поправить Garbage Collector (сборщик мусора) под конкретные задачи бизнеса . В геймдеве этот выбор предопределён: чтобы игра работала на «самом мертвом железе» пользователя, необходимо выжимать максимум из ресурсов, что невозможно без прямого контроля, который дает C++ .
Детерминизм против хаоса: RAII и математическая строгость шаблонов 1:09:49
Одним из главных преимуществ C++ перед конкурентами (Java, C#) является концепция RAII (Resource Acquisition Is Initialization) и наличие детерминированных деструкторов . В управляемых языках программист не может точно знать, когда сработает сборщик мусора и будет ли вызван финализатор объекта в конкретный момент времени . В C++ порядок создания и разрушения объектов строго задан: как только объект выходит из области видимости, ресурс (память, файл, сетевое соединение) гарантированно освобождается.
Это критично при работе с тяжелыми ресурсами, например, 4K-текстурами в играх. В то время как в .NET или Java программисту приходится вручную вызывать методы очистки для «жирных» объектов, C++ позволяет автоматизировать этот процесс через жизненный цикл объекта .
Второй столп «плюсов» — это их математическая природа, воплощенная Александром Степановым в библиотеке STL и принципах обобщенного программирования . Шаблоны в C++ — это не просто способ избежать дублирования кода, а инструмент создания универсальных алгоритмов (например, std::find_if), которые описываются на языке математики .
Преимущества такого подхода:
- Производительность: Компилятор генерирует максимально быстрый нативный код под конкретный процессор .
- Долговечность: Правильно написанный шаблонный алгоритм будет работать и через 200 лет, адаптируясь к новым типам данных .
- Абстракция без потерь: Вы можете передать в стандартную сортировку
std::sortструктуру любого размера, и алгоритм эффективно переместит области памяти, даже не зная внутренней специфики объекта .
Несмотря на критику ООП как «не единственной и не всегда лучшей парадигмы» (что иллюстрируется комичным примером с объектом «Ботинок» и методом «Завязать(Шнурки)»), C++ остается непревзойденным инструментом за счет сочетания низкоуровневого контроля и мощных математических абстракций . Ранее в разговоре они касались темы первого опыта в IT, но именно здесь становится ясно, почему после всех стартапов и кризисов C++ остается фундаментом индустрии.
🔋 Математический подход к коду и борьба за заряд батареи 1:15:28
Разговор с Алексеем Картынником переходит к фундаментальным особенностям C++, которые делают этот язык одновременно и невероятно мощным, и пугающе сложным для новичков. Одной из таких основ является обобщённое программирование и шаблоны.
Шаблоны и математический подход Степанова 1:15:44
В отличие от чистого C, где программист часто вынужден писать универсальные, но не всегда оптимальные функции (например, одну версию быстрой сортировки для всех типов данных), C++ предлагает механизм шаблонов. Этот подход, заложенный ещё Александром Степановым при создании STL, позволяет достичь математической точности и максимальной производительности .
Суть в том, что на уровне токенов код может выглядеть одинаково (например, оператор «меньше»), но для разных типов данных — будь то координаты, денежные суммы или сложные геометрические фигуры — компилятор C++ генерирует специфические, максимально оптимизированные версии алгоритма . Это обеспечивает так называемую «нулевую стоимость абстракций». Платой за такую эффективность становится время компиляции: C++ собирается значительно медленнее конкурентов именно из-за необходимости «разворачивать» и оптимизировать шаблоны под каждый конкретный случай .
Однако опытные разработчики предостерегают от «шаблонной болезни», которой часто страдают студенты. Попытка написать всё через шаблоны без реальной необходимости ведёт к раздуванию бинарных файлов и чудовищному усложнению отладки . В индустрии считается нормой пройти этап разочарования в шаблонах, чтобы в итоге использовать их точечно и осознанно.
Энергоэффективность и производительность мобильных игр 1:23:18
C++ остаётся незаменимым в сферах, где ресурсы ограничены, а требования к отклику максимальны. В мобильном геймдеве, и в частности при разработке World of Tanks Blitz, на первый план выходит не только чистая скорость, но и энергоэффективность .
Современные смартфоны имеют сложную архитектуру с производительными и энергоэффективными ядрами. C++ позволяет разработчику настолько тонко управлять нагрузкой, чтобы игра не «сжигала» аккумулятор и не заставляла устройство перегреваться в руках пользователя. В языках с автоматическим управлением памятью (Managed languages) «сборщик мусора» может включиться в самый неподходящий момент — например, во время ответственного боя или важной презентации приложения, что приведёт к заметным фризам . В C++ такая ситуация исключена: программист полностью контролирует время выполнения каждой операции.
Как отмечает гость, многие игроки в Blitz сознательно занижают настройки графики не из-за слабого железа, а чтобы «хватило ещё на один бой» . В этом контексте C++ доминирует, так как позволяет выжать максимум из каждого ватта энергии. Интересно, что обучение «плюсовика» до уровня уверенного специалиста занимает около полутора лет интенсивной работы в опытной команде — за это время разработчик не просто учит синтаксис, а начинает понимать работу операционной системы и «железа» на глубоком уровне .
Библиотеки и фреймворки: Boost, Qt и SQLite 1:32:43
Инструментарий разработчика на C++ огромен и разнообразен, но в нём есть свои «титаны».
- Boost : Самая популярная и масштабная библиотека. Многие её части со временем перетекают в стандарт языка (STL). Это своего рода полигон для «хакеров C++». Несмотря на мощь, Boost часто критикуют в геймдеве за «тяжеловесность» и раздувание исполняемых файлов, поэтому использовать её нужно осторожно, отключая лишние модули .
- SDL (Simple DirectMedia Layer) : Незаменимый инструмент для работы с мультимедиа. Библиотека берёт на себя всё взаимодействие с системой: от создания окон и обработки ввода с двух мышек одновременно до вывода звука и работы с джойстиками. Она лежит в основе почти каждого второго игрового движка.
- Qt (Kute) : Это не просто библиотека, а «целый мир». В Qt реализованы собственные аналоги всех стандартных контейнеров (списков, векторов, строк). Фреймворк используется повсеместно: от бортовых компьютеров Mercedes и BMW до сложного инженерного софта вроде AutoCAD . Долгое время Qt заменял собой отсутствующие в стандарте функции, такие как кроссплатформенная работа с файловой системой (которая появилась в STL только в 2017 году) .
- SQLite : Встроенная база данных, которая де-факто является стандартом для мобильной разработки. Она присутствует в каждом Android-приложении по умолчанию. В C++ проектах SQLite часто используется как надежное промежуточное хранилище данных .
В завершение темы инструментария упоминается появление современных пакетных менеджеров, таких как vcpkg от Microsoft, которые наконец-то упрощают подключение сторонних библиотек, делая этот процесс похожим на опыт в более молодых языках программирования .
🛠 Инструментарий и графика: от Emacs до Vulkan 1:40:36
Современный C++ долгое время находился в позиции догоняющего, поскольку за ним не стояла одна конкретная корпорация, как Oracle за Java или Microsoft за .NET. Развитием «плюсов» занимается международный конгломерат на добровольных началах . Однако сегодня ситуация изменилась: технологические гиганты вроде Google и Microsoft начали вливать огромные средства в стандарт, осознав важность энергоэффективности, о которой Алексей Картынник и его гость упоминали ранее в контексте мобильной разработки . Теперь C++ становится по-настоящему единым и кроссплатформенным, что диктует новые требования к инструментам, которыми пользуется разработчик.
Консольные редакторы и философия Linux 1:45:30
Путь системного программиста часто начинается с IDE, но Леонид уверен: для достижения профессиональной зрелости необходимо «выходить в консоль». Его собственная эволюция инструментов прошла через все классические стадии: от стандартного Блокнота и Notepad++ до Sublime Text . Однако настоящий прорыв в продуктивности случился после знакомства с концепцией работы без мыши, впервые опробованной в Eclipse, а затем доведенной до идеала в Vim и Emacs .
Леонид выделяет несколько причин, почему новичку стоит сразу устанавливать Linux и осваивать консольные редакторы:
- Вездесущность Linux: Все современные серверы — от Amazon и Google до VK — работают на Linux . Умение работать в терминале позволяет подключаться к удаленной машине и править код даже при «отвалившейся» графической подсистеме .
- Долговечность инструментов: Emacs существует более 40 лет, и его популярность не падает . Это инвестиция в навык, который не устареет через пару лет, в отличие от модных IDE.
- Продуктивность: Использование «десятипальцевого метода» печати и горячих клавиш Vim/Emacs ускоряет работу с текстом на 30% и снижает утомляемость .
«Я рекомендую новичкам не тратить время на Windows, а сразу погружаться в Linux-среду», — подчеркивает гость . Для тех, кто хочет совместить лучшее из двух миров, он советует сборку Spacemacs, которая объединяет мощь Emacs с удобством навигации Vim . Главное — освоить слепую печать. Несмотря на то что программист пишет всего около 300 строк полезного кода в день, скорость перевода мысли в текст критически важна для сохранения фокуса .
Графические API: революция Vulkan и влияние Google Stadia 1:53:47
Обсуждая будущее графики, Леонид отмечает, что мир стоит на пороге больших перемен. Выход спецификации Vulkan 1.2 стал важной вехой: в день релиза драйверы под Linux уже были готовы, что раньше казалось немыслимым . Этот рывок произошел благодаря колоссальным инвестициям Google и Valve.
Google, стремясь развивать свой облачный игровой сервис Stadia, вкладывает огромные ресурсы в то, чтобы игры на Linux работали так же быстро и стабильно, как на Windows . Это избавляет индустрию от монопольной зависимости от Microsoft и их DirectX.
Важные изменения в экосистеме графических драйверов:
- Open Source драйверы: Intel и AMD активно открывают исходный код своих драйверов .
- Консольное наследие: В новых поколениях консолей используются чипы AMD с открытыми драйверами, что напрямую помогает развитию графики на домашних ПК с Linux .
- Кроссплатформенность: Vulkan становится основным графическим API будущего для геймдева, позволяя коду эффективно работать на самых разных устройствах .
Леонид советует студентам, мечтающим о геймдеве, начинать эксперименты с дистрибутивами вроде Fedora уже сейчас . К моменту окончания вуза такой специалист будет обладать «божественным» уровнем понимания системы.
Проблема «черного ящика» IDE и путь к мастерству 1:56:36
Современные IDE (особенно Visual Studio) часто «грешат» тем, что скрывают от разработчика процесс сборки проекта. Леонид называет это «барьером сложности», который на самом деле легко преодолеть . Важно понимать, как работает компилятор и линкер отдельно от графической оболочки. Без этого знания любая задача по кроссплатформенной сборке библиотеки под macOS, Android и Windows превращается для студента в «космос» .
В качестве фундаментального источника знаний Леонид рекомендует серию книг Андрея Столярова «Введение в профессию» . Это четырехтомник, который последовательно ведет ученика от основ программирования на Pascal к ассемблеру, а затем к языку C и устройству ядра операционной системы .
«Обучать C++ как первому языку — это преступление», — считает гость . По его мнению, сначала нужно понять, как работают указатели, память и системные вызовы в C, и только потом погружаться в «хаос» C++. Книги Столярова дают это системное понимание: прочитав их, разработчик осознает, что нет принципиальной разницы между копированием байтов в сокет или в файл . Это снимает страх перед сложностью системного ПО и готовит почву для осознанного использования C++.
Фундаментальный подход: от «Hello World» до архитектуры игрового движка 2:08:59
Путь Столярова: почему программирование — это надолго 2:06:04
Освоение C++ на высоком профессиональном уровне — это процесс, который невозможно уместить в краткосрочные курсы. По мнению гостя, качественное обучение занимает минимум два года интенсивной работы, а в стандартном темпе может растянуться и на пять лет институтской программы . Популярные сегодня трехмесячные интенсивы способны дать лишь поверхностные основы, которых категорически недостаточно для серьезной разработки системного ПО или игровых движков.
В вопросе методологии обучения гость выделяет подход Андрея Столярова как наиболее фундаментальный и правильный. Этот путь подразумевает движение «снизу вверх»: от основ Pascal и низкоуровневого ассемблера к глубокому пониманию устройства операционных систем, и только затем — к C++ . Такая последовательность позволяет разработчику не просто зазубривать синтаксис, а понимать, как код взаимодействует с «железом» и ресурсами ОС.
Критике подвергается и эволюция учебной литературы. Даже книги Бьёрна Страуструпа, создателя языка, со временем изменились: если ранние издания (до третьего) придерживались поэтапного, академического изложения, то современные версии ориентированы на максимально быстрый вход. Теперь обучение часто начинается с использования стандартной библиотеки шаблонов (STL) без объяснения того, как она устроена внутри . Гость убежден, что в учебниках примеры должны быть написаны безупречно, даже лучше, чем в рабочем коде, чтобы с первых шагов прививать студенту правильную культуру написания программ .
Тест на адекватность: цена одной ошибки в «Hello World» 2:08:59
Для проверки базовых навыков и «адекватности» новичков гость использует классическое упражнение — написание программы Hello World. Однако простого вывода строки на экран недостаточно. Большинство студентов и даже авторов учебников допускают фундаментальную ошибку: они не проверяют состояние выходного потока и коды возврата .
В реальном системном программировании выполнение команды print не гарантирует, что данные были успешно доставлены. Если поток вывода перенаправлен в файл, а на диске закончилось место, программа должна уметь корректно обработать эту ситуацию.
Основные тезисы «теста на адекватность»:
- Проверка кодов возврата: Команда
return 0в функцииmain— это не формальность, а статус завершения процесса, который операционная система или вызывающий скрипт должны интерпретировать . - Состояние потоков: Студентов редко учат проверять, успешно ли прошла запись в
std::cout. В критических системах, таких как медицинское оборудование (например, кардиостимуляторы), отсутствие проверки успешности передачи данных может привести к фатальным последствиям . - Культура обработки ошибок: Общество и система образования приучают «халтурить», не задумываясь о том, что произойдет при сбое . Профессиональный разработчик на C++ должен мыслить категориями исключений и проверок на каждом этапе.
Интересно, что гость не пренебрегает даже литературой серии «для чайников». Он вспоминает, как книга «C++ для чайников» открыла ему глаза на простые, но важные вещи, которые часто опускаются в «умных» многотомниках: например, правила именования файлов для обеспечения кроссплатформенности между Windows и Linux .
Архитектура игры: бесконечный цикл и симуляция мира 2:20:20
Устройство любой игры, от простейшего Марио до сложных проектов вроде World of Tanks Blitz, подчинено логике «главного цикла» (Main Loop). Это бесконечная итерация, в рамках которой программа постоянно обновляет состояние мира и отрисовывает кадры .
Типовой игровой цикл состоит из нескольких этапов:
- Считывание ввода: Программа опрашивает устройства (геймпад, клавиатуру) и определяет действия игрока .
- Обновление мира (Update): На основе прошедшего времени (delta time) пересчитываются координаты объектов, физические взаимодействия и логика поведения персонажей.
- Отрисовка (Render): Измененное состояние мира передается на видеокарту. В современном геймдеве это происходит через графические API: Vulkan, DirectX, OpenGL или Metal .
- Воспроизведение звука: Команды отправляются на звуковую карту для микширования аудиопотоков (выстрелы, музыка, окружение) .
Для реализации логики поведения объектов (ботов, врагов, окружения) чаще всего используются конечные автоматы (Finite State Machines). Это математическая модель, где объект может находиться в одном из строго определенных состояний (например, «стоит», «бежит», «атакует»), а переходы между ними задаются таблицей условий . Каждую 1/30 или 1/60 долю секунды программа проверяет эти условия, обсчитывает коллизии (столкновения) и обновляет кадр .
В многопользовательских играх, таких как Blitz, эта схема усложняется наличием сетевого слоя. Клиент не просто рисует картинку, он постоянно синхронизирует состояние с сервером, пытаясь сгладить лаги и задержки, чтобы игрок не замечал рывков при потере пакетов . Ранее в разговоре собеседники упоминали важность производительности C++ для обеспечения плавности этого процесса на мобильных устройствах.
🛰 Сетевой код, синхронизация и «игра как база данных» 2:30:53
Одной из самых сложных и нетривиальных задач в разработке многопользовательских игр является сетевой код. В отличие от обычных приложений, где данные передаются по протоколу TCP и гарантированно доставляются в нужном порядке, в динамичных онлайн-шутерах такой подход недопустим из-за высоких задержек. Здесь в игру вступает UDP и сложнейшие алгоритмы компенсации лагов.
Проблема «кто выстрелил первым» и сетевая синхронизация 2:31:05
В онлайн-игре сервер всегда является «главным», но пакеты от клиентов доходят до него с разной задержкой. Возникает дилемма: как честно разрешить ситуацию, когда два игрока выстрелили друг в друга практически одновременно? . Если сервер будет ориентироваться только на время прихода пакета, выиграет тот, у кого лучше интернет-соединение. Однако, если учитывать время на стороне клиента («я выстрелил раньше, просто пакет шел долго»), открывается окно для читерства и взлома протокола .
Разработчику приходится балансировать между удобством управления техникой и строгостью физических расчётов. В быстрых играх использование TCP неприемлемо, поэтому приходится переходить на UDP и писать собственные протоколы . Отладка таких систем — отдельный вид искусства: обычного дебаггера недостаточно, когда нужно отслеживать рассинхрон между клиентом и сервером в реальном времени .
Игра как база данных реального времени 2:34:45
Интересный взгляд на архитектуру игр заключается в том, что любую современную игру можно рассматривать как базу данных реального времени . У вас есть огромное количество объектов, их связей и характеристик, которые необходимо обновлять с огромной частотой. Если расчеты происходят быстро — игрок получает плавный геймплей; если медленно — начинаются страдания .
Процесс разработки делится на два больших этапа:
- Симуляция мира: Расчет физики, правил игры и взаимодействия юнитов .
- Визуализация и озвучка: Отображение результатов этой симуляции на экране и вывод звука с той же частотой (минимум 25-30 кадров в секунду) .
На сервере происходит всё то же самое, но без этапа визуализации, что добавляет сложности в плане синхронизации состояний между удаленными машинами . Ранее в разговоре они уже касались архитектуры Main Loop, и здесь этот принцип раскрывается через призму управления данными.
Сложность AAA-проектов и роль движка 2:36:35
Современные игровые движки — это колоссальные программные комплексы, которые берут на себя рендеринг, физику и сеть . Однако для создания серьезного проекта уровня World of Tanks Blitz («трипл-эй») возможностей чистого движка, будь то Unreal или Unity, часто не хватает. Разработчикам приходится «пачкать руки» в исходном коде на C++ , чтобы оптимизировать систему под конкретный домен.
Разница в сложности между условным Mario и современным онлайн-шутером огромна. Если простую 2D-игру можно научить писать за три месяца курсов , то в больших проектах уровень математики и технических нюансов возрастает кратно. Например, реализация визуального эффекта преломления горячего воздуха над огнем требует глубокого понимания работы буферов рендеринга и математических моделей .
Производительность, память и «адекватность» алгоритмов 2:44:36
В C++ любая ошибка в управлении памятью мгновенно становится критической. При частоте 30 итераций в секунду даже небольшая утечка памяти «убьет» игру за пару боев . Поэтому для геймдев-разработчика критически важно понимать, что происходит «под капотом» стандартных библиотек.
Например, при использовании стандартного алгоритма std::sort важно знать, выделяет ли он динамическую память . Если во время жаркого боя игра внезапно обращается к операционной системе за новой страницей памяти (Memory Allocation), это может вызвать лаг . ОС может начать искать свободное место, перемещать страницы, и маленькая функция сортировки, которая обычно работает мгновенно, внезапно «просядет» по времени, сделав игру неиграбельной .
Блиц: от JavaScript до советов себе в прошлом 2:50:15
В завершение беседы обсудили несколько острых тем:
- Множественное наследование: Это часто называют «костылем», но иногда оно удобно для быстрой реализации интерфейсов или «примесей» (mixins), когда переписывать архитектуру неделю — нецелесообразно .
- Худший язык: Худшим был назван JavaScript из-за непредсказуемого поведения типов и различий в реализации в разных браузерах (по крайней мере, в старых стандартах) .
- Динамическая типизация: Прекрасна для скриптов и быстрой итерации идей, но неприемлема для высоконагруженных систем, где важна эффективность .
- C++ в Web: Это имеет смысл только на масштабах гигантов вроде Facebook, которые экономят миллионы долларов на электричестве, переписывая PHP-код на C++ .
Оглядываясь на 15 лет назад, гость отмечает, что посоветовал бы себе сразу сосредоточиться на Unix, глубоком изучении C++ и переезде в крупный IT-хаб, не теряя времени на промежуточные этапы . И, к сожалению для многих разработчиков, в титрах таких крупных игр, как танки, личные имена часто не указываются, что остается одним из «вишлистов» для индустрии .
🕹️ Вход в индустрию: от работы «за еду» до сохранения цифрового наследия 2:55:55
Заключительная часть беседы с Леонидом посвящена не столько техническим деталям реализации игровых движков, сколько человеческому капиталу и преемственности поколений. Путь в геймдеве — это марафон, требующий особого склада ума и готовности жертвовать сиюминутной выгодой ради фундаментальных знаний. В этом контексте Алексей Картынник и его гость затронули острые вопросы финансового вознаграждения новичков и философские аспекты преподавания в ИТ.
Карьерный старт в геймдеве: деньги против мотивации 2:56:20
Вопрос о справедливой зарплате для начинающего разработчика игр вызывает у Леонида парадоксальную на первый взгляд реакцию: «Чем меньше, тем лучше. Ноль — это идеально» . Такая позиция продиктована не желанием эксплуатировать труд, а поиском «дикой мотивации». По мнению гостя, если молодой специалист не обременен семьей и имеет жилье, работа за опыт позволяет развиваться максимально качественно и быстро .
В геймдеве существует жесткая корреляция между амбициями и реальностью: серьезные деньги приходят в индустрию примерно на пятый год работы . Леонид проводит четкую черту между разработкой игр и банковским сектором:
- Банковский сектор: Если главная цель — деньги, стоит идти в финтех. Там платят за надежность, честность и готовность работать с чувствительными данными под строгим контролем . В банках не считают каждый байт производительности, зато обеспечивают качественное железо и высокие зарплаты за соблюдение регламентов .
- Геймдев: Это среда, где на старте важнее не сумма в оффере, а возможность прикоснуться к технологиям. Леонид вспоминает собственный путь: его первая зарплата составляла всего $50, а через полгода выросла до $250, и на этой отметке он оставался около года .
Для современных джунов в Минске Леонид советует прагматичный подход: называть сумму, покрывающую базовые потребности (аренда жилья, питание, транспорт) плюс «подушка» в $200 на непредвиденные расходы . В текущих реалиях это минимум около $500 . При этом он с иронией отмечает, что многие выпускники курсов сразу претендуют на высокие позиции, не понимая реальной ценности своих навыков на старте .
Преподавание как защита от «технологического забвения» 3:01:47
Осознание своей миссии пришло к Леониду в возрасте 32 лет: он понял, что накопленные знания необходимо возвращать обществу . Одной из причин ухода в преподавание стало плачевное состояние академического образования. По его наблюдениям, в школах и вузах катастрофически не хватает практикующих специалистов-мужчин, которые не готовы идти на низкие зарплаты педагогов .
Мотивация Леонида в преподавании (в частности, в «Анти-академии высокотехнологичного программирования») строится на нескольких столпах:
- Преемственность знаний: Ранее в разговоре упоминался редактор Emacs, горячие клавиши которого актуальны спустя 40 лет благодаря физиологии человека . Леонид стремится передать эти фундаментальные принципы, чтобы каждое новое поколение не изобретало велосипед с нуля .
- Борьба с потерей технологий: Он приводит метафору древнеримского кубка из зеленого камня, технологию создания которого человечество утратило, несмотря на прогресс . Если мастера перестанут учить, секреты «магии» программирования могут быть забыты .
- Личный долг: Леонид вспоминает свою юность, когда преподаватели не могли объяснить, как вывести пиксель на экран или сформировать звук . Став профессионалом, он закрывает этот дефицит для других.
Несмотря на успешную работу в частных курсах, Леонид мечтает преподавать авторский курс в университете. Однако здесь он сталкивается с бюрократической преградой: для чтения лекций в вузе требуется ученая степень, которой у него в 35 лет нет . Тем не менее он рассматривает возможность поступления в аспирантуру, чтобы к 50 годам официально делиться опытом со студентами .
Завершение и конкурс для зрителей 3:08:32
Блиц в конце интервью раскрыл личные предпочтения героя: его прическа с выбритой стрелкой — это отсылка не к логотипам компаний, а к мультсериалу «Легенда об Аанге» . А на классический школьный вопрос о биссектрисе Леонид ответил каноничной шуткой про «крысу, которая бегает по углам и делит угол пополам» .
Завершая встречу, Алексей Картынник объявил конкурс за уникальную поясную сумку с белорусским орнаментом. Для победы зрителям нужно ответить на вопрос из начала интервью: почему в старых 8-битных играх (например, в симуляторах NBA) NPC-игроки начинали двигаться иначе после перезагрузки консоли и в чем заключалась «магия» этого процесса .