Shopify: siapa yang mewawancarai saya untuk posisi Staff Engineer? Muda?

Tentunya banyak orang yang mengenal Shopify - jaringannya cukup besar dan hingga kemarin diposisikan oleh perusahaan No. 8 di jaringan LinkedIn (sesuai dengan peringkat pemberi kerja, jika saya tidak salah).

Suatu hari, saya melihat posisi mereka sebagai Staff Software Engineer di Ottawa, dan mengingat bahwa mereka bekerja, termasuk dengan data besar, dan sesuai dengan pembelajaran mesin, yang, terus terang, saya merindukanmu setelah bekerja di IBM, saya bersandar pada posisi ini.

Wawancara cukup standar - pertama, panggilan 15 menit dari perekrut untuk memastikan saya masih hidup atau tidak, kemudian satu jam cerita "untuk hidup" dengan perekrut lain, dan kemudian tugas singkat selama 20 menit, yang merupakan semacam penghalang, menghilangkan dengan baik benar-benar tidak masuk akal mungkin.

Ngomong-ngomong, tepatnya setahun yang lalu, pada bulan Mei 2019, saya juga mewawancarai mereka, melewati semua langkah di atas, tetapi menerima tawaran yang lebih lezat dari perusahaan lain, yang berjarak 5 kilometer dari rumah, sedangkan di kantor Shopify itu perlu pergi ke pusat kota, dan ini sekitar satu jam, dan parkir di sana tidak murah. Dan justru karena tahun lalu saya menyukai proses dan kecukupan karyawan - saya memutuskan untuk pergi lagi.

Tetapi pada titik tertentu, ada yang tidak beres.

Semuanya dimulai dengan fakta bahwa tugas yang saya harus selesaikan adalah sebagai berikut:
Pembeli datang ke toko untuk membeli produk. Dia memiliki keranjang tempat dia dapat menaruh sesuatu, dan toko ingin lebih merangsang pembeli dengan memberinya diskon tambahan untuk barang:

1. Jika pembeli membeli lebih dari satu apel, dia akan menerima diskon 20% untuk semua apel di keranjang;
2. Jika pembeli membeli paket anggur, maka paket kedua ia akan terima secara gratis.

Intinya: hitung biaya keranjang pembeli ketika meninggalkan toko, sementara data diberikan dalam bentuk berikut:

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

di mana elemen pertama dari array bersarang adalah nama produk, dan elemen kedua adalah jumlah produk dari jenis ini di keranjang.

Harga makanan adalah sebagai berikut:
- apel ($ 3)
- anggur ($ 5)
- buah persik ($ 7)

Saya berkata OK, pewawancara bertanya bahasa mana yang saya inginkan, yang saya jawab "Jawa" dan mulai mengevaluasi tugas.

Pertanyaan pertama saya terdengar tidak bersalah:
Struktur data apa yang harus saya harapkan sebagai input?

Jawabannya bahkan lebih sederhana:
Array (array). Buat metode tambahan dan jelaskan data di sana secara manual.

Yah, saya pikir, karena kami tidak mencari cara yang mudah, dan juga mempertimbangkan bahwa wawancara masih dalam posisi Staff Engineer, mereka kemungkinan besar ingin melihat saya menerapkan menggunakan abstraksi dan obat generik, seperti ini:
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;}
}

dan penggunaannya:
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);
   }
}

dan karena kami menggunakan sumber daya bersama, saya mengajukan pertanyaan yang tidak bersalah, tetapi bagaimana membuat kelas tambahan, karena saya benar-benar tidak ingin menggunakan Static, dan sepertinya itu tidak berguna dalam kasus ini.

Saya sedikit terkejut ketika saya mendengar jawaban seperti - “Mengapa? Cukup gunakan array dan segalanya, mengapa menyulitkan semuanya? " Saya secara khusus bertanya lagi tentang array - tepatnya array? Jawabannya tidak berubah.

Nah, array, jadi array, meskipun dengan kelas statis saat itu, sejak kegembiraan dimulai - tugas itu tidak sesederhana seperti yang terlihat pada pandangan pertama.

Pertanyaan kedua, sebenarnya, berasal dari pertanyaan pertama:
Berapa ukuran data yang diharapkan?

Tunggu bapak-bapak dan ibu-ibu, karena jawabannya keren:
Ukuran dapat bervariasi, tetapi tidak kurang dari 3 elemen.

Maaf? Tentu saja, saya dapat membuat array dengan data secara dinamis, di mana akan ada variabel parameter sebagai panjang array, tetapi saya perlu tahu berapa banyak objek yang saya perlu masukkan ke dalam array - setelah semua, setelah membuat array sekali, saya tidak bisa mengubah panjangnya. Oleh karena itu, di sini saya harus secara harfiah menjelaskan kepada pewawancara bagaimana array dibuat di dalam JVM, mengapa ukurannya tetap, dan mengapa panjangnya tidak dapat didefinisikan ulang setelah pembuatan - hanya membuat yang baru dan menyalin data.

Pada saat itu, ketika saya sedang menjelaskan dasar-dasar "konstruksi array", saya menyebutkan antarmuka Daftar dan mengatakan bahwa misalnya ArrayList, sebagai salah satu implementasi dari antarmuka, meskipun didasarkan pada array di dalam, tetapi memungkinkan Anda untuk memiliki ukuran yang dinamis.

Pewawancara itu sedikit berpikir dan berkata, "Bagus, lalu gunakan ArrayList dan masukkan data di sana." Ngomong-ngomong, butuh sekitar 15 menit sampai kami semua menemukan ini dan saya menjelaskan kepadanya tentang array (total satu jam diberikan). Saya bertanya bagaimana cara memasukkan, apakah kita sudah menggunakan obat generik atau belum - belum ada yang ditulis, tetapi jika kita melanjutkan dengan kecepatan seperti itu, maka Anda mungkin tidak punya waktu.

Pewawancara mengeluarkan mutiara lain, setelah itu saya menyadari bahwa itu adalah terompet. Dia hanya menulis yang berikut di papan tulis:
"Grapes" => elemen
1 1 => elemen 2

Mungkin erangan saya bahkan terdengar, tetapi saya harus mengajukan pertanyaan kepadanya - sayangku, bagaimana saya bisa memasukkan data heterogen ke dalam ArrayList tanpa menggunakan abstraksi dan obat generik? Saya harus mendeklarasikan tipe data saat membuat struktur. Nah, apakah Anda benar-benar ingin saya menggunakan Obyek dan terus melakukan casting di mana-mana, tergantung pada posisi elemen?

Kenaifan-Nya mengejutkan saya - "Tetapi apakah benar-benar mustahil untuk memasukkan data string dan numerik ke dalam lembaran?" Saya katakan, ya, tentu saja Anda bisa, tetapi dengan abstraksi dan generik, atau Object dan typecasting, atau tidak di Jawa, tetapi dalam JavaScript, misalnya. Maka saya tidak tahan sendiri dan menyarankan, yah, mari kita setidaknya mengkonversi angka ke variabel string - kurang bekerja, jika Anda bersikeras ArrayList, tetapi terus - dapatkah Anda masih menggunakan antarmuka Peta?

Pewawancara, meskipun tidak segera (saya tidak mulai mencari tahu alasannya, jujur ​​- ada sekitar 25 menit tersisa), setuju dan berkata - mari kita pergi ke Peta. Saya menghabiskan 10 menit untuk melempar kerangka kode, memeriksa kondisi batas dan mengatakan bahwa saya telah selesai.

Ternyata tidak ada di sana, dan yang paling menarik ada di depan. Ingat diskonnya? Saya akan mengutip kondisi lagi:
Jika pelanggan membeli satu buah anggur, ia mendapat buah anggur lainnya secara gratis. (Jika pembeli membeli satu paket anggur, maka yang kedua ia akan terima secara gratis).

Dalam hal ini, kita dapat mengasumsikan bahwa memiliki data dalam format:
["grapes", 2]

dalam jumlah produk ini dapat diperhitungkan dan paket anggur gratis. Maka gambarnya harus sebagai berikut:

1. Pembeli membeli 1 paket anggur dan menerima 1 gratis. Hasilnya - dalam paket keranjang 2.
2. Pembeli membeli 2 paket anggur dan menerima 2 paket gratis. Hasilnya - dalam paket keranjang 4.
3. Pembeli membeli 3 paket anggur dan menerima 3 paket gratis. Hasilnya - dalam keranjang 6 paket.

Apakah Anda memperhatikan polanya? Dalam keranjang anggur harus selalu ada jumlah yang genap . Namun, berdasarkan data awal, ada juga jumlah ganjil viograd dalam keranjang:
[["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


Dalam hal ini, mari kita mulai dari yang sebaliknya - karena mungkin ada jumlah anggur yang aneh, maka hanya anggur yang dibayar pembeli yang diperhitungkan dalam keranjang. Apakah ini logis? Sepertinya begitu. Pilihan ketika pembeli tidak mengambil anggur gratis tidak dipertimbangkan.

Dan sekarang perhatian adalah jawaban yang tepat!
1   + 1  + 1 

Ini mempesona! Bagaimana? Nah, bagaimana itu bisa terjadi? Ya, saya tidak tahu segalanya, tapi saya mungkin punya ruang, tetapi jelaskan kepada saya - bagaimana bisa demikian, berdasarkan pada kondisi masalahnya!? Saya mencoba menjelaskan sesuatu kepadanya, tetapi jujur ​​- saya hanya melihat kekosongan kesalahpahaman tentang apa yang saya bicarakan di mata lawan bicara.

Segalanya sederhana - di depannya ada angka-angka yang ia buat dan hitung di satu sisi, di sisi lain - apa yang saya berikan. Punyaku berbeda, jadi apa jawabannya? Kesalahan saya - dia seorang pewawancara dan keputusannya sepertinya benar. Secara umum, saya meludahi masalah ini, saya sudah marah dengan situasi itu sendiri, karena saya mengharapkan sesuatu yang lebih intelektual (itulah sebabnya saya melihat sekeliling untuk menemukan posisi di mana akan ada tugas yang lebih menarik), tetapi ternyata ... apa yang ternyata terjadi. Saya memutuskan untuk meninggalkan posisi ini, tetapi ketika menulis tanggapan saya, saya menerima penolakan dari Shopify.

Saya masih mengirim umpan balik kepada mereka dengan komentar bahwa orang-orang berterima kasih karena menolak, saya khawatir saya masih tidak bisa bekerja dengan Anda dan menggambarkan situasi dalam wawancara, merekomendasikan bahwa lebih baik untuk mempersiapkan wawancara bahkan pada tugas-tugas sederhana yang, seperti yang Anda tahu, tidak sederhana.

Itulah keseluruhan ceritanya. Jaga dirimu dan semua yang terbaik untukmu.

All Articles