Sama seperti judulnya, apa masalah wawancara papan tulis favorit Anda, dan mengapa itu terbukti efektif untuk Anda?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-code, dll.
interview
algorithms
NickC
sumber
sumber
Jawaban:
Saya meminta kandidat untuk merancang solusi untuk masalah yang sebenarnya saya temui dalam pekerjaan saya sehari-hari. Dengan melakukan itu, saya mencoba membuat dialog antara saya dan kandidat. Saya mencoba berdiskusi tentang desain yang sedang dibangun seolah-olah saya tidak pernah memikirkan masalah sebelumnya.
Apa yang saya coba evaluasi adalah apakah kita dapat saling memahami, dan apakah kita dapat berbicara tentang masalah teknis tanpa kebingungan.
Contoh nyata
(Untuk pengembang desktop java)
Rancang API untuk menangani riwayat navigasi browser web (halaman sebelumnya, halaman berikutnya, daftar 10 halaman sebelumnya), dan itu dapat digunakan kembali di banyak bagian aplikasi (di sini saya memberikan contoh nyata dalam aplikasi kami). Kemudian, buat sketsa implementasi.
Saya suka yang ini, karena cukup sederhana, mudah diilustrasikan, dapat diselesaikan langkah demi langkah (menambahkan perilaku tambahan tanpa merusak segalanya), memungkinkan untuk berbicara tentang kasus tepi dan penanganan kesalahan, dan juga memungkinkan untuk berbicara tentang data struktur.
sumber
Saya menemukan ini sangat mencerahkan ketika mewawancarai kandidat dan menyaring mereka yang tidak memiliki bisnis. Ini serupa dalam kompleksitas dengan Fizz Buzz, tetapi berfokus pada keterampilan basis data.
Saya membiarkan mereka menuliskannya dalam varian SQL apa pun yang mereka inginkan, dan saya tidak terlalu pilih-pilih masalah sintaksis kecil. Saya terutama ingin tahu bahwa mereka memahami konsep DB relasional dasar.
Sebagian besar kandidat dapat melewati bagian 3 tanpa masalah sama sekali. Anda akan kagum betapa banyak yang berpikir bahwa jawaban untuk bagian 4 hanya untuk mengubah operator dari ATAU ke DAN dalam klausa mana.
sumber
"Gambar untuk saya di papan tulis desain proyek terakhir yang Anda kerjakan, tanpa mengungkapkan detail sensitif apa pun kepada saya."
sumber
Melaksanakan
strcpy
,strcmp
dan teman-teman.sumber
atoi()
.strdup()
.strrev()
atau fungsi pembalikan string. Solusi papan tulis saya mengesankan mereka dan saya melakukan pekerjaan sekarang.Favorit saya yang mencakup beberapa disiplin ilmu adalah untuk menghitung jumlah node dalam pohon biner yang diberikan antarmuka (dalam C #):
dan hanya untuk bersenang-senang, inilah implementasinya, meskipun orang yang diwawancara tidak perlu melihat ini.
dan asisten kelas:
Solusi yang saya suka lihat adalah ini:
Karena menunjukkan pengetahuan tentang:
sumber
Dua pertanyaan yang telah menimbulkan diskusi papan tulis yang menarik bagi saya adalah
Mereka memulai dari yang sederhana dan kemudian menjadi semakin kompleks.
sumber
Saya tidak suka menggunakan puzzle atau pertanyaan desain sebagai pertanyaan papan tulis. Saya lebih suka pertanyaan langsung, sederhana, yang menguji kemampuan kandidat untuk menulis beberapa kode. Favorit saya adalah:
1) Tulis fungsi untuk membalikkan daftar yang ditautkan sendiri. (Butuh beberapa saat sebelum mereka menyadari bahwa mereka membutuhkan 3 petunjuk.)
2) Diberikan pohon biner, temukan kedalaman pohon biner. (Pertanyaan ini menguji kemampuan mereka untuk menulis kode rekursif. Izinkan saya memeriksa apakah mereka memiliki kasing yang utuh.)
3) Tulis prosedur untuk mencari biner array bilangan bulat. (Seperti yang dikatakan Jon Bentley (dalam Pemrograman Mutiara), banyak orang cenderung membuat kesalahan dengan menulis pencarian biner. Orang kemudian dapat menindaklanjuti dengan menemukan bug, menulis kasus uji, menjalankan kode, dll.)
sumber
Kami menggunakan ini di satu perusahaan tempat saya bekerja.
Kami menyerahkan kandidat selembar kertas yang digunakan untuk melacak waktu. Itu adalah kartu absen nyata yang digunakan oleh salah satu atau divisi kami. Kami meminta kandidat untuk memandu kami melalui proses desain untuk membuat alat pelacakan waktu yang lebih baik. Tidak ada batasan, tidak mengatakan bahasa apa dll, hanya ingin melihat seberapa baik kandidat berada di "siklus hidup penuh". Itu memberi kami wawasan nyata tentang bagaimana mereka memenuhi persyaratan. Bagaimana mereka menyusun tabel database, seperti apa UI yang mungkin mereka lakukan. Keterampilan komunikasi jelas dibutuhkan untuk tugas ini. Itu biasanya dilakukan di sebuah ruangan dengan beberapa papan tulis besar dan berlangsung selama 2 jam.
Kami merekrut beberapa orang menggunakan proses ini dan jika mereka melakukan tugasnya dengan sangat baik, mereka melakukannya dengan sangat baik untuk kami. Jika mereka marjinal dan kami memutuskan untuk tetap mempekerjakan mereka (topik terpisah) mereka adalah programmer marginal.
sumber
Saya menggunakan masalah yang relevan dengan domain pemrograman saya.
Jika saya mengembangkan aplikasi web, saya ingin melihat bagaimana mereka membuat formulir web yang menghapus catatan, dan pendekatan apa yang mungkin mereka ambil untuk menghapus catatan dari database, misalnya. Ini memberitahu saya jika mereka tahu prinsip-prinsip basis data dasar, bagaimana mereka berinteraksi dengan pengguna untuk memverifikasi penghapusan, dan jika mereka tahu apa itu soft delete.
Saya tidak punya favorit. Masalah yang saya pilih akan sangat bervariasi tergantung pada pekerjaan.
Saya tidak peduli apakah mereka dapat menyelesaikan masalah sepenuhnya atau tidak dalam sebuah wawancara, teknologi dan bahasa apa yang mereka gunakan, atau seberapa jelek kode mereka di papan tulis. Saya mencari pola pikir; Saya ingin melihat apakah mereka tahu bagaimana memikirkan dan memecahkan masalah.
sumber
Favorit saya adalah yang digunakan teman saya.
Ini bekerja dengan baik karena:
Ini adalah pertanyaan algoritmik sehingga diperlukan orang yang diwawancarai untuk dapat berpikir dan kemudian menjelaskan pemikiran mereka - sehingga Anda dapat melihat bagaimana otak mereka bekerja.
Bahasa independen.
Hampir tidak ada orang yang sepenuhnya benar (biasanya ada kasus tepi yang mereka lewatkan (1 atau 2 normal), atau mereka tidak menangani angka negatif, sehingga Anda bisa melihat bagaimana mereka menangani bug dan diberi tahu bahwa mereka salah.
Sebagian besar melakukannya sebagai saringan sederhana tetapi sangat lambat (mis. 80% orang akan memeriksa n adalah bilangan prima dengan membagi n oleh semua bilangan bulat kurang dari n), yang memberi Anda banyak ruang untuk percakapan tentang bagaimana mereka dapat meningkatkan algoritme berdasarkan pada pengorbanan ruang / waktu mis. "mengapa Anda membagi angka dengan 4 jika Anda sudah tahu itu tidak dapat dibagi 2?" atau "Anda telah berhasil bahwa Anda hanya perlu membagi dengan semua bilangan prima kurang dari sqrt (n), tetapi itu mengharuskan Anda untuk menyimpan angka-angka itu di suatu tempat, jadi apa implikasinya?")
Tidak perlu bagi mereka untuk mendapatkan jawaban yang benar. Jika seseorang dapat berpikir dan menjelaskan pemikiran mereka maka mereka jauh di jalan untuk menjadi kandidat yang baik.
sumber
Sesuatu yang disebut aff_z, yang merupakan bagian dari ujian C sekolah teknik saya dan digunakan sebagai tes "dummy" untuk membuat siswa gagal ketika kembali dari liburan (sistem penilaian kami menyiratkan bahwa gagal tes menghentikan tanda, sehingga gagal bahwa tes boneka akan batalkan seluruh tes Anda. Memaksa Anda memperhatikan detail-detail tolol). Saya menggunakannya kembali sekali atau dua kali selama wawancara.
Ngomong-ngomong ... Aku lupa formulasi yang tepat tapi itu seperti ini ...
Yang menyedihkan adalah bahwa tidak hanya beberapa siswa akan menghasilkan solusi yang sangat rumit ketika jawabannya cukup jelas, tetapi beberapa bahkan akan berhasil gagal.
Dan percaya atau tidak, itu memang terjadi selama wawancara juga.
Menjalankannya dalam wawancara cukup menyenangkan, karena beberapa pelamar akan mulai menulis cabang yang mungkin dan kemudian menyadari apa yang salah (jelas, jika Anda hanya bertanya kepada mereka secara lisan, itu cukup dimengerti bahwa mereka melakukannya saat Anda berbicara ... tetapi jika Anda berikan secara tertulis, saya merasa membingungkan ...)
Itu bodoh, tapi saya kira ini adalah penyaringan yang minimalis (sama halnya, ketika mempekerjakan programmer JS, saya selalu bertanya bagaimana mendeklarasikan variabel, dan kemudian tergantung pada jawaban mereka apakah menggunakan var membuat perbedaan atau tidak sama sekali. Cukup sering saat yang menyedihkan, secara jujur.)
sumber
variablename = variablevalue;
" sedangkan yang baik hanya akan tertawa di telepon atau secara langsung dan langsung memberi tahu saya apa perbedaannya dengan atau tanpavar
).Ini benar-benar tergantung apa yang Anda cari, sebagai organisasi yang melakukan banyak pekerjaan web dinamis yang melibatkan gambar, saya cenderung ingin mengajukan pertanyaan geometri yang berkaitan dengan pekerjaan itu. Dalam kasus apa pun, saya cenderung mengajukan pertanyaan geometri, karena menurut saya tes matematika bagus yang bagus dan visual dan dapat menunjukkan kemampuan kandidat untuk mempresentasikan pekerjaan mereka secara visual dan secara sistematis menyelesaikan masalah.
Untuk kandidat tingkat lanjut, saya sesekali memberikan pertanyaan berikut:
Untuk pertanyaan yang lebih mudah, saya biasanya memberikan pertanyaan yang sama, tetapi gunakan contoh "kotak di dalam lingkaran di dalam kotak". Meskipun ini sangat mudah, jadi saya harapkan aljabar yang sempurna di atasnya.
Lebih dan di atas itu, saya cenderung meminta mereka untuk mengetuk suatu algoritma untuk menghasilkan semua kombinasi dari set data panjang variabel.
sumber
Jawaban FizzBuzz terbaik yang pernah saya lihat adalah:
SQL Server 2008
C # (sederhana)
C # (pintar)
sumber
Saya mencari beberapa hal dalam kandidat yang telah saya wawancarai. Karena alasan yang tidak bisa saya jelaskan secara online, kami mendapatkan kandidat yang sangat buruk, dan saya datang untuk mengharapkannya, jadi saya cukup mudah menggunakannya. Meski begitu, saya mencari:
Kesadaran desain.
"Tunjukkan pada saya struktur tabel untuk program buku alamat yang memiliki Kontak dengan nama depan dan belakang yang dapat memiliki beberapa Nomor Telepon dengan deskripsi nomor (sel / rumah / kantor / dll.)"
Saya tidak mencari diagram spec UML 2.0 di sini, diagram bubble sederhana di sini baik-baik saja. Selama itu masuk akal.
Pengetahuan bekerja dengan database (mis. SQL)
Pengetahuan tentang pengujian
Asumsikan ada metode dengan tanda tangan
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
yang mengembalikan hasil permintaan Anda dari sebelumnya. Asumsikan bahwa jika Anda memasukkan nol ke dalam metode, ia melempar NullReferenceException. Tulis tes untuk menunjukkan fungsi ini.Tulis tes yang menunjukkan bahwa GetPhoneNumbers akan mengembalikan nomor telepon rumah (123) 456-7890 untuk seseorang dengan nama belakang "smith".
Pengetahuan tentang cara menulis beberapa kode
Terapkan metode yang akan memenuhi persyaratan tes yang Anda tulis.
Mengingat jumlah dan kualitas pelamar yang kami dapatkan, saya telah mewawancarai semua orang yang pernah mendaftar dengan serius. Saya tidak mempekerjakan siapa pun.
sumber
Saya biasanya membiarkan mereka membuat sketsa diagram blok dari sistem terakhir yang mereka kerjakan, menanyakan tentang hubungan antara blok dan kemudian membiarkan mereka menguraikan blok yang mereka kerjakan / yang bertanggung jawab. Anda dapat belajar banyak dari latihan ini, seperti bagaimana seseorang melihat di luar wilayahnya yang kecil, seberapa penting baginya untuk mengetahui 'di mana' dia bertindak, juga Anda dapat belajar tentang peran yang dia mainkan, apakah itu kunci atau sisi wewenang.
sumber
Tulis algoritma untuk masalah berikut: Diberi angka n , output jumlah total pohon biner (unik) yang memiliki n node.
Jadi, untuk n = 0 dan n = 1, jawabannya adalah 1. Untuk n = 2, Anda memiliki 2: simpul akar, dan kemudian simpul kedua baik ke kiri atau ke kanan.
Anda dapat memperoleh wawasan tentang teknik desain dan untuk melihat apakah mereka memikirkan rekursi atau memoisasi atau solusi pemrograman dinamis.
[Lihat juga diskusi StackOverflow ini untuk kasus pohon pencarian biner terkait, tetapi berbeda.]
sumber
Jika saya akan mewawancarai pengembang perangkat lunak, saya akan memintanya untuk merancang perangkat lunak dan menjelaskan persyaratan perangkat keras untuk menghapus entri duplikat dari file besar yang sewenang-wenang berisi nama lengkap di setiap baris. Saya meninggalkan beberapa bagian dari deskripsi masalah dengan sengaja. Kemudian saya menantangnya untuk melihat apakah dia memahami menganalisis dan mengklarifikasi persyaratan, pertukaran yang berbeda, struktur data dan algoritma, I / O (penyimpanan sekunder), teknologi perangkat lunak dan perangkat keras, skalabilitas, dll.
Saya pikir itu adalah masalah kecil namun menantang, mengungkapkan pengetahuan dan kemampuan pelamar di banyak bidang komputasi.
sumber
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Banyak pria bisa terjebak dalam hal ini. Jika beberapa solusi diberikan - biasanya menggunakan rekursi. Setelah itu:
Implement the same via 'for'-loop
Tidak bisa memberi tahu Anda, berapa banyak orang yang gagal menyelesaikan kedua tugas - 50% dari kandidat.
Itu sebabnya saya suka :)
sumber
fib(n)=round(power(PHI,n)/SQRT5)
. PHI dan SQRT5 adalah konstanta yang mewakili rasio emas (1,618 ...) dan akar kuadrat masing-masing.Untuk database saya pergi dengan:
Tuliskan saya beberapa SQL yang akan menduplikat tabel seperti ini berdasarkan namanya (dan saya tidak peduli ID mana yang saya dapatkan kembali tetapi yang mana yang dikembalikan harus valid untuk nama itu). Jadi tabel setelah SQL yang benar telah diterapkan akan menampilkan sesuatu seperti:
Saya suka itu karena:
(Di sinilah saya menemukan bahwa ada beberapa cara sepele untuk melakukan ini dan saya sudah terlalu rumit selama bertahun-tahun).
sumber
SELECT min(ID), Name FROM Things GROUP BY Name
akan berhasil, bukan?HAVING count(Name) > 1
, tapi kemudian saya kira jawaban sampel Anda harus menghilangkan Bodkin Van Horn, Hot Shot, Snimm, dan Dave.DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Apakah Anda punya solusi yang disukai?Masalah papan tulis C ++ favorit saya adalah menerapkan kandidat
Dari sini saya bisa belajar
sumber
Bagaimana Anda mewakili setumpuk kartu 52 standar? Bahasa pemrograman apa pun baik-baik saja. Bagaimana Anda mengocok kartu?
sumber
Favorit saya adalah memulai dengan menanyakan prototipe printf. Kemudian diberi printc API level rendah (char c), yang akan mencetak satu karakter, mengimplementasikan printf. Memberikan segala macam tanggapan menarik seperti tumpukan adalah bagian dari CPU. Seperti yang mungkin Anda tebak, saya berasal dari latar belakang C dan tertanam.
sumber
varargs()
atau beberapa fungsi seperti itu. Apakah saya benar? Saya hanya melakukannya sekali untuk mengatakan saya melakukannya beberapa waktu yang lalu.Anda memiliki mangkuk dengan 200 ikan di dalamnya. Dari ikan ini 99% bukan ikan guppy. Berapa banyak ikan yang harus Anda buang sehingga 2% dari yang tersisa adalah ikan guppy. Tunjukkan pekerjaan Anda.
Ini tentang persyaratan yang membingungkan. Dikatakan cara ini untuk mengubah perspektif beberapa kali selama pertanyaan yang sama. Ini dimaksudkan untuk melihat apakah mereka dapat mengetahui apa yang sebenarnya terjadi.
Anda akan terkejut betapa banyak orang yang salah.
sumber
answer = 100
. [Anggap saja kamu bisa memilih ikan lain secara selektif. Jika menghapus guppy, ada jawaban lain.] Pertanyaan yang bagus, Anda akan terkejut betapa sedikit orang yang menanganinya dengan baik, meskipun itu seharusnya permainan anak-anak untuk seorang programmer.Saya punya beberapa favorit, tetapi di sini ada beberapa yang hampir selalu muncul. Sebagian besar waktu saya melakukan wawancara putaran teknis (C ++) final sehingga mendukung pertanyaan yang lebih panjang dan lebih terbuka yang mengarah pada bidang minat baru. Tidak ada jawaban yang 'benar', hanya ada celah untuk percakapan lain.
1) Menerapkan pointer bersama dasar, penjelasan di mana ada kekurangan dibandingkan dengan tr1 atau meningkatkan pointer bersama dalam implementasi mereka, bagaimana itu harus digunakan dll.
2) Tinjauan kode. Untuk karyawan yang berpengalaman, kami berharap mereka dapat dengan percaya diri meninjau beberapa kode yang disediakan untuk masalah desain, kesalahan, kengerian pengkodean, dan potensi masalah pemeliharaan. Juga, tentu saja, bagaimana mereka memperbaikinya; dan kadang-kadang bagaimana mereka memberikan pesan itu kepada pengembang junior yang mereka tembak.
sumber
Satu pertanyaan yang telah saya gunakan sejak digunakan pada saya adalah sebagai berikut:
Sebagian besar alasan mengapa saya menggunakannya adalah karena Anda dapat mengambil solusi di sana dan bergerak ke berbagai arah:
Jawaban mereka atas pertanyaan-pertanyaan ini dapat memberi Anda wawasan tentang bagaimana mereka menanggapi perubahan persyaratan serta jika mereka dapat mengenali pertimbangan kinerja. Calon yang kuat mungkin menjawab dengan pertanyaan tentang apa fungsi yang diperlukan untuk seberapa sering akan dipanggil.
Bergerak ke arah yang berbeda:
Saya menggunakan ini sebagai cara memeriksa pemikiran lateral mereka. Karena menghitung bilangan prima bisa lambat karena nilai maks bertambah besar, kadang-kadang lebih masuk akal jika menggunakan semacam tabel pencarian yang dihitung atau dihitung sebelumnya yang disesuaikan berdasarkan masalah yang Anda coba selesaikan.
sumber
Ini salah satu untuk memancing beberapa pemikiran - Ini mudah, melibatkan sedikit matematika, dan memeriksa pengetahuan kandidat tentang desain komputer dasar (overflow, representasi numerik, dll):
Tulis sebuah program (atau prosedur) yang mengambil sepasang bilangan bulat X, Y sebagai input dan menentukan apakah X * Y dapat dibagi habis secara merata oleh 10. CATATAN PENTING: X dan Y mungkin cukup besar sehingga X * Y meluap dari jenis bilangan bulat terbesar yang tersedia di mesin Anda.
Solusi sampel:
sumber
Isi metode berikut: PS A mode angka adalah angka (dalam daftar) yang memiliki paling banyak kejadian.
Ini untuk melihat efisien adalah kode Anda.
sumber
Bagaimana Anda mewakili matriks cadangan yang relatif besar ... katakanlah 1000x1000 tetapi memiliki paling banyak 100 entri tidak nol?
sumber