poniedziałek, 25 kwietnia 2011

What great .NET developers ought to know - odpowiedzi

Kilka lat temu Scott Hanselman opublikował listę pytań, na które każdy szanujący się developer powinien znać odpowiedź. Ja miałem okazję zetknąć się z tymi pytaniami w praktyce podczas rekrutacji do duńskiej firmy, w której przepracowałem później trzy lata.

Nieraz rekruter może nas zaskoczyć pytaniem zupełnie z innej bajki. Najdziwniejsze pytanie, jakie sam usłyszałem to: "wymień i omów rodzaje sortowania". Hmm w dzisiejszych czasach znajomość tego powinna być wymagana jedynie przez studentów i wykładowców na uczelni, a tu proszę taki kwiatek. W dobie .NET prawidłową odpowiedzią na to pytanie powinno być po prostu: Array.Sort :). Innym przykładem było określenie na papierze parametrów metody BeginInvoke(..). To też nieco absurdalne pytanie, bo to że nie pamiętam kolejności parametrów wcale nie oznacza, że nie znam tej metody i nie wiem dokładnie co robi! Po prostu nie przykładam wagi do kolejności parametrów... Ogarnijcie się, rekruterzy!

Poniżej znajduje się lista pytań i odpowiedzi, które z jakiegoś powodu okazały się być ważne dla Duńczyków.

Everyone who writes code

  • Describe the difference between a Thread and a Process?Proces to kolekcja wątków, działający w tym samym obszarze pamięci wirtualnej. Proces posiada co najmniej jeden wątek, a wątek zawsze działa w kontekście procesu.
  • What is the difference between an EXE and a DLL?EXE to plik wykonywalny, a DLL (Dynamic Link Library) to biblioteka współdzielona, której funkcjonalność może być wykorzystywana dynamicznie przez plik wykonywalny. DLL nie jest samodzielnym programem.
  • How many processes can listen on a single TCP/IP port?Jeden.
  • What is the GAC? What problem does it solve?Global Assembly Cache to repozytorium współdzielonych bibliotek platformy CLR. Aby dodać DLL do GAC, musi ona posiadać strong name. Rozwiązuje problem wersjonowania DLL-ek i tzw. „DLL hell”.

Mid-Level .NET Developer

  • Describe what an Interface is and how it’s different from a Class.Interfejs definiuje kontrakt i publiczne definicje elementów, jak metody, właściwości, zdarzenia, ale nie zawiera implementacji, tak jak czyni to klasa. Nie można stworzyć instancji interfejsu, klasy - tak. Klasa może implementować więcej niż jeden interfejs, ale może dziedziczyć tylko z jednej klasy.
  • What is Reflection?Reflection w .NET daje nam możliwości dynamicznego ładowania bibliotek czy tworzenia typów podczas działania programu - można tworzyć instancje klas i wywoływać metody, które nie były znane w trakcie kompilacji. Dzięki refleksji jesteśmy w stanie w łatwy sposób tworzyć rozszerzalne aplikacje (wtyczki, pluginy itp.).
  • Conceptually, what is the difference between early-binding and late-binding?Early-binding kompiluje kod i referencje. W late-binding typy z których korzystamy określane są w locie, co sprawia, że late binding może być nawet kilkanaście/dziesiąt razy wolniejszy. Przykład:obiekt.Metoda() to early-binding.Type t; t.InvokeMember("Metoda") to late binding.
  • How is a strongly-named assembly different from one that isn’t strongly-named?"Strongly-named" to biblioteka, która została podpisana parą kluczy - publicznego i prywatnego. Taki plik może zostać umieszczony w Global Assembly Cache. Podpisane biblioteki pomagają przy wersjonowaniu i weryfikacji bezpieczeństwa.
  • Is this valid? Assembly.Load("foo.dll");Nie. Assembly.Load() oczekuje nazwy assembly, a nie nazwy pliku.
  • Can DateTimes be null?Nie. DateTime to struktura, czyli typ wartościowy, który nie może być nullem.
  • What is the difference between Finalize() and Dispose()?Finalize() jest wywoływane przez Garbage Collectora w momencie gdy nie ma już żadnych referencji do danego obiektu w pamięci - w .NET jest to praktycznie równoznaczne z destruktorem i programista nie ma nad wywołaniem Finalize() kontroli (może jedynie zawiesić poprzez GC.SuppressFinalize()).Metodę Dispose() wywołuje programista (np. wykorzystując dyrektywę using) w celu zwolnienia zasobów jak uchwyty do plików czy połączenia do baz danych. Jeśli tego nie zrobi, obiekt będzie rezydował w pamięci (tzw. memory leak), ponieważ GC nie jest w stanie tego zrobić samemu w metodzie Finalize().
  • What technology enables out-of-proc communication in .NET?.NET remoting.

Senior Developers/Architects

  • What's wrong with a line like this? DateTime.Parse(myString);Data może być przekazywana w różnych formatach, np. dd/mm/yyyy (Polska) lub mm/dd/yyyy (USA), więc brakuje informacji na temat formatu (kultury) stringa. Taka operacja może wyrzucić wyjątek, więc lepiej jest korzystać np. z DateTime.TryParse.
  • What are PDBs? Where must they be located for debugging to work?PDBs to "program database files" i zawierają powiązania między DLL-ką lub plikiem wykonywalnym EXE, a kodem źródłowym.
  • Why is catch(Exception) almost always a bad idea?W tej konwencji nie zrobimy nic z wyjątkiem, nie wykorzystamy informacji jakie ze sobą niesie. Gdy wystąpi nieoczekiwany wyjątek (którego się nie spodziewamy w danym miejscu), jak StackOverflowException czy OutOfMemoryException (które mogą wystąpić zawsze i wszędzie podczas działania aplikacji), to nie dostaniemy na ten temat informacji.
  • What is the difference between Debug.Write and Trace.Write? When should each be used?Debug.Write będzie skompilowany w trybie Debug i wyświetli informację w oknie Debug. Trace.Write może być wykorzystywany również w trybie Release przez tzw. trace listeners.
  • What is the difference between a Debug and Release build? Is there a significant speed difference? Why or why not?Tryb Debug posiada symbole debugowania, podczas gdy Release ich nie posiada, nie zawiera opcjonalnych metod [Conditional("DEBUG")]. Powinno mieć miejsce przyspieszenie działania aplikacji.
  • Contrast the use of an abstract base class against an interface?Klasa abstrakcyjna może zawierać implementację, ale nie może być utworzona jej instancja - musi powstać inna klasa, dziedzicząca z klasy abstrakcyjnej. Intefejs nie posiada żadnej implementacji (ponieważ jest to kontrakt), a klasa go implementująca musi posiadać ciało wszystkich jego składowych.
  • How would one do a deep copy in .NET?Należy zaimplementować interfejs ICloneable i wywołać metodę Clone(), w której dokonamy kopii składowych klasy, korzystając m.in z metody MemberwiseClone().
  • What is boxing?Boxing (czyli opakowywanie) umożliwia traktowanie typów wartości (value type) jako obiektów (reference type). Przykład:int i = 1;object o = i; // boxingint j = (int) o; // unboxing
  • Is string a value type or a reference type?Bardzo podchwytliwe i częste pytanie na wszelkiego rodzaju testach. String to typ referencyjny - można to sprawdzić, przypisując null do stringa (value type nie przyjąłby null-a).
  • Why are out parameters a bad idea in .NET? Are they?Parametr out może nie zostać zainicjowany, jeśli metoda najpierw wyrzuci wyjątek. Zbyt duża liczba parametrów out (moim zdaniem powyżej 1) świadczy o złym design'ie klasy - poza tym wygląda jest to nieczytelne.

C# Component Developers

  • Explain the differences between public, protected, private and internal.Public – każdy ma dostęp do pola, metody czy właściwości. Protected – tylko klasy pochodne. Private – tylko dana klasa. Internal – są dostępne/widoczne wyłącznie w danym assembly.
  • What is the difference between: catch(Exception e){throw e;} and catch(Exception e){throw;}Drugi zapis zachowa historię wyjątku (exception stack), dzięki czemu nie tracimy cennych danych o błędzie w aplikacji. Należy unikać stosowania pierwszego zapisu,
  • Explain what's happening in the first constructor: public class c{ public c(string a) : this() {;}; public c() {;} } How is this construct useful?Pierwszy konstruktor wywołuje konstruktor bezparametrowy tej samej klasy. Taki zapis ogranicza duplikowanie kodu.
  • What is this? Can this be used within a static method?To referencja do aktualnego obiektu, w kontekście którego się znajdujemy. Metody statyczne nie mogą mieć do niego referencji, ponieważ są bezstanowe.

Developers using XML

  • When is the DOM appropriate for use? When is it not? Are there size limitations?DOM nadaje się do modyfikowania treści małych dokumentów. Z powodu słabej wydajności nie stosuje się go do dużych dokumentów. Nie ma limitów rozmiaru.
  • What is the difference between XPathDocument and XmlDocument? Describe situations where one should be used over the other.XPathDocument nie jest edytowalny, za to pozwala na szybkie wykonywania zapytań w oparciu o XPath i do tego powinien być wykorzystywany. XmlDocument lub nowszy XDocument służą do tworzenia i edycji plików XML.
  • Can any XML Schema be represented as an object graph? Vice versa?Tak.

Brak komentarzy: