Czy te zaawansowane / niesprawiedliwe pytania dotyczące wywiadu dotyczące współbieżności Java? [Zamknięte]

12

Oto kilka pytań, które ostatnio zadałem rozmówcom, którzy twierdzą, że znają współbieżność Java:

  1. Wyjaśnij zagrożenie związane z „widocznością pamięci” - sposobem, w jaki JVM może zmieniać kolejność niektórych operacji na zmiennych, które nie są chronione przez monitor i nie są deklarowane volatile, tak że jeden wątek może nie widzieć zmian wprowadzonych przez inny wątek. Zwykle pytam o to, pokazując kod, w którym występuje to zagrożenie (np. NoVisibilityPrzykład z listingu 3.1 z „Java Concurrency in Practice” Goetza i in.) I pytając, co jest nie tak.
  2. Wyjaśnij, w jaki sposób volatilewpływa nie tylko na zadeklarowaną zmienną rzeczywistą volatile, ale także na wszelkie zmiany w zmiennych dokonane przez wątek przed zmianą volatilezmiennej.
  3. Dlaczego możesz użyć volatilezamiast synchronized?
  4. Zaimplementuj zmienną warunkową za pomocą wait()i notifyAll(). Wyjaśnij, dlaczego powinieneś używać notifyAll(). Wyjaśnij, dlaczego zmienną warunkową należy testować za pomocą whilepętli.

Moje pytanie brzmi - czy są one odpowiednie lub zbyt zaawansowane, aby zapytać kogoś, kto twierdzi, że zna współbieżność Java?

A skoro już nad tym pracujemy, czy uważasz, że ktoś, kto pracuje we współbieżności Java, powinien mieć ponadprzeciętną wiedzę na temat usuwania śmieci Java?

sparc_spread
źródło
4
Jedyną myślą, o którą się martwię, jest unikanie wchłaniania się w chwasty „zapamiętanych faktów” zamiast „umiejętności”.
tylerl,
5
Te pytania wydają się całkowicie uzasadnione dla każdego, kto jest zatrudniony na stanowisku java, które będzie wymagało wysokiego poziomu współbieżności.
Rig
2
Jeśli zatrudniasz na stanowisko, które wymaga równoczesnego rozwoju, to dopiero początek. Zastanawiam się jednak, jak byś zareagował, gdyby ktoś odpowiedział na twoje pytanie o: notifyAll()„Nie wierzę w pracę z harmonogramem systemu operacyjnego, więc używam notify()
kdgregory,
2
Dodałbym też Q na temat blokad juc, struktur danych, pul wątków i niebezpiecznych :-)
Martijn Verburg,
2
Inni mówili o złożoności pytań. Zakładając, że są one odpowiednie dla projektu, pamiętaj, aby do nich doprowadzić z prostszym pytaniem i zrezygnuj z tej linii pytań, jeśli okaże się, że kandydat nie jest w głębi duszy - to strata czasu i twojego i rujnuje energię wywiadu. Nie ma sensu zadawać pytań, o których wiesz, że nie będą w stanie odpowiedzieć. Upewnij się, że jesteś przygotowany na pogłębienie innych tematów - tylko dlatego, że ktoś jest tutaj słaby, nie oznacza, że ​​nie jest kompetentny i nie jest w stanie wykazać się innymi mocnymi stronami.
Sean McSomething

Odpowiedzi:

11

To naprawdę zależy od tego, czy pytasz kandydata z 2-letnim doświadczeniem w Javie czy z 7-letnim doświadczeniem w Javie. Dla architekta / kierownika technicznego / seniora wydają się właściwe pytania, ale dla młodszego i być może również na średnim poziomie wydają się trudne.

Zadajesz również pytanie o mechanizmy synchronizacji niskiego poziomu, które zostały zastąpione głównie przez java.util.concurrentprogramowanie w Javie; zamiast wait()/notify() zamków są preferowane. Widać, że Effective Java 2. wydanie upuściło rozdział wyjaśniający szczegółowo mechanizm oczekiwania / powiadamiania, ponieważ nie został uznany za przydatny. Ponadto w większości przypadków kontener obsługuje wielowątkowość na wyższym poziomie; metody EJB są bezpieczne dla wątków, na przykład bez żadnych obaw ze strony programisty (nie oznacza to, że programiści nie powinni znać wielowątkowości).

Widzę, że wielowątkowość jest raczej częścią systemu operacyjnego niż częścią języka programowania. Aby sprawdzić, czy dana osoba naprawdę rozumie wielowątkowość i programowanie równoległe, pytania dotyczące muteksów, semaforów lub harmonogramu należy zadawać najpierw, a dopiero potem ostatecznie, szczegóły dotyczące implementacji w określonym języku programowania.

m3th0dman
źródło
2
+1 na komentarzach wait () i notyfikuj () - jednak programista dobrze zorientowany w zbieżności znałby historię i ewolucję możliwości Javy w tej przestrzeni (w tym aż do F&J w Javie 7).
Martijn Verburg,
@ M3th: Ostatnia osoba, którą zadałem te pytania, miała 10-letnie doświadczenie w Javie i twierdziła, że ​​zna programowanie równoległe. Dzięki za opublikowanie lockvs. wait/notify- Wiedziałem o tym lockz książki Goetza, ale nie zdawałem sobie sprawy, że teraz jest preferowane w stosunku do starej. Zgadzam się z @Martijn, jednak osoba o takim poziomie doświadczenia powinna być świadoma starszych metod. W każdym razie nie zamierzam zadawać pytania ponownie (zwłaszcza, że ​​już zaznaczyłem je jako udzielone - przez ciebie :-)), ale uważam, że ktoś z 10-letnim doświadczeniem powinien być w stanie odpowiedzieć na te pytania, nie?
sparc_spread
1
@Martijn Verburg Zgadzam się z wami obojgiem; dobry programista Java (szczególnie taki, który mówi, że zna współbieżność) powinien wiedzieć, jak korzystać z funkcji wait () / notyfikacji (); przynajmniej z ciekawości, dlaczego pojawiają się w klasie Object.
m3th0dman,
1
@sparc_spread Programista, który wyraźnie stwierdza w swoim życiorysie, że wie, że współbieżność Java powinna znać odpowiedzi (przynajmniej 3 ostatnie). Jeśli chodzi o poziom doświadczenia, jak powiedziałem, imo programista, który twierdzi, że chce być architektem / kierownikiem technicznym \ starszy programista i ma ponad 5-letnie doświadczenie w Javie (backend, a nie JSP i frameworki MVC) powinien znać odpowiedzi. Jeśli chodzi o lockvs wait/notify, blokady są preferowane, gdy naprawdę potrzebujesz funkcji niskiego poziomu, ale w większości przypadków dostępna jest alternatywa wyższego poziomu; BlockingQueue jest szczególnie przydatny.
m3th0dman,
14

Czy są one odpowiednie lub zbyt zaawansowane, aby zapytać kogoś, kto twierdzi, że zna współbieżność Java?

Powiedziałbym, że są to stosunkowo zaawansowane pytania. Nie są one jednak „niesprawiedliwe” w tym sensie, że nie są podstępnymi pytaniami.

Rzeczywiście „uczciwość” nie jest tak naprawdę istotnym kryterium. To, o czym (jako ankieter) powinieneś się martwić, to, czy pytania i twoja interpretacja odpowiedzi dotyczy wyboru najlepszych kandydatów na stanowisko lub stanowiska, z którymi rozmawiasz. (Innymi słowy, czy odrzucasz kandydatów, których naprawdę powinieneś poświęcić więcej uwagi, ponieważ nie odpowiedzieli na te pytania „poprawnie”?)

A skoro już nad tym pracujemy, czy uważasz, że ktoś, kto pracuje we współbieżności Java, powinien mieć ponadprzeciętną wiedzę na temat usuwania śmieci Java?

Ponownie, to nie jest właściwe pytanie. Pytanie, które powinieneś sobie zadać, brzmi: czy potrzebujesz kogoś, kto ma dobrą wiedzę na temat usuwania śmieci w Javie.

Stephen C.
źródło
Bardzo dziękuję za tę odpowiedź. Naprawdę chciałbym móc oznaczyć oba jako odpowiedź. Doceniam czas, który poświęciłeś na pomoc tutaj.
sparc_spread