Shopify: qui m'a interviewé pour le poste d'ingénieur du personnel? Junior?

Certes, beaucoup de gens connaissent Shopify - son réseau est assez important et, hier, il était positionné par la société n ° 8 sur le réseau LinkedIn (selon la notation des employeurs, si je ne me trompe pas).

Un beau jour, j'ai vu leur poste d'ingénieur logiciel à Ottawa et je me souviens que les gars travaillent, y compris avec les mégadonnées, et par conséquent avec l'apprentissage automatique, ce qui, franchement, vous me manque après avoir travaillé chez IBM, j'ai s'appuyait sur cette position.

L'entretien est assez standard - d'abord, un appel de 15 minutes du recruteur pour m'assurer que je suis vivant ou non, puis une histoire d'une heure "pour la vie" avec un autre recruteur, puis une brève tâche de 20 minutes, ce qui est une sorte d'obstacle, ce qui élimine probablement absolument absolument déraisonnable.

Au fait, il y a exactement un an, en mai 2019, je les ai également interviewés, j'ai suivi toutes les étapes ci-dessus, mais j'ai reçu une offre plus délicieuse d'une autre entreprise, à 5 kilomètres de la maison, alors que dans le bureau Shopify, c'était nécessaire allez au centre-ville, et cela fait environ une heure, et le parking n'est pas bon marché. Et précisément parce que l'année dernière, j'ai aimé le processus et l'adéquation des employés - j'ai décidé d'y retourner.

Mais à un moment donné, quelque chose s'est mal passé.

Tout a commencé avec le fait que la tâche que l'on m'a demandé de résoudre était la suivante:
L'acheteur vient au magasin pour acheter des produits. Il a un panier où il peut mettre quelque chose, et le magasin veut stimuler davantage l'acheteur en lui offrant des remises supplémentaires sur les marchandises:

1. Si l'acheteur achète plus d'une pomme, il recevra une remise de 20% sur toutes les pommes du panier;
2. Si l'acheteur achète un paquet de raisins, alors le deuxième paquet qu'il recevra gratuitement.

Conclusion: calculer le coût du panier de l'acheteur à la sortie du magasin, tandis que les données sont données sous la forme suivante:

[["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

où le premier élément du tableau imbriqué est le nom du produit et le deuxième élément est la quantité du produit de ce type dans le panier.

Les prix des aliments sont les suivants:
- pomme (3 $)
- raisins (5 $)
- pêches (7 $)

J'ai dit OK, l'intervieweur m'a demandé quelle langue je préférerais, à laquelle j'ai répondu «Java» et j'ai commencé à évaluer la tâche.

Ma première question semblait innocente:
Quelle structure de données dois-je attendre en entrée?

La réponse était encore plus simple:
Tableaux (tableaux). Créez une méthode supplémentaire et décrivez-y manuellement les données.

Eh bien, je pensais, puisque nous ne cherchons pas de moyens faciles, et considérant également que l'entretien est toujours dans la position d'ingénieur du personnel, ils veulent très probablement me voir implémenter en utilisant l'abstraction et les génériques, quelque chose comme ceci:
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;}
}

et leur utilisation:
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);
   }
}

et puisque nous étions sur une ressource partagée, j'ai posé une question innocente, mais comment créer une classe supplémentaire, parce que je ne voulais pas vraiment utiliser Static, et il semble que ce ne soit pas utile dans ce cas.

J'ai été un peu surpris quand j'ai entendu une réponse comme - «Pourquoi? Utilisez simplement des tableaux et tout, pourquoi tout compliquer? " J'ai spécifiquement posé une nouvelle question sur les tableaux - exactement les tableaux? La réponse est restée inchangée.

Eh bien, des tableaux, donc des tableaux, bien qu'avec des classes statiques alors, depuis que l'excitation a commencé - la tâche n'était pas aussi simple qu'elle y paraissait à première vue.

En fait, la deuxième question découle de la première:
Quelle est la taille de données attendue?

Tenez, mesdames et messieurs, car la réponse était cool:
La taille peut varier, mais pas moins de 3 éléments.

Désolé? Bien sûr, je peux créer un tableau avec des données dynamiquement, où il y aura une variable paramétrée comme la longueur du tableau, mais j'ai besoin de savoir combien d'objets je devrai insérer dans le tableau - après tout, après avoir créé le tableau une fois, je ne peux pas changer sa longueur. Par conséquent, ici, j'ai dû expliquer littéralement à l'enquêteur comment les tableaux sont créés à l'intérieur de la machine virtuelle Java, pourquoi leur taille est fixe et pourquoi leur longueur ne peut pas être redéfinie après la création - en créant simplement un nouveau et en copiant les données.

À ce moment, alors que j'expliquais les bases de la "construction de masse", j'ai mentionné l'interface List et j'ai dit que par exemple ArrayList, comme l'une des implémentations de l'interface, bien qu'elle soit basée sur des tableaux à l'intérieur, mais autorise la taille dynamique.

L'enquêteur était un peu réfléchi et a dit: «Super, puis utilisez une liste de tableaux et insérez-y les données.» Soit dit en passant, cela a pris environ 15 minutes jusqu'à ce que nous comprenions tous cela et je lui ai expliqué les tableaux (au total, une heure a été donnée). J'ai demandé comment insérer, que nous utilisions déjà des génériques ou non - rien n'a encore été écrit, mais si nous continuons à aller à un tel rythme, alors vous n'aurez peut-être pas le temps.

L'intervieweur a publié une autre perle, après quoi j'ai réalisé que c'était une trompette. Il a simplement écrit ce qui suit sur un tableau commun:
"Raisins" => 1er élément
1 => 2ème élément

Mon gémissement était probablement même audible, mais je devais lui poser une question - mon cher, comment puis-je insérer des données hétérogènes dans une ArrayList sans utiliser d'abstraction et de génériques? Je dois déclarer le type de données lors de la création de la structure. Eh bien, voulez-vous vraiment que j'utilise Object et que je continue à faire du casting partout, selon la position de l'élément?

Sa naïveté m'a frappé - "Mais est-il vraiment impossible d'insérer une chaîne et des données numériques dans une feuille?" Je dis, oui, bien sûr que vous pouvez, mais soit avec abstraction et génériques, soit avec Object et typecasting, ou pas en Java, mais en JavaScript, par exemple. Ensuite, je ne pouvais pas le supporter moi-même et j'ai suggéré, eh bien, convertissons au moins les nombres en variables de chaîne - moins de travail, si vous insistez sur ArrayList, mais continuez - pouvez-vous toujours utiliser l'interface Map?

L'intervieweur, bien que pas immédiatement (je n'ai pas commencé à en trouver les raisons, pour être honnête - il restait environ 25 minutes), a accepté et a dit - allons à Map. J'ai passé 10 minutes pour lancer le squelette de code, vérifié les conditions aux limites et dit que j'avais terminé.

Il s'est avéré ne pas être là, et tout ce qui était le plus intéressant était à venir. Rappelez-vous les remises? Je citerai à nouveau la condition:
Si le client achète un raisin, il en reçoit un autre gratuitement. (Si l'acheteur achète un paquet de raisins, le second il le recevra gratuitement).

Dans ce cas, nous pouvons supposer que le fait d'avoir des données au format:
["grapes", 2]

dans la quantité de ce produit peut être pris en compte et des paquets de raisins gratuits. Ensuite, l'image devrait être la suivante:

1. L'acheteur a acheté 1 paquet de raisins et en a reçu 1 gratuitement. Le résultat - dans le panier 2 paquets.
2. L'acheteur a acheté 2 paquets de raisins et en a reçu 2 gratuitement. Le résultat - dans le panier 4 paquets.
3. L'acheteur a acheté 3 paquets de raisins et en a reçu 3 gratuitement. Le résultat - dans un panier de 6 paquets.

Avez-vous remarqué le motif? Dans le panier de raisins, il ne doit toujours y avoir qu'une quantité égale . Cependant, sur la base des données initiales, il y a également une quantité étrange de viograd dans le panier:
[["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


Dans ce cas, procédons à l'inverse - car il peut y avoir une quantité étrange de raisins, alors seuls les raisins que l'acheteur a payés sont pris en compte dans le panier. Est-ce logique? Vraisemblablement. Les options lorsque l'acheteur n'a tout simplement pas pris les raisins gratuits ne sont pas considérées.

Et maintenant, l'attention est la bonne réponse!
1   + 1  + 1 

C'est enchanteur! Comment? Eh bien, comment est-ce possible? Oui, je ne sais pas tout, mais j'ai peut-être des espaces, mais expliquez-moi - comment cela peut-il être, en fonction des conditions du problème!? J'ai essayé de lui expliquer quelque chose, mais honnêtement - je viens de voir un vide d'incompréhension de ce dont je parlais aux yeux de l'interlocuteur.

Tout est simple - devant lui sont les chiffres qu'il a trouvés et calculés d'une part, d'autre part - ce que j'ai donné. Les miens sont différents, alors quelle est la réponse? Mes faux - c'est un intervieweur et sa décision semble être la bonne. En général, j'ai craché sur ce sujet, j'étais déjà en colère de la situation elle-même, car je m'attendais à quelque chose de plus intellectuel (c'est pourquoi je regarde autour de moi pour trouver un poste où il y aura des tâches plus intéressantes), mais il s'est avéré ... ce qui s'est avéré être. J'ai décidé d'abandonner ce poste, mais en écrivant mes commentaires, j'ai reçu un rejet de Shopify.

Je leur ai quand même envoyé mes commentaires avec des commentaires que les gars vous remercient d'avoir refusés, j'ai bien peur de ne pas pouvoir travailler avec vous et j'ai décrit la situation dans l'entretien, recommandant qu'il vaut mieux se préparer à l'entretien même sur des tâches simples qui, comme vous le savez, ne sont pas simples.

C’est toute l’histoire. Prenez soin de vous et tout le meilleur pour vous.

All Articles