Shopify: ¿quién me entrevistó para el puesto de ingeniero de personal? ¿Júnior?

Seguramente, muchas personas conocen Shopify: su red es bastante grande y, desde ayer, fue posicionada por la empresa número 8 en la red de LinkedIn (según la calificación de los empleadores, si no me equivoco).

Un buen día, vi su puesto de Ingeniero de Software de Personal en Ottawa, y recordando que los muchachos trabajan, incluso con big data y, en consecuencia, con el aprendizaje automático, que francamente extraño después de trabajar en IBM, yo se apoyó en esta posición.

La entrevista es bastante estándar: primero, una llamada de 15 minutos del reclutador para asegurarse de que estoy vivo o no, luego una historia de una hora "de por vida" con otro reclutador, y luego una breve tarea de 20 minutos, que es una especie de barrera, eliminando muy probablemente irracionalmente.

Por cierto, hace exactamente un año, en mayo de 2019, también los entrevisté, realicé todos los pasos anteriores, pero recibí una oferta más deliciosa de otra compañía, que está a 5 kilómetros de la casa, mientras que en la oficina de Shopify fue necesario ir al centro, y esto es aproximadamente una hora, y el estacionamiento no es barato. Y precisamente porque el año pasado me gustó tanto el proceso como la adecuación de los empleados, decidí ir de nuevo.

Pero en algún momento, algo salió mal.

Todo comenzó con el hecho de que la tarea que me pidieron resolver era la siguiente:
El comprador llega a la tienda a comprar productos. Tiene una canasta donde puede poner algo, y la tienda quiere estimular aún más al comprador al proporcionarle descuentos adicionales en productos:

1. Si el comprador compra más de una manzana, recibirá un descuento del 20% en todas las manzanas en la canasta;
2. Si el comprador compra un paquete de uvas, el segundo paquete lo recibirá de forma gratuita.

En pocas palabras: calcule el costo de la cesta del comprador al salir de la tienda, mientras que los datos se proporcionan de la siguiente forma:

[["grapes", 1],["apples", 0],["peaches", 1]] => 12
[["grapes", 1],["apples", 1],["peaches", 1]] => 15
[["grapes", 1],["apples", 2],["peaches", 1]] => 16.8
...
[["grapes", 3],["apples", 1],["peaches", 1]] => 20

donde el primer elemento de la matriz anidada es el nombre del producto, y el segundo elemento es la cantidad del producto de este tipo en la cesta.

Los precios de los alimentos son los siguientes:
- manzana ($ 3)
- uvas ($ 5)
- duraznos ($ 7)

Le dije que estaba bien, el entrevistador me preguntó qué idioma preferiría, a lo que respondí "Java" y comencé a evaluar la tarea.

Mi primera pregunta sonó inocente:
¿Qué estructura de datos debo esperar como entrada?

La respuesta fue aún más simple:
Matrices (matrices). Cree un método adicional y describa los datos allí manualmente.

Bueno, pensé, ya que no estamos buscando formas fáciles, y también teniendo en cuenta que la entrevista aún está en la posición de Ingeniero de personal, lo más probable es que quieran verme implementar usando abstracción y genéricos, algo como esto:
class Values<T> {
   T data;
   Values() {}
   Values(T data) {this.setData(data);}
   public void setData(T data) {this.data = data;}
   public T getData() {return this.data;}
}

y su uso:
public class Main {
   public static void main(String[] args) {
      Values[][] item = new Values[3][2];
      item[0][0] = new Values("grapes");
      item[0][1] = new Values(1);

      item[1][0] = new Values("apples");
      item[1][1] = new Values(1);

      item[2][0] = new Values("peaches");
      item[2][1] = new Values(1);
   }
}

y como estábamos en un recurso compartido, hice una pregunta inocente, pero cómo crear una clase adicional, porque realmente no quería usar Static, y parece que no es útil en este caso.

Me sorprendió un poco escuchar una respuesta como: "¿Por qué? Solo usa matrices y todo, ¿por qué complicar todo? Le pregunté específicamente de nuevo acerca de las matrices, ¿exactamente matrices? La respuesta no cambió.

Bueno, las matrices, entonces las matrices, aunque con clases estáticas entonces, desde que comenzó la emoción, la tarea no era tan simple como parecía a primera vista.

La segunda pregunta, de hecho, surgió de la primera:
¿Cuál es el tamaño de datos esperado?

Esperen damas y caballeros, porque la respuesta fue genial:
El tamaño puede variar, pero no menos de 3 elementos.

¿Lo siento? Por supuesto, puedo crear una matriz con datos dinámicamente, donde habrá una variable parametrizada como la longitud de la matriz, pero necesito saber cuántos objetos necesitaré insertar en la matriz; después de todo, después de haber creado la matriz una vez, no puedo cambiar su longitud. Por lo tanto, aquí tuve que explicarle literalmente al entrevistador cómo se crean los arreglos dentro de la JVM, por qué su tamaño es fijo y por qué su longitud no puede redefinirse después de la creación, solo creando uno nuevo y copiando los datos.

En ese momento, cuando estaba explicando los conceptos básicos de "construcción masiva", mencioné la interfaz List y dije que, por ejemplo, ArrayList, como una de las implementaciones de la interfaz, aunque se basa en matrices en el interior, pero permite un tamaño dinámico.

El entrevistador estaba un poco pensativo y dijo: "Genial, luego use una ArrayList e inserte los datos allí". Por cierto, nos llevó unos 15 minutos hasta que todos descubrimos esto y le expliqué acerca de los arreglos (en total se dio una hora). Pregunté cómo insertar, si ya usamos genéricos o no; no se ha escrito nada todavía, pero si continuamos a ese ritmo, es posible que no tenga tiempo.

El entrevistador emitió otra perla, después de lo cual me di cuenta de que era una trompeta. Simplemente escribió lo siguiente en una pizarra común:
"Uvas" => 1er elemento
1 => 2do elemento

Probablemente mi gemido fue incluso audible, pero tuve que hacerle una pregunta: mi querido hombre, ¿cómo puedo insertar datos heterogéneos en una ArrayList sin usar abstracción y genéricos? Debo declarar el tipo de datos al crear la estructura. Bueno, ¿realmente quieres que use Object y continúe haciendo casting en todas partes, dependiendo de la posición del elemento?

Su ingenuidad me sorprendió: "¿Pero es realmente imposible insertar una cadena y datos numéricos en una hoja?" Le digo que sí, por supuesto que puede, pero con abstracción y genéricos, o con Object y typecasting, o no en Java, sino en JavaScript, por ejemplo. Entonces no pude soportarlo y sugerí, bueno, al menos convierta los números a variables de cadena, menos trabajo, si insiste en ArrayList, pero continúe, ¿aún puede usar la interfaz de Mapa?

El entrevistador, aunque no de inmediato (no comencé a descubrir las razones, para ser honesto, quedaban unos 25 minutos), estuvo de acuerdo y dijo: vamos al Mapa. Pasé 10 minutos para lanzar el esqueleto del código, verifiqué las condiciones de contorno y dije que había terminado.

Resultó no estar allí, y todo lo más interesante estaba por delante. ¿Recuerdas los descuentos? Citaré la condición nuevamente:
Si el cliente compra una uva, obtiene otra gratis. (Si el comprador compra un paquete de uvas, el segundo lo recibirá gratis).

En este caso, podemos suponer que tener datos en el formato:
["grapes", 2]

en la cantidad de este producto se puede tener en cuenta y paquetes de uva gratis. Entonces la imagen debería ser la siguiente:

1. El comprador compró 1 paquete de uvas y recibió 1 gratis. El resultado - en la cesta 2 paquetes.
2. El comprador compró 2 paquetes de uvas y recibió 2 gratis. El resultado - en la cesta 4 paquetes.
3. El comprador compró 3 paquetes de uvas y recibió 3 gratis. El resultado: en una cesta de 6 paquetes.

¿Notaste el patrón? En la canasta de uvas siempre debe haber solo una cantidad pareja . Sin embargo, según los datos iniciales, también hay una cantidad extraña de viograd en la cesta:
[["grapes", 1],["apples", 0],["peaches", 1]] => 12
[["grapes", 1],["apples", 1],["peaches", 1]] => 15
[["grapes", 1],["apples", 2],["peaches", 1]] => 16.8
...
[["grapes", 3],["apples", 1],["peaches", 1]] => 20


En este caso, procedamos de lo contrario: dado que puede haber una cantidad extraña de uvas, entonces solo las uvas que pagó el comprador se tienen en cuenta en la cesta. ¿Es lógico? Así parece. Las opciones cuando el comprador simplemente no tomó las uvas gratis no se consideran.

¡Y ahora la atención es la respuesta correcta!
1   + 1  + 1 

¡Esto es encantador! ¿Cómo? Bueno, ¿cómo podría ser eso? Sí, no lo sé todo, pero puedo tener espacios, pero explícame: ¿cómo puede ser esto, en función de las condiciones del problema? Traté de explicarle algo, pero honestamente, solo vi un vacío de malentendido de lo que estaba hablando a los ojos del interlocutor.

Todo es simple: frente a él están los números que se le ocurrieron y calcularon, por un lado, por otro lado, lo que di. Los míos son diferentes, ¿cuál es la respuesta? Mis equivocados: es un entrevistador y su decisión parece ser correcta. En general, escupí sobre este asunto, ya estaba enojado por la situación en sí, ya que esperaba algo más intelectual (es por eso que miro a mi alrededor para encontrar una posición donde haya tareas más interesantes), pero resultó ... lo que resultó ser. Decidí abandonar esta posición, pero mientras escribía mis comentarios, recibí un rechazo de Shopify.

Todavía les envié mis comentarios con comentarios que los muchachos les agradecen por negarse, me temo que todavía no podría trabajar con ustedes y describí la situación en la entrevista, recomendando que es mejor prepararse para la entrevista incluso en tareas simples que, como sabes, no son simples.

Esa es toda la historia. Cuídate y lo mejor para ti.

All Articles