Jakie jest najlepsze pytanie do wywiadu w C ++? [Zamknięte]

28

Gdybyś mógł zadać programistowi C ++ jedno pytanie, aby zmierzyć jego umiejętności w C ++, co by to było?

Pytanie, które uważam za najlepsze, brzmi: czy możesz nazwać „usuń to”; wewnątrz funkcji członka? (Podaję to jako link, abyś mógł to najpierw przemyśleć, a następnie przejść do pytania o najlepszy wywiad w C ++ - kiedykolwiek !, aby zobaczyć poprawną odpowiedź.)

Nie pytam o to, ponieważ oczekuję, że większość ludzi zna odpowiedź. Gdyby to zrobili, pytanie nie byłoby tak przydatne. Proszę o sprawdzenie, czy potrafią znaleźć właściwą odpowiedź i jak to robią.

David Thielen
źródło

Odpowiedzi:

8

Zapytałbym ich o powód, dla którego wirtualna funkcja członka nie może być używana z szablonem w C ++. Oczywiście niewiele osób może natychmiast odpowiedzieć na pytanie. Ale jeśli rozmówca właściwie rozumie podstawową mechanikę C ++ (jak szablon działa w C ++, jak implementowana jest funkcja wirtualna, jak kompilator i linker generują plik wykonywalny z kodu źródłowego itp.), Możesz uzyskać odpowiedź z odpowiednim krok po kroku krok wiodące pytania.

Dodano: Funkcja wirtualnego elementu szablonu w tej odpowiedzi oznacza funkcję szablonu, która jest funkcją elementu wirtualnego jakiejś klasy - a nie zwykłą funkcją elementu w klasie szablonu. Przepraszam za zamieszanie :(

światła letniego
źródło
3
@summerlight: Mieszam wirtualne funkcje członków i szablony i jak dotąd nic złego się nie wydarzyło ... Obawiam się, że nie zrozumiałem, do czego zmierzasz. Chcesz oświecić mnie :)?
Matthieu M.,
2
Ta odpowiedź jest prawie, ale nie całkiem poprawna. Nie możesz mieć funkcji wirtualnych elementów szablonu, ale możesz mieć funkcje wirtualnych elementów klasy szablonu.
catphive
1
@summerlight: ah gotowe! Zabawne pytanie tak, często wyskakuje;)
Matthieu M.
2
@nikie: To jest wirtualna funkcja członka w klasie szablonów - nie jest wirtualną funkcją członka szablonu, taką jak szablon <typename T> virtual void doSomethingWithGenericTypeT (T arg);
światło letnie
2
@summerlight: powinieneś umieścić ten przykład w swoim poście. Do tej pory nie miałem pojęcia, co masz na myśli. Dobre pytanie, ale teraz to rozumiem ;-)
nikie
57

Najlepsze pytanie do wywiadu w C ++ byłoby problemem programistycznym, a nie pytaniem quizowym.

Steven Evers
źródło
Zgoda. Nie pytaj o składnię, którą można sprawdzić w Google. Zamiast tego poproś kandydata o napisanie łatwej (choć nie trywialnej) funkcji, najlepiej czegoś, co w pewnym momencie napisałeś we własnym kodzie.
chrisaycock
4
Nawet coś tak prostego jak „napisać funkcję, aby odwrócić ciąg” można powiedzieć wiele o programista ekspert: używają CString, char*, std::stringitp .; czy zwracają nowy ciąg znaków lub odwracają na miejscu; czy ręcznie zapętlają znaki, czy wywołują funkcję biblioteki. I oczywiście, jeśli nie mogą zrobić czegoś prostego, takiego jak odwrócenie struny, to również wiele o nich mówi! Istnieje również wiele pytań uzupełniających, takich jak czy działa z Unicode, czy działa z UTF-8 itp.
Gabe
16
@Ernelli: C ++ nigdy tak naprawdę nie wystartował? Poważnie?
Steven Evers,
1
@Gabe - dobra uwaga. Na przykład wykonanie odwrotności w miejscu szablonu z parametrem strategii byłoby albo niezbyt ogólne, albo (prawdopodobnie strategia raczej funkcja) dość złożone, jeśli chodzi o łańcuchy zmiennych bajty na znak. Nie wiem, czy nie przedwczesna optymalizacja (stwórz nowy ciąg, ponieważ łatwiej jest być ogólnym) czy zwinność (nie martw się o tę sprawę, dopóki to się nie stanie, a odwrotność w miejscu nie jest trudniejsza, może odrobinę łatwiej, dla ciągów znaków o stałej szerokości) wygrałby.
Steve314,
1
@Ernelli - zapominasz wchar_t i std :: wstring, a one oznaczają różne rzeczy w systemie Windows / Unix
Martin Beckett
32

Zapytałbym ich, co im się podoba w C ++ 0x. Na tej podstawie mogłem „podzielić” je na różne stereotypy:

  • super stara szkoła, używa kompilatorów C ++ do kompilacji kodu C.
  • stara szkoła, bojąca się (lub nie widzi sensu) STL, nie nadążała za zmianami
  • uwielbia lambdas, uwielbia STL coraz szybciej dzięki referencjom do wartości, duży fan RAII, gorący w użyciu shared_ptr, unique_ptr itp
  • jest gorzki, ponieważ cały kod doładowania napisany w ciągu ostatnich kilku lat będzie musiał zostać dostosowany do używania ekwiwalentów C ++ 0x
  • szalony metaprogrammer, który sprawia, że ​​moja głowa eksploduje, odpowiadając na stosunkowo krótkie pytanie

Możliwe, że niektóre z tych wiader są dla Ciebie idealne, a niektóre są „dzięki za przybycie”. To pytanie, które szybko dostarcza wielu informacji, to mój zwycięzca.

Kate Gregory
źródło
1
+1 za dobre pytanie wiodące, które zachęca do wielu dyskusji na ten temat.
Gary Rowe,
8
Zapomniałeś kategorii ludzi, którzy nie mają pojęcia, czym jest C ++ 0x. Myślę, że to byłaby bardziej odpowiedź i pasowałaby do dwóch pierwszych typów.
Fast Fish,
1
@ Fast Fish, tak, ludzie tacy jak C ++ 0-whatnow? będzie na ogół jedną z pierwszych dwóch kategorii i zazwyczaj podświetli to w swojej odpowiedzi.
Kate Gregory,
28

Jestem nieco zaskoczony, dlaczego „możesz to usunąć?” jest uważane za interesujące pytanie. Każdy, kto napisał kod COM w C ++, wie, że pierwszą rzeczą, której uczysz się pierwszego dnia podstawowego programowania COM, jest prawidłowe użycie „usuń to”. Przypuszczam, że przydatne może być ustalenie, czy powiedzmy, że ktoś kłamie na temat pisania programów COM, ale jako ogólne pytanie C ++ o wiedzy ogólnej, jeśli ktoś nie może odpowiedzieć od razu, to nie będzie dobrze dla mojego zespołu.

W każdym razie, jeśli Twoim celem jest znalezienie pytania mierzącego umiejętności C ++, wybranie jednego pytania jest niewłaściwą drogą. Obróć to. Prawidłowe pytanie, które należy zadać, to:

Jak dobry jesteś programistą C ++ w skali od jednego do dziesięciu?

To nie jest pytanie, które pozwala uzyskać odpowiedź, której chcesz. Niezależnie od tego wszyscy mówią „osiem”. Pytanie, na które otrzymujesz odpowiedź, którą chcesz, to:

OK, więc jesteś ósemką. Z jakim obszarem problemowym uważasz, że siódemka miałaby trudności z pracą?

I bum , teraz je masz. Jeśli kandydat myśli, że „coś wspólnego z rekurencją” lub „kiedy użyć wirtualnego destruktora” jest czymś, z czym siódemka ma trudności, to wiesz, że on wie trochę o rekurencji lub niszczycielach itp. i że ich wiedza nie idzie znacznie dalej.

To powinno dać ci znacznie lepszą kalibrację niż wymyślenie kilku ciekawostek. Gdybyś zmusił mnie do wymyślenia dobrego pojedynczego pytania na temat faktu dotyczącego C ++, prawdopodobnie zadałbym coś takiego: „jak zaprojektowałbyś analizator semantyczny i generator kodu dla części kompilatora C ++, który zajmuje się metodami wirtualnymi wywoływany w destruktorze klasy podstawowej? ” Powinieneś zadawać pytania dotyczące prawdziwych rzeczy, nad którymi pracujesz i na których kandydat prawdopodobnie będzie pracował. To był problem, nad którym kiedyś musiałem pracować i myślę, że dałoby to całkiem dobry wgląd w to, jak dana osoba projektuje analizatory semantyczne i generatory kodu, a także ich znajomość C ++.

Eric Lippert
źródło
3
Zacznę używać tego: OK, więc jesteś ósemką. Z jakim obszarem problemowym uważasz, że siódemka miałaby trudności z pracą?
David Thielen,
10
Kolejne dobre pytanie: z czym dziewiątka mogłaby mieć problem?
David Thornley,
To takie genialne, że niesamowite.
UpAndAdam
14

Dla zabawy mam programistów C ++ zwijających się z tym małym dzieckiem:

Dlaczego działa to w nieskończoną pętlę (i tak, jest poprawnie wpisane)?

int x=0;
while (x<3) {
  x = x++;
}

To niesamowite, ile osób się potknęło. Oczywiście nie mogę go już używać po pojawieniu się na stosie przepełnienia . Mruczenie ... mruczenie ...

(Aby uzyskać właściwą odpowiedź, przeczytaj spowiedź i zdecydowanie przeczytaj komentarze)

Dodano pytanie bonusowe

Istnieje wszechstronny klasyczny FizzBuzz (opisany w znanym już artykule Coding Horror ). Nigdy tak naprawdę nie użyłem go w wywiadzie, ale po tym, jak rzuciłem go zespołowi programistycznemu na jeden lunch, wyniki były ... hmm ... zaskakująco dokładne.

Wyznanie

Zostałem złapany na standardowej odpowiedzi „x ++ zwraca wartość oryginalną”. Jednak poprawną odpowiedzią jest to, że zachowanie jest niezdefiniowane z powodu punktów sekwencji. Nikt nigdy nie wspominał o punktach sekwencyjnych przez cały czas, gdy używałem tego, dopóki nie opublikowałem go tutaj.

Zostałem wykształcony i naprawdę chciałbym podziękować wszystkim, którzy poświęcili czas na komentowanie.

Gary Rowe
źródło
1
Gary Rowe: Chociaż uwielbiam ten przykład (pierwszy raz go widzę). Smutno mi, że ludzie nie widzą tego dość szybko, a tym bardziej nie wiedzieć.
Orbling
2
Kiedy byłem w firmie Microsoft, zacząłem prosić wnioskodawców o wstawienie wstawionej listy. Czemu? Ponieważ około 80% nie mogło tego zrobić. Niesamowite ...
David Thielen,
43
To niekoniecznie jest nieskończona pętla. Przywołujesz tutaj niezdefiniowane zachowanie (x jest dwukrotnie modyfikowane bez pośredniego punktu sekwencji). I faktycznie, z moim konkretnym kompilatorem, gcc (Debian 4.3.2-1.1) 4.3.2 na moim konkretnym łuku (x86), to się kończy.
Logan Capaldo,
2
@Logan +1 za wzmiankę o punktach sekwencji. Z pewnością dostaniesz drugi wywiad ;-)
Gary Rowe
4
To naprawdę dobre pytanie podczas rozmowy kwalifikacyjnej, ponieważ mówi kandydatowi, czy warto wracać na kolejną rozmowę ;-). Jeśli wywiad naprawdę uważa, że ​​kod powoduje nieskończoną pętlę (a ankieter ma być technicznie kompetentny), kandydat może bezpiecznie przegapić „okazję”.
CB Bailey,
8

Pierwszą rzeczą, którą należy zadać, jest proste pytanie dotyczące wskaźników. Byłem zdumiony, widząc, jak wielu ludzi, którzy twierdzą, że znają C ++ lub, co gorsza, C, nie jest w stanie odpowiedzieć. Następnie zadałbym proste pytanie dotyczące funkcji wirtualnych. Ta kombinacja mówi bardzo szybko, czy dana osoba faktycznie zna C ++.

Dima
źródło
4
zależy od ich pochodzenia, nigdy nie spotkałem kogoś ze sprzętowym zapleczem, który nie rozumiał wskaźników, ale niektórzy, którzy tak naprawdę nie dostali enkapsulacji lub polimorfizmu
jk.
7

Wiele zależy od tego, jaki C ++ jest napisany w Twojej firmie. (Kiedy musiałem zatrudnić programistów C ++, nigdy nie pytałem o to delete, ponieważ zapytałem ich o techniki, dzięki którym nie musieliby pisać delete).

Idealnie byłoby, gdybyś chciał zatrudnić ludzi, którzy piszą kod powyżej poziomu, który obecnie pisze Twój zespół, ale nie zbyt wysoko, chyba że chcesz połączyć to ze szkoleniem zespołu, aby wzniósł go na wyższy poziom.

sbi
źródło
7

Opowiedz mi o konstruktorze kopii.

fredoverflow
źródło
2
+1. Ten eliminuje niekompetentnych kandydatów w ciągu pięciu sekund.
Nemanja Trifunovic
6

Sądzę, że zapytałbym ich, co jeszcze wiedzą, lub, co bardziej prawdopodobne, zadałby im pytanie dotyczące czegoś zupełnie innego.

Zbyt wiele programistów C ++ o tym, którzy mają niewielkie doświadczenie w innych językach. Wąskie doświadczenie jest zwykle ograniczające.

Orbling
źródło
6

Najlepsze pytanie dla świetnego programisty C ++ brzmi: „Powiedz mi, dlaczego NIE powinniśmy używać C ++?”

amadvance
źródło
4

Nie sądzę, aby było najlepsze pytanie w C ++. C ++ jest tak dużym językiem, a dzięki C ++ 0X jest rozwinięty, że możesz być silny w pewnej subdomenie języka i niewiele więcej o innej jego części. Pytanie „jednym strzałem” sprawi, że czyjaś znajomość tylko niewielkiej części języka będzie ryzykować, że może przeoczyć jego wiedzę na temat innych aspektów tego języka.

sashang
źródło
4

Na StackOverflow jest sporo. Podzielę się kilkoma:

https://stackoverflow.com/questions/2428404/tricky-interview-question-for-c

https://stackoverflow.com/questions/50447/favorite-c-interview-question

https://stackoverflow.com/questions/4269838/interview-question

https://stackoverflow.com/questions/2532102/can-a-pointer-ever-point-to-itself

https://stackoverflow.com/questions/3055141/interview-question-about-virtual-functions-in-c

karlphillip
źródło
3

Moje ulubione pytanie jest proste:

a) Czy zacząłeś od C, a następnie przeszedł na C ++?

b) Jeśli tak, to jakich pierwszych rzeczy nauczyłeś się inaczej?

Ta odpowiedź zazwyczaj daje mi do zrozumienia, w jaki sposób programista podchodzi do C ++ i ogólnie rozumie OOP i C ++.

nie ma tu odpowiedzi „właściwej” ani „błędnej”, ale zazwyczaj jest to świetny sposób, aby dowiedzieć się, skąd pochodzi kandydat.

być może
źródło
1

Przedstawiłbym tej osobie nieco kodu z innego języka programowania, który był zorientowany obiektowo i najlepiej nie znajdował się na liście języków, które znają. Kod powinien reprezentować proste zadanie wykonane w tym języku.

Nie chodzi o to, by ustalić ich znajomość C ++, ale dowiedzieć się, jak dobrze rozumieją programowanie. Kiedy zrozumiesz podstawowe pojęcia związane z programowaniem, możesz rozwiązać problemy.

Paweł
źródło
1

Jak wdrożyć funkcje wirtualne w C ++, wyjaśnij scenariusz z prawdziwego świata.

użytkownik616
źródło
1

W tej chwili powiedziałbym: „Jak poszedłbyś do implementacji konstruktora przenoszenia dla kontenera?”

Moim uzasadnieniem jest to, że ponieważ konstruktory ruchów są cechą następnego standardu, a nie obecnego, odpowiedź kandydata wskaże, czy dany programista aktywnie dąży do znajomości swojego języka, czy po prostu trzyma się sztuczek, które zna.

Kaz Dragon
źródło
1

Myślę, że będę prosić ich o opinię do projektu, powiedzmy std::string. Zapytałbym ich również, czy użyli innych projektów (np. MFC / ATL CString,wxString itd) i zakładając, że masz, poproś, aby porównać i wzorów.

Ciągi są na tyle szeroko stosowane, że prawie każdy z prawdziwym doświadczeniem w posługiwaniu się C ++ powinien był użyć co najmniej jednego lub dwóch powyższych. Prawie wszystkie projekty zawierają pewne kompromisy między teoretyczną czystością a praktycznym zastosowaniem. Niektóre mogą działać naprawdę dobrze, ale tylko wtedy, gdy są używane dokładnie zgodnie z przeznaczeniem, podczas gdy inne wymieniają większą wszechstronność na niektóre możliwe niezdarności. Krótko mówiąc, prawie każdy, kto ma prawdziwe doświadczenie powinny być w stanie wyrazić jakieś sensowne opinie ich wzorów i opinie te powinny wam kwotę uczciwą o tym, jak oni myślą, jak oni zaprojektować kod, stopień, do którego wartość pragmatyzm kontra czystości teoretycznej, i tak dalej.

Jerry Coffin
źródło