Shopify: Wer hat mich für die Stelle als Staff Engineer interviewt? Junior?

Sicher kennen viele Leute Shopify - sein Netzwerk ist ziemlich groß und seit gestern wurde es von der Firma Nr. 8 im LinkedIn-Netzwerk positioniert (nach der Bewertung der Arbeitgeber, wenn ich mich nicht irre).

Eines schönen Tages sah ich ihre Position als Staff Software Engineer in Ottawa und erinnerte mich daran, dass die Jungs arbeiten, auch mit Big Data und dementsprechend mit maschinellem Lernen, das ich ehrlich gesagt vermisse, nachdem ich bei IBM gearbeitet habe stützte sich auf diese Position.

Das Interview ist ziemlich normal - zuerst ein 15-minütiger Anruf des Personalvermittlers, um sicherzustellen, dass ich am Leben bin oder nicht, dann eine einstündige Geschichte „fürs Leben“ mit einem anderen Personalvermittler und dann eine kurze Aufgabe für 20 Minuten, die eine Art Barriere darstellt und gut beseitigt, wahrscheinlich absolut unvernünftig.

Übrigens, genau vor einem Jahr, im Mai 2019, habe ich sie auch interviewt, alle oben genannten Schritte durchlaufen, aber ein köstlicheres Angebot von einer anderen Firma erhalten, die 5 Kilometer vom Haus entfernt ist, während es im Shopify-Büro notwendig war Gehen Sie in die Innenstadt, und das ist ungefähr eine Stunde, und das Parken dort ist nicht billig. Und gerade weil mir im letzten Jahr sowohl der Prozess als auch die Angemessenheit der Mitarbeiter gefallen haben, habe ich mich entschlossen, wieder dorthin zu gehen.

Aber irgendwann ging etwas schief.

Alles begann mit der Tatsache, dass die Aufgabe, die ich lösen sollte, wie folgt war:
Der Käufer kommt in den Laden, um Produkte zu kaufen. Er hat einen Korb, in den er etwas legen kann, und das Geschäft möchte den Käufer weiter stimulieren, indem es ihm zusätzliche Rabatte auf Waren gewährt:

1. Wenn der Käufer mehr als einen Apfel kauft, erhält er 20% Rabatt auf alle Äpfel im Korb;
2. Wenn der Käufer eine Packung Trauben kauft, erhält er die zweite Packung kostenlos.

Fazit: Berechnen Sie die Kosten für den Warenkorb des Käufers beim Verlassen des Geschäfts, während die Daten in folgender Form angegeben werden:

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

Dabei ist das erste Element des verschachtelten Arrays der Name des Produkts und das zweite Element die Menge des Produkts dieses Typs im Warenkorb.

Die Lebensmittelpreise sind wie folgt:
- Apfel (3 USD)
- Trauben (5 USD)
- Pfirsiche (7 USD)

Ich sagte OK, der Interviewer fragte, welche Sprache ich bevorzugen würde, worauf ich mit „Java“ antwortete und begann, die Aufgabe zu bewerten.

Meine erste Frage klang unschuldig:
Welche Datenstruktur sollte ich als Eingabe erwarten?

Die Antwort war noch einfacher:
Arrays (Arrays). Erstellen Sie eine zusätzliche Methode und beschreiben Sie die Daten dort manuell.

Nun, ich dachte, da wir nicht nach einfachen Wegen suchen und auch bedenken, dass sich das Interview noch in der Position eines Staff Engineer befindet, möchten sie höchstwahrscheinlich, dass ich mithilfe von Abstraktion und Generika etwas implementiere, wie folgt:
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;}
}

und ihre Verwendung:
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);
   }
}

und da wir uns auf einer gemeinsam genutzten Ressource befanden, stellte ich eine unschuldige Frage, aber wie man eine zusätzliche Klasse erstellt, weil ich Static wirklich nicht verwenden wollte, und es scheint, dass es in diesem Fall nicht nützlich ist.

Ich war ein wenig überrascht, als ich eine Antwort hörte wie: „Warum? Verwenden Sie einfach Arrays und alles, warum alles komplizieren? “ Ich habe speziell noch einmal nach Arrays gefragt - genau nach Arrays? Die Antwort war unverändert.

Nun, Arrays, also Arrays, wenn auch mit statischen Klassen, seit Beginn der Aufregung - die Aufgabe war nicht so einfach, wie es auf den ersten Blick schien.

Die zweite Frage ergab sich tatsächlich aus der ersten:
Was ist die erwartete Datengröße?

Halten Sie meine Damen und Herren fest, denn die Antwort war cool:
Die Größe kann variieren, jedoch nicht weniger als 3 Elemente.

Es tut uns leid? Natürlich kann ich ein Array mit Daten dynamisch erstellen, wobei es eine parametrisierte Variable als Länge des Arrays gibt, aber ich muss wissen, wie viele Objekte ich in das Array einfügen muss - nachdem ich das Array einmal erstellt habe, kann ich seine Länge nicht ändern. Daher musste ich dem Interviewer hier buchstäblich erklären, wie Arrays innerhalb der JVM erstellt werden, warum ihre Größe festgelegt ist und warum ihre Länge nach der Erstellung nicht neu definiert werden kann - nur ein neues erstellen und die Daten kopieren.

In diesem Moment, als ich die Grundlagen des "Massenaufbaus" erklärte, erwähnte ich die List-Schnittstelle und sagte, dass beispielsweise ArrayList eine der Implementierungen der Schnittstelle ist, obwohl sie auf Arrays im Inneren basiert, aber eine dynamische Größe zulässt.

Der Interviewer war ein wenig nachdenklich und sagte: "Großartig, dann verwenden Sie eine ArrayList und fügen Sie die Daten dort ein." Übrigens dauerte es ungefähr 15 Minuten, bis wir alle das herausgefunden hatten und ich erklärte ihm die Arrays (insgesamt wurde eine Stunde gegeben). Ich fragte, wie man einfügt, ob wir bereits Generika verwenden oder nicht - es wurde noch nichts geschrieben, aber wenn wir weiterhin so schnell vorgehen, haben Sie möglicherweise keine Zeit.

Der Interviewer gab eine weitere Perle heraus, woraufhin mir klar wurde, dass es sich um eine Trompete handelte. Er schrieb einfach Folgendes an eine gemeinsame Tafel:
"Trauben" => 1. Element
1 => 2. Element

Wahrscheinlich war mein Stöhnen sogar hörbar, aber ich musste ihm eine Frage stellen - mein lieber Mann, wie kann ich heterogene Daten in eine ArrayList einfügen, ohne Abstraktion und Generika zu verwenden? Ich muss den Datentyp beim Erstellen der Struktur deklarieren. Wollen Sie wirklich, dass ich Object verwende und weiterhin überall wirke, abhängig von der Position des Elements?

Seine Naivität traf mich - "Aber ist es wirklich unmöglich, Zeichenfolgen und numerische Daten in ein Blatt einzufügen?" Ich sage ja, natürlich können Sie das, aber entweder mit Abstraktion und Generika oder mit Objekt und Typografie oder nicht in Java, sondern zum Beispiel in JavaScript. Dann konnte ich es selbst nicht ertragen und schlug vor, zumindest die Zahlen in Zeichenfolgenvariablen umzuwandeln - weniger Arbeit, wenn Sie auf ArrayList bestehen, aber fortfahren - können Sie trotzdem die Map-Oberfläche verwenden?

Der Interviewer, obwohl nicht sofort (ich habe nicht angefangen, die Gründe herauszufinden, um ehrlich zu sein - es waren noch etwa 25 Minuten übrig), stimmte zu und sagte - lass uns zu Map gehen. Ich verbrachte 10 Minuten damit, das Code-Skelett zu werfen, überprüfte die Randbedingungen und sagte, dass ich fertig war.

Es stellte sich heraus, dass es nicht da war, und das Interessanteste lag vor uns. Erinnern Sie sich an die Rabatte? Ich werde die Bedingung noch einmal zitieren:
Wenn der Kunde eine Traube kauft, bekommt er eine andere kostenlos. (Wenn der Käufer eine Packung Trauben kauft, erhält er die zweite kostenlos).

In diesem Fall können wir davon ausgehen, dass Daten im Format vorliegen:
["grapes", 2]

in der Menge dieses Produkts können berücksichtigt werden und kostenlose Traubenpakete. Dann sollte das Bild wie folgt aussehen:

1. Der Käufer kaufte 1 Packung Trauben und erhielt 1 kostenlos. Das Ergebnis - im Warenkorb 2 Pakete.
2. Der Käufer kaufte 2 Päckchen Trauben und erhielt 2 kostenlos. Das Ergebnis - im Warenkorb 4 Pakete.
3. Der Käufer kaufte 3 Päckchen Trauben und erhielt 3 kostenlos. Das Ergebnis - in einem Korb mit 6 Paketen.

Hast du das Muster bemerkt? Im Weinkorb sollte immer nur eine gleichmäßige Menge vorhanden sein. Basierend auf den anfänglichen Daten befindet sich jedoch auch eine ungerade Menge an Viograd im Warenkorb:
[["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


In diesem Fall gehen wir vom Gegenteil aus - da es eine ungerade Menge an Trauben gibt, werden nur die Trauben, für die der Käufer bezahlt hat, im Warenkorb berücksichtigt. Ist es logisch? Es scheint so. Optionen, bei denen der Käufer die kostenlosen Trauben einfach nicht genommen hat, werden nicht berücksichtigt.

Und jetzt ist Aufmerksamkeit die richtige Antwort!
1   + 1  + 1 

Das ist bezaubernd! Wie? Nun, wie könnte das sein? Ja, ich weiß nicht alles, aber ich habe vielleicht Leerzeichen, aber erkläre mir - wie kann das sein, basierend auf den Bedingungen des Problems! Ich habe versucht, ihm etwas zu erklären, aber ehrlich gesagt - ich habe in den Augen des Gesprächspartners nur ein Missverständnis dessen gesehen, worüber ich gesprochen habe.

Alles ist einfach - vor ihm stehen die Zahlen, die er einerseits erfunden und berechnet hat, andererseits - was ich gegeben habe. Meine sind anders, also was ist die Antwort? Meine falschen - er ist ein Interviewer und seine Entscheidung scheint richtig zu sein. Im Allgemeinen habe ich auf diese Angelegenheit gespuckt, ich war bereits wütend über die Situation selbst, da ich etwas Intellektuelleres erwartet hatte (weshalb ich mich umschaue, um eine Position zu finden, an der es interessantere Aufgaben geben wird), aber es stellte sich heraus ... was sich herausstellte. Ich habe beschlossen, diese Position aufzugeben, aber als ich mein Feedback schrieb, erhielt ich eine Ablehnung von Shopify.

Ich habe ihnen immer noch mein Feedback mit Kommentaren gesendet, die die Jungs Ihnen für die Ablehnung danken. Ich befürchte, dass ich immer noch nicht mit Ihnen zusammenarbeiten kann, und habe die Situation im Interview beschrieben. Ich empfehle, dass es besser ist, sich auf das Interview vorzubereiten, selbst bei einfachen Aufgaben, die wie Sie wissen, sind nicht einfach.

Das ist die ganze Geschichte. Pass auf dich auf und alles Gute für dich.

All Articles