Apakah buffer overflows dapat diterima dari pengembang lulusan? Apakah kita menyetel bilah terlalu tinggi? Apa kemampuan yang diharapkan dari insinyur lulusan / junior?
Konteks:
Kami saat ini merekrut untuk posisi Pengembang Junior yang bekerja terutama di C di Linux.
Sebagai bagian dari proses, kami meminta kandidat untuk menyelesaikan tes kode di waktu luang mereka di C.
Sejauh ini kami telah menolak dua kandidat dengan alasan bahwa kode mereka, meskipun dapat dibaca dan dalam satu kasus agak idiomatis, menderita kesalahan buffer overflow karena penulisan buffer tanpa batas.
[Sunting]:
- Kami secara eksplisit meminta kode kualitas produksi yang diperiksa kesalahan.
- Kami menyediakan kerangka kerja uji & pembangunan untuk para kandidat
[Memperbarui]:
Sebagai hasil dari utas ini, dan percakapan kami dengan pengembang lain secara langsung, kami mengubah cara kami melakukan tes kode dan siapa yang kami targetkan dengan perekrutan kami.
Kami memutuskan bahwa seorang kandidat yang tidak dapat memperbaiki atau memahami buffer overflow berarti bahwa ia tidak akan cocok untuk pekerjaan yang kami lakukan, khususnya dia akan mengambil lebih banyak pendampingan daripada yang kami nyaman. Karenanya, kami masih akan menolak kandidat yang pada akhirnya tidak dapat mengirimkan sampel kode yang kuat.
Namun, kami telah menerapkan beberapa langkah untuk membuat proses rekrutmen lebih produktif bagi kami dan para kandidat.
Khususnya:
- Kami membuat ekspektasi kami lebih eksplisit, dengan penjelasan yang jelas tentang apa yang kami maksud dengan kualitas produksi, dan peringatan bahwa kode diharapkan kuat sehubungan dengan input dan kesalahan.
- Kami sekarang menautkan kandidat ke sumber daya pada pemrograman defensif dan pustaka standar C dalam deskripsi tes kode.
- Kami mengubah target audiens kami dari pengembang dan lulusan Junior untuk menargetkan orang-orang dengan pengalaman yang relevan.
- Seandainya kode yang diajukan gagal dalam beberapa cara tetapi sebaliknya akan diterima, kami sekarang menyediakan kasus uji minimum yang menyebabkan kondisi kesalahan dan memberikan kandidat kesempatan untuk memperbaiki kesalahan mereka (kecuali jika kode ditolak karena alasan lain). Kami juga akan menunjukkan jalur / fungsi yang bermasalah jika sesuai.
- Tujuan dari tes itu sendiri sekarang telah sedikit berubah dari filter ujung depan ke kesempatan untuk membangun gambaran yang lebih baik dari kandidat, khususnya itu akan menginformasikan diskusi telepon kami. Karena itu, kami masih bersedia menolak hanya berdasarkan kode.
[Pembaruan 2015-07-09]: Andy Davis dari Nujob telah menulis artikel yang menarik dan relevan tentang penggunaan tes kode dari sudut pandang kandidat, dan artikel tersebut layak untuk dilihat. Temukan di sini .
sumber
Jawaban:
Saya tidak berpikir Anda telah mengatur bar terlalu tinggi, saya pikir Anda mungkin perlu bar yang berbeda.
Saya pikir tes kode berguna untuk menentukan kompetensi kandidat, tetapi mereka tidak boleh lulus / gagal. Anda harus menggunakan hasil tes kode untuk memulai dialog dengan kandidat.
Jika Anda melihat kesalahan yang telah mereka buat (terutama jika mereka adalah pengembang junior) tunjukkan dan tanyakan apa yang akan mereka lakukan secara berbeda atau jika mereka mengerti mengapa ada masalah.
sumber
Saya pikir kualifikasi junior adalah yang membuat perbedaan di sini. Junior tidak harus diuji untuk kompetensi, mereka harus diuji untuk kemampuan belajar, rasa ingin tahu, hasrat, etika, dan tentu saja kerendahan hati. Asumsi dengan seorang junior adalah bahwa mereka tidak kompeten , itu tugas Anda sebagai senior untuk membuatnya begitu.
Jelas mereka harus dapat menulis kode dasar seperti fizzbuzz dan memiliki pengetahuan umum tentang konsep; jika Anda menunjukkannya kepada mereka dan mereka bahkan tidak tahu apa itu buffer overflow, maka saya akan mengatakan itu tidak jalan, tapi saya tidak mengharapkan junior untuk menulis lebih dari 5 baris kode tanpa bug.
Hari Anda mempercayai kompetensi junior Anda adalah hari Anda harus ditanyai, junior harus diperlakukan dengan banyak pendampingan dan dosis "kepercayaan tapi verifikasi" yang sehat. Saya pernah menjadi junior, dan untuk semua orang yang ada di sana pada saat itu: Saya minta maaf. Ingat hal-hal buruk yang kamu lakukan sebagai junior? (Tolong jangan bilang itu hanya aku; kamu akan memberiku sebuah kompleks ..)
sumber
Saya melihat beberapa masalah di sini.
Yang pertama adalah mengasumsikan bahwa lulusan ilmu komputer rata-rata tahu, well, apapun. Mereka tidak melakukannya. Sejujurnya, saya terkejut ketika saya melihat lulusan ilmu komputer yang tahu cara menginstal dan mengatur Visual Studio . Heck, saya baru-baru ini bekerja dengan seorang pria yang mengaku memiliki lebih dari lima tahun pengalaman di tumpukan Microsoft menulis . Kode NET yang tidak bisa mencari tahu apa TFS itu atau bagaimana menghubungkan.
Yang kedua adalah kolam Anda yang sangat terbatas. Kami juga memiliki kandidat yang melakukan tes pemrograman. Ada lima "program" terpisah yang harus mereka tulis. Mereka melakukannya di rumah dan mengirimkan kode. Tes ini sangat sederhana (tidak ada database, tidak ada ketergantungan eksternal) dan dapat dengan mudah dilakukan menggunakan versi Express dari Visual Studio. Tes itu sendiri dengan mudah diselesaikan oleh seorang pria senior dalam waktu sekitar 30 menit. Perhatikan bahwa kami umumnya hanya melakukan ini untuk lulusan baru hingga tiga tahun pengalaman kerja yang dapat diverifikasi.
Apa yang kami hitung adalah bahwa sekitar 70% dari mereka yang diberi tes tidak pernah kembali kepada kami. Sekitar 15% menyerahkan barang-barang yang tidak dapat dikompilasi, biasanya karena kesalahan sintaks yang mencolok (misalnya, hilang
;
). Lain 10% kompilasi tetapi gagal untuk melakukan tindakan yang diperlukan.Ini menyisakan 5% kekalahan. Pada titik ini, kami bahkan tidak mempertimbangkan kondisi seperti memasukkan karakter alfa sebagai input ketika diperlukan numerik. Ini murni pada diberikan seperangkat X yang sangat terbatas sebagai input aplikasi melakukan output yang sesuai. Juga, angka-angka ini berasal dari sekitar 500 kandidat selama empat tahun terakhir: kami menyimpan statistik karena kami ingin tahu.
Jika kita melihat lebih dalam pada struktur kode dan teknik pengkodean defensif seperti membuang sumber daya yang tidak dikelola dengan benar atau menggunakan
try .. catch
pernyataan, maka hampir tidak ada yang lulus.Pertanyaannya, tentu saja, mengapa?
Mengapa seorang anak dengan gelar di bidang ini dari universitas empat tahun tidak dapat menyelesaikan tugas pemrograman yang sederhana? Jawabannya adalah bahwa perguruan tinggi benar-benar tidak berhubungan dengan kebutuhan bisnis dan tertinggal bertahun-tahun di belakang apa yang kita anggap canggih. 10 tahun yang lalu standar pengkodean sedemikian rupa sehingga keamanan adalah sesuatu yang Anda lakukan setelah fakta; dan unit test bahkan belum populer. Sedangkan hari ini keamanan lebih baik berada di garis depan pikiran Anda dengan setiap fitur atau peningkatan. Ingat saja: sebagian besar profesor tidak pernah benar-benar bekerja di bidang ini ATAU tidak bekerja di dalamnya untuk waktu yang lama. Begitu Anda tahu itu, maka Anda mulai mengerti mengapa mereka begitu jauh tertinggal. Lebih buruk lagi, beberapa profesor itu menghabiskan terlalu banyak waktu untuk teknologi tertentu ( Java , PHP, apa pun) dan gagal membahas masalah mendasar yang serius seperti struktur kode atau pendekatan yang dapat diterima (dan MENGAPA!).
Contoh saja. Lulusan baru-baru ini bercerita tentang beberapa pengalamannya menulis OS seluler untuk salah satu kelasnya, tetapi dia tidak bisa menjelaskan, bahkan secara mendasar, bagaimana server web bekerja. Dia tidak tahu. 15 atau 20 tahun yang lalu mungkin waktu yang tepat untuk memahami cara membuat OS. Hari ini ... tidak banyak. Namun ini adalah kelas wajib ketika kelas pemrograman defensif akan jauh lebih bermanfaat bagi mereka DAN dunia luar.
Jadi apa yang kita lakukan?
Dari 5% itu, kami akan mewawancarai sedikit lebih jauh untuk mendapatkan gambaran kepribadian dan kecocokan mereka. Lalu kami memilih yang "terbaik" dengan pengetahuan penuh bahwa kami akan menghabiskan waktu sekitar enam bulan "memprogram ulang" mereka untuk menyingkirkan omong kosong yang diisi oleh profesor mereka.
sumber
Saya pikir Anda melihat masalahnya dengan cara yang salah. Yang harus Anda tanyakan pada diri Anda adalah ini: Apa yang kami butuhkan dari seorang kandidat agar mereka dapat melakukan pekerjaan itu? Anda harus mengevaluasi posisi dan apa yang diperlukan. Berikut adalah beberapa saran tentang kapan harus menyewa pengembang junior dan kapan tidak.
Kapan harus menyewa pengembang junior: - Jika ada banyak pekerjaan mudah yang harus dilakukan, yang akan membuang-buang waktu untuk pengembang yang lebih senior. - Jika Anda bersedia untuk membimbing dan melatih orang ini selama beberapa tahun ke depan. - Jika Anda mencoba menumbuhkan perusahaan dan menginginkan seseorang yang akan tinggal untuk waktu yang lama. Pengembang junior yang hanya bertahan selama satu tahun akan membuang-buang sumber daya perusahaan, mereka akan melakukan sedikit untuk menghasilkan apa pun, dan sebagian besar hasilnya akan dalam pertumbuhan pribadi mereka sendiri. - Ketika Anda merasa ingin menghabiskan uang untuk pertumbuhan seseorang. Karena lagi, sebagian besar manfaat akan menjadi apa yang mereka pelajari.
Ketika tidak menyewa pengembang junior. - Saat pekerjaan terlalu rumit. Dalam hal ini, itu hanya keluar dari liga mereka. - Ketika Anda ingin menghemat uang. Pengembang senior harus menyelesaikan tugas yang sama dalam waktu singkat dengan hasil kualitas yang lebih baik, dan karenanya harus selalu lebih murah. - Ketika pekerjaan outsourcing atau tidak cukup untuk membuat karyawan sibuk. Dalam kasus seperti itu akan lebih baik untuk menurunkan sebagian pekerjaan ke kontraktor swasta.
Satu poin penting terakhir. Jangan mempekerjakan pengembang junior karena "hanya itu yang kami mampu", atau "hanya itu yang mau kami belanjakan" ketika mereka tidak cocok dengan pekerjaan itu. Pada akhirnya yang akan Anda lakukan hanyalah membuang-buang uang ke toilet. Selain itu, begitu mereka memperoleh keterampilan itu, mereka akan meminta uang besar pula.
Tentang saya:
sumber
Seperti yang disebutkan lainnya, posisi junior mungkin memiliki sedikit pengalaman dengan C. Saya secara pribadi hanya diajarkan secara singkat tentang buffer overflow di C dan bahkan jika saya bisa mewaspadai mereka, kemungkinan saya masih akan memperkenalkan beberapa (terutama jika diberi tugas yang meminjamkan sendiri untuk membuat buffer overflows). Kemungkinan, banyak pengembang junior akan mengalami situasi yang serupa di mana mereka mungkin tahu tentang buffer overflows, tetapi mereka belum siap untuk mengidentifikasi dan menanganinya secara ekstensif.
Mengingat ini, saya akan berpikir respon yang tepat adalah memiliki masalah yang dibicarakan dalam interaksi berikutnya yang mungkin dan bertanya kepada mereka apa yang mereka ketahui tentang buffer overflows untuk menguji pengetahuan mereka secara keseluruhan. Setelah itu, beri tahu mereka bahwa Anda menemukan satu di kode siap produksi yang seharusnya. Ini akan memberi Anda jendela yang bagus untuk menilai bagaimana mereka akan bereaksi terhadap koreksi dan instruksi.
Bukankah pemikiran umum bahwa pengembang junior yang kurang tahu tetapi bersedia dan mampu belajar dan meningkatkan lebih berharga daripada pengembang junior yang tahu lebih banyak tetapi yang tidak bisa atau tidak akan membaik?
Yang sedang berkata, dalam salah satu komentar Anda, Anda menyebutkan Anda menyerahkan mereka tes yang akan menunjukkan buffer overflow dalam kode mereka jika mereka menggunakannya. Jadi mungkin pertanyaan yang lebih besar adalah mengapa mereka tidak menjalankan tes (jika mereka melakukannya, mengapa mereka menyerahkan kode buggy)?
sumber
Overflow buffer adalah mutlak tidak ada jalan. Anda dapat memiliki pertanyaan kode yang sesuai. Dalam apa yang semua salah (bisa salah) dengan potongan kode ini, kandidat harus dapat menentukan masalah. Pertanyaannya adalah, apakah masalah ini tidak relevan, karena Anda tetap menjalankan clint.
Namun dalam tes kode bentuk bebas buatan saya akan ringan pada pelanggaran seperti sprintf. Terlalu sedikit waktu (diasumsikan), pikiran terlalu aktif, terlalu besar keinginan untuk menyajikan sesuatu yang berfungsi.
sumber
Saya pikir Anda mengajukan pertanyaan yang salah. Tidak ada bilah objektif untuk menjadi programmer profesional. Jika ada, akan ada ujian pemrograman standar, tetapi tidak ada. Batangan individu Anda harus ditetapkan berdasarkan pada seberapa pemilih Anda mampu, berapa banyak Anda mampu membayar, berapa banyak kesalahan yang dapat diterima oleh perangkat lunak Anda, dan berapa banyak waktu yang Anda bisa habiskan untuk mengajar.
Dalam hal ini, saya menduga bahwa buffer overrun mungkin berarti bahwa kode ini, yang ditampilkan oleh kandidat sebagai contoh pekerjaan teladan, lumpuh dengan kesalahan segmentasi alih-alih melakukan apa yang Anda minta. Jadi, haruskah Anda menerima pembuat kode yang menulis kode yang macet dengan kesalahan segmentasi alih-alih melakukan apa yang Anda minta? Meminta:
Apakah organisasi Anda mampu menarik siapa saja yang bisa menulis kode kerja?
Apakah proses pengembangan Anda cukup kuat sehingga seseorang yang hampir dapat menulis kode dapat menulis kode kerja dengan bantuan peer review dan pengujian dukungan?
Apakah Anda mampu mengajari para pemrogram cara menjadi pemrogram, dan apakah Anda bersedia mengeluarkan upaya itu dan menunggu mungkin beberapa tahun dan berharap bahwa bakat batin kandidat akan membuahkan hasil?
sumber