Shopify: स्टाफ इंजीनियर पद के लिए मेरा साक्षात्कार किसने किया? जूनियर?

निश्चित रूप से बहुत से लोग Shopify को जानते हैं - इसका नेटवर्क काफी बड़ा है और कल के रूप में इसे लिंक्डइन नेटवर्क पर नंबर 8 कंपनी द्वारा नियुक्त किया गया था (नियोक्ताओं की रेटिंग के अनुसार, अगर मैं गलत नहीं हूं)।

एक दिन, मैंने ओटावा में एक स्टाफ सॉफ्टवेयर इंजीनियर के रूप में उनकी स्थिति देखी, और यह याद रखना कि लोग बड़े डेटा के साथ काम करते हैं, और तदनुसार मशीन सीखने के साथ, जो, स्पष्ट रूप से, मैं आईबीएम में काम करने के बाद आपको याद करता हूं, मैं इस स्थिति पर झुक गया।

साक्षात्कार काफी मानक है - पहला, भर्ती करने वाले से 15 मिनट का कॉल यह सुनिश्चित करने के लिए कि मैं जीवित हूं या नहीं, फिर एक घंटे की कहानी "जीवन के लिए" एक और भर्ती के साथ, और फिर 20 मिनट के लिए एक संक्षिप्त कार्य, जो एक प्रकार का अवरोध है, जो अच्छी तरह से पूरी तरह से अनुचित को समाप्त कर सकता है।

वैसे, ठीक एक साल पहले, मई 2019 में, मैंने उनका साक्षात्कार भी किया था, उपरोक्त सभी चरणों से गुजरा, लेकिन एक और कंपनी से अधिक स्वादिष्ट प्रस्ताव मिला, जो घर से 5 किलोमीटर की दूरी पर है, जबकि शॉपिफाई कार्यालय में यह आवश्यक था शहर में जाओ, और यह लगभग एक घंटे है, और वहां पार्किंग सस्ती नहीं है। और ठीक है क्योंकि पिछले साल मुझे दोनों प्रक्रिया और कर्मचारियों की पर्याप्तता पसंद आई - मैंने फिर से जाने का फैसला किया।

लेकिन कुछ बिंदु पर, कुछ गलत हो गया।

यह सब इस तथ्य से शुरू हुआ कि मुझे जिस कार्य को हल करने के लिए कहा गया था, वह इस प्रकार था:
खरीदार उत्पादों को खरीदने के लिए स्टोर पर आता है। उसके पास एक टोकरी है जहां वह कुछ डाल सकता है, और दुकान उसे सामान पर अतिरिक्त छूट प्रदान करके खरीदार को उत्तेजित करना चाहता है:

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

और जब से हम एक साझा संसाधन पर थे, मैंने एक निर्दोष प्रश्न पूछा, लेकिन एक अतिरिक्त वर्ग कैसे बनाया जाए, क्योंकि मैं वास्तव में स्टेटिक का उपयोग नहीं करना चाहता था, और ऐसा लगता है कि यह इस मामले में उपयोगी नहीं है।

जवाब सुनकर मुझे थोड़ा आश्चर्य हुआ - “क्यों? बस सरणियों और सब कुछ का उपयोग करें, सब कुछ जटिल क्यों है? " मैंने विशेष रूप से सरणियों के बारे में फिर से पूछा - बिल्कुल सरणियाँ? उत्तर अपरिवर्तित था।

ठीक है, सरणियाँ, इसलिए सरणियाँ, स्थिर वर्गों के साथ तब, जब से उत्तेजना शुरू हुई - कार्य इतना सरल नहीं था जितना पहली नज़र में लग रहा था।

दूसरा सवाल, वास्तव में, पहले से उपजा:
अपेक्षित डेटा आकार क्या है?

उत्तर ठंडा होने के लिए देवियों और सज्जनों को पकड़ो:
आकार भिन्न हो सकता है, लेकिन 3 तत्वों से कम नहीं।

माफ़ करना? बेशक, मैं गतिशील रूप से डेटा के साथ एक सरणी बना सकता हूं, जहां सरणी की लंबाई के रूप में एक पैरामीटर चर होगा, लेकिन मुझे यह जानना होगा कि मुझे सरणी में सम्मिलित करने के लिए कितनी वस्तुओं की आवश्यकता होगी - आखिरकार, एक बार सरणी बनाने के बाद, मैं इसकी लंबाई नहीं बना सकता। इसलिए, यहां मुझे साक्षात्कारकर्ता को शाब्दिक रूप से समझाना पड़ा कि जेवीएम के अंदर एरे कैसे बनाए जाते हैं, उनका आकार क्यों तय किया जाता है, और निर्माण के बाद उनकी लंबाई को फिर से परिभाषित क्यों नहीं किया जा सकता है - केवल एक नया निर्माण करना और डेटा की प्रतिलिपि बनाना।

उस समय, जब मैं "मास बिल्डिंग" की मूल बातें समझा रहा था, मैंने सूची इंटरफ़ेस का उल्लेख किया और कहा कि उदाहरण के लिए, ArrayList, इंटरफ़ेस के कार्यान्वयन में से एक के रूप में, हालांकि यह अंदर सरणियों पर आधारित है, लेकिन गतिशील आकार के लिए अनुमति देता है।

साक्षात्कारकर्ता थोड़ा विचारशील था और कहा, "महान, फिर एक ArrayList का उपयोग करें और वहां डेटा डालें।" वैसे, हमें लगभग 15 मिनट का समय लगा जब तक कि हम सभी को यह पता नहीं चल गया और मैंने उन्हें सरणियों के बारे में समझाया (कुल मिलाकर एक घंटे का समय दिया गया था)। मैंने पूछा कि कैसे डालें, क्या हम पहले से ही जेनरिक का उपयोग करते हैं या नहीं - अभी तक कुछ भी नहीं लिखा गया है, लेकिन अगर हम इतनी गति से चलते रहेंगे, तो आपके पास समय नहीं हो सकता है।

साक्षात्कारकर्ता ने एक और मोती जारी किया, जिसके बाद मुझे एहसास हुआ कि यह एक तुरही थी। उन्होंने बस एक आम बोर्ड पर निम्नलिखित लिखा:
"अंगूर" => 1 तत्व
1 => दूसरा तत्व

संभवत: मेरा विलाप भी श्रव्य था, लेकिन मुझे उनसे एक सवाल पूछना था - मेरे प्यारे आदमी, मैं अमूर्त और जेनेरिक का उपयोग किए बिना एक ArrayList में विषम डेटा कैसे डाल सकता हूं? संरचना बनाते समय मुझे डेटा प्रकार की घोषणा करनी चाहिए। क्या आप वास्तव में चाहते हैं कि मैं वस्तु का उपयोग करूं और तत्व की स्थिति के आधार पर हर जगह कास्टिंग करता रहूं?

उसकी भोली ने मुझे मारा - "लेकिन स्ट्रिंग और संख्यात्मक डेटा को एक शीट में सम्मिलित करना वास्तव में असंभव है?" मैं कहता हूं, हां, निश्चित रूप से आप कर सकते हैं, लेकिन या तो अमूर्त और जेनरिक, या ऑब्जेक्ट और टाइपकास्टिंग, या जावा में नहीं, लेकिन उदाहरण के लिए जावास्क्रिप्ट में। तब मैं खुद इसे खड़ा नहीं कर सकता था और सुझाव दिया था, ठीक है, चलो कम से कम संख्याओं को स्ट्रिंग चर में परिवर्तित करें - कम काम, अगर आप ArrayList पर जोर देते हैं, लेकिन जारी रखें - क्या आप अभी भी मैप इंटरफ़ेस का उपयोग कर सकते हैं?

साक्षात्कारकर्ता, हालांकि तुरंत नहीं (मैंने कारणों का पता लगाना शुरू नहीं किया, ईमानदार होने के लिए - लगभग 25 मिनट बाकी थे), सहमत हुए और कहा - चलो मानचित्र पर चलते हैं। मैंने कोड कंकाल को फेंकने के लिए 10 मिनट बिताए, सीमा की स्थितियों की जांच की और कहा कि मैं समाप्त हो गया था।

यह पता चला कि वहाँ नहीं था, और सभी सबसे दिलचस्प आगे थे। छूट याद है? मैं फिर से शर्त लगाऊंगा:
यदि ग्राहक एक अंगूर खरीदता है तो उसे मुफ्त में एक और मिलता है। (यदि खरीदार अंगूर का एक पैकेज खरीदता है, तो दूसरा वह मुफ्त में प्राप्त करेगा)।

इस स्थिति में, हम मान सकते हैं कि प्रारूप में डेटा है:
["grapes", 2]

इस उत्पाद की मात्रा को ध्यान में रखा जा सकता है और नि: शुल्क अंगूर के पैकेट। फिर चित्र निम्नानुसार होना चाहिए:

1. खरीदार ने अंगूर के 1 पैकेज को खरीदा और मुफ्त में 1 प्राप्त किया। परिणाम - टोकरी 2 पैकेज में।
2. खरीदार ने अंगूर के 2 पैकेज खरीदे और 2 मुफ्त में प्राप्त किए। परिणाम - टोकरी में 4 पैकेज।
3. खरीदार ने अंगूर के 3 पैकेज खरीदे और 3 मुफ्त में प्राप्त किए। परिणाम - 6 पैकेज की एक टोकरी में।

क्या आपने पैटर्न पर ध्यान दिया? अंगूर की टोकरी में हमेशा केवल एक समान राशि होनी चाहिए हालांकि, प्रारंभिक आंकड़ों के आधार पर, टोकरी में एक अजीब मात्रा में वोग्रैड भी है:
[["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 

यह करामाती है! कैसे? भला, ऐसा कैसे हो सकता है? हां, मुझे सब कुछ पता नहीं है, लेकिन मेरे पास स्थान हो सकते हैं, लेकिन मुझे समझाएं - समस्या की स्थितियों के आधार पर यह कैसे हो सकता है? मैंने उसे कुछ समझाने की कोशिश की, लेकिन ईमानदारी से - मैंने सिर्फ इस बात की गलतफहमी देखी कि मैं वार्ताकार की आँखों में क्या बात कर रहा था।

सब कुछ सरल है - उसके सामने वह संख्याएं हैं, जो उसने एक तरफ से और दूसरी तरफ गणना की - जो मैंने दिया। मेरा अलग है, तो जवाब क्या है? मेरे गलत - वे एक साक्षात्कारकर्ता हैं और उनका निर्णय सही प्रतीत होता है। सामान्य तौर पर, मैं इस मामले पर थूकता था, मैं पहले से ही स्थिति से नाराज था, जैसा कि मैंने कुछ और बौद्धिक की उम्मीद की थी (यही वजह है कि मैं एक ऐसी स्थिति खोजने के लिए चारों ओर देखता हूं जहां अधिक दिलचस्प कार्य होंगे), लेकिन यह निकला ... क्या निकला। मैंने इस पद को छोड़ने का फैसला किया, लेकिन अपनी प्रतिक्रिया लिखते समय मुझे शॉपिफाई से एक अस्वीकृति मिली।

मैंने अभी भी उन टिप्पणियों के साथ अपनी प्रतिक्रिया भेजी है, जो दोस्तों, आपको मना करने के लिए धन्यवाद, मुझे डर है कि मैं अभी भी आपके साथ काम नहीं कर सकता और साक्षात्कार में स्थिति का वर्णन किया, यह अनुशंसा करते हुए कि यह सरल कार्यों पर भी साक्षात्कार के लिए तैयार करना बेहतर है। जैसा कि आप जानते हैं, सरल नहीं हैं।

यह पूरी कहानी है। अपना ख्याल रखें और आपको शुभकामनाएं।

All Articles