C++ Developer – pytania rekrutacyjne + odpowiedzi
Choć nie brakuje głosów, że od C i C++ powinno odchodzić się na rzecz nowocześniejszych języków, przede wszystkim Rusta, to jednak pozostają one i zapewne jeszcze długą będą najpopularniejszymi językami wykorzystywanymi do programowania niskopoziomowego.
C++, bo na nim się dziś skupimy, na próżno szukać w czołówce najpopularniejszych języków (jego znajomość deklaruje 11% ankietowanych w naszym Badaniu Społeczności IT), a jednak – pewnie za sprawą, że naucza się go na uczelniach, cieszy się on niesłabnącą pozycją. I zapewne jeszcze wiele wody upłynie, zanim na poważnie takie inicjatywy, jak niedawny postulat CTO MIcrosoft Azure, według którego wszystkie nowe projekty wymagające programowania niskopoziomowego powinno rozpoczynać się już nie z użyciem C lub C++, lecz właśnie Rusta.
Widać to także po realiach rynku pracy. Ofert pracy dla C++ Developerów są liczne i zróżnicowane, warto więc pochylić się nad kwestią tego, jak przebiegać może rozmowa rekrutacyjna na takie stanowisko. Przede wszystkim zaś warto przywołać najpopularniejsze pytania rekrutacyjne wraz z odpowiedziami oraz zasygnalizować zagadnienia, jakie mogą być poruszane na kolejnych etapach procesów rekrutacyjnych.
C++ Developer w Polsce
Zanim jednak przejdziemy do konkretów dotyczących przebiegu rozmowy rekrutacyjnej, zastanówmy się na moment, jak dziś rysują się perspektywy i możliwości pracy C++ Developera w rodzimej branży. Przede wszystkim, co raczej nie powinno dziwić, C++ wykorzystywany jest na największą skalę przez developerów programujących systemy wbudowane – język ten wykorzystuje w podobnych celach 51% programistów, którzy wzięli udział w Badaniu Społeczności IT. C++ nieznacznie wyprzedza zatem klasyczne C, z którego korzysta 44% developerów. Ponadto jest także niewielki odsetek developerów (4,1%), który C++ wykorzystuje do prac nad backendem.
A jak to przekłada się na zarobki C++ Developerów? Otóż zarobki netto przy współpracy na podstawie umowy o pracę (netto oznacza tu więc kwotę, która faktycznie trafia do kieszeni pracownika, kwotę „na rękę”) wynoszą średnio 8857 zł miesięcznie. Jest więc to w tej chwili czołówka najlepiej wynagradzanych przy tej formie współpracy języków – plasuje się on na 5. miejscu po Go, Swifcie, Kotlinie oraz C. Inaczej sytuacja maluje się w przypadku współpracy B2B – C++ w takim formacie zarabia średnio 18 446 zł, co plasuje go dalej, w środku stawki. Gwoli jasności – rzeczona kwota to kwota netto na fakturze. Należy więc z niej opłacić jeszcze podatki i ubezpieczenie.
Frameworki, biblioteki i narzędzia C++
Przejdźmy do konkretów. Poza samym przygotowaniem się w zakresie najpopularniejszych pytań, warto odświeżyć sobie informacje o ogólnych kwestiach, np. o tym, jakie narzędzia są wykorzystywane przez C++ Developerów. Dobrym punktem wyjścia może być zorientowanie się, jakie są dziś najpopularniejsze frameworki, narzędzia czy biblioteki programistyczne wykorzystywane w tym języku.
- Boost– z Badania Społeczności IT jasno wynika, że jest to zdecydowanie najpopularniejsze narzędzie wykorzystywane przez C++ Developerów. Boost to aktywnie rozwijany zestaw licznych bibliotek znacząco rozszerzających podstawowe możliwości C++. Znajdziemy tu w zasadzie wszystko, od bibliotek ogólnego przeznaczenia, które sprawdzą się niemal w każdym projekcie, po te dalece wyspecjalizowane. Znajdziemy tu zatem biblioteki znacząco ułatwiające metaprogramowanie, umożliwiające wykorzystanie konteneryzacji, efektywniejszą obsługę błędów i wiele, wiele innych. Boost jest chwalone także za licencję, której mało restrykcyjne postanowienia nie narzucają na programistów nadmiernych ograniczeń.
- Qt – ceniony multiplatformowy framework i zestaw narzędzi developerskich wykorzystywanych do projektowania graficznych interfejsów użytkownika. Qt jest powszechnie wykorzystywane także przez najpopularniejsze programy, zaś jego zaletą jest to, że raz przygotowany interfejs niewielkim nakładem pracy można wykorzystywać w oprogramowaniu kierowanym na Windowsa, Linuksa i macOS-a, a nawet w przypadku aplikacji mobilnych. Znajdziemy tu liczne elementy, templatki i animacje, dzięki którym zaprojektowanie GUI dla programu napisanego w C++ jest wygodne i – co ważne – umożliwi dostarczenie go na różne systemy operacyjne. Bardzo dobra alternatywa dla ociężałych interfejsów aplikacji natywnych napisanych w z użyciem technologii webowych.
- Google Test – kolejnym narzędziem wykorzystywanym na dużą skalę przez programistów C++ jest Google Test, biblioteka służąca do jednostkowych testowania oprogramowania napisanego w tym języku. Wykorzystuje możliwości frameworku xUnit, zaś wśród kluczowych funkcji znajdziemy obsługę rozbudowanej listy asercji, również definiowanych przez samego testera. Google Test jest na dużą skalę wykorzystywany w takich projektach, jak Chromium czy kompilator LLVM.
- STL – biblioteka STL (Standard Template Library) zawiera zróżnicowane ustandaryzowane szablony, dla struktur danych, iteratorów, kontenerów. Sama biblioteka została podzielona na cztery w dużej mierze analogiczne do wymienionych elementów komponenty: algortytmy, kontenery, funkcje i iteratory. Zestaw klas dostarczany przez STL można stosować zarówno z typami wbudowanymi C++, jak i tymi, które zdefiniował programista – całość odbywa się z wykorzystaniem szablonów. Choć pierwsza wersja biblioteki została zaprezentowana 30 lat temu i była pierwszą tego rodzaju biblioteką dla C++, to jednak nie ma to wpływu na jej od wielu lat stabilną pozycję – niech świadczy o tym choćby fakt, że popularne dzisiaj kompilatory C++ zostały napisane tak, aby efektywnie kompilować kod napisany z użyciem STL.
C++ Developer – pytania rekrutacyjne i odpowiedzi
Zazwyczaj rozmowa kwalifikacyjna w kilku standardowych etapach: poza ogólnikami dotyczącymi samego języka należy także oczekiwać bardziej szczegółowych pytań technicznych. Może też okazać się, że kandydatowi zostanie przedstawiony kod i zostanie on poproszony o wyjaśnienie tego, jakie będzie miał rezultaty. W przypadku takich zadań należy zachować szczególną uważność i przywiązanie do detali – często zdarza się bowiem, że kod zawiera łatwy do przeoczenia a charakterystyczny dla danego języka element, którego przeoczenie poskutkuje udzieleniem błędnej odpowiedzi.
Oczywiście dużo będzie należeć od specyfiki oprogramowania, jakie docelowo ma rozwijać potencjalny kandydat, jednak można wytypować zasób konkretnych, bardziej szczegółowych pytań, które nagminnie przewijają się podczas rozmów kwalifikacyjnych na stanowisku C++ Developera. Poniżej prezentujemy przykłady.
Czym jest polimorfizm w C++?
Polimorfizm w C++ pozwala na to, aby zmienne, funkcje lub obiekty przybierały różne formy i wynika to bezpośrednio z zastosowania choć jednej metody wirtualnej w klasie. Dzięki temu programista może utrzymać kontrolę nad zachowaniem programu zarówno w czasie kompilacji, jak i w runtimie.
W pierwszym przypadku będziemy bowiem dysponować informacjami, która metoda zostanie wywołana, a wywołanie zostanie rozwiązane przez kompilator, co przekłada się na szybki czas wykonania. Dzieje się to z użyciem przeładowania operatorów, o którym szerzej za moment. W przypadku polimorfizmu w czasie życia programu wywołanie metody nie jest już obsługiwane przez kompilator, wykonanie jest wolniejsze, zaś w użyciu są wskaźniki i metody wirtualne.
Czym jest przeładowanie operatorów?
Przełądowanie operatorów (operator overload, tłumaczone także na polski jako przeciążenie to rodzaj polimorfmizmu. Jest on specyficzny dlatego, że operator może różnić się w zależności od tego, jakie zostały użyte argumenty. Wykorzystanie przeciążania operatorów to dobra praktyka w zakresie czytelności kodu – rozwiązuje problemy wynikające z sytuacji, gdy klasa będzie mieć wiele wartości i pozwala na przypisać operatory tak, aby działały bezpośrednio z daną klasą.
Czym jest wskaźnik?
Wskaźnik to zmienna, której wartość to adres w pamięci. W C++ z użyciem operatora & można uzyskiwać adres w pamięci danej zmiennej, zaś wskaźnik wykorzystuje się do jego przechowywania. Dzięki wskaźnikom można w wygodny sposób pobrać adres dowolnej zmiennej. Posługując się wskaźnikami, należy pamiętać, aby zawsze miał on przypisany prawidłowy adres – inaczej narażamy się na ryzyko naruszenia bezpieczeństwa związane z obsługą pamięci.
Wskaźniki znajdują zastosowanie ze względu na to, że nie ma możliwości wyboru konkretnego adresu w pamięci, w którym przechowywana jest zmienna – miejsce wskazuje się w procesie alokacji. Po alokowaniu można pobrać adres i zapisać w postaci wskaźnika, a następnie z jego użyciem dokonywać operacji na zmiennej.
Warto zaznaczyć, że wskaźniki uznaje się za jeden z mankamentów C++, stwarzają one także ryzyko dla bezpieczeństwa ze względu na możliwość pojawienia się błędów w obsłudze pamięci. Dobrą praktyką jest przeprowadzanie operacji na zmiennych w standardowy sposób, zaś sięganie po wskaźniki i adresy zmiennych w pamięci traktować należy jako ostateczność
Jakie są różnice pomiędzy strukturą a klasą?
Struktury w C++ są bardzo podobne do klas, jednak wykazują cechy, które przekładają się na bezpieczeństwo. I tak: o ile w przypadku struct funkcje składowe oraz specyfikatory dostępu dla bazowych klas i struktur są domyślnie ustawione jako publiczne, tak w przypadku klas wszystkie te elementy są domyślnie prywatne.
Czym w C++ jest konstruktor?
Konstruktory to funkcje składowe klasy, które mają taką samą nazwę jak klasa. Są one wywoływane, gdy powstaje obiekt i ułatwiają jej zainicjowanie – dzięki konstruktorom nie trzeba już tworzyć specjalnie publicznej funkcji w klasie i jej wywoływać. Tak konstruktory prezentują się w praktyce:
class MyClass { // Klasa
public: // Specyfikator dostęu
MyClass() { // Konstruktor
cout << "Hello World!";
}
};
int main() {
MyClass myObj; // Wywołanie konstruktora (utworzenie obiektu z MyCLassCreate)
return 0;
}
Podaj kluczowe różnice między C++ i C
Język C++ został opracowany jako rozwinięcie C i w wielu aspektach są one do siebie podobne. Celem twórców C++ było jednak rozwinięcie i usprawnienie pewnych aspektów C, w rezultacie czego pomiędzy językami wskazać można kilka zasadniczych różnic:
- Jedna z najważniejszych różnic wynika z relacji obu języków – C jest bowiem podzbiorem C++, w pewnym sensie jego elementem składowym. C++ ma zatem wszystko, co ma C i dodaje więcej.
- C++ to język obiektowy, C to język imperatywny.
- C++ obsługuje przeładowanie operatorów i funkcji, C nie.
- Przestrzenie nazw są obsługiwane przez C++, ale nie w C.
- W C++ funkcje mogą być definiowane wewnątrz w struktur, co jest niemożliwe w C.
Czym jest destruktor?
Destruktor to instancja funkcji składowej, która jest wywoływana automatycznie, jeśli jakiś obiekt ma zostać zniszczony. Służy ona przede wszystkim do dealokacji pamięci. Destruktory w C++ nie mają argumentów i nie zwracają typów, nie może zostać także pobrany ich adres. Mogą zostać zadeklarowane jako virtual lub pure virtual, ale nie jako const, volatile, const volatile or static.
Przydatne linki
Tradycyjnie zamiast podsumowania, wszystkich zainteresowanym rozwojem w kierunku C++ polecamy artykuły, które mogą okazać się bardzo przydatne: