Spiiin's blog

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

Как быть старшим программистом (в контексте “старшим разработчиком игр”) и чему учиться дальше.

Предыдущие заметки

2011 – Как устроиться на работу программистом

2020 – Уровень программирования: Middle

Где-то с этого уровня (по моей оценке) основной целью становится умение прокачивать навыки, не касающиеся программирования.

Pre-requisites:

  • Умение хорошо писать на одном языке, хотя бы минимально - ещё на одном-двух.
  • Понимание, что хочешь развиваться в конкретной отрасли (текст про мобильный геймдев широкого профиля).

fronted

Становится бессмысленным спрашивать у кого-то, что учить

Навыков на этом этапе развития достаточно, чтобы решать поставленные задачи, это может отбивать желание учиться и развиваться дальше. Достигнута простая цель “научиться писать на C++”, и эго подсказывает, “твой код хорош”, даже если это не так. Мозг сильно блокирует желание учиться чему-то абсолютно новому, это некомфортно.

Хорошо, если рядом есть скилловые коллеги, на которых можно ориентироваться, но если оказываешься самым умным, то можно превратиться в “senior-программиста на заводе”, которого из-за низких хард-скиллов не возьмут в нормальную компанию.

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

Не всегда очевидно, что если просидеть на поддержке продукта 5-10 лет (зарплата устраивает и повышается), то потом при смене работы с вас “спросят за стаж” - предлагать работу с понижением и обучением взрослому программисту менее перспективно для работодателя, чем взять молодого и быстрее обучающегося.

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

Хочешь- будешь только “Гуру языка XXX”, хочешь, научишься отлаживать, профилировать, писать крутые тулзы, эффекты и вести работу команды.

Цениться может любой вариант, важно лишь то, в чём у тебя будет конкурентное преимущество. На мой взгляд, намного ценнее специалист, который понимает, что его код решает какую-то конкретную проблему и разбирается в этой проблеме.

Тебе навряд ли будут предлагать делать то, что ты не умеешь, если ты не учишься сам или делал плохо.

Наличие одиночества

Решение задач с определённого уровня чаще всего не “механическое”, а требует времени на обдумывание или исследование материала.

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

Соотвественно, если тебя всё время отвлекают (собраниями, неотложными срочными задачами), ты в принципе не сможешь начать решать такие задачи.

Этого состояния одиночества необходимо достичь, причём вместе с ним приходит и ответственность за то, что задача будет решена - такого рода отвественность не “размазывается” по команде, и от неё не улизнуть в отпуск или на больничный.

Хотя, если не удаётся достичь состояния в рабочее время (вполне бывают проекты с таким темпом, когда просто некогда остановиться и задуматься надолго), его можно добиться хобби проектами, в свободное время.

Это состояние - не какое-либо “общение с пустотой”, не надо лишать себя общения с людьми, это быстро приведёт к выгоранию, скорее состояние активного “общения с информацией”.

Желание работать на результат

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

А значит, долгосрочное планирование должно быть направлено на это.

Хорошая книга про ориентировании компаний на результат - "Великие по собственному выбору" Джима Коллинза. Хотя книга о компаниях, она сильно мотивирует и на личное развитие.
Основные тезисы книги:
- Дисциплина+идея. Намного эффективнее двигаться вперёд постоянно небольшими запланированными шагами, чем большими рывками с выматывающими сверх-усилиями.
- Здоровая паранойа. Строй свою жизнь/работу/отдых с учётом того, что что-то может пойти не так. В мире много неопределенностей, к которым можно подготовиться, это лучше, чем действовать вслепую.
- Умение работать с эмпирическими данными. Для этого знай, где их брать, что они означают, и что можно сделать с этим знанием.

Более развернутая статья - Умение зарабатывать деньги (Доступна только по подписке).

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

Разобраться с ценностями (своими/компании)

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

Примеры мотивации:

Ценность Личная Компании
Власть Карьерный рост Победа над конкурентами
Заработок Накопление ресурсов Раcширение компании(экспансия)
Известность Развитие личного бренда Развитие бренда компании
Исследование Развитие навыков Исследование технологий

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

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

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

Освоение смежных областей

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

Например, если программируешь игры - попытайся понять, тех, кто создаёт игры - в чём заключается работа геймдизайнера или продюссера.
Для понимания работы геймдизайнера отлично подходит книга "Искусство геймдизайна" Джесси Шелла (эта книга затрагивает не только о геймдизайн, но и вообще, устройство мира и психологию человека).

Для начального понимания работы продюсера игр есть хороший доклад - Три главных фокуса продюсера Александра Штаченко.

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

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

Смотреть на rocket-science решения

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

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

Даже если готовое решение не подходит, можно, чтобы сэкономить время и “мысленное топливо”:

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

Где искать эти готовые решения?

Пару лет назад я наткнулся на достаточно продвинутого хакера (в смысле, исследователя безопасности веб-сайтов), который в интервью сказал, что достаточно просто мониторить твиттер ~100-200 продвинутых ребят в области, чтобы быть в курсе всех трендов своей области. Основные публично доступные крутые решения делают и обсуждают относительно небольшая группа людей.
Естественно, есть “порог входа”, нужно уже обладать достаточным опытом и багажом знаний, чтобы хотя бы понимать обсуждаемые темы.

Тогда мне показалось странным, так как я читал только русскоязычный твиттер, в котором даже технические ребята постят нытьё, мемасы и политоту. Сейчас я понимаю, что англоязычный геймдев сегмент-твиттера - вполне себе место для коротких технических дискуссий, в которых участвуют лид-программисты ведущих компаний, авторы лучших open-source библиотек, ресёрчеры разных направлений, причём их твиты в большинстве именно на технические темы.

Основные публичные площадки обсуждения технических решений сейчас, в порядке убывания - твиттер, реддит, гитхаб.

Способ составления начального списка - авторы докладов с технических конференций (почти 100% оставляют в начале или конце доклада свои контакты), авторы технических статей или библиотек, которые находятся поиском информации в гугле. Дальше - следить за тем, кого читают они.

Умение анализировать информацию

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

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

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

Одним мощных способов получения эмпирических данных - reverse engeneering продуктов конкурентов. Часто не сложно посмотреть, какие ресурсы использует какая-либо игра, какой формат данных использует и насколько активно использует железо. Это не всегда легальный и иногда всё же трудный способ, однако вполне доступный для персонального использования.
(кстати, особенно любят прятать и шифровать ресурсы игр китайские разработчики, непревзойдённые мастера копирования)

Кроме анализа, полезно научиться правильно хранить информацию, с определенного уровня её объёмы не позволяют быстро найти нужную. Один из вариантов упорядочивания знаний - метод Zettelkasten. Лично мой вариант - Obsidian, бесплатный, работает с md-файлами в папке (не vendor-lock), с удобным графом связей между заметками:

zettel

Другие варианты - персональный блог, облачные системы хранения заметок, персональная вики.

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

Создавать себе инструменты

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

Существует множество задач, которые можно автоматизировать, причём зачастую просто соединив готовые компоненты. Такие техники в общем называются NoCode (статья Вастрика).

С некоторыми навыками программирования можно достичь ещё больше, не обязательно писать хороший код, часто бывает достаточно реализовать для себя одну-две функции, которых очень не хватает в окружающем софта. Многие хорошие программы можно настраивать, дописывать плагины, расширять скриптами (и просто дописывать в них фичи, если они open-source).

Удалённое управление эмулятором Fceux с помощью Python - статья про создание инструментов, в ней примеры и дописывания нехватающих функций в исходники, и скриптования, и соединения разных инструментов вместе, ради получения нового функционала.

С помощью выбора и создания правильных инструментов можно подняться намного выше “средне-рыночного” уровня.

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

Ссылки:
Beating the average (Перевод)
How To Become A Hacker

Навыки управления командой

Даже если планируешь развиваться в техническом направлении, навыки управления командой помогут:
- Научиться более точно оценивать сроки
- Делегировать часть задач коллегам, не всегда возможно успеть выполнить всё самому
- Организовывать и собирать команды
- Понимать, сколько и какого уровня людей нужно, чтобы решить конкретную большую задачу
- Как руководитель, быть более осведомлённым о целях и положении дел в проекте/компании - лучше понимать свою отрасль

Разобраться в железе и операционных системах

Программирование это сложно.
Оно доступно для того, что быстро начать, но "Easy to learn and difficult to master".

Сложности начинаются с того момента, когда в дело вступают ограничения железа.

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

Вторая сложность - борьба с увеличением запутанности кода со временем.

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

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

Semantic compression - статья про семантическое сжатие кода.

Про причины необходимости разбираться в железе писал в заметке десять лет в геймдеве, разделы Гештальты геймдева и
Инструменты

Научиться работать с кодом

Все умеют писать код. Кроме этого, необходимо уметь:
- Переписывать (и переиспользовать) и документировать
- Тестировать
- Очищать и улучшать качество
- Профилировать
- Отлаживать
- Выявлять скрытые дефекты и ошибки (к примеру, статическим анализатором, инструментами поиска утечёк и обращений к освобождённой памяти)

Часто работу с кодом понимают только в контексте рефакторинга, но кроме в играх часто встречается необходимость улучшать производительность bottle-neck участков кода.

Примеры такой оптимизации (и создания инструментов оптимизации) в докладе ‘Witcher 3’ on the Nintendo Switch: CPU & Memory Optimization, на 14:42 Роман Лебедев рассказывает о создании инструмента, который показывает выравнивание структур в памяти и позволяет оптимизировать потребляемую память и скорость доступа к полям структур.