¿Son estas preguntas de entrevista avanzadas / injustas con respecto a la concurrencia de Java? [cerrado]

12

Aquí hay algunas preguntas que les hice recientemente a los entrevistados que dicen conocer la concurrencia de Java:

  1. Explique el peligro de "visibilidad de la memoria": la forma en que la JVM puede reordenar ciertas operaciones en variables que no están protegidas por un monitor y no declaradas volatile, de modo que un subproceso puede no ver los cambios realizados por otro subproceso. Por lo general, le pregunto a este mostrando el código donde está presente este peligro (por NoVisibilityejemplo, el ejemplo en el Listado 3.1 de "Concurrencia de Java en la práctica" por Goetz et al) y preguntando qué está mal.
  2. Explique cómo volatileafecta no solo la variable real declarada volatile, sino también cualquier cambio en las variables realizado por un hilo antes de que cambie la volatilevariable.
  3. ¿Por qué podrías usar en volatilelugar de synchronized?
  4. Implementar una variable de condición con wait()y notifyAll(). Explica por qué deberías usarlo notifyAll(). Explica por qué la variable de condición debe probarse con un whilebucle.

Mi pregunta es: ¿son apropiados o demasiado avanzados para preguntarle a alguien que dice que conoce la concurrencia de Java?

Y mientras lo hacemos, ¿crees que se debería esperar que alguien que trabaja en la concurrencia de Java tenga un conocimiento superior al promedio de la recolección de basura de Java?

sparc_spread
fuente
44
Lo único que me preocupa es evitar entrar en la maleza de "hechos memorizados" en lugar de "habilidades".
tylerl
55
Estas preguntas parecen perfectamente razonables para cualquiera que sea contratado en un puesto de Java que requerirá un alto nivel de concurrencia.
Plataforma
2
Si está contratando para un puesto que necesita desarrollo concurrente, estos son solo el comienzo. Pero me pregunto cómo reaccionaría si alguien respondiera a su pregunta sobre notifyAll()"No creo en hacer el trabajo del programador del sistema operativo, así que uso notify()"
kdgregory
2
También agregaría Q sobre juc Locks, estructuras de datos, grupos de subprocesos e inseguros :-)
Martijn Verburg
2
Otros han hablado sobre la complejidad de las preguntas. Suponiendo que sean relevantes para el proyecto, asegúrese de dirigirse a ellos con una pregunta más simple y abandone esta línea de preguntas si se vuelve obvio que el candidato está fuera de su alcance: es una pérdida de tiempo y suya y arruina la energía de la entrevista. No tiene sentido hacer preguntas que sabes que no podrán responder. Asegúrese de estar preparado para profundizar de manera similar en otros temas, solo porque alguien sea débil aquí no significa que no sea competente y que no pueda demostrar su valía a través de otras fortalezas.
Sean McSomething

Respuestas:

11

Realmente depende de si está preguntando a un candidato con 2 años de experiencia en Java o uno con 7 años de experiencia en Java. Para un arquitecto / líder técnico / senior parecen preguntas apropiadas, pero para un junior y quizás un nivel medio también, parecen un poco difíciles.

También está haciendo preguntas sobre los mecanismos de sincronización de bajo nivel que han sido reemplazados principalmente por el java.util.concurrentdesarrollo actual de Java; en lugar de wait()/notify() cerraduras son preferibles. Puede ver que Effective Java 2nd edition ha dejado caer un capítulo que explica en detalle el mecanismo de espera / notificación, porque no se consideró útil. Además, el contenedor maneja subprocesos múltiples en un nivel superior en la mayoría de los casos; los métodos de un EJB son seguros para subprocesos, por ejemplo, sin ninguna preocupación por parte del programador (esto no significa que los programadores no deban conocer el subprocesamiento múltiple).

De hecho, veo que los subprocesos múltiples son una subparte de los sistemas operativos en lugar de una subparte de un lenguaje de programación. Para ver si una persona realmente comprende las preguntas de programación de subprocesos múltiples y paralelas sobre mutexes, se deben hacer primero los semáforos o la programación y, finalmente, solo después, detalles sobre la implementación en un lenguaje de programación particular.

m3th0dman
fuente
2
+1 en los comentarios de espera () y notificación (); sin embargo, un desarrollador muy versado en concurrencia conocería el historial y la evolución de las capacidades de Java en este espacio (incluso hasta F&J en Java 7).
Martijn Verburg
@ M3th: La última persona a la que le hice estas preguntas tenía 10 años de experiencia en Java y afirmó conocer la programación concurrente. Gracias por publicar lockvs. wait/notify- Lo sabía lockdel libro de Goetz, pero no me di cuenta de que ahora era preferible a la antigua. Sin embargo, estoy de acuerdo con @Martijn en que alguien con este nivel de experiencia debería conocer los enfoques más antiguos. De todos modos, no quiero volver a hacer la pregunta (especialmente porque ya la marqué como contestada por usted :-)) pero creo que alguien con 10 años de experiencia debería poder responder esas preguntas, ¿no?
sparc_spread
1
@Martijn Verburg Estoy de acuerdo con los dos; un buen desarrollador de Java (especialmente uno que dice que sabe concurrencia) debería saber cómo usar wait () / notify (); al menos por la curiosidad de por qué aparecen en la clase Object.
m3th0dman
1
@sparc_spread Un programador que declara explícitamente en su currículum que sabe que la concurrencia de Java debe conocer las respuestas (al menos las últimas 3). Con respecto al nivel de experiencia, como dije, un programador que afirma / desea ser arquitecto / líder técnico \ desarrollador senior y tiene más de 5 experiencias Java (backend, no JSP y MVC Frameworks) debería saber las respuestas. Con respecto a lockvs wait/notify, los bloqueos son preferibles cuando realmente necesita características de bajo nivel, pero en la mayoría de los casos hay disponible una alternativa de nivel superior; BlockingQueue es especialmente útil.
m3th0dman
14

¿Son apropiados o demasiado avanzados para preguntarle a alguien que dice conocer la concurrencia de Java?

Yo diría que son preguntas relativamente avanzadas. Sin embargo, no son "injustos" en el sentido de que no son preguntas capciosas.

De hecho, la "justicia" no es realmente un criterio relevante. Lo que usted (como entrevistador) debería preocuparse es si las preguntas y su interpretación de las respuestas seleccionan a los mejores candidatos para el puesto o los puestos para los que está entrevistando. (O para decirlo de otra manera, ¿está rechazando candidatos a los que realmente debería considerar más debido a que no responden estas preguntas "correctamente"?)

Y mientras lo hacemos, ¿crees que se debería esperar que alguien que trabaja en la concurrencia de Java tenga un conocimiento superior al promedio de la recolección de basura de Java?

Nuevamente, esa no es realmente la pregunta relevante. La pregunta que debe hacerse es si necesita a alguien que tenga un buen conocimiento de la recolección de basura de Java.

Stephen C
fuente
Muchas gracias por esta respuesta. Realmente desearía haber marcado ambos como la respuesta. Aprecio el tiempo que te tomaste para ayudar aquí.
sparc_spread