Podstawowe pytania obejmują:
Myślę, że zwykle pomaga poprosić wnioskodawców o wykonanie prostego ćwiczenia kodowania, takiego jak:
- Napisz własną klasę list połączonych bez korzystania z klas wbudowanych.
- Napisz własną klasę hashtable bez korzystania z wbudowanych klas.
- Napisz klasę reprezentującą drzewo binarne. Napisz metodę, która przetnie wszystkie węzły drzewa.
- Napisz metodę wykonywania wyszukiwania binarnego na tablicy bez użycia wbudowanych metod.
- Narysuj schemat bazy danych dla bloga. Każdy użytkownik ma tylko jednego bloga, każdy blog ma wiele kategorii, każda kategoria ma wiele postów, a każdy post może należeć do więcej niż jednej kategorii. Poproś wnioskodawcę o napisanie zapytań w celu wyciągnięcia określonych informacji.
Następnie poszukaj konkretnej wiedzy technicznej:
- (Procedury obsługi zdarzeń) Utwórz klasę za pomocą niestandardowej procedury obsługi zdarzeń, utwórz inną klasę, która podpina się do niestandardowej procedury obsługi zdarzeń.
- (XML) Załaduj dokument XML i wybierz wszystkie węzły o właściwościach x, yiz.
- (Programowanie funkcjonalne) Utwórz funkcję, która akceptuje inną funkcję jako parametr. Funkcja Map lub Fold działa naprawdę dobrze w tym przypadku.
- (Refleksja) Napisz funkcję, która określa, czy klasa ma określony atrybut.
- (Regex) Napisz wyrażenie regularne, które usuwa wszystkie tagi z bloku HTML.
Żadne z tych pytań nie jest szczególnie trudne dla kompetentnego programisty C # i powinny dać ci dobry obraz twoich kandydatów. Możesz także popracować nad kilkoma przykładami pytań / kodu, które wykorzystują określone wzorce projektowe.
[Edytuj dla wyjaśnienia] :
Wydaje się, że wiele osób nie rozumie, dlaczego zadawałem tego rodzaju pytania. Pozwolę sobie dotknąć komentarzy kilku osób (nie cytuję bezpośrednio, ale parafrazuję):
P: Kiedy ostatni raz ktoś używał substancji lotnych lub słabych referencji?
Odp .: Kiedy udzielam wywiadów technicznych, sprawdzam, czy dana osoba rozumie funkcje wysokiego i niskiego poziomu .NET. Substancje lotne i słabe referencje to dwie funkcje niskiego poziomu oferowane przez .NET - nawet jeśli te funkcje nie są często używane w praktyce, odpowiedzi na te pytania są niezwykle odkrywcze:
Dobre zrozumienie składników lotnych pokazuje, że dana osoba rozumie, w jaki sposób optymalizacje kompilatora zmieniają poprawność kodu, w jaki sposób wątki przechowują lokalne kopie współdzielonego stanu, które mogą być niezsynchronizowane w danym momencie, i są w minimalnym stopniu świadome niektórych złożoności wielowątkowego kodu .
Dobre zrozumienie słabych referencji pokazuje, że dana osoba wie o intymnych szczegółach śmieciarza i jak decyduje, kiedy zwolnić pamięć. Jasne, możesz zapytać kandydatów „jak działa śmieciarz”, ale pytanie o słabe referencje daje znacznie lepszą, bardziej przemyślaną odpowiedź.
.NET jest dość abstrakcyjnym językiem, ale programiści gwiazd prawie zawsze dobrze rozumieją CLR i szczegółowe informacje o środowisku uruchomieniowym .NET.
P: Dlaczego ktoś miałby wdrażać własną listę skrótów lub link?
Odp .: Nie sugeruję, że klasa Dictionary jest gorsza lub że ludzie powinni tworzyć własne tabele skrótów. Jest to podstawowe pytanie, które sprawdza, czy dana osoba ma minimalne zrozumienie struktur danych. Właśnie to sprawdzają te pytania: minimalne zrozumienie.
Dowiesz się o tych tabelach skrótów i połączonych listach pierwszego dnia Struktur danych 101. Jeśli ktoś nie może napisać tabeli skrótów lub listy połączonej od zera, to ma ogromną lukę w wiedzy technicznej.
P: Dlaczego te pytania są tak zorientowane na ludzi?
Odp .: Ponieważ tytuł tego wątku to „pytania, które powinien znać każdy dobry programista .NET”. Każdy programista .NET rozpoczyna swoją karierę od pisania aplikacji crud, a 90% wszystkich osób tworzących aplikacje, które zarabiają na życie, zajmuje się aplikacjami biznesowymi.
Myślę, że pytania testujące wiedzę osób na temat aplikacji biznesowych są w większości przypadków odpowiednie, chyba że szukasz programistów w bardzo specyficznych niszach, takich jak rozwój kompilatora, rozwój silnika gry, dowodzenie twierdzeń, przetwarzanie obrazów itp. .