Efektivitas FizzBuzz and Beyond [ditutup]

38

Sebagai bagian dari proses wawancara, kami awalnya meminta kandidat untuk melakukan 'FizzBuzz' saat ini persentase kandidat yang dapat menjawab FizzBuzz dengan benar telah meningkat secara dramatis - ini mungkin disebabkan oleh popularitasnya di web.

Sekitar setahun yang lalu, sebagai pertanyaan kedua kami mulai mengajukan pertanyaan yang sangat mirip dengan FizzBuzz asli. Pertanyaannya dirancang sesederhana FizzBuzz asli, dan juga menilai kemampuan tertentu dari kandidat, khususnya kemampuan untuk memesan dan memprioritaskan secara bermakna dan logis serangkaian "aturan bisnis" yang telah disediakan di beberapa pesanan sewenang-wenang. Kata-kata dari pertanyaan pada awalnya tampak sedikit ambigu, yang mungkin menyulitkan penutur bahasa Inggris non-asli, tetapi jika dipikirkan dapat diselesaikan dengan benar - Juga memberikan kandidat kesempatan untuk mengajukan pertanyaan untuk klarifikasi, yang selalu merupakan hal yang baik .

Kami menemukan ini keterampilan yang sangat penting untuk dimiliki sebagai pengembang, karena pengembangan perangkat lunak biasanya didasarkan pada persyaratan fungsional yang diturunkan tanpa urutan tertentu dari waktu ke waktu, yang dapat menempatkan kendala dan kondisi pada area lain dari perangkat lunak tanpa menunjukkan secara eksplisit dan itu adalah pekerjaan pengembang yang cerdik untuk paling tidak menyelidiki potensi masalah dan konflik terkait dengan implementasi.

Apa yang kami temukan adalah bahwa sedikit di atas 65% dari kandidat (ukuran sampel 38) yang lulus FizzBuzz sepenuhnya gagal FizzBuzz v2.0 Biasanya para kandidat ini akan terdeteksi kemudian dalam proses, tetapi tampaknya cara yang bagus untuk mendeteksi mereka sejak dini.

Pertanyaan saya bukan tentang apakah FizzBuzz sudah kedaluwarsa, tetapi faktor-faktor apa yang dapat berkontribusi terhadap begitu banyaknya kandidat yang gagal dalam pertanyaan FizzBuzz v2.

  • Apakah pertanyaannya terlalu mendua?
  • Apakah tekanan lingkungan wawancara menurunkan kemampuan seseorang untuk berpikir kritis sampai tidak mampu menyelesaikan tugas sepele seperti itu?

Pertanyaan:

Tulis rutin dalam bahasa pemrograman favorit Anda yang akan mengambil daftar string sebagai input, dan untuk setiap string dalam daftar akan melakukan salah satu dari yang berikut:

  1. Hanya cetak Fizz jika string berisi huruf A
  2. Cetak hanya Buzz jika string berisi huruf B
  3. Cetak hanya BuzzBuzz jika string berisi A dan B
  4. Hanya cetak FizzFizz jika string tidak mengandung A dan B
  5. Cetak hanya FizzBuzz jika string hanya berisi satu A dan hanya satu B

Beberapa pertanyaan umum yang diajukan oleh kandidat adalah:

  • Haruskah peka terhadap huruf besar-kecil?
  • Apakah "mengandung A dan B" berarti A harus datang sebelum B
  • Apa yang harus dicetak jika tidak ada poin yang terpenuhi?
  • Apa yang harus terjadi jika lebih dari satu syarat dapat dipenuhi?

Kami menemukan bahwa sebagian besar kandidat yang berhasil menyelesaikan pertanyaan, tidak bertanya apa-apa, mereka hanya melakukannya seperti yang mereka lakukan pada FizzBuzz.

Gradeinar Pfeffernüsse
sumber
26
Tinggalkan pertanyaan yang sedikit ambigu. Dengan begitu Anda dapat melihat prospek mana yang memiliki keberanian yang cukup untuk meminta klarifikasi (yang dengan sendirinya merupakan kunci pengembangan).
Thomas Eding
17
Jawaban yang benar adalah bagi calon pengembang untuk memberitahu BA untuk 'memperbaiki persyaratan mengerikan ini'.
Kirk Broadhurst
7
Menyesuaikan FizzBuzz adalah ide bagus untuk menyaring kandidat yang mencari solusi Google. Bahkan tidak perlu membuatnya lebih sulit. Sebenarnya, saya ragu bahwa FizzBuzz yang asli seharusnya digunakan secara verbal oleh semua perusahaan di planet ini. Itu hanya kemalasan pada bagian perusahaan untuk tidak menyesuaikannya. Mereka sudah menyadari masalah ini (kandidat pemrograman dengan keterampilan pemrograman nol), namun gagal untuk mengimplementasikan tes yang kandidat tersebut - dengan keterampilan google yang baik - tidak bisa lulus? WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse Bagaimana para kandidat yang tidak mengajukan pertanyaan dapat menyelesaikan tes ini dengan sukses? Tidak mungkin karena persyaratannya kontradiktif; tanpa klarifikasi latihan ini tidak bisa dilakukan!
Andres F.
6
@MSalters Anda tidak dapat menganggap lex specialis adalah apa yang diinginkan oleh penulis dari persyaratan, karena itu bukan asumsi yang masuk akal di dunia nyata. Oleh karena itu latihan ini tidak dapat diselesaikan tanpa mengajukan pertanyaan tentang kontradiksi yang tampak. Seseorang menyelesaikan tes tanpa mengajukan pertanyaan hanya salah.
Andres F.

Jawaban:

31

Ini memiliki potensi untuk menjadi tes yang jauh lebih baik daripada FIZZBUZZ, tetapi jika Anda memiliki konsep jawaban yang benar, ini adalah tes terburuk di dunia. Tes-tes ini memiliki nilai yang sangat sedikit dalam wawancara untuk memulai.

Jika seorang kandidat menjawabnya dengan "Benar" tanpa mengajukan pertanyaan, maka Anda memiliki masalah bahwa pemilihan kandidat akan memilih jenis programmer yang salah - Ia tidak dapat mengidentifikasi persyaratan yang ambigu, atau tidak dapat memahami bahwa kebanyakan orang tidak dapat menulis persyaratan yang tidak ambigu. . Tidak masalah jika programnya sempurna secara teknis di setiap aspek, kemungkinan dia tipe orang yang akan memberikan perangkat lunak dengan "Saya tidak peduli itu bukan apa yang Anda inginkan, itulah yang Anda minta".

Bagian dari tes di sini adalah urutan prioritas aturan. Anda tidak menentukannya. Input "ABC" dapat mencetak Fizz, Buzz, BuzzBuzz atau FizzBuzz - salah satunya benar

Kandidat yang akan saya ambil adalah orang yang menjawab (sebagian besar) benar, tetapi mengajukan banyak pertanyaan dan, idealnya, melakukan banyak "mengelak" di papan tulis.

Sebagai contoh, saya akan mengeksplorasi pemahaman saya tentang persyaratan tersebut dengan memberikan Anda serangkaian sampel teks, dan menanyakan kepada Anda apa yang Anda harapkan akan dicetak, dan mengapa. - Diskusi tentang input contoh "ABC" saya harus mengarah pada beberapa insites yang berguna bagi Anda.

Sama seperti FIZZBUZZ, hasil tes ini hanya sebaik pengamatan Anda tentang bagaimana hasil itu diperoleh - hasilnya tidak relevan.

Saya akan men-tweak sedikit - hanya untuk membuatnya lebih menarik - mengambil yang 'hanya'. Itu tercakup dalam baris di atas ("cetak salah satu dari yang berikut"), dan lihat berapa banyak orang yang menanyakannya. Jika kandidat melewatkan "hanya" dan Anda punya waktu, tunjukkan dan lihat apa yang terjadi. Jika dia berurusan dengan "hanya", hapus dari persyaratan dan minta mereka untuk mengubah kode.

mattnz
sumber
16
Kedengarannya bagi saya seolah-olah OP mencoba melakukan terlalu banyak dengan tes ini. FizzBuzz dimaksudkan sebagai tes cepat untuk menunjukkan kandidat dapat menulis setidaknya sesuatu dalam kode. Ini sepertinya mencoba melakukan itu dan juga mencoba melihat bagaimana proses desain kandidat dengan persyaratan yang ambigu.
jk.
6
+1 untuk "Tes ini memiliki nilai yang sangat sedikit dalam wawancara untuk memulai." Dan jika saya bisa, saya akan memberi +1 lagi untuk "Tidak masalah jika program secara teknis sempurna dalam setiap aspek, kemungkinan dia adalah tipe orang yang akan memberikan perangkat lunak dengan" Saya tidak peduli itu bukan apa yang Anda ingin, itulah yang Anda minta "."
Shivan Dragon
7
Kalian semua yang menganggap tes ini tidak berguna mencoba melakukan terlalu banyak dengan mereka ... FizzBuzz dan rekan-rekannya hanya ada untuk satu tujuan: untuk menyingkirkan 90% pelamar yang tidak tahu cara memprogram sama sekali .
Robert Harvey
@RobertHarvey: Kecuali bahwa ada orang yang dapat memprogram tetapi pada satu titik akan mengalami kesulitan dengan FizzBuzz karena berbagai alasan. (Saya menjadi salah satu dari mereka).
James P. Wright
3
@ JamesP.Wright negatif palsu adalah masalah bagi orang yang diwawancarai bukan pewawancara. Selama jumlah positif palsu cukup rendah, tes seperti FizzBuzz dapat bermanfaat bagi pewawancara.
jk.
27

Kata "hanya" dalam persyaratan Anda menciptakan kontradiksi dalam semua pertanyaan.

Dengan demikian, pertanyaan Anda menguji persyaratan saat berkumpul di bawah tekanan, apakah Anda yakin ingin menguji kombinasi keterampilan itu?

Jika Anda ingin menguji pengumpulan persyaratan, saya sarankan membuat SALAH satu pertanyaan yang mendua. Jika Anda ingin pengganti FizzBuzz, hapus ambiguitasnya.

Memprioritaskan aturan bisnis hanya dapat dilakukan dengan pengetahuan khusus domain - kecuali jika Anda memasukkan beberapa konteks sederhana untuk apa yang Anda lakukan (mungkin itu adalah kupon yang harus ditebus dengan berbagai nilai), tidak ada dasar bagi pengembang untuk membuat keputusan sendiri.

Tetapi meminta seseorang untuk meminta klarifikasi di mana melakukan hal itu memiliki risiko signifikan terhadap hasil yang tidak diinginkan, mungkin bukan cara terbaik untuk mengukur keterampilan mereka dalam mengenali batasan pengetahuan mereka. Mereka mungkin berpikir bahwa lebih aman untuk menebak dan salah, daripada menunjukkan bahwa Anda tidak kompeten dalam persyaratan menulis, atau jika tidak ada pewawancara yang pengembang, diberi label memiliki sikap buruk.

jmoreno
sumber
6
Apakah Anda benar-benar ingin mempekerjakan seseorang yang tidak mengklarifikasi persyaratan yang tidak jelas karena ia takut mengganggu seseorang dengan mengajukan pertanyaan?
Hans-Peter Störr
2
@ hstoerr, mungkin tidak, tetapi wawancara adalah situasi yang cukup ditekan.
A. Gilfrin
3
@ hstoerr: masalahnya adalah, tidak ada jawaban yang benar, tetapi pasti ada jawaban yang salah - apa pun yang tidak disukai pewawancara. Anda ingin orang yang diwawancarai mengajukan pertanyaan, orang lain mungkin ingin mereka melakukan penilaian, dan yang lain mungkin tidak melihat ambiguitas sama sekali dan melihat mengajukan pertanyaan sebagai ketidakmampuan untuk memahami instruksi sederhana. Anggap saja dari POV seseorang yang telah diberi tahu bahwa jawabannya adalah jawaban yang diberikan oleh "mayoritas luas" yang belum mengajukan pertanyaan namun menjawabnya dengan cara yang sama. Anda kemudian memiliki orang yang mendapatkannya, orang yang mendapatkannya dengan bantuan dan orang yang tidak mendapatkannya.
jmoreno
16

Kami menemukan bahwa sebagian besar kandidat yang berhasil menyelesaikan pertanyaan, tidak bertanya apa-apa, mereka hanya melakukannya seperti yang mereka lakukan pada FizzBuzz.

Dengan ambiguitas persyaratan, seseorang tidak dapat menyelesaikan v2.0 dengan benar tanpa mengajukan pertanyaan.

Pieter B
sumber
2
+1 ... sebagaimana adanya, persyaratannya saling bertentangan sehingga setidaknya beberapa jenis tie-break harus ditentukan.
Konrad Rudolph
4
Menariknya, aturan memang memberikan rasa ketertiban (dari kasus generik ke kasus khusus) dan saya hampir secara naluriah memutuskan untuk melakukannya dalam urutan terbalik. Jika saya dalam ujian seperti itu, saya tidak akan merasakan ambiguitas tetapi mengikuti insting saya.
Codism
4
@Codism sayangnya insting Anda sebagai seorang programer bisa menjadi kebalikan dari apa yang diinginkan pengguna.
Stefan
@Stefan: untuk memperpanjang, tidak ada akhir pada klarifikasi. Semua orang berhenti beralasan pada titik tertentu berdasarkan serangkaian faktor seperti pengalaman, akal sehat dan lain-lain. Bahkan jika Anda dapat mengklarifikasi persyaratan untuk saat ini, bagaimana Anda akan menjamin mereka tidak berubah besok? Jadi bagi saya pada persyaratan asli, ya, itu cukup masuk akal dan saya akan menerapkannya dalam lima menit.
Codism
1
@KonradRudolph: kecuali Anda memilih untuk menafsirkan sedikit tentang "salah satu dari yang berikut" yang berarti tidak masalah yang mana. Saat memikirkannya, saya benar-benar dapat melihat itu sebagai jawaban yang dapat diterima. Anda bahkan tidak perlu kode yang lain, itu hanya ujian untuk melihat apakah Anda bisa melakukan salah satu dari mereka. Bagaimanapun, sebenarnya tidak ada kasus bisnis yang dibuat untuk satu solusi di atas yang lain, ini adalah pertanyaan wawancara yang pada akhirnya kurang berguna daripada standar membalikkan pertanyaan string.
jmoreno
4

Jika Anda ingin menghapus ambiguitas, Anda dapat mengubah persyaratan menjadi:

Tulis rutin dalam bahasa pemrograman favorit Anda yang akan mengambil daftar string sebagai input, dan untuk setiap string dalam daftar lakukan hal berikut:

  1. Cetak "Fizz" jika string berisi karakter '$' dan tidak mengandung '?'.
  2. Cetak "Buzz" jika string berisi karakter '?' dan tidak mengandung '$'.
  3. Cetak "FizzBuzz" jika string berisi tepat satu '$' dan tepat satu '?'.
  4. Cetak "BuzzBuzz" jika string berisi tepat satu '$' dan lebih dari satu '?'.
  5. Cetak "BuzzBuzz" jika string berisi persis satu '?' dan lebih dari satu '$'.
  6. Cetak "FizzFizz" jika string tidak mengandung '$' dan tidak mengandung '?'.
Thomas Eding
sumber
3

Apakah pertanyaannya terlalu mendua?

Ya, pertanyaannya terlalu ambigu untuk dijawab tanpa klarifikasi. Namun, aturan tambahan mengatakan bahwa dalam kasus ketika beberapa aturan berlaku, program Anda harus memilih hal yang paling spesifik, harus menghapus ambiguitas.

Apakah tekanan lingkungan wawancara menurunkan kemampuan seseorang untuk berpikir kritis sampai tidak mampu menyelesaikan tugas sepele seperti itu?

Ini lebih merupakan indikasi kandidat "menjejalkan" FizzBuzz: stres atau tidak, program ini sangat sederhana.

Saya pikir FizzBuzz yang dimodifikasi tidak dapat dibandingkan dengan yang asli, karena solusi idealnya berbeda: meskipun rangkaian if-then-elsetetap dapat diterima, saya pikir solusi berbasis tabel lebih tepat untuk masalah ini:

static string[,] FB = new string[3,3] {
    {"FizzFizz", "Buzz", "Buzz"}
,   {"Fizz", "FizzBuzz", "BuzzBuzz"}
,   {"Fizz", "BuzzBuzz", "BuzzBuzz"}
};
static string FizzBuzz(string str) {
    return FB[
        Math.Min(str.Count(c => c == 'a'), 2)
    ,   Math.Min(str.Count(c => c == 'b'), 2)
    ];
}

Ukuran ruang masalah adalah 3x3, tidak 2x2, sehingga peta ke meja jauh lebih mudah daripada FizzBuzz asli. Bahkan, saya menemukan solusi berbasis tabel untuk masalah FizzBuzz asli lebih sulit untuk dipahami.

private static string[] FB = new[] {"{0}", "Fizz", "Buzz", "BizzBuzz"};
public static void Main() {
    for (var i = 1 ; i <= 100 ; i++) {
        Console.WriteLine(FB[(i%5==0?2:0)+(i%3==0?1:0)], i);
    }
}
dasblinkenlight
sumber
2

Dua hal di sini:

  1. ya saya pikir sebagian besar orang hanya googled buzz fizz dan kemudian tersandung ketika mereka mencoba untuk memperluasnya
  2. Lihat: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Ini menjelaskan dengan baik bagaimana Anda dapat memecahkan buzz mendesis menggunakan abstraksi yang sesuai.
Andreas Secheert
sumber
Kecuali bahwa ia tidak pernah mencapai tingkat abstraksi yang tepat. Dia paling dekat dengan monad, tapi saya pikir itu agak terlalu rumit. Daftar kunci / nilai sederhana, dengan conditional forward pada akhirnya cukup mudah dilakukan di hampir semua bahasa yang lebih kompleks daripada BrainFuck.
jmoreno
2

Kami menemukan bahwa sebagian besar kandidat yang berhasil menyelesaikan pertanyaan, tidak bertanya apa-apa, mereka hanya melakukannya seperti yang mereka lakukan pada FizzBuzz.

Saya telah melihat proses wawancara yang mendorong programmer untuk berpikir keras dan mengajukan pertanyaan untuk melihat proses berpikir mereka. Saya suka proses ini lebih baik.

Saya membaca fizzbuzz v2.0 ini dan saya akan bertanya tentang persyaratan # 3 dan # 5 di sana. Saya tidak tahu tentang orang lain tetapi saya menemukan di bidang teknik saya tidak ingin ambiguitas jadi saya bertanya. Karena kemudian di telepon (berkode dan semuanya), saya tidak ingin mengetahui bahwa saya harus membuat asumsi dan itu salah.

program mitis
sumber
Tentu saja teknik "berpikir keras" hanya berguna jika Anda mencari programmer yang lebih suka "berpikir keras". Itu menghilangkan sebagian besar programmer, dan bisa dibilang hanya menyisakan sebagian besar programmer yang lebih cocok sebagai manajer daripada programmer. Lagi pula, berpikir pada kecepatan "listrik" di otak jauh lebih cepat daripada berpikir pada kecepatan bicara "mekanis".
Dunk
2

Mungkin cara termudah untuk menghindari ambiguitas adalah dengan menunjukkan beberapa contoh:

"A" mengembalikan "Fizz" "aAbA" mengembalikan "Fizz" "B" mengembalikan "Buzz" "aBbB" mengembalikan "Buzz" "AB" mengembalikan "FizzBuzz" "ABaabb" mengembalikan "BuzzBuzz" "" mengembalikan "FizzFizz" "ab "mengembalikan" FizzFizz "

SnoopDougieDoug
sumber
1
Calon yang baik akan mulai dengan beberapa tes dan keluaran yang diharapkan dan kemudian berbicara tentang tes unit, atau hanya menulis ulang persyaratan secara lebih formal dan kurang ambigu. Mereka kemudian akan berbicara tentang pentingnya persyaratan yang jelas dan bagaimana kesalahan persyaratan dapat menjadi urutan besarnya lebih mahal untuk diperbaiki daripada kesalahan implementasi.
John Lyon
2

Alih-alih memberikan kandidat persyaratan yang kontradiktif / tidak jelas, tanyakan kepada mereka bagaimana mereka menangani situasi tersebut. Kalau tidak, Anda membuat diri Anda terlihat tidak kompeten atau lebih buruk menempatkan orang yang kompeten pada balok keseimbangan berbahaya "bagaimana saya mendapatkan jawaban yang saya butuhkan tanpa menyiratkan bahwa pertanyaan wawancara ini atau orang yang bertanya itu bodoh?"

Either way, itu menjengkelkan karena semua jalan keluar. Wawancara adalah proses yang cocok dan maksud saya, jalan 2 arah. Pertanyaan langsung dan kejelasan niat jauh lebih penting daripada menempatkan kandidat di bawah pressure cooker, IMO. FizzBuzz adalah contoh pertanyaan koding yang bagus karena pendek dan manis. Jangan gunakan kembali secara langsung. Tulis pertanyaan sederhana seperti itu yang mengikuti model itu.

Tetapi untuk FFS jangan pandai tentang hal itu dan sembunyikan tes nyata di balik tes lain. Tanyakan kepada orang-orang bagaimana mereka menangani masalah sialan itu. Seorang pengembang yang berpengalaman akan berurusan dengan persyaratan yang ambigu berulang kali dan dengan senang hati akan memberi tahu Anda strategi mereka. Anda bahkan mungkin belajar sesuatu.

Dan jangan menganggap semua orang ingin menggunakan papan tulis atau periode tulisan tangan yang nyaman. Beberapa dari kami telah mengetik sejak kami berusia 12 (dengan banyak terima kasih kepada Space Quest). Aku bahkan tidak bisa berpikir jernih dengan pena atau spidol di tanganku. Ini 20-freaking-13, ada apa dengan papan tulis? Ketika orang-orang memberi saya pena dan kertas dan meminta saya melakukan tes-kode, sulit untuk menahan tawa.

Erik Reppen
sumber
1

Saya pikir ini adalah pertanyaan wawancara yang bagus. Persyaratannya tidak jelas, seperti yang sering terjadi dalam kenyataan. Anda memeriksa apakah kandidat cukup cerdas untuk menyadari hal ini (bahkan di bawah tekanan), bahwa dia tidak takut untuk mengajukan pertanyaan yang mereka anggap perlu, dan mampu menempatkan persyaratan ke dalam struktur yang masuk akal. Dan itu sedikit memberi tahu tentang kemampuan pemrograman mereka, meskipun Anda juga harus mengajukan beberapa masalah yang lebih rumit yang mengandung rekursi dan petunjuk, karena masalah ini terlalu mudah.

Namun, saya sedikit khawatir tentang kandidat "sukses" yang tidak mengajukan pertanyaan. Saya akan mencoba mencari tahu apakah mereka menyadari Anda dapat menerapkan hingga 4 aturan dalam beberapa kasus dan bahwa tidak ada dalam pertanyaan yang akan menyelesaikan ambiguitas itu, dan minta mereka menjelaskan bagaimana mereka mengatasinya. Mungkin pertanyaan Anda tidak cukup rancu untuk memaksa mereka bertanya, atau mungkin Anda harus meminta mereka berpikir keras.

BTW: Saya merasa aneh bahwa Anda berbicara tentang "solusi yang benar". Jika Anda mengucapkan pertanyaan seperti itu, maka sah untuk mencetak "Fizz", "Buzz", "BuzzBuzz" atau "FizzBuzz" jika Anda mendapatkan "AB". Jadi IMHO solusi apa pun tanpa pertanyaan yang diajukan jelas salah.

Hans-Peter Störr
sumber