PytaniaPyt NR.1 Cześć! Dzisiaj postanowiłem napisać coś na temat rozmów kwalifikacyjnych. Ludzie prosili mnie o to, od kiedy napisałem wpis na temat szukania pracy w Warszawie po raz pierwszy. Ciekawa lektura dla tych, którzy skończyli studia inżynierskie i szukają pracy w wielkim mieście.

Przejdźmy jednak do pytań. Bo jakie pytania możesz dostać szukając po raz pierwszy pracy jako programista. Jeśli więc szykujesz się rozmowę mam nadzieję, że to ci pomoże.

Pytania są banalne. Postanowiłem na razie opisać te najbardziej oczywiste.

Pytanie 1: Wyjaśnij różnice pomiędzy klasą a obiektem

Klasa jest definicją obiektu, a obiekt jest instancją klasy.

Klasa jest szablonem obiektu. Opisuje wszystkie właściwości, metody, stany, zachowania, które obiekt będzie miał. Obiekt jest instancją klasy i klasa nie stanie się obiektem dopóki nie zostanie zainicjalizowana. Może być więcej instancji obiektu bazujących na jednej klasie. Każda z nich będzie miała jednak inne stany wynikające z różnicy wartości właściwości.

Pytanie 2: Wyjaśnij różnice pomiędzy typem wartościowym a typem referencyjnym

Typ referencyjny przetrzymuje zbiór informacji, który określamy obiektem. Natomiast typ wartościowy przetrzymuje jedną wartość.

Typ referencyjny można porównać do całej kartki papieru, w której można umieścić wiele danych w zależności od tego, jak wygląda jego klasa. Natomiast typ wartościowy w takim wypadku reprezentowałby jedną wartość cyfrową, bitową albo logiczną.

Różnica ta jest widoczna przy przypisywaniu zmiennych

int a = 1;
int b = a; //kopiowanie

a = a + 12; //  13
b = b - 12; // -11

Demo d1 = new Demo();
Demo d2 = d1; 
// referencja do tego samego obiektu

Pytanie 3: Wyjaśnij różnicę pomiędzy pętlą while a pętlą for

Obie pętle są używane do wykonywania bloku kodu, który zostanie wykonany wielokrotnie. Pętla for przydaje się wtedy, gdy wiesz ile dokładnie iteracji będzie potrzebne. Natomiast pętla while określa ile raz coś ma być wykonane dopóki pewien warunek jest prawdziwy.

Składnia pętli while.

bool boolean = true;
int i = 0;

while (boolean)
{
    if (i >= 9)
        boolean = false;


    Console.WriteLine(i);
    i++;
}

Składnia pętli for

for (zmienna ; warunek ; iterator)
{
  // blok kodu
}

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(i);
}

Pytanie 4: Wyjaśnij wypakowanie i pakowanie wartości tzw. boxing i unboxing

Pakowanie jest to proces, w którym typ wartościowy jest konwertowany na typ obiektowy. Wypakowywanie jest to proces pobrania typu wartościowego z obiektu. Pakowanie jest niejawne. Natomiast wypakowywanie jest jawne.

int i = 21;
object myObj = i;     // boxing 
i = (int)myObj;    // unboxing 

Pytanie 5: Wyjaśnij różnicę pomiędzy stałą a wartością tylko do odczytu

Stałe i wartości do odczytu posiadają wiele cech wspólnych, natomiast ważne są różnice.

  • Stałe są skompilowane do biblioteki. Wartości tylko do odczytu są ustawiane tylko raz przy starcie aplikacji.
  • Stałe wspierają tylko typy wartościowe. Wartości tylko do odczytu mogą przetrzymywać referencję do obiektów
  • Stałe powinny być używane, gdy ich wartość nigdy się nie zmieni. Wartości tylko do odczytu powinny być używane wtedy, gdy chcemy je ustawić raz w trakcie wykonywania programu.

Oto fragment kodu potwierdzający wszystko to, co napisałem

public class Demo
{
    public const double Pi = 3.13;

    public readonly Point Point = new Point();

    public readonly int Random = new Random().Next(100);
}

Pytanie 6: Co to jest LINQ ?

LINQ jest to akronim od Language Intergrated Query. Został on przedstawiony w .NET 3.5 i w C# 3.0.

LINQ zawiera zbiór funkcjonalności i składni, która pozwala na tworzenia zapytań do zbiorów danych niezależnie od ich źródła. Źródła danych są następujące: bazy dane SQL Server, DataSet ADO.NET, dokumenty XML oraz każda kolekcja, która dziedziczy i wspiera interfejsy IEnumerable i IEnumerable<T>.

Dodatkowo dzięki LINQ do C# zostały wprowadzone metody rozszerzeniowe oraz wyrażenia lambda. (To może być osobne pytanie)

Pytanie 7: Czym jest Garbage Collector i jak on działa ?

Garbage Collection jest to ukryty proces w każdej .NET aplikacji, który automatycznie zarządza pamięcią. Za każdym razem, gdy nowy obiekt zostaje utworzony ten obiekt alokowany w pamięci na stercie.

Tak długo jak pamięć jest wolna aplikacja może działać. Każdy nowy obiekt zostanie umieszczony w pamięci. Pamięć oczywiście nie jest nieskończona.  Dlatego trzeba coś z pamięci także usuwać.

Garbage Collector sprawdza więc jakie obiekty nie są już używane. Jeśli nie ma zmiennych referujących się do obiektu oznacza to, że nie jest on już potrzebny. Jest on wtedy usuwany z pamięci.

Garbage Collector wtedy zatrzymuje wszystkie wątki znajduje obszar alokacji i kasuje obiekt. Przestrzeń w pamięci może być potem ponownie wykorzystana.

Można wymusić sprzątanie kodu poprzez komendę

System.GC.Collect();

Nie jest to jednak zalecane ponieważ proces ten zazwyczaj działa jak najlepiej może.

Pytanie 8: Co to jest IL, JIT, CLI ?

Oto pytanie z kategorii : myślałem, że będą mnie pytać tylko o kod.

IL jest to skompilowany kod przykładowo języka C#. Nie jest to jednak jeszcze ten kod asemblera.  Kod IL zostanie później skompilowany do kodu natywnego maszyny, używając obecnego środowiska innego kompilatora Just-In-Time (JIT).

JIT tłumaczy więc kod IL na kod asemblera. Kod asemblera będzie używany przez procesor.

CLI albo Commmon Language Infrastructure jest to specyfikacja stworzona przez Microsoft. To ten mechanizm zajmuje się tworzeniem i wersjonowaniem bibliotek w systemie Windows.

W .NET mamy typy CLI : proces EXE, oraz biblioteki DLL.  CLI umieszcza więc kod do tych dwóch typów.

Ułóżmy to w sensowną kolejność

  • Skompilowany kod C# jest kodem IL. 
  • Kompilator JIT generuje kod maszynowy na podstawie kodu IL
  • CLI umieszcza ten kod w odpowiedniej formie
  • Potem komputer wykonuje kod na podstawie kodu maszynowego zapisanego jako EXE albo DLL.

Pytanie 9: Wyjaśnij czym jest dziedziczenie i jakie ma zalety?

Dziedziczenie jest to jedno z najbardziej popularnych koncepcji w języku obiektowym razem z hermetyzacją oraz polimorfizmem. Dziedziczenie pozwala programistom na tworzenie nowych klas i na ponownym ich używaniu, rozszerzaniu i modyfikowaniu zachowań klas już istniejących.

Co można ponownie użyć: konstruktory, metody i właściwości z klasy pochodnej.

public class Parent
{
    public int MyProperty { get; set; }

    public Parent(int a)
    {
        MyProperty = a;
    }

    public Parent()
    {}
}

public class Child : Parent
{
    public Child() : base(12)
    {}

    public Child(int a) :
        base(a)
    {}
}

Pytanie 10: Wyjaśnij różnicę pomiędzy Interfejsem a klasą abstrakcyjną

Interfejs deklaruje kontrakt lub zachowanie, które dana klasa implementująca ten interfejs musi mieć. Interfejs może deklarować tylko właściwości, metody oraz zdarzenia bez modyfikatorów dostępu ponieważ wszystko będzie publiczne.

Wszystkie elementy z interfejsu muszą być zaimplementowane.

Klasa abstrakcyjna może dać tylko częściową implementację z funkcjonalnością oraz abstrakcyjne metody właściwości, które będą musiały zostać określone w klasie dziedziczącej. Klasa abstrakcyjna i interfejs nie może zostać utworzony.

public interface IA
{
   int MyProperty { get; set; }

   void Methdo();
}

public abstract class Aa
{
    public abstract int MyProperty { get; set; }

    //ok
    public  int MyProperty2 { get; set; }

    public abstract void Methdo();

    public void Methdo2()
    { 
        //kod
    }
}

Pytanie 11: Czym jest delegata?

Delegata w .NET jest podobna do wskaźnika z C lub C++. Używając delegaty pozwalasz programiście przesłać referencję do metody, która będzie przetrzymywana przez obiekt. Obiekt delegaty może być potem przesyłany dalej. Na poziomie kompilacji ani ty, ani kompilator nie musicie wiedzieć jaka metoda zostanie wykonana w tej delegacie.

Więcej o delgatach jest w tym wpisie.

To byłoby na tyle

Tyle razy byłem o to proszony, więc postanowiłem stworzyć wpis z pewnymi pytaniami dla początkujących poszukiwacz pracy.

Niestety te 11 pytań to dopiero przymiarka.