Standar apa yang bisa diharapkan dari insinyur lulusan / junior? [Tutup]

38

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 .

brice
sumber
29
Mungkin...? Mempertimbangkan bahwa tampaknya banyak orang di sekolah sekarang memiliki lebih banyak pengalaman di Jawa daripada di C. Jika kandidat baru keluar dari sekolah dan 2/3 dari paparan pengkodean mereka adalah Jawa, C mereka mungkin tidak cukup kuat untuk lulus dari Anda. uji. TAPI ... jika mereka terbuka dan mau belajar, lalu apa yang akan Anda katakan? Bagaimanapun, ini adalah posisi Junior ...
FrustratedWithFormsDesigner
4
Ini juga kode yang ditulis dalam sebuah wawancara, mungkin dimaafkan mengingat batasan waktu. Aku akan setidaknya pastikan untuk menyebutkan kepada mereka bahwa kebutuhan kode mereka untuk tidak menderita buffer overflow.
Mansfield
4
Saya kedua @FrustratedWithFormsDesigner. Saya seorang pengembang junior, dan satu-satunya waktu saya harus berurusan dengan C adalah untuk beberapa tugas di kelas pada arsitektur CPU. Sementara itu, saya menganggap diri saya cukup OK di C #, Java, dan Ruby.
Kevin - Reinstate Monica
4
Dan apakah kerangka kerja pengujian termasuk tes yang menyebabkan buffer overflow?
FrustratedWithFormsDesigner
44
Saya tidak bisa mengatakan Anda melakukan sesuatu yang salah, tetapi setelah mewawancarai puluhan lulusan CS perguruan tinggi besar selama beberapa tahun terakhir, saya menemukan bahwa sebagian besar tidak memiliki konsep tentang apa yang dimaksud dengan 'kode kualitas produksi'. Saya pikir sebagian besar instruktur CS tidak peduli tentang penulisan kode untuk digunakan oleh orang lain.
Jim In Texas

Jawaban:

109

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.

Tombatron
sumber
1
+1 benar, dan itu saran yang bagus. Kami memang meminta kandidat untuk meninjau kesalahan kode mereka, memberi mereka banyak waktu untuk melakukannya, tetapi mereka kembali dengan jenis koreksi yang salah, dalam beberapa kasus memperburuk kode, tanpa memperbaiki kesalahan yang menyebabkan meluapnya di tempat pertama.
brice
15
@Brice Cukup banyak demonstrasi yang solid bahwa mereka sebenarnya adalah pengembang junior. Menghindari kesalahan yang tampak jelas datang dengan latihan dan pengalaman.
Tombatron
34
@ Brice: dia berkata untuk mendiskusikan kesalahan spesifik dengan mereka; jangan katakan ada kesalahan dan minta mereka untuk kembali kepada Anda. Diskusikan kesalahan secara real time - beri mereka petunjuk (nomor baris atau mungkin deskripsi dan fungsi dan minta mereka untuk memberi Anda nomor baris), lalu tanyakan bagaimana hal itu bisa dicegah. Tujuannya bukan kode tes bebas kesalahan, tetapi pemahaman yang baik tentang kekuatan dan kelemahan pelamar.
jmoreno
6
Jika pengembang junior dapat melihat masalah ini, mereka akan memperbaiki masalah tersebut. Jika itu aku, aku akan menguji kemampuan mereka untuk bekerja denganmu. Beri tahu mereka apa masalahnya dan di mana masalahnya dapat ditemukan, beri mereka perlakuan yang sama dengan yang akan Anda berikan kepada kolega Anda yang sebenarnya dan lihat bagaimana mereka bereaksi. Jika bekerja dengan mereka adalah tugas, mereka tidak tepat untuk posisi itu. Jika bekerja dengan mereka adalah kesenangan, maka sewalah mereka.
zzzzBov
67

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 ..)

Jimmy Hoffa
sumber
1
Saya secara resmi masih menjadi 'Junior Software Engineer' dengan pengalaman 2 tahun penuh! Latar belakang saya bukan di CS atau Rekayasa SW (Ada dalam Fisika). Saya tidak mau menyerahkan kode yang segfault pada input apa pun, sekarang, atau ketika saya direkrut.
brice
31
koreksi, Anda tidak akan sengaja memasukkan kode yang segfault pada input apa pun. Jika Anda baru saja mengklaim bahwa Anda tidak pernah menulis bug, maka maaf mengganggu Anda John Carmack.
Jimmy Hoffa
Harg! backpedal! Itu tentu bukan klaim yang saya buat. Saya telah merilis kode buggy, beberapa lebih buruk daripada yang lain. Tapi tidak ada yang tampak seperti contoh pertama dari apa yang tidak boleh dilakukan ketika Anda mencari "buffer overflow" di google
brice
Kami bahkan menyediakan kerangka uji untuk kode tersebut, termasuk tes yang memicu luapan!
brice
@ Brice Ketika Anda mengatakan Anda menyediakan kerangka kerja pengujian, apakah Anda menyediakan alat seperti valgrind untuk menguji masalah memori?
BЈовић
15

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 .. catchpernyataan, 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.

Bukan saya
sumber
2
Sepenuhnya setuju di sini, saya telah belajar lebih banyak dalam 2 1/2 tahun saya di industri kemudian saya pernah belajar di perguruan tinggi. Saya belajar ini dengan menyakitkan setelah saya magang pertama sebagai pengembang web saat masih di sekolah.
Ryan
5
Sekarang saya ingin mencoba tes pemrograman Anda ..
Akash
1
Sangat? Pengalaman menginstal perangkat lunak tertentu dan kemampuan untuk memberikan versi yang disederhanakan dari apa yang dilakukan server web adalah apa yang Anda cari? Jika seseorang dapat menangani penulisan OS seluler, mereka dapat mempelajari cara kerja server web.
Michael Shaw
@MichaelShaw: Jika seseorang menulis OS, tetapi belum diajarkan operasi dasar dari jenis server yang paling umum, maka itu menunjukkan bahwa sekolahnya melewatkan bidang pendidikan yang besar (dan sangat relevan). Pertanyaannya kemudian menjadi apa lagi yang dilewati?
NotMe
2
@ ChrisLively: Saya tidak melihat bagaimana kedua hal itu merupakan masalah besar. Bukannya kita memiliki bidang kecil yang bergerak lambat. Belajar di tempat kerja akan terjadi. Saya pikir Anda mungkin memiliki poin yang pada dasarnya bagus di sini, tetapi contoh-contohnya tidak meyakinkan. Jika ada masalah dengan kurikulum CS, menambahkan "Cara menginstal Visual Studio 101" dan "Dasar-dasar Webservers 101" tidak akan memperbaikinya. (Saya suka ide kelas "Pemrograman Defensif".)
Michael Shaw
5

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:

  • Gelar dalam fisika dengan hampir tidak ada pelatihan formal.
  • Dua tahun pengalaman kerja. Jadi saya tahu apa proses pembelajarannya.
  • Mulai pengembang perangkat lunak. Saya telah melakukan pekerjaan yang sangat menuntut dan telah melihat semua tingkat keterampilan yang berbeda dari berbagai individu. Banyak dari mereka tidak dapat menangani banyak hal yang saya lakukan.
Matthew Ouellette
sumber
4

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)?

Lawtonfogle
sumber
3

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.

Joop Eggen
sumber
10
Saya hampir menulis jawaban yang sama persis sampai saya perhatikan dia merujuk ke "junior", ingatlah itu .. Saya telah melihat beberapa junior yang tajam, tetapi bahkan mereka masih melakukan hal-hal bodoh tanpa disadari, banyak rekayasa perangkat lunak hanya dapat diajarkan oleh pengalaman
Jimmy Hoffa
@JimmyHoffa ya baru saja membaca baris pertama Anda, mengoreksi "mutlak tidak-pergi". Poin Anda layak dipertimbangkan. Sampai sekarang saya bisa menggunakan dan memperkirakan setiap programmer, tetapi satu kasus psikis dan satu "pembohong".
Joop Eggen
@JoopEggen: Saya cukup yakin "paranormal" bukan kata yang Anda cari. Kalau tidak, mereka seharusnya bisa membaca pikiran Anda ...;)
NotMe
2

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?

Christopher Martin
sumber