Shopify: من الذي قابلني لوظيفة مهندس الأركان؟ نجارة؟

من المؤكد أن الكثير من الناس يعرفون Shopify - شبكتها كبيرة جدًا ، وبالأمس تم وضعها من قبل الشركة رقم 8 على شبكة LinkedIn (وفقًا لتصنيف أصحاب العمل ، إذا لم أكن مخطئًا).

في أحد الأيام الجميلة ، رأيت منصبهم كمهندس برمجيات للموظفين في أوتاوا ، وتذكر أن الرجال يعملون ، بما في ذلك مع البيانات الضخمة ، وبالتالي مع التعلم الآلي ، الذي أفتقدك بصراحة بعد العمل في IBM ، انحنى على هذا الموقف.

المقابلة قياسية إلى حد ما - أولاً ، مكالمة مدتها 15 دقيقة من المجند للتأكد من أنني على قيد الحياة أم لا ، ثم قصة مدتها ساعة "مدى الحياة" مع مجند آخر ، ثم مهمة قصيرة لمدة 20 دقيقة ، وهي نوع من العوائق ، والقضاء على ما هو غير معقول على الإطلاق.

بالمناسبة ، قبل عام بالضبط ، في مايو 2019 ، قابلتهم أيضًا ، مرت جميع الخطوات المذكورة أعلاه ، ولكن تلقيت عرضًا أكثر لذيذًا من شركة أخرى ، على بعد 5 كيلومترات من المنزل ، بينما كان من الضروري في مكتب Shopify اذهب إلى وسط المدينة ، وهذا حوالي ساعة ، ومواقف السيارات ليست رخيصة. وبالتحديد لأنني في العام الماضي أحببت كل من العملية وكفاية الموظفين - قررت العودة مرة أخرى.

ولكن في مرحلة ما ، حدث خطأ ما.

بدأ كل شيء بحقيقة أن المهمة التي طُلب مني حلها كانت على النحو التالي:
يأتي المشتري إلى المتجر لشراء المنتجات. لديه سلة حيث يمكنه وضع شيء ما ، ويريد المتجر زيادة تحفيز المشتري من خلال تزويده بخصومات إضافية على السلع:

1. إذا اشترى المشتري أكثر من تفاحة واحدة ، سيحصل على خصم 20 ٪ على جميع التفاح في السلة ؛
2. إذا اشترى المشتري عبوة عنب ، فإن الطرد الثاني سيحصل عليه مجانًا.

خلاصة القول: احسب تكلفة سلة المشتري عند مغادرة المتجر ، بينما يتم إعطاء البيانات في النموذج التالي:

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

حيث يكون العنصر الأول من الصفيف المتداخل هو اسم المنتج ، والعنصر الثاني هو كمية المنتج من هذا النوع في السلة.

أسعار المواد الغذائية على النحو التالي:
- تفاح (3 دولارات)
- عنب (5 دولارات)
- خوخ (7 دولارات)

قلت حسنا ، سأل المحاور عن اللغة التي أفضلها ، وأجبت على "جافا" وبدأت في تقييم المهمة.

بدا سؤالي الأول بريئا:
ما هي بنية البيانات التي يجب أن أتوقعها كمدخل؟

كان الجواب أبسط:
المصفوفات (المصفوفات). قم بإنشاء طريقة إضافية ووصف البيانات يدويًا.

حسنًا ، فكرت ، نظرًا لأننا لا نبحث عن طرق سهلة ، وبالنظر أيضًا إلى أن المقابلة لا تزال في منصب مهندس الموظفين ، فمن المرجح أن يرغبوا في رؤيتي تنفذ باستخدام التجريد والأدوية ، شيء من هذا القبيل:
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;}
}

واستخدامها:
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);
   }
}

ولأننا كنا على مورد مشترك ، سألت سؤالًا بريئًا ، ولكن كيفية إنشاء فئة إضافية ، لأنني لم أرغب حقًا في استخدام Static ، ويبدو أنها ليست مفيدة في هذه الحالة.

لقد فوجئت قليلاً عندما سمعت إجابة مثل - "لماذا؟ فقط استخدم المصفوفات وكل شيء ، لماذا تعقد كل شيء؟ " سألت على وجه التحديد مرة أخرى عن المصفوفات - المصفوفات بالضبط؟ الجواب لم يتغير.

حسنًا ، المصفوفات ، المصفوفات ، حتى مع الطبقات الثابتة في ذلك الوقت ، منذ بدء الإثارة - لم تكن المهمة بسيطة كما بدت للوهلة الأولى.

السؤال الثاني ، في الواقع ، نابع من السؤال الأول:
ما هو حجم البيانات المتوقع؟

انتظروا أيها السيدات والسادة ، لأن الإجابة كانت باردة:
قد يختلف الحجم ، ولكن ليس أقل من 3 عناصر.

آسف؟ بالطبع ، يمكنني إنشاء مصفوفة بالبيانات ديناميكيًا ، حيث سيكون هناك متغير معلمات مثل طول المصفوفة ، لكنني بحاجة إلى معرفة عدد الكائنات التي سأحتاج إلى إدراجها في المصفوفة - بعد كل شيء ، بعد إنشاء المصفوفة مرة واحدة ، لا يمكنني تغيير طولها. لذلك ، كان علي هنا أن أشرح للمحاور حرفيا كيف يتم إنشاء المصفوفات داخل JVM ، ولماذا يتم إصلاح حجمها ، ولماذا لا يمكن إعادة تحديد طولها بعد الإنشاء - فقط إنشاء واحدة جديدة ونسخ البيانات.

في تلك اللحظة ، عندما كنت أشرح أساسيات "بناء الكتلة" ، ذكرت واجهة القائمة وقلت على سبيل المثال ArrayList ، كواحد من تطبيقات الواجهة ، على الرغم من أنها تعتمد على المصفوفات في الداخل ، ولكنها تسمح بالحجم الديناميكي.

كان القائم بإجراء المقابلة مدروسًا قليلًا وقال: "رائع ، ثم استخدم قائمة ArrayList وأدخل البيانات هناك." بالمناسبة ، استغرق الأمر حوالي 15 دقيقة حتى توصلنا جميعًا إلى ذلك وشرحت له عن المصفوفات (في المجموع تم إعطاء ساعة). سألت عن كيفية الإدراج ، سواء كنا نستخدم الأدوية الجنسية بالفعل أم لا - لم تتم كتابة أي شيء حتى الآن ، ولكن إذا واصلنا السير بهذه السرعة ، فقد لا يكون لديك الوقت.

أصدر القائم بإجراء المقابلة لؤلؤة أخرى ، أدركت بعدها أنها كانت بوق. كتب ببساطة ما يلي على لوحة مشتركة:
"Grapes" => العنصر الأول
1 => العنصر الثاني

ربما كان أنعي مسموعًا ، ولكن كان علي أن أسأله سؤالًا - يا عزيزي ، كيف يمكنني إدراج بيانات غير متجانسة في ArrayList دون استخدام التجريد والأدوية؟ يجب أن أعلن عن نوع البيانات عند إنشاء الهيكل. حسنًا ، هل تريدني حقًا استخدام Object والاستمرار في الإرسال في كل مكان ، اعتمادًا على موضع العنصر؟

أدهشتني سذاجة - "ولكن هل من المستحيل حقًا إدراج سلسلة وبيانات رقمية في ورقة؟" أقول ، نعم ، بالطبع يمكنك ذلك ، ولكن إما مع التجريد والأدوية أو الكائن والتلبيس ، أو ليس في جافا ، ولكن في جافا سكريبت ، على سبيل المثال. ثم لم أستطع تحمل الأمر بنفسي واقترحت ، حسنًا ، دعنا على الأقل نحول الأرقام إلى متغيرات سلسلة - عمل أقل ، إذا كنت تصر على ArrayList ، ولكن تواصل - هل لا يزال بإمكانك استخدام واجهة الخريطة؟

على الرغم من أنه ليس على الفور (لم أبدأ في معرفة الأسباب ، لأكون صادقًا - بقي حوالي 25 دقيقة) ، اتفق وقال - دعنا نذهب إلى الخريطة. قضيت 10 دقائق لرمي الهيكل العظمي ، وفحصت شروط الحدود وقلت أنني انتهيت.

اتضح أنه لم يكن هناك ، وكان الأكثر إثارة للاهتمام هو المستقبل. تذكر الخصومات؟ سأقتبس الشرط مرة أخرى:
إذا اشترى الزبون أحد العنب يحصل على آخر مجاناً. (إذا اشترى المشتري عبوة واحدة من العنب ، فإن الثاني سيحصل عليها مجانًا).

في هذه الحالة ، يمكننا أن نفترض أن وجود البيانات بالتنسيق:
["grapes", 2]

في كمية هذا المنتج يمكن أن تؤخذ بعين الاعتبار وحزم العنب المجانية. ثم يجب أن تكون الصورة على النحو التالي:

1. اشترى المشتري عبوة عنب واحدة واستلم واحدة مجاناً. النتيجة - في عبوات السلة 2.
2. اشترى المشتري حزمتين من العنب وحصل على عبوتين مجاناً. النتيجة - في سلة 4 حزم.
3. اشترى المشتري 3 عبوات عنب واستلم 3 مجانا. النتيجة - في سلة من 6 عبوات.

هل لاحظت النمط؟ في سلة العنب يجب أن يكون هناك دائمًا كمية متساوية فقط . ومع ذلك ، استنادًا إلى البيانات الأولية ، هناك أيضًا كمية غريبة من viograd في السلة:
[["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


في هذه الحالة ، دعنا ننتقل من الاتجاه المعاكس - نظرًا لأنه قد يكون هناك كمية غريبة من العنب ، فإن العنب الذي دفع المشتري مقابله فقط هو الذي يؤخذ في الاعتبار في السلة. هل هذا منطقي؟ يبدو ذلك. الخيارات عندما لم يأخذ المشتري ببساطة العنب المجاني لا تؤخذ بعين الاعتبار.

والآن الانتباه هو الجواب الصحيح!
1   + 1  + 1 

هذا ساحر! كيف؟ حسنا ، كيف يمكن أن يكون ذلك؟ نعم ، لا أعرف كل شيء ، ولكن قد يكون لدي مساحات ، ولكن اشرح لي - كيف يمكن أن يكون ذلك ، بناءً على ظروف المشكلة!؟ حاولت أن أشرح له شيئًا ، ولكن بصراحة - رأيت للتو فراغًا من سوء الفهم لما كنت أتحدث عنه في عيون المحاور.

كل شيء بسيط - أمامه الأرقام التي توصل إليها وحسبها من ناحية ، من ناحية أخرى - ما أعطيته. الألغام مختلفة ، فما هي الإجابة؟ أخطائي - إنه محاور ويبدو أن قراره صحيح. بشكل عام ، بصقت في هذا الأمر ، كنت غاضبًا بالفعل من الموقف نفسه ، حيث توقعت شيئًا أكثر فكرية (ولهذا السبب أنظر حولك للعثور على موقف حيث ستكون هناك مهام أكثر إثارة للاهتمام) ، ولكن اتضح ... ما اتضح. قررت التخلي عن هذا الموقف ، ولكن أثناء كتابة تعليقاتي ، تلقيت رفضًا من Shopify.

ما زلت أرسل تعليقاتي إليهم بتعليقات أشكركم على رفضها ، أخشى أنني لم أستطع العمل معك ووصفت الموقف في المقابلة ، وأوصيت بأنه من الأفضل الاستعداد للمقابلة حتى في المهام البسيطة التي ، كما تعلمون ، ليست بسيطة.

هذه هي القصة كاملة. اعتن بنفسك وكل التوفيق لك.

All Articles