Membaca situs ini dan JADI, saya telah melihat banyak cerita tentang pertanyaan dan jawaban wawancara yang mengatakan seorang kandidat harus mengimplementasikan daftar yang ditautkan dari awal. Biasanya ini adalah latihan "beri" untuk memprogram kandidat peran seperti menulis FizzBuzz. Idenya adalah bahwa jika kandidat tidak dapat melakukan ini, mereka tidak dapat memprogram dan harus segera ditolak.
Namun, saya tidak bisa tidak berpikir ini bisa menjadi praktik yang buruk karena alasan berikut:
- Bahasa tingkat tinggi modern seperti C # dan Python asli menggunakan daftar secara luas; menulis objek daftar tertaut Anda sendiri hanya akan diperlukan dalam keadaan yang tidak biasa dan bahkan kemudian mungkin keliru.
- Bahasa tingkat bawah seperti C ++ memiliki pustaka standar dengan iterator / daftar kontainer dan objek.
- Mengingat dua poin pertama, coders dapat berjalan bertahun-tahun tanpa berpikir tentang mengimplementasikan daftar (terkait, dua kali lipat, dll) sendiri. Beberapa bahkan mungkin tidak benar-benar melihat hal-hal seperti itu sejak masa kuliah.
- Daya komputasi juga bukan merupakan faktornya bertahun-tahun yang lalu, jadi efisiensi melalui pointer bukanlah masalah yang dulu (secara umum).
- Pencarian web sederhana dari sesuatu seperti "contoh daftar tertaut" akan memunculkan banyak contoh kode yang bisa dihafalkan dan diludahkan kembali, tidak benar-benar menunjukkan kompetensi sebenarnya dari pemohon.
Saya harus mengatakan bahwa menggunakan linked list untuk menyebabkan terbuka pertanyaan / diskusi pemecahan masalah calon / kemampuan berpikir kritis adalah sebagian besar kemungkinan praktik wawancara benar-benar baik. Bagaimana pun pewawancara dapat benar-benar melihat seperti apa pelamar itu dan bagaimana menurut mereka bermanfaat besar-besaran.
Saya pikir pendekatan biner ini "tidak ada kode daftar tertaut, tidak ada pekerjaan" untuk programmer yang bekerja pada aplikasi desktop atau web agak ketinggalan jaman. Itu juga bisa sangat berbahaya; seorang kandidat yang tidak ingat bagaimana cara bekerja dengan baik dengan kepala daftar bisa menjadi pembuat kode yang baik dan rekan kerja dan tersesat dalam campuran. Pikiran?
EDIT : Ada banyak komentar (baik) yang menunjukkan bahwa apakah ini adalah pertanyaan yang baik atau buruk untuk ditanyakan tergantung pada konteks pekerjaan. Saya sangat setuju, jadi izinkan saya ulangi pertanyaan ini: Menerapkan daftar-tertaut adalah pertanyaan wawancara umum untuk berbagai pekerjaan koding, mirip dengan pertanyaan seperti FizzBuzz atau menulis fungsi rekursif untuk menghitung faktorial. Apakah pertanyaan ini memiliki cukup utilitas untuk digunakan secara umum untuk mengevaluasi kandidat pemrograman di seluruh papan? Atau harus dianggap pertanyaan buruk untuk ditanyakan kecuali untuk posisi "Pengembang Senior, Tim Tertaut Daftar Tertanam"?
sumber
Jawaban:
Jika menjawab pertanyaan memberi tahu Anda apa yang ingin Anda ketahui tentang seorang kandidat, maka itu adalah pertanyaan wawancara yang bagus. Jika tidak memberi tahu Anda, itu pertanyaan yang buruk.
Pertanyaan mudah seperti FizzBuzz memang melayani tujuan tertentu. Jika seorang kandidat tidak dapat membuat kode FizzBuzz, mereka tidak bisa membuat kode dan Anda dapat mengakhiri wawancara lebih awal. Saya menilai menerapkan daftar tertaut hanya sedikit lebih keras, tetapi dapat memulai percakapan tentang struktur data secara umum yang akan mengungkapkan banyak hal.
Ingatlah bahwa tidak ada satu pertanyaan wawancara pun yang akan memberi tahu Anda segala hal yang ingin Anda ketahui. Anda benar-benar perlu menyiapkan sekelompok pertanyaan. Anda harus mengajukan pertanyaan secara berurutan dari yang paling mudah ke yang paling sulit sehingga Anda dapat menemukan batas dari apa yang diketahui kandidat. Jika Anda mengajukan satu pertanyaan dan mereka menjawabnya, Anda masih tidak tahu apa lagi yang mereka lakukan atau tidak tahu.
Mengenai hasil edit Anda:
Saya pikir ini adalah pertanyaan tujuan umum yang baik yang dapat digunakan untuk mengevaluasi hampir semua kandidat pemrograman. Itu hanya perlu menjadi bagian dari kelompok pertanyaan yang lebih besar. Ini akan menjadi pemecah kebekuan yang baik untuk banyak jenis posisi (bahkan jika kandidat tidak dapat mengimplementasikan daftar tertaut dari awal, mungkin mereka dapat menjelaskan bagaimana mereka telah menggunakan satu sebelumnya dan apa fungsi kuncinya), atau awal dari urutan panjang pertanyaan lebih lanjut untuk posisi "Pengembang Senior, Tim Tertaut Daftar Tertanam".
sumber
Saya telah melewatkan pekerjaan murni karena pikiran saya kosong pada teka-teki sederhana seperti ini. Saya juga telah mengerjakan teka-teki seperti itu dengan cerdas dalam wawancara lain - saya tahu bagaimana menerapkan daftar tertaut di lingkungan yang tidak tertekan. Saya tidak pernah memiliki keluhan tentang kemampuan saya dari seseorang yang bekerja dengan saya, jadi mungkin saya seharusnya tidak berpikir bahwa saya telah kehilangan pekerjaan, saya harus berpikir bahwa mereka telah kehilangan saya.
Jadi ya, saya pikir ini adalah praktik yang dipertanyakan, tetapi saya memahaminya. Saya juga telah mempertimbangkan kemungkinan bahwa itu bukan kesalahan dari pertanyaan, tetapi si penanya, untuk menjadikannya sebuah situasi tekanan tinggi.
Secara pribadi, saya lebih suka mengajukan pertanyaan terbuka tentang masalah yang telah dipecahkan oleh kandidat - baru-baru ini, jika mungkin, dan mencakup masalah koding dan proses. Jika mereka bisa membawa sampel kode, fantastis.
sumber
Kita harus mendefinisikan jenis pekerjaan pemrograman. Jika Anda berada dalam bisnis pengembangan kompiler dan algoritme, pertanyaan tentang hal-hal seperti itu harus diharapkan. Jika Anda berada di lini aplikasi jenis bisnis dan Anda mengharapkan kandidat untuk melakukan aplikasi CRUD, maka, mungkin pengetahuan konsep (tanpa menulis program) sudah cukup. Saat ini, pengetahuan tentang berbagai teknologi yang dibutuhkan untuk menyelesaikan pekerjaan secara khusus dalam jenis aplikasi LOB menggantikan kebutuhan akan algoritma yang rapi.
sumber
Jawaban saya adalah "Tergantung". Saya akan menanyakan pertanyaan ini jika seorang kandidat telah mencantumkan C atau C ++ di resume-nya. Meminta untuk menerapkan daftar tertaut adalah tes yang bagus untuk memahami pointer yang sangat penting bagi seorang programmer C atau C ++.
Di sisi lain, jika seorang kandidat tidak mengklaim tahu C atau C ++, saya tidak akan memintanya untuk mengimplementasikan daftar tertaut, tetapi saya akan mempertimbangkan untuk mengajukan pertanyaan tentang hal itu. Jelaskan pada tingkat tinggi bagaimana daftar yang terhubung berfungsi. Apa kerumitan menambahkan elemen ke kepala daftar? Ekor daftar? Memasukkan elemen di tengah daftar? Kapan Anda akan menggunakan daftar yang bertentangan dengan array? Ini adalah konsep struktur data mendasar yang harus diketahui oleh setiap programmer.
sumber
Saya tidak akan menganggapnya sebagai pertanyaan wawancara yang buruk. Banyak pemahaman tentang struktur data dan pemrograman dimulai dengan pemahaman yang benar-benar baik tentang Linked Links. Yang mengatakan, ada beberapa peringatan:
1) Ini adalah pertanyaan tipe desis-desis. Anda hanya memvalidasi sesuatu yang sangat mendasar: Apakah orang tersebut memahami daftar tertaut. Tanyakan dan lanjutkan.
2) Ada tantangan dengan daftar tertaut yang bahasa yang sangat cocok untuk menunjukkan pemahaman Anda tentang konsep daftar tertaut (misalnya, C) mungkin tidak sama dengan bahasa mereka akan bekerja pada pekerjaan. Anda dapat menunjukkan pemahaman dasar dalam bahasa apa pun dengan struktur, tentu saja, tetapi meminta kandidat untuk mengimplementasikan kembali daftar tertaut di Erlang tanpa menggunakan [] bukanlah tantangan yang sama dan tidak akan memberi tahu Anda hal yang sama tentang pemahaman kandidat seperti meminta mereka untuk melakukannya dalam C. Meminta mereka melakukannya dalam C jika pekerjaannya di Jawa juga agak tidak penting.
3) Dengan mengingat hal itu dan tantangan umum "pemrograman papan tulis," ketika mengajukan pertanyaan semacam ini, saya akan menerima pseudocode atau diagram selama mereka menunjukkan pemahaman tentang prinsip-prinsip inti. Saya tidak meminta orang menulis kode pada papan tulis yang sempurna secara sintaksis dan logis, terutama jika mereka kemudian dapat berbalik dan mengidentifikasi masalah logis ketika diminta untuk melihatnya lagi. YMMV.
sumber
Ketika saya memberikan wawancara, saya sering diminta untuk implementasi daftar tertaut dan beberapa algoritma berpusat di sekitar daftar tertaut. Saya memecahkan sebagian besar dari mereka, dan beberapa dari mereka mengharuskan saya sedikit melatih neuron saya.
Jika saya pernah mengambil wawancara, saya akan pergi untuk semacam implementasi daftar-tertaut, bukan untuk menguji seberapa baik seseorang dalam pengkodean, tetapi untuk memeriksa seberapa banyak perhatian seseorang membayar detail. Siapa pun dapat menulis daftar tertaut, tetapi ini adalah kasus batas yang bahkan gagal dilakukan oleh beberapa programmer yang baik. Jangan bertanya:
Write a code for linked list in C/C++
. Minta dia untuk menulis daftar tautan umum dalam C (bukan C ++), dll.Putar masalah, dan letakkan beberapa kondisi lain di daftar tertaut, dan Anda akan memiliki pertanyaan yang bagus untuk ditanyakan. Beberapa orang pasti membuat kesalahan saat itu.
sumber
void
petunjuk ada untuk itu saja ... :) Tautan pertama yang saya temukan di google untuk "generic linked list in c" adalah: daniweb.com/software-development/c/threads/109260 dan yang lainnya adalah wawancara teknis .com / ... Saya pikir semua orang tahu ini!void
pointer bukan generik, tetapi hanya umum untuk setiap saat. Mereka dapat menyimpan semua jenis barang di dalamnya, dan bahkan mencampur semuanya sesuai yang mereka inginkan - dan itu justru membuatnya tidak umum bagi saya. Ini seperti menggunakan tipe dasarobject
dalam bahasa berorientasi objek ...Dalam sekitar 10 tahun saya memprogram secara profesional (dan sekitar sepuluh tahun lagi sebagai hobi), saya rasa saya tidak pernah perlu menerapkan daftar tertaut. Jika seseorang meminta saya untuk melakukannya selama wawancara, saya mungkin membalas dengan menanyakan apakah itu sesuatu yang akan saya lakukan secara teratur di tempat kerja.
Yang pasti, ada hampir pasti berada pekerjaan di luar sana di mana Anda akan perlu untuk menulis implementasi lebih-atau-kurang-Cleanroom algoritma umumnya dikenal - seperti menerapkan linked list dari awal. Tetapi untuk sebagian besar pekerjaan pemrograman, nilai spesifik apa yang dimilikinya untuk perusahaan sehingga seorang kandidat dapat melakukannya selama wawancara? Apakah benar-benar begitu penting dalam pengaturan sedemikian rupa sehingga kandidat memberikan implementasi yang sempurna yang menangani kasus tepi dengan benar, melaporkan kegagalan sesuai dengan praktik umum dalam bahasa atau kerangka kerja, dan sebagainya? Atau bisakah Anda mengabaikan hal itu dan sebaliknya berfokus pada bagaimana mereka sebenarnya mendekati masalah yang mungkin belum pernah mereka hadapi dalam 10-20 tahun?
Ketika saya wawancarai untuk pekerjaan saya saat ini, saya memiliki sedikit pengalaman dengan tumpukan teknologi yang digunakan di perusahaan. Sekarang, beberapa tahun kemudian, saya secara rutin meminta kolega datang kepada saya dan mengajukan pertanyaan tidak hanya tentang produk, penerapannya, dan standar yang diterapkan oleh mereka, tetapi juga tentang masalah pemrograman yang lebih umum (baru kemarin saya ditanya apa implikasinya adalah ketergantungan melingkar dalam batasan default di SQL Server dalam konteks tabel tertentu dan penggunaannya dalam kasus kami - dengan alasan itu, ternyata tidak ada implikasi dalam kasus tertentu). Saya juga tidak perlu penerapan daftar tertaut yang baru.
Ajukan pertanyaan yang relevan untuk pekerjaan yang kemungkinan akan ditugaskan, dan cobalah untuk mendapatkan gambaran tentang bagaimana perasaan mereka tentang mengambil pengetahuan baru. Bagaimana mereka mencari tahu arti dari beberapa sintaksis tidak jelas yang belum pernah mereka lihat? (Jika Anda adalah toko C, misalnya, maka Anda dapat mencoba pertanyaan yang melibatkan trigraph.) Untuk posisi pemrograman, apakah mereka membaca secara teratur atau berkontribusi ke forum seperti Stack Overflow? Jika mereka diminta untuk melakukan beberapa tugas dalam bahasa pemrograman atau kerangka kerja mereka memiliki sedikit atau tidak ada pengalaman dengan (katakanlah, jika Anda terutama toko Java, bagaimana dengan Clojure atau .NET?), Lalu bagaimana mereka akan mendekati masalah? Mungkin mengeluarkan bug nyata dari pelacak bug Anda (bahkan mungkin salah satu yang sudah lama diselesaikan) dan bertanya kepada mereka bagaimana mereka secara umum akan mendekati menyelesaikannya, dan siap untuk menjelaskan bagian-bagian yang relevan dari produk yang bersangkutan.
Jika kandidat dapat menangani jenis masalah yang relevan dengan kasus bisnis dan memiliki sikap yang baik terhadap mempelajari hal-hal baru, itu mungkin merupakan indikator kecocokan yang jauh lebih baik untuk posisi tertentu daripada mampu memberikan respons terekam untuk pertanyaan-pertanyaan terkenal, apakah itu pertanyaannya adalah tentang FizzBuzz, daftar tertaut, atau yang lainnya. Lemparkan seberapa baik kandidat cocok dengan tim dan saya akan berpikir bahwa Anda berada di tempat yang cukup aman.
sumber
Tentu saja kebanyakan orang tidak perlu mengimplementasikan daftar tertaut, tetapi untuk mengimplementasikannya dari awal orang mungkin perlu menangani pointer dengan benar. Mereka kemudian berpendapat bahwa setelah membentuk model mental yang konsisten untuk pointer berkorelasi dengan kemahiran bahasa, memahami apa yang terjadi pada beberapa level mesin (abstrak) dan kemampuan abstrak pada umumnya.
Saya tidak mengatakan bahwa ini akan menjadi ukuran terbaik, tetapi hanya ada beberapa korelasi.
sumber
Anda mulai mengatakan bahwa itu adalah pertanyaan 'beri', tetapi kemudian Anda tunjukkan bahwa orang-orang tidak akan bisa melakukannya. Saya bingung.
Begini cara saya memikirkannya:
Saya pikir itu membuat mereka pertanyaan yang bagus untuk ditanyakan. Jika Anda khawatir tentang mereka yang belum belajar untuk wawancara, maka masukkan daftar. Mintalah mereka menuliskannya melingkar dan tanyakan berapa waktu berjalan asimptotik dari implementasi mereka. Atau minta mereka menulis struktur data umum dan / atau cepat lainnya ... Pohon pencarian biner? Antrian (FIFO)? Tumpukan (FILO)?
O(n)
Antrian prioritas naif ( )? Banyak orang yang saya tahu berpikir bahwa BSTO(log n)
hanya karena itu pohon .Jika Anda sedang mencari seseorang yang akan bekerja di logam, dan kebutuhan yang sangat dasar yang kuat dalam struktur data ... ini bahkan mungkin jauh terlalu sepele untuk calon Anda mencari untuk menyewa.
Ini mengasumsikan, tentu saja, bahwa Anda menginginkan seorang pengembang yang memiliki dasar-dasar / dasar-dasar struktur data dan posisi mereka akan mendapat manfaat dari dasar-dasar tersebut. Jika Anda ingin seseorang yang dapat menyusun halaman asp dalam hitungan detik, wawancara untuk itu. Intinya bukan untuk memilih pertanyaan wawancara karena semua orang melakukannya, tetapi untuk memilih satu yang mengukur keterampilan yang Anda cari. Secara pribadi, saya pikir pertanyaan struktur data baik, daftar tertaut atau tidak.
sumber
Tidak, sama sekali tidak. Bergantung pada bagaimana itu diungkapkan, apa yang akan memberitahu Anda akan berkisar dari "kandidat ini tahu cara mendesain daftar tertaut" ke "kandidat ini dapat memprogram daftar yang ditautkan dalam bahasa X". Jika Anda meminta pseudocode, itu akan cenderung lebih ke arah pertama. Jika Anda meminta implementasi dalam bahasa tertentu, Anda akan mendapatkan lebih banyak pemahaman mereka tentang bahasa (terutama dengan C dan C ++, di mana Anda dapat berurusan dengan pointer dan referensi dan struct).
Saya bahkan lebih jauh mengatakan bahwa tidak mungkin untuk mengevaluasi semua kandidat menggunakan pertanyaan yang sama. Anda perlu menyesuaikan pertanyaan wawancara Anda untuk menilai keterampilan yang Anda cari di posisi itu.
Jika orang tersebut akan berada dalam posisi untuk menulis kode, saya akan berpikir tentang memasukkan algoritma dan / atau pertanyaan struktur data, selama itu relevan dengan posisi tersebut. Saya akan mencoba memilih sesuatu yang mungkin telah dibahas atau digunakan sebelumnya. Saya juga fokus pada hal-hal selain dari implementasi algoritma dan struktur data tersebut, seperti waktu berjalan dan konsumsi memori (hal-hal seperti notasi O besar). Konsep-konsep ini relevan untuk tidak hanya menciptakan struktur data, tetapi juga memilih implementasi mana yang paling cocok (seperti
ArrayList
versus versusLinkedList
misalnya).sumber
Saya tidak berpikir untuk pekerjaan pemrograman reguler harus menjadi pertanyaan yang menghilangkan kandidat. Tapi itu bagus untuk melihat apakah Anda berurusan dengan programmer yang benar-benar senior atau seseorang yang baru saja bentuk koding monyet selama bertahun-tahun. Meski begitu, itu seharusnya tidak menjadi kriteria mendasar untuk memilih seorang programmer. Mungkin seorang programmer hebat dengan memori buruk dan belum membaca kata-kata "daftar tertaut" selama bertahun-tahun (atau tidak ingat namanya) tetapi masih bisa melakukan aplikasi yang baik.
Jadi, seperti yang dikatakan beberapa orang, jika akan menjadi pekerjaan yang perlu bekerja dengan daftar tertaut dan banyak algoritma mewah, dll. Maka ok. Apakah jika untuk input data biasa pada formulir, validasi dan tunjukkan agak tidak berguna dan tidak adil.
sumber
Saya pikir ini adalah contoh pertanyaan wawancara yang buruk, tetapi karena alasan yang berbeda. Daftar tertaut adalah konsep yang sangat sederhana sehingga untuk mengetahui apa itu untuk mengetahui bagaimana menerapkannya. Jika orang tersebut tidak tahu apa itu daftar tertaut, maka Anda harus menjelaskan cara kerjanya, dan dengan melakukan itu Anda memberikan jawabannya tanpa menemukan apa pun tentang apakah mereka tahu cara memecahkan masalah atau tidak . Jadi pertanyaannya dapat direduksi menjadi "apakah Anda sudah tahu apa itu daftar tertaut dan bagaimana cara kerjanya?", Yang memberi tahu Anda apa-apa tentang kesesuaiannya sebagai programmer.
sumber
Menulis implementasi daftar-tertaut adalah pertanyaan wawancara yang baik, karena akan mengungkapkan banyak hal tentang cara pengkodean kandidat:
Apakah dia tahu apa itu API? Bisakah dia menggunakan kode orang lain? Bisakah dia menulis kode sehingga orang lain bisa menggunakannya?
Apakah dia tahu apa itu Daftar Tertaut? Apakah dia tahu Koleksi, Struktur Data, Algoritma?
Jika dia bahkan tidak tahu metode apa yang harus ditawarkan oleh Daftar Tertaut, Anda tahu dia mungkin tidak pernah menggunakannya, atau tahu kapan harus menggunakannya.
Bagaimana dia menangani masalah itu? Apakah dia mulai dengan analisis terlebih dahulu, spesifikasi kecil, beberapa tes sebelumnya? Atau apakah dia baru saja mulai meretas dengan gembira?
Apakah dia menangani kasing tepi? Bagaimana dengan menghapus simpul terakhir dari Daftar Tertaut? Bagaimana jika seseorang mencoba menambahkan referensi ke daftar tertaut itu sendiri ke daftar tertaut, dan kemudian menghapus semuanya?
Apakah dia menangani pengecualian? Setiap bahasa pemrograman memiliki konvensi sendiri untuk menangani pengecualian: di Jawa, Anda akan mengharapkan LinkedList untuk melempar NoSuchElementException ketika Anda melakukan getFirst () pada daftar kosong. Bahasa lain mungkin menghasilkan undefined, -1 atau konstanta.
sumber