Dalam sebuah wawancara, apakah lebih baik memberi kode solusi kasar untuk pertanyaan sulit, atau menghabiskan wawancara memeriksa pertanyaan dengan hati-hati? [Tutup]

14

Kadang-kadang pertanyaan wawancara itu sulit, apakah pewawancara menginginkannya, atau tidak. Hal ini dapat mengarah pada pilihan apakah akan menggunakan waktu wawancara terbatas untuk menyusun solusi yang buruk, tidak efisien, kasar, atau menghabiskan waktu untuk memahami setiap aspek masalah dengan pewawancara.

Misalnya, Masalah 91 di Project Euler dapat diselesaikan dengan solusi brute-force yang tidak terlalu sulit dalam menghitung setiap kemungkinan segitiga, menulis tes isRightTriangle (), dan memunculkan semua segitiga yang lulus tes ke dalam satu set. Tetapi dua pasangan X / Y membuat solusi O (x ^ 4) dengan nilai konstan tinggi. Seorang teman dan saya baru saja menemukan solusi yang jauh lebih elegan dan efisien, tetapi kami berdua menghabiskan waktu 3 jam di sana dan menggambar lusinan diagram, menguji beberapa rumus, memeriksa beberapa pendekatan, dll.

Tidak setiap pertanyaan wawancara adil. Juga yang mudah bagi satu orang mungkin sulit bagi orang lain. Jika seseorang berjuang dengan sebuah pertanyaan, apakah Anda akan lebih terkesan dengan solusi jelek yang bekerja? Atau pemahaman masalah yang sangat baik dan jalan menuju solusi yang elegan, tetapi tidak ada solusi kode? Apakah ada aturan seperti setelah 20 menit Anda harus mulai coding tidak peduli apa?

GlenPeterson
sumber
10
Tanyakan kepada mereka apakah mereka menginginkan solusi yang kasar, atau yang bernuansa.
Robert Harvey
Jika mereka menginginkan solusi non brute force, mereka akan memberikan pertanyaan yang tidak bisa diselesaikan dengan brute force.
minusSeven

Jawaban:

9

Pertama-tama, sebuah pertanyaan yang membutuhkan dua pengembang berpengalaman selama tiga jam untuk mengoptimalkan secara elegan adalah pilihan yang buruk untuk pertanyaan wawancara. Jika Anda bertanya, Anda seharusnya tidak mengharapkan jawaban yang sempurna.

Di sisi lain, kadang-kadang Anda belajar paling banyak tentang seseorang ketika Anda membuat mereka mencapai batasnya. Itu sebabnya banyak kursus di perguruan tinggi meningkatkan kesulitan kemudian naik kelas pada kurva. Jika setiap orang mendapat nilai 100% pada setiap ujian, Anda meninggalkan banyak potensi belajar.

Kandidat ideal saya mungkin akan melakukan perhitungan kompleksitas terlebih dahulu, katakan "Oh, itu hanya 6 juta iterasi, yang tidak akan memakan waktu lama," lalu cepat-cepat menulis solusi brute force. Kemudian mereka akan membahas pendekatan yang bisa mereka ambil untuk mengoptimalkannya, tanpa harus menerapkannya kecuali pewawancara memintanya.

Sebagian, ini karena banyak masalah jenis proyek euler yang muncul di dunia nyata adalah masalah sekali pakai yang perlu Anda selesaikan sekali kemudian lupakan. Saya ingin tahu bahwa seseorang yang saya sewa akan dapat mengenali algoritma brute force yang membutuhkan waktu 2 menit untuk menulis dan 10 menit untuk menjalankan lebih efisien daripada algoritma yang membutuhkan 3 jam untuk menulis dan 10 detik untuk berjalan, jika Anda hanya perlu untuk menjalankannya satu kali.

Karl Bielefeldt
sumber
Jawaban yang bagus Caleb mengemukakan konsep brute-force-first-then-optimized, tetapi jawaban Anda adalah satu-satunya jawaban yang menyarankan memberikan alasan mengapa solusi brute-force dapat diterima dalam kasus ini, "Itu hanya 6 juta iterasi, yang tidak akan mengambil sangat panjang." Itu hanya emas. Terima kasih banyak!
GlenPeterson
14

Sebagai manajer perekrutan, jika saya meminta Anda untuk memecahkan masalah dengan kode di depan saya, saya tidak melakukannya untuk melihat kode itu sendiri (walaupun ini penting) tetapi lebih untuk memastikan bagaimana dan mengapa kamu melakukan apa yang kamu lakukan. Salah satu hal yang mungkin Anda lakukan bukanlah kode, dan alih-alih menginterogasi saya mengenai aspek-aspek masalah itu sendiri, untuk menyelesaikannya dengan lebih baik. Itu berarti bagi saya, dan biasanya lebih bermakna daripada solusi yang tercantum dalam kode. Namun, bukan itu yang dilakukan oleh setiap orang, dan juga tidak semua orang ingin melihat (dan pada kenyataannya, saya jarang meminta orang untuk membuat kode dalam pengaturan wawancara, tetapi saya memang menempatkan masalah di atas meja dan kami berbicara melalui mereka dan kadang-kadang pseudocode muncul. , yang sama baiknya bagi saya ).

Anda benar bahwa tidak setiap pertanyaan wawancara adil, dan apa yang mudah bagi seseorang sulit bagi orang lain, dalam pengaturan itu dan dengan kendala-kendala itu, dan itulah sebabnya wawancara yang memahami yang biasanya tidak mencari solusi kode (meskipun , sekali lagi, itu memang memainkan peran penting) melainkan proses solusi .

"Apakah ada aturan seperti setelah 20 menit Anda harus mulai coding tidak peduli apa?" Saya akan menjawab ini dengan mengatakan bahwa dalam waktu yang sangat singkat untuk memikirkan masalah, Anda setidaknya harus melakukan sesuatu - mengajukan lebih banyak pertanyaan, membuat kerangka kerja untuk solusi, atau mengatakan Anda tidak bisa melakukannya / tidak tahu harus mulai dari mana.

Jika saya menempatkan masalah yang berat di depan Anda dan solusi yang Anda berikan - mengingat keterbatasan waktu dan apa yang Anda miliki - adalah kekerasan dan jelek, saya kemudian akan menanyakan serangkaian pertanyaan tentang mengapa itu terjadi, dan apa yang akan mengubahnya menjadi sesuatu yang lebih elegan: lebih banyak informasi? lebih banyak waktu? lingkungan yang berbeda? Menjadi sadar diri dan berhubungan dengan mengapa apa yang telah Anda lakukan, dan apa yang tidak Anda lakukan, dan mampu menjelaskannya secara rasional, adalah bintang emas besar dalam buku saya, tetapi mereka adalah jenis pengembang yang saya miliki. mencari. Jadi, "pemahaman masalah yang sangat baik dan jalan menuju solusi yang elegan" akan bekerja untuk saya juga, tetapi tidak semua orang.

Jcmeloni
sumber
6
Ditambah satu juta untuk "Menjadi sadar diri dan berhubungan dengan mengapa apa yang telah Anda lakukan, dan apa yang tidak Anda lakukan, dan mampu menjelaskannya secara rasional, adalah bintang emas besar dalam buku saya" . Jumlah orang yang, ketika ditanya "Kenapa?", Hanya pendiri dan tidak bisa menjawab tidak bisa dipercaya. Saat merekrut, saya hampir selalu lebih suka mengajar seseorang untuk kode yang bisa berpikir sendiri daripada mempekerjakan seseorang yang bisa kode tetapi tidak bisa berpikir.
Ben
Terima kasih. Ini berwawasan luas. Kecenderungan saya pada pekerjaan saya adalah menganalisis sebelum menyentuh keyboard. Tetapi di bawah tekanan wawancara, saya ingin sekali menunjukkan solusi programer.stackexchange.com/questions/178075/... Jawaban Anda memberikan contoh tandingan yang baik untuk diingat.
GlenPeterson
4

Saya ingin keduanya, tetapi mereka mungkin menampilkan "kode yang hanya berfungsi" dalam satu solusi dan kemudian mungkin mendiskusikan solusi potensial untuk perbaikan dalam satu atau beberapa masalah lainnya.

Jika Anda meminta seseorang untuk menulis kode dan mereka hanya ingin membicarakan kemungkinan solusi dengan kode nol, itu akan menjadi masalah.

Seperti yang Anda katakan, seseorang mungkin bergumul dengan masalah tertentu untuk alasan apa pun, tetapi Anda harus belajar bagaimana mereka menyelesaikannya. Mereka bisa beruntung dan sudah mendengar tentang solusi untuk masalah serupa. Itu terjadi.

Perhatikan seseorang menulis tentang kode yang cukup dan mendiskusikannya dan Anda bisa mencari tahu apakah mereka cocok untuk pekerjaan itu.

JeffO
sumber
1
Saya kira saya juga ingin mendengar mengapa solusi brute force mungkin menjadi masalah, seperti pada pertanyaan di atas.
Christopher Creutzig
@ChristopherCreutzig - Saya berasumsi akan sulit untuk menawarkan perbaikan tanpa setidaknya menyarankan masalah dengan solusi saat ini.
JeffO
Benar. Saya kira saya akan menggaruknya.
Christopher Creutzig
3

Apakah ada aturan seperti setelah 20 menit Anda harus mulai coding tidak peduli apa?

Tidak, tetapi jika Anda menghabiskan 20 menit menganalisis masalah sebelum turun ke bisnis, Anda mungkin sudah dalam kesulitan. Seorang majikan yang mengajukan pertanyaan seperti yang Anda kutip sebagian besar tertarik pada bagaimana Anda mendekati masalah, tetapi jika mereka mengajukannya sebagai masalah pengkodean, mereka juga ingin melihat beberapa kode. Bicaralah dengan mereka melalui proses pemikiran Anda ...

Nah, pendekatan yang jelas di sini adalah kekerasan. Jika saya memiliki cara untuk mengenali segitiga siku-siku mengingat tiga simpul, saya bisa menjalankan semua kombinasi dari dua titik dan asal mencari segitiga siku-siku. Itu seharusnya tidak sulit - saya dapat menulis fungsi yang menggunakan Teorema Pythagoras untuk mengidentifikasi segitiga siku-siku. Untuk membuatnya lebih mudah, saya juga akan menulis fungsi yang menentukan jarak antara dua titik menggunakan rumus jarak ...

Menulis fungsi-fungsi itu harus memakan waktu sekitar tiga menit. Sekarang, hanya beberapa menit ke pertanyaan, Anda sudah menunjukkan bahwa Anda ingat geometri dasar dan Anda benar-benar tahu cara menulis kode. Ini juga memberi Anda sesuatu untuk dibicarakan:

Jadi, kami jelas dapat menempatkan isRightTriangle(p1, p2, p3)fungsi di tengah-tengah empat forloop dan beralih ke semua pilihan yang mungkin untuk masing-masing dari dua titik variabel. Mari kita lihat ... masalahnya meminta jumlah segitiga siku-siku termasuk asal pada kisi 50x50, jadi dengan menggunakan metode brute force membuat kita memeriksa 50 kemungkinan untuk setiap koordinat dari setiap titik. Itu 50 ^ 4 cek ... Saya yakin kita bisa melakukan yang lebih baik, tetapi kodenya jelas, jadi izinkan saya menuliskannya ...

Jadi sekarang Anda menulis fungsi yang menggunakan forloop bersarang dan isRightTriangle()fungsi yang baru saja Anda tulis. Anda telah memecahkan masalah, tetapi Anda juga membiarkan pewawancara melihat ke mana Anda pergi. Jika tujuan mereka hanya untuk melihat bahwa Anda dapat menulis kode, mereka mungkin meminta Anda untuk berhenti. Kemungkinan besar, mereka senang berbicara dengan seseorang yang tahu apa yang mereka lakukan dan mereka ingin melihat seberapa jauh Anda mengambil ini. Jadi kamu pergi ...

Terpikir oleh saya ketika saya menulis bahwa kita dapat memanfaatkan simetri. Kita dapat merefleksikan setiap segitiga siku-siku yang diberikan di sekitar garis 45 °, jadi jika kita memilih untuk memeriksa salah satu titik hanya di satu sisi garis itu, kita dapat menghitung segitiga mana saja yang kita temukan dua kali ... sekali untuk segitiga dan satu kali untuk refleksi. Itu memotong jumlah cek hingga setengahnya. Juga, melihat itu sekarang, kita mengambil akar kuadrat untuk menemukan jarak antara dua titik, tapi kemudian kita hanya persegi itu lagi di isRightTriangle()...

Dan seterusnya. Sekali lagi, mereka biasanya tidak ingin melihat solusi yang sempurna, mereka ingin melihat bagaimana Anda mendapatkan solusi. Proses berpikir Anda tidak harus seperti di atas - hanya memiliki kepercayaan diri untuk berpikir keras akan sangat berarti. Jangan berkeringat jika Anda melakukan kesalahan - katakan saja "hmmm, saya pikir saya sudah keluar dari rel di sini - biarkan saya mundur selangkah ..."

Caleb
sumber
1
Jawaban yang sangat bagus Saya terutama suka, "Saya yakin kita bisa melakukan yang lebih baik, tetapi kodenya jelas, jadi izinkan saya menuliskannya ..."
GlenPeterson
3

Sebagai seorang manajer, Jika saya meminta Anda untuk membuat kode sebagai ujian, saya paling tertarik pada:

  • Apakah Anda dapat menulis kode
  • Gaya pengkodean Anda
  • Algoritma yang Anda pilih
  • Apakah upaya menunjukkan bahwa Anda memahami masalahnya
  • Jika saya benar-benar tertarik dengan teknologi tertentu, apakah Anda menunjukkan bahwa Anda kurang lebih mengetahuinya.

Item pertama mungkin terlihat gila, tetapi Anda akan terkejut ...

Gaya pengkodean - maksud saya bukan hanya di mana Anda meletakkan kawat gigi, tetapi hal-hal seperti:

  • Apakah Anda memilih komposisi atau warisan untuk menyelesaikan masalah itu? Mengapa?
  • Untuk nilai itu, mengapa Anda memilih untuk menggunakan enum vs. string vs int (atau permutasi apa pun yang berlaku)
  • Apakah Anda menggunakan properti, bidang atau metode get / set untuk nilai itu? Mengapa?
  • Bagaimana Anda menangani status di kelas Anda?
  • Apakah Anda mengerti cara kerja warisan, antarmuka, dan lambda?
  • Apakah Anda memahami konvensi parameter bahasa (apa yang oleh ref vs dengan nilai?)
  • Apakah Anda tahu cara menulis unit test?

Inilah yang saya benar - benar tidak pedulikan:

  • Itu kompilasi (dengan asumsi bahwa saya baru saja memberi Anda notepad dan tidak ada kompiler)
  • Bahwa Anda tahu dengan memori urutan 2 parameter dalam satu fungsi itu
  • Bahwa Anda dapat melafalkan string koneksi SQL Server atau Oracle
  • Anda bisa membuat kode dengan sempurna saat saya berdiri di atas bahu Anda mengawasi setiap kesalahan.

Dalam semua kejujuran, saya tidak pernah banyak penggemar tes coding - kecuali sebagai alat untuk menganalisis gaya.

JMarsch
sumber
1
Saya juga tidak terlalu suka tes coding. Masalah pada Project Euler adalah asah otak yang menarik dan cara yang bagus untuk mengembangkan keterampilan pemecahan masalah. Tetapi jika Anda sebagian besar menulis aplikasi CRUD, lebih baik untuk mengetahui apakah seorang kandidat tahu cara menulis permintaan DB yang baik atau, jika Anda berada di dunia .NET seperti saya, bagaimana cara menggunakan hal-hal seperti MVC, WCF, WPF dan LINQ.
jfrankcarr
1
Saya akan menambahkan komentar itu bahwa bahkan semantik tidak penting daripada memahami masalah seperti apa yang dipecahkan oleh hal-hal itu dan kapan dan di mana mereka penting dan segala kelemahan yang mereka bawa.
Rig
@ jfrankcarr - bagaimana Anda menentukan apakah seseorang dapat menulis sql tanpa ujian?
JeffO
1
@ Jeffe - Saya biasanya suka melakukannya dengan melakukan percakapan berdasarkan resume mereka atau pada skenario umum. Misalnya, "Apakah Anda menggunakan variabel tabel atau tabel temp di kueri Anda?" atau "Bagaimana Anda mengintegrasikan kueri data lama ke dalam desain aplikasi baru Anda?" Saya dapat melakukan tes jika saya mempekerjakan seorang programmer junior, baru saja keluar dari sekolah, tetapi saya lebih suka pendekatan percakapan terbuka.
jfrankcarr
1

Dalam hal ini terobosan menuju solusi elegan lebih baik daripada solusi buruk tapi lengkap. Kedua kasus itu baik. Benar-benar baik untuk menuliskan pusdocode yang menunjukkan bahwa Anda memahami masalahnya dan bagaimana Anda bermaksud untuk menyelesaikannya bahkan jika Anda tidak punya waktu untuk benar-benar membuat kode program.

Tom Squires
sumber
1

Saya pikir Anda mengajukan pertanyaan yang sebenarnya tidak ada jawaban, apalagi jawaban 'benar'. Alasan saya mengatakan ini adalah bahwa itu sepenuhnya tergantung pada apa yang orang itu nilai pertanyaan.

Mungkin saja pewawancara adalah seorang pragmatis keras yang benar-benar ingin melihat bahwa Anda akan mendapatkan sesuatu yang bekerja dengan cepat dan kemudian mengoptimalkannya sebagai kegiatan dengan prioritas lebih rendah jika Anda memiliki sisa waktu. Sama-sama mungkin bahwa pewawancara melakukan kesan terbaiknya tentang praktik perekrutan google dan tidak tertarik pada apa pun kecuali algoritma terseksi, paling elegan dan menganggapnya sebagai tanda kelemahan bahwa Anda akan pernah meletakkan kata "brute" dan " kekuatan "dalam 5 kata satu sama lain. Ini juga mungkin bahwa pewawancara googled "pertanyaan wawancara" dan menemukan masalah ini di internet 5 menit sebelum Anda masuk dan tidak tahu apa yang dia inginkan.

Dalam semua kasus, taruhan terbaik Anda mungkin adalah meminta klarifikasi, jika Anda tidak dapat menyimpulkan berdasarkan informasi konteks apa yang diinginkan pewawancara. Anda benar bahwa tidak semua pertanyaan wawancara adil, dan, pada kenyataannya, tidak semua dari mereka adalah pertanyaan bagus atau bahkan pertanyaan yang masuk akal. Wawancara adalah kegiatan yang secara inheren bersifat reduksionis, seperti "kencan kilat" di mana Anda menghabiskan satu atau dua jam bersama seseorang dan Anda berdua mencoba menebak, berdasarkan jam itu, apakah Anda akan bekerja sama dengan baik untuk yang berikutnya 5 tahun atau tidak. Diperiksa dari perspektif itu, saya harap itu lebih jelas mengapa saya mengatakan tidak ada jawaban untuk pertanyaan Anda tentang 'aturan'.

Seseorang mengajukan pertanyaan yang menurut mereka akan memberi Anda wawasan tentang kompetensi Anda dan cocok dengan tim mereka. Anda harus melihat tim mereka, apa yang Anda ketahui tentang mereka, kepribadian pewawancara, dan banyak faktor lainnya, dan membuat tebakan terbaik untuk jawaban, pendekatan, dan proses apa yang akan mereka nilai. Secara pribadi, saya akan mengatakan bahwa Anda harus mendekatinya dengan cara yang menurut Anda adalah ide terbaik. Jika mereka tidak setuju dengan Anda, itu mungkin tidak akan cocok - bagaimanapun, lebih mudah untuk mencari tahu lebih awal daripada nanti.

Erik Dietrich
sumber
0

Pewawancara akan meminta Anda untuk meningkatkan solusi Anda.

Dan pendekatan "solusi brute force first" memiliki satu keuntungan yang tidak terbantahkan: jika Anda tidak berhasil menemukan solusi yang ideal, Anda masih memiliki sesuatu yang selesai untuk ditunjukkan kepada mereka.

vortexwolf
sumber
1
"Pewawancara akan meminta Anda untuk meningkatkan solusi Anda." Sepertinya saya bertaruh.
Craige
1
@Craige: Tidak juga. Tetapi jika mereka tidak membahasnya. Katakan ini adalah solusi brute force dan dengan analisis dapat ditingkatkan.
Martin York