FizzBuzz ve Ötesi'nin etkinliği [kapalı]


38

Görüşme sürecinin bir parçası olarak, başlangıçta adaylardan bugünlerde 'FizzBuzz' yapmalarını istiyoruz. FizzBuzz'ı doğru şekilde cevaplayabilen adayların yüzdesi çarpıcı bir şekilde arttı - bunun web'deki popülerliği nedeniyle olabilir.

Yaklaşık bir yıl önce, ikinci bir soru olarak orijinal FizzBuzz'a çok benzeyen bir soru sormaya başladık. Bu soru, orijinal FizzBuzz kadar basit olacak ve ayrıca adayın belirli bir yeteneğini, özellikle de bazılarında belirlenmiş olan bir "iş kuralları" sırasını anlamlı ve mantıklı bir şekilde sipariş etme ve önceliklendirme yeteneğini değerlendirmek üzere tasarlandı. keyfi düzen. Sorunun ifadesi başlangıçta biraz belirsiz görünüyor ve bu durum anadili İngilizce olmayan konuşmacıları zorlaştırabilir, ancak eğer doğru bir şekilde çözülebilirse - Aday, her zaman için iyi bir şey olan açıklama için soru sorma fırsatı verir. .

Bunu, geliştiricinin sahip olması gereken çok önemli bir beceri olarak görüyoruz, zira yazılım geliştirme tipik olarak açıkça belirtilmeden yazılımın diğer alanlarına kısıtlamalar ve koşullar getirebilecek, zamanla belirli bir düzende türetilmeyen fonksiyonel gereksinimlere dayanmaktadır ve zeki geliştiricinin işi, en azından uygulama ile ilgili potansiyel sorunları ve çatışmaları araştırmaktır.

Bulduğumuz şey, FizzBuzz'ı geçen adayların% 65'inden birazının (örneklem büyüklüğü 38) FizzBuzz v2.0'yi tamamen geçememesiydi. Normalde bu adaylar süreçte daha sonra tespit edileceklerdi, ancak tespit etmenin güzel bir yol gibi göründüğü onları erken.

Benim sorum, FizzBuzz'ın modası geçmiş olup olmadığı değil, FizzBuzz v2 sorusunu bu kadar çok sayıda adayın katkısına hangi faktörlerin katkısı olabileceği ile ilgili değil.

  • Soru çok mu belirsiz?
  • Görüşme ortamının stresi, bu kadar önemsiz bir işi tamamlayamama noktasına kadar eleştirel düşünme becerisini azaltır mı?

Soru:

Favori programlama dilinize giriş olarak dizelerin bir listesini alacak bir rutin yazın ve listedeki her bir dizge için aşağıdakilerden birini yapın:

  1. Dize A harfi içeriyorsa, yalnızca Fizz yazdır
  2. Dize B harfini içeriyorsa, yalnızca Buzz'ı yazdır
  3. Dize hem A hem de B içeriyorsa yalnızca BuzzBuzz'ı yazdır
  4. Dize hem A hem de B içermiyorsa yalnızca FizzFizz yazdırın
  5. Dize yalnızca A ve yalnızca B içeriyorsa, yalnızca FizzBuzz'ı yazdırın

Adaylar tarafından sorulan bazı tipik sorular:

  • Büyük / küçük harfe duyarlı mı olmalı?
  • "A ve B içeriyor", A'nın B'den önce gelmesi gerektiği anlamına gelir
  • Noktalardan hiçbiri karşılanmazsa ne basılmalıdır?
  • Birden fazla koşul karşılanabiliyorsa ne olmalıdır?

Soruyu başarıyla tamamlayan adayların ezici çoğunluğunun, FizzBuzz gibi yaptıkları hiçbir şey sormadığını gördük.


26
Soruyu biraz belirsiz bırakın. Bu şekilde, hangi beklentilerin açıklığa kavuşturma isteğinde bulunabileceğini göreceksiniz (hangisi gelişim için anahtardır).
Thomas Eding

17
Doğru cevap, potansiyel geliştiricinin BA'ya bu korkunç gereksinimleri düzeltmesini söylemesidir.
Kirk Broadhurst

7
FizzBuzz'ı kişiselleştirmek, çözüme uyacak adayları filtrelemek için iyi bir fikirdir. Daha da zorlaştırmak bile gerekmez. Aslında, orijinal FizzBuzz'ın gezegendeki tüm şirketler tarafından sözlü olarak kullanılması gerektiğinden şüpheliyim. Özelleştirmek değil bir şirketin sadece tembellik . Sorunun farkındalar (sıfır programlama becerisine sahip programlama adayları) ve henüz böyle bir adayın - iyi bir google becerisine sahip - başarılı olamadığı bir testi uygulayamıyorlar mı? O NE LAN?
Viliam Búr

13
@ GradeinarPfeffernüsse Herhangi bir soru sormayan adaylar bu testi başarıyla nasıl tamamladılar? Bu imkansız çünkü şartlar çelişkili; açıklama olmadan bu alıştırma yapılamaz!
Andres F.

6
@ MSalters Lex specialis 'in gereksinimin yazarının istediği şey olduğunu kabul edemezsiniz, çünkü gerçek dünyada makul bir varsayım değildir. Dolayısıyla bu alıştırma, görünen çelişkiler hakkında sorular sormadan tamamlanamaz. Soru sormadan testi tamamlayan biri yanlış anladı.
Andres F.

Yanıtlar:


31

FIZZBUZZ'dan çok daha iyi bir test olma potansiyeline sahip, ancak doğru cevap kavramı varsa, dünyadaki en kötü test. Bu testlerle başlamak üzere yapılan görüşmelerde çok az değer var.

Bir aday bir soru sormadan "Doğru" olarak yanıtlarsa, o zaman aday seçiminin yanlış türden bir programcı seçeceği konusunda bir sorun yaşarsınız - Belirsiz gereksinimleri belirleyemiyor veya çoğu insanın belirsiz şartlar yazamadığını anlayamıyor. . Programın her açıdan teknik olarak mükemmel olup olmaması önemli değil, muhtemelen "İstediğiniz şeyi umursamıyorum, istediğiniz şey bu değil" şeklinde bir yazılım sunacak türden biri.

Buradaki testin bir kısmı kuralların öncelik sırasıdır. Bunu belirtmediniz. "ABC" girişi Fizz, Buzz, BuzzBuzz veya FizzBuzz'ı basabilir - bunlardan herhangi biri doğrudur

Benim alacağım aday (çoğunlukla) doğru olan, ancak birçok soru sordu ve ideal olarak, beyaz tahtada birçok "kaçmak" yaptı.

Örneğin, size bir dizi örnek metin vererek ve ne yazdırılmayı umduğunuzu ve nedenini sorarak bu gereksinimleri anladığımı keşfedeceğim. - "ABC" örnek girişimdeki tartışma, sizin için bazı yararlı alıntılara yol açmalıdır.

Tıpkı FIZZBUZZ gibi, bu testin sonucu da sadece sonucun nasıl elde edildiğine dair yapılan gözlemleriniz kadar iyidir - sonuç önemsizdir.

Ben biraz tweak olurdu - sadece daha ilginç hale getirmek için - 'sadece' çıkar. Yukarıdaki satırda ele alınmıştır ("aşağıdakilerden birini yazdır") ve kaç kişinin bu konuda sorduğunu görün. Aday "sadece" özlüyorsa ve zamanınız varsa, onu işaret ve ne olduğunu görün. "Yalnızca" ile ilgilenirse, gereksinimden kaldırın ve kodu değiştirmelerini isteyin.


16
Bana OP bu testle çok fazla şey yapmaya çalışıyor gibi geliyor. FizzBuzz, adayın en azından kodda bir şeyler yazabileceğini göstermek için hızlı bir test olması amaçlanıyor. Bu, bunu yapmaya çalışıyor ve aynı zamanda adayların belirsiz şartlarla nasıl bir süreç tasarladıklarına bakmaya çalışıyor gibi görünüyor.
jk.

6
+1 "Bu testler ile başlamak için görüşmelerde çok az değere sahip." Ve eğer "Programın teknik açıdan her yönüyle mükemmel olup olmaması önemli değil, muhtemelen yazılımı dağıtacak bir adam" diye umursam. istedim, istediğin şey bu "."
Shivan Dragon

7
Bu testleri işe yaramaz bulmuş olan hepiniz, onlarla çok fazla şey yapmaya çalışıyorsunuz ... FizzBuzz ve meslektaşları tek bir amaç için var: nasıl programlanacağını bilmeyen başvuru sahiplerinin% 90'ını ayıklamak .
Robert Harvey

@RobertHarvey: Programlayabilen insanlar olduğu halde, bir noktada FizzBuzz ile çeşitli nedenlerden dolayı zorluk çekebilirlerdi. (kendim onlardan biri olmak).
James P. Wright,

3
@ JamesP.Wright yanlış negatif görüşmeci için görüşmeci değil bir problemdir. Yanlış pozitiflerin sayısı yeterince düşük olduğu sürece FizzBuzz gibi bir test görüşmeci için faydalı olabilir.
jk.

27

Gereksinimlerinizde "sadece" kelimesi tüm sorularınızda bir çelişki yaratır.

Dolayısıyla sorunuz, baskı altında toplama gereksinimlerini test eder, bu yetenek kombinasyonları için test etmek istediğinizden emin misiniz?

Gereksinim toplanmasını test etmek istiyorsanız, sorulardan BİRİNİ belirsiz hale getirmenizi öneririm. FizzBuzz'ın yerine geçmek istiyorsanız, belirsizliği ortadan kaldırın.

İş kurallarına öncelik vermek yalnızca alana özgü bilgilerle yapılabilir - yaptığınız şey için basit bir bağlam içermezseniz (belki de çeşitli değerler için kullanılacak kuponlar olabilir), geliştiricinin kendi kararını vermesi için bir temel yoktur.

Ancak, birinin istenmeyen bir sonuç alma riskinin önemli olduğu yerlerde açıklık istemesini istemek, belki de bilgi sınırlarını tanıma becerilerini ölçmenin en iyi yolu değildir. Yazma gereksinimlerinde beceriksiz olduğunuzu belirtmek yerine veya görüşmecilerin hiçbiri geliştirici değilse, kötü bir tutum olarak etiketlendiğini belirtmekten daha güvenli olduğunu tahmin etmenin ve yanlış almanın daha güvenli olduğunu görebilirler.


6
Gerçekten soruları netleştirmeyen bir kimseyi işe almak istiyor musunuz, çünkü soru sorarak birilerini rahatsız etmekten korkuyor?
Hans-Peter Störr

2
@hstoerr, belki değil ama bir röportaj oldukça baskı altında bir durumdur.
A. Gilfrin

3
@ hstoerr: sorun şu ki, doğru cevap yok, ama kesinlikle yanlış bir cevap var - görüşmeci neyi sevmiyorsa. Görüşülen kişinin soru sormasını, bir başkasının karar vermesini isteyebilir ve yine bir başkası hiç belirsizlik görmeyebilir ve bir soruyu sormanın basit talimatları anlamadaki yetersizliği olarak görebilir. Cevabı, soru sormayan ancak aynı şekilde cevaplayan “büyük çoğunluk” tarafından verilen cevap olduğu söylenen kişinin POV'su olarak düşünün. Daha sonra, bunu elde eden insanlar var, yardım alan insanlar ve almayan insanlar var.
jmoreno

16

Soruyu başarıyla tamamlayan adayların ezici çoğunluğunun, FizzBuzz gibi yaptıkları hiçbir şey sormadığını gördük.

Gereksinimlerin belirsizliği ile v2.0'ı soru sormadan doğru şekilde bitiremezsiniz.


2
+1… geçerli olduğu gibi, gereksinimler karşılıklı olarak çelişkilidir, bu nedenle en azından bir çeşit beraberlik belirtilmelidir.
Konrad Rudolph

4
İlginç bir şekilde, kurallar (genel davalardan özel davalara kadar) bir düzen duygusu verdi ve ben neredeyse içgüdüsel olarak ters sırada yapmaya karar verdim. Eğer böyle bir teste girersem, belirsizliği hissetmezdim ama içgüdümü takip ederim.
Codism,

4
@Codism, ne yazık ki, bir programcı olarak içgüdüleriniz, kullanıcının istediklerinin tam tersi olabilir.
Stefan

@Stefan: Uzatmaya, açıklığa kavuşturmanın sonu yok. Herkes, bir noktada deneyim, sağduyu vb. Faktörlere dayanarak akıl yürütmeyi durdurur. Şimdilik gereksinimi netleştirebilseniz bile, yarın değişmeyeceklerini nasıl garanti edeceksiniz? Bu yüzden, asıl gereksinime göre, evet, yeterince mantıklı ve beş dakikada uygulayacağım.
Codism

1
@KonradRudolph: "Aşağıdakilerden biri" nin bitini yorumlamayı seçmezseniz, hangisinin önemi olmadığı anlamına gelir. Bunu düşünürken, bunu kabul edilebilir bir cevap olarak görebiliyorum. Diğerlerini de kodlamanıza gerek yok, sadece herhangi birisini yapıp yapamayacağınızı görmek için bir test. Ne de olsa, bir çözüm için diğeri üzerinde yapılacak bir iş vakası yok, sonuçta standart bir dize sorusundan daha az kullanışlı olan bir röportaj sorusu.
jmoreno

4

Herhangi bir belirsizliği ortadan kaldırmak istiyorsanız, gereksinimleri aşağıdaki gibi değiştirebilirsiniz:

Favori programlama dilinize giriş olarak dizelerin bir listesini alacak bir rutin yazın ve listedeki her bir string için aşağıdakileri yapın:

  1. Dize '$' karakterini içeriyorsa ve '?' İçermiyorsa "Fizz" yazdırın.
  2. Dize '?' Karakterini içeriyorsa "Buzz" yazdırın ve '$' içermez.
  3. Dize tam olarak '$' ve tam olarak bir '?' İçeriyorsa "FizzBuzz" ifadesini yazdırın.
  4. Dize tam olarak bir '$' ve birden fazla '?' İçeriyorsa "BuzzBuzz" yazdırın.
  5. Dize tam olarak bir '?' İçeriyorsa "BuzzBuzz" yazdırın ve birden fazla '$'.
  6. Dize '$' içermiyorsa ve '?' İçermiyorsa "FizzFizz" yazdırın.

3

Soru çok mu belirsiz?

Evet, soru açıklama yapılmadan cevaplanamayacak kadar belirsiz. Bununla birlikte, birden fazla kuralın geçerli olduğu durumlarda, programınızın en belirgin şeyi seçmesi, belirsizliği ortadan kaldırması gerektiğini söyleyen ek bir kural.

Görüşme ortamının stresi, bu kadar önemsiz bir işi tamamlayamama noktasına kadar eleştirel düşünme becerisini azaltır mı?

Adayın FizzBuzz'ı "tıka basa geçirdiğinin" bir göstergesi: stres ya da değil, program çok basit.

Bence değiştirilmiş FizzBuzz orijinali ile karşılaştırılabilir değil, çünkü ideal çözümü farklı: bir zincir if-then-elsekabul edilebilir kalsa da , bu problem için masa bazlı bir çözümün daha uygun olduğunu düşünüyorum :

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)
    ];
}

Sorunlu alanın boyutu 3x3değil 2x2, bu nedenle orijinal FizzBuzz'dan çok daha kolay bir şekilde bir masaya eşlenir. Aslında, FizzBuzz sorunun asıl sorununa masa bazlı bir çözüm bulmak daha zor.

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);
    }
}

2

Burada iki şey var:

  1. evet bence çoğu insan fizz buzz'ını googled ve sonra genişletmeye çalıştıklarında yanılıyorlar
  2. Check out: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Uygun soyutlamaları kullanarak fizz buzz'ları nasıl çözebileceğinizi güzel bir şekilde açıklar.

Bunun dışında asla doğru soyutlama seviyesine ulaşamaz. Monadlarla en yakına geliyor, ama bence bu biraz fazla karışık. Basit bir anahtar / değer listesi, sonunda basit bir şartlı koşullu, BrainFuck'tan daha karmaşık olan herhangi bir dilde yapmak için yeterince kolaydır.
jmoreno

2

Soruyu başarıyla tamamlayan adayların ezici çoğunluğunun, FizzBuzz gibi yaptıkları hiçbir şey sormadığını gördük.

Programcıları yüksek sesle düşünmeye teşvik eden ve düşünme süreçlerini görmeleri için sorular soran görüşme süreçleri gördüm. Bu süreci daha çok seviyorum.

Bu fizzbuzz v2.0'ı okudum ve orada # 3 ve # 5 şartı hakkında sordum. Başkalarını tanımıyorum ama mühendislikte herhangi bir belirsizlik istemiyorum bu yüzden soru soruyorum. Çünkü satırın ilerisinde (kodlanmış ve hepsi), bir varsayımda bulunmak zorunda olduğumu bilmek istemiyorum ve bu yanlış oldu.


Elbette "yüksek sesle düşün" tekniği yalnızca "yüksek sesle düşünmeyi" tercih eden programcıları arıyorsanız yararlıdır. Bu, programcıların ezici çoğunluğunu ortadan kaldırır ve tartışmasız yalnızca programcılardan ziyade yönetici olarak daha uygun olan programcıları bırakır. Sonuçta, beyindeki "elektriksel" hızları düşünmek, "mekanik" konuşma hızını düşünmekten çok daha hızlı.
Dunk

2

Belki de belirsizliği önlemenin en kolay yolu bazı örnekler göstermektir:

"A" "Fizz" döndürür "aAbA" "Fizz" döndürür "B" "Buzz" döndürür "aBbB" "Buzz" döndürür "" AB "" FizzBuzz "döndürür" "ABaabb" "" BuzzBuzz "döndürür" "" "" FizzFizz "" döndürür ab "FizzFizz" döndürür


1
İyi bir aday bazı test dizileri ve beklenen çıktılar ile başlayacak ve daha sonra birim testler hakkında konuşacak veya gereklilikleri daha resmi ve daha az belirsiz bir şekilde yeniden yazacaktır. Ardından net gereksinimlerin önemi ve gereklilik hatalarının, uygulama hatalarından daha düzeltmek için nasıl daha büyük siparişler olduğu hakkında konuşacaklardı.
John Lyon,

2

Bir adaya çelişkili / belirsiz şartlar vermek yerine, sadece bu durumları nasıl ele aldıklarını sorun. Aksi halde, yetkin insanları "bu görüşme sorusunun veya onu isteyen kişinin aptalca olduğunu ima etmeden ihtiyacım olan yanıtları nasıl alabilirim?"

Her iki durumda da, tüm sıyrık kadar rahatsız edici. Röportajlar eşleştirme işlemidir ve bununla 2 yönlü bir cadde demek istiyorum. Doğrudan sorular ve niyetin netliği, adayı bir düdüklü tencere IMO'ya koymaktan çok daha önemlidir. FizzBuzz, kodlama sorusuna güzel bir örnektir çünkü kısa ve tatlıdır. Doğrudan yeniden kullanmayın. Bu modeli izleyen basit sorular yazın.

Ancak, FFS akıllıca davranmaz ve gerçek testi başka bir testin arkasına gizler. İnsanlara bu lanet sorunu nasıl çözdüklerini sor. Deneyimli bir dev, tekrar tekrar belirsiz gerekliliklerle başa çıkacak ve size stratejilerini söylemekten mutluluk duyacaktır. Bir şey bile öğrenebilirsin.

Ve herkesin bir beyaz tahta kullanmak istediğini veya el yazısı süresi rahat olduğunu varsaymayın. Bazılarımız 12 yaşından beri yazmaya başladık (Space Quest sayesinde). Elimde bir kalemle veya kalemle bile düz düşünemiyorum. 20 hilkat garibesi 13, yazı tahtalarının nesi var? İnsanlar bana bir kalem ve kağıt teslim edip kod testi yapmamı istediklerinde, gülüşü bastırmak zor.


1

Bence bu güzel bir röportaj sorusu. Gereksinimler çoğu zaman gerçekte olduğu gibi belirsizdir. Adayın bunu fark etmek için yeterince akıllı olup olmadığını (stres altında olsa bile), gerekli gördüğü soruları sormaktan korkmadığını ve gereklilikleri makul bir yapıya sokabildiğini kontrol ediyorsunuz. Programlama yetenekleri hakkında biraz bilgi veriyor, ancak yineleme ve işaretçiler içeren daha karmaşık problemler ortaya çıkarmalısınız, çünkü bu problem çok kolay.

Ancak, soru sormayan "başarılı" adaylar hakkında biraz endişeleniyorum. Bazı durumlarda kuralların 4 tanesine kadar uygulayabileceğinizi fark ettiklerini ve bu belirsizliği giderecek bir şey olmadığını ve bununla nasıl başa çıkacaklarını açıklamalarını isteyip istemediklerini bulmaya çalışırdım. Belki de sorunuz, sormaya zorlayacak kadar belirsiz değildir veya belki de yüksek sesle düşünmelerini istemeniz gerekir.

BTW: "Doğru bir çözüm" hakkında konuşmanızı garip buluyorum. Soruyu böyle söylerseniz, "AB" alırsanız "Fizz", "Buzz", "BuzzBuzz" veya "FizzBuzz" yazdırmak meşrudur. Yani IMHO sorulan hiçbir soruyu çözmeyen bir çözüm kesinlikle yanlıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.