C# | Вопросы собесов
Open in Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Show more5 036
Subscribers
-324 hours
-147 days
-3230 days
Posts Archive
5 036
Конференция для профессионалов мобильной разработки
Конференция по мобильной разработке Mobius 2024 Autumn — 11 октября онлайн и 19–20 октября в Санкт-Петербурге
Живые дискуссии, доклады и практика мобильной разработки на всех платформах — на одной конференции. Обсуждаем новые фишки языков программирования, Android и iOS. Говорим о трендовых технологиях и подходах: BDUI, KMM, Jetpack Compose, SwiftUI, ML в мобильной разработке и других.
У участников будет возможность задать вопросы спикерам и поучаствовать в неформальных обсуждениях. А в офлайне вас ждет афтерпати с единомышленниками.
Узнать больше
#реклама
mobiusconf.com
О рекламодателе
5 036
🤔 Какие есть положительные и отрицательные моменты у микросервиса?
🚩Положительные моменты микросервисов
🟠Масштабируемость
Легко масштабировать только те части системы, которые требуют этого, без необходимости масштабировать всё приложение. Например, если у вас есть микросервис, обрабатывающий заказы, и он испытывает высокую нагрузку, вы можете масштабировать только его, не трогая другие части системы.
🟠Независимость развертывания
Микросервисы можно развёртывать, обновлять и откатывать независимо друг от друга. Например вы можете обновить микросервис аутентификации без остановки микросервиса каталога продуктов.
🟠Устойчивость к сбоям
Отказ одного микросервиса не приводит к отказу всего приложения. Например, если микросервис обработки платежей выходит из строя, пользователи всё равно могут просматривать продукты и добавлять их в корзину.
🟠Гибкость технологий
Каждый микросервис может быть написан на своем языке программирования и использовать свои технологии, что позволяет выбирать наиболее подходящие инструменты для каждой задачи. Например, Вы можете использовать Python для микросервиса машинного обучения и .NET для микросервиса управления пользователями.
🟠Ускоренная разработка:
Малые команды могут работать над разными микросервисами параллельно, что ускоряет процесс разработки. Например, одна команда может работать над микросервисом управления пользователями, в то время как другая команда работает над микросервисом заказа.
🚩Отрицательные моменты микросервисов
🟠Сложность управления
Управление множеством микросервисов требует сложной инфраструктуры для оркестрации, мониторинга и логирования. Например, вам нужно внедрить систему оркестрации, такую как Kubernetes, чтобы управлять развертыванием и масштабированием микросервисов.
🟠 Сложность коммуникаций
Необходимо наладить надежные межсервисные коммуникации, что может быть сложно и привести к повышенным накладным расходам. Например, вам нужно решить, использовать ли синхронные (HTTP/REST) или асинхронные (сообщения, очереди) методы связи между микросервисами.
🟠Трудности в тестировании
Тестирование микросервисной архитектуры сложнее из-за необходимости интеграции и взаимодействия между множеством независимых компонентов. Например вам нужно создать среду для интеграционного тестирования, которая включает все необходимые микросервисы.
🟠Управление данными
Согласованность данных и управление транзакциями становятся более сложными задачами в распределённой системе. Например, вам нужно внедрить сложные механизмы для обеспечения согласованности данных, такие как саги или распределённые транзакции.
🟠Затраты на инфраструктуру: Разделение на множество микросервисов может увеличить затраты на инфраструктуру, особенно если требуется множество ресурсов для управления этими микросервисами. Например, Вам может понадобиться больше серверов и инструментов для управления и мониторинга микросервисов.
Ставь 👍 и забирай 📚 Базу знаний
5 036
Дизайн в FIGMA с нуля. Бесплатный курс + портфолио
Онлайн-программа с наставником и чатом. Дизайн от профессионалов. Доступ 0 руб.
Узнать больше
#реклама 16+
yudaevschool24.online
О рекламодателе
5 036
🤔 Что такое микросервис?
🚩Что такое микросервис
Микросервис — это архитектурный стиль, который предполагает создание приложения в виде набора небольших, автономных сервисов, каждый из которых отвечает за выполнение конкретной бизнес-функции. Эти сервисы могут разрабатываться, развёртываться и масштабироваться независимо друг от друга.
🚩Основные характеристики микросервисов
🟠Автономность: Каждый микросервис работает независимо и может быть развёрнут отдельно.
🟠Малый размер: Микросервисы обычно небольшие и выполняют одну конкретную задачу.
🟠Чёткие границы: Микросервисы имеют чётко определённые границы и взаимодействуют друг с другом через хорошо определённые API.
🟠Независимость развертывания: Микросервисы можно развёртывать и обновлять независимо друг от друга.
🟠Разнообразие технологий: В каждом микросервисе можно использовать разные технологии, языки программирования и базы данных в зависимости от задачи.
Преимущества микросервисов
🟠Масштабируемость: Легко масштабировать отдельные микросервисы по мере необходимости.
🟠Упрощенная разработка и развёртывание: Меньшие команды могут работать над отдельными микросервисами, что ускоряет разработку.
🟠Независимые обновления: Можно обновлять и развёртывать микросервисы без остановки всего приложения.
🟠Устойчивость к сбоям: Сбой в одном микросервисе не приводит к сбою всего приложения.
Недостатки микросервисов
🟠Сложность управления: Требуется сложная инфраструктура для управления множеством микросервисов.
🟠Сложность коммуникаций: Требуется надежный механизм взаимодействия между микросервисами.
🟠Трудности в тестировании: Тестирование микросервисной архитектуры может быть сложнее по сравнению с монолитной.
🟠Управление данными: Могут возникнуть сложности с согласованностью данных и транзакциями.
🚩Рассмотрим пример интернет-магазина, разбитого на несколько микросервисов:
🟠User Service: Управляет пользователями и их учетными записями.
🟠Product Service: Управляет информацией о продуктах.
🟠Order Service: Обрабатывает заказы.
🟠Payment Service: Управляет платежами.
Каждый из этих микросервисов имеет своё собственное API и базу данных.
// Пример простого контроллера для микросервиса пользователя
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
private readonly IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public ActionResult<User> GetUser(int id)
{
var user = _userService.GetUserById(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
[HttpPost]
public ActionResult<User> CreateUser([FromBody] User user)
{
var createdUser = _userService.CreateUser(user);
return CreatedAtAction(nameof(GetUser), new { id = createdUser.Id }, createdUser);
}
}
Ставь 👍 и забирай 📚 Базу знаний5 036
🤔 Какой модификатор доступа делает член класса доступным только в пределах своего класса и подклассов?
5 036
+9
Помощь в трудоустройстве в IT-сфере!
В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно!
Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита.
Для этого нужно:
- Перейти по ссылке
- Заполнить анкету и ответить на вопросы (занимает менее 3 минут)
- На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать
Перейти на сайт
#реклама 16+
urban-university.ru
О рекламодателе
5 036
🤔 ВЧто такое паттерн CQRS?
🚩Что такое паттерн CQRS — паттерн, разделяющий операции чтения и записи данных.
Основные концепции
🟠Команды (Commands): Операции записи, изменяющие состояние системы.
🟠Запросы (Queries): Операции чтения, не изменяющие состояние системы.
Преимущества
🟠Оптимизация производительности: Раздельные модели для чтения и записи могут быть оптимизированы отдельно.
🟠Упрощение кода: Разделение логики упрощает код и его поддержку.
🟠Масштабируемость: Легче масштабировать чтение и запись независимо.
Недостатки
🟠Сложность: Увеличение сложности системы.
🟠Синхронизация данных: Требуется механизм синхронизации между моделями чтения и записи.
Команда (Command)
public class CreateUserCommand
{
public string Name { get; }
public CreateUserCommand(string name)
{
Name = name;
}
}
Обработчик команды (Command Handler)
public class CreateUserCommandHandler
{
private readonly UserDbContext _context;
public CreateUserCommandHandler(UserDbContext context)
{
_context = context;
}
public void Handle(CreateUserCommand command)
{
var user = new User { Name = command.Name };
_context.Users.Add(user);
_context.SaveChanges();
}
}
Запрос (Query)
public class GetUserQuery
{
public int UserId { get; }
public GetUserQuery(int userId)
{
UserId = userId;
}
}
Обработчик запроса (Query Handler)
public class GetUserQueryHandler
{
private readonly UserDbContext _context;
public GetUserQueryHandler(UserDbContext context)
{
_context = context;
}
public User Handle(GetUserQuery query)
{
return _context.Users.Find(query.UserId);
}
}
Ставь 👍 и забирай 📚 Базу знаний5 036
😒 На одном кодинге уже давно не вывезешь, перспектива 2024 года - Информационная Безопасность
Ловите два канала на тему ИБ и хакинга
ZeroDay - Уроки по кибербезопасности и хакингу с нуля. Вирусы, взломы, OSINT, криптография и свежие новости
Белый Хакер - программное обеспечение, утилиты, OSINT, инструменты, полезная литература и много другое. Совершенно новый формат непохожий на другие каналы.
5 036
Яндекс Директ
Только этой осенью Яндекс Директ добавит до 20 000 ₽ на рекламу для вашего бизнеса ⚡
Узнать больше
#реклама
yandex.ru
О рекламодателе
5 036
🤔 Что такое паттерн Event Sourcing?
Паттерн Event Sourcing (событийное моделирование) — это подход к управлению состоянием приложения, при котором все изменения состояния представляются в виде последовательности событий. Вместо хранения текущего состояния объекта в базе данных, сохраняются все изменения состояния (события), которые произошли с этим объектом. Текущее состояние может быть восстановлено путем последовательного применения этих событий.
🚩Основные концепции Event Sourcing:
🟠События (Events): События представляют собой неизменяемые записи фактов, которые произошли в системе. Каждое событие описывает изменение состояния.
🟠Источники событий (Event Stores): Специальные хранилища, которые сохраняют последовательности событий. Они обеспечивают устойчивость событий и возможность их повторного воспроизведения.
🟠Агрегаты (Aggregates): Логические группы объектов, которые обрабатывают команды и генерируют события.
🟠Команды (Commands): Запросы на выполнение изменений, которые обрабатываются агрегатами и приводят к генерации событий.
🟠Проекционные модели (Projections): Модели, создаваемые из последовательностей событий для представления данных в удобной для чтения форме.
Преимущества Event Sourcing:
🟠Историчность: Все изменения состояния хранятся в виде событий, что позволяет восстановить любое прошлое состояние системы.
🟠Отладка и аудит: Полная история изменений облегчает отладку и проведение аудита.
🟠Производительность: Проекции позволяют оптимизировать запросы к данным.
🟠Гибкость: Возможность пересоздания проекций с новыми требованиями без изменения основного хранилища событий.
Недостатки Event Sourcing:
🟠Сложность: Реализация Event Sourcing требует дополнительных усилий и знаний.
🟠Объем данных: Хранение всех событий может занимать много места.
public class AccountCreated
{
public Guid AccountId { get; }
public string Owner { get; }
public AccountCreated(Guid accountId, string owner)
{
AccountId = accountId;
Owner = owner;
}
}
public class MoneyDeposited
{
public Guid AccountId { get; }
public decimal Amount { get; }
public MoneyDeposited(Guid accountId, decimal amount)
{
AccountId = accountId;
Amount = amount;
}
}
public class MoneyWithdrawn
{
public Guid AccountId { get; }
public decimal Amount { get; }
public MoneyWithdrawn(Guid accountId, decimal amount)
{
AccountId = accountId;
Amount = amount;
}
}
Ставь 👍 и забирай 📚 Базу знаний5 036
😮 Добавлена новая база слитых курсов на 800ГБ:
Python:
https://t.me/+QPSH2IcGu4w5ODky
Frontend и Web:
https://t.me/+MiJVQSyUlDNjODky
Программирование:
https://t.me/+opj2LZT23ddiZDli
Графика и дизайн:
https://t.me/+vrZ8dhdUEXM3YmQy
5 036
+9
Помощь в трудоустройстве в IT-сфере!
В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно!
Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита.
Для этого нужно:
- Перейти по ссылке
- Заполнить анкету и ответить на вопросы (занимает менее 3 минут)
- На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать
Перейти на сайт
#реклама 16+
urban-university.ru
О рекламодателе
5 036
📌 Что такое паттерн DDD?
💬 Спрашивают в 11% собеседований
Паттерн DDD (Domain-Driven Design, предметно-ориентированное проектирование) — это методология разработки программного обеспечения, которая фокусируется на сложных предметных областях и переводе их в код. Основная идея DDD заключается в том, чтобы создать программные модели, которые соответствуют бизнес-логике и терминологии, используемой экспертами в данной предметной области.
🤔 Основные концепции DDD
1️⃣ Domain (Предметная область): Основная бизнес-логика и правила, специфичные для конкретной области.
2️⃣ Entities (Сущности): Объекты с уникальной идентичностью, которые могут изменяться со временем.
3️⃣ Value Objects (Объекты-значения): Объекты, которые не имеют уникальной идентичности и полностью определяются их атрибутами.
4️⃣ Aggregates (Агрегаты): Группы связанных объектов (сущностей и объектов-значений), которые считаются единой единицей для изменений данных.
5️⃣ Repositories (Репозитории): Абстракции для доступа к коллекциям агрегатов, обеспечивающие методы для поиска и хранения объектов.
6️⃣ Services (Сервисы): Операции или бизнес-логика, которые не могут быть естественным образом включены в сущности или объекты-значения.
7️⃣ Bounded Context (Ограниченный контекст): Четко определенные границы, внутри которых определенные модели и термины имеют смысл.
8️⃣ Ubiquitous Language (Общепринятый язык): Язык, общий для разработчиков и бизнес-экспертов, который используется для описания модели.
🤔 Пример использования DDD
🤔 Сущности и объекты-значения
// Value Object
public class Money
{
public decimal Amount { get; }
public string Currency { get; }
public Money(decimal amount, string currency)
{
Amount = amount;
Currency = currency;
}
public override bool Equals(object obj)
{
if (obj is Money money)
{
return Amount == money.Amount && Currency == money.Currency;
}
return false;
}
public override int GetHashCode() => (Amount, Currency).GetHashCode();
}
// Entity
public class Product
{
public Guid Id { get; }
public string Name { get; private set; }
public Money Price { get; private set; }
public Product(Guid id, string name, Money price)
{
Id = id;
Name = name;
Price = price;
}
public void Rename(string newName)
{
Name = newName;
}
public void ChangePrice(Money newPrice)
{
Price = newPrice;
}
}
🤔 Преимущества DDD
1️⃣ Соответствие бизнес-логике: Код, построенный на основе DDD, более точно отражает бизнес-логику и правила.
2️⃣ Улучшенная коммуникация: Общепринятый язык улучшает коммуникацию между разработчиками и бизнес-экспертами.
3️⃣ Четкие границы: Ограниченные контексты помогают управлять сложностью, разделяя систему на более управляемые части.
4️⃣ Гибкость и расширяемость: Модели легко адаптируются к изменениям в бизнес-логике.
🤔 Недостатки DDD
1️⃣ Сложность: Реализация DDD может быть сложной и требовать значительных усилий и времени.
2️⃣ Требования к знаниям: Необходимы глубокие знания предметной области и навыки проектирования.
3️⃣ Перегрузка для простых проектов: Для небольших и простых проектов использование DDD может быть излишним.
🤔 Краткий ответ
DDD (Domain-Driven Design) — это методология разработки ПО, фокусирующаяся на моделировании сложных предметных областей в соответствии с бизнес-логикой. Основные концепции включают сущности, объекты-значения, агрегаты, репозитории, сервисы, ограниченные контексты и общепринятый язык. Преимущества DDD включают точное соответствие бизнес-логике и улучшенную коммуникацию, в то время как основные недостатки связаны со сложностью и требованиями к знаниям.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых5 036
Друзья, мы создали новый канал по изучению C# и разработке игр на Unity.
👉C#/Unity Learning👈
Заходите, если интересно
5 036
📌 Как предложить избежать deadlock`а?
💬 Спрашивают в 11% собеседований
Избежание deadlock'ов (взаимных блокировок) в многопоточном программировании — важная задача, требующая внимательного проектирования и разработки. Deadlock происходит, когда два или более потока не могут продолжать выполнение, потому что каждый из них ожидает освобождения ресурса, удерживаемого другим потоком. Вот несколько стратегий и методов для предотвращения deadlock'ов:
1️⃣ Избегайте вложенных блокировок
Избегайте ситуаций, когда один поток удерживает один ресурс и пытается заблокировать другой, уже заблокированный другим потоком. Придерживайтесь простого правила: каждый поток должен блокировать ресурсы в одном и том же порядке.
🤔 Пример:
object lock1 = new object();
object lock2 = new object();
public void Method1()
{
lock (lock1)
{
lock (lock2)
{
// Действия с lock1 и lock2
}
}
}
public void Method2()
{
lock (lock1)
{
lock (lock2)
{
// Действия с lock1 и lock2
}
}
}
2️⃣ Используйте тайм-ауты при блокировках
Используйте методы блокировки с тайм-аутами, такие как Monitor.TryEnter или Mutex.WaitOne, чтобы предотвратить бесконечное ожидание ресурсов.
🤔 Пример: object lockObject = new object();
public void MethodWithTimeout()
{
bool lockTaken = false;
try
{
Monitor.TryEnter(lockObject, TimeSpan.FromSeconds(1), ref lockTaken);
if (lockTaken)
{
// Работа с lockObject
}
else
{
// Обработка ситуации, когда блокировка не была взята
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(lockObject);
}
}
}
3️⃣ Используйте менее затратные примитивы синхронизации
Вместо тяжеловесных блокировок (lock, Monitor, Mutex), используйте примитивы, которые уменьшают вероятность deadlock'ов, такие как SemaphoreSlim или ReaderWriterLockSlim.
🤔 Пример: SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
public async Task MethodWithSemaphore()
{
await semaphore.WaitAsync();
try
{
// Действия, требующие синхронизации
}
finally
{
semaphore.Release();
}
}
4️⃣ Избегайте блокировок на длительное время
Делайте как можно меньше работы внутри критических секций (заблокированных блоков кода). Это уменьшает вероятность столкновения потоков за ресурсы.
🤔 Пример: object lockObject = new object();
public void Method()
{
// Выполняйте сложные операции вне блока lock
var data = GetData();
lock (lockObject)
{
// Выполняйте только необходимые действия внутри блока lock
ProcessData(data);
}
}
public object GetData()
{
// Долговременная операция
}
public void ProcessData(object data)
{
// Короткая операция
}
5️⃣ Используйте асинхронные методы
Использование асинхронных методов и конструкций, таких как async и await, может помочь уменьшить блокировки потоков.
🤔 Пример: public async Task MethodAsync()
{
await Task.Run(() =>
{
// Выполнение асинхронной работы
});
}
6️⃣ Анализ и проектирование
Проектируйте систему таким образом, чтобы избежать потенциальных deadlock'ов. Используйте анализ и моделирование для выявления возможных взаимных блокировок.
🤔 Краткий ответ
Избежать deadlock'ов можно, придерживаясь следующих практик: избегать вложенных блокировок, использовать тайм-ауты при блокировках, применять менее затратные примитивы синхронизации, минимизировать время блокировок, использовать асинхронные методы, а также тщательно анализировать и проектировать систему для выявления и устранения возможных взаимных блокировок.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Available now! Telegram Research 2025 — the year's key insights 
