¿Cuál es tu problema favorito de entrevista en la pizarra? [cerrado]


52

Tal como dice el título, ¿cuál es su problema favorito de entrevista en la pizarra y por qué le ha resultado eficaz?

Junior, senior, Java, C, Javascript, PHP, SQL, pseudocódigo, etc.


44
Un problema que odiaba era un rompecabezas de Einstein. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html No pude hacerlo en 30 minutos. Pero luego me enojé y encontré esto: games.flowix.com/en/index.html Así que me entrené para hacer un problema más difícil de 6 x 6 x 6 en promedio en 20 minutos. Creo que puedo manejar 5 x 5 x 5 en 30 minutos ahora. Cualesquiera que sean los estúpidos acertijos que el patrón me arroje, los recordaré y los acertaré la próxima vez. Hay tantos buenos rompecabezas.
Trabajo

20
@ Job: ninguno de los cuales le dirá nada sobre el desempeño de un empleado en el trabajo. A menos, por supuesto, que pases todo tu tiempo de trabajo resolviendo este tipo de acertijos en lugar de hacer el trabajo real.
Robert Harvey

1
@Robert Harvey, ¿quieres decir que estás en un negocio que hace dinero de otra manera que no sea resolver acertijos? No tenía idea ...;) Sin embargo, ese rompecabezas es divertido. Como nota al margen, una empresa para la que solía trabajar utilizaba pruebas de coeficiente intelectual reales como primer paso en su evaluación. Me gustaría encontrar algunas buenas preguntas de pizarra para separar a los mejores candidatos, no simplemente para examinarlos.
Nicole

44
@Renesis: Como desarrollador, puedo ver cómo resolver un rompecabezas identifica las habilidades de resolución de problemas y análisis, pero los desarrolladores también deben saber cómo traducir esa solución en código. Resolver un rompecabezas solo muestra la mitad de esa ejecución. Es la diferencia entre resolver un cubo Rubix y escribir un algoritmo para resolver un cubo Rubix.
Robert Harvey

@Robert Harvey Estoy de acuerdo, estoy buscando específicamente problemas de codificación, no solo problemas de pensamiento.
Nicole

Respuestas:


22

Le pido al candidato que diseñe una solución a un problema que realmente encontré en mi trabajo diario. Al hacerlo, trato de crear un diálogo entre el candidato y yo. Trato de discutir sobre el diseño que está construyendo como si nunca antes hubiera pensado en el problema.

Lo que trato de evaluar es si podemos entendernos y si podemos hablar sobre un problema técnico sin confusión.

Ejemplo concreto

(Para un desarrollador de escritorio java)

Diseñe una API para manejar el historial de navegación de un navegador web (página anterior, página siguiente, enumere las 10 páginas anteriores), y eso puede ser reutilizable en muchas partes de la aplicación (aquí doy ejemplos concretos en nuestra aplicación). Luego, esboce una implementación.

Me gusta este, porque es bastante simple, es fácil de ilustrar, se puede resolver paso a paso (agregue comportamientos adicionales sin romper todo), permite hablar sobre casos extremos y manejo de errores, y también permite hablar sobre datos estructuras


40

Esto me pareció extremadamente esclarecedor al entrevistar a candidatos y filtrar a los que no tienen nada que ver. Es similar en complejidad a Fizz Buzz, pero se centra en las habilidades de la base de datos.

Assuming the following basic  table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)

Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995  
Part 2: Documents that contain the keyword "Blue"  
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"

Les dejo escribirlo en cualquier variante SQL que quieran, y no soy demasiado exigente con problemas menores de sintaxis. Principalmente quiero saber que entienden conceptos básicos de bases de datos relacionales.

La mayoría de los candidatos pueden pasar la parte 3 sin ningún problema. Te sorprendería saber cuántos piensan que la respuesta a la parte 4 es simplemente cambiar el operador de OR a AND en la cláusula where.


2
Ah, veo el problema con el n. ° 4. Sus documentos solo tienen una palabra clave por fila, por lo que no puede tener una celda igual a los grifos
brillante el

8
Ooops! Puedo verme enamorado de (4) en una entrevista. @ Job: Como entrevistador , le pediría al candidato que explique la consulta, con la esperanza de que tropiece con su problema para ver cómo lidia con eso. (eso generalmente le dice más que un candidato respondiendo sus preguntas en el primer intento.)
Peter

3
@Renesis, no estoy tan seguro de que esto realmente esté cavando profundamente. Esto parece bastante bueno para descubrir si alguien tiene habilidades básicas de consulta SQL. De hecho, estoy sorprendido de los pocos desarrolladores que tienen estas habilidades básicas en estos días.
Mark Freedman

2
@ jk01, tal vez tengo una actitud de la vieja escuela sobre esto, pero en mi opinión un desarrollador completo debería tener algún conocimiento de DB, si no para acceder a través del código, pero al menos para entender el dominio al experimentar con consultas. Sin esto, un desarrollador tiene un punto ciego bastante significativo. También es EXTREMADAMENTE útil para soporte del sistema y resolución de problemas. La abstracción está bien para ayudar a simplificar el desarrollo y aumentar la productividad, pero he visto demasiadas suposiciones porque a menudo esto se abstrae. Podría continuar, pero este podría ser un debate completamente diferente, estoy seguro de que se está llevando a cabo en otro lugar;)
Mark Freedman

44
@ back2dos - Mira, no te ofendas solo porque no puedes responderlo. Puede haber muchas otras tecnologías que hacen esto más simple, pero usamos muchas bases de datos SQL y recluto personas que saben cómo usar las tecnologías que usamos, sin excusas por las que no deberían tener que responder las preguntas de mi entrevista. .
JohnFx

20

"Dibuje para mí en la pizarra el diseño del último proyecto en el que trabajó, sin revelarme ningún detalle sensible".


¿Cómo definirías el diseño? ¿Estás buscando un diagrama de clase? ¿Otro diagrama UML? ¿Un bosquejo básico de los niveles?
justkt

1
Los llamo baloongramas. ;) Simplemente dibuje ciclos, ponga nombres y conéctelos con flechas con nombre. No me importa su aplicación, sino el hecho de que la haya entendido.
Uberto

55
+1. Para las personas que tenían un trabajo anteriormente, esta es definitivamente una de las mejores cosas que puede hacer. Si pueden explicar cómo se estructuró el proyecto, ya vale mucho. Si tienen una idea de por qué fue estructurado de esa manera en particular, o cómo algunas cosas podrían hacerse mejor, entonces esto es realmente una gran ventaja.
back2dos

3
@justkt: La importancia es que el entrevistado transmita la información. Poco importa cómo. He conocido personas que realmente conocen UML, que no pueden explicar nada con él, y personas que pueden explicar sistemas complejos con unas pocas líneas onduladas.
back2dos

2
¿Cómo se supone que alguien dibuje el diseño de un proyecto sin revelar ningún detalle sensible?
Nemanja Trifunovic

14

Implementar strcpy, strcmpy amigos.


44
Pido candidatos para implementar atoi().
chrisaycock

2
Te sorprendería saber cuántas personas no pueden implementar strdup().
Tim Post

10
Eso es justo si la oferta de trabajo es para un programador C.

En la entrevista para mi trabajo actual, el entrevistador me pidió que implementara strrev()una función de inversión de cadena. Mi solución de pizarra blanca los impresionó y ahora estoy haciendo el trabajo.
Gulshan

@crisaycock atoi () es fácil. itoa () es tortuosa
Michael Brown

14

Mi favorito, que abarca algunas disciplinas, es contar el número de nodos en un árbol binario dada la interfaz (en C #):

public interface IBinaryTree<T>
{
    IBinaryTree<T> Left
    {
        get;
    }

    IBinaryTree<T> Right
    {
        get;
    }

    T Data
    {
        get;
    }

    // Other properties and methods not germane to this problem.
}

y solo por diversión, aquí está la implementación, aunque el entrevistado no necesita ver esto.

public sealed class BinaryTree<T> : IBinaryTree<T>
{
    private readonly IBinaryTree<T> left;

    private readonly IBinaryTree<T> right;

    private readonly T data;

    public BinaryTree(
        IBinaryTree<T> left,
        IBinaryTree<T> right,
        T data)
    {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public IBinaryTree<T> Left
    {
        get
        {
            return this.left;
        }
    }

    public IBinaryTree<T> Right
    {
        get
        {
            return this.right;
        }
    }

    public T Data
    {
        get
        {
            return this.data;
        }
    }

    // Other properties and methods not germane to this problem.
}

y la clase asistente:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

La solución que me gusta ver es esta:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

Como demuestra conocimiento de:

  • cómo funciona un árbol (árbol binario en particular)
  • La definición recursiva de un árbol binario
  • métodos recursivos y cómo los casos base detienen la recurrencia
  • qué significa contar un solo nodo
  • interfaces como un contrato
  • (menos importante) conocimiento de la sintaxis de C #:
    • genéricos
    • métodos de extensión
    • operador ternario

¿Podría ser un método de extensión?
Gulshan

En este día y edad, sí. Estábamos codificando en VS 2005 en ese momento, de ahí la sintaxis dispersa.
Jesse C. Slicer

¿Por qué usar un método de extensión cuando tienes el código fuente de la clase original? Para eso no son los métodos de extensión.
Batibix

Supongo que podría haber ido un nivel más profundo y mostrarle al candidato una interfaz que implementa esta clase. La esencia es que la clase original no debería ser modificada; a algunos desarrolladores de nivel de entrada les encantaría agregar cosas a la clase para hacer que la solicitud sea "más fácil".
Jesse C. Slicer

¡Santa mierda que se parece mucho a Java!
prueba

12

Dos preguntas que han suscitado interesantes discusiones en la pizarra para mí son

  1. "Por favor, ¿puede explicar con tanto detalle como desee cómo un navegador web obtiene una página generada"
  2. "Por favor explique cómo funciona Java Hibernate"

Empiezan de manera simple y luego se vuelven progresivamente más complejas.


31
ehi, ni siquiera estoy calificado para juzgar las respuestas ... Creo que para la segunda necesitas 12 velas negras y una cabra ...
Uberto

44
El segundo es fácil, su sistema operativo guarda el caché y la pila del procesador y el contenido de su RAM en el disco duro, y luego lo restaura cuando la computadora se vuelve a encender.
Malfist

Sin embargo, la primera pregunta podría tomar días para explicar.
Malfist

@Malfist Me refería al marco de persistencia de Java Hibernate.
Gary Rowe

2
@Paul Stephenson Sí, pero solo para estar seguro ...
Gary Rowe

8

No me gusta usar un rompecabezas o una pregunta de diseño como una pregunta de pizarra. Prefiero preguntas sencillas y sencillas que evalúan la capacidad del candidato para escribir algún código. Mis favoritos son:

1) Escriba una función para invertir una lista vinculada individualmente. (Les lleva un tiempo darse cuenta de que necesitan 3 punteros).

2) Dado un árbol binario, encuentre la profundidad del árbol binario. (Esta pregunta prueba su capacidad para escribir código recursivo. Me permite verificar si tienen su caso base intacto).

3) Escriba un procedimiento para la búsqueda binaria en una matriz de enteros. (Como dice Jon Bentley (en Programming Pearls), muchas personas tienden a cometer errores al escribir búsquedas binarias. Luego se puede seguir buscando errores, escribir casos de prueba, revisar el código, etc.)


+1, me gusta que su enfoque no tenga ningún sentido preguntarle a alguien Programas dinámicos o tales conceptos cuando apenas se usan en la programación empresarial. + El énfasis debe estar también en la calidad del código y no solo en la solución.
Geek

No me importa hacer preguntas de diseño, pero una vez me entrevisté con un tipo cuyo pasatiempo era hacer rompecabezas, y tenía algunas preguntas horribles. Era como si le hiciera preguntas a alguien sobre artes marciales.
Bob Murphy

Probablemente debería asegurarse de que la gente sepa que te refieres a "matriz ordenada" en (3) ¿verdad?
HaveAGuess

7

Usamos esto en una empresa para la que trabajé.

Le entregamos al candidato una hoja de papel utilizada para el seguimiento del tiempo. Era una hoja de tiempo real utilizada por una o nuestras divisiones. Le pedimos al candidato que nos guiara por el proceso de diseño para crear una mejor herramienta de seguimiento del tiempo. Sin límites, no dije qué idioma, etc., solo quiero ver qué tan bueno era el candidato en el "ciclo de vida completo". Nos dio una idea real de cómo reunieron los requisitos. Cómo estructuraron las tablas de la base de datos, qué tipo de interfaz de usuario podrían hacer. Obviamente, se necesitaban habilidades de comunicación para esta tarea. Por lo general, se hacía en una habitación con varias pizarras blancas grandes y duraba hasta 2 horas.

Contratamos a varias personas usando este proceso y si les fue muy bien en la tarea, nos fue muy bien a nosotros. Si eran marginales y decidimos contratarlos de todos modos (tema separado), eran programadores marginales.


6

Uso un problema que es relevante para mi dominio de programación.

Si desarrollo aplicaciones web, quiero ver cómo pueden elaborar un formulario web que elimine registros, y qué enfoque podrían tomar para eliminar el registro de la base de datos, por ejemplo. Esto me dice si conocen los principios básicos de la base de datos, cómo interactúan con el usuario para verificar la eliminación y si saben qué es una eliminación suave.

No tengo un favorito El problema que elijo variará mucho según el trabajo.

No me importa si pueden resolver el problema por completo o no en una entrevista, qué tecnologías e idiomas usan o qué tan mal se ve su código en una pizarra. Estoy buscando un patrón de pensamiento; Quiero ver si saben cómo pensar y resolver problemas.


2
+1 Para el último párrafo, que es todo importante. Por lo general, no es la respuesta lo que importa en tales cosas, sino el camino tomado para llegar allí. Como todos mis profesores de matemáticas dijeron "¡demuestre su trabajo!"
Orbling

4

Mi favorito era uno que usaba un amigo mío.

Escríbeme una función para generar / imprimir / almacenar los primeros números primos "n" y luego explicar cómo funciona y qué tan eficiente es.

Funciona bien porque:

  1. Es una pregunta algorítmica, por lo que requiere que el entrevistado pueda pensar y luego explicar su pensamiento, para que pueda ver cómo funciona su cerebro.

  2. Es independiente del lenguaje.

  3. Casi nadie lo hace completamente bien (generalmente hay un caso límite que se pierden (1 o 2 normalmente), o no manejan números negativos, así que puedes ver cómo manejan los errores y que te digan que están equivocados.

  4. La mayoría lo hace como un tamiz simple pero muy lento (p. Ej., El 80% de las personas comprobarán que n es primo al dividir n entre todos los enteros menos que n), lo que le brinda un amplio margen para conversaciones sobre cómo podrían mejorar el algoritmo basado en compensaciones espacio / tiempo, por ejemplo, "¿por qué está dividiendo un número por 4 si ya sabe que no es divisible por 2?" o "Has deducido que solo necesitas dividir entre todos los números primos menores que sqrt (n), pero eso requiere que guardes esos números en algún lugar, ¿cuáles son las implicaciones de eso?")

No es necesario que obtengan la respuesta correcta. Si alguien puede pensar y explicar su pensamiento, entonces están muy lejos de ser un buen candidato.


Una vez recibí una pregunta de entrevista, donde me dieron un bloque de código C muy ofuscado, y me pidieron averiguar qué hacía. En una forma muy redonda, imprimió todos los demás números primos. 300 personas presentaron una solicitud y me ofrecieron el trabajo, ya que aparentemente yo era el único candidato que les dijo cuál era el propósito, en lugar de obtener los valores. Entonces sí, +1, los números primos son una buena comprobación. Particularmente si se les ocurre un tamiz, aunque eso cambia la complejidad computacional por la complejidad del espacio.
Orbling

1
1 no es primo ..

2
@ Thorbjørn: bueno, obviamente, pero un buen porcentaje de las rutinas que he visto escritas para resolver este problema me han dicho que sí
Rhys Gibson

entonces tienen un error :)

3

Algo llamado aff_z, que era parte de los exámenes C de mi escuela de ingeniería y se usó como una prueba "falsa" para que los estudiantes reprobaran cuando regresaban de vacaciones (nuestro sistema de calificación implicaba que reprobar una prueba detuvo la calificación, por lo que reprobar esa prueba falsa podría invalidar toda la prueba. Te obliga a prestar atención a los detalles imbéciles). Lo reutilicé una o dos veces durante las entrevistas.

De todos modos ... Olvidé la formulación exacta pero era algo así ...

Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:

 - if c is bigger or equal to 0, then print 'z' to standard output
 - if c is stricly smaller than 0 , then print 'z' to standard output
 - in any other case, print the letter 'z' to standard output

Lo triste es que no solo algunos estudiantes encontrarían soluciones extremadamente complicadas cuando la respuesta es bastante obvia, sino que algunos incluso podrían fallar.

Y lo creas o no, también sucedió durante las entrevistas.

Ejecutarlo en entrevistas fue bastante divertido, ya que algunos solicitantes comenzarían a escribir las posibles ramas y luego se darían cuenta de lo que está mal (obviamente, si solo les preguntas oralmente, es bastante comprensible que lo hagan mientras hablas ... pero si darlo por escrito, me parece desconcertante ...)

Es tonto, pero supongo que es un examen minimalista (de manera similar, al contratar programadores de JS, siempre pregunto cómo declarar una variable, y luego, dependiendo de su respuesta, si usar var hace alguna diferencia o no). honestamente.)


1
¿Alguna vez tuvo candidatos en las entrevistas que se sintieron insultados por esto? ¿O piensa que simplemente se estaba divirtiendo a costa de ellos en lugar de realizar una entrevista seria?
Nicole

@Renesis: Primero tuve algunos que me miraban con una sonrisa. Algunos de los cuales fallaron la prueba. En general, los buenos candidatos se ríen si no. Para los programadores de JS, por ejemplo, tuve muchos candidatos que no respondieron la entrevista con un "duh", variablename = variablevalue;mientras que los buenos simplemente se reían por teléfono o en persona y me decían directamente cuáles serían las diferencias con o sin ellas. var)
haylem

1
@Renesis: Además, no podría importarme menos si algunos se ofenden. No es discriminatorio de ninguna manera. Si se ofenden, supondré que son el tipo de persona a la que no le gusta que lo pongan a prueba o que lo interroguen. Sin embargo, nunca tuve solicitantes que sintieran que me divertía a su costa. Por lo general, incluso me disculpo antes de hacer preguntas muy simples, ya que podría parecer una pérdida de tiempo para los buenos. Pero la cuestión es que no es una pérdida de tiempo para mí. No preguntarles sería ne, a la larga.
haylem

@Renesis: Y más a menudo que no, lo que obtuve después de la sonrisa / risa / mirada ofendida fue una expresión de vergüenza y una disculpa de quien falló o comenzó a escribir la ramificación para toda la prueba cuando se dieron cuenta de que era inútil. Sí, me divierto un poco dando este examen, pero no lo haría si no fuera por una buena razón.
haylem

Personalmente, me daría una palmada mental al leer eso y me preguntaría si alguien más escribió la pregunta para que el entrevistador se burlara de él.
wildpeaks

3

Realmente depende de lo que esté buscando, como organización que realiza mucho trabajo web dinámico que involucra imágenes, tiendo a hacer una pregunta de geometría pertinente para el trabajo. En cualquier caso, tiendo a hacer una pregunta de geometría, ya que me parece una buena prueba de matemáticas que es agradable y visual y puede mostrar la capacidad de un candidato para presentar visualmente su trabajo y resolver metódicamente un problema.

Para candidatos avanzados, ocasionalmente hago la siguiente pregunta:

Esta imagen muestra una luna creciente. El ancho de la media luna de B a D es de 9 cm y entre E y F, 5 cm. C es el centro del círculo más grande.

a) Calcule el área de la media luna. Pregunta de matemáticas de la luna creciente

b) Describa los cálculos necesarios para cambiar el tamaño de una imagen para que se ajuste al círculo interior desde cualquier tamaño dado, y colóquela dentro del círculo si se conoce el punto central.

Para una pregunta más fácil, generalmente doy el mismo tipo de pregunta, pero uso el ejemplo "cuadrado dentro de un círculo dentro de un cuadrado". Aunque esto es muy fácil, esperaría un álgebra perfecta.

Cuadrado dentro de un círculo dentro de un cuadrado

Más allá de eso, tiendo a pedirles que activen un algoritmo para generar todas las combinaciones de un conjunto de datos de longitud variable.


1
La respuesta para a) es 128.75? (No sé si cometí algún error). Me gusta, pero se trata más de geometría.
Hoàng Long

2
Además, perdón por la demora en comentar. Por regla general, no me gusta hacer votos negativos y doblemente sin comentar por qué. Mi voto negativo no se trata de la pregunta en sí, ciertamente tiene un propósito para ti, simplemente no creo que tenga un contexto adecuado en una entrevista de programación.
Philip Regan

77
-1 porque la geometría es un buen candidato para el Aprendizaje Just In Time, y no refleja mi capacidad para crear software de calidad.
Malfist

2
Disfruté este problema. Espero que no te importe que comparta mi solución con la parte (a). Los diámetros difieren en 9 cm, por lo que si el círculo interno tiene radio r, el círculo externo tiene radio r + 4.5. El área de la media luna es la diferencia en las áreas de los círculos: pi (r + 4.5) ^ 2 - pi * r ^ 2. Todo lo que queda es encontrar r. Defina C como el punto (0,0), luego el punto E está en (0, r - 0.5) (porque CE es 5 cm menos que el radio mayor). El círculo interno se desplaza hacia la derecha 4.5 cm, por lo que su ecuación es (x - 4.5) ^ 2 + y ^ 2 = r ^ 2. Conecte (x, y) = (0, r - 0.5) y resuelva para r.
Tim Goodman

2
+1 porque creo que es una buena pregunta para un trabajo que requiere geometría. Hay mucho razonamiento involucrado, no solo enchufar una fórmula. Dicho esto, conozco a algunos buenos programadores que se habrían tropezado solo porque no tenían tanto como pensar en círculos en 10 años, pero la pregunta no pide una pregunta adecuada para ninguna entrevista de desarrollador. La pregunta SQL actualmente más votada (que también me gusta) es al menos tan específica del trabajo.
Tim Goodman

3

Las mejores respuestas de FizzBuzz que he visto son:

SQL Server 2008

;WITH mil AS (
 SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

C # (simple)

foreach (int number in Enumerable.Range(1, 100))
{
    bool isDivisibleBy3 = (number % 3) == 0;
    bool isDivisibleBy5 = (number % 5) == 0;

    if (isDivisibleBy3)
         Console.Write("Fizz");

    if (isDivisibleBy5)
         Console.Write("Buzz");

    if (!isDivisibleBy3 && !isDivisibleBy5)
         Console.Write(number);

    Console.WriteLine();
}

C # (inteligente)

 Enumerable
  .Range(1, 100)
  .Select(i =>
    i % 15 == 0 ? "FizzBuzz" :
    i % 5 == 0 ? "Buzz" :
    i % 3 == 0 ? "Fizz" :
    i.ToString())
  .ToList()
  .ForEach(s => Console.WriteLine(s));

1
Es posible que desee agregar en qué dialecto SQL en particular está escrito.

Se ve bien con el estilo funcional.
Orbling

2

Busco un par de cosas en los candidatos que he entrevistado. Por razones que no puedo describir en línea, tenemos candidatos bastante pobres, y he llegado a esperarlo, así que soy bastante fácil con ellos. Aún así, busco:

  • Conciencia del diseño.

    "Muéstrame la estructura de la tabla para un programa de libreta de direcciones que tiene Contactos con nombres y apellidos que pueden tener múltiples números de teléfono con una descripción del número (celular / hogar / trabajo / etc.)"

    No estoy buscando un diagrama de especificaciones UML 2.0 aquí, un simple diagrama de burbujas aquí está bien. Mientras sea razonable.

  • Conocimiento de trabajar con una base de datos (es decir, SQL)

    1. Escriba una consulta para obtener todos los números de teléfono de personas con el apellido "smith"
    2. Escriba una consulta para obtener todos los clientes en la base de datos y los números de teléfono de los que tienen el apellido "smith"
  • Conocimiento de las pruebas

    Suponga public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)que existe un método con la firma que devuelve los resultados de su consulta de antes. Suponga que si pasa un valor nulo al método, arroja una NullReferenceException. Escriba una prueba para demostrar esta funcionalidad.

    Escriba una prueba que demuestre que GetPhoneNumbers devolverá un número de teléfono de casa (123)456-7890 para alguien con el apellido "smith".

  • Conocimiento de cómo escribir un código

    Implemente un método que cumpla con los requisitos de las pruebas que escribió.


Teniendo en cuenta el número y la calidad de los solicitantes que hemos recibido, he entrevistado a todos los que han presentado una solicitud seria. No he contratado a nadie.


En SQL # 2, ¿estás hablando de hacer esto todo en una consulta? ¿El propósito es solo medir la comprensión de las uniones izquierda / derecha o internas?
Nicole

@Renesis: Sí, lo es.
Steven Evers

2

Por lo general, dejo que dibujen un diagrama de bloques del último sistema en el que han trabajado, preguntando sobre las relaciones entre los bloques y luego les dejo que expliquen sobre el bloque en el que estaban trabajando / a cargo. Puede aprender muchos de este ejercicio, como la forma en que uno mira más allá de su pequeño dominio, cuánto es importante para él saber "dónde" está actuando, también puede aprender sobre el papel que estaba desempeñando, si era una clave o un lado papel.


2

Escriba un algoritmo para el siguiente problema: dado un número n , genera el número total de árboles binarios (únicos) que tienen n nodos.

Por lo tanto, para n = 0 yn = 1, la respuesta es 1. Para n = 2, tiene 2: el nodo raíz, y luego el segundo nodo a la izquierda o la derecha.

Puede obtener información sobre las técnicas de diseño y ver si piensan en la recursividad o la memorización o la solución de programación dinámica.

[Vea también esta discusión de StackOverflow para el caso relacionado, pero diferente, de árboles de búsqueda binaria.]


Entonces, ¿un programador de UI que no conoce la programación dinámica es un mal programador? ¿Por qué cualquier programador de negocios que no puede recordar la programación dinámica es malo? Muchos adolescentes en topcoder atravesarán un problema de programación dinámica, pero echen un vistazo al código que escriben.
Geek

@ Geek: Recuerde que los problemas de "pizarra" son una forma de ver el proceso de pensamiento de alguien. Los problemas de programación dinámica deberían pertenecer a esta discusión, ya que son muy populares entre Google, entre otros.
Macneil

No estoy en desacuerdo pero tengo dos preguntas. 1. ¿Resolviendo lo desconocido? Los problemas de DP se convierten en una caminata en el parque si ha resuelto algunos problemas en el pasado reciente o si aún recuerda el concepto fuera de la universidad. Alguien que lo haya olvidado definitivamente no lo hará bien en la pizarra. 2. Si alguien tiene problemas para resolver un problema, no hay forma de cuantificar la calidad de su código. ¿Qué hay de dar un problema en algo como un LinkList o Strings o Arrays para que la persona pueda resolver el problema y escribir código?
Geek

No necesariamente esperaría que un entrevistado lo haga bien, sin embargo, algunas compañías lo harán.
Macneil

@ Geek: "un ... programador que no conoce la programación dinámica es un mal programador" - . Dicho esto, estoy de acuerdo en que pensar en programación dinámica no es trivial cuando no estás acostumbrado. Pero saberlo es una necesidad absoluta.
Konrad Rudolph

2

Si tuviera que entrevistar a un desarrollador de software, le pediría que diseñara un software y describiera los requisitos de hardware para eliminar entradas duplicadas de un archivo arbitrariamente grande que contenga un nombre completo en cada línea. Dejo algunas partes de la descripción del problema ambigua a propósito. Luego lo desafío a ver si comprende analizar y aclarar los requisitos, diferentes compensaciones, estructuras de datos y algoritmos, E / S (almacenamiento secundario), tecnologías de software y hardware, escalabilidad, etc.

Creo que es un problema pequeño pero desafiante, que revela el conocimiento y las habilidades del solicitante en muchas áreas de computación.


2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

Muchos chicos podrían atorarse en esto. Si se da alguna solución, generalmente utiliza la recursividad. Después de esto:

Implement the same via 'for'-loop

No puedo decirle cuántos compañeros no pueden completar ambas tareas: 50% de los candidatos.
Por eso me gusta :)


¿Qué pasa si la primera implementación se realiza a través de un bucle for?
Darknight

2
Se propone implementar una versión recursiva. Por lo general, después de for-loop, los chicos implementan con éxito la versión recursiva.
alexb

O se podría aplicar esto como una sola instrucción: fib(n)=round(power(PHI,n)/SQRT5). PHI y SQRT5 son constantes que representan la proporción áurea (1.618 ...) y la raíz cuadrada de 5, respectivamente.
oosterwal

2

Para las bases de datos voy con:

Mesa: Cosas

Nombre de ID
1 Bodkin Van Horn
2 Hoos-Foos
3 Hoos-Foos
4 Hot-Shot
5 Cara de globo de Marvin O'Gravel
6 Snimm
7 Cara de globo de Marvin O'Gravel
8 Cara de globo de Marvin O'Gravel
9 Dave

Escríbame un SQL que elimine la duplicación de una tabla como esta en función del nombre (y no me importa qué ID recupero, pero la que se devuelva debe ser válida para ese nombre). Entonces, la tabla, una vez que se haya aplicado el SQL correcto, presentará algo como:

Mesa: Cosas

Nombre de ID
1 Bodkin Van Horn
2 Hoos-Foos
4 Hot-Shot
5 Cara de globo de Marvin O'Gravel
6 Snimm
9 Dave

Me gusta porque:

  • La desduplicación es un problema del mundo real
  • Hay muchas maneras de hacerlo.
  • Creo que prácticamente todas esas formas necesitan que usted comprenda (ligeramente) SQL más complejo (esencialmente GROUP BY y HAVING) o la capacidad de razonar mediante el encadenamiento de múltiples declaraciones más simples.
  • Debido a esta última parte, incluso si están luchando con la sintaxis o lo que sea, puedes preguntarles qué están pensando y hablar de esa manera.
  • Hace referencia al Dr. Seuss

(Aquí es donde encuentro que hay una forma completamente trivial de hacer esto y he estado complicando todos estos años).


1
Supongo que no sé lo que cuenta como "completamente trivial" ... Algo así SELECT min(ID), Name FROM Things GROUP BY Namefuncionaría, ¿verdad?
Tim Goodman

@Tim: eso te da la cuenta de todo. Solo quiero aquellos con duplicados. Los resultados editados manualmente no cuentan, suponga que se está escalando a millones de filas. Es un problema fácil, pero en mi experiencia, el 80% de las personas que afirman conocer SQL no pueden llegar tan lejos como su primera puñalada.
Jon Hopkins

@ Jon: No estoy seguro de lo que quieres decir con "Eso da la cuenta de todo". Desde su solución de ejemplo, parece que lo que quiere es una fila para cada nombre distinto. Según sus comentarios, parece que quiere decir algo así HAVING count(Name) > 1, pero supongo que su respuesta de muestra debería omitir a Bodkin Van Horn, Hot Shot, Snimm y Dave.
Tim Goodman

@Tim - Tienes razón, no está muy claro. Lo editaré cuando tenga unos minutos.
Jon Hopkins, el

1
Creo que podría hacer esto: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). ¿Tienes una solución preferida?
Tim Goodman el

2

Mi problema favorito de la pizarra C ++ es que el candidato implemente

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

De esto puedo aprender

  • si el candidato reconoce que no se puede sobrecargar en el tipo de retorno (indicación de nivel ++ de C ++)
  • si el candidato sabe cómo devolver un operador de lanzamiento temporal e implementar (indicación de nivel intermedio C ++)
  • si el candidato puede hacer matemática vectorial básica (importante para nuestro dominio de aplicación)

2

¿Cómo representaría un mazo de 52 cartas estándar? Cualquier lenguaje de programación está bien. ¿Cómo barajarías las cartas?


vector <Card> con la función aleatoria de C ++ :)
plegado a la derecha el

1

Mi favorito es comenzar preguntando el prototipo de printf. Luego, dado un API de bajo nivel printc (char c), que imprimirá un carácter, implementa printf. Da todo tipo de respuestas interesantes como que la pila es parte de la CPU. Como habrás adivinado, soy de un fondo C e incrustado.


No entiendo lo de "la pila es parte de la CPU".
barjak

Cualquiera que sepa algo sobre arquitectura de computadoras lo sabría. Para mí no tiene ninguna relación, por lo que el tipo está demostrando su ignorancia.
Michael K

@aufather: Si no recuerdo mal, tienes que llamar varargs()o alguna función como esa. ¿Estoy en lo correcto? Solo lo hice una vez para decir que lo hice hace un tiempo.
Michael K

@barjak: una vez que comience a implementar printf, deberá acceder a su pila, y tengo respuestas de que la pila está en la CPU.
aufather

@Michael: en el mundo integrado, debe conocer muy bien la arquitectura de su plataforma. Entonces, esta pregunta elimina rápidamente al ignorante desde el principio.
aufather

1

Tienes un tazón con 200 peces. De estos peces, el 99% no son guppies. ¿Cuántos peces debes eliminar para que el 2% de lo que queda sean guppies? Muestra tu trabajo.

Esto se trata de requisitos confusos. Se dice de esta manera para cambiar las perspectivas varias veces durante la misma pregunta. Está destinado a ver si pueden descubrir lo que realmente está sucediendo.

Te sorprendería cuántas personas se equivocan.


44
Agregue dos Oscar de 12 pulgadas en el tazón, eliminarán el 98% de los guppies muy pronto.
Geek

¿Qué sucede si eliminas un guppy?

1
1% de guppies, = 200 x 1% = 2 (200-2 = 198 otros peces), donde 2 = 2%, peces restantes = 98% = 98 (1: 1). 98 = 198-100 => answer = 100. [Suponiendo que puede elegir selectivamente el otro pez. Si se eliminan los guppies, hay otras respuestas.] Buena pregunta, se sorprendería de cómo pocas personas manejan tan bien, aunque debería ser un juego de niños para un programador.
Orbling

1

Tengo algunos favoritos, pero aquí hay una pareja que casi siempre aparece. La mayoría de las veces estoy haciendo entrevistas técnicas (C ++) de la ronda final, así que prefiero preguntas más largas y abiertas que conduzcan a nuevas áreas de interés. No hay una respuesta "correcta", solo una apertura a otra conversación.

1) Implementación de un puntero compartido básico, explicaciones de dónde hay deficiencias en comparación con tr1 o los punteros compartidos de impulso en su implementación, cómo se debe usar, etc.

2) Una revisión de código. Para los empleados experimentados, esperamos que puedan revisar con confianza algunos códigos proporcionados por problemas de diseño, errores, horrores de codificación y posibles problemas de mantenimiento. Además, por supuesto, cómo lo arreglarían; y, a veces, cómo le darían ese mensaje al desarrollador junior que están derribando.


1

Una pregunta que he estado usando desde que se usó en mí es la siguiente:

Escriba una función para imprimir todos los números entre 1 y 100.

Una gran parte de la razón por la que lo he estado usando se debe al hecho de que puede tomar la solución y moverse en varias direcciones:

¿Cómo modificaría la función para imprimir todos los números entre 1 y 1000, 10000 o n ?

Sus respuestas a estas preguntas podrían darle una idea de cómo responden a los requisitos cambiantes, así como si pueden reconocer las consideraciones de rendimiento. Un candidato fuerte podría responder con una pregunta con respecto a la función que se necesita y con qué frecuencia se llamaría.

Moverse en una dirección diferente:

¿Cómo cambiaría las cosas si supiera que esta función se llamará varias veces por minuto y el rendimiento es una preocupación?

Utilizo esto como una forma de verificar su pensamiento lateral. Dado que el cálculo de los números primos puede ser lento a medida que el valor máximo aumenta, a veces tiene más sentido usar algún tipo de tabla de búsqueda calculada o calculada previamente que se ajusta en función del problema que está tratando de resolver.


1

Aquí hay uno para provocar un pensamiento: es sencillo, implica un poco de matemática y verifica el conocimiento del candidato sobre el diseño básico de la computadora (desbordamiento, representación numérica, etc.):

Escriba un programa (o procedimiento) que tome un par de enteros X, Y como entrada y determine si X * Y es divisible por 10. NOTA IMPORTANTE: X e Y pueden ser lo suficientemente grandes como para que X * Y desborde el tipo entero más grande disponible en tu máquina


Solución de muestra:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}

0

Complete el siguiente método: PS Un modo de un número es el número (en la lista) que tiene más ocurrencias.

public int getMode(List<Integer> numberList) {


}

Esto es para ver de eficacia es su código.


-2

¿Cómo representaría una matriz de repuesto que es relativamente grande ... digamos 1000x1000 pero tiene como máximo 100 entradas distintas de cero?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.