Popularne pytania z rozmów wstępnych dla programisty C/C++

W tym wpisie podzielę się zbiorem pytań, które często powtarzają się na różnych rozmowach wstępnych na stanowisko programisty C/C++. Są to pytania techniczne - nie opisałem tu żadnych pytań miękkich (HR'owych). Spotkałem się z nimi sam (już prawie 10 lat pracy, jak ten czas leci..), a niektóre zadawałem osobiście, gdy byłem po drugiej stronie stołu. Mam nadzieję, że taka lista okaże się pomocna podczas przygotowań do rozmowy.

Na początek pytania związane stricte z C/C++. Kolejność losowa.

  • Czym jest język obiektowy? Czy C++ jest językiem obiektowym (odpowiedź na to, czy jest może się różnić w zależności od tego, jak definiujemy język obiektowy)?
  • Napisz program, który jest poprawny składniowo w C, a nie jest w C++.
  • Czym są słowa kluczowe (w kontekście zmiennej, w kontekście metody) static i const? Co oznacza słowo kluczowe volatile?
  • Czym różni się alokacja pamięci na stosie od alokacji pamięci na stercie? Jak zmienną na oba sposoby? Kiedy stosować jedno, a kiedy drugie?
  • Czym jest smart pointer? Kiedy go stosować? Jakie są rodzaje?
  • Co wypisze poniższy program? Dlaczego?
    #include <iostream>
    
    #define multiply(a, b) a*b
    
    int main()
    {
       std::cout << multiply(1, 2+2) << std::endl; 
       return 0;
    }
  • Co dodać do istniejącego kodu (można tylko w zaznaczonych miejscach), by program wypisywał:
    foo()                                                                  
    main()
    #include <iostream>
    static int foo();
    
    /* Tu można dopisywać swój kod */
    
    /* Koniec miejsca na dopisywanie */
    static int foo()
    {
        std::cout << "foo()" << std::endl;
        return 0;
    }
    
    int main()
    {
       std::cout << "main()" << std::endl; 
       /* Tu można dopisywać swój kod */
    
       /* Koniec miejsca na dopisywanie */
       return 0;
    }
    
  • Napisać metodę, która przyjmuje numer elementu ciągu Fibonacciego i zwraca wartość tego elementu. Jak przetestować taką metodę (przykład testu jednostkowego (unit test))?
  • Jak sprawić, by ten program nic nie wypisał na wyjściu?
  • Czym różni się przekazywanie zmiennej przez wartość, przez referencję i przez wskaźnik (pass by value, by reference, by pointer)?
  • Jaka jest różnica między wskaźnikiem, a referencją?
  • Dana jest funkcja foo(), która ma tylko jeden argument, który zawsze powinien być liczbą całkowitą nie mniejszą, niż zero. Jak sprawić, by poniższy kod nie skompilował się:
    foo(-1);

Pytania niezwiązane bezpośrednio z C/C++

  • Czym jest wyciek pamięci? Czym jest wyścig wątków? Czym jest zakleszczenie (deadlock)? Jak wykrywać te problemy w już istniejącym kodzie?
  • Czym się różni wątek od procesu? Jakie są wady i zalety jednego i drugiego?
  • Jakie są mechanizmy synchronizacji wątków i procesów?
  • Czym jest tablica asocjacyjna (hash table)? Podać przykład jej użycia (jest dostępna w std). Czym jest kolizja w tablicy asocjacyjnej? Jak taka tablica jest zaimplementowana? Czym jest funkcja skrótu (hash table)? Podać przykład swojej implementacji takiej tablicy i omówić jest odporność na kolizję?
  • Czym są wzorce projektowe i dlaczego są stosowane? Podaj przykład wzorca projektowego (innego, niż singleton)?
  • Czym jest UML? Dlaczego go stosujemy? Napisać diagram klas dla wybranego przez siebie problemu.

Kolejne pytania w kolejnych wpisach.

9 comments:

  1. Super! Bardzo przydatny spis.

    ReplyDelete
  2. Sektor IT – rekrutacja. Czy warto skorzystać z usług https://nexttechnology.io/ – może ktoś z Was już z nimi rozmawiał w tym zakresie?

    ReplyDelete