TGViewer
Channel Public Channel
Unity Architect: архитектура unity проектов

Unity Architect: архитектура unity проектов

@uniarchitect

Пишу о том, что нельзя нагуглить про архитектуру, разработку и пр.

Мой курс по архитектуре: https://course.uniarchitect.dev/y/9b8ec0c

Иногда выкладываю видео и веду стримы: youtube.com/@vangogih

По всем вопросам: @vangogih
Subscribers
5.23K
Photos
35
Videos
2
Links
99

Showing posts older than #110 · Back to latest

Older Posts 20 shown
Post #109 3.92K
НЕВЫРАЗИТЕЛЬНОСТЬ

Ранее я уже писал про построение диаграмм.
Тогда мои я смотрел на эту тему через призму практики.
Но спустя время у меня пара более весомых аргументов в пользу того что сила диаграмм недостаточна в разработке ПО.

1️⃣ аргумент:

Мысленный эксперимент:
🔹 Подумайте о фиче над которой вы работали(-ете) последнее время.
🔹 Попытайтесь формально и недвусмысленно представить себе ее описание или представление.
Со всеми связями, зависимостями и внутренними элементами.
🔹 А теперь опишите это так, чтобы человек который не имеет ни малейшего понятия об этом, смог в точности воспроизвести то, что вы описали.

Именно эта проблема емко выражается словом невыразительность:
🔻Невыразительность или Inexpressiveness — термин употребляемый чаще всего математиками, означающий невозможность как формально, так и строго выразить, смоделировать, представить описанную проблему.

И в отличие от физических, механических или геометрических конструкций в физическом мире, проектирование ПО осуществляется в абстрактном мире.
И то, чего достаточно для отображения физического мира не достаточно для абстрактного.

Отсюда 3ий закон инженерной разработки:
Теорема 1.3. Природа ПО проистекает из неосязаемости изучаемых абстрактных объектов, сложных внутренних связей программных систем, адаптивности к внешним объектам и окружения, и когнитивной сложности для их явного описания.
Software Engineering Foundations, Wang, p26

И следствие из него:
Следствие 1.2. Силы выражения диаграмм недостаточно в разработке ПО, поскольку они делают дизайн и спецификации расплывчатыми.


Архитектура ПО представляет собой создание сложных объектов, часто опирающихся на физический мир, с не менее сложными связями между ними.
И вся эта сложность может быть выражена только на уровне профессиональных обозначений или математически.

❗️Для понимания см. картинку к посту:
Т.е. не на уровне L1, L2 - уровне реальных объектов и диаграмм, а на уровнях L4, L5.

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


2️⃣ аргумент:
Евгений Куприянов, который ведет канал Системный Сдвиг провел опрос среди подписчиков касательно использования UML на проектах.

Вот несколько выводов оттуда (цитирую, упрощая местами формулировки):
— Большинство аналитиков рисуют диаграммы, но многие не для того, чтобы разобраться или что-то спроектировать, а потому, что в документации есть такой раздел. Некоторые даже не знают, куда эта документация дальше пойдет.
— UML используется совсем не так, как был придуман. От всего UML осталась диаграмма последовательности (и она ого-го как используется!), диаграмма вариантов использования и диаграмма состояний.
— Диаграммы в основном скорее формальные, но не идеально формальные.

UML — как латынь для некоторых наук. Мёртв-не мёртв, а лучше знать хотя бы основы и понимать, как его правильно применять сейчас. Lingua Franca для разработки.


Выводы:
🔸Диаграммы недостаточно выразительны для точного описания сложных программных систем, что приводит к риску неправильного понимания и интерпретации.
🔸Архитектура ПО оперирует абстрактными объектами и связями, которые сложно адекватно передать с помощью диаграмм, особенно на уровнях, связанных с реальными объектами.
🔸UML и другие диаграммы часто используются формально и не всегда помогают в проектировании, что ставит под сомнение их практическую ценность в разработке ПО.
з.ы. жаль ребят кто должен рисовать схемы по долгу специфики работы (аналитики, поставил за вас свечку 🕯)

Более подробно, невыразительность, как одно из ограничений инженерной разработки, мы будем разбирать на моем курсе!
Посмотреть план курса 🫡

Сохраняй себе, чтобы не потерять и делись с коллегами 📞
Ставь 👍 если тебе заходит такого рода контент!

#software_engineering@UniArchitect
  • 👍 23
  • 🤪 2
Post #108 3.82K
Unity Architect: архитектура unity проектов ВАШ ПОСЛЕДНИЙ КУРС ПО АРХИТЕКТУРЕ Ч.2 В прошлом посте мы признали разрыв в уровне контента. Теперь важно понять, как его устранить и какие темы необходимы. Процесс был долгим и сложным. Анализируя материал, я постоянно задавался вопросами: 🔹"Какая информация…
Комментарии можно оставлять под эти постом 😅

Буду знать что посты в ТГ не поддерживают и кнопки и комменты 😬
Post #106 4.28K
Unity Architect: архитектура unity проектов ВАШ ПОСЛЕДНИЙ КУРС ПО АРХИТЕКТУРЕ Ч.1 Чем дольше ты варишься в разработке, тем больше начинаешь чувствовать разрыв между информацией, представленной в интернете, и реальностью. И чем больше становится опыта, тем чаще игнорируешь источники, которые вряд ли…
ВАШ ПОСЛЕДНИЙ КУРС ПО АРХИТЕКТУРЕ Ч.2

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

Процесс был долгим и сложным.
Анализируя материал, я постоянно задавался вопросами:
🔹"Какая информация действительно нужна для принятия качественных решений?"
🔹"Что необходимо для целостного усвоения всей информации в курсе?"
🔹"Каких знаний мне самому не хватает?"
🔹"Насколько эта информация важна?"

Так постепенно сформировался список тем, которых не хватает в стандартном информационном пространстве разработчика.
Оставалось лишь переработать и объединить их в единое целое 😊
Ну вроде изян! мем 🤣

Вот немного цифр:
🔸Суммарно в основу курса легла основа примерно из 50 источников
В основном это были научные статьи, книги, видео, профессиональные блоги и документация.
🔸С января 24-го на проработку всего этого ушло более 300 мифических человеко-часов 😬
То есть, каждый месяц уходила полная рабочая неделя на проработку в течение 8 месяцев.
🔸На подачу материала уйдёт в сумме около 40 часов — по 8 часов на каждый из 5 модулей!

Изначально мне хотелось максимально убрать зависимость курса от моего времени и физических ресурсов.
Но чем дольше я работал над материалом, тем больше понимал, насколько долго это всё может затянуться.

У меня был план, которого я придерживался:
🔹Проработать, структурировать материал, подготовить конспекты для видео.
🔹Записать и смонтировать видео.
🔹Сделать сайт-лендинг, где была бы собрана вся информация в удобном виде.
🔹Соединить его с платформой для обучения.

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

Поэтому я принял решение, что первый и единственный поток я проведу лично в формате онлайн-лекций!

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

Что будет включено:
🔸Доступ к закрытому телеграм-каналу, в котором будут публиковаться все материалы:
Записи, презентации, список источников и, возможно, текстовые конспекты лекций.
🔸Индивидуальный разбор кейсов и ответы на вопросы.
🔸Доступ к курсу на платформе после релиза.
🔸А также главная фишка, киллер-фича:
Персональный доступ к реальному проекту Magic Battle Arena!

Это уникальная возможность не только получить полезные знания, но и отточить их, работая над реальным проектом, который я лично разрабатывал в своей игровой студии Silverfox Games.

Для меня это способ вдохнуть вторую жизнь в этот проект, а для вас — отличный пример и источник знаний!
Получается win-win 😎

Переходите по ссылке и смотрите полный план курса со всеми темами!

Спасибо всем большое за активность в предыдущем посте.
Я прислушался к каждому из комментариев и подправил план курса 🫡

Делитесь с коллегами и боссами, уже через пару недель состоится открытие продаж!
Ставь 👍, если уже с нетерпением ждешь этого!

#курс@UniArchitect
Notion Notion | Where teams and agents work together A collaborative AI workspace, built on your company context. Build and orchestrate agents right alongside your team's projects, meetings, and connected apps.
  • 🔥 18
  • 👍 9
  • 😁 2
  • 🤷‍♂ 1
Post #105 3.72K
КОГДА НУЖНО ЗАДУМЫВАТЬСЯ ОБ АРХИТЕКТУРЕ

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

Казалось бы, всё индивидуально, и как говорит любой архитектор: "Зависит от контекста."😅

Но мы можем дать вполне рациональный ответ, если зададим 2 вопроса:

1️⃣ Сколько в проекте строк кода (LOC - Lines Of Code)?
Измерять LOC, придумали еще на заре разработки. Примерно в 70х.
Тогда просто брали сумму всех строк во всех файлах проекта.

Казалось бы что из этого можно сделать?
— А прикиньте есть модель COCOMO1, по которой можно предсказать стоимость проекта, время его разработки и кол-во человек в команду, указав только кол-во строк кода 🤯
Можете поиграться тут. Но я обязательно в будущем про это напишу!


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

Например Wang в Software Engineering Foundations, которого я так часто цитирую предлагает все проекты в которых >5000 LOC считать достаточно сложными (я уже упоминал об этом)

Мне лично этого не достаточно, потому я нашел статью System Design and the Cost of Architectural Complexity, в которой замеряли продуктивность 178 разработчиков на протяжении 8 релизов в проекте размером в 5.5M LOC (почти ядро Linux).) 😱

10x разработчики вообще реальны? (нет) 🤣 Мем из статьи


Из графика на странице 128 (см. картинку к посту) мы можем увидеть, как продуктивность разработчика, на 100% занятого разработкой нового функционала (синяя линия), падает в зависимости от сложности* почти в 2 раза:
6k LOC при 100% сложности и ~11k LOC при 0% сложности**.
* в статье используется Architectural Complexity посчитанная через Design Structure Matrix
**но это только симуляция из регрессионной модели составленной на основе исследования

Или проще говоря, на основе исследования написали симуляцию, чтобы получить краевые значения

Из чего выводы:
🔹 Если программа планируется размером >11к LOC, вам 100% нужно думать насчет архитектуры
🔹 Если программа планируется размером <6k LOC, можно не запариваться
❗️Но помните, вы можете потерять в продуктивности на создании новых фичей до 2 раз, если вовремя не заложите эффективные дизайн и архитектурные решения.

TL;DR цифры разнятся, но значение в 5k LOC предложенное Wang можно считать нижним порогом.

2️⃣ Как долго проект находится в разработке?
Чтобы ответить на второй вопрос просто обратимся к Rational unified process framework'у.
Он предлагает рассматривать разработку любого ПО как итеративный процесс, где каждая итерация идет от 2 до 6 недель.

❗️Дальше не реально будет понять смысл, если не открыть картинку.

Архитектурные и дизайн-решения, исходя из этого framework'а, нужно закладывать на стадии Inception и Elaboration, т.е. в первые 1-3 месяца от старта проекта.
Дальше, уже во время фазы Construction, количество новых решений будет постепенно снижаться.

В целом это очень хорошо согласуется с моим опытом:
На проекте Combat Quest я первые 3 месяца закладывал основу на которой потом 90% времени разрабатывался проект.

Вывод:
🔸 Если проект планируется размером >5k LOC, продумывайте дизайн и архитектуру сразу. Иначе рискуете потерять в продуктивности до 2 раз.
🔸 Если проект стартовал больше полугода назад, нет смысла предлагать новые архитектурные решения. Все решения уже приняты.
Тут сделаю оговорку: амбициозные архитектурные решения. Мелкие улучшения всегда приветствуются.
🔸 Самое лучшее время для продумывания архитектуры — первые 3 месяца от старта проекта.

Фух, это было круто! Я получил дикое удовольствие пока готовил материал и писал эту статью 😊
Весь этот контент в развернутой форме обязательно будет в моем курсе.
В это Воскресенье поделюсь прогрессом и программой!
Включай уведомления чтобы не пропустить 🫡

Сохраняй себе, чтобы не потерять и делись с коллегами 📞
Ставь 👍 если тебе заходит такого рода контент!

#software_engineering@UniArchitect
  • 👍 54
  • 🔥 8
Post #104 3.56K
ВАШ ПОСЛЕДНИЙ КУРС ПО АРХИТЕКТУРЕ Ч.1

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

Например:
▫️Я уже давно не смотрел как что-то сделать на youtube, в гайдах и статьях по разработке.
Потому что я знаю, что код и системы в реальности строятся, структурируются и используются по другому.
▫️ Я правда забыл, когда последний раз писал логику в Awake/Start.
Потому что, как правило, использую отдельные методы, чтобы правильно инициализировать новый объект.

Я лишь этим хочу подчеркнуть мысль:
❗️Чем опытнее ты становишься, тем меньше контента твоего уровня ты можешь найти.

У меня даже есть забавная метрика того, что в процессе изучения вы подобрались к границе знания:
Ссылки на источники, по которым вы пытаетесь перейти, уже недоступны и есть только в web.archive.org 😅


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

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

Сначала я выкристаллизовал для себя цели канала:
🔹Высочайшее качество материала
🔹Экономия времени
🔹Обмен опытом

Дальше я начал читать научные статьи, книги, больше смотреть, искать блоги на тему архитектуры ПО.

Вот несколько наблюдений за все это время:
🔸 Ничтожно мало кто смотрит на архитектуру ПО сейчас с прикладной точки зрения.
Весь материал, что есть, как правило, опирается на опыт.
🔸 Уровень материала плюс-минус застрял на уровне Мартина Фаулера и Роберта Мартина.
А с идей, описанных ими, прошло уже больше 20 лет.
🔸 Архитектура уровня сервисов ушла значительно дальше архитектуры кода.
Контейнеризация и переход облачные сервисы — технологический скачок, который позволил создать множество новых подходов, тогда как организация кода вся +- та же.
🔸 Очень часто мысли оказываются настолько объёмными, что компактно изложить их в тексте не получается.
Но материал есть, и хочется им поделиться.

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

И направить эту любовь в то, что поможет:
🔹Сократить разницу кривых обучения и избежать конфликтов в коллективе
🔹Сэкономить время разработчиков на самостоятельном поиске и структуризации информации

А именно в онлайн-курс по архитектуре Unity-проектов!

Ключевые ценности которого:
🔸Структурированный материал основанный на научных статьях
🔸Доступ к реальному prod проекту — Magic Battle Arena
🔸Не высосанные из пальца примеры

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

Именно поэтому я решил назвать курс "Ваш последний курс по архитектуре".
Потому что он будет охватывать и суммировать все подходы и знания, которые есть на данный момент. 💪

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

Это первый пост, где я рассказал, какие внешние факторы и мысли побудили меня к созданию курса.
На следующей неделе, в воскресенье, я поделюсь текущим прогрессом и планом курса!

Ставь 👍, если тебе заходит такая движуха!

#курс@UniArchitect
  • 👍 118
  • 🤨 9
Post #103 3.46K
ВТОРОЙ ЗАКОН ИНЖЕНЕРНОЙ РАЗРАБОТКИ

Во если неожиданно в баре зайдет разговор по типу: "А вот в чем суть того, чем ты занимаешься?".
Какой ответ вы бы дали на этот вопрос...

В разные периоды своей карьеры я мог ответить по разному:
🔸На самом начале: в написании инструкций, которые автоматизируют работу
🔸Чутка поднабравшись опыта: в создании продукта, которые решает чью-то проблему
🔸Сейчас я бы ответил на него так: в переносе информации о физическом мире в мир абстрактный

Так и представляю этот диалог в реальном мире:
— В чем суть того, чем ты занимаешься?
— Переношу информацию о физическом мире в мир абстрактный
— Харон какой-то...🗿 А суть-то в чем???


Давайте по порядку. Сначала разберемся что такое физический мир:

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

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

🔹Абстрактный мир в свою очередь — это уникальная для каждого человека модель реального мира, образованная путем восприятия им информации.
Где информация играет ключевую роль.

И из всего формируется Второй Закон Инженерной разработки (см. картинку к посту):
Теорема 1.2 утверждает, что естественный мир (NW), который включает всё вокруг нас и является основой для человеческого интеллекта и науки о программном обеспечении, можно понять как состоящий из двух сторон:
— Физический мир (PW): Эта сторона состоит из материи (M) и энергии (E).
— Абстрактный мир (AW): Эта сторона состоит из информации (I).
Эти две стороны существуют параллельно, то есть они связаны, но различны.
Естественный мир (NW) можно рассматривать как сочетание обоих, где определённые функции определяют, как материя, энергия и информация взаимодействуют, чтобы создать физические и абстрактные аспекты нашего мира.
Wang, Software Engineering Foundations, p.11-12


А теперь простым языком:
🔸Физический мир одинаков и однороден для всех
🔸Абстрактный мир индивидуален для каждого
🔸Восприятие естественного мира, из-за его абстрактной части, различно для каждого человека из-за различий в восприятии и ментальных контекстах

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

А теперь прикиньте что из всего многообразия видов разработки, мы еще и разработку игр выбрали.
По сути симуляцию реального мира.
Это как при прохождении игры выбрать сложность, где при смерти героя у тебя форматируется жесткий диск 🤣

Мне чутка не ловко что выдал такую базу базовую 😅
Но мне кажется это важная часть в понимании природы разработки ПО.

Сохраняй себе, чтобы не потерять и делись с коллегами 📞
Ставь 👍 если тебе заходит такого рода контент!

#software_engineering@UniArchitect
  • 🤷‍♂ 17
  • 👍 13
  • 🤮 5
  • 🤯 3
  • 🤔 2
Post #102 8.63K
ПОГРУЖЕНИЕ В ДЕБРИ: REVERSE ENGINEERING

Как войти в IT? - Наверное с книг, видео, курсов с примерами, начинающихся с "Hello World".

Мой вход был через OllyDbg, где я разбирался, как процессор исполняет инструкции.
Скрин выше — фото доски с моими записями 2017 года из цикла видео Как взламывают игры?.
А я тогда даже не слышал что такое ООП и не мог нормально написать ни одну программу.

Я горел этим и по факту начал изучение программирования с ASM!

И на полном серьезе выбирал, буду я Unity Developer или Reverse Engineer.
Но после анализа вакансий на hh, Леша Reverse умер и родился Алексей Unity 🤣
Выжило только неизмеримое желание лезть в самые сложные темы и разбираться в них!

🔻История, где мне это сильно помогло:
На первом моем коммерческом проекте мы делали клон игры Archero.
Для нас было загадкой, как именно там сделана последовательность уровней.

Кто не играл, коротко:
Одна локация включала в себя линейку из 50 уровней.
Каждый 10ый уровень — босс.
Задача — пройти все уровни и открыть следующую локацию. Видео с геймплеем.

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

Тогда я, почувствовав что смогу найти точный ответ, скачал apk игры и через AssetStudio посмотрел какие именно ресурсы лежат внутри.
Мне удалось узнать что:
🔸Каждая вариация уровня - xml файл
🔸На каждый уровень было по 1-50 вариаций.
🔸Каждый элемент карты был записан в матрицу и имел свой номер. Вода, окружение, препятствия, противники и т.п.
🔸Для каждой карты был прописан % усиления противников от базовых параметров.
🔸На старте генерировался seed карты, который определял вариацию уровня.

Дальше я захотел посмотреть код.
Тогда я взял CPP2IL, скормил ему global-metadata.dat внутри apk и получил сигнатуры всех объектов.
Оттуда удалось узнать:
🔹 Какие данные отправляются в аналитику и примерно когда.
🔹 Как структурированы предметы, персонажи, уровни.
🔹 На сколько их архитектура приспособлена к созданию огромного объема контента.

❤️‍🔥 В итоге множество решений мы взяли себе за основу, что значительно сократило время на поиск правильного решения.

Время прошло, а навыки и знания все равно остаются полезными, т.к. иногда нужно:
🔸 Посмотреть или пропатчить внешнюю dll'ку через DnSpy
Так я исправил баг, который не давал EDM4U создать папку в которой есть точка. Подробности тут.
🔸 Убедиться что ошибка точно не на твоей стороне.
Так можно собрать .exe локально, подключиться debugger'ом через Visual Studio к процессу, скачать symbols нужной UnityPlayer.dll отсюда и получить полный stacktrace ошибки на стороне unity.
Дальше можно через Ghidra или IDA Pro можно поставить breakpoint и посмотреть что где именно что-то ломается.
🔸 Написать свой мониторинг утечек памяти через Mono.Cecil
На текущем проекте, из-за того что повсеместно используется EventManager.Instance.(Add/Remove/Raise)Event, начали появляться плавающие баги.
До перерасхода памяти не дошло, но пару дней на отладку у middle разработчика было потрачено.

🔻К чему это я? Часто слышу вопрос:
Где та грань, когда разработчик начинает разбираться в unsafe и низкоуровневых деталях?

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

А эта статья пример, набор инструментов и ресурсов, которые вы можете использовать в реальной работе чтобы упростить себе жизнь!
Если вы хотите погрузится в мир reverse engeneering'а, рекомендую блог создателя IL2CppInspector, а так же Unity Game Hacking Guide

Сохраняй себе, чтобы не потерять и делись с коллегами 📞
Ставь 👍 если тебе заходит такого рода контент!

#проект_в_разработке@UniArchitect
  • 👍 51
  • 🔥 18
Post #96 4.49K
С ПОЛЕЙ РАЗРАБОТКИ: REVERT MERGE COMMIT

Я работаю с git только через консоль.
Мне не нравятся все GUI, которые имеются на рынке. Т.к. часто они плохо решают узкие, сложные кейсы, которые порой возникают.
Текущий пост прекрасный тому пример, ибо через git GUI встроенный в райдер я не смог решить проблему ниже.

Ситуация:
Есть баг, которые вы правите перед релизом. У вас в голове два решения:
🔸 По уму, но дольше и большим объемом регресса.
🔹 Поправить точечно, грязно, но быстро, внедрившись в другую систему.

Конечно как и подобает доблесть, выбираем первый вариант. Делаем фикс, примерно в 3-6 коммитов, проверяем в редакторе, отправляем в QA.

И вроде опыта достаточно, много всего знаешь и проверил все перед заливкой, но:
🔹 На мобилках фикс не работает.
Там другое графическое API, отличное от редактора и там твой баг вообще не исправлен, а наоборот приводит к hard lock'ам из-за неправильной сортировки UI элементов в очереди на отрисовку.

И вот вы с лидом (или как лид) думаете как исправить это.
Изменения расползлись по другим веткам, а с момента вашего merge commit'a уже прошло пару дней.

Надумали два путя:
🔹 Удалить фикс всех веток.
Можно сделать как через rebase всех изменений после ваших изменений, а потом force push'ем обновить все ветки.
Можно ручками сделать cherry-pick, а потом force push'ем обновить все ветки.
🔹Сделать revert merge коммита.

Проблема с первым:
🔸Придется блокировать работу во всех ветках на время отката.
🔸Во время rebase могут возникнуть конфликты из-за которых можно накуролесить на --выходные и ++пара бессонных ночей.

Со вторым проблема в том, что ХЗ как сделать revert целого merge'а.
И ответ совсем не очевидный:
git revert -m 2 или 1 <merge_commit_hash>

С revert понятно, а что за магия с 2 или 1?

Приготовьтесь, инфу про git оч сложно запаковывать компактно 😅

git — это направленный ацикличный граф, ноды которого всегда хранят в себе hash родителя(-ей).
Т.е. каждый git commit -m "the best changes" создает новую ноду в которую записывает hash parent коммита (hash коммита предшествующий текущему) и hash object-tree.

Для простоты понимания git — это два независимых LinkedList'а один - для изменений (object-tree) второй - для коммитов (commit-tree).
Только LinkedList'ы однонаправленные (нету Next) и могут иметь несколько нод (Node<T>[] Previous).

Это значит:
🔸 Все коммиты в ветке однонаправленно связаны с самым первым Initial commit.
Т.е. из любого коммита в ветке можно дойти до самого начала графа.
🔸 Каждый коммит, без указания parent'а, как нода из LinkedList'а, Previous которой равен null.
Угадайте как их можно удалить? 🙃
🔸 Эта структура отлично подходит для добавления/изменения/удаления.
С поиском сложнее, но благодаря сортировке префиксов по алфавиту (см. папку objects), используется бинарный поиск.

С устройством разобрались. Дальше порядок работы merge:
1️⃣ Находим общий коммит.
Просто идем по графу, пока parent'ы не совпадут.
2️⃣ Ищем diff от общего коммита до последних коммитов в двух ветках.
3️⃣ Полученный diff пишем в merge-commit.
4️⃣ В parent у merge-commit'a прописываем последниE коммитЫ из двух веток.
Т.е. merge-commit, в отличии от обычного имеет 2 parent'а.

Это фактически значит:
🔻git merge не меняет родителей у существующих коммитов (в отличие от rebase), а создает новый, с ссылками на 2 последних коммита в ветках.

А revert-commit может иметь лишь один parent.

Значит, чтобы сделать все правильно, нужно указать изменения какого именного из parent'ов мы хотим revert'нуть.
Или по другому: diff какой из ветки мы должны revert'нуть

За это как раз и отвечает магическое 1 или 2 — номер parent'а, изменения которого мы хотим revert'нуть.

Лично у меня случилось 2 озарения:
🔶 Именно merge-commit несет в себе все изменения.
Revert'нули его == revert'нули изменения всех коммитов.
🔶 Все, rebase, cherry-pick есть маленькая merge операция. А не наоборот.
До этого я думал что merge - аналог rebase 🤯

Но помните, вы этим самым, вы делаете revert изменений, не истории.

Ставь 👍 если такая движуха тебе по кайфу!

Источники:
Ответ с SO
Статья раз
Статья два

#будни@UniArchitect
  • 👍 33
  • 🔥 6
Post #94 4.18K
ЦЕЛЬ

Каналу стукнул год ❤️‍🔥

Много всего получилось сделать за это время:
— 90+⭐️ Шаблон пустого проекта с архитектурой, которую я стараюсь использовать на всех своих проектах
— ~50⭐️ Плагин для миграции json файлов
— 2 статьи на хабр:
- Архитектура unity проектов
- Миграция json файлов
— Написать несколько полезных welcome статей в другие каналы:
- Полиморфизм системы
- UnityEngine.Object == null
- Архитектура и рендер
— Посетить DevGAMM Lisbon
— Помочь найти работу одному крутому senior'у 😎
— Набрать 1400 крутых, активных подписчиков

В общей сложности я написал около 50 содержательных постов, где постарался поделиться своим опытом и подходом к архитектуре.
Не стесняйтесь пользоваться навигацией, за год было куча всего, что вы могли пропустить 😉

За такой большой промежуток времени сложно быть последовательным если нет принципов по которым ты пишешь статьи.
Я для себя сформулировал их так:
🔸 Удобство чтения
Каждая мысль отделена отступом, каждые важный пункт выделен
🔸 Экономия времени читателя
Статьи должны экономить время, давая максимальную пользу.
Выводы должны быть однозначны и соответствовать выводам из источника.
🔸 Качество важнее времени
Не пытаться выдавить контент в какой-то срок.
Писать по кайфу, когда есть силы и желание. И не важно сколько времени прошло с последнего поста.

Я не планирую заканчивать работать над блогом, а наоборот, хочу его развивать.
Моя цель:
🔻 Создать единое место откуда разработчики с 1+ год коммерческого опыта работы с unity смогут найти всю информацию касательно сложных технических нюансов при работе с unity.

Все мы в знаем о таких блогах как: Catlike Coding, JacksonDunstan, Alan Zucconi
Я как самоучка вычитал все эти блоги вдоль и поперек.
И как никто другой хочу не только брать, но и отдавать.

Потому за следующий год я планирую:
🔹 Запустить сайт-блог
🔹 Объединить идею качественных статей с качественными курсами
🔹 Полученные ресурсы использовать, для того чтобы писать статьи, видео, которые будут экономить время на самостоятельное погружение в узкие и сложные темы

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

Так что это только начало, человек я амбициозный и терпеливый.
Уверен что все получится 💪

Спасибо каждому за то что остаетесь со мной 🥰

Ставь 👍 тебе по кайфу такая движуха!

@UniArchitect
  • 👍 79
  • 🔥 22
Post #93 4.18K
ИНКАПСУЛЯЦИЯ

Кажется, у нас есть еще один претендент на звание "лучший повод развести холивар".

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

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

Инкапсуляция. Давайте просто посмотрим на определения:
🔹 Русскоязычная википедия.
процесс разделения элементов абстракций, определяющих её структуру (данные) и поведение (методы)

🔷 Англоязычная википедия.
объединение объекта и его метода с данными

🔹 Другой ресурс, тоже вики, специализирующийся на разработке ПО.
процесс объединения элементов для создания нового объекта


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

🔸 Мартин Фаулер
Это говорит о том, что поля объекта не должны быть общедоступными, вместо этого весь доступ извне объекта должен осуществляться через методы доступа.

🔸 Bertrand Meyer в книге Object-Oriented Software Construction вообще говорит что это синоним Information Hiding

Не обязательно ходить по всем перечисленным источникам. Я лишь хочу подсветить проблему:
🔻У нас НЕТ нормального/единого определения такого базового термина как инкапсуляция!

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

Изучая, пробираясь через весь этот ворох, для себя я сделал пару выводы:
1️⃣ Каждый раз при упоминании данного термина, желательно уточнить у другого человека, что он имеет в виду.
2️⃣ Каждый раз, видя это термин в книге/статье, подбирать подходящее определение и пытаться понять, что хотел сказать автор 🤬
3️⃣ Я перестану употреблять этот термин. Чтобы не вводить никого в заблуждение.

Вместо него просто буду использовать синонимы, которые отлично отражают суть:
🔸 Модификаторы доступа, интерфейс, абстракция: в случае если хочу сказать про сокрытие/ограничение доступа
🔸 Представление объекта в памяти, виртуальная таблица, объединение методов и данных: для случаев, когда захочу описать особенности ОО языка

Ну и если я могу дать рекомендацию:
🔻 Держите в голове суть беседы, обсуждения, разговора, а не корректность терминов, когда говорите о разработке.

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

Ставьте 👍 если заходит подобного рода контент!

#аббревиатуры@UniArchitect
  • 👍 26
  • 🤔 1
Post #92 3.8K
ПОЛИМОРФИЗМ СИСТЕМЫ

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

Давайте представим. У вас есть любой язык программирования. Что вы на нем НЕ сможете написать?

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

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

🔹Давайте порассуждаем глобально, без привязки к языку/платформе.
Для простоты возьмем самую примитивную задачу: "Вывод Hello World на экран".
Сколько вариантов решений вам приходит в голову?
Мне из-за проклятия знаний даже сложно представить, сколько их. Потому мой ответ: а какие ограничения?

🔸Этим всем. Я подвожу к мысли:
У любой задачи несколько решений. И мы, анализируя внешние факторы и время, склонны выбирать наиболее эффективное в данный момент.

Назовем это полем решений S (solutions).

🔸Любое решение можно проектировать по разному. При том вариантов дизайна может быть сколько угодно.
Назовем это поле вариантов дизайна D (design).

Например:
— Под каждый char заведем свой класс. Сделаем fluent builder, который будет собирать нашу строку посимвольно.

🔸Ну и наконец у каждого решения есть поле реализаций (имплементаций). То как эта задача может быть фактически написана.
Назовем это — I (Implementation).

Пример:
— Каждый char представим в виде ASCII кода, запишем в массив и при выводе сконвертируем коды в символы.
— Или напишем свой рендер символов в консоли

🔻Отсюда 1ый принцип инженерной разработки:
Каждая задача имеет поле возможных решений, которое является произведением поля возможных реализаций и поля возможных дизайнов.
-
Wang, Software Engineering Foundations, p.33, Theorem 1.6


В виде формулы это будет выглядеть так: S = D * I

Это подводит к вопросу, а насколько велики D, I и S?
— Много велики. Потому что (D * I) -> ∞.
А на поле решений влияют многие факторы, такие как:
— Выбранный ЯП.
— Code style.
— Модели данных.
— Маршалинг объектов в память.
Любое изменение будет приводить к другой(-му) реализации/дизайну решения.

🔻Из этого следует очень важный вывод, от которого болит у всех:
Трудно технически и/или экономически доказать что программа имеет единственно верное рациональное решение в поле возможных решений.
Это более известно как: не существует единственно верного решения
-
Wang, Software Engineering Foundations, p.33, Corollary 1.4


Это одно из фундаментальных ограничений, с которым мы имеем дело каждый день. А называется оно — полиморфизм системы.
И ограничение это когнитивное, т.к. завязано на фундаментальное ограничение человеческого мозга (про ПРОДУКТИВНОСТЬ я уже писал)

🔸Ну и, говоря простым языком:
— Любые споры, распри, негативные эмоции из-за вариантов решения не имеют смысла на фундаментальном уровне. Т.к. любая сторона не сможет доказать однозначное преимущество одного решения над другим.

Вы знаете, кому отправить этот пост 🛞

Ставь 👍 если тебе нравится такая движуха

Ссылка на цитируемую книгу

#software_engineering@UniArchitect
  • 👍 34
  • 🔥 3
Post #91 3.35K
👀🗑Сборка мусора в Unity? Путь GC.Collect().

Давайте проследим некоторый путь. Путь GC.Collect(). Но сначала.
Что такое GC.Collect()? Это принудительный вызов сборки мусора.

Во что превращается GC.Collect? Ведь мы знаем, что Unity использует другой сборщик, который называется Boehm GC, а следовательно GC.Collect должен во что-то транслироваться.
Чтобы ответить на этот вопрос, нужно проследить путь преобразования кода.

1️⃣ Давайте напишем простой класс (Убираю лишние переносы в целях экономии места в посте; Длинные имена, сокращены для простоты чтения ):
public class Minutri : MonoBehaviour {
private void Start() {
GC.Collect();
GC.Collect(2, GCCollectionMode.Forced);
}
}

Два разных вызова — чтобы посмотреть, куда уходит двойка, а куда GCCollectionMode.Forced. GC.Collect(2, GCCollectionMode.Forced) говорит о том, что нужно вызвать сборку вплоть до второго поколения с forced. Но не забываем — мы работаем с Boehm GC. Поэтому про работу с поколениями не может идти речи. Как же получается? Написать так можно — а поколений нет. Смотрите далее)

2️⃣ После трансляции IL2CPP находим метод Start класса Minutri. Называется он у меня Minutri_Start_...

3️⃣ В Assembly-CSharp.cpp наблюдаю, во что превратился метод:
void Minutri_Start_ (Minutri_t* __this, ) {
static bool s_Il2CppMethodInitialized; // <------ а
GC_Collect_m(NULL); // <------ б
GC_Collect_m(2, 1, NULL);
return;

Интересовать нас может сразу два пункта:
а) Видим использование static bool. Напоминаю — это медленно.
б) Оба метода GC_Collect раскрылись, мы их наблюдаем, и они похожи.

4️⃣ Идем глубже, в методы GC_Collect_m...
void GC_Collect_m() {
static bool s_Il2CppMethodInitialized;
L_0 = GC_get_MaxGeneration_m(NULL);
GC_InternalCollect_m(L_0, NULL);
}

а) Опять static bool.
б) Воу 🤨 Все-таки получаем максимальное поколение. Получается, я вам врал! Какой ужас. (нет)
в) Вызываем GC_InternalCollect_m и передаем туда "максимальное поколение".

Давайте я вам помогу, и мы не будем заходить в GC_get_MaxGeneration_m. Он возвращает ноль. Но это и неважно. Сейчас все увидите.

5️⃣ Зайдем глубже, в GC_InternalCollect_m. Мы видим метод. Там опять нам всё не нужно, кроме одной строки:
(()mscorlib::System::GC::InternalCollect) (___0_generation);

Заходим в InternalCollect. Далее в Collect(generation)

6️⃣ Ну что ж. Мы пришли, поздравляю!) Метод Collect перед вами целиком:
void il2cpp::gc::GarbageCollector::Collect(int maxGeneration) {
#if IL2CPP_ENABLE_DEFERRED_GC
if (GC_is_disabled())
s_PendingGC = true;
#endif
GC_gcollect();
}


Тут, как мы видим, всё: последнее упоминание поколений. Глубже мы не пойдем.
Вы видите, чтобы maxGeneration параметр где-то использовался? Вот и я не вижу.
Зачем они так сделали? Вероятней всего для того, чтобы в случае использования другого GC можно было быстро перейти на поколения.

Так, а что у нас с GC.Collect(2, GCCollectionMode.Forced)?
Там пойдут goto и прочие вещи, которые здесь не буду рассматривать, так как не хватит места в посте. Но, короче говоря: в нем будет вызов этого же Collect из пункта 6️⃣. То есть, что бы мы ни указывали в аргументы GC.Collect — это не имеет значения.

Резюмируем:
— GC в .NET C# поколенческий, в Unity - нет
— Вызов сборки мусора конкретного поколения вызывает сборку мусора в целом
— Перегрузки GC.Collect, при настройке билда в IL2CPP не влияют на перформанс и ничего не ломают

P.S. Может быть я был не прав, и мы посмотрели что-то неверно? Давайте, как люди, которые хотят докопаться до сути, обратимся к первоисточнику, и посмотрим на ответ Josh Peterson'а. В ходе диалога, я задал вопрос о том, используют ли юнитеки поколения в Boehm? Был дан ответ:
"Currently Unity does not use the generational GC in Boehm. I suspect that we might be able to use it, but we don't have any active plans to enable that for now".


Анализ трансляции GC.Collect подготовлен специально для @UniArchitect

Об устройстве GC в Unity, о IL2CPP, CI/CD и не только я пишу в своем авторском telegram канале. Подпишись!🔥
  • 👍 36
  • 💯 3
Post #90 6.36K
МЫ ИНЖЕНЕРЫ, НЕ ХУДОЖНИКИ

🔹 Разработка ПО не имеет теоретической базы, как математика например
🔹 Разработка ПО это не инженерная дисциплина, скорее творческая, как живопись
🔹 Каждый может программировать. Дети иногда даже лучше чем взрослые
🔹 Каждый кто смог вывести в консоль "Hello World" может быть уверен в том, что он/она программист

Каждый кто согласен хоть с одним утверждением выше, скорее всего не имел дело с достаточно объемными программами (проектами) от 5000 до 10000 строк (LOC - Lines Of Code) в размере.
Это эквивалентно книге в которой 100 страниц это код на ЯП высокого уровня и документацией.
И это лишь минимальный порог, когда мы можем считать программу достаточно сложной.
Wang, Software Engineering Foundations, p.13


Средняя игра на soft launch этапе, примерно с неделей геймплея имеет размер около 60-100к строк кода.

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

Работа в таких проектах без стандартов, систем, принципов, передовых практик просто не возможна.
Потому что ведет к неуправляемому росту сложности и как следствие — к невозможности контролировать сроки. А это 40% почему проекты терпят неудачу.

Инженеры же, согласно IEEE/ACM:
🔸 Выполняют задачу, тщательно оценивая варианты, выбирая нужные подход и инструменты реализации
🔸 Делают измерения, итерируют и калибруют результаты, подтверждая правильность своих предположений
🔸 Уделяют особое внимание упорядочиванию (формализации) процесса
🔸 Создают принципы, стандарты и передовые практики и используют их

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

Отсюда выводы:
🔹 Разработка ПО — инженерная дисциплина, а разработчики ПО инженеры, не художники 😅
🔹 Заблуждение выше возникло из-за непонимания того, что делает и какие проблемы решает программист
🔹 Потенциальное решение проблем при разработке может лежать в плоскости других инженерных дисциплин

И есть раздел, рассматривающий разработку ПО как инженерную дисциплину:
Software engineering (SE) — инженерная дисциплина, которая изучает природу ПО, подходы и методологии крупной разработки, а так же теории и законы, лежащие в основе поведения ПО и практики разработки ПО.
Wang, Software Engineering Foundations, p.23, definition 1.6

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

Ставь 👍 если тебе нравится такая движуха

#software_engineering@UniArchitect
  • 👍 91
  • 🤨 1
Post #88 4.61K
РЕЛИЗ FastMigrations.Json.Net

10 месяцев назад я написал пост про версионирование приложения:
ВЕРСИОНИРОВАНИЕ Ч.1
ВЕРСИОНИРОВАНИЕ Ч.2

И во второй части я пообещал переписать один уже давно не поддерживаемый плагин.
Сделать его лучше, быстрее, сильнее 🤣

Многие из вас следили за разработкой в режиме реального времени у меня на стримах
👉Ссылка на плейлист👈
(есть субтитры на английском, так что смело закидывайте европейским коллегам 😅)

По итогу, слово сдержал, пользуйтесь на здоровье ❤️
https://github.com/vangogih/FastMigrations.Json.Net
Жмакайте на ⭐️, чтобы не потерять!
Версия 1.0.3 — production ready, можно смело внедрять к себе в проекты 💪

🔻Что изменилось за кадром:
🔸 Сделал CI на github actions, который прогоняет тесты на 5 версиях unity
🔸 Для тестов включил вычисление test coverage и задеплоил результаты на github pages
Кликните на бейджик Coverage, чтобы понять о чем это я 😜
🔸 Сделал отдельную сборку для benchmark'а
Просто чтобы понимать на сколько быстрее. Так-то в 5-7 раз!
🔸 Сгенерил через всемогущий ИИ иконку
Вот оно где будущее, когда прогеры могут нормальный логотипы для своих плагинов делать😂
🔸 Опубликовал плагин в nuget и openupm
🔸 Написал и оформил лучшее readme в своей жизни 🥺

Достаточно много осталось за кадром, но поверьте, по большей части там была монотонная работа, где я 95% залипал в документацию.
Ибо с github actions, pages я работал впервые

🔻Что я лично для себя понял про подобного формата работу:
🔹 Нужно иметь выдержку и самодисциплину
Честно, если бы я не пообещал и не начал всю эту активность со стримами, мне было бы сложно сохранить достаточный уровень мотивации чтобы закончить работу над плагином
🔹 Качественная упаковка open source плагина занимает около 50% времени от самой реализации
Я понимаю что плагин не большой, всего 400 строк кода, но я явно недооценил сколько времени уйдет на оформление, CI/CD и документацию
🔹 Дисциплина кода, коммитов, архитектура даже для маленьких проектов важна
Иначе чтобы сделать нормальный CI/CD без боли, придется перелопатить половину проекта

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

А до этого момента продолжу делиться инсайтами по разработке и архитектуре unity проектов!

Всем огромное спасибо, без вас этого плагина не было бы 😘

Кстати, в репозитории есть открытые Issue, ошибки в readme и xml-doc'ах
Не стесняйтесь внести свой вклад и стать contributor'ом 🫡

@UniArchitect
  • 🔥 38
  • 👍 3
Post #81 4.27K
СТРИМ

Неожиданный пятничный, рабочий стрим!

Я оч сильно закопался с плагином по миграциям и решил сделать из него конфетку.

Я уже успел:
🔸Ускорить его в несколько раз
🔸Сделать устойчивым для работы в многопотоке
🔸Написать бенчмарк и сравнить с аналогом
🔸Написать github actions, которые:
1️⃣ Запускают dotnet тесты
2️⃣ Запускают unity тесты на 5 LTS версиях
3️⃣ Пушат результаты покрытия тестов с метриками в github pages

Мне правда хочется всеми деталями с вами поделиться и вместе дописать этот плагин.
Но при этом не хочется подрубать стрим на youtube.

Потому, через 20 минут подключайтесь прямо в телеге на стрим!
В отличии от стрима на youtube тут можно будет подключиться поболтать!

Планы на стрим:
🔸Рассказать о всех улучшениях
🔸Рассказать про github actions что уже написаны
🔸Исправить ошибку деплоя результатов покрытия тестами
🔸Написать release пайплайн с генерацией .unitypackage, пушем nuget и npm пакетов и проставлением версии

p.s. я в github actions и yaml файлы пишу впервые, потому оч сильно туплю местами)

p.s.p.s. стрим в телеге - эксперимент, пойти не так может все что угодно!
Но и пофигу, Пятница, расслабляемся)

@UniArchitect
GitHub GitHub - vangogih/FastMigrations.Json.Net: The extra fast, minimum code size, unity compatible plugin for json files migrations… The extra fast, minimum code size, unity compatible plugin for json files migrations using Newtonsoft Json.Net. - vangogih/FastMigrations.Json.Net
  • 🔥 13
  • 👍 2
Post #80
Live stream scheduled for Mar 29, 2024 at 13:00
Post #79 4.49K
ПРИЧИНА И СЛЕДСТВИЕ

Я уже упоминал в своей истории что я самоучка.

Несколько фактов:
— У меня никогда не было наставника/коуча. Ток друг из интерпрайза, с которым можно перетереть за ITшку.
— Я всегда был вне IT тусовок.
Только хакатоны на начале карьеры, но знакомств результативных я оттуда не выносил
— С 2015 года всю информацию я черпаю только из книг, интернета и анализа реального опыта

За 9 лет пришлось переработать огромное кол-во информации.Обособиться, сформировать свое видение:
❕Cамообразование это игра в долгую. Это как бежать ультра-марафон. Нужно всегда помнить зачем, почему ты это делаешь.

И когда ты долго над чем-то одним работаешь, без целей никуда, потому я начинал с такого:
🔸 Мне нужно обогнать среднестатистического выпускника ВУЗа — нужно найти работу
🔸 Нужно получить исчерпывающий ответ на вопрос: "Как создаются игры в реальности?" — нужно руководить разработкой проекта
🔸 Для максимально быстрого роста, нужно забраться туда, где мне дадут больше, чем я способен унести — стать lead'ом, когда по факту middle

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

При том для меня было важно:
🔹 Никаких подработок и распылений
🔹 Быть уверенным в том, что мои знания/навыки нужны и я не потрачу N лет впустую
🔹 Нужно получать максимально качественные знания

Долго анализируя то, что есть в информационном пространстве, я заметил такие особенности:
🔸Информации много, но качество низкое
🔸Даже если есть качественная информация, чаще всего ее сложно перепроверить самому
🔸Когда информацию можно проверить, часто она расходится

И по опыту изучения и осознания такого объема информации за 9 лет я сформировал главный, краеугольный принцип для себя:
🔻 Избегать следствия и работать только с причиной.

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

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

Этот принцип лежит и в основе этого блога.

Например посты:
▫️Когнитивная сложность ч.1
▫️Когнитивная сложность ч.2
▫️Проклятие знаний
▫️Продуктивность

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

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

Это всю эту информацию планирую сформировать в качественные стримы и курсы для людей, кто уже не вращает кубы 😬

Чтобы у всех у нас была качественная основа для принятия решений на реальных проектах.
Win-win так сказать 😊

Ставь 👍 если разделяешь и ценишь такой подход

Или может я совсем загнался и надумал все себе, напишите в комменты 📞

#моя_история@UniArchitect
  • 👍 70
  • 🔥 6
Post #76 4.68K
ПРОДУКТИВНОСТЬ

Есть отдельный фетиш у программистов - фокусировка на личной продуктивности.

Например:
— Запоминаем все hotkey'и в IDE или переходим на vim
— Набираем вслепую 400 символов в минуту, перешли с qwerty на colemak даже
— Настраиваем систему под себя, не используем мышку

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

Или проще говоря, мы склонны полагать:
John Carmack крутой, потому что он гений, а все гении продуктивны.
Но не то, что он работал вместе с John Romero, а начало его карьеры пришлось на рассвет ПК 😬


Личная продуктивность слабо влияет на разработку и для этого есть несколько фундаментальных причин.

По выводам из когнитивной информатики (данный раздел науки отвечает за изучение связи разработки и работы мозга):

1️⃣ Продуктивность ограничена физиологическим ограничением на скорость роста синаптических связей в мозге.
2️⃣ Прежде чем любая программа будет реализована, мы должны создать абстрактную модель у себя в голове.
3️⃣ Скорость создания абстрактной модели зависит от сложности, абстрактности, имеющихся знаний и опыта и индивидуальной особенности работы мозга.

Цитата:
Conservative productivity states that software productivity is physiologically constrained by the growing speed of synaptic connections inside the brain, because before any creative artifact is generated externally, it must be created and represented physiologically inside the brain by the synaptic connections.
Software Engineering Foundations, p37, 1.3.3.2, Yingxu Wang, 2017


Отсюда следствие:
❗️ Очень сложно значительно увеличить производительность программистов при разработке ПО, без использования средств для автоматическое генерации кода
🔹 Продуктивность разработки это совокупность когнитивной, организационных и ресурсных ограничений

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

Вы знаете, кому отправить этот пост 🛞

Ставьте 👍 если заходит подобного рода контент!

#проект_в_разработке@UniArchitect #software_engineering@UniArchitect
  • 👍 41
  • 🔥 7
  • 🤔 4
Post #75 3.4K
ПРОКЛЯТИЕ ЗНАНИЙ

"Ну и говнокод, я бы сделал по другому!"

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

Так же как и матерый профессор в универе забывает с какими трудностями сталкивается студент при обучении.
Тем самым подавая материал с позиции "Ну это же очевидно"

Так же и "нам очевидно" какую задачу мы ставим себе в to-do list в Январе.
И не очевидно, когда мы возвращаемся к этой задаче через N месяцев.

🔺Все эти примеры к тому что это часть одного и того же явления, описанное и исследованное еще в 1989 году.

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

Нам сложно понять какие задачи мы занесли в to-do list, потому что мы менее информированы сейчас, чем в прошлом.

Нам сложно понять примеры профессора в универе будучи студентом. Или senior'a, будучи junior'ом.
Потому что объем знаний и опыта на их стороне. Они могут рассуждать, рассказывать о проблемах используя более высокий уровень абстракции и обширный словарный запас

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

При работе это может приводить к:
🔸Чрезмерному усложнению/графоманству при написании документации
🔸Бесполезными комментариям в коде и сложным названиям файлов/папок и классов HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor
🔸Уровень абстракции может быть слишком высокий
🔸Реализация/архитектура может быть переусложнена

И что самое интересное, что откликается во мне и на что я не обращал внимание:
🔻 Любой эксперт в своей инженерной области склонен усложнять систему в поисках доказательств своих знаний.
Т.е. мы заведомо экспериментируем, делаем системы сложнее, описываем документацию наиболее подробно, чтобы подтвердить, закрепить свои знания.

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

Из этого вывод:
❌ Не будьте авгуром, не утилизируйте свою сноровку в соображения о своем профессионализме 🤣
✅ Используйте свои профессиональные навыки и насмотренность для упрощения, не усложнения

Пара простых рекомендаций к практике:
🔹Простота документации важнее ее исчерпанности
🔹Простота понимания кода важнее абстракций и "масштабируемости"
🔹Суть и понимание диалога важнее используемых терминов

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

Я стараюсь писать свои статьи максимально просто, используя и перерабатывая сложную базу.
Дайте обратную связь в комментах ❤️‍🔥:
— Прокляты ли мои статьи?
— Сложно ли это читать/воспринимать?
— Удается ли мне выдерживать баланс между сложностью и интересом? Насколько для вас это важно?

Ставьте 👍 если такой контент заходит

#проект_в_разработке@UniArchitect
  • 👍 73
  • 🤔 1
Post #74 3.29K
ПРОТИВ ВЫГОРАНИЯ

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

После случился Silverfox, а там и переезд в Испанию.
В общем не до отдыха было.
Только стресс, только хардкор

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

Я фанат лыж, с 4 лет на них стою.
Родился я рядом с Шерегешем (Геш) и застал еще времена, когда там не было даже зеленой креселки (шории), а была только пара бугелей до самой вершины основного спуска.

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

Даже забавная история есть:
Январь, Вторник, на улице -33
Звоним в школу, говорят не приходить
Не долго думая, батя говорит:
— А давай в Аквилон (когда-то любимая гостиница в Геше) звякнем, спросим скок там? Если меньше чем дома, поедем покатаем!
... через 5 минут
— Лех, погнали греться, в Геше всего -17 🤣
И вот, с чувством что мы наебали систему мы довольные поехали 😎
Но на подъезде мы почуяли что неладное.
Градусник на всем маршруте выше -30 не понимался

Заехав в поселок мы увидели заветные -35 😐
Расстроившись мы с батей просто поехали домой

Ага, напугали ежа голой жопой сибиряка морозом, так и катали в 2 подштанниках, двух кофтах, замазаные звездочкой в -30 вдвоем на всей горе 😜
Работали ток бугели и Шория 🫡


У меня есть пост про выгорание.
Я и сам 2 раза выгорал.

Но в этом году я хочу отдыхать каждые 2-3 месяца по 5-10 рабочих дней.
С учетом выходных этого в аккурат хватает чтобы успеть переключиться и отдохнуть.

Это мой work-life balance.
Мне проще работать какое-то время на около максимальной продуктивности, а потом переключаться и с экстримом отдыхать.

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

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

А если вдруг кто с 24 по 1ое в Гудаури, пишите в личку, встретимся, покатаем, тяпнем по пивку, обсудим архитектуру ПО 😊

Ставь 👍 если душные посты про работу, стримы и архитектуру стоит разбавлять личными историями

Го пофлудим про отпуск и кто как отдыхает, жду в комментах)

#моя_история@UniArchitect
  • 👍 40
  • 🔥 7
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →