Rozmowa rekrutacyjna z .NET. 150+ pytań dla Junior, Middle, Senior
Na stronie DOU umieszczono kilkadziesiąt ofert pracy dla developerów .NET, co świadczy o popularności tej technologii. Zespół redakcyjny DOU zebrał listę pytań najczęściej zadawanych przez developerów .NET swoim kolegom podczas technicznych rozmów kwalifikacyjnych. Powodzenia w przygotowaniach do rozmowy kwalifikacyjnej :)
Pytania rekrutacyjne na Juniora
Ogólne
- Wymień podstawowe założenia programowania obiektowego.
- Czym jest dziedziczenie, hermetyzacja, abstrakcja, polimorfizm: podaj przykłady (najlepiej z własnego doświadczenia). Z jakiej klasy niejawnie dziedziczą wszystkie klasy w .NET? Czy język C# obsługuje wielokrotne dziedziczenie?
- Czym jest rekursja?
- Czym jest wyrażenie lambda?
- Czym są obliczenia równoległe (wielowątkowość) i do czego służą? Jakie klasy są stosowane?
- Czym jest JSON?
- Czym jest REST?
- Opowiedz o SPA concept.
- Z jakich wzorców projektowych GoF korzystałeś?
- Na czym polega różnica między metodami GET i POST HTTP?
- Jaki problem rozwiązuje Docker? Jakie ma zalety i wady?
- Na czym polega zasadnicza różnica między testami jednostkowe (unit test) a testami integracyjnymi?
Obsługa wyjątków
- Czym jest Exception?
- Do czego służy try, catch, finaly? W jakim przypadku blok finally nie wykonuje się?
- Czym jest call stack? Jakie znasz słowa kluczowe?
Platforma .NET
- Czym jest ASP.NET?
- Jakie są typy Action filters?
- Czym jest Web Service?
- Czym jest CLR?
- Czym jest Garbage Collection na poziomie podstawowym?
- Czym jest delegat?
- Czym się różni Delegate od Action?
- Czym jest LINQ i do czego służy? Podaj kilka przykładów zastosowania LINQ.
- Czym jest przestrzeń nazw (namespace) i do czego służy?
Typy danych, kolekcje i struktury danych
- Jakie znasz typy danych?
- Jakie znasz proste typy danych?
- Czym jest typ Nullable?
- Czym są typy referencyjne i typy wartości? Który jest class, a który struct? W jakim obszarze pamięci są przechowywane?
- Czym się różni value od reference type? String to reference czy value?
- Na czym polega różnica między string builder i string?
- Czym są generyki (generics)? Jakie problemy rozwiązują?
- Czym jest boxing/unboxing?
- Czym jest Array, List, HashSet, Dictionary? Podaj przykłady zastosowania wymienionych struktur danych. Na czym polega trudność operacji (wyszukiwanie, wstawianie i usuwanie)?
- Jakie znasz kolekcje?
- Do czego służy operator yield?
Klasy, struktury i interfejsy
- Czym jest klasa?
- Czym różni się klasa od klasy abstrakcyjnej?
- Czym różni się klasa abstrakcyjna od interfejsu? Do czego służą interfejsy i jakie zadania wykonują?
- Jakie znasz modyfikatory dostępu?
- Na czym polega różnica między klasą zwykłą i statyczną?
- Na czym polega różnica między nadpisywaniem metod a słowami kluczowymi new i override?
- Na czym polega różnica między const a read only?
- Jaka jest różnica między strukturą a klasą. Podaj przykłady struktur.
- Czy może egzemplarz struktury przechowywać się w stercie (heap)? Jak to zrobić?
Asynchroniczność
- Czym jest asynchroniczność i czym się różni od wielowątkowości?
- Jakie słowa kluczowe służą do programowania asynchronicznego?
- Co oznaczają słowa kluczowe async/await?
Bazy danych
- Jaka jest różnica pomiędzy bazą relacyjną a nierelacyjną? Jakie są zalety i wady obu wariantów.
- Czym są indeksy w RDBMS?
- Jakie typy JOIN występują w SQL?
Testy
- Do czego służą testy jednostkowe (unit test)?
- Zalety i wady testowania jednostkowego?
- Z jakich trzech bloków logicznych składa się test jednostkowy?
Pytania rekrutacyjne na Middle
Ogólne
- Wpisujesz "google.com" w przeglądarce. Opowiedz dokładnie, co się dzieje w tym momencie na poziomie HTTP?
- Jak działa HTTPS?
- Czym jest SOLID?
- Jakie znasz protokół serializacji i gdzie są stosowane?
- Twoim zdaniem czym jest “czysta funkcja”? jakie ma zalety?
- Czym jest dependency injection i do czego służy?
- Czym jest cohesion i coupling (spójność i powiązanie)?
- Czym jest IaaS, PaaS, SaaS i czym się różnią?
- Jakie sposoby na debugowanie programu stosujesz?
- Jakie znasz wzorce? Wyjaśnij, czym jest każdy z wymienionych wzorców.
- Czym wzorzec projektowy Singleton? Dlaczego niektórzy programiści uznają go za antywzorzec?
- Do czego służy wzorzec Strategy?
- Na czym polega zasadnicza różnica między monolitem a systemem rozproszonym?
- Jakie znasz wzorce projektowe systemów rozproszonych?
- Jakie są zasady działania Message bus? Dlaczego mogą powstawać zduplikowane komunikaty w kolejkach?
- Jakie znasz zasady tworzenia serwisów idempotentnych?
- Jak działają metody asynchroniczne? Czy się różni asynchroniczność od równoległości?
Platforma .NET
- Blok catch nie zawsze łapie wszystkie wyjątki – o jakie wyjątki chodzi?
- Na czym polega różnica między .NET Standard Class Library a .NET Core Class Library?
- Na czym polega różnica między odroczonym i natychmiastowym wykonaniem w LINQ. Podaj przykłady.
- Do czego służy metoda ConfigureServices w Startup.cs?
- Na czym polega różnica między services.AddTransient a services.AddScope w ASP.NET Core?
- Czym jest Kestrel?
- Opisz ASP.NET MVC request pipeline.
- Jak w ASP.NET WebAPI dostosować buforowanie danych (caching) odpowiedzi na żądania HTTP?
Zarządzanie pamięcią
- Czym jest stos i sterta? Wymień różnice i zasady działania.
- Jak działa Garbage Collection?
- Do czego służy słowo zastrzeżone using у C#, skoro .NET ma automatyczne zarządzanie pamięcią? Co ma do tego disposable pattern i po co jest tak skomplikowany pattern do zasobów niezarządzanych i zarządzanych?
- Co wyróżnia zasady działania Large Object Heap?
Typy danych, kolekcje i struktury danych
- Kiedy jest generowana klasa generyczny konkretnego typu — podczas wykonania programu czy na etapie kompilacji?
- Czym jest refleksja
- Opowiedz o kolekcji LinkedList<T>. Czym się różni od innych kolekcji?
- Czym jest indeksator?
- Co to jest immutable object? jakie korzyści wiążą się ze stosowaniem immutable object? Zaproponuj sposób jego implementacji w.NET.
- Kiedy używamy StringBuilder, a kiedy string? Jak działa StringBuilder?
- Czy jest zrównoważenie drzewa?
- Czym są bazy Key-value?
- Co to jest funkcja skrótu (hash function) i do czego służą tablice mieszające (hash table)?
- Idealna funkcja skrótu – jakie powinna mieć właściwości?
- Czym są kolizje i jak sobie z nimi radzić?
- Na czym polega trudność operacji CRUD w Dictionary<K,V> w .NET?
- Gdzie są przechowywane tablice? Tablice zawierające prymitywne typy danych?
- Na czym polega różnica między tablicą (T []) a listą (List<T>)?
- Na czym polega różnica między IList<T> a IEnumerable<T>?
- Do czego służą Enumerable, Observable, AsyncEnumerable oraz jakie modele zbierania danych implementują?
- Na czym polega różnica między IEnumerable a IQueryable?
- Czym jest enum flags?
Bazy danych
- Opowiedz o postaciach normalnych w systemie zarządzania relacyjną bazą danych (RDBMS).
- Czym jest indeks w bazie danych?
- Kiedy warto rozważyć wykorzystanie indeksów? Zalety i wady wykorzystywania.
- Jakie są rodzaje indeksów? Czym się różnią?
- Czym jest ACID?
- Jakie wyróżniają poziomy izolacji transakcji?
- Czym jest execution plan w MS SQL?
- Problem: wykonywania zapytania zabiera bardzo dużo czasu. Jakie są metody zdiagnozowania problemów i rozwiązywania?
- W jaki sposób ORM (Entity Framework czy Entity Framework Core) przekodowują C# w język zapytań, przy pomocy którego komunikujemy się z bazą danych? Co do tego służy?
Równoległość
- Do czego służy .ConfigureAwait?
- Na przykład, jest serwer WWW, który na podstawie żądania HTTP dokonuje analizy bazy danych. Łącznie na serwerze jest 16 wątków (threads). Każdy HTTP-request wysyła żądanie (request) do bazy danych i czeka na odpowiedź, wtedy wątek zostaje zablokowany. Czy możemy zoptymalizować działanie za pomocą zasobów.NET?
- Do czego służy ThreadPool? Opisz mechanikę działania.
Pytania rekrutacyjne na Senior
Ogólne
- Jakie jeszcze podejścia, oprócz programowania obiektowego, stosowałeś (AOP, FP ect.)?
- Wymień trzy najtrudniejsze problemy, które musiałeś rozwiązać. Jak to zrobiłeś? Jak doszedłeś do tej decyzji?
- Co to jest luźno powiązany kod? W czym jest lepszy od silnie powiązanego? Jak osiągnąć luźniejsze powiązanie kodu?
- Jak zastosowanie klas statycznych wpływa na powiązania kodu?
- Jak zmierzyć wydajność kodu? Czy mierzenie wydajności wpływa na wydajność?
- Do czego służą i jak działają Multi-Stage Builds w Docker?
- Jak zrozumieć, że któryś fragment kodu wykorzystuje dużo pamięci lub wykonanie zajmuje zbyt dużo czasu? Zidentyfikuj „wąskie gardła” (bottleneck) w różnych przypadkach? Jakie są sposoby na zmniejszenie zużycia pamięci?
- Jakbyś zaimplementował cross-cutting concern (na przykład: logowanie, walidacja, transakcje)?
- Opowiedz o Rest Maturity Model.
- Czym jest CPU i IO-bound?
- Czym jest marshalling?
- Jak działa async/await (szczegółowo)? Dlaczego nie należy używać async void?
Platforma .NET
- Jak działa lock? Czy wykorzystywać struktury wewnątrz słowa kluczowego “lock”?
- Czym jest Expression Tree?
- Jak działa Garbage Collection (szczegółowo)? Dlaczego w GC zostały zdefiniowane 3 pokolenia, a nie powiedzmy pięć, dziesięć lub dwa?
- Jakbyś zorganizował trasowanie (routing) interfejsów Web API?
- Jak w .NET Core można dostosować przechowywanie secrets na komputerach developerów i w środowiskach produkcyjnych?
- Jakbyś zorganizował proces CI/CD .NET Core umożliwiający wdrażanie w środowisku chmurowym?
- Jak włączyć mechanizm CORS w AspNetCore?
Typy danych, kolekcje i struktury danych
- W jaki sposób zostały zaimplementowane generyki?
- Jak stworzyć własny typ immutable?
- Jak działa IEnumerable<T> (szczegółowo)?
- Jaki algorytm jest stosowany w kolekcji STACK?
- Jakie struktury danych sam zaimplementowałeś dla platformy .NET? Opowiedz, czym różniły się one od standardowych implementacji.
- Czym różni się interfejs od klasy abstrakcyjnej? W jakich przypadkach byłyby używane obydwie opcje?
- Dlaczego struktury nie mogą domyślnie zawierać konstruktorów?
Bazy danych
- W jaki sposób są przechowywane dane w bazach danych??
- Jakie znasz rodzaje baz danych?
- Jakie bazy danych warto wykorzystywać i kiedy?
- Co to jest denormalizacja?
- Kiedy i jakie poziomy izolacji transakcji można wykorzystywać?
- W jakie sposób w popularnych systemach zarządzania relacyjną bazą danych (RDBMS) są implementowane ACID (SQL Server, PostgreSQL ect.)?
- Czy musiałeś optymalizować zapytanie w bazie danych? Jeśli tak, to w jaki sposób?
- Opisz, co wiesz o potencjalnych problemach, wynikających z równoległych zapytań (parallel query) do bazy danych.
- Jaką bazę danych wybrać do implementacji mechanizmu distributed lock? Opowiedz o szczegółach implementacji.
Mikroserwisy
- Jakie problemy rozwiązują mikroserwisy?
- Jakie są sposoby komunikacji między nimi?
- Opowiedz, jakie są sposoby na implementację transakcji rozproszonych w mikroserwisach.
- Czym jest circuit breaker?
- W jaki sposób będziesz debugować system, składający się z wielu mikroserwisów, jeżeli będziesz musiał prześledzić całą ścieżkę przetwarzania zapytań?
- Czym jest broker komunikatów? Czym jest semantyka at-least-once, at-most-once? Czy są jakieś brokery realizujące semantykę exactly-once?
- Jaki jest powinien działać kod klienta brokera w zależności od wybranej semantyki?
- Jakie znasz narzędzia do obsługi kolejek (zarówno w .NET, jak i osobne produkty), jakie narzędzie / produkt wybrałbyś i dlaczego?
MS Azure
- Jakie rodzaje serwisów występują w Service Fabric?
- Jakie występują ograniczenia i cechy charakterystyczne Azure Table Storage?
- Jak poradzić sobie z problemem zimnego startu Azure Functions?
- Na czym polega różnica między kolejkami a tematami w Azure Service Bus?
Zadania praktyczne
Junior only
- Opisz, jakbyś stworzył kalkulator. Jeżeli trzeba będzie dodać rzymski system liczenia, co będziesz robił?
- Napisz program, który według założenia powinien stwierdzać, czy liczba jest liczbą pierwszą.
- Wyszukaj element najmniejszy tablicy.
- Uporządkuj struktury folderów w systemie plików.
- Napisz program, symulujący fizz-buzz.
- Opowiedz, co robi poniższy kod i zaproponuj sposoby na poprawę jego jakości.
a)
public bool IsArrayEmpty(string[] array)
{
if (array.Length > 0)
return false;
else
return true;
}
b)
protected string GetClass(object url)
{
string result = string.Empty;
if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url == url.ToString())
result = "class=\"active\"";
return result;
}
Middle
- Napisz program, który służy do replikacji ciągu Fibonacciego dla z góry określonej liczby.
- Zaprojektuj bazę danych lekarzy i pacjentów w SQL. Stwórz stored procedure albo zapytanie w SQL, które zwróci lekarzy, którzy mają więcej niż N pacjentów.
- Sprawdź kolekcję pod kątem występowania duplikatów.
- Zaprojektuj thread-safe klasę Singleton w C#.
- Trzeba zapisać jakąś encję (entity) w bazie danych і wysłać komunikat do brokera komunikatów. Jak to zrobić i jednocześnie zminimalizować ryzyko utraty danych?
- Są trzy serwisy. Wysyłane jest żądanie HTTP do pierwszego serwisu. Pierwszy powinien zapisywać dane do drugiego serwisu, a drugi do trzeciego. W jaki sposób możemy zagwarantować, że w przypadku tak złożonej komunikacji dane nie zostaną utracone? W jakie sposób można zapobiec duplikacji?
- Czy poniższy kod będzie działał i dlaczego?
a)
SomeClass myClass = null;
myClass.SomeMethod();
b)
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;
}
}
Senior
- Jakbyś zaprojektował serwer FTP? Web serwer? Hosting obrazków z podziałem praw dostępu? System, składający się z front-office i back-office? Utwórz klon dowolnej popularnej sieci społecznościowej (Instagram, Facebook ect.)
- Załóżmy, że mamy encję (entity) umowy (Bid). Umowa zawiera listę partnerów, z którymi ta umowa jest zawierana. Umowy są przechowywane w serwisie umów (bidding service), a partnerzy – w swoim serwisie (partners service). I kiedy jest wyświetlana lista umów, ekran startowy powinien pokazywać liczbę partnerów. Jakbyś zaprojektował zapisywanie i przedstawianie tego licznika?
- Zadanie z LINQ: z wyjściowej kolekcji danych trzeba otrzymać nową kolekcją spełniającą określone wymagania (na przykład, posortowaną, niezawierającą duplikatów).
- Napisz program, który ma sprawdzić czy diagram sudoku (9x9) jest poprawnie wypełniony.
- Zaimplementuj swój Select, Where, SelectMany ze wszystkimi charakterystykami LINQ (odroczone wykonanie, natychmiastowa (eager) weryfikacja danych wyjściowych).
- Za pomocą LINQ napisz metodę, która zwróci elementy kolekcji podzielne bez reszty przez N, posortowane od największej wartości do najmniejszej. Sygnatura metody: List<int> Filter(IEnumerable<int> collection, int n);.
- Napisz funkcję, która zwróci sumę wszystkich parzystych elementów tablicy przekazanej do funkcji (JavaScript).