Log of Alprog
1.22K subscribers
90 photos
88 links
Download Telegram
Почему валить?

Чёткое осознание, что я буду эмигрировать, у меня появилось ещё далёким летом 2018-го, когда я выпивал с друзьями в моём любимом питерском баре «‎Let it Bar». Как и многие другие подобные штуки в моей жизни, это был щелчок. Внезапный щелчок, завершивший какие-то скрытые процессы в голове, после которого мне было абсолютно понятно, что решение уже принято. Было понятно, что это больше не праздные рассуждения «‎когда-нибудь может быть», а исключительно дело времени. Я занялся изучением вопроса всерьез, и уже примерно на следующий день понимал, куда именно хочу.

Предпосылок к переезду была тьма. Прежде всего это ощущение, что я уже «прошёл» Россию. Серьёзно: действительно крутых и интересных проектов для меня в РФ можно было пересчитать по пальцам одной руки и я уже работал лидом в одном из них. Куда дальше? На тот момент я был лидом Encased всего полгода и уходить, конечно, не собирался пока не доведу проект до какой-то серьёзной точки (спойлер: получилось довести до самого релиза). Но было чёткое понимание, что после Encased более интересную позицию в стране найти будет трудно. А так, чтобы при этом ещё и не на грёбаной Unity — так и подавно нереально.

Добавьте к этому ощущение остановки развития. Как в личном плане (причём я уже дважды на тот момент переезжал внутри России и это каждый раз действовало на меня крайне ободряюще и вытаскивало из личного застоя, так что повторить этот трюк казалось хорошей идеей); так и в профессиональном плане. Это по российским меркам я уже был спец выше гор, которого любая студия оторвёт со всеми конечностями, но по мировым стандартам — такое себе. Объективно. Ходить с надписью «CTO» на погонах, конечно, очень прикольно и полезно для ЧСВ, но умнее ты от этого не становишься.

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

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

В общем, вводные такие, что ехать я собирался в экономически благополучную страну, в которой реально натурализоваться по рабочей визе за не очень бесконечное количество лет (желательно уложиться в 5-6). Какой-то одной страны мечты, в которой я точно хочу прожить до гроба, у меня нет, поэтому в первую очередь я смотрел в сторону ЕС. Потому что Евросоюз — это всё-таки единое пространство из 27-и довольно разных стран; и если не понравилось в первой стране или снова захотелось дать себя пинка переездом, переместиться в кардинально новое место будет потом всё-таки несколько проще, чем если изначально ехать в какую-нибудь Канаду или Новую Зеландию.

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

При этом мне также не хотелось связываться со странами, в которых бы пришлось потом отказаться от российского паспорта, потому что тогда я ещё думал, что буду часто посещать РФ и не хотел усложнять себе бюрократию. Так что пришлось исключить Германию, Нидерланды и Австрию. Ну и конечно при прочих равных мне не хотелось ехать в страны бывшего восточного блока из-за экономики и отношения к российским мигрантам (тогда ещё была разница). Так что Польшу я тоже вычеркнул.

Таким образом остался пояс Ирландия — Франция — Бельгия — Дания — Швеция — Финляндия. При этом, конечно, Франция в этом ряду немного теряет в привлекательности из-за того, что английским там обходиться чуточку посложнее, чем в остальных местах. А Финляндия так и вовсе теряет все 100 очков из-за финского. Да, на первое время там хватит английского с головой, но если хочется по-настоящему интегрироваться в общество, то надо учить местный язык, а он у них даже не индоевропейский. Мне и английский даётся с большим трудом, а там совсем новая ерунда с 15 падежами. Нафиг-нафиг! Кроме того, Финляндия хоть и не была в соц.лагере, но когда-то была частью Российской Империи, так что эмиграция туда не выглядела для меня достаточным движением на «запад» по сравнению с другими направлениями. А из моего Калининграда так это и вовсе переезд на восток получился бы в прямом смысле. Ну и вообще, мне, как человеку уже немного ошведевшему, положено немного недолюбливать финнов, так что уж простите.
Почему Стокгольм?

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

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

А ещё шведки красивые, ага…
Почему Paradox?

Но я отвлёкся. Я не просто так заговорил про гугл.мапс, а потому что я наконец-то начал подводить к тому, почему же я хотел работать именно в Paradox Interactive. Дело в том, что я обнаружил, что на прошлом месте я делал хоть и игру своей мечты, но это на самом деле была игра-мечты меня 20-ти или 25-летнего. К тридцати мне сложно стало играть в такие длинные сюжетные РПГ, а тем более — возвращаться в них, если вдруг случился перерыв. А с регулярностью гейминга у меня тоже начались проблемы.

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

Признаться, парадоксовские игры за исключением Стеллариса мне всегда казались чересчур уж замутными, но тенденции и запрос к усложнению у меня уже наметились. За последние несколько лет я налупил больше 1000 часов в онлайн-шахматы, хотя до этого в них особо не играл; стал сильно больше интересоваться историей до 20 века и особенно географией. Невесть сколько времени провёл в одних только geocron и гугл.мапс. Да, мне нравится просто залипать в карты. И да, здоровая карта мира из IKEA у меня дома тоже висит.

В общем, когда я тыкнул на gamedevmap.com в Стокгольм и увидел там Paradox, я сразу понял, что это то, что мне нужно. С++, свой движок, игры которые я уважаю и в которые сам хочу играть, но при этом это не ААА, а довольно маленькие команды. То есть не придётся пилить 4 года физику левого копыта коня, а можно будет заняться значительной частью проекта.

Добило меня окончательно то, что я прочитал на сайте компании в разделе Cultural Pillars. Одним из главных столпов культуры значилось «‎Nerdy». Не знаю как вы, а я такого никогда не видел. Обычно там пишут какой-нибудь булшит про дружелюбность; поэтому то, что компания может это декларировать одной из своих культурных ценностей, безумно подкупает. Конечно, слово «‎Nerdy» трактуется довольно широко. Необязательно быть историческим или географическим нердом, чтобы попасть в Парадокс. Можно быть, например, задротским фаном вархамера или коллекционировать бабочек, но, так или иначе, такие культурные ориентиры привлекают людей с определённым отношением к работе, которое мне точно по душе.

То же касается пункта «Ownership» (или «‎Dedicated» в старой версии). В отличие от подавляющего большинства компаний, которые любят рассуждать какие они социальные и коллективные, в Парадоксе ценится умение сотрудника тащить фичи самостоятельно; и ему в этом доверяют. Конечно, это не отменяет умения играть в команде и наличия всяких Social Hour’ов в конце недели, но приоритеты расставлены иначе. И мне это безумно импонирует.
Ну и как оно?

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

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

Так что вот сижу, кайфую. Постики пишу.
Kuku в твиттере

Тем временем я создал отдельный твиттер аккаунт для своего пет-проекта kuku. Напомню, что это эдакое «‎типизированное lua и прокаченный json в одном флаконе». Специальный скриптовый язык и формат данных для видеоигр с большим количеством данных и прицелом на моддинг.

Твиттер на английском, но там будет гораздо больше мелких постов, чем здесь. Залетайте, кому интересно следить за таким:

https://twitter.com/kuku_language
Секта ЯЮниор — лицо разложения ру-геймдева.

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

Началось с того, что мне на ютубе попался ролик, где некий Роман Сакутин рассказывал, почему какие-то очередные курсы по программированию — лажа. И в общем-то критиковал за дело, так что в первом приближении даже мне показался адекватным чуваком. На этом бы всё и закончилось, если бы в конце он не порекомендовал собственные курсы, а у меня не было бы своего рода Guilty Pleasure: я люблю поглядывать за всякими самопровозглашёнными гуру, которые транслируют успешный успех, но на деле ничего из себя не представляют. Как правило это люди, у которых что-то случайно стрельнуло, и они начинают раздавать советы, как построить бизнес с нуля. Я люблю заходить на каналы таких деятелей время от времени в течение длительного времени, и мерзенько про себя злорадствовать, когда их дело закономерно загинается, а второй раз повторить успех не смотря на всю их «экспертность» уже не получается. Поэтому я решил поизучать канал Романа подробнее, чтобы проверить, не тот ли это случай, но даже не подозревал, какую кроличью нору на самом деле открываю.

Чем больше я погружался в материал, тем сильнее охреневал. Я многие годы последовательно говорю о том, что российский геймдев безнадёжно поражён раком в виде Unity головного мозга и медленно от него умирает. Так вот то, что создал Сакутин — лучшая тому иллюстрация. Я бы даже сказал, квинтэссенция. У 24-летнего сеньора 100-тысячный канал на youtube, собственная студия разработки Agava с кучей нанятых сотрудников и своя школа программирования «ЯЮниор».

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

Но давайте к сути. Курс «ЯЮниор» предлагает 11 модулей по месяцу обучению за 18 тысяч в месяц или почти 200 штук за весь курс. Первые два месяца посвящены C#, ещё 7 Unity, потом некий «напильник», где обещают научить лучшим практикам реальных проектов, и последний модуль — стажировка. Содержание довольно туманно, по отзывам тоже не очень понятно, что там внутри, но интересно не это.

Фишка школы Сакутина, которой они постоянно бравируют — это по-настоящему гарантированное трудоустройство. Как они могут это гарантировать? Правильно: выпускников устраивают к себе же в контору. Но курс с гарантированным трудоустройством стоит уже не 200 тысяч, а все 360 (если я правильно разобрался в тарифах, так как инфа на сайте противоречивая). Причём это единственное преимущество более дорогой версии курса. Да-да, вы всё правильно поняли: обучение настолько качественное, что после 11 месяцев они готовы взять к себе выпускника, только при условии, если он ещё 160 тысяч сверху накинет, чтобы его взяли. Интересно, что по заявлениям основателя, 80% студентов выбирают именно дорогой вариант. Насколько я понимаю, именно пункт с гарантированным трудоустройством главный крючок для неофитов этой школы (а заодно и первичный фильтр, собирающий людей конкретного психотипа).
Берут выпускника на оклад в 65 тысяч. «Примерно через полгода работы ты окупишь вложения в обучение и выйдешь в плюс!» — весело сообщает сайт. Понимаете масштаб катастрофы? Это не «ЯЮниор», а «ЯЛох» какой-то. Нормальный человек скорее всего не будет тележить 11 месяцев, а найдёт работу раньше, так как за это время раскачается самостоятельно. Только самые прямолинейные и исполнительные дойдут до конца, но даже среди них вряд ли многие просидят потом 6 месяцев в такой конторе (об этом чуть позже). Те, кто посообразительней, да поталантливее, свалят гораздо раньше. А контора только в плюсе будет. Досидят и останутся только совсем уж специфические кадры.

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

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

Апофеозом самодурства, конечно, является шоу «код в мешке». В нём Сакутин выступает ведущим шоу по типу своя игра, но на тему геймдева, а участниками — его сотрудники, которые грустно признаются, что пришли, потому что их «попросили» или «заставили». На протяжении выпуска участники отвечают на вопросы Романа, а он их весело оскорбляет и подкалывает.

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

Более того, большинство из тех, кто всё-таки окончил курс до конца (опять же, по признанию автора) устраиваются именно в их контору. Видимо, не очень-то в других местах востребованы такие специалисты, раз остаются в таких условиях клепать убыточные однокнопочные ранеры про летящих на пердяже персонажей, презервативы и прочую срань (справедливости ради, не всё в таком духе, но приличное количество). Это и не удивительно, раз менторы за свою жизнь ничего сложнее не делали, а скорее всего и сами всему научились, закончив этот же самый курс. Эдакая замкнутая система подготовки бесполезных кадров получается. Примечательно, что Роман хвастает, что они сильно переработали курс, когда стали массово нанимать студентов к себе. Дескать, выкинули интересные теоретические материалы, но добавили больше того, что пригождается на практике. Надо понимать, пригождается на практике конкретно в этой конторе гиперкэжа.
Вообще, насколько я понял из отзывов, все 11 месяцев обучения вам будут тоталитарно насаждать именно сомнительный опыт, принятый у них в студии. К примеру, в отзывах часто упоминают (и даже отмечают плюсом курса, лол) очень жёсткие критерии, по которым заворачивают домашние задания.

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

Например, одна из его любимых претензий к другим курсам или блогерам, это когда кто-то называет метод функцией. На первый взгляд кажется, что замечание правильное. Метод — это более точно. Более того, в документации некоторых языков, насколько я помню, проводится явная дистинкция между, например, процедурой и функцией. То есть процедура формально не является функцией (в бейсике так, если память не изменяет). Но я специально не буду смотреть, считается ли метод частным случаем функции в C# или отдельной сущностью, потому что это не так важно. Даже если это так в документации, то у этой чёткой дистинкции есть контекст, ограниченный этой самой документацией; и за его пределами следовать ему не всегда целесообразно. Потому что тогда при исследовании, например, стека вызова функций, нам бы пришлось говорить о стеке вызова методов, функций, процедур и геттеров свойств. Очевидно, что в этом контексте такой формализм излишен, и даже вреден; можно обобщить просто «функция», но Сакутин всегда и всюду в роликах поправляет, что надо говорить «метод».

Показательно, что он также является большим поклонником SOLID. О том, что в реальном геймдеве на больших проектах SOLID практически никогда не применяется, я писал отдельную статью, но в Agava об этом не в курсе, потому что никогда больших проектов не делали. На деле, почти все их игры можно писать вообще без всякой архитектуры, и они от этого ни капли не пострадают. Самый крутой проект, где участвовал Роман, и где уже можно говорить о какой-то архитектуре — это некая мобилка FrostFall, но в ней он занимался только второстепенными тасками, вроде звука и эффектиков.
Таким образом создаётся впечатление, что в школе «ЯЮниор» за 11 месяцев дают практические навыки для создания гиперказуалок на Unity, но дрессируют писать их «правильно» с точки зрения их лидера. Часть правил действительно имеют смысл (правда на больших проектах, а не гиперказуалках, но вопросы задавать в Agava не принято), а часть взята с потолка, потому что Роман прочитал что-то в википедии и решил задолбать этим всех своих сотрудников (как SOLID, например).

Я не расследователь. У меня нет инсайдов из студии, я составил впечатление исключительно из роликов, интервью, отзывов и чатиков. Я не ручаюсь за то, что всё действительно так плохо, как я описал. Но вот недавно мне твиттерские принесли статью на хабре про 14-летнего парня, который учится создавать игры в Unity самостоятельно. Парень совсем не вундеркинд, показывает, по моему мнению, обычные результаты для своего возраста. Но я уверен, что дай ему кто-то хорошую книжку по C#, то через пару месяцев он уже будет в состоянии запрограммировать добрую половину игр Agava. Без 11 месяцев обучения, менторов и 360 тысяч. А вы уж сами делайте выводы.

Ни для кого не секрет, что российский геймдев давно горит в пекле. Ренессанс 2021 года (Pathfinder, LoopHero, Encased, Atom, BlackBook, HighFleet) это был никакой не ренессанс, а последний вздох перед тем, как окончательно провалиться в ад. Дальше только Игропром, экшен-РПГ Смута, ну и, конечно, школа Unity-программистов ЯЮниор.
Advent of Code
#code

В этом году впервые играю в Advent of Code. Это движуха, когда весь декабрь (с первого числа и до рождества) каждый день появляется новая задачка для программистов. Первые дни разминочные, но потом, говорят, будет интересно. Решать можно на любом языке. Всё делается у вас на компьютере локально, а на сайт нужно лишь загрузить ответ.
Я решаю на С++20. Следить за моими решениями можно на гитхабе.

У меня до этого никогда не было адвент-календарей, но на самом деле что-то в этом есть. Каждый день просыпаешься, а тебя ждёт новая задачка — и впрямь появляется ощущение приближающего праздника. Вливайтесь! Пока прошло только два дня, так что можно легко нагнать.

А если хотите дополнительного фана в виде небольшого соревновательного элемента, то добавляйтесь в мою приватную лидерборду: 2341807-220d9fc6. Там не самая лучшая система рейтинга: дополнительные очки даются тем, кто решил задачу раньше других, но без учёта часовых поясов. Задачки появляются каждый день в полночь по UTC-5. Это 6 утра по моему времени или 8 утра по Москве. Так что все оказываются в разных условиях и очки не очень справедливые, но всё равно интересно смотреть за прогрессом друг друга.
Как я проводил собесы?
#light

Что ж, давайте я вам расскажу, как я проводил собесы, когда был большой начальник в маленькой студии. Речь про Dark Crystal Games, где я был лид-кодер и ещё формально технический директор. Напомню, что там мы писали тактическую РПГ Encased на Unity.

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

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

Он же сам проводил второй этап, который представлял из себя что-то среднее между первичным скринингом и культурным интервью. Надо сказать, что как любая восточноевропейская студия, мы не особо много внимания уделяли софт-скилам. Вся софтскилловая часть у нас по сути сводилась к ответу самим себе на вопрос: «хочется работать совместно с этим кренделем, или ну его нафиг?». Ну ещё, конечно, любовь к Fallout и релевантным играм давала бонус. Но на этом всё. Я не говорю, что это супер правильно — на западе, например, софтскиллы даже важнее хардов — но рассказываю, как есть.

Далее у нас было два технических этапа: техническое интервью и тестовое задание. Тут уже подключался я. Кому-то мы давали оба этапа; но кому-то только одно, если видно, что кандидат годный и нет смысла гонять дополнительно. Иногда мы начинали с интервью, иногда — с тестового. Строгой формулы, как мы это решали, не было: руководствовались по ситуации. Например, если в портфолио дофига примеров кода, то тестовое не просили. А если чувак с явно хорошей теоретической базой, но мало опыта в геймдеве, то такого посылали сперва на тестовое.

Тестовое я придумал в самом начале проекта и мы его использовали до самого конца. Нужно было сделать 3D-леталку на самолётике от третьего лица. Требовалось реализовать только управление (повороты, ускорение), выпускаемые ракеты, врагов-мишени и интерфейс в виде индикаторов расстояния до них. Разрешалось делать на кубиках или бесплатных ассетах, красота не оценивалась. Я когда-то писал такое на хакатоне, поэтому к тестовому прилагалось видео, как это может выглядеть.

Изначально я написал, что задача рассчитана на 3 вечера (из расчёта 6-9 часов), но на деле большинство кандидатов делали за 2-3 часа. В поздних версиях мы также начали делать приписку, что нельзя использовать юнити-корутины и ригидбоди, чтобы кандидаты хотя бы реализовали работу с DeltaTime и проверками расстояния, а то совсем порой оценивать было нечего.

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

Наконец последний этап (который обычно был до тестового) — это техническое интервью. Я неоднократно упоминал статью «интервью глазами пострадавшего», как свой ориентир по собеседованиям. Собственно, я им и руководствовался, но занизил планочку, как мог, под современные реалии.
Начинал интервью я всегда с объяснения, что чёткого списка обязательных вопросов нет. Что я буду прыгать с темы на тему, что можно чего-то не знать, и можно об этом так и сказать — мы тогда просто не пойдём углубляться в эту тему, а поговорим о чём-то другом. Идея состояла в том, чтобы нащупать общее представление об уровне кандидата в разных сферах (С#, математика, С++, графика).

Я называл это методом бинарного поиска. Если представить вопросы по теме в виде линии от простого к сложным, то я задавал вопрос где-то посередине и дальше ориентировался по ответам. Если кандидат отвечает хорошо, то я прыгаю в середину отрезка справа, иначе — влево. И так, в ходе эдакой пристрелки из 5-6 вопросов, становится понятен общий уровень по теме.

Секцию C# я почти всегда начинал с вопроса «что такое виртуальная функция?». Разминочный вопрос, на который отвечали практически все, но даже на нём уже видно уровень: кто-то начинает рассказывать, как устроена vtable или рассказывать про производительность в сравнении с обычными функциями, а у кого-то знания ограничены ключевым словом. Далее я старался спрашивать более сложные вопросы, хотя по C# трудно спросить что-то сложное. Чтобы не сочинять каждый раз на ходу и чтобы не повисало пауз, у меня всегда перед глазами был файлик с накиданными заранее вопросами, из которых я уже выбирал. Чтобы пройти на мидла надо было хотя бы отличать стек и кучу, знать в чём опасность float’ов, знать размер байта, отличать Dictionary от List и оценивать стоимость их операций, представлять в общих чертах, как работает GC. Да в общем-то и всё. Бонусные очки давались, если человек может внятно рассказать, как устроены флоаты, хэшмапа, когда и почему происходит boxing.

Вторая обязательная секция была математика. Минимальный джентльменский набор здесь это понимание тригонометрии, знание отличий векторного и скалярного произведений, хотя бы приблизительное представление о том, как работают матрицы трансформации. Иногда я также спрашивал примитивный тервер или комбинаторику. Ну типа: «пушка попадает с вероятностью 50%, какова вероятность попасть 3 раза подряд?». Если у человека не хватает интуиции это посчитать без формул, то скорее всего это красный флаг. Иногда также мог спросить чего-нибудь про графы (здесь ничего конкретного не требовалось, но хорошо, если человек содержательно может поговорить за Дейкстру, А* или чего-нибудь такое).

Остальные секции по большому счёту были опциональные, но знания в них были большим преимуществом. В первую очередь это, конечно, С++. Тут можно было бы много всякого интересного спрашивать в правой части бинарного поиска: всякие там универсальные ссылки, value-категории, guaranteed copy elision или, прости господи, SFINAE (последнее это очень локальный мем — по случаю передаю привет). Но, к сожалению, так далеко мы ни разу не добирались. Всё-таки вакансия была по C#.

Что касается графики, то первым пристрелочным вопросом был «что такое depth buffer?». Далее я мог поспрашивать про освещение и нормали, инстансинг, всякие кулинги, как реализуются тени или какой-нибудь моушн-блюр. Мой любимый вопрос по графике это классический «назовите как можно больше причин, почему экран может быть чёрным?». Но, по-моему, я так ни разу его и не задал (вопрос классный, но его надо задавать чуваку, который не только шарит в графике, но и который чувствует себя уверенно на интервью — иначе перенервничает и поплывёт).
Психологическая составляющая на собеседовании вообще важная. Не смотря на то, что ты в начале говоришь, что можно чего-то не знать и это не страшно, половина кандидатов теряется после первого «не знаю». Ты задаёшь новые вопросы на другую тему, а кандидат явно продолжает думать над предыдущим. Приходится дополнительно повторять, что ничего страшного не произошло. Также я всегда в начале делал ремарку, что могу перебивать из экономии времени, если вижу, что человек отвечает в правильном русле (некоторые отвечают хорошо, но прям о-о-очень медленно или концентрируются на несущественных деталях), и что если я останавливаю, то это скорее хороший знак, чем плохой. Но, как правило, после первой остановки приходится это ещё раз объяснить, чтобы человек не переживал.

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

В самом конце, если интервью прошло слишком быстро или впечатление смазанное, я мог ещё спросить что-то практическое. Ну, типа: «на бильярдом столе 10 тысяч шаров, все двигаются и сталкиваются. Как будем оптимизировать?» Здесь не было никаких правильных ответов, это чисто на послушать, как человек рассуждает. Ну ещё мог спросить логическую задачу про червячков в стиле google, но это уже больше кека-ради.

Как видите, ничего сверхъественного я не спрашивал. В целом, открытая вакансия висела у нас 1-2 месяца. За месяц я в среднем, наверное, видел штук 10 резюме, штук 5 тестовых и проводил штук 5 интервью. 1-2 человека в итоге получали офер, но не все соглашались или приживались после выхода на работу, поэтому найм иногда затягивался. Цифры очень приблизительные.

Ну вот пожалуй и всё, что мне есть рассказать по теме. Пообещайте, что не будете использовать эту схему, как руководство к действию. Она здесь исключительно для удовлетворения любопытства и не претендует на ролевую модель.
Advent of Code 2022 Done!
#code

Ну вот и закончился Advent of Code.
Расскажу про задачки, которые хоть чем-то запомнились:

8. Treetop Tree House.
Сама задача не особо примечательная, но я уже после основного решения выпендрился оптимизацией, сделав поиск однопроходным и заюзав intrinsic functions (get_trailing_zeros).

11. Monkey in the Middle.
Первая задача, в которой надо было минимально подумать, заглянув в инпут и проанализировав его. Про наименьшее общее кратное. Хотелось бы больше такого.

13. Distress Signal.
Мудацкая задача со списками, которая легко решается в какой-нибудь динамике типа python или lua, чуть ли не простым eval(), но на крестах задолбёшься только структуры заводить.

16. Proboscidea Volcanium.
Пожалуй, самая интересная задача. Нужно было сначала упростить граф + запилить кэширование стейтов тем или иным способом. Плюс во второй части нужно было придумать, как "распараллелить" дерево возможностей. Жалко, что оптимальное решение у слона и человека не пересекается. Можно было ещё усложнить немного. Тем не менее, понравилось больше всего. Классная.

17. Pyroclastic Flow.
Неплохая задача про тетрис. Выпендрился тем, что уложил многоэтажные фигуры тетриса целиком в один uint64_t и двигал их влево-вправо простым шифтом. Ну и в стакан зашивал битовыми операциями соответственно.

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

19. Not Enough Minerals.
На эту задачу бомбил больше всего. На первый взгляд похожа на 16, но честно закэшировать стейты не получается. В итоге решается эвристиками отсечения, которые на самом деле не гарантируют правильного ответа. Причём самое подлое, что тестовые данные подобраны хитрые, на которых простые эвристики не работают, но которые вполне подходят для самого паззла. То есть в выигрыше были те, кто раньше забили на тестовый пример и сразу попробовали свои эвристики на основном инпуте.

22. Monkey Map.
Максимально душная задача. По началу ничего особенно сложного, но во второй части появляется условие, которое хрен запишешь сколько-нибудь красиво. Получается соревнование на то, кто быстрее сможет это захардкодить под конкретный инпут и при этом не запутается. Я всё равно проспал, поэтому решил решать честно и универсально, на что угрохал весь день. Но под конец уже так преисполнился, что даже объяснение алгоритма на реддит запостил.

***

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

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

И да: всех с Рождеством!