Леха & Рома | Доведем от джуна до сеньора в Unity
473 subscribers
27 photos
8 links
Download Telegram
Привет, я усатая шляпа, но по паспорту меня зовут Алексей Хохряков.

Мне 24 года, и с 14 лет я знал, что буду делать игры 🎮

Несколько лет назад я и не думал, что буду обучать людей. Но у судьбы на этот счёт были другие планы. Она подкинула мне в жизнь Романа Сакутина, благодаря которому я открыл свой талант: объяснять сложные вещи простыми словами.

👇 7 фактов обо мне:

1️⃣ Кочевой программист на должности Lead Unity Developer в Azur Games (компания входит в топ 3 мира среди издателей мобильных игр).

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

3️⃣ Был ментором и соавтором курса Романа Сакутина, по которому прошли обучение тысячи людей.
Многим из них помог сменить нелюбимую работу на геймдев.

4️⃣ Проверил 20 000 задач на проработку кода.
И ежемесячно провожу ревью кода для своей команды.

5️⃣ Менторю и довожу джунов до уровня мидла.
Один из лучших программистов в моей команде в Азурах - мой студент.

6️⃣ Собрал команду, с которой за пару месяцев сделал айдлер с уникальной механикой.

7️⃣ Закончил вышку по специальности "Информационные системы и технологии"
Дипломная работа по Unity стала одной из лучших на курсе.

Вообще я прошёл большой путь от Бийска до Калининграда. Переехал в Липецк к Роману Сакутину, запустили много крутых проектов. Благодаря переезду я познакомился с женой и увёз её в собственную квартиру в Калининграде 🙏🏻
👍16🔥7
ПРЕПОДАВАТЬ - МОЕ ПРИЗВАНИЕ?

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

Крутым может считаться только тот преподаватель, который дает реальные знания. Он должен быть закалён ПРАКТИКОЙ в бою! Из-за этого я стал Lead Unity Developer в топ 3 издательстве МИРА - Azur Games и приложил руку к обновлениям для BEHOLDER 2.

А теперь немного истории 👇

Я наткнулся на курсы Ромы, и это сложило пазл. Я понял, как воплотить идею создания игры в жизнь. Собрал команду, с которой мы выпустили History Of Bread, - музыкальный кликер, где вам нужно сколотить собственную группу. Её скачали всего 300 раз в Google Play, но тогда мне это казалось диким УСПЕХОМ.

Проект заметил Рома и предложил стать МЕНТОРОМ на курсе. Я сделал короткую запись, на которой объяснил работу переменных простым языком. Тестовая запись понравилась Роме, и мы запустили курс.

Первое занятие прошло УЖАСНО, это был первый опыт преподавания. Микро тупил, я волновался, Роме приходилось подключаться, чтобы что-то пояснить, но уже ко второму занятию я пришел в себя, собрался и сам провёл урок без факапов.

Пролетели две недели, всё вышло отлично. Ребята усвоили материал, сдали все домашки и ВСЕ дошли до конца курса. Я тогда немного ох*ел, реально большая редкость, когда никто не отваливается по ходу. КАЙФ – это видеть результат, прогресс человека и его мышление к концу курса.

После этого пошла движуха! Мы провели и запустили очень много классных проектов: очное обучение, пару курсов для Udemy. Пока Рома записывал курс по Unity 2019, я писал программу для курса по Swamp Attack и созданию базовых эффектов. Планы были грандиозные!

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

Я тогда даже и не думал, что свяжу с этим всю свою жизнь…
🔥11👍5
MIDDLE, JUNIOR И SENIOR

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

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

Чтобы вам стало чуточку понятнее, я решил выписать ЖЕЛЕЗНЫЕ отличия между джуном, мидлом и сеньором, в которых сходится БОЛЬШИНСТВО разработчиков.

Ключевые характеристики хорошего JUNIOR:
- Способность читать и понимать код;
- Горящие глаза и желание развиваться;
- Адекватное отношение к критике;
- Умение обратиться за помощью в тупиковой ситуации.

Ключевые характеристики MIDDLE:
- Уверенное знание ЯП;
- Понимание базовых концепций и архитектур;
- Самостоятельное выполнение технических задач;
- Способность выполнять управленческие задачи;
- Переводить текст задачи в грамотное техническое решение.

Ключевые характеристики SENIOR:
- Глубокое знание ЯП;
- Реализация проекта с нуля;
- Понимание производственного цикла;
- Декомпозиция проекта на задачи;
- Развитые управленческие навыки;
- Менторство.

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

ГРЕЙДИНГ- это классификация или упорядочение. Мы вынесли все нужные компетенции и распределили их между 8 уровнями. Где 1 уровень - начинающий разработчик, который берёт на себя саппорт таски, а 8 уровень - это боевая машина, которая способна сделать любую задачу в рамках отдела без участия лида и без правок после код-ревью.

Если будет интересно, как-нибудь могу рассказать поподробнее ;) Так что обязательно подпишитесь, чтобы не пропустить❗️

👇 Пишите в комментарии свой уровень
👍64👎3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥44👍7🍌4🍓2
This media is not supported in your browser
VIEW IN TELEGRAM
👍30🤡4🔥2🎉2🤩2🍌2
КАК Я ЗА 1 ЧАС ПОДГОТОВИЛСЯ К СОБЕСУ 🧑‍💻

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

Будучи джуном, я несколько раз устраивался в разные компании, и этапы собеса всегда были практически одинаковые:
- Собеседование с HR;
- Выполнение тестового задания;
- Техническое собеседование.

Когда я искал одну из своих первых работ, то отправлял резюме куда только можно, хватался за все тестовые, и в итоге мне назначили два собеседования ПОДРЯД, с разницей буквально пару часов. Мандраж был невероятный, зубрил все видосы про собеседования, готовил разные вопросы и даже написал шпоры 😄

1️⃣ Первый собес. Матёрый кодерский волк задает мне вопросы, ответы на которые я не знаю. Мне повезло и это был ВООДУШЕВЛЕННЫЙ разраб, которому очень нравилось разговаривать про техническую часть и тогда стал у него СПРАШИВАТЬ что и как, чтобы он мне разжевал. После выхода с собеса я понял, что, скорее всего, меня не примут, но вынес оттуда большую тележку новых знаний.

2️⃣ На втором собеседовании было два разработчика, но, на моё удивление, здесь задавали те же самые вопросы, что и на ПЕРВОМ СОБЕСЕДОВАНИИ. По сути, мне задали те вопросы, ответы на которые я узнал ЧАС НАЗАД. Как вы понимаете все были впечатлены моими глубокими знаниями.

Мораль сей истории: к каждому собесу относитесь как к крутому опыту, который можно применить в будущем. НЕ ВАЖНО провалили или прошли собеседование, выносите из каждого что-то для себя, не бойтесь задавать вопросы и честно признавайте пробелы в знаниях.

Пишите в комментарии про свои самые интересные собесы 👇
🤯20👍15😁4
КАК ПОЗНАКОМИЛИСЬ С РОМОЙ

Это было еще в далеком в 2017 году, но по-настоящему сдружились мы в 2019, когда е**шили наш первый курс, по которому многие из вас меня знают. Это было топовое время.

Впервые мы познакомились с Ромой после того, как я выкатил свою первую игру, тогда он оценил её и написал мне, предложив поработать вместе. Но наш проект быстро заглох, чтобы потом как феникс воскреснуть в совместном курсе, на котором я стал ментором. После первого потока и еще нескольких проектов мы первый раз встретились в офлайне в Липецке. Начались бешеные две недели: кранч, недосып, работа практически 24 на 7, но мы так кайфовали от этого!

Знаете все эти истории про стартапы, которые начинались с гаража? Вот это про нас с Ромой. Жили вместе, ели из одной тарелки, ху*чили курсы и контент. А ещё у нас был прикольный инди-проект, пиксель-арт, вариативность, разветвлённый сюжет и всё, что вы так любите.

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

Пишите в комменты, как вы запечатлели свои самые значимые моменты👇
👍18🔥5👎1
Готовлю для вас классный материал о самой БОЛЕЗНЕННОЙ теме в IT.

А пока ловите мем и кидайте свои версии в комментариях, о чем будет пост 👇
😁28🔥1
ОШИБКИ ДЖУНОВ

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

Какого джуна можно назвать хорошим? Junior - это специалист, который уже должен быть готов к бою, но компания прекрасно понимает, что ему нужно помогать и дообучать, поэтому на 2-3 джунов в компании должен быть хотя бы 1 Middle, который будет помогать им и развивать их.

Но это была матчасть. А теперь про мои ошибки.

СТРАХ ЧЕГО-ТО НЕ ЗНАТЬ.

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

Получился лонгрид, чтобы вы не устали читать, я разбил его на две части. Вторая каминг сун, так сказатб.

Пишите, какие забавные ошибки допускали вы, когда только начинали кодить?
👍31🔥8🤔4
ОШИБКИ ДЖУНОВ 2

Здорово, ~boy~цы! Как и обещал, делюсь с вами второй частью ошибок (первая здесь), на которых тупил сам и вижу, как их допускают многие джуны сегодня.

ОТСУТСТВИЕ ТЕСТИРОВАНИЯ

Тестирование - вещь, которая сэкономит вам уйму времени. Бывали случаи, когда метод получал некорректные данные, и я не понимал, что же на это влияет. Долго шарился в коде, прыгая между тремя скриптами и анализируя каждую строку. В итоге проблема решилась в кратчайшие сроки после применения break point. Он позволяет построчно выполнить код и проверить данные на нужных участках кода. Это не всё тестирование, но его база, в которую должны уметь все.

НЕУМЕНИЕ ПРОГНОЗИРОВАТЬ

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

Эх, эти беззаботные времена…

Накидайте 🔥, если вам заходит такой формат, и я запилю такой же пост о мидлах
🔥93👍2😁2👎1
ПРОБЛЕМЫ UNITY

Недостаток Unity из коробки в том, что его базового функционала очень часто недостаточно. Вы скажете: “Да, но всегда есть Asset Storе, где я могу купить всё что мне нужно!”. Хмм… а что если я скажу вам, что в сторе есть далеко не всё, и я сам сталкивался с огромным количеством задач, решений для которых просто не было или они стоили каких-то космических сумм.

Расскажу на одном примере. Я столкнулся с проблемой настройки путей с развилками. Если коротко, то вручную расставить точки пути и настроить углы для кривых та ещё dark fantasy. Платить огромный прайс для решения одной задачи не хотелось да и финансы не позволяли.

И что делать?

И тут я вспомнил, что я программист и накидал расширение сам. Оно получилось клassное по функционалу, но в коде творилась дичь. Мою проблему это решило, самодельное расширение (которое обошлось мне в 0$) визуализировало все точки и пути до них и бонусом добавляло функционал для удобного создания и редактирования пути.

Это я всё к чему. Расширения допиливают "коробочный" Unity до идеала и сильно ускоряют разработку. Они упрощают и автоматизируют однотипные задачи, а также экономят кучу времени. Если вы умеете работать с расширениями Unity, то вместо того, чтобы долбиться с однотипными задачами (которые ещё и не каждый джун может решить), вы пишете расширение, которое частично автоматизирует, визуализирует и по итогу значительно упрощает задачу.

Если вам знакома эта боль, то накидайте реакций, и я расскажу, какими инструментами пользуюсь сам. И пишите в комментах самые тупые задачи, которые приходилось решать на Unity :)
🔥64👍15👌2👏1🤔1
Как быть клassным разрабом или инструменты для создания расширений

Пишите крутые расширения и будете хорошим разработчиком. На чем писать? Вопрос хороший, поэтому выполняю обещание и рассказываю про те инструменты, которые юзаю сам:

1️⃣ CustomEditor - здесь пишем функциональный инспектор с кнопками под любые действия;

2️⃣ EditorWindow - здесь создаем отдельные окна и наполняем их функционалом;

3️⃣ OnSceneGUI + Handles - здесь визуализируем любые данные на сцене.

Какая структура должна быть у класса, который кастомизирует инспектор?

Я как-то в армии служил…Кхм, то есть был один случай, в котором кастомный инспектор сильно упростил мне жизнь. Была задача в мобильной игре со сборкой мусора: на полу должно лежать множество конфетти. Я решил спаунить конфетти зонами на этапе сборки уровня (так как в Awake заспаунить 150+ мелких обьектов not ♂smartass♂). И для удобства левел дизайнеров написал расширение, которое позволяет делать это без разработчика.

По пунктам:

Сначала создал класс, который будет унаследован от Editor (в библиотеке UnityEditor) и над ним указал атрибут, который говорит, что это кастомный редактор ConfettiSpawner.
@
В OnEnable получаем экземпляр класса, инспектор которого мы расширяем.
@
Переопределяем метод OnInspectorGUI. Внутри него мы можем описать все нужные для нового инспектора поля и кнопки. Порядок размещения элементов в инспекторе напрямую зависит от положения элемента в коде.
@
Перерисовка происходит каждый кадр, но не стоит этого бояться, ведь в билд эти скрипты не тянутся.

Профит: очень маленькое расширение упростило работу и помогло в оптимизации проекта.

Если вам интересна тема расширений, то реактите 👍 и в следующем посте расскажу о расширениях, которые мы делаем в Azur Games.
👍59🔥13🥰2👏1
Привет, котаны :3 Я тут для вас приготовил кое-что!

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

Я стал ментором для “усредненного джуниор программиста”.

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

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

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

З.ы. Это не @rsakutin 😂
👍88🔥11🥰2🤩21👌1
ПРОКАЧИВАЕМ ДЖУНА

Ваша активность под прошлым постом реально ♂so horny♂ горяча❤️‍🔥

Короче, я решил не ждать и уже сегодня поделиться кодом нового джуниора на менторстве.

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

Пишите в комментах, какие увидели ошибки и какая из них самая страшная?

Завтра расскажу, как мы это исправили)
🔥14👍6🤯2
CODE-REVIEW

В комментах к прошлому посту вы указали почти на все ошибки, давайте добью и перечислю весь список, который увидел. Кстати, самый полный список написал @thomas_in_the_dark, красавчик!

Итак, ТОП 10 ошибок кода джуниор программиста. Шучу, никакого топа, но часть из них реально критичны:

1) Именование класса. Нейминг - это важно, имя класса должно отражать его функционал и ответственность. В данном случае класс ничего не отслеживает и не может называться Tracker;

2) Именование полей и переменных. Нейминг - это важноХ2. Мне в свое время очень помогло простое правило - по названию должно быть понятно назначение конкретной ячейки;

3) Порядок полей - SerializeField надо бы выше private поставить;

4) Излишние булевые флаги - сам когда-то страдал от такого и ловил некорректные состояния в булевом поле. Чисто по опыту, в 90% случаев от bool поля можно избавиться));

5) Свойство IsGameAudioOn - такой же булевый флаг, только открытый на чтение. Я бы привязал значение к состоянию AudioListener;

6) OnInBackgroundChange - прослойка для переключения флага. После удаления которого метод станет бесполезным;

7) Методы - это действия, а действия - это глаголы (да, я учился в 5 классе и проходил глаголы, дайте хоть где-то это использую). Короче, метод именуем с глагола и точка;

8) Switch методы - результат выполнения таких методов непредсказуем, они просто переворачивают состояние. Я заменяю на методы включить/выключить и кайфую;

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

10) Переключение звука после показа рекламы и при помощи вызова метода - разделены на 2 разных значения. Возвращаемся к пункту 8, в SwitchAudio сильно переусложнено переключение состояния.

Неплохой списочек вышел, однако 🌚

Пишите, как бы вы исправили этот код, ну и накидывайте 🔥 и будем вникать дальше. Уже сегодня вечером я покажу вам, как мы исправили этот код)
🔥34👍7🤩1
ИСПРАВЛЯЕМ КОД

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

1) Переименовали класс в Background Audio, убрали из имени несуществующую ответственность;

2) За ненадобностью убрали bool isBackground;

3) Переименовали свойство из IsGameAudioOn в лаконичный Muted. Вместо смены состояния вручную значение свойства теперь зависит от состояния AudioListener, что полностью исключает проблему некорректного состояния;

4) Непредсказуемый SwitchAudio сменили на четкий SetState с указанием состояния в параметре;

5) Выделили 2 публичных метода, включение/выключение, что позволило нам избавиться от SwitchGameAudio и OnInBackgroundChange;

6) Т.к. обработчики в данном случае являлись лишь прослойкой, которые вызывали смену состояния, решили избавиться от них и подписать напрямую методами Mute и Unmute. С точки зрения BackgroundAudio не так важно, что реклама закончилась или началась, нам гораздо важнее, что мы включаем или выключаем звук в ответ на это.

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

Если вам понравился такой формат, то покажите это бурными 👍, и я буду пилить эту рубрику дальше :)

Пишите в комментариях, что для вас самое главное в коде 👇
👍74🔥9
Котаны, я увидел, что тема прокачки Unity вам зашла! И вы просили подробнее рассказать о работе с инструментами.

Мы с Ромой подумали и решили, что будет классно замутить интенсив. У меня в Azure скоро отпуск, и я решил целую неделю провести с вами.

Да, анонс!

с 6 по 11 декабря я буду в онлайне 24/7:
- Только живое общение;
- Трушный Code-review. Разберу код для вас на стриме;
- 2 лекции по вечерам 6 и 8 числа с 19:00 до 21:00 (МСК);
- В остальное время - проверка домашек и общение с вами в дискордике;

И самый сок 10 и 11 декабря: на два полных выходных мы разобьём вас на команды, чтобы вместе решать сложную техническую задачу, и параллельно будем давать Code Review.

p.s. Специальным гостем будет Рома, он также будет давать вам обратную связь)

Короче, по сути, замутим 5-дневную пыточную для вас.

ВАЖНО! Возьму только 40 человек, хотел бы больше, но не вывезу. Я хочу быть уверен, что проработаю все фишки индивидуально с каждым. Поэтому кто не успеет, прошу понять и простить.

По прайсу: 9 900 руб. Чекайте всю инфу на сайте.

Жду всех желающих, будет жарко 🔥
👍12🔥63