Saya tahu JavaScript dengan sangat baik, tetapi saya mengebom wawancara pengkodean [ditutup]

33

Jadi saya sedang mencari posisi baru sebagai Pengembang Front-End. Saya tahu JavaScript dengan sangat baik dan dapat menulis tentang Penutup, Currying, Warisan Prototypal, Pola Desain, kinerja Aplikasi, dan Arsitektur Front-End secara keseluruhan. Namun, saya tetap saja berakhir dengan wawancara pekerjaan dengan pengeboman. (FYI sebagian besar pekerjaan yang saya wawancarai adalah untuk membangun SPA dengan semacam kerangka kerja MVC)

Biasanya tes pengkodean adalah potongan kode kecil dari hal-hal yang tidak pernah saya temui secara profesional. Seperti menulis fungsi untuk memecahkan beberapa jenis masalah matematika. Selain dari kecanggungan bawaan mencoba kode sambil memegang telepon di satu tangan dan memiliki orang asing melihat layar Anda dan menonton setiap karakter yang Anda ketik, saya biasanya tidak melihat hal-hal semacam ini di dunia nyata.

Apakah ini keterampilan serius yang saya miliki atau pewawancara mengajukan pertanyaan yang tidak relevan. Saya kira saya harus bekerja pada pemrograman fungsional dan algoritma saya memotong tetapi saya belum menemukan banyak sumber daya yang baik di web (atau di cetak) ada saran?

Mike Fisher
sumber
4
Coba Project Euler untuk beberapa sampel.
Peter K.
11
Dan dapatkan kit bebas genggam untuk ponsel Anda?
AakashM
Mengapa Anda melakukan pengujian kode pada ponsel Anda? Apakah Anda diharapkan bekerja seperti itu ketika Anda mendapatkan pekerjaan itu?
Burhan Ali
2
@ BurhanAli, telepon untuk berbicara, dan ini standar untuk wawancara tahap pertama.
greenoldman
3
Ya, saya pikir beberapa tes sceen saat ini benar-benar omong kosong. Saya terutama membenci tes "dibawa pulang", di mana mereka memberi tahu Anda sesuatu dapat dilakukan dalam satu jam, tetapi dalam kenyataannya akan butuh setengah hari atau lebih lama untuk melakukannya dengan benar. Saya menolak untuk melakukan itu. Anda benar-benar atas kehendak pewawancara. Beberapa dari mereka memikirkan tes yang baik yang mengevaluasi keterampilan dunia nyata. Pewawancara lain tidak tahu apa yang mereka lakukan dan memiliki agenda pribadi dan rasa tidak aman mereka sendiri.
Ringo

Jawaban:

52

Menulis kode hanyalah bagian dari proses wawancara.

Sebenarnya menyelesaikan masalah logis hanyalah bagian dari tugas penulisan kode.

Pewawancara ingin memastikan bahwa:

  • Anda dapat menulis kode. Banyak kandidat dengan sepuluh tahun pengalaman profesional dalam suatu bahasa tidak dapat menulis kode sama sekali, dan tes ini dimaksudkan untuk menolak kandidat tersebut.

  • Anda memikirkan masalah sebelum Anda menulis kode. Banyak yang akan melompat ke keyboard mereka, menulis puluhan baris kode, kemudian menemukan bahwa mereka salah memahami masalah asli, karena mereka tidak mengambil waktu untuk memikirkannya.

  • Anda dapat menyesuaikan diri saat menulis kode. Katakanlah Anda menemukan solusi, tetapi ketika Anda mulai menerapkannya, tampaknya ide pertama Anda bukan yang terbaik; dapatkah Anda dengan cepat beralih ke yang lebih baik, pada akhirnya refactoring kode yang Anda tulis?

Ini juga berarti bahwa wawancara semacam itu harus lebih interaktif . Alih-alih mengetik dengan satu tangan, beli kit hands-free atau telepon melalui Skype dan gunakan headset. Ketik saat Anda mengetik di tempat kerja, sambil mengomentari dan menjelaskan apa yang Anda lakukan: tiba-tiba akan menjadi kurang canggung.

Sudahkah Anda melakukan pemrograman pasangan? Jika ya, situasi wawancara sangat mirip, kecuali bahwa pewawancara tidak dapat memberi Anda pendapatnya, dan Anda tidak memintanya untuk mengganti keyboard dengan Anda ketika Anda selesai.

Berikut adalah beberapa contoh masalah matematika murni dan bagaimana ini menunjukkan keterampilan non-matematika pengembang.

Contoh 1: latihan coding sederhana

Anda perlu menerapkan kalkulator angka Fibonacci dalam JavaScript. Anda harus dapat mengubah indeks. Urutan Fibonacci mengikuti aturan-aturan itu:

  1. Dua angka pertama dari urutan adalah 0 dan 1,
  2. Setiap angka selanjutnya adalah jumlah dari dua sebelumnya.

Contoh: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Anda punya tiga menit.

Di sini, pewawancara ingin Anda berpikir secepat mungkin, menemukan solusinya dan mengimplementasikannya dengan cepat. Latihan semacam itu tidak terkait dengan apa yang dilakukan pengembang sebenarnya dan lebih dekat dengan apa yang dapat Anda temukan ketika melakukan gelar CS, tetapi pewawancara menyukai hal-hal semacam ini, jadi mari kita lakukan. Selain itu, batasan waktu membuat pengujian otomatis tidak mungkin dilakukan, sehingga pewawancara mungkin tidak mengharapkan ini dari Anda.

“Deskripsi algoritma membuat saya berpikir tentang rekursi. Aturan kedua mengarah ke fungsi rekursif berikut. "

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

console.log(fibonacci(10));

"Untuk mengakhiri rekursi, kami akan menambahkan kasing khusus dengan mengganti badan fibonaccifungsi."

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

"Selesai."

Kesimpulan

Seperti yang saya katakan, latihan semacam itu sama sekali tidak terkait dengan pekerjaan pengembang yang sebenarnya. Apakah itu membuatnya tidak berarti? Tidak juga, karena setidaknya, itu menunjukkan bahwa orang tersebut:

  • Mampu memikirkan masalah. Beberapa kandidat akan benar-benar hilang, dan di bawah tekanan, akan membutuhkan lebih dari waktu yang dialokasikan hanya untuk memikirkan cara yang mungkin untuk mendekati masalah.

  • Mengetahui rekursi atau mampu menghindari rekursi melalui loop biasa. Kemudian, pewawancara mungkin bertanya apakah ada cara untuk menggunakan / tidak menggunakan rekursi, dan apa manfaat / kelemahan rekursi.

  • Mengetahui dasar-dasar bahasa pemrograman. Tidak masalah jika orang yang digunakan switch, klausa penjaga, kondisional atau kamus : tergantung pada latar belakang, kandidat yang berbeda akan memilih alat yang berbeda untuk mencapai hal yang sama.

  • Tetap fokus pada masalah, tanpa membawa hal-hal seperti tes unit, skalabilitas, atau kinerja. Pewawancara kemudian dapat bertanya mengapa kinerja-bijaksana, fungsi di atas mengerikan, mengharapkan kandidat untuk menjelaskan apa yang harus dilakukan untuk membawa kinerja ke tingkat yang wajar.

Contoh 2: pertanyaan rumit

Anda perlu menerapkan kalkulator angka Fibonacci dalam JavaScript. Itu harus secepat mungkin. Anda harus dapat mengubah indeks mulai dari 0 hingga 100. Urutan Fibonacci mengikuti aturan-aturan itu:

  1. Dua angka pertama dari urutan adalah 0 dan 1,
  2. Setiap angka selanjutnya adalah jumlah dari dua sebelumnya.

Contoh: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Anda punya tiga menit.

Sekarang, kami memiliki kendala menarik yang menunjukkan bahwa pewawancara tidak benar-benar peduli tentang kemampuan kandidat untuk menyelesaikan masalah, tetapi lebih pada kemampuannya untuk menebak jalan mana yang lebih cepat daripada yang lain.

Pertanyaan rumit itu biasanya mengundang jawaban yang sulit. Di sini, mengingat batasan waktu, tidak ada cara untuk membuat beberapa implementasi, membandingkannya, membuat profil menjadi yang tercepat dan datang dengan solusi optimal.

Sebaliknya, bagaimana dengan:

"Biarkan saya Google" Angka Fibonacci Pertama "... Ini terlihat menjanjikan. Dengan ekspresi reguler sederhana (yang akan menjadi oxymoron), kita dapat membangun daftar nilai yang dipisahkan koma. ”

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

"Akhirnya, programnya sendiri."

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

Kesimpulan

Pertanyaan rumit mengundang jawaban sulit. Jangan heroik, dan jangan mulai membuat benchmark dan profil ketika Anda hanya punya waktu tiga menit. Pikirkan cara cerdas untuk memecahkan masalah saat menggunakan pengalaman Anda. Pengalaman saya memberi saya petunjuk bahwa menggunakan peta mungkin lebih cepat daripada menghitung angka. Mungkin salah, tetapi upaya ini harus diharapkan mengingat batasan waktu.

Mengetahui alat Anda juga membantu, dan merupakan bagian penting dari keterampilan pengembang: tanpa mengetahui ekspresi reguler, saya akan menghabiskan tiga menit yang dialokasikan untuk Googling untuk daftar yang dipisahkan koma, atau akan mulai menulis parser yang akan membangun array yang saya butuhkan.

Ingat, pengembang yang baik bukanlah yang memulai pengkodean segera, tetapi siapa yang tahu bagaimana menghindari pengkodean ketika ada peluang yang lebih baik. Beberapa pewawancara tidak akan ragu untuk memberi Anda tugas yang terlihat seperti pengkodean, tetapi hampir tidak memerlukan kode sama sekali.

Contoh 3: pengembangan aplikasi lengkap

Anda perlu menerapkan urutan Fibonacci dalam JavaScript. Panjang urutan ditentukan selama pelaksanaan program. Urutannya mengikuti aturan-aturan itu:

  1. Dua angka pertama dari urutan adalah 0 dan 1,
  2. Setiap angka selanjutnya adalah jumlah dari dua sebelumnya.

Contoh: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Aplikasi harus disajikan sebagai halaman web, yang memungkinkan pengguna untuk menentukan panjang urutan melalui kolom input.

Anda punya satu jam.

Ayo mulai.

“Urutan contoh sangat membantu, karena akan memungkinkan saya untuk memiliki banyak unit tes untuk memastikan implementasi saya tidak terlihat sepenuhnya salah. Secara umum, saya menggunakan Mocha untuk node.js atau QUnit untuk JavaScript sisi klien, tetapi di sini, demi kesederhanaan, saya hanya akan melempar banyak fungsi pengujian. ”

“Saya mulai dengan membuat index.htmdan fib.jsfile. Kemudian, saya mengisi index.htmdengan kode yang benar-benar minimalis dan tidak sesuai dengan W3C (kita bisa kembali ke sini nanti jika Anda tertarik dengan kemampuan HTML saya juga). "

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

"Sekarang mari kita menulis beberapa kode yang akan memanggil fungsi generator Fibonacci dan menunjukkan hasilnya."

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

"Sudah waktunya untuk menjalankan kode untuk pertama kalinya dan ... itu tidak berhasil. Tidak ada yang terjadi. Mengapa?"

"Oke, aku sudah lupa fibonacci.init();pada akhirnya. Saya menambahkannya, dan tetap saja, tidak ada yang terjadi, sementara itu setidaknya harus menampilkan pesan di konsol. Tunggu, benar, bukan onclick, tapi click; Saya sering menggunakan JQuery sehingga saya mulai lupa nama-nama peristiwa dalam JavaScript biasa. ”

"Mari kita tambahkan beberapa tes."

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

"Membandingkan array bisa rumit, jadi saya hanya menyalin-tempel Array.prototype.equalskode dari jawaban ini ."

"Sekarang kita menjalankan aplikasi, ini menampilkan:"

Aktual [1, 2, 3] berbeda dari yang diharapkan [0].

“Tes gagal, yang sangat diharapkan, mengingat implementasi aktual kami ( return [1, 2, 3];) dari urutan Fibonacci. Sudah waktunya untuk mengubah ini. "

"Dari pernyataan aslinya, urutan Fibonacci dimulai dengan [0, 1], jadi computemenjadi:"

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

"Ini memungkinkan untuk lulus tes pertama, dan sekarang kita dapat menulis tes kedua."

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

"Gagal, jadi kami kembali ke computedan memodifikasinya."

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

"Sekarang, kedua tes lulus, dan sekarang saatnya untuk beralih ke case non-edge."

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

“Ketiga tes lulus sekarang, kecuali bahwa hasilnya tidak cocok untuk panjang yang lebih besar seperti 100. Untuk mendapatkan hasil yang benar, kita harus menggunakan perpustakaan presisi yang sewenang-wenang . Ada juga hal yang perlu diperbaiki. Misalnya, konvensi penamaan terkadang terlalu buruk (apa fib?). Kode JavaScript terkait HTML juga harus menuju ke objek yang berbeda, serta kode pengujian. Juga, saya belum menguji compute(0)dan belum memeriksa input. "

Kesimpulan

Dengan menelusuri contoh, Anda dapat melihat interaksi yang diharapkan selama wawancara. Tidak semuanya lancar (saya melakukan beberapa kesalahan di awal yang membawa saya ke situasi yang memalukan di mana tidak ada yang terjadi ketika saya menjalankan aplikasi), dan pendekatan awal menjadi lemah jika kita harus mendukung panjang urutan yang besar, tetapi saya telah mencapai untuk menunjukkan bahwa:

  • Saya dapat menangani berbagai masalah,
  • Saya menggunakan pengembangan yang digerakkan oleh tes, deret Fibonacci menjadi peluang bagus untuk ini,
  • Saya menyalin-menempelkan kode ketika sumbernya dapat dipercaya dan menulisnya dari awal tampak sangat rumit dan rentan kesalahan,
  • Saya tidak terlalu mengandalkan perpustakaan seperti JQuery,
  • Saya memilih ruang lingkup yang tepat: karena pewawancara ingin memeriksa kemampuan JavaScript saya, saya tidak akan membuang waktu menulis HTML yang sempurna dan bersih: tidak menghabiskan waktu di sini memungkinkan untuk menghabiskan lebih banyak waktu menulis tes unit,
  • Saya tahu kapan harus menyelesaikan dan mengatakan bahwa saya sudah selesai, sambil mengingat bahwa banyak hal tidak sempurna (seperti compute(0)yang akan gagal, tetapi tidak masalah untuk demo).

Ini persis seperti apa yang diharapkan dari pewawancara dari Anda.

Arseni Mourzenko
sumber