Shopify: quem me entrevistou para a posição de engenheiro de pessoal? Júnior?

Certamente muitas pessoas conhecem o Shopify - sua rede é bastante grande e, ontem, foi posicionada pela empresa nº 8 na rede do LinkedIn (de acordo com a classificação dos empregadores, se não me engano).

Um belo dia, vi a posição de engenheiro de software da equipe em Ottawa e lembrei que os funcionários trabalham, inclusive com big data e, consequentemente, com o aprendizado de máquina, o qual sinto muita falta depois de trabalhar na IBM, inclinou-se sobre esta posição.

A entrevista é bastante comum - primeiro, uma ligação de 15 minutos do recrutador para garantir que eu esteja vivo ou não, depois uma história de uma hora "vitalícia" com outro recrutador e, em seguida, uma breve tarefa por 20 minutos, que é uma espécie de barreira, eliminando bem, provavelmente irracional.

A propósito, exatamente há um ano, em maio de 2019, eu também os entrevistei, segui todas as etapas acima, mas recebi uma oferta mais deliciosa de outra empresa, a 5 km da casa, enquanto no escritório do Shopify era necessário vá para o centro, e isso é cerca de uma hora, e o estacionamento não é barato. E justamente porque no ano passado gostei do processo e da adequação dos funcionários - decidi ir novamente.

Mas em algum momento, algo deu errado.

Tudo começou com o fato de que a tarefa que me pediram para resolver era a seguinte:
O comprador vem à loja para comprar produtos. Ele tem uma cesta onde pode colocar algo e a loja deseja estimular ainda mais o comprador, oferecendo descontos adicionais em mercadorias:

1. Se o comprador comprar mais de uma maçã, ele receberá um desconto de 20% em todas as maçãs da cesta;
2. Se o comprador comprar um pacote de uvas, ele receberá o segundo pacote gratuitamente.

Conclusão: calcule o custo da cesta do comprador ao sair da loja, enquanto os dados são fornecidos da seguinte 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

onde o primeiro elemento da matriz aninhada é o nome do produto e o segundo elemento é a quantidade do produto desse tipo na cesta.

Os preços dos alimentos são os seguintes:
- maçã (US $ 3)
- uvas (US $ 5)
- pêssegos (US $ 7)

Eu disse que tudo bem, o entrevistador perguntou qual idioma eu preferiria, ao qual eu respondi “Java” e comecei a avaliar a tarefa.

Minha primeira pergunta parecia inocente:
Que estrutura de dados devo esperar como entrada?

A resposta foi ainda mais simples:
Matrizes (matrizes). Crie um método adicional e descreva os dados manualmente.

Bem, pensei, já que não estamos procurando maneiras fáceis, e também considerando que a entrevista ainda está na posição de Engenheiro da equipe, eles provavelmente querem me ver implementando usando abstração e genéricos, algo como isto:
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;}
}

e seu 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);
   }
}

e como estávamos em um recurso compartilhado, fiz uma pergunta inocente, mas como criar uma classe adicional, porque realmente não queria usar o Static, e parece que não é útil nesse caso.

Fiquei um pouco surpreso quando ouvi uma resposta como - “Por quê? Basta usar matrizes e tudo, por que complicar tudo? ” Eu perguntei especificamente novamente sobre matrizes - exatamente matrizes? A resposta não foi alterada.

Bem, matrizes, então matrizes, embora com classes estáticas, desde que a excitação começou - a tarefa não era tão simples quanto parecia à primeira vista.

A segunda questão, de fato, decorreu da primeira:
Qual é o tamanho esperado dos dados?

Esperem senhoras e senhores, pois a resposta foi legal:
O tamanho pode variar, mas não menos que 3 elementos.

Desculpa? Claro, eu posso criar uma matriz com dados dinamicamente, onde haverá uma variável parametrizada como o comprimento da matriz, mas preciso saber quantos objetos vou precisar inserir na matriz - afinal, depois de criar a matriz uma vez, não posso alterar seu comprimento. Portanto, aqui tive que explicar literalmente ao entrevistador como as matrizes são criadas dentro da JVM, por que seu tamanho é fixo e por que seu comprimento não pode ser redefinido após a criação - apenas criando um novo e copiando os dados.

Naquele momento, quando eu estava explicando o básico da "construção em massa", mencionei a interface List e disse que, por exemplo, ArrayList, como uma das implementações da interface, embora seja baseada em matrizes internas, mas permita tamanho dinâmico.

O entrevistador ficou um pouco pensativo e disse: "Ótimo, use um ArrayList e insira os dados lá". By the way, levou cerca de 15 minutos até que todos nós descobrimos isso e eu expliquei a ele sobre as matrizes (no total, uma hora foi dada). Perguntei como inserir, se já usamos genéricos ou não - nada foi escrito ainda, mas se continuarmos a esse ritmo, talvez você não tenha tempo.

O entrevistador emitiu outra pérola, depois da qual percebi que era uma trombeta. Ele simplesmente escreveu o seguinte em um quadro comum:
"Uvas" => 1º elemento
1 => 2º elemento

Provavelmente, meu gemido foi audível, mas tive que fazer uma pergunta - meu caro, como inserir dados heterogêneos em um ArrayList sem usar abstração e genéricos? Devo declarar o tipo de dados ao criar a estrutura. Bem, você realmente quer que eu use Object e continue fazendo casting em todos os lugares, dependendo da posição do elemento?

Sua ingenuidade me impressionou - "Mas é realmente impossível inserir dados numéricos e de seqüência de caracteres em uma planilha?" Digo, sim, é claro que você pode, mas com abstração e genéricos, ou Object e typecasting, ou não em Java, mas em JavaScript, por exemplo. Então eu não aguentei e sugeri, bem, pelo menos vamos converter os números em variáveis ​​de string - menos trabalho, se você insistir em ArrayList, mas continue - você ainda pode usar a interface Map?

O entrevistador, embora não imediatamente (não comecei a descobrir os motivos, para ser sincero - restavam cerca de 25 minutos), concordou e disse - vamos para o Mapa. Passei 10 minutos para jogar o esqueleto do código, verifiquei as condições de contorno e disse que tinha terminado.

Acabou por não estar lá, e tudo o mais interessante estava à frente. Lembra dos descontos? Vou citar a condição novamente:
Se o cliente compra uma uva, ele recebe outra gratuitamente. (Se o comprador comprar um pacote de uvas, o segundo receberá gratuitamente).

Nesse caso, podemos assumir que ter dados no formato:
["grapes", 2]

na quantidade deste produto pode ser levado em conta e pacotes de uva grátis. A imagem deve ser a seguinte:

1. O comprador comprou 1 pacote de uvas e recebeu 1 gratuitamente. O resultado - na cesta 2 pacotes.
2. O comprador comprou 2 pacotes de uvas e recebeu 2 de graça. O resultado - na cesta 4 pacotes.
3. O comprador comprou 3 pacotes de uvas e recebeu 3 de graça. O resultado - em uma cesta de 6 pacotes.

Você notou o padrão? Na cesta de uvas sempre deve haver apenas uma quantidade uniforme . No entanto, com base nos dados iniciais, há também uma quantidade ímpar de viograd na 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


Nesse caso, vamos prosseguir pelo contrário - já que pode haver uma quantidade ímpar de uvas, apenas as uvas pelas quais o comprador pagou são levadas em conta na cesta. Isso é lógico? Parece tão. Opções quando o comprador simplesmente não pegou as uvas gratuitas não são consideradas.

E agora atenção é a resposta certa!
1   + 1  + 1 

Isso é encantador! Quão? Bem, como poderia ser isso? Sim, não sei tudo, mas posso ter espaços, mas explique-me - como pode ser isso, com base nas condições do problema!? Tentei explicar algo para ele, mas honestamente - acabei de ver um vazio de mal-entendido sobre o que estava falando aos olhos do interlocutor.

Tudo é simples - na frente dele estão os números que ele apresentou e calcularam, por um lado, por outro lado - o que eu dei. Os meus são diferentes, então qual é a resposta? Meus erros - ele é um entrevistador e sua decisão parece estar certa. Em geral, cuspi nesse assunto, já estava com raiva da situação em si, pois esperava algo mais intelectual (é por isso que procuro uma posição onde haverá tarefas mais interessantes), mas acabou ... o que acabou por ser. Decidi abandonar essa posição, mas enquanto escrevia meus comentários, recebi uma rejeição do Shopify.

Ainda enviei meus comentários a eles com comentários que os rapazes agradecem por recusarem, tenho medo de não poder trabalhar com você e descrevi a situação na entrevista, recomendando que seja melhor se preparar para a entrevista, mesmo em tarefas simples que, como você sabe, não é simples.

Essa é a história toda. Cuide-se e tudo de melhor para você.

All Articles