Співбесіда з C# розробником. 150+ запитань для рівня Junior, Middle, Senior
Цей текст присвячуємо C#, мові програмування для роботи з платформою .NET. Ця мова — восьма за популярністю серед розробників, згідно з дослідженням Stack Overflow.
Ми попросили експертів з різних компаній поділитися прикладами запитань, які можуть трапитися під час співбесід на позицію C# розробника. Матеріал не є вичерпною інструкцією та не містить усі можливі варіанти запитань, однак сподіваємося, стане вам у пригоді під час пошуку роботи. Маєте більше цікавих запитань? Діліться в коментарях :)
Більше матеріалів у рубриці за посиланням.
👼 Junior
Концепції ООП
- Які основні принципи ООП? Як вони реалізовані в C#?
- Які проблеми вирішуються цим підходом? Які недоліки ООП?
- Поясніть концепцію інкапсуляції в об’єктноорієнтованому програмуванні та як її реалізувати за допомогою C#.
- Чи можете ви пояснити концепцію успадкування в C# та навести приклад, де вона може бути використана в програмі?
- Що таке абстрактний клас? І чим відрізняється від звичайного класу?
- Що таке інтерфейс і які його ключові відмінності від абстрактного класу?
- Що дає ключове слово «virtual»? Які члени класу можуть бути позначені цим модифікатором?
- Яка різниця між перевантаженням методу та перевизначенням методу?
- Що таке upcast і downcast?
- Що таке події та делегати? Яка основна різниця між ними? Як їх використовувати для реалізації зворотного виклику в C#?
Основні концепції C#
- У чому різниця між масивом (T [ ]) та списком (List <T>)? Що таке колекції і як їх використовувати?
- Що таке хеш-таблиця? Що таке хеш-функція? Як обробляються колізії в словниках?
- Що таке Boxing і Unboxing?
- Які особливості використання запису (record) і запису-структури (record struct)?
- Що дає ключове слово «static»? Яка особливість статичних класів?
- Що дає ключове слово «sealed»?
- Яка різниця між типами значень і типами посилань? Коли який тип доцільно використовувати? Наведіть приклади неправильного використання типу посилання.
- Які типи даних доступні в C#? І в чому різниця між ними?
- У чому різниця між структурами та класами в C#?
- У чому різниця між стеком і купою (heap)?
- Що таке приведення типів? Яка різниця між явним і неявним приведенням типів?
- Як реалізувати патерн Singleton в C# та які його переваги й недоліки?
- Що таке LINQ-запити?
- Поясніть різницю між методами LINQ First vs FirstOrDefault vs Single vs SingleOrDefault.
Обробка винятків та управління помилками
- Що таке винятки (exceptions) і як їх обробляти в C#? Як створити свої винятки (custom exceptions)?
- Для чого використовуються try, catch, finally? У яких випадках блок finally може не виконатися? Яка різниця між throw; vs throw ex; vs throw new Exception();, якщо виняток перехоплено у блоку catch?
Структура коду та синтаксис
- Що таке умовний оператор і як його використовувати?
- Що таке цикл for і як його використовувати для повторюваних дій?
- Які є типи доступу (access modifiers) в C# і що вони означають?
- Що таке перевантаження методів? Що таке необов’язкові параметри у методах і в чому різниця їх використання від перевантаження методів? Чим відрізняється перевизначення методу (method override) від методу new?
- Що таке простір імен (namespace) і як його використовувати для організації коду в C#?
- Чим є Common Type System? Що таке анонімні типи, загальні типи (generics), кортежі (tuples)?
- Що таке розгалуження? Які види розгалужень ви знаєте? Можливо, ви знаєте «найкращі практики» використання розгалужень?
Принципи та шаблони проєктування програмного забезпечення
- Що таке SOLID? Поясніть кожен з принципів SOLID.
- Які програмні шаблони ви знаєте?
- Що таке стиль коду і чому його використовують?
- Які принципи найменування елементів класу ви знаєте?
Інше
- Що таке ORM?
- Принципи протоколу HTTP. Опишіть, як запит йде від браузера до сервера.
Тестування
- Для чого потрібні unit-тести?
- Які переваги та недоліки використання unit-тестів?
- З яких трьох логічних блоків складається unit-тест?
👱 Middle
Паралельність і багатопотоковість
- Що таке асинхронність? Які є способи зупинити виконання асинхронного методу?
- Як використовувати асинхронне програмування в C# за допомогою ключових слів «async» та «await»?
- Що таке багатопотоковість (multithreading) і як її реалізувати в C#?
- В чому різниця між потоком і процесом?
- Які конструкції синхронізації потоків ви знаєте?
- Чи можна використовувати await всередині блоку lock?
- Які шаблони багатопотокового програмування ви знаєте?
- Як правильно обробляти DbUpdateConcurrencyException для вирішення одночасних оновлень даних в базі даних?
- Що таке дедлок? Як його створити, а як — уникнути?
Особливості мови C#
- Що таке рефлексія (reflection) і як з нею працювати?
- Чим відрізняються String і StringBuilder в C#? Коли краще використовувати кожен з них?
- У чому різниця між Eager та Lazy Loading?
- Як реалізувати поліморфізм в C# за допомогою віртуальних і перевизначених методів?
- Як використовувати атрибути в C#? Для чого вони використовуються?
- Що таке серіалізація в C#? Як її використовувати для збереження об’єктів?
- Що таке Immutable? Які типи є незмінними?
- Чим відрізняється запис (record) від класу?
- Що таке Garbage Collector? Що таке покоління? Коли GC починає прибирання?
- Опишіть типовий сценарій використання Tuple та переваги використання ValueTuple.
- Як в C# реалізувати власні розширення методів (extension methods) для наявних типів?
Патерни програмування та архітектурні підходи
- Які шаблони проєктування ви використовуєте в C#? Наведіть приклади їх використання?
- Для чого потрібен LinkedList<T> в C#? Чим він відрізняється від інших колекцій?
- Що таке IEnumerator? Як з ним працювати?
- У чому відмінність IList від IEnumerable?
- Чим відрізняються IEnumerable та IQueryable?
- Для чого використовують ThreadPool? Опишіть його механізм роботи: як виділяються та повертаються потоки в ThreadPool.
- Які методи синхронізації потоків і що таке lock?
- Опишіть власну реалізацію словника, ключем в якому може бути будь-який клас, враховуючи функціональні та нефункціональні вимоги (для прикладу алгоритмічна складність та обсяг пам’яті) до System.Dictionary<TK, TV>.
- У чому різниця між MVC та MVP?
- Що таке dependency injection і навіщо воно потрібне?
Керування пам’яттю
- Розкажіть про принципи управління пам’яттю в .NET Core. Що таке керовані та некеровані ресурси?
- Чи можливі витоки пам’яті в .NET?
Бази даних
- Назвіть рівні ізоляції транзакцій та артефакти у вашій улюбленій системі управління базами даних.
- T-SQL nchar, nvarchar, char, varchar — чим відрізняються ці типи?
Entity Framework
- Назвіть основні особливості цього фреймворку.
- Як оптимально застосовувати конфігурації? Наведіть приклади неправильного використання конфігурації.
- Розкажіть про патерн Specification.
- Як відбувається відстеження одночасних оновлень даних в EFCore?
- Як правильно обробляти DbUpdateConcurrencyException для вирішення одночасних оновлень даних в базі даних?
Event Driven
- Які брокери повідомлень ви знаєте?
- Який життєвий цикл повідомлення в RabbitMQ/AWS SQS/Azure Service Bus.
- Що таке Dead Letter Queue?
Web
- Що таке JWT-токен і чим він відрізняється від bearer-токена?
- Чи треба використовувати cookies? Якщо так, то коли?
- Як написати свій Middleware?
- Що таке Minimal API?
🧔 Senior
Просунуті концепції C#
- Які шаблони проєктування реалізовані в C# та наведіть приклади їх використання?
- Як працює async/await (детально)? Чому не варто використовувати async void методи?
- Що таке Expression Tree?
- Що таке Race Condition?
- Як в C# використовувати індексацію типів (type indexing) для динамічного створення об’єктів та виклику методів на рантаймі?
- Як в C# використовувати динамічні типи (dynamic types) для роботи з об’єктами, типи яких відомі лише на етапі виконання програми?
- Як в C# використовувати і керувати пам’яттю за допомогою небезпечного коду (unsafe code) і вказівників (pointers)?
- Як в C# використовувати і реалізувати власні механізми моніторингу та логування для відстеження роботи програми і виявлення проблем?
- Що відбувається в методі Equals?
- Напишіть метод Transform таким чином, щоб метод Equals повернув true, для всіх значень, що передаються.
- Коли необхідне default interface implementation? На вашу думку, це гарна практика?
- Як працюють LINQ оператори Zip, Aggregate?
- Які ваші нові улюблені фічі в C#
8-12 ? - У чому різниця між Semaphore vs SemaphoreSlim?
Підтримка та оптимізація застосунків у .NET-розробці
- Опишіть ситуацію, коли вам доводилося обирати конкретну структуру даних в програмі .NET з метою покращення продуктивності. Яка була проблема і як її розв’язали вибором структури даних?
- Опишіть найбільш значні поліпшення продуктивності у застосунку .NET на основі вашого досвіду. Які інструменти або методи ви використовували для виявлення та розв’язання проблеми?
- Опишіть зміни в роботі GC, введені в останніх версіях .NET. Як це покращує продуктивність програми та управління ресурсами?
- Як ви обробляєте помилки та винятки у своїх програмах .NET, щоб забезпечити стабільність і надійність? Чи можете ви описати сценарій, коли ваша стратегія обробки помилок запобігла потенційному збою у виробництві?
- Як ви реалізуєте журналювання та моніторинг у своїх програмах .NET? Опишіть інструменти або підходи, які ви використовуєте для моніторингу застосунків .NET та як вони допомагали вам виявляти та вирішувати проблеми у виробництві.
- Як ви дбаєте про безпеку своїх застосунків на .NET? Опишіть практики або інструменти, які використовуєте.
- Наведіть приклади використання (ref), (struct), записів (record). Які переваги це дає, якщо порівнювати з підходами в попередніх версіях .NET?
- Назвіть приклади шаблонів проєктування, що використовуються у власних бібліотеках .NET?
- Що таке контекст синхронізації та ConfigureAwait(false)?
Event Driven
- Які найпоширеніші проблеми ви знаєте в event-driven системах?
- Як боротися з concurrency в event-driven системах?
- Як боротися з race-condition в event-driven системах?
- Fat і thin events. Коли доцільно використовувати той чи інший тип?
- Опишіть Outbox-патерн.
Мікросервіси
- Як забезпечити транзакційність у розподілених системах?
- Які ви знаєте алгоритми балансування трафіку?
- Опишіть Circuit Breaker патерн.
- Які ви знаєте способи синхронізації доступу до спільних ресурсів?
- Які переваги і недоліки асинхронної та синхронної комунікації між сервісами?
- GRPC vs HTTP, коли що краще обрати та яка між ними різниця?
- Що таке Data Streaming та Kafka? Які базові концепції знаєте?
- Яка різниця між чергами та data streaming?
- Saga: хореографія та оркестрація. Що це таке?
- Що таке Sidecar pattern?
- Що таке Blue-Green deployment?
- Що таке CQRS-патерн ? Яка різниця з CQS? Коли це потрібно?
- Якщо патерни зв’язку з фронтендом ви знаєте (polling, long polling, server push, bi-directional)?
- Що таке pod, деплоймент, сервіс та Ingress в Kubernetes?
- Опишіть CI та CD процес на вашому проєкті.
- Що таке GitOps?
Кешування
- Які типи кешування ви знаєте? Які переваги та недоліки має кожен тип?
- Які стратегії кешування знаєте?
Бази даних
- NoSQL vs T-SQL. В яких випадках краще використовувати той чи інший тип?
- Які кроки треба виконати для пошуку повільних SQL запитів та подальшої їх оптимізації?
- Які ви знаєте типи індексів та чим вони відрізняються?
- Що таке CTE-запити?
- Чим відрізняються процедури та функції?
- Що таке тригери?
- Поясніть, що таке шардинг і реплікації. Для чого вони потрібні?
- Що таке денормалізація?
- Коли і які рівні ізоляції транзакцій можна використовувати?
- Чи доводилося оптимізувати запит у БД? Якщо так, то як?
Безпека
- Які типи атак на вебсервіси ви знаєте?
- Де краще зберігати авторизаційний токен у браузері?
- Наведіть 10 прикладів OWASP vulnerabilities.
Логування та дебагінг
- Як забезпечити можливість відстежування одного запиту в логах, якщо є послідовні виклики інших мікросервісів?
- Якщо є memory leak у сервісі, як знайти місце його виникнення? Які інструменти будете використовувати?
- Що таке Activity class?
- Що таке distributed tracing та structured logging?
Cloud
- Назвіть
5-10 сервісів, які ви використовували у роботі з хмарними технологіями. - У чому перевага хмари перед On-Premise? Назвіть переваги On-Premise розгортання застосунку?
- Що таке клауд-функції (Lambdas)?
- Які методи оркестрації або хостингу застосунків у хмарі ви знаєте?
Запитання для матеріалу надали практики, дякуємо:
- Григорію Гасину, Engineering Director, .NET, Avenga
- Ігореві Рилко, .NET Tech Lead ZONE3000/Namecheap
- Віталію Дацишину, Associate .NET Architect / Head of .Net CoE Unit в Intellias
- Олесю Дібрівному, Co-funder at Fantasy Frontier Studios
- Владиславу Фурдаку, CTO в Nearshore Devs
- Олексію Войтюку, Team Lead .Net Developer в EPAM Systems
- Unity Team Lead SUITSME (який забажав залишатися анонімним).
Окрема вдячність за технічну рецензію статті Андрію Губському, Software Architect в Outbrain, Олексію Войтюку, Олесю Дібрівному, Владиславу Фурдаку.
Оновлено 19 квітня: виправлені хибодруки.
14 коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.