Spiiin's blog

Уровень программирования: Senior++

Предыдущая пачка:
Как устроиться на работу программистом
Уровень программирования: 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 Entertainment
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)

update 25-10-19, пара ссылок
Covers as a way of learning music and code — в этой статье такой метод называют созданием кавер-версий с изучением кода.

Sometimes, he’d run into things which didn’t make sense. Why is this a doubly-linked list here, when it seems a singly-linked list would do just fine? And in those moments, if you can’t find a reason? You get to go down that path, make it the singly-linked version, and then find out later: oh, ohhh. Ohhhh, they did that for a reason. It lets you run into some of the hard problems, grapple with them, and understand why the original was written how it was. You get to study with some really strong programmers, by proxy via their codebase.

Learning Programming Concepts by Jumping in at the Deep End — тут пошаговый пример изучения языка таким методом, разбор функций из стандартной библиотеки “поиском в глубину” по каждой встреченной концепции.

Мышление

  • систематизация
  • придумывание
  • выводы
  • улучшение лучших решений

Кажется, именно из-за пробелов в этих направлениях и возникает необходимость периодического заныривания в тонны материалов (в дальнейшем, систематизация позволяет значительно сократить время, просеивая эти объёмы). Так что, логично было бы более равномерно заниматься каждым из 4х способов прокачки:

тинкеринг — то же, что и практика, свободные эксперименты с кодом

Общение#

От управления командой развитие общения идёт по пути расширения круга профессиональных знакомств, чтобы начинала работать “магия нетворкинга”, что в теории, иногда позволяет эффективно решать задачи типа таких:

  • Нужен классный профильный специалист, разобраться с пачкой проблем, которые мы толком не понимаем как решить - затюнить андроид-порт движка, или выловить пачку мутных крешей где-то на границе мутных 3rdParty сдк и NDK (андроидщики в геймдеве, впрочем, кажется, всем нужны)
    Или возможно, и в обратную сторону:
  • Фанатею от игр компании XXX и горю желанием там работать (или же “мечтаю сделать более крутую версию игры YYY, ищу единомышленников”)

Примеры способов заявлять о себе

  • совместная работа в прошлом
  • тематические онлайн или оффлайн тусовки (как участие, так и организация)
  • случайные знакомства (хех, в “правильных” городах шанс такого больше)
  • курсы/стажировки/лекции/конкурсы как платформа для общения и знакомств
  • медиа - подкасты, блоги

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

Также, с какого-то момента приходит понимание, какие типы людей не могут нормально работать в командах — Про увольнения

Отдельная, скорее субкультурная, тема — выстраивание “моста между поколениями”, изучение истории игр, а также эволюции компаний и методов разработки (пример подборки). Не могу утверждать о конкретной пользе, но, кажется, это имеет и элементы медиа, и элементы объединяющего индустрию мифа.

Еще один способ взаимодействовать с командой — пропускать всё общение и код коллег через призму, “а возможно ли было бы переиспользовать решение в других местах/хотел бы я работать с этим человеком, если бы было нужно начинать новый проект и было необходимо собрать команду из тех, кто есть сейчас”.

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

Жизненный план#

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