10000 GitHub - gordienkodev/interviewQuestions: Unity, C#
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

gordienkodev/interviewQuestions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

93 Commits
 
 
 
 
 
 
 
 

Repository files navigation

interviewQuestions

  • Unity, C#

GIT система управления версиями

Например один из разработчиков создает проект со структурой каталогов (git push с локального на удаленный репозиторий) и потом каждый из разработчиков клонирует проект к себе, создает новую ветку, переключается на нее и коммитит в нее. Если это программист и дизайнер - программист периодически fetch(забрать) изменения и все ветки и потом merge(объединяет) их себе в проект устраняя конфликты. Чтобы увидеть работу программиста, художник забирает изменения и мерджит их dev в art ветку например. git pull - комбинация команд git fetch и git merge

Чем отличается merge от rebase?

merge объединяет две или более историй разработки rebase сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку. rebase перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую.

Несколько хороших примеров когда какой паттерн использовать

Observer (Наблюдатель)

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

паттерн Фасад FACADE?

интерфейс к сложной системе классов Например у нас есть объект Character с реализованными классами HP, TakeDamage, Attack, Death, Move и т.д. Мы сделаем отдельный класс Character в виде обертки функционала над всех логикой нашего Character'а, где будем иметь доступ к методам, свойствам и событиям классов Character'а.

Паттерн Visitor Посетитель

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

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

• Понимание TPL, Async, Unity UI, Component System, Addressables, NetWorking, Message Bus умение оценивать алгоритмическую сложность базовые знания о сетевом взаимодействии (сокеты)

+Собеседование C# Junior developer

C# CLR среда, Garbidge Collector как работает(событие подписать, отписаться, утечка памяти)

-Что вы знаете о Garbage collector'e ?

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

-Что такое массив?

Массив представляет набор однотипных данных

Зубчатый массив – это такой, длина второго и последующих измерений которого может быть различной. Проще говоря, это массив, состоящий из массивов одного типа, но разной длины. Также его называют ступенчатым. int[][] myArr = new int[4][]; myArr[0] = new int[4]; myArr[1] = new int[6]; myArr[2] = new int[3]; myArr[3] = new int[4];

-Что такое типы данных?

Если есть тип Т и переменная x типа Т, то это означало, что переменная может принимать значения из множества, заданного типом, и к ней применимы операции, разрешенные типом.

-какие бывают?

-Типы-значения ( value ), или значимые типы. -Ссылочные ( reference ). -Указатели ( pointer ). -Тип void.

К значимым типам относятся: логический, арифметический, структуры, перечисление. Массивы, строки и классы относятся к ссылочным типам.

какие бывают структуры данных?

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

Ссылочные и значимые типы разница?

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

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

Динамический массив, List (обертка над обычным массивом) в чем разница? За счет чего в List можно легко добавлять данные?

Что такое ООП? Основные Столпы?

  • Инкапсуляция

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

  • Пример инкапсуляции?

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

Пример в Unity Player имеет методы Движение, ПоворотВлево, ПоворотВправо. Поля Скорость и Направление, мы можем задать отрицательную скорость или направить Player под землю. Как защитить от неправильного изменения? Закрыть полностью Направление, Закроем поле для редактирования и сделаем доступным для инспектора [SerializeField]. Метод OnValidate вызывается когда мы в редакторе меняем состояние объекта(поля) и при компиляции. Внутри него если скокрость меньше нуля, то ставим ее равной нулю.

  • Наследование

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

  • Пример наследования

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

Пример в Unity Есть Класс для генерации лута. Поля "шанс выпода оружия", "шанс выпода брони". У него есть метод возвращающий случайный предмет. Используя класс Генерация лута, мы сделаем класс наследник сундук, у которого будет выпадение предмата и например метод открытия сундука.

Полиморфизм (полиморфизм подтипов) - паттерн стратегия и шаблонный метод - объясняет что и зачем нужно

Возможность использовать классы потомки в том же контексте что и базовый класс.

  • Пример полиморфизма?

Если у нас есть класс Машина и он имеет метод Управлять. У нас есть класс Человек и у него есть тоже метод Управлять, который принимает объект класса Машина, и у этого объекта мы вызываем метод Управлять. Мы можем добавить наследника Спортивная машина, в базовом классе метод Управлять мы сделаем виртуальным virtual и в классе наследнике добавим override метод Управлять, где мы реализуем возможность управления спортивной машиной. И в зависимости от того какой класс мы передадим человеку в методе Управления, реализуется логика - для обычный или спортивной машины. При этом мы никаким образом не меняем класс Человека в этом и заключается суть полиморфизма.

  • Чем отличается класс от абстрактного класса?
  • Абстрактный класс? зачем нужны?

Абстрактный класс это некая идея, описание контракта с возможной частичной реализацией в наследниках класса. Нечто абстрактное которое должно делать что-то разными способами. В абстрактном классе можно указать астрактный метод без реализации. Так же можно указать конкретную реализацию - метод. Все наследуемые классы могут использовать этот метод. Другой класс в методах может использовать в качестве параметра объект типа нашего абстрактного класса, тогда любой объект который унаследован из астрактного класса может передаваться в качестве параметра. Наследники обязаны реализовать метод от абстрактного класса(override - для переопределения абстрактного метода).

  • Интерфейс? зачем нужны? С помощью интерфейсов мы определяем поведение(сигнатура метода) которое будет реализовано в каком-то классе. Интерфейсы позволяют реализовать множественное наследование, они наследуются между собой или один класс может наследовать несколько интерфейсов. Говорят: Класс реализует интерфейс. В интерфейсе не может быть конструкторов, не может содержать поля. Модификаторы доступа для методов и интерфейса всегда public, не указываются - публичный контракт.

Делегаты и события? в чем разница?

Делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения. т.е. Делегат описывает что метод будет принимать, что возвращать. События объявляются через указания типа делегата(сначала указывается делегат, потом событие с типом этого делегата).

  1. При подписке на делегат, у нас создается новый объект делегата, который получает методы старой копии и новый метод. При подписке и отписке на эвенты у нас вызываются методы add и remove(по аналогии со свойствами get и set).
  2. Мы не можем объявить делегат в интерфейсе, в отличие от событий.
  3. Мы не можем вызывать или очистить подписчиков эвента за пределами класса. Делегат мы можем вызывать и изменять за пределами класса. Любой класс может вызывать или очищать подписчиков.

Подписка методов на события?

Когда вызывается статический конструктор?

Что такое Linq?

оператор using?

как реализовывать правильно интерфейсы в структурах?

зачем нужен и для чего используется паттерн состояние? паттерн обсервер (событие) и медиатор?

Unity Junior Developer - Требования к кандидатам

Как работают функции Awake/Start?

  • В чем разница между Awake и Start?

Awake вызывается перед Start, а Start вызывается перед РЕНДЕРИНГОМ кадра для инициализируемого GameObject

Как работает функция Update? Для чего предназначен класс Transform? Для чего предназначен класс GameObject? Как создать/удалить GameObject на сцене через код? Как можно переместить объект в игре с помощью скрипта?

-В чем разница в скриптах между Image и Sprite?

Image это элемент управления изображением, а спрайт это отображаемое изображение. Image Displays a Sprite for the UI System.

Как сделать так чтобы объект не удалился при переходе из одной сцены в другу?

  • Для чего нужен тег [SerializeField]?

Для того чтобы сделать поле доступным из инспектора

Принципы ООП и зачем они нужны в геймдеве?

наследование разница между классом и объектом какое преимущество дают принципы ООП для чего нужны статические классы и как используются Паттерн Одиночка - как работают, написать код для объяснения Паттерн Абстрактная фабрика - как работают, написать код для объяснения

Фотошоп мелкие задачи, чтобы не дергать дизайнера

Вопросы на собеседование unity junior developer

C

  • Основные принципы ООП?

ООП -

  • Пример наследования?

  • Чем отличается интерфейс от абстрактного класса? В каких случаях вы использовали бы и то, и другое?

  • Чем отличается абстрактный класс от интерфейса? Для чего нужны интерфейсы и какие задачи они выполняют?

  • В чем отличие интерфейса от абстрактного класса ?

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

  1. Астрактый класс может содержать логику и состояние, интерфейс - нет, это модель поведения, контракт. Абстрактный класс наследуется а интерфейс реализуется. Если классы могут быть сведены к единой классификации, то следует применять абстрактый класс. Пример с фабрикой по созданию объектов - общий функционал - выделение отдельной сцены, в которой будут создаваться объекты, этот функционал нужен во всех наследниках. Если у классов нет общей логики то для них сгодится интерфейс(каждая операция отличается от другой).
  2. Множественное наследование. В интефейсе можно выполнять наследование, это позволяет выделять различные аспекты поведения объекта под определенным интерфейсом. Вызывающий код будет работать с интерфейсом. Такой подход оберегает от излишнего использования объекта сторонними классами. - при явной реализации интерфейса. При неявной реализации - это обычный публичный метод доступный для всех.
  3. Все члены интерфейса по умолчанию являются доступными для использования в явном или не явном виде. Поменять модификатор доступа нельзя. Астрактый метод или свойство могут быть protected.
  4. Интерфейс не может содержать переменные или делегаты, в отличии от абстрактного класса.

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

Когда используем абстрактный класс а когда интерфейс? Если нужно реализовать фитчу и выделить некое семейство классов с общей логикой мы используем абстрактный класс(например система апгрейдов), он содержит состояние и общую логику, есть фундамент для постраения общих классов(абстрактный метот LevelUP например). Абстрактные классы и их наследники выполняют одну отвественность. Интерфейс используют когда надо выделить группу классов у которых разные отвественности но нужно сделать чтобы у них была общая точка взаимодействия(например такски, одна загружает данные, другая проверяет подключение к интернету.. и имеют общую точку взаимодействия ILoadApplication).

  • Что такое конструктор и деструктор ?

  • Какие бывают типы переменных в c# ?

  • Что такое ссылочные переменные и переменные значения ?

  • С какими коллекциями ( Collections ) вы работали и как ?

  • Какие паттерны вы знаете и как их использовали ?

  • Что такое упаковка/распаковка ?

  • Что такое побитовый сдвиг и как он используеться в Unity ?

  • Что такое delegate ?

  • Что такое event ?

  • Приведите пример взаимодействия через событие

  • Что такое хеш код объекта ?

  • Для чего нужны хеш таблицы ?

  • Пишите ли вы шейдеры под Unity ?

  • Пишите ли вы плагины под Unity ?

  • Какие вы знаете приемы оптимизации под мобильные устройства ? Урок по оптимизации в Unity

Математика:

  1. Что такое кватернион ?

Кватернионы используются для представления вращений. В Unity все вращения представлены в виде кватернионов. Их использование решает проблему "шарнирного замка" (gimbal lock).

  1. Как найти угол между двумя векторами ?
  2. Как найти вектор перпендикулярный 2м векторам ?
  3. Придумайте алгоритм, который выдает элемент из массива в зависимости от вероятности его выпадения

3D:

  1. Из чего состоит 3D модель ? ( вертексы, текстурные координаты...)
  2. Что такое материал ?
  3. Что такое карта нормалей ? ( normal map )
  4. Что такое pivot 3D модели ?

Вопросы для Junior Общее

  1. Назовите основные принципы ООП.

  2. Что такое наследование, инкапсуляция, абстракция, полиморфизм: приведите примеры (желательно из собственного опыта). От какого класса неявно наследуются все классы в .NET? Разрешено ли множественное наследование в C#?

  3. Что такое рекурсия?

  4. Что такое лямбда-выражение?

  5. Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются?

  6. Что такое JSON?

  7. Как вы понимаете REST?

  8. Расскажите о SPA concept.

  9. Какие GoF-паттерны использовали?

  10. Какая разница между GET и POST HTTP методами?

  11. Какую проблему решает Docker? Каковы его плюсы и минусы?

  12. Чем принципиально отличаются unit-тесты от интеграционных тестов?

Обработка исключений

  1. Что такое Exception?

  2. Для чего служат try, catch, finally? В каком случае может не выполниться блок finally?

  3. Что такое call stack? Какие ключевые слова вы знаете?

Платформа .NET

Что такое ASP.NET?

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

  1. Какие существуют типы Action filters?

  2. Что такое Web Service?

  3. Что такое CLR?

  4. Что такое сборщик мусора (Garbage Collector) на базовом уровне? CLR сама вызовет сборщик мусора и очистит память.

  5. Что такое делегат?

  6. Отличается ли Delegate от Action?

  7. Что такое LINQ и для чего используется? Приведите несколько примеров применения LINQ.

  8. Что такое пространство имен (namespace) и зачем это нужно?

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

Типы данных, коллекции и структуры данных

  1. Какие типы данных вы знаете?

  2. Какие примитивные типы знаете?

  3. Что такое Nullable-тип?

  4. Что такое тип значения, а что такое тип ссылки? Что из этого class, а что struct? В каком участке памяти они хранятся?

Чем отличаются value от reference type?

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

String - это reference или value?

Типы значений value в стеке: Целочисленные типы (byte, sbyte, short, ushort, int, uint, long, ulong) Типы с плавающей запятой (float, double) Тип decimal Тип bool Тип char Перечисления enum Структуры (struct)

Ссылочные типы reference располагаются в куче: Тип object

Тип string !!! массив char

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

Классы (class) Интерфейсы (interface) Делегаты (delegate)

В чем отличие между string builder и string? В чем преимущество StringBuilder перед String?

в классе StringBuilder можно изменять отдельный символ по его индексу. Он оптимизирован для операций сложения строк например.

  1. Что такое дженерики? Какие проблемы они решают?

  2. Что такое boxing / unboxing?

  3. Что такое Array, List, HashSet, Dictionary? Приведите примеры использования этих структур данных. Какая сложность операций с ними (поиск, вставка, удаление)?

  4. Какие знаете коллекции?

  5. Что делает оператор yield?

Что такое класс?

Собственный тип данных, в нем можно описать поля, свойства, методы.

Какие вы знаете модификаторы доступа?

В языке C# применяются следующие модификаторы доступа: private: закрытый или приватный компонент класса или структуры. Приватный компонент доступен только в рамках своего класса или структуры. private protected: компонент класса доступен из любого места в своем классе или в производных классах, которые определены в той же сборке. file: добавлен в версии C# 11 и применяется к типам, например, классам и структурам. Класс или структура с такми модификатором доступны только из текущего файла кода. protected: такой компонент класса доступен из любого места в своем классе или в производных классах. При этом производные классы могут располагаться в других сборках. internal: компоненты класса или структуры доступен из любого места кода в той же сборке, однако он недоступен для других программ и сборок. protected internal: совмещает функционал двух модификаторов protected и internal. Такой компонент класса доступен из любого места в текущей сборке и из производных классов, которые могут располагаться в других сборках. public: публичный, общедоступный компонент класса или структуры. Такой компонент доступен из любого места в коде, а также из других программ и сборок.

  1. В чем разница между обычным классом и статическим?

  2. В чем разница переопределения метода между ключевыми словами new и override?

Какое различие между const и read only?

Первая разница между ними состоит в том, что readonly полям можно присваивать значения в 8000 двух местах: в месте их создания и в конструкторах. Для констант же значения можно присвоить только в месте их создания. Вторая разница состоит в том, что поля readonly - это "особые" переменные, поскольку в отличные от обычных переменных их значения можно изменить только в определённых местах (было описано выше), но после компиляции они всё так же остаются переменными, в отличии от констант. Ведь при компиляции во все места кода где использовалась константа будет подставлено её значение, а в самом классе её уже не будет

.. const и readonly используются в C# для определения неизменяемых значений, однако они имеют разные характеристики и применяются в разных ситуациях: const: const (константа) используется для определения значения, которое не может быть изменено после компиляции программы. Значение const должно быть определено на момент объявления и не может быть изменено в дальнейшем. Константы могут быть только примитивными типами данных (например, int, float, char, bool) или строками (string). Константы являются неявно статическими членами и могут быть использованы в любом месте кода без создания экземпляра класса. readonly: readonly используется для определения переменной, которая может быть инициализирована только при объявлении или в конструкторе класса. Значение readonly переменной можно изменять во время выполнения программы, но только в конструкторе. readonly переменные могут иметь любой тип данных, включая структуры и ссылочные типы. В отличие от констант, readonly переменные могут быть как статическими, так и нестатическими членами класса. В общем, используйте const для значений, которые известны на этапе компиляции и не изменяются во время выполнения, а readonly для значений, которые могут быть определены только во время выполнения, но должны оставаться неизменными после инициализации. ..

  1. Разница между структурой и классом. Приведите примеры структур.

  2. Может ли экземпляр структуры храниться в куче (heap)? Как это сделать?

Асинхронность

  1. Что такое асинхронность и чем она отличается от многопоточности?

  2. Какие есть ключевые слова для использования асинхронности в коде?

  3. Что означают ключевые слова async / await?

Базы данных

  1. Разница между реляционными и нереляционными базами, плюсы и минусы использования обоих вариантов.

  2. Что такое индексы в RDBMS?

  3. Какие типы JOIN существуют в SQL?

Тестирование

  1. Для чего нужны unit-тесты?

  2. Какие преимущества и недостатки использования unit-тестов?

  3. Из каких трех логических блоков состоит unit-тест?

Вопросы для Middle

Общее

  1. Вы набираете google.com в браузере. Расскажите как можно подробнее, что происходит в это время на HTTP-уровне?

  2. Как работает HTTPS?

KISS (кисс)

Принцип KISS (Keep It Simple, Stupid) - это принцип проектирования программного обеспечения, который утверждает, что простые решения обычно лучше сложных. Он призывает разработчиков создавать программы, которые легко понимаются, поддерживаются и имеют минимальное количество кода Ключевые принципы KISS включают следующее:

  1. Дизайн системы должно быть максимально простым и понятным
  2. Чем меньше кода, тем лучше: меньше ошибок и потенциальных проблем
  3. Решения должны быть компактными, но достаточными
  4. При проектировании программного обеспечения нужно избегать избыточной сложности и учитывать будущую расширяемость системы

DRY

Принцип DRY (Don't Repeat Yourself) — это принцип проектирования программного обеспечения, который подразумевает, что любая часть программы должна иметь уникальный код. Суть принципа заключается в том, что не следует копипастить код в разных частях программы, поскольку это приводит к увеличению времени на поддержание кода и поиск ошибок, поскольку нужно вносить изменение в каждый из этих участков

YAGNI YAGNI (You Aren't Gonna Need It) - это принцип разработки программного обеспечения, который гласит: "Никогда не делайте ничего на всякий случай". Он предполагает, что разработчик должен создавать только тот функционал, который нужен в настоящее время, а не пытаться предугадать, что может потребоваться в будущем

Как вы понимаете SOLID(Солид)?

S - Single-responsiblity Principle Принцип единой отвественности. Метод, класс, модуль должны иметь только одну зону ответственности. Например если есть модуль LeaderBoard - единая отвественность это отображение списка пользователей по каким то признакам. Ни при какой логике тут не может быть логики сохранения, логина или покупок. Это все другие модули. Модуль может с ними общаться но без подробности реализации. Модуль делиться на классы. классы на методы и с каждым понижением уровня снижается объем ответственности. Плюсы: Снижение сложности кода, Переиспользуемость, Тестируемость. Минусы: Уменьшение скорости разработки.

Каждый класс должен иметь только одну отвественность и изменяться только по одной причине Если в игре юнит должен прыгать, бегать и стрелять и если это три разных задачи, то лучше разделить эти задачи на три класса, где каждый из классов будет выполнять свою задачу. Сколько задач в системе - столько классов должно быть. Пример разделяют пользовательский 1. ввод и 2. перемещение и 3. контроллер, который связывает перемещение и ввод, потому что перемещение можно использовать так же для npc Плюсы: легче читать код, переиспользуемость, проще работать в команде, улучшение тестируемости Минусы: Злоупотребление отвественностями - система становится сложнее, нужно держать баланс (смотреть где нужна компактность после напиасания) Система должна быть простой, компактной и понятной.

O - Open-closed Principle Принцип открытости закрытости. Сущности должны быть открыты для расширения и закрыты для изменения. Играет важную роль по мере развития проекта. Меняется текущий код при добавлении функционала и можно что-то сломать. Код должен быть закрыт для изменения - Стратегия, декоратор и фабрика - отлично помогают расширять функционал без изменений исходного кода. Нужно определить что поменять в коде, выделяется абстракция в виде интерфейса или абстрактного класса, от него наследуюется текущий функционал, под занавес абстракции создается новый функционал, который будет меняться в зависимости от каких то условий. Нужно применять очень дозированнно, т.к. чрезмерно абстрактный код является очень сложным для понимания. Плюсы: Безопасное внедрение новой функциональности, слабая связанность кода, Тестируемость. Минусы: Черезмерное использование ведет к невозможности поддержния проекта.

Классы должны быть открыты для расширения но закрыты для изменения Проблема: разработчики написали функциональность, протестировали ее, затем начали добавлять новую фитчу и пришлось возвращаться назад и переписывать старый код. Нужно реализовывать системы таким образом чтобы старый код не пришлось переписывать.
Пример Через один класс выделяем всех юнитов, в классе для каждого выделенного юнита, воин, маг, лучник есть методы атаки и движения. Если нам нужно добавить нового юнита, то придется переписывать класс для выделения юнита и добавить туда его. Или если мы убираем юнита мага, то нужно лезть в класс выделения юнитов и убирать строчку про мага. Решение через интерфес ISelectionUnit с двумя методами двигаться и атакавать, в классе выделения юнита мы будем добавлять всех героев которые реализуют данный интерфейс и им будем передовать Движение и атаку. Плюсы: расширяемость кода, модульность кода, тестируемость кода Минусы: Злоупотребление абстракциями, не должно быть дерева наследования

L - Liskov Substitution Principle Принцип подстановки Барбары Лисков. Звучит он так: функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом. Классы-наследники не должны противоречить базовому классу. Если переопределить какой нибудь из методов - сломает принцип. Виртуальные методы являются прямым нарушением принципа. Более грубое нарушение - наследовать базовый класс так, что вызывающий код должен делать проверку на тип и совершать какие-то дополнительные действия. Плюсы: устойчивость к ошибкам, слабая связанность, тестируемость. Минусы: сложность применения.

Объекты базовых классов должны быть заменяемы объектами их наследников без нарушения корректности работы программы. Нужно правильно использовать наследование, наследники должны иметь ту же структуру что и базовые классы эта структура не должна меняться. Пример, все юниты имеют здоровье урок атаку передвижение одинаковые. Но потом понадобилось чтобы один из юнитов не перемещался. Это значит что наследование использовалось не верно и структура наследников динамическая, разная. Правильный вариант отказаться от наследование в пользу компонтентного подхода(ecs, атомарный), где каждый компонент будет реализовывать свою логику. Плюсы: расширяемость кода, тестируемость, Минус: время на продумывание

I - Interface Segregation Principle Принцип разделения интерфейсов. Идет рука об руку с первым принципом единой отвественности. Разделение больших интерфейсов на маленькие, чтобы минимизировать количество членов, которые нужно реализовать. Нарушение - нежелание создавать новый интерфейс при добавлении нового функционала.

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

D - Dependency Inversion Principle Инверсия зависимостей. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба этих слоя должны зависеть от астракций. Инверсия - идем снизу вверх. (пример паттерн-фабрика - у нижнего уровня выделяется общий аспект поведения состояния и переносите в интерфейс или базовый класс, а дальше он уже используется на верхнем уровне. "Дай объект который наследуется от абстракции." )

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

  1. Какие протоколы сериализации вы знаете и где они применяются?

  2. Что такое в вашем понимании чистая функция? Какие у нее преимущества?

Тема связана со специальностями:

С чего начать?

Frontend Developer

Верстальщик сайтов 59. Что такое dependency injection и зачем оно нужно?

  1. Что такое cohesion и coupling (связанность и связность)?

  2. Что такое IaaS, PaaS, SaaS и каковы различия между ними?

  3. Какие способы отладки программы вы используете?

  4. Какие знаете паттерны? Объясните суть перечисленных.

В чем суть паттерна Singleton? Почему его еще называют антипаттерном?

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

Для чего нужен паттерн Strategy?

Позволяет менять выбранное действие или алгоритм действия на другой, вне зависимости от объекта который его использует. Когда надо изменять поведение сущности в соотвествии с состоянием системы или окружением. Например, есть класс Person и у него есть метод DoAction(IAction action) в который мы передаем действие в виде интерфейса. Есть две реализации интерфейса Walk:IAction Swim:IAction. Для того чтобы поменять состояние с Walk на Swim например если Person зашел в воду, мы можем через отдельный метод передать новое действие в аргументы метода. Например, с помощью паттерна можно описывать поведение различных юнитов. Мы можем создать интерфейсы с поведением IAttack, IDamage и т.д. и создавать юнитов с реализацией только необходимых интерфейсов. Только тут мы не сможем подменить реализацию в процессе игры.

  1. Какие ключевые различия между распределенными системами и монолитными?

  2. Какие паттерны проектирования распределенных систем вы знаете?

  3. Какие есть принципы работы Message bus? Почему могут возникать дубликаты в очередях?

  4. Какие принципы построения идемпотентных сервисов знаете?

  5. Расскажите, как работают асинхронные методы? Чем асинхронность отличается от параллелизма?

Платформа .NET

  1. Какие исключения нельзя остановить в блоке catch?

  2. Какая разница между .NET Standard Class Library и .NET Core Class Library?

  3. Объясните разницу между отложенным и немедленным исполнением в LINQ. Приведите примеры.

  4. Для чего нужен метод ConfigureServices в Startup.cs?

  5. Какая разница между services.AddTransient и services.AddScope в ASP.NET Core?

  6. Что такое Kestrel?

  7. Опишите ASP.NET MVC request pipeline.

  8. Как в ASP.NET WebAPI настроить кэширование ответов на HTTP-запросы?

Управление памятью

  1. Что такое куча и стек? Различия, принцип работы.

  2. Как работает сборщик мусора?

  3. Зачем нам зарезервированное слово using в C#, если в .NET есть автоматическое управление памятью? Как с этим связан disposable-паттерн и зачем такой сложный паттерн для managed и unmanaged ресурсов?

  4. Какие особенности работы с Large Object Heap?

Типы данных, коллекции и структуры данных

  1. Когда генерируется дженерик-класс конкретного типа - при выполнении программы или во время компиляции?

  2. Что такое рефлексия?

  3. Расскажите о коллекции LinkedList . Чем она отличается от других коллекций?

  4. Что такое индексатор?

  5. Что такое immutable object? Какие преимущества дает использование immutable object? Предложите способ реализации его в .NET.

  6. Когда использовать StringBuilder, а когда string? Как работает StringBuilder?

  7. Что такое балансирование деревьев?

  8. Что такое Key-value структуры?

  9. Что такое хэш-функция и зачем нужны хэш-таблицы?

  10. Какими свойствами должна обладать идеальная хеш-функция?

  11. Что такое коллизии и как с ними бороться?

  12. В чем заключается сложность CRUD-операций в Dictionary <K, V> в .NET?

  13. Где хранятся массивы? Массивы примитивных типов?

  14. В чем отличие между массивом (T [ ]) и списком (List )?

  15. В чем разница между IList и IEnumerable ?

  16. Зачем нужны Enumerable, Observable, AsyncEnumerable и какие модели получения данных они реализуют?

  17. В чем разница между IEnumerable и IQueryable?

  18. Что такое enum flags?

Базы данных

  1. Расскажите о нормальных формах в СУБД.

  2. Что такое индекс в БД?

  3. Когда следует использовать индексы? Преимущества и недостатки.

  4. Какие типы индексов существуют? Чем они отличаются?

  5. Что такое ACID?

  6. Какие вы знаете уровни изоляции транзакций?

  7. Что такое план выполнения запроса (execution plan) в MS SQL?

  8. Проблема: запрос долго выполняется. Какие есть методы ее диагностики и решения?

  9. Как ORM (Entity Framework или Entity Framework Core) транслируют C# код в язык запросов базы данных? Что для этого используется?

Параллелизм

  1. Для чего использовать Task.ConfigureAwait?

  2. Например, есть веб-сервер, который по HTTP-запросу делает выборку из базы данных. Всего на сервере 16 тредов (threads). Каждый HTTP-request выполняет запрос в базу и ожидает результатов, в этом случае тред блокируется. Можно ли оптимизировать эту работу средствами .NET?

Зачем нужен ThreadPool?

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

Опишите механику работы: как поток выделяется и возвращается обратно в ThreadPool.

Вопросы для Senior

Общее

  1. Какие ещё практики, кроме ООП, использовали (AOP, FP и т. д.)?

  2. Назовите три самые сложные проблемы, которые вам приходилось решать. Как вы это сделали, как пришли к этому решению?

  3. Что такое слабосвязанный код? Чем он лучше сильносвязанного кода? Как бы вы достигали более слабой связности кода?

  4. Использование статических классов повышает или понижает связность кода?

  5. Как можно измерить performance кода? Влияет ли факт замеров на производительность?

  6. Для чего используются и как работают multi-stage билды в Docker?

  7. Как понять, что какая-то часть кода утилизирует много памяти или долго выполняется? Что может быть ботлнеком в разных случаях? Какие есть способы уменьшения па 8000 яти и трафика памяти?

  8. Как бы вы реализовали cross-cutting concern (например, логирование, валидация, транзакции)?

  9. Расскажите о Rest Maturity Model.

Видео курсы по схожей тематике:

ASP.NET Базовый ASP.NET Базовый

Дмитрий Охрименко Выполнение домашнего задания по курсу C# Базовый Выполнение домашнего задания по курсу C# Базовый

Константин Черный Автоматизация тестирования на С# Автоматизация тестирования на С#

Татьяна Пешкова 131. Что такое CPU и IO-bound задачи?

  1. Что такое маршалинг?

  2. Как работает async / await (подробно)? Почему нельзя использовать async void методы?

Платформа .NET

  1. Как работает lock? Можно ли использовать структуры внутри выражения lock?

  2. Что такое Expression Tree?

  3. Как работает сборщик мусора (подробно)? Почему в GC три поколения, а не, скажем, пять, десять или два?

  4. Как бы вы организовали трассировки Web API сервисов?

  5. Как в .NET Core можно настроить хранение секретов на компьютерах разработчиков и на рабочих средах?

  6. Как бы вы организовали процесс CI/CD .NET Core сервисов для их деплоймента в облачную инфраструктуру?

  7. Как включить CORS в AspNetCore?

Типы данных, коллекции и структуры данных

  1. Как реализованы дженерики?

  2. Как создать собственный immutable-тип?

  3. Как работает IEnumerable (подробно)?

  4. Какой алгоритм использует коллекция STACK?

  5. Какие структуры данных вы реализовывали сами для платформы .NET? Расскажите, чем они отличались от стандартных реализаций.

  6. Почему в структуре нет конструктора по умолчанию?

Базы данных

  1. Как БД сохраняет данные?

  2. Какие типы БД вы знаете?

  3. Как и когда БД лучше использовать?

  4. Что такое денормализации?

  5. Когда и какие уровни изоляции транзакций можно использовать?

  6. Как в популярных СУБД реализованы принципы ACID (SQL Server, PostgreSQL и т. д.)?

  7. Приходилось ли вам оптимизировать запрос в БД? Если да, то как?

  8. Опишите, какие вы знаете потенциальные проблемы, связанные с параллельными запросами к БД.

  9. Какую базу данных вы бы использовали для реализации distributed lock механизма? Расскажите детали реализации.

Микросервисы

  1. Какую проблему решают микросервисы?

  2. Какие есть способы коммуникации микросервисов?

  3. Расскажите варианты реализации распределенных транзакций в микросервисах.

  4. Что такое circuit breaker?

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

  6. Что такое брокеры сообщений? Что такое at-least-once, at-most-once семантика? Есть ли какие-то брокеры, которые гарантируют exactly-once семантику?

  7. Как должен работать код клиента брокера в зависимости от выбранной семантики?

  8. Какие инструменты для работы с очередями вам известны (как в .NET, так и отдельные продукты), какой инструмент/продукт вы бы выбрали и почему?

MS Azure

  1. Какие виды сервисов бывают в Service Fabric?

  2. Какие особенности и ограничения Azure Table Storage?

  3. Как бороться с проблемой холодного старта в Azure Functions?

  4. В чем отличие очередей и топиков в Azure Service Bus?

Практические задания

Junior only

Опишите, как бы вы реализовали калькулятор. Если понадобится добавить поддержку для римской системы счисления, что будете делать? Напишите программу, чтобы проверить, является ли число простым или нет. Найдите наименьший элемент в массиве. Упорядочите структуры папок в файловой системе. Напишите программу, которая симулирует fizz-buzz. Расскажите, что делает этот код, и предложите, как его улучшить. а)

public bool IsArrayEmpty(string[] array) { if (array.Length > 0) return false; else return true; }

б)

protected string GetClass(object url) { string result = string.Empty; if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url == url.ToString()) result = "class="active""; return result; }

Middle

Напишите программу для тиражирования последовательности Фибоначчи для заданного числа. Спроектируйте базу данных врачей и пациентов в SQL. Создайте stored procedure или запрос в SQL, который вернет врачей, имеющих больше, чем N пациентов. Проверьте коллекцию на наличие дубликатов. Спроектируйте thread-safe класс Singleton в C#. Надо записать некую сущность в базу данных и отправить событие в брокер сообщений. Как это сделать с минимальным риском потери данных? Имеются три сервиса. Выполняется HTTP-запрос на первый. Первый должен записать данные во второй, а второй - в третий. Как гарантировать, что данные при такой сложной коммуникации не потеряются? Как предотвратить записи дубликатов данных? Будет ли работать этот код и почему? a)

SomeClass myClass = null; myClass.SomeMethod();

б)

var table = GetTable(); table.Draw(); … private SomeClass GetTable() { using(var table = new SomeClass()) { table.ID = "www"; table.Width = "95%"; table.Controls.Add(tr); return table; } } Расскажите, что делает этот код, и предложите, как его улучшить: а)

Shape shape = GetNextShape(); if(shape is Circle) Console.WriteLine(((Circle)shape).Radius);

б)

public int Quantity { get { try { return int.Parse(TxtQuantity.Text); } catch (Exception) { return 0; } } }

Что не так с кодом?

try { SomeMethod(); } catch(Exception e) { Log(e.Message); throw e; }

Senior

Как бы вы спроектировали FTP-сервер? Web-сервер? Хостинг картинок с разделением прав доступа? Систему, состоящую из front- и back-офисов? Создайте клон любой популярной социальной сети (Instagram, Facebook и т.д.) Допустим, есть сущность сделки (Bid). И в сделке есть список партнеров, с которыми эта сделка заключается. Сами сделки хранятся в сервисе сделок (bidding service), а партнеры - в своем сервисе (partners service). И когда показывается список сделок, на начальном скрине нужно отразить количество партнеров. Как бы вы спроектировали хранение и изображение этого счетчика? Задача на знание LINQ: с исходной коллекции данных необходимо получить новую коллекцию по определенным требованиям (например, отсортированную, без дубликатов и т. д.). Напишите программу, которая проверяет, является ли поле судоку 9×9 правильно заполненным. Реализуйте свой Select, Where, SelectMany со всеми характеристиками LINQ (отложенное исполнение, одномоментная (eager) проверка входных данных). С помощью LINQ напишите метод, который вернет такие элементы коллекции, которые делятся на N без остатка, отсортированные от наибольшего значения к наименьшему. Сигнатура метода: List Filter (IEnumerable collection, int n) ;. Напишите функцию, которая вернет сумму всех четных элементов массива, который передается в функцию (JavaScript).

https://www.interviewbit.com/c-sharp-interview-questions/ https://www.simplilearn.com/tutorials/c-sharp-tutorial/c-sharp-interview-questions https://hackr.io/blog/c-sharp-interview-questions https://www.guru99.com/c-sharp-interview-questions.html https://www.devteam.space/hiring-interview-tips/c-interview-questions-and-answers/ https://blog.udemy.com/c-sharp-interview-questions-2/ https://www.edureka.co/blog/interview-questions/c-sharp-interview-questions/ https://www.turing.com/blog/c-interview-questions-to-hire-c-developers-in-2022/ https://www.javatpoint.com/c-sharp-interview-questions https://www.naukri.com/learning/articles/c-sharp-interview-questions-and-answers/ https://itvdn.com/ru/blog/article/150-questions-net-developer https://habr.com/ru/post/541194/ https://www.programcreek.com/2012/11/top-10-algorithms-for-coding-interview/ https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make

требования ▫️ Хорошее знание Rigidbody, Joint, Animation, Navigation Mesh, Input System, Raycast, Collider, Multithreading, URP ▫️ Понимание Unity Lifecycle ▫️Опыт в Zenject, UniRx, DOTween, UniTasks, Addressables, Burst Compiler, Unity Jobs

От джуниор/инди разработчика до мидл+ https://www.youtube.com/watch?v=jqeoq6X-5S8&t=3s https://www.dropbox.com/s/pd6kwy1mj5c5ofd/From%20junior%20indie%20developer%20to%20middle%2B%20%28Eugen%20Dubovik%29.pdf?dl=0

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

  • Участие в завершенных проектах.
  • Компетенции для разрабатываемого продукта(платформеры, матч3, стратегии и прочее) - нужны проекты по конкретной тематики и понимание архитектуры для конкретного проекта
  • У программистов есть мифы(бэкпректис) нужно ставить все под сомнение
  • должна быть возможность отключить управление(обрабатывать input напрямую плохо input.GetKey)
  • публичные переменные плохо, другой программист может их использовать.
  • Откуда брать знания: mdsnReference ютуб Unity3D - осторожно смотреть с критикой, смотреть про оптимизацию github Unity-Technologies -есть samples как правильно использовать jacksondunstan - глубоко копает в юнити Habr - Pixonics
  • Архитектура приложения: GameCore, PlayerProgress, Input, UI, Sound, Statistics, Tutorial, Quests/Scenarios, Save Data, Configs/PredefinedData, Localization - все начинается с инпута и сохранения данных, супер правильной архитектуры нет, нет идеальной
  • архитектура должна иметь запас прочности по расширяемости, должны быть необходимые модули и понятные связи, удобство, минимум бойлерплейта, не должно быть сервис локаторов раздающих данные
  • часто используемые архитектурные паттерны (MVC family) MVC-90% проектов(не нужна большая функциональность), т.к. большинство программистов использует вообще, хорошо для бизнес приложения но сложно применимо к геймдеву потому что сущности должны знать о других сущностях, появляются грабли, MVVM MVP
  • компоненты и контроллеры - более ориентирована к геймдеву
  • ЕСS
  • Сложности: добавление механик, изменение старых, много условий для поведения, смена поведения в зависимости от контекста
  • скачать и посмотреть unity3d kit
  • часто используемые паттерны - состояние/ конечный автомат, стратегия, дерево принятия решений

советы

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

изучать технологии и компетенции которые актуальны на рынке

pro: adressables render pipline shader graph vfx graph кастомные инспекторые + uiElements+Odin

  • Опыт использования профайлера в Unity;
  • Опыт работы с Jenkins.

Ваши вопросы: Менторы и лиды Проекты компенсации обучения частота пересмотров зп

ASP NET Core; Docker; опыт работы с kubernetes;

About

Unity, C#

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0