Предыдущая пачка:
Как устроиться на работу программистом
Уровень программирования: Middle
10 лет в геймдеве
Уровень программирования: Senior
Качается всё то же, что и на предыдущем “уровне” — накопление критической массы знаний, и попытки их систематизировать.
Миф#
Misha Nestor - Антропологический менеджмент и лидерство
update 24-06-09
Making Games — статья Эвана Тодда о поиске смысла в желании разрабатывать игры
Миф — не о поиске магии или мистике, а о совпадении ценностей и поиске смыслов.
Мотивация "честного" программиста — мои поиски профессионального личного мифа.
Основная идея — современное общество вокруг дисциплинарное, и “миф по умолчанию” для компаний — фабрика, серийное производство, в котором люди становятся похожи на механизмы. В таких условиях многим становится некомфортно, что не способствует ни творческой работе, ни выкладыванию на творческий максимум (в понятиях фабрики более ценится “средняя”, но предсказуемая работа). Один из способов работать в таких условиях — осознанное слежение за уровнем комфорта вокруг рабочих процессов.
Города, которые мы выбираем — миф о компании и обществе.
На нас сильно влияет среда вокруг — пространство и информационный фон. Люди с общей идеей собираются в определенных местах, и в таких местах возможна передача знаний и идей. Чтобы “загореться” разумом, необходимо чтобы кто-то из других людей вокруг уже горел. Ребёнок, воспитанный животными, после определенного возраста, не сможет интегрироваться в общество людей. Также и с более продвинутыми знаниями — не получив культурный импринт, невозможно рассуждать о сложных вещах, хотя возможно пытаться повторить их с помощью карго-ритуалов.
При повышении роли в компании часто отсутствует схема ритуала/инициации/личного кризиса, сопутствующего “переходу”. Из-за этого человек либо проходит это сам, либо за ним тянется “шлейф” предыдущих обязанностей/форм работы.
Материалы — Джесси Шелл, Кристофер Александер, Джозеф Кэмпбелл, Алан Кэй, Рич Хики, Пол Грем
Карты знаний#
Прежде чем накапливать и систематизировать знания, можно “осмотреться”, как рассуждают о знаниях/скиллах другие.
Примеры матрицы/графа/списка материалов и компетенций
A study path for game programmer — материалы из нескольких областей для геймдев-программиста, разделены на основные и дополнительные.
Teamlead Roadmap — роадпам тимлида. Сумма компетенций тимлида по опросам российских IT-компаний. Обязанностей где-то на 2-3 людей, упор на скиллы лида, менеджера, cto (как “директора программистов”), а не технические скиллы
Programmer Competency Matrix — схема оценки навыков программиста. Очень странный выбор примеров знаний, но иллюстрирует экпоненциальный рост знаний с переходом на каждый новый уровень
Списки книг
Список книг от Алана Кея — список рекомандаций для студентов CS. Часто, если смотреть выступления Кея, можно понять, что он рекомендует не книгу, а какую-то конкретную идею в ней.
Другие варианты — разобрать список интересной рекомендуемой литературы в любой серьёзной книге (одной-двух) — в качестве примеров: "Книга линз" Джесси Шелла
и "Архитектура Игрового движка" Джейсона Грегори
.
Путь гейм-дизайнера — мой граф по Джесси Шеллу.
Примеры вопросов на собеседованиях в геймдев-компании
Интервью глазами пострадавшего — образец интервью из 2007, Midway Home Entertaiment
Interviewing for Game Programming — более свежий образец, примерно такого же уровня
Варианты того, что можно и нужно изучать
(список направлений для геймдева, навскидку)
- render
- железо, особенности архитектуры, проц/память/видео
- популярные движки unity/unreal/godot
- dod/ecs
- llvm/libclang и инфраструктура
- multithreading/async программирование
- unreal blueprints, визуальное программирование
- скриптовые языки daScript/lua-jit
- идеи в языках go/rust/closure/scala/nim/zig/racket
- внутренности библиотек stl/boost, структуры данных
- gamedev-specific математика и алгоритмы
- тулзы git/серверы сборки/системы задач/cd-ci и прочее
- пайплайны работы, устройство организаций, agile/lean/scrum
- способы генерации арта
- сеть, звук, системы анимаций, ии в играх, компрессия, форматы данных etc etc etc
Примеры видения сотрудников от компаний
Valve, Roblox, Naughty Dog, Unity, разделение программистов в IO Inreractive/Square Enix от Bobby Anguelov.
Можно использовать для обнаружения пробелов в знаниях для того, чтобы их заполнять в свободное время, карьерного планирования, а также для обнаружения интересных “зацепок” в культуре других компаний.
Как и зачем заниматься самообразованием#
О книгах и самообразовании - про свой способ чтения книг, а также развернуто зачем заниматься самообразованием.
Соберу и дополню список возможных ответов “зачем”:
- несмотря на то, что на работе знания могут не понадобится сейчас или в ближайшем будущем, они попадут в список скиллов (“тебя не будут просить делать то, что ты умеешь плохо”)
- над тобой всегда есть несколько уровней развития, которых ты не видишь с текущего (парадокс блаба)
- шанс найти инсайты в соседних областях, которые не изучены в твоей области (либо получить синергию знаний от двух направлений)
- возможность оценить компетенции коллег и руководства (или кандидатов при подборе команды), а также улучшить возможности профессионального взаимодействия
- возможность делать новые для себя или более крутые вещи, которые не умел делать раньше
- знание и понимание rocket-science решений
- обнаружение готовых решений, умение их оценить, видеть весь спектр возможных решений (антибиблиотека Умберто Эко)
- возможность учиться идеям у лучших (“поджечь свой факел разума от уже горящих”)
- обойти грабли, на которые уже наступили десятки людей, понимание открытых проблем
- обновление знаний и подходов (иначе когда случится очередная вомгла, работу сложно будет найти)
- систематизация, даже неуклюжая, неплохо прокачивает понимание
- шанс понять свои сильные и слабые стороны (а также, возможно, "эволюционировать" в другую геймдев-профессию)
"Как заниматься"
.
“Традиционный путь в программисты” — это прочитать пару книг по языку и перейти от теории к практике (попутно нафаршировав голову в универе всяким computer scienсe, engeneering, math или еще чем-нибудь). Дальше обычно с некоторой периодичностью изучаются мануалы или best practices, но чаще всего ведущим способом изучения является практика. В такой схеме сильно страдают еще два способа набора знаний:
Наблюдение
Что делают другие и с какими целями:
- изучение докладов с профильных конференций
- профессиональное общение
- изучение open-source кода
- использование различных middleware-инструментов
- играть в игры конкурентов
Примеры задачек на наблюдение: - найти 10 субъективно наиболее интересных библиотек из boost (abseil/folly/eastl или еще какой-нибудь base library) и разобраться, с какой целью они сделаны и как устроены
- найти 10 устаревших идиом C++ и посмотреть, почему они устарели, и что предлагает язык сейчас
- изучить примитивы асинхронного программирования в 5-10 языках программирования (варианты — реализации хеш-таблиц/сборщиков мусора/конкретные оптимизации компилятора)
- выбрать какую-нибудь популярную open-source библиотеку (например, bgfx) и пройтись по 5-10 примерам сделанным с её помощью проектам, изучить их фичи, а также изучить все 3rdParty библиотеки, которые используют эти проекты (или пройтись по уже собранным коллекциям, пример)
- выбрать какую-нибудь фичу популярного движка, которую можно отделить, и попробовать реализовать её самому from scratch быстрее/удобнее/лучше чем то, что уже существует (например, реализация системы анимаций “как в трипл-эй движках” от Bobby Anguelov)
тут у него скорее наблюдение + тинкеринг + мышление - попробовать откопать максимум информации про устройство какой-нибудь фичи, которая понравилась в игре (к примеру, кастомизация персонажей в Sims)
Мышление
- систематизация
- придумывание
- выводы
- улучшение лучших решений
Кажется, именно из-за пробелов в этих направлениях и возникает необходимость периодического заныривания в тонны материалов (в дальнейшем, систематизация позволяет значительно сократить время, просеивая эти объёмы). Так что, логично было бы более равномерно заниматься каждым из 4х способов прокачки:
тинкеринг — то же, что и практика, свободные эксперименты с кодом
Общение#
От управления командой развитие общения идёт по пути расширения круга профессиональных знакомств, чтобы начинала работать “магия нетворкинга”, что в теории, иногда позволяет эффективно решать задачи типа таких:
- Нужен классный профильный специалист, разобраться с пачкой проблем, которые мы толком не понимаем как решить - затюнить андроид-порт движка, или выловить пачку мутных крешей где-то на границе мутных 3rdParty сдк и NDK (андроидщики в геймдеве, впрочем, кажется, всем нужны)
Или возможно, и в обратную сторону: - Фанатею от игр компании XXX и горю желанием там работать (или же “мечтаю сделать более крутую версию игры YYY, ищу единомышленников”)
Примеры способов заявлять о себе
- совместная работа в прошлом
- тематические онлайн или оффлайн тусовки (как участие, так и организация)
- случайные знакомства (хех, в “правильных” городах шанс такого больше)
- курсы/стажировки/лекции/конкурсы как платформа для общения и знакомств
- медиа - подкасты, блоги
Нетворкинг и взаимодействие с людьми разных скиллов также позволяет оценить важность diversity — группа людей с разным бекграундом и навыками может эффективнее решать сложные задачи.
Также, с какого-то момента приходит понимание, какие типы людей не могут нормально работать в командах — Про увольнения
Отдельная, скорее субкультурная, тема — выстраивание “моста между поколениями”, изучение истории игр, а также эволюции компаний и методов разработки (пример подборки). Не могу утверждать о конкретной пользе, но, кажется, это имеет и элементы медиа, и элементы объединяющего индустрию мифа.
Еще один способ взаимодействовать с командой — пропускать всё общение и код коллег через призму, “а возможно ли было бы переиспользовать решение в других местах/хотел бы я работать с этим человеком, если бы было нужно начинать новый проект и было необходимо собрать команду из тех, кто есть сейчас”.
Развитие себя при работе в команде — не личная, а общекомандная задача, можно вырасти выше команды на одну голову, но невозможно на три. Необходимо или тянуть команду вверх, или менять, или работать отдельно от группы.
Жизненный план#
Обозначить цели и сроки, что хочется сделать и когда. Точно стоит обратить внимание на то, чтобы не терять здоровье и близких людей, а также на изучение языков. Полезно (и невероятно сложно!) попробовать обозначить собственные личные/профессиональные недостатки, и попробовать исправить один из них — хороший повод задуматься о себе.