मुझे पता है कि जावास्क्रिप्ट वास्तव में अच्छी तरह से है, लेकिन मैं साक्षात्कार कोडिंग को बम बनाता हूं [बंद]


33

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

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

क्या यह एक गंभीर कौशल सेट है जिसकी मुझे कमी है या साक्षात्कारकर्ता मुझसे अप्रासंगिक प्रश्न पूछ रहे हैं। मुझे लगता है कि मुझे अपने कार्यात्मक प्रोग्रामिंग और एल्गोरिथ्म चॉप पर काम करना चाहिए लेकिन मुझे वेब पर (या प्रिंट में) कोई सुझाव नहीं मिला है?


4
कुछ नमूनों के लिए प्रोजेक्ट यूलर आज़माएं ।
पीटर के।

11
और अपने फोन के लिए हाथों से मुक्त किट प्राप्त करें?
आकाशवाणी

आप अपने फोन पर कोडिंग टेस्ट क्यों कर रहे हैं? क्या आपको नौकरी मिलने पर उस तरह से काम करने की उम्मीद की जा रही है?
बुरहान अली

2
@BurhanAli, फोन बात करने के लिए है, और यह साक्षात्कार के पहले चरण के लिए मानक है।
ग्रीनल्डमैन

3
हाँ, मुझे लगता है कि आजकल कुछ सेंस टेस्ट पूरे बकवास हैं। मैं विशेष रूप से "टेक-होम" परीक्षणों से घृणा करता हूं, जहां वे आपको बताते हैं कि एक घंटे में कुछ किया जा सकता है, लेकिन वास्तविकता में इसे सही करने में आधा दिन या उससे अधिक समय लगेगा। मैं उन लोगों को एकमुश्त करने से इनकार करता हूं। आप वास्तव में साक्षात्कारकर्ता की कसम खा रहे हैं। उनमें से कुछ अच्छे परीक्षण करते हैं जो वास्तविक दुनिया के कौशल का मूल्यांकन करते हैं। अन्य साक्षात्कारकर्ताओं को नहीं पता कि वे क्या कर रहे हैं और उनके अपने व्यक्तिगत एजेंडे और असुरक्षाएं हैं।
रिंगो

जवाबों:


52

कोड लिखना साक्षात्कार प्रक्रिया का केवल एक हिस्सा है।

वास्तव में तार्किक समस्या को हल करना कोड लेखन कार्य का केवल एक हिस्सा है।

साक्षात्कारकर्ता यह सुनिश्चित करना चाहते हैं कि:

  • आप कोड लिख सकते हैं। एक भाषा में दस साल के पेशेवर अनुभव वाले कई उम्मीदवार बिल्कुल भी कोई कोड नहीं लिख सकते हैं, और इस परीक्षा का उद्देश्य उन उम्मीदवारों को अस्वीकार करना है।

  • कोड लिखने से पहले आप एक समस्या के बारे में सोचते हैं। कई अपने कीबोर्ड में कूद जाते हैं, दसियों पंक्तियों की कोड लिखते हैं, फिर पाते हैं कि उन्होंने मूल समस्या को गलत समझा, क्योंकि उन्होंने इसके बारे में सोचने में समय नहीं लगाया।

  • कोड लिखते समय आप खुद को ढालने में सक्षम होते हैं। कहते हैं कि आपको एक समाधान मिला, लेकिन जब आप इसे लागू करना शुरू करते हैं, तो ऐसा प्रतीत होता है कि आपका पहला विचार सबसे अच्छा नहीं था; क्या आप तेजी से एक बेहतर स्विच कर सकते हैं, आखिरकार आपके द्वारा लिखे गए कोड को फिर से भरना।

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

क्या आपने जोड़ी प्रोग्रामिंग की है? यदि हाँ, तो साक्षात्कार की स्थिति बहुत समान है, सिवाय इसके कि साक्षात्कारकर्ता आपको अपनी राय नहीं दे सकता है, और जब आप काम पूरा कर लें, तो आप उसे अपने साथ कीबोर्ड स्विच करने के लिए नहीं कहेंगे।

यहाँ विशुद्ध गणितीय समस्या के कुछ उदाहरण दिए गए हैं और यह एक डेवलपर के गैर-गणितीय कौशल को दर्शाता है।

उदाहरण 1: सरल कोडिंग व्यायाम

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

  1. अनुक्रम की पहली दो संख्याएँ 0 और 1 हैं,
  2. प्रत्येक बाद की संख्या पिछले दो का योग है।

उदाहरण: एफ 0 = 0, एफ 1 = 1, एफ 2 = 1, एफ 3 = 2, एफ 10 = 55।

आपके पास तीन मिनट हैं।

यहां, साक्षात्कारकर्ता चाहता है कि आप जितनी जल्दी हो सके सोचें, समाधान ढूंढें और जल्दी से इसे लागू करें। इस तरह की कवायद असंबंधित है कि वास्तविक डेवलपर्स क्या करते हैं और सीएस डिग्री करते समय आप क्या पा सकते हैं, इसके करीब हैं, लेकिन साक्षात्कारकर्ता इस तरह की चीजों को पसंद करते हैं, तो चलिए इसे करते हैं। इसके अलावा, समय की कमी से कोई भी स्वचालित परीक्षण करना असंभव हो जाता है, इसलिए साक्षात्कारकर्ता शायद आपसे यह उम्मीद नहीं करता है।

“एल्गोरिथ्म का वर्णन मुझे पुनरावृत्ति के बारे में सोचने देता है। दूसरा नियम निम्नलिखित पुनरावर्ती कार्य की ओर जाता है। "

var fibonacci = function (n) {
    return fibonacci(n - 2) + fibonacci(n - 1);
};

console.log(fibonacci(10));

"पुनरावृत्ति को समाप्त करने के लिए, हम fibonacciफ़ंक्शन के शरीर को प्रतिस्थापित करके विशेष मामलों को जोड़ेंगे ।"

switch (n) {
    case 0: return 0;
    case 1: return 1;
    default: return fibonacci(n - 2) + fibonacci(n - 1);
}

"किया हुआ।"

निष्कर्ष

जैसा कि मैंने कहा, इस तरह के व्यायाम एक डेवलपर की वास्तविक नौकरी से पूरी तरह से संबंधित नहीं हैं। क्या यह इसे अर्थहीन बनाता है? वास्तव में नहीं, क्योंकि कम से कम, यह दर्शाता है कि व्यक्ति:

  • किसी समस्या के बारे में सोचने में सक्षम है। कुछ उम्मीदवारों को पूरी तरह से खो दिया जाएगा, और तनाव के तहत, समस्या का सामना करने के संभावित तरीके के बारे में सोचने के लिए आवंटित समय से अधिक समय लगेगा।

  • एक सामान्य लूप के माध्यम से पुनरावर्तन जानता है या पुनरावृत्ति को रोकने में सक्षम है। बाद में, साक्षात्कारकर्ता पूछ सकता है कि क्या पुनरावर्तन का उपयोग / उपयोग नहीं करने के तरीके थे, और पुनरावर्तन के लाभ / कमियां क्या हैं।

  • प्रोग्रामिंग भाषा की मूल बातें जानता है। इससे कोई फर्क नहीं पड़ता कि व्यक्ति ने इस्तेमाल किया switch, एक गार्ड क्लॉज, एक सशर्त या एक शब्दकोश : पृष्ठभूमि के आधार पर, एक ही चीज़ को पूरा करने के लिए विभिन्न उम्मीदवार अलग-अलग उपकरण चुनेंगे।

  • यूनिट परीक्षण, स्केलेबिलिटी या प्रदर्शन जैसी चीजों को लाने के बिना समस्या पर ध्यान केंद्रित रखता है। साक्षात्कारकर्ता तब पूछ सकता है कि प्रदर्शन-वार, उपरोक्त कार्य कितना भयानक है, जिससे उम्मीदवार को यह समझाने की उम्मीद है कि प्रदर्शन को उचित स्तर पर लाने के लिए क्या किया जाना चाहिए।

उदाहरण 2: मुश्किल सवाल

आपको जावास्क्रिप्ट में फाइबोनैचि संख्या कैलकुलेटर को लागू करने की आवश्यकता है। यह जितना संभव हो उतना तेज होना चाहिए। आपको 0 से 100 तक के सूचकांक को बदलने में सक्षम होना चाहिए। फाइबोनैचि अनुक्रम उन नियमों का पालन करता है:

  1. अनुक्रम की पहली दो संख्याएँ 0 और 1 हैं,
  2. प्रत्येक बाद की संख्या पिछले दो का योग है।

उदाहरण: एफ 0 = 0, एफ 1 = 1, एफ 2 = 1, एफ 3 = 2, एफ 10 = 55।

आपके पास तीन मिनट हैं।

अब, हमारे पास एक दिलचस्प बाधा है जो दर्शाती है कि साक्षात्कारकर्ता वास्तव में समस्याओं को हल करने के लिए उम्मीदवार की क्षमता के बारे में परवाह नहीं करता है, बल्कि यह अनुमान लगाने की उसकी क्षमता के बारे में है कि दूसरों की तुलना में कौन से तरीके तेज हैं।

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

इसके बजाय, इसके बारे में:

"मुझे Google" पहले फाइबोनैचि संख्याएं दें "... यह आशाजनक लग रहा है। एक साधारण (जो एक ऑक्सीमोरोन होगा) नियमित अभिव्यक्ति के साथ, हम मानों की अल्पविराम से अलग सूची बना सकते हैं। ”

sed -e "s;\([0-9]*\) \([0-9]*\);'\2',;g" fbncc10.txt | tr '\n' ' '

"अंत में, कार्यक्रम ही।"

var map = ['0', '1', '1', '2', '3', '5', '8', '13', '21', '34', '55', '89', '144', '233', '377', '610', '987', '1597', '2584', '4181', '6765', '10946', '17711', '28657', '46368', '75025', '121393', '196418', '317811', '514229', '832040', '1346269', '2178309', '3524578', '5702887', '9227465', '14930352', '24157817', '39088169', '63245986', '102334155', '165580141', '267914296', '433494437', '701408733', '1134903170', '1836311903', '2971215073', '4807526976', '7778742049', '12586269025', '20365011074', '32951280099', '53316291173', '86267571272', '139583862445', '225851433717', '365435296162', '591286729879', '956722026041', '1548008755920', '2504730781961', '4052739537881', '6557470319842', '10610209857723', '17167680177565', '27777890035288', '44945570212853', '72723460248141', '117669030460994', '190392490709135', '308061521170129', '498454011879264', '806515533049393', '1304969544928657', '2111485077978050', '3416454622906707', '5527939700884757', '8944394323791464', '14472334024676221', '23416728348467685', '37889062373143906', '61305790721611591', '99194853094755497', '160500643816367088', '259695496911122585', '420196140727489673', '679891637638612258', '1100087778366101931', '1779979416004714189', '2880067194370816120', '4660046610375530309', '7540113804746346429', '12200160415121876738', '19740274219868223167', '31940434634990099905', '51680708854858323072', '83621143489848422977', '135301852344706746049', '218922995834555169026', '354224848179261915075'];

var fibonacci = function (n) {
    return map[n];
};

console.log(fibonacci(10));

निष्कर्ष

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

आपके टूल को जानने से भी मदद मिलती है, और डेवलपर कौशल का एक अनिवार्य हिस्सा है: नियमित अभिव्यक्तियों को जाने बिना, मैं या तो आवंटित तीन मिनट खर्च करूँगा एक अल्पविराम से अलग की गई सूची के लिए Googling, या एक पार्सर लिखना शुरू कर दूंगा जो मुझे आवश्यक सरणी का निर्माण करेगा।

याद रखें, एक अच्छा डेवलपर वह नहीं है जो तुरंत कोडिंग शुरू करता है, लेकिन कौन जानता है कि बेहतर अवसर उपलब्ध होने पर कोडिंग से कैसे बचा जाए। कुछ साक्षात्कारकर्ता आपको ऐसे असाइनमेंट देने में संकोच नहीं करेंगे जो कोडिंग की तरह दिखते हैं, लेकिन जिनके लिए लगभग कोई कोड की आवश्यकता नहीं है।

उदाहरण 3: पूर्ण अनुप्रयोग विकास

आपको जावास्क्रिप्ट में फाइबोनैचि अनुक्रम लागू करने की आवश्यकता है। अनुक्रम की लंबाई कार्यक्रम के निष्पादन के दौरान निर्धारित की जाती है। अनुक्रम उन नियमों का पालन करता है:

  1. अनुक्रम की पहली दो संख्याएँ 0 और 1 हैं,
  2. प्रत्येक बाद की संख्या पिछले दो का योग है।

उदाहरण: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89।

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

आपके पास एक घंटा है।

चलो शुरू करो।

"उदाहरण अनुक्रम बहुत उपयोगी है, क्योंकि यह मुझे यह सुनिश्चित करने के लिए इकाई परीक्षणों का एक गुच्छा होगा कि मेरा कार्यान्वयन पूरी तरह से गलत नहीं दिखता है। सामान्य तौर पर, मैं क्लाइंट साइड जावास्क्रिप्ट के लिए नोड.जेएस या क्वीनिट के लिए मोचा का उपयोग करता हूं, लेकिन यहां, सरलता के लिए, मैं सिर्फ परीक्षण कार्यों का एक गुच्छा फेंकूंगा। "

“मैं बनाने index.htmऔर fib.jsफ़ाइलों से शुरू करता हूं । फिर, मैं index.htmवास्तव में न्यूनतर और डब्ल्यू 3 सी-अनुरूप कोड से भरता हूं (यदि आप मेरे HTML कौशल में भी रुचि रखते हैं तो हम इसे बाद में वापस पा सकते हैं)। ”

<label>Length</label> <input id="length" value="15" />
<input id="compute" type="button" value="Compute" />
<div id="result" style="font-weight:bold;"></div>
<div id="tests"></div>
<script src="fib.js"></script>

"अब कुछ कोड लिखें जो फाइबोनैचि जनरेटर फ़ंक्शन को कॉल करेगा और परिणाम दिखाएगा।"

fibonacci = (function () {
    var compute,
        init;

    compute = function (length) {
        // TODO: Implement Fibonacci sequence.
        return [1, 2, 3];
    };

    init = function () {
        var button = document.getElementById('compute');
        button.addEventListener('onclick', function () {
            var length = parseInt(document.getElementById('length').value, 10),
                result;

            console.log(
                'Computing Fibonacci sequence of length ' + length + '.'
            );

            result = compute(length);
            document.getElementById('result').innerText = result.join(', ');
        });
    };

    return {
        compute: compute,
        init: init
    };
}());

“यह पहली बार कोड चलाने का समय है और यह काम नहीं करता है। कुछ नहीं हुआ। क्यूं कर?"

“ठीक है, मैं fibonacci.init();अंत में भूल गया हूँ । मैंने इसे जोड़ा, और अभी भी, कुछ भी नहीं होता है, जबकि इसे कम से कम संदेश को कंसोल में प्रदर्शित करना चाहिए। रुको, सही, यह नहीं है onclick, लेकिन click; मैं JQuery का उपयोग इतनी बार करता हूं कि मुझे सादे जावास्क्रिप्ट में घटनाओं के नाम भूलने लगते हैं। "

"चलो कुछ परीक्षण जोड़ते हैं।"

ensureAreEqual = function (expected, actual) {
    var testResultsContainer = document.getElementById('tests');
    testResultsContainer.innerText += (expected.equals(actual) ?
            '.' :
            ('Actual [' + actual.join(', ') + '] is different from ' +
             'expected [' + expected.join(', ') + '].'));
};

test = function () {
    ensureAreEqual([0], compute(1));
};

"तुलना सरणियों मुश्किल हो सकता है, इसलिए मैं सिर्फ इस जवाबArray.prototype.equals से कोड -कॉपी कोड ।"

"अब जब हम एप्लिकेशन चलाते हैं, तो यह प्रदर्शित होता है:"

वास्तविक [1, 2, 3] अपेक्षित [0] से अलग है।

"परीक्षण विफल हो गया, जो बहुत उम्मीद की गई थी, हमारे वास्तविक कार्यान्वयन ( return [1, 2, 3];) को फिबोनाची अनुक्रम दिया। इसे बदलने का समय आ गया है। ”

"मूल कथन से, फाइबोनैचि अनुक्रम शुरू होता है [0, 1], इसलिए computeबन जाता है:"

compute = function (length) {
    var fib = [0];
    return fib;
};

"यह पहली परीक्षा पास करना संभव बनाता है, और हम अब अपना दूसरा लिख ​​सकते हैं।"

ensureAreEqual([0, 1], compute(2));

"यह विफल रहता है, इसलिए हम इसे वापस computeलाते हैं और इसे संशोधित करते हैं।"

compute = function (length) {
    var fib = [0, 1];
    return length === 1 ? [0] : fib;
};

"अब, दोनों परीक्षण पास हो गए हैं, और नॉन-एज मामलों में स्थानांतरित होने का समय है।"

compute = function (length) {
    var fib = [0, 1],
        i,
        next,
        current = 1,
        previous = 0;

    for (i = 2; i < length; i += 1) {
        next = current + previous;
        previous = current;
        current = next;
        fib.push(next);
    }

    return length === 1 ? [0] : fib;
};

"सभी तीन परीक्षण अब पास हैं, सिवाय इसके कि परिणाम बड़ी लंबाई के लिए सही नहीं दिखता है जैसे कि 100। उन परिणामों को ठीक से प्राप्त करने के लिए, हमें एक मनमाना सटीक पुस्तकालय का उपयोग करना चाहिए । इसमें सुधार के लिए चीजें भी हैं। उदाहरण के लिए, नामकरण परंपराएं कभी-कभी बहुत खराब होती हैं (क्या fib?)। HTML से संबंधित जावास्क्रिप्ट कोड को एक अलग ऑब्जेक्ट पर जाना चाहिए, साथ ही परीक्षण कोड भी। इसके अलावा, मैंने जांच compute(0)नहीं की है और इनपुट्स की जाँच नहीं की है। ”

निष्कर्ष

उदाहरण के माध्यम से चलने से, आप एक साक्षात्कार के दौरान अपेक्षित बातचीत देख सकते हैं। सब कुछ सुचारू नहीं था (मैंने शुरुआत में कई गलतियाँ कीं, जो मुझे एक शर्मनाक स्थिति में ले गईं, जहाँ मैं आवेदन चलाते समय कुछ नहीं होता), और मूल दृष्टिकोण लंगड़ा था अगर हमें एक बड़ी सीक्वेंस लंबाई का समर्थन करना है, लेकिन मैंने प्राप्त कर लिया है उसे दिखाने के लिए:

  • मैं विभिन्न मुद्दों को संभाल सकता हूं,
  • मैं परीक्षण संचालित विकास का उपयोग करता हूं, इसके लिए फाइबोनैचि अनुक्रम एक उत्कृष्ट अवसर है,
  • जब स्रोत विश्वसनीय होता है तो मैं कॉपी-पेस्ट कोड देता हूं और इसे स्क्रैच से लिखना अत्यधिक जटिल और त्रुटि-प्रवण लगता है,
  • मैं JQuery जैसे पुस्तकालयों पर ज्यादा भरोसा नहीं करता,
  • मैंने सही स्कोप चुना: क्योंकि साक्षात्कारकर्ता मेरे जावास्क्रिप्ट कौशल की जांच करना चाहता है, इसलिए मैं सही और साफ HTML लिखने में समय बर्बाद नहीं करूंगा: यहां समय व्यतीत नहीं करने से अधिक समय लेखन इकाई परीक्षण में खर्च करना संभव होता है,
  • मुझे पता है कि कब खत्म करना है और बताना है कि मैं कर रहा हूं, यह ध्यान में रखते हुए कि चीजों का एक गुच्छा सही नहीं है (जैसे compute(0)जो विफल हो जाएगा, लेकिन यह डेमो के लिए कोई फर्क नहीं पड़ता)।

यह वही है जो एक साक्षात्कारकर्ता को आपसे उम्मीद करनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.