Pertanyaan Asli
Saya sudah melakukan beberapa wawancara untuk perusahaan saya, kebanyakan ilmuwan komputer untuk posisi dev tetapi juga beberapa penguji dan manajer proyek. Sekarang saya harus mengisi lowongan di grup penelitian kami di dalam departemen R&D (catatan: "penelitian" berarti bahwa kami mencoba menyelesaikan masalah dalam domain / ceruk pasar profesional kami menggunakan perangkat lunak dalam proyek penelitian bersama dengan universitas, perusahaan lain, pusat penelitian dan organisasi pengguna akhir. Ini bukan penelitian ilmu komputer; kami tidak akan menyelesaikan masalah P = NP).
Sekarang kami mengundang seorang pria yang memegang gelar MSc dalam bidang kimia (dengan banyak fisika di CV-nya juga), yang tidak pernah memiliki pelajaran ilmu komputer. Saya sudah berbicara dengannya sekitar setengah jam di hari-hari karir universitas lokal dan tidak diragukan lagi pria itu cerdas. Juga nilainya sangat bagus dan dia lulus dengan perbedaan. Untuk gelar BSc, dia perlu belajar pemrograman di Mathematica dan memberi tahu saya bahwa dia sangat menyukai pemrograman. Dia juga memecahkan beberapa masalah kimia fisik yang saya mungkin tidak mengerti menggunakan perangkat lunaknya sendiri, diimplementasikan dalam Mathematica, untuk tesis MSc-nya. Ini termasuk GUI dan ukuran penting 8.000 LoC. Dia tampaknya sangat tertarik dengan apa yang kami lakukan di grup riset kami dan jujur saja itu cukup sulit bagi UKM seperti kami untuk mendapatkan orang baik. Saya juga sangat tertarik untuk mempekerjakannya karena dia dapat membantu saya dalam menulis proposal proyek, laporan, melakukan presentasi dan sebagainya. Dia mungkin akan cocok untuk tim kami juga.
Satu-satunya pertanyaan yang tersisa adalah: Bagaimana saya bisa memeriksa apakah dia akan mendapatkan keterampilan pemrograman yang dia butuhkan untuk melakukan implementasi perangkat lunak dalam proyek-proyek kami karena ini akan menjadi bagian penting dari pekerjaan?
Tentu saja saya akan bertanya kepadanya apa itu, yang membuatnya tertarik tentang pemrograman. Saya juga akan bertanya bagaimana ia mulai menulis perangkat lunak ilmu alamnya dan bagaimana ia menyusunnya. Saya akan bertanya tentang bagaimana ia berhasil memperoleh keterampilan dan informasi tentang pengembangan perangkat lunak yang ia butuhkan. Tetapi apakah ada hal lain yang bisa saya tanyakan? Mungkin ada sesuatu yang lebih konkret? Haruskah saya memintanya untuk menjelaskan solusi Mathematica-nya?
Untuk lebih jelasnya: Saya tidak mencari pengetahuan dalam bahasa atau tumpukan teknologi tertentu. Kami adalah .NET shop dalam pengembangan produk tetapi saya ingin memiliki pilihan gratis untuk proyek penelitian kami. Jadi saya tertarik pada kompetensi meta untuk dapat mempelajari apa pun yang sebenarnya dibutuhkan.
Saya harap pertanyaan ini dapat dijawab dan tidak terbuka karena saya benar-benar ingin tahu apakah ada cara standar untuk memeriksa kemampuan untuk mendapatkan keterampilan pemrograman lebih lanjut di tempat kerja. Jika ada sesuatu yang tidak jelas bagi Anda, tolong beri saya beberapa komentar dan biarkan saya meningkatkan pertanyaan saya.
Pembaruan untuk mencerminkan jawaban yang diberikan hingga 2011-12-01
Apa jawaban yang saya terima dan mengapa
Terima kasih atas jawaban Anda, sebagian besar dari mereka sangat membantu, jadi saya sangat banyak mendapat peningkatan! Meskipun jawaban Tom Squires mendapat suara terbanyak, saya akan menerima jawaban yang diberikan oleh Pangeran Goulash . Tentu saja Tom secara objektif benar, tetapi jawaban Pangeran hanya lebih membantu bagi saya dan saya memeriksa ulang FAQ bahwa ini adalah kriteria untuk menerima jawaban.
Apa yang akan saya tanyakan kepadanya selama wawancara
Saya akan membiarkan dia menjelaskan beberapa tugas sederhana seperti contoh dalam The Camel Has Two Humps yang disebutkan oleh Chris Burt-Brown
Saya akan memintanya untuk menjelaskan beberapa aliran kontrol yang lebih maju mungkin dalam notasi grafis.
Saya akan memeriksa pemahamannya tentang rekursi menggunakan contoh matematika.
Saya akan membiarkan dia menjelaskan algoritma pilihannya dalam bahasa alami.
Saya akan membiarkan dia menjelaskan solusi Mathematica-nya, khususnya saya akan meminta model prosedurnya, penggunaan alat, penataan kode dan perangkat lunak secara umum serta berbagai lapisan abstraksi.
Untuk memeriksa motivasinya, saya akan meminta daya tarik pengembangan perangkat lunaknya.
Saya akan bertanya kepadanya apakah dia tahu apa yang perlu dia pelajari tentang pengembangan perangkat lunak perusahaan. Terutama saya ingin mengubah diskusi menjadi arah bekerja dalam tim, pemrograman pasangan, TDD karena saya berharap dia tidak tahu banyak tentang ini setelah bekerja pada MSc-nya saja.
Kedengarannya seperti wawancara panjang;)
Pembaruan setelah wawancara 2011-12-09
Sekali lagi terima kasih atas jawaban baik Anda. Dia lulus wawancara dengan warna-warna cerah. Saya tidak pernah lebih puas dengan pelamar. Solusi Mathematica-nya tampaknya terstruktur dengan cukup baik. Dia bisa menjelaskan di mana dia menggunakan fungsi tingkat tinggi, meskipun dia tidak tahu bahwa ini disebut seperti ini. Dia menjawab pertanyaan rekursi berbasis matematika saya serta tugas-tugas sederhana dan mengontrol berbagai hal dari The Camel Has Two Humps. Ketika dia menjelaskan beberapa algoritma saya belajar banyak tentang pemasangan non-linear;) Juga dia dengan jujur mengatakan bahwa tentu saja dia tidak dapat menjamin bahwa dia akan dapat mempelajari hal-hal tentang pengembangan perangkat lunak profesional yang dia tidak ketahui sejauh ini. Tapi dia percaya bahwa dia selalu baik dalam mempelajari konsep-konsep baru - bahkan oleh dirinya sendiri - dan benar-benar tertarik pada pengembangan perangkat lunak. Dia juga meminta tumpukan teknologi proyek, dia akan diterapkan terlebih dahulu, untuk melihatnya di rumah. Dia ingin tahu tentang pemrograman pasangan dan kerja tim juga. Sekarang saya berharap kontrak kerja akan selesai.
Jawaban:
Saya sangat terbebani di sini karena saya mulai sebagai pengembang perangkat lunak beberapa tahun yang lalu dengan gelar PhD dalam fisika, tetapi sangat sedikit pengalaman pengkodean (setara dengan program sarjana di Fortran). Jelas itu tergantung pada jenis perangkat lunak yang Anda kembangkan, tetapi pandangan saya adalah bahwa keterampilan pengkodean sangat mudah untuk diambil oleh siapa pun dengan keterampilan ilmiah / pemecahan masalah setengah layak. Saya tidak bermaksud itu sebagai penghinaan terhadap programmer seumur hidup yang telah mempelajari ilmu komputer: tentu saja ada aspek teknis yang mengambil pelatihan serius untuk dikuasai (misalnya arsitektur multi-threading dan sangat rendah) tetapi saya menganggap itu bukan posisi yang ingin Anda isi.
Untuk wawancara teknis saya untuk posisi saya saat ini, saya dihadapkan dengan masalah matematika yang cukup kompleks dan diminta untuk merancang program untuk menyelesaikannya. Penekanannya adalah pada penulisan algoritma yang, setelah diimplementasikan, akan menyelesaikan masalah. Saya bisa menulis jawaban murni menggunakan kata-kata untuk menggambarkan solusi saya, tetapi saya diizinkan untuk menulis beberapa kode dalam bahasa pilihan saya jika saya mau. Tes itu lebih tentang kemampuan pemecahan masalah dan apakah saya bisa "berpikir seperti seorang programmer". Jelas jika ada kandidat dengan kemampuan yang sama dan satu memiliki pengalaman pengkodean lebih langsung, maka dia akan keluar di atas, tetapi itu tampaknya cukup adil bagi saya.
Intinya adalah: memeriksa kandidat untuk keterampilan Anda mempekerjakan dia, bukan untuk cita-cita yang Anda harapkan akan dia capai.
sumber
Anda tidak bisa . Tidak mungkin untuk secara akurat menguji keterampilan yang belum dia miliki. Anda harus membuat keputusan berdasarkan kecerdasan dan sikapnya. Pada akhirnya selalu akan menjadi risiko.
Dari pengalaman pribadi saya dapat mengatakan sangat mungkin untuk beralih dari sains ke pemrograman. Keduanya pada dasarnya mendidih menggunakan otak Anda untuk memecahkan teka-teki yang kompleks.
sumber
Saya tidak memiliki sumber sekunder yang memverifikasi makalah ini sehingga saya tidak dapat menjaminnya tetapi:
Unta Memiliki Dua Humps
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
sumber
Bagaimana saya bisa mengecek apakah dia akan mendapatkan keterampilan pemrograman yang dia butuhkan?
Ini sangat sederhana. Beri dia keterampilan.
Nah, itu bukan jawaban yang sangat memuaskan, tapi izinkan saya menguraikan.
Saya datang ke pemrograman setelah melakukan 3 tahun di Teknik Sipil. Itu latar belakang yang cukup solid dalam fisika dan matematika terapan . Ini bukan matematika teoretis yang akan diberikan gelar CS, tapi ini layak dilakukan. Apa yang saya dapatkan dari pengalaman teknik adalah latar belakang yang kuat dalam pemecahan masalah . Siapa pun dengan latar belakang matematika sudah menghargai konsep keanggunan ketika berbicara tentang solusi untuk suatu masalah. Mereka sudah mendapatkan pendidikan dalam refactoring karena mereka menghabiskan waktu mengambil enam halaman goresan ayam dan mengubahnya menjadi bukti setengah halaman yang elegan untuk diserahkan.
Siapa pun yang mempelajari fisika telah mengembangkan pendekatan intuitif untuk membuat solusi dari kerangka dasar.
Dan apa pemrograman di luar keterampilan ini? - Bahasa, Idiom, Pola dan Kerangka. Ini mudah untuk diajarkan. Pemecahan masalah yang tidak bisa Anda lakukan. Jika Anda dapat memberikan instruksi di bidang ini, maka Anda akan berakhir dengan pengembang yang baik.
Pertanyaannya kemudian menjadi "Berapa lama Anda bisa menunggu dia untuk mempercepat?"
tl; dr; Anda bisa mengajar mengetik. Anda tidak bisa mengajar dengan pintar.
sumber
Saya memiliki gelar BSc dalam Ilmu Material tetapi telah bekerja sepanjang karir saya dalam pengembangan perangkat lunak.
Saya akan menyarankan bahwa kandidat Anda mungkin tidak akan memiliki masalah dengan pemrograman dasar dan algoritma, tetapi ketika datang ke persyaratan jenis "rekayasa" yang lebih ia mungkin memerlukan bimbingan. Maksud saya menyusun kode dengan baik, tidak memiliki fungsi garis 500, pengujian secara efektif, merancang untuk efisiensi ...
Sebagian besar dari ini dapat diajarkan, tetapi Anda mungkin ingin merancang beberapa pertanyaan untuk mengetahui hal ini.
sumber
Kedengarannya bagi saya seperti kandidat sudah tahu cara memprogram, asalkan mereka mungkin tidak memiliki banyak pengalaman melakukannya sebagai pengembang yang berdedikasi tetapi mereka memiliki proyek yang dapat dibuktikan yang telah mereka selesaikan yang membutuhkan jumlah pekerjaan yang tidak sepele untuk diselesaikan. Dengan demikian, Anda mungkin dapat mewawancarai kandidat dengan cara yang sama dengan yang Anda lakukan terhadap pengembang yang menggunakan bahasa berbeda dari yang Anda gunakan, yaitu:
Bahasa yang digunakan Mathematica cukup maju dan seseorang yang pandai menulis perangkat lunak untuk Mathematica harus cukup kompeten di bidang lain sehingga fokus pada pengalaman itu dan menggunakannya sebagai dasar untuk pengalaman pengkodean bisa menjadi cara yang baik untuk mendekati wawancara.
sumber
Berbicara sebagai lulusan Teknik Aerospace berubah menjadi programmer, tentu mungkin untuk membuat lompatan dari ilmu alam ke pemrograman. Namun, berhati-hatilah, mampu menyelesaikan masalah tidak selalu berkorelasi dengan kemampuan menulis kode. Anda sepertinya menyadari ini dan itu adalah hal yang baik.
Bagi saya, konsep yang paling penting untuk memastikan dia memahami adalah kontrol aliran dan rekursi (dan perulangan secara umum sebagai bagian dari ini). Sebelum merekrut seorang kandidat, bahkan seseorang yang jelas-jelas sangat cerdas pastikan ia dapat menulis algoritma kata-kata sederhana untuk menyelesaikan masalah. Pastikan dia dapat mengambil algoritma kata-kata sederhana dan mengubahnya setidaknya menjadi kode semu. Anda bahkan dapat menyelidiki untuk melihat apakah dia setidaknya dapat memahami konsep polimorfisme, meskipun saya tidak yakin ini adalah pengetahuan yang diperlukan dalam keadaan ini.
Waspadalah juga kemampuan untuk menyelesaikan masalah sains di Mathematica / MatLab / Apapun bukan berarti dia bisa menulis kode yang bagus. Ini hanya berarti ia mampu menerapkan prinsip-prinsip pemrograman dasar (kadang-kadang sangat mendasar), biasanya jika pernyataan lain. Belajar menjadi programmer yang baik umumnya akan mengambil komitmen pribadi dan majikan untuk seseorang pada tahap ini. Peringatan: Saya telah bertemu orang-orang yang sangat cerdas yang adalah / insinyur yang baik yang tidak dapat memprogram jalan keluar dari kantong kertas dan jujur tidak dapat memahami dasar-dasar bahasa dasar.
Pengalaman pribadi
Saya lulus dari sekolah dengan gelar teknik dan sedikit pengalaman pemrograman di bawah ikat pinggang saya. Saya telah bekerja dengan jumlah C yang sangat kecil, sedikit MatLab dan beberapa VB + Access. Butuh waktu sekitar 3 bulan belajar untuk menjadi benar-benar berguna sebagai programmer di toko VB.NET. Butuh 9 bulan lagi untuk menjadi mahir. Namun, saya bisa, dengan tingkat kepercayaan yang adil mengatakan bahwa keterampilan pemecahan masalah saya lebih tinggi daripada 99% programmer lain yang saya temui dalam pekerjaan saya. Majikan saya secara konsisten menganggap saya sebagai salah satu aset mereka yang lebih berharga.
Kesimpulan
Ini adalah risiko / imbalan tetapi sering kali menghadapi seseorang yang memiliki keterampilan pemecahan masalah murni dapat membuahkan hasil dalam jangka panjang selama mereka mampu mempelajari konsep pemrograman dan Anda berdua bersedia menginvestasikan waktu dalam memperluas pemrogramannya. pengetahuan. Namun, saya sangat yakin bahwa dia harus memiliki setidaknya pemahaman dasar tentang dasar-dasar pemrograman sebelum Anda menawarkannya pekerjaan. Dalam pengalaman saya, begitu Anda berada di titik ini, Anda bisa melangkah lebih jauh dengannya.
sumber
Saya akan mulai dengan beberapa pertanyaan dan dasar-dasar algoritma dasar untuk melihat apakah dia masuk ke dalam logika algoritma dan pemrograman. Jika dia mampu memahami apa itu algoritma, dia akhirnya dapat mengembangkan keterampilan yang dibutuhkan untuk melakukan hal-hal konkret sesudahnya.
sumber
Jujur, saya cukup yakin Anda tidak akan mendapatkan informasi ini dari wawancara satu atau dua jam. Beri dia tugas pemrograman dalam C # (sesuatu yang tidak terlalu teknis) dan satu atau dua minggu untuk menyelesaikannya. Itu seharusnya cukup waktu untuk mempelajari dasar-dasar bahasa untuk seseorang yang telah belajar pemrograman dengan Mathematica. Kemudian buat tinjauan kode dengannya dan putuskan basis itu.
sumber
Anda mungkin melihat Praktik untuk pemrograman dalam lingkungan ilmiah? (di Stack Overflow) untuk mendapatkan gambaran tentang seperti apa budaya pemrograman ilmu alam. Dengan begitu Anda berada dalam posisi untuk membandingkan persiapannya dengan rekan-rekannya.
Dalam hal ini, Anda mungkin memintanya untuk menjelaskan praktik pemrograman yang biasa ia gunakan untuk mengetahui apakah ia tahu ada cara lain untuk melakukannya .
Ada banyak "pemrogram yang baik" dalam bisnis saya yang kualifikasinya mampu mempertahankan cukup banyak kemampuan untuk menyatukan beberapa kode kerja, tetapi pekerjaannya cenderung tidak terstruktur dan sulit dipertahankan. Umumnya mereka dapat diajarkan, tapi ... mereka harus diajarkan.
sumber
Departemen lain tempat saya bekerja menggunakan variasi pada tes standar kami. Tugas pertama adalah membalikkan kata-kata dalam string di tempat. Kemudian, gunakan kode itu untuk membalik urutan kata dalam string, masih di tempatnya. Alih-alih menggunakan bahasa pemrograman, mereka memiliki kandidat yang mendesain algoritma di atas kertas dan menjalankannya menggunakan papan Scrabble.
sumber
Saya akan meminta untuk menjelaskan (menggunakan bahasa alami) suatu algoritma untuk menghitung sesuatu dari fisika. Sesuatu yang sedikit lebih rumit dari formula sederhana dan kemudian saya akan bertanya bagaimana dia melihat perhitungannya dikemas dalam objek (tidak perlu pengetahuan OOP, Anda bisa menjelaskan apa yang Anda harapkan dari suatu objek). Dengan cara ini Anda bisa melihat pemikiran logisnya. Ini lebih penting daripada keterampilan pemrograman apa pun.
sumber
Pertama, mereka mungkin cukup pintar, jadi skenario terburuk yang bisa mereka pelajari menjadi pemrogram yang baik dengan bimbingan. Namun, jika Anda membutuhkan mereka untuk terjun dan menjadi pemrogram yang baik sejak awal, minta mereka mengirimkan beberapa contoh kode yang telah mereka tulis.
Apakah ini satu atau dua fungsi multiguna raksasa atau apakah mereka merangkum fungsionalitas pada level abstraksi yang sesuai? Apakah angka ajaib sulit dikodekan? Apakah kode KERING? Apakah mereka memberikan variabel nama yang masuk akal atau semuanya singkatan atau huruf tunggal yang tidak dapat diuraikan? Bisakah Anda kebanyakan mengikuti logika kode mereka? Apakah mereka mengerti dasar-dasar OO?
Tanyakan apa yang mereka gunakan untuk kontrol versi (git / hg / svn / cvs / bzr, dll.). Pernahkah mereka membuat kode profil atau menggunakan debugger, dan jika ya yang mana atau apa strategi debugging generik mereka?
Jika mereka gagal dalam tes ini dan Anda membutuhkan pembuat kode yang baik dari awal, lewati orang ini. Kalau tidak, pekerjakan mereka, sarankan mereka membaca beberapa buku rekayasa perangkat lunak (misalnya, Kode Lengkap) selain pemrograman generik / buku CS.
(Sebagai catatan saya juga ilmuwan fisik yang berubah menjadi programmer.)
sumber
Karena dia masih di universitas atau baru saja selesai, dia terbiasa belajar. Mintalah dia membaca dan memahami buku Pola Desain dan setelah (atau selama) sebulan, berdiskusi dengan dia tentang topik-topik tersebut. (Saya pikir itu) ini bisa memberi tahu Anda banyak tentang kemampuannya (tidak hanya yang sulit (itu juga), tetapi juga bagaimana ia menangani memahami konsep-konsep baru, memahami penggunaannya, melihat pro dan kontra, dll.). Tetapi akan dikenakan biaya satu bulan waktu.
sumber