Tampaknya ada perbedaan besar antara apa yang saya harapkan dari seseorang yang belajar pemrograman selama beberapa tahun di universitas, dan apa yang sebenarnya diketahui orang.
Saya tidak merasa seperti saya mengajukan pertanyaan yang terlalu rumit dalam wawancara. Beberapa pertanyaan saya yang biasa adalah:
Apa perbedaan antara tipe referensi dan tipe nilai?
Jika tampaknya orang yang diwawancarai tidak benar-benar memahami jawabannya sendiri, atau jika dia tidak tahu terminologi yang saya gunakan, saya masuk ke dalam perincian lebih lanjut dengan memintanya untuk menjelaskan kepada saya apa yang terjadi ketika saya menulis int i = 0; dalam suatu metode, bagaimana dengan objek o = 0, objek o = new MyClass (), dll ...
Pada dasarnya, saya melakukan semua yang saya bisa untuk menipu orang yang diwawancarai untuk memberi tahu saya tentang callstack, heap dll, dan saya mencoba untuk tetap dalam konsep agnostik bahasa. Jika orang yang diwawancarai memberi tahu saya bahwa dia banyak melakukan C, atau C ++, atau c #, saya menyelam lebih dalam ke bahasa tertentu, dan mungkin ke dalam detail implementasi.
Jika perlu, saya bertanya kepada orang yang diwawancarai apa itu callstack, atau di mana argumen dilewatkan ke fungsi dalam bahasa imperatif pilihannya disimpan.
sebagian besar orang yang diwawancarai tidak tahu apa itu callstack, apalagi pertimbangan tinju, dll.
Apa perbedaan antara kelas abstrak dan antarmuka. Dalam kasus apa Anda harus menggunakan salah satunya?
Biasanya, saya juga meminta mereka untuk membayangkan desain perpustakaan kecil dengan use case yang bertujuan menggunakan beberapa warisan dan beberapa pabrik abstrak
Sebagian besar orang yang diwawancarai tidak tahu apa tujuan sebenarnya warisan. Mereka biasanya mengetahui beberapa kata kunci (virtual, override, dll), tetapi tidak benar-benar tahu kapan menggunakannya, apalagi menjelaskan apa itu virtual-table.
Meskipun saya sudah menyaring CV sebelumnya, bahkan untuk orang-orang dengan 5 tahun pengalaman dalam proyek kehidupan nyata yang melibatkan arsitektur kompleks, saya akan mengatakan kurang dari 25% dari semua yang saya wawancarai dapat menjawab dua pertanyaan dengan benar. Dan ketika saya mengatakannya dengan benar, saya tidak bermaksud 'mendalam' ... hanya untuk memiliki perkiraan tentang konsep itu.
Mengenai junior, saya baik-baik saja dengan mempekerjakan seseorang yang tidak tahu bagaimana mengatur waktunya dengan sangat baik, atau seseorang yang tidak terbiasa dengan proses pembangunan industri misalnya, tetapi saya memiliki perasaan bahwa jika seseorang belum mendengar kata " "setelah beberapa tahun belajar Ilmu Komputer, dia bodoh, atau tidak termotivasi, atau memilih universitasnya dengan sangat tidak bijaksana.
Apakah Anda pikir saya terlalu ekstrim di sini? Apakah biasa untuk mempelajari konsep-konsep dasar ini setelah Anda menyelesaikan universitas? Apakah Anda tahu orang-orang yang tidak terbiasa dengan ini, dan menjadi insinyur perangkat lunak yang sangat baik setelah beberapa tahun? Dan apakah Anda pikir perusahaan saya mungkin memiliki masalah dalam menarik orang-orang berbakat, atau apakah Anda mengalami masalah yang sama dengan dalam proses perekrutan Anda sendiri?
Edit. mengenai "tipe langsung", itu hanya terjemahan harfiah dari bahasa Prancis ke bahasa Inggris, seperti yang biasanya kami lakukan dalam bahasa Prancis. Saya telah memperbaikinya dalam pertanyaan saya. Tapi tetap saja, saya pikir Anda semua mengerti dengan sempurna apa yang saya maksud, jenis apa yang membuat poin saya, bukan?
Jawaban:
Terminologi adalah kejatuhan umum dalam situasi wawancara.
Anda bertanya kepada orang yang diwawancarai pertanyaan menggunakan terminologi yang berarti bagi Anda tetapi orang yang diwawancarai mungkin mengetahuinya dengan istilah yang berbeda, atau mungkin hanya tahu teori generik tanpa aplikasi ke bahasa atau lingkungan tertentu. Terjadi kesalahpahaman. Tidak ada pesta yang bahagia.
Sebenarnya ternyata orang yang diwawancarai sangat memahami bahwa beberapa nilai mungkin disimpan secara langsung dalam register dan yang lain mereferensikan sepotong memori di tempat lain, tetapi karena Anda mengajukan pertanyaan dengan cara yang dipimpin oleh domain tertentu, titik dari apa yang Anda tanyakan, dan apa yang Anda ingin diwawancarai oleh orang yang diwawancarai tidak benar-benar disebarkan.
Mungkin Anda mendapatkan banyak situasi di mana orang yang diwawancarai tiba-tiba mengklik dan berkata 'Oh - itu yang Anda bicarakan' - dan kemudian menjelaskan dengan cukup memadai.
Ini adalah keseimbangan yang sulit karena programmer yang baru keluar dari universitas tidak akan memiliki pengalaman beragam yang diberikan oleh pengembangan dunia nyata dalam lingkungan tim. Sementara itu pengembang yang berpengalaman sering tidak akan mengingat (atau bahkan tertarik) semua hal yang mereka pelajari di universitas karena itu tidak relevan untuk digunakan sehari-hari.
Kedua tipe orang ini (ya - itu yang diwawancarai dan pewawancara) perlu belajar bagaimana berkomunikasi satu sama lain sebelum Anda dapat saling mengenal . Tanggung jawab ada pada orang dengan pengalaman yang lebih besar (pewawancara) untuk memastikan ini terjadi.
Belum lagi fakta bahwa beberapa orang mendapatkan kegagalan memori lengkap dalam wawancara. Termasuk saya sendiri. Saya ingat diminta untuk menulis sebuah program dalam C dan saya tidak bisa seumur hidup saya mengingat simbol yang digunakan untuk mengakses anggota dari sebuah pointer (->) dan harus bertanya kepada seseorang. Bahkan bukan untuk pekerjaan pertamaku. Boy memiliki saat itu mengganggu saya selama 15 tahun terakhir :-)
Jauh lebih berguna menurut saya adalah kemampuan berkomunikasi, mampu menyelesaikan masalah secara efisien dan sepenuhnya; ambil dengan cepat; menunjukkan sikap positif yang tajam; berinteraksi dengan baik dengan orang lain, dan nilai-nilai inti lainnya.
Jangan menyerah pada orang yang diwawancarai karena mereka tidak tahu apa jenis langsung. Berpindah.
sumber
Anda meminta pengetahuan khusus bahasa, dan istilah yang Anda gunakan tidak digunakan 100% sama di semua bahasa. Saya - untuk satu - tidak tahu apa "tipe langsung" itu.
Juga, pertimbangkan bahwa hal-hal yang diajarkan di universitas bukanlah cara untuk mengubah kode standar dalam X, tetapi telah belajar banyak konsep yang mendasarinya dan melihat berbagai paradigma pemrograman. Dengan kata lain, ini sangat mirip dengan SIM - meskipun Anda tahu teori dasarnya, Anda masih membutuhkan banyak praktik nyata.
sumber
"Aku mendengar dan aku lupa. Aku melihat dan aku ingat. Aku tahu dan aku mengerti." (Dan, menurut saya, pemahaman mengarah pada retensi memori yang lebih baik.)
Sederhananya, lulusan baru tidak memiliki banyak pengalaman, jadi seperti orang lain catat, mereka tidak akan memiliki lebih dari pengetahuan minimum, tidak peduli apa bahasa "pilihan" mereka.
Saya pergi ke sebuah perguruan tinggi yang dirancang khusus untuk merampingkan pembelajaran tentang jurusan yang dipilih seseorang (jadi, misalnya, Anda tidak akan memiliki Sastra Sejarah jika Anda adalah seorang CS mayor; yang terdekat Anda dengan Sastra Sejarah adalah Fiksi Ilmiah), dan langsung dari perguruan tinggi, saya tidak akan bisa memberi tahu Anda apa antarmuka itu apalagi perbedaannya dengan kelas abstrak, meskipun kami memang belajar tentang abstraksi (dan banyak antarmuka di. Net, teknologi yang saya pelajari). Kita mungkin telah menyentuh antarmuka, tetapi hilang dalam semua hal lain yang perlu kita ketahui untuk lulus kelas. Tidak sampai pekerjaan pertama saya keluar dari perguruan tinggi saya belajar tentang antarmuka, terutama dengan cara yang berarti.
Anda menyebutkan melakukan wawancara dalam bahasa Prancis, yang membuatnya jelas kita berada di negara yang berbeda, sehingga jarak tempuh Anda dapat bervariasi, tetapi di sini di AS, perguruan tinggi terkenal ketinggalan zaman ketika datang ke teknologi. Oleh karena itu, kecuali Anda berurusan dengan bahasa dewasa (C / C ++, COBOL, dll), kemungkinan besar apa yang telah Anda gunakan bahkan selama bertahun - tahun mungkin tidak tersedia dalam versi yang telah dipelajari siswa. Sebagai contoh, .Net 3.0 memperkenalkan Entity Framework, WPF, WCF, dan sejumlah hal keren lainnya, tetapi bahkan sekolah saya masih terjebak pada .Net 1.1 dan 2.0 (yang berarti terjebak dengan ADO.NET dan bahkan tidak belajar tentang Object Pemetaan -Relasional). Sekolah yang menggunakan PHP mungkin macet di (non-OOP) PHP 4.
Perlu diingat juga, bahwa seorang siswa harus menerima banyak informasi yang seringkali hanya digunakan untuk waktu yang singkat. Konsep "lanjutan", seperti abstraksi, sering diajarkan menjelang akhir kelas, di mana siswa mungkin hanya memiliki satu minggu atau lebih untuk bermain dengannya, sementara bersaing dengan kelas lain yang harus diambilnya, dan mungkin, pada atas pekerjaan paruh waktu atau penuh waktu. Gabungkan semua itu bersama-sama dan itu mengherankan orang tersebut dapat mengingat apa saja , apalagi menjaga semuanya tetap lurus.
Di AS, setidaknya, lulusan baru-baru ini sering diasumsikan tidak tahu apa-apa di luar dasar-dasar generik (perbedaan antara melewati nilai dan melewati referensi, mungkin), karena dipahami bahwa teori generik dan penyelesaian masalah adalah bagian utama dari sekolah, tidak belajar seluk beluk bahasa yang diberikan.
Saya sarankan menggunakan pertanyaan-pertanyaan yang Anda miliki lebih sebagai ukuran dari apa yang Anda perlu ajarkan / ajarkan kembali (ingat, sangat mungkin mereka tidak mempelajari istilah yang Anda coba gunakan, bahkan jika Anda pikir itu ada di mana-mana), yang bertentangan dengan apakah orang yang diwawancarai itu "tidak berharga". Gabungkan bahwa dengan mengukur seberapa besar keinginan mereka untuk belajar dan seperti apa keterampilan pemecahan masalah umum mereka (dengan serius, beri mereka teka-teki untuk dipecahkan dan lihat bagaimana mereka melakukannya), dan Anda dapat memiliki rockstar masa depan yang sangat baik bagi Anda. mungkin sudah lewat karena mereka tidak tahu apa yang Anda maksud dengan "callstack."
sumber
Anda memiliki sejumlah pandangan sempit dan Anda menganggapnya secara implisit.
Setahu saya tidak ada universitas, tempat orang belajar pemrograman selama beberapa tahun. Universitas menawarkan kursus dalam ilmu komputer, dimana pemrograman adalah satu aspek.
Rule of thumb: Jika Lisp dapat melakukan tanpa perbedaan, itu hanya berantakan;)
Berbicara tentang konsep agnostik bahasa adalah ide yang bagus. Baik heap maupun stack adalah bahasa-agnostik.
Semua bahasa ini memiliki spesifikasi. Implementasi tidak ditentukan oleh bahasa. C dan C ++ dapat dikompilasi silang menggunakan LLVM untuk dijalankan pada Flash Player atau runtime JavaScript apa pun. Ini membuat asumsi Anda tentang tumpukan dan tumpukan alokasi dibatalkan.
Dengan C #, sama saja. C # JITed sebelum eksekusi dengan banyak optimasi, itu bisa dilakukan. Variabel lokal, yang ditangkap oleh penutupan pada akhirnya akan berakhir di tumpukan, bukan tumpukan, sementara analisis pelarian memungkinkan untuk menyimpan objek lingkup-lokal (yang biasanya harus pergi ke tumpukan) untuk disimpan di tumpukan. Alokasi register yang tepat juga akan sangat mengurangi kebutuhan alokasi stack.
Apa yang akan Anda tanyakan pada seseorang yang hanya memiliki pengalaman pemrograman yang luas dengan Haskell? : P
Ide dasar di balik autoboxing adalah, bahwa primitif juga dapat diperlakukan sebagai objek (atau setidaknya nilai-nilai yang diketik dapat ditemukan saat runtime). Sehubungan dengan abstraksi itu, ada tiga jenis bahasa:
Saya tidak mengerti mengapa orang tidak boleh menggunakan bahasa kategori 1 (sebenarnya itu ide yang bagus). Saya tidak mengerti mengapa orang yang menggunakan bahasa kategori 2 harus benar-benar repot. Dan saya pikir semua orang yang menggunakan bahasa kategori 3, yaitu bahasa yang fitur inti semantiknya rusak, menggunakan bahasa yang salah.
Nah, itu sangat subjektif dan sangat tergantung pada bahasa. C ++ tidak memiliki antarmuka. Objective-C tidak memiliki kelas abstrak. Saya berpendapat bahwa bahasa apa pun yang memiliki keduanya perlu dirancang ulang. Banyak bahasa modern menggunakan ciri, mixin, kategori, peran dan konstruksi serupa untuk memberikan solusi yang jauh lebih bersih untuk penggunaan kembali kode daripada warisan implementasi parsial. Bahasa berbasis prototipe tidak memiliki kelas sama sekali pula.
Pada akhirnya ini adalah subjek yang sulit dan diperebutkan. Wawancara bukanlah tempat yang tepat untuk menyelesaikan pertanyaan ini dan saya tidak akan benar-benar menangkap siapa pun yang melamar posisi junior karena tidak memberi saya jawaban yang baik.
Ada sejumlah bahasa berorientasi objek, yang tidak menggunakan warisan atau vtables klasik.
Saran saya:
Yang penting adalah Anda memahami bagaimana fakta-fakta sederhana dan terisolasi ini dapat diterapkan pada rekayasa solusi yang fleksibel dan dipelihara untuk masalah yang kompleks.
Untuk sampai ke pertanyaan sebenarnya:
Semua perusahaan memiliki masalah menarik orang-orang terampil, kecuali mungkin para pemain besar. Itu karena ada beberapa dari mereka. Dan karena asumsi itu, universitas itu membuat orang-orang terampil. Tidak. Itu membuat mereka berpengetahuan (seandainya mahasiswa dan universitas memegang bagian dari tawar-menawar mereka). Pengalaman itulah yang membuat orang terampil.
Ada beberapa yang telah mengumpulkan pengalaman sebelum memasuki universitas dan yang terus melakukannya selama masa studi mereka. Karena mereka suka pemrograman dan karena ketika mereka mengambil beberapa ide baru selama kursus, mereka akan mencoba untuk melihat bagaimana mereka dapat menggunakannya, hal pertama yang mereka dapatkan di rumah. Ini adalah tipe orang yang ingin Anda pekerjakan. Tetapi ada beberapa dari mereka.
Ini adalah hasrat untuk pemrograman dan pengembangan diri dan pengejarannya yang membuat programmer baik. Pada waktunya.
Saya pikir, yang harus Anda sadari adalah, bahwa sayangnya kebanyakan orang akan masuk dan meninggalkan universitas tanpa pengalaman pemrograman yang memadai.
Pada saat yang sama, industri kami sangat membutuhkan programmer yang berpengalaman. Oleh karena itu, saya percaya ini adalah misi industri kami untuk benar-benar mencoba melangkah. Dan mewawancarai kandidat untuk posisi junior, yang Anda cari secara realistis adalah orang-orang yang mau belajar dan meningkatkan. Dan Anda harus memilih dengan hati-hati, karena Anda harus menginvestasikan banyak energi dan Anda tidak ingin itu sia-sia.
Anggap saja mempekerjakan darah segar untuk menjadi pengemudi bagi tim balap Anda: Seorang pengemudi yang baik memiliki pemahaman yang cukup tentang mekanik untuk memanfaatkan mobilnya dengan baik, tetapi pengetahuan ini saja tidak ada gunanya (bahkan tidak banyak kepala) Mulailah). Apa yang Anda cari adalah seseorang yang mau bekerja keras untuk peningkatan mereka sendiri dan baik dengan tim Anda.
sumber
Terlepas dari istilah "tipe langsung" di mana saya tidak memiliki petunjuk (tipe nilai? OK, saya tidak yakin, terima kasih telah memperbarui), saya pikir Anda benar tentang pertanyaan Anda dan sama sekali tidak ekstremis. Ini adalah pertanyaan yang bisa dijawab jika seseorang keluar dari sekolah. Meski begitu, saya tidak akan segera memberhentikan para kandidat, masih ada beberapa yang mungkin punya potensi karena ingin belajar.
Untuk melanjutkan dengan analogi SIM: beberapa orang tidak peduli apa yang terjadi ketika mereka memasukkan kunci (atau menekan tombol "mulai"). Mereka hanya melakukannya dan mengemudi. Ini tidak berarti mereka juga tidak berharga, hanya saja akan membutuhkan waktu bagi mereka untuk mencapai ketenaran ;-)
Hanya komentar pribadi tentang gelar / diploma: Saya saat ini bekerja dengan orang-orang dengan latar belakang biokimia dan industri yang memiliki beberapa tahun pengalaman di bidang IT dan juga beberapa orang "berpengalaman" dengan latar belakang CS, dan tebak siapa yang paling berpengetahuan luas. tentang bagaimana mesin kendaraan bekerja? Yup, bukan orang yang pernah belajar CS! Jadi saya hanya mengalami kenyataan bahwa diploma tidak selalu berarti!
sumber
Saya biasanya tidak mengajukan pertanyaan spesifik tentang terminologi atau definisi selama wawancara. Seperti yang telah dicatat oleh jawaban lain, orang memiliki istilah berbeda untuk konsep yang berbeda dan walaupun mereka secara konseptual memahami subjek, mereka mungkin tidak dapat menyampaikannya kepada Anda.
Dengan Juniors saya sangat fokus pada magang atau proyek sekolah mereka. Saya bertanya pertanyaan tentang mereka, biarkan mereka mengartikulasikan jawaban dan kemudian saya mulai menyelam lebih dalam ke keterlibatan mereka yang sebenarnya dalam proyek, apa yang mereka pelajari, apa yang mereka rasakan.
Secara umum, jika orang itu bobot mati dalam proyek maka mereka umumnya tidak bisa memberikan jawaban yang memuaskan kepada saya, jadi biasanya cukup mudah untuk mengatakannya. Berhati-hatilah untuk tidak membuat kesalahan karena gugup dan tertutup karena tidak tertarik dan tidak terlibat.
Mampu menentukan kandidat yang baik yang pemalu dan tertutup agak sulit, tetapi kemudian budaya tempat saya bekerja tidak akan baik untuk pengembang yang pemalu dan pemalu sehingga jika mereka tidak dapat mengadakan percakapan rinci yang produktif dengan saya maka mereka tidak cocok.
sumber
Itu sangat tidak adil. Ketika Anda seorang mahasiswa, yang dapat Anda lakukan hanyalah memilih universitas berperingkat tertinggi yang akan Anda dapatkan, atau mungkin universitas yang diiklankan memungkinkan Anda bermain dengan anjing robot yang bermain sepak bola. Tidak ada lagi. Anda hanya dapat mengevaluasi program universitas setelah melakukannya, kemudian pergi dan bekerja di industri selama beberapa tahun dan membangun beberapa proyek non-sepele.
Bahkan jika Anda memasang tanda neon besar pada setiap kursus yang mengatakan "KITA TIDAK MENGAJARKAN PANGGILAN PANGGILAN", lalu apa yang Anda harapkan siswa lakukan tentang hal itu? Luangkan waktu berbulan-bulan untuk merisetnya sehingga mereka benar-benar dapat memahami apa artinya itu dan berapa banyak yang mereka perlukan yang mengajarkannya? Untuk setiap kursus dengan setiap kombinasi tanda?
Orang tidak bisa memilih pendidikan mereka, secara realistis.
sumber
Ketika mewawancarai lulusan baru saya tetap berpegang pada topik yang tercantum di CV mereka. Jika mereka menggunakan Java, saya akan bertanya tentang Java. Jika mereka menggunakan Blub, maka saya menghabiskan setengah jam membaca tentang Blub, dan bertanya kepada mereka tentang itu. Tapi saya selalu bertanya menggunakan kata kunci bahasa. Jika itu Java, maka saya akan bertanya tentang "extends" dan "implementements" tetapi bukan "subclass" dan "inherit". Saya berharap lulusan baru dapat berbicara tentang beberapa kode yang telah mereka tulis, untuk dapat memecahkan masalah pemrograman yang sederhana, dan untuk memahami struktur data dasar (tabel hash dan pohon).
sumber
Sebagai Direktur yang merancang proses wawancara, saya dapat memberi tahu Anda apa yang diharapkan oleh perusahaan kami dari lulusan baru: Saya berharap orang-orang yang dapat membaca dokumentasi dan menerapkan pengetahuan. Jadi, kami memiliki beberapa tugas yang kami minta mereka lakukan. Ini adalah tugas pengkodean sederhana, tidak jauh lebih sulit daripada latihan kelas perguruan tinggi Anda (pengembang "baik" yang berpengalaman dapat merobohkannya dalam waktu sekitar 15 menit). Kandidat diberi workstation dengan akses internet, kompiler (dalam kasus visual studio kami), dan file bantuan.
Jika mereka tidak dapat menulis kode dalam kondisi ini, mereka tidak mendapatkan pertimbangan untuk disewa. Sederhana seperti itu. Seluruh alasan "baik saya tidak tahu bahasa" tidak pernah benar-benar cocok dengan saya karena setiap kandidat yang datang untuk wawancara di sini tahu akan ada ujian, mereka tahu bahasa dan alat yang kami gunakan di muka. Anda dapat mengunduh visual studio express di rumah dan melakukan beberapa dasar-dasar sebelum masuk dan lulus ujian entry level, mereka yang tidak repot ... yah itulah yang saya sebut bendera merah.
sumber