Jeff blogunda eleman alımlarında karşılaşılan yakınmalara yer vermişti. Epeydir yazacaktım bunun hakkında fakat fırsatım olmamıştı.

Yazılım Mühendisi veya programcı olarak iş görüşmelerine gittiyseniz eminim bazı testlerden geçmişsinizdir. Bu testlerde garip şekil testleri (Logo bana yapmıştı) ve bazen de bir program yazmanız istenebilir.

Jeff'in anlattığına göre FizzBuzz testi ile progam yazabilen ve yazamayan kişileri %90 ayırt etmek mümkün. Üstelik bu test çok kolay gibi görünse de bazı kıdemli programcıların bile 10 15 dakika gibi bir zamanda çözdüklerini unutmayın.

Nedir bu test? İşte aşağıda veriyorum:

1'den 100'e kadar sayıları ekrana yazacak bir program yaz. Fakat 3'ün katları için "Fizz", 5'in katları için "Buzz" ve 3'e ve 5'e tam bölünen sayılar için de "FizzBuzz" yaz.

Çok kolay bir test evet. Ama gelin görün ki çözebilenlerin sayısı az. Kalifiye eleman bulmanın zorluğu her zaman var ama sektörün bu şekilde şişirilmesine çok feci üzüldüm. Yani bir iş ilanına 200 kişi başvuruyorsa ve 199'u bu testi yapmakta zorlanıyorsa çok yazık.

Tabii öte yandan olayın diğer yüzü baskı altında bu testi yapabilmek ve yukarıdaki gereksinim analizinden yapılacak işi tam olarak anlayabilmek önemli. Çoğu programcı okumayı bilmez (tamam gaza gelme hemen sen onlardan değilsin ) yani gereksinim dökümanlarını okur ama müşterinin ne istediğini pek düşünmez. Müşteri gibi düşünebilmek ve yapabileceği yanlışları dahi düşünebilmek te başka bir hüner.

Birde teknolojik yetersizlikler var. Analizlerde ortaya çıkan ürünü program olarak yazmaya başlayınca işler gene değişiyor. Aradaki farklar size hata ve istek olarak geri dönüyor ki hiçte iyi bir şey değil.

Şimdi cevaplarınızı bekliyorum. Hangi dil ile ve hangi platform içinyazdığınızı belirtmeyi unutmayın.

Reklamlar


Bu girdiye atılan yorumlar:

# re: FizzBuzz testi

for (int=1;i<101;i++)
{
if (i %15 == 0)
Console.WriteLine("FizzBuzz");
else if (i %5 == 0)
Console.WriteLine("Buzz");
else if (i%3 == 0)
Console.Writeline("Fizz");
}
=====
hicbir unit test yapilmadigi gibi derleyici uzerinde de test etmedim :) oturup yazdim; hatalardan; kodun kullanildiginda bilgisayariniza verecek zararlardan sorumluluk kabul etmem (disclaimer adami volkan )
ama kodu derlemesemde soyle bir bakinca su mantik hatasini goruyorum
1-100 arasinda 3 e bolunen sayisi coktur; bu durumda bircok defa 3 tane if conditionina dusecek kodumuz ki optimizasyon icin cok iyi degildir
oysaki cok kez true beklenen kosulu bir sekilde yukari tasirsak kodu hizlandirabilirz degil mi :P

volkan uzun tarafından  3/23/2007 5:51 PM tarihinde atılmıştır.
# re: FizzBuzz testi

demin gonderdigim kodu bu sefer derleyice koyunca gordum ki, if (x%3) ve if (x%5) yapmak yeterli ama ... :)
evet bir amayi koyup bir sekilde ilk gonderdigim koda credit almam lazim degil mi hehe ( rep pesinde kosan programci )
hem 3 hem 5 e bolunen testini yaparsak 100 kere 2 tane if inceliyoruz yani 200 tane if clause calisiyor ( if ler hatirladigim kadariyla pahali clauselardir cpu acisindan )
peki 15 e bolunme testi, sonra 3 e bolunme testi sonra 5 bolunme testi yaparsak nolur :

ilk if (x%15) clauseuna 100 kere hit aliyoruz bunlarin da sadece 6 tanesini true kosulunu isliyoruz
if (x%3) clauseuna 100%3 ~ 34 kere hit aliyoruz ama 6 tanesi yukarida ele alindigi icin 34-6 kere = 28 kere hit aliyoruz ve true kosulunu isliyoruz
if (x%5) clauseinu yaklasik 20 kere hit aliyoruz ama 6 tanesi yukarida ele aliniyor, yani 14 hit aliyoruz
toplam 200 if clause yerine : 100 + 28 + 6 = 134 hit aliyoruz.
yani 66 kere daha az if yaptik :P
sabah sabah sacmalamadim mi nedir :)



volkan uzun tarafından  3/23/2007 6:02 PM tarihinde atılmıştır.
# re: FizzBuzz testi

asp.net, C#, vs2005
ayrı ayrı, uzun uzun ama görsel güzel anlaşılır:)

//6'dan başlattım çünkü 3 istemiyor 3'ün katları diyor.3 ve 3'ün katları deseydi 1'dn başlatıcaktım

int fizz;
for (fizz = 6; fizz < 101; fizz++)
{
if (fizz % 3 == 0)
Response.Write("Fizz: " + fizz + "<br />");
}

//bunu da 6'dan başlatmak istedim :) burda da 5 istemiyor 5'in katları diyor

int buzz;
for (buzz = 6; buzz < 101; buzz++)
{
if (buzz % 5 == 0)
Response.Write("Buzz: " + buzz + "<br />");
}

//bu da böyle

int fizzbuzz;
for (fizzbuzz = 1; fizzbuzz < 101; fizzbuzz++)
{
if (fizzbuzz % 15 == 0)
Response.Write("FizzBuzz: " + fizzbuzz + "<br />");
}

Adil tarafından  3/24/2007 5:16 PM tarihinde atılmıştır.
# re: FizzBuzz testi

Adil helal olsun! Gereksinim analizini aynen yorumlamışsın. Bende bunu Türkçe'ye çevirdikten sonra farkettim ama kalsın dedim bakalım kim anlayacak.

Volkan yorumların süper. Daha şimdiden performansı düşünmen iyiye işaret. Bende günde 10 tane if veya döngü yazıyorum ama aslında o döngülere ve iflere kaç kere girilecek ve nasıl refactoring yapılabilir hiç araştırmadım (zamansızlık). İşyerinde bir gireyim ben bu olaya.

Gürkan Yeniçeri tarafından  3/26/2007 1:24 PM tarihinde atılmıştır.
# re: FizzBuzz testi

ama hem adilin hem benim yanlis yaptigimiz nokta sanirim diger sayilari yazdirmamak, soruda 1 den 100 e kadar sayilari ekrana yazin diyor :) di mi

volkan uzun tarafından  3/26/2007 4:54 PM tarihinde atılmıştır.
# re: FizzBuzz testi

Selam,
Volkan, "if (x%3) ve if (x%5) yapmak yeterli" demişsiniz ama o zaman FizzBuzz yazdırmanız mümkün olmaz.

Adil, 1'den 100'e kadar sayıları yazdırıp belli sayıların yerine kelimeler yazdıracaktık ama bu örnek sadece değişecek olanları tesbit edip kelime yazdırıyor.
Biyerden muhabbete gireyim dedim ama testçi mi olsam ben de :)

Barış tarafından  3/27/2007 10:07 AM tarihinde atılmıştır.
# re: FizzBuzz testi

Baris soyle bisi yapabilirdik mesela
if (x%3==0)
Console.WriteLine("Fizz");
if(x%5==0)
Console.Writeline("Buzz");

15 iki if dede true olacacagi izin fizzbuzz yaziyor.

volkan uzun tarafından  3/27/2007 5:32 PM tarihinde atılmıştır.
# re: FizzBuzz testi

Farklı bir dilde, Python'daki çözüm şöyle olurdu. Python'un çalıştığı her platformda çalışması gerekli. ( Kod bloklarını sanırım blog yazılımı bozuyor :( )

for i in range(1, 101):
mod_3 = i % 3
mod_5 = i % 5
if (mod_3 == 0) and (mod_5 == 0):
print "FizzBuzz"
elif mod_3 == 0:
print "Fizz"
elif mod_5 == 0:
print "Buzz"
else:
print i

Furkan Duman tarafından  4/3/2007 10:18 AM tarihinde atılmıştır.
# re: FizzBuzz testi

bugun nette gezerken, c++(aslinda c++ ve c birlikte kullanilmis ) ile yazilmis, hic if clause kullanilmamis versiyonunu buldum :)
--------------------------------------
#include <stdio.h>
static const char *t[] = {"%d", "Fizz\n", "Buzz\n", "FizzBuzz\n"};
int main()
{
unsigned int i;
for(i = 1; i <= 100; i++) printf(t[3&19142723>>2*i%30], i);
return 0;
}
http://www.rfc1149.net/blog/2007/01/26/fizzbuzz-and-bored-programmers/

volkan uzun tarafından  4/14/2007 1:49 AM tarihinde atılmıştır.
# re: FizzBuzz testi

C/C++ ile yorumları okumadan spontan yazılmıştır
#include<stdio.h>
int main(){
int x; float mod1,mod2;
for (x=1;x<=100;x++){
mod1=x%3; mod2=x%5;
if(mod1 == 0.0 && mod2 == 0.0)
printf("fizz buzz\n");
else if (mod1 == 0.0)
printf("fizz\n");
else if (mod2 == 0.0)
printf("buzz\n");
else
printf("%d\n",x);
}
}

yagi tarafından  6/18/2007 1:35 AM tarihinde atılmıştır.
# re: FizzBuzz testi

6 dan başlatmak bence yanlış. Bu mantıkla düşünürsek bi kere zaten 3 ten başlatmak lazım.
Çünkü 3 rakamı da 3 ün bi katıdır. (Hemen çarpım tablosu nu düşünelim :))
Ancak bence doğru olan sayacı 1 den başlatmak.
Çünkü dikkatli okunursa 1 den 100 e kadar rakamların hepsini istiyor. Onun içinn bence çözüm :

For i=1 to 100
flag1=0
flag2=0
If i mod 3 =0 then
Print ("Fizz")
flag1=1
End if

If i mod 5 =0 then
Print ("Buzz")
flag2=1
End if

If flag1=1 and flag2=1 then
Print ("FızzBuzz")
End If

If flag1=0 and flag2=0 then
Print (i)
End If
Next

khaplan tarafından  6/29/2007 4:10 PM tarihinde atılmıştır.
# re: FizzBuzz testi

c# ile windows uygulaması olarak geliştirilmiştir. Formda dgvNumbers isminde DataGridView nesnesi bulunmaktadır. Buton click'inde veya form_load'da çalışabilir. 6 gibi bir sayıdan başlamak isteklere göre yanlış. 1'den 100'e kadar sayıları ekrana yaz diyor. Yanına da uygun düşen açıklamayı yaz diyor benim anladığım. Ayrıca if yapısında önce 15'i kontrol etmek lazım. diğer sayılar yazılırsa yanlış çalışır. Örneğin 30 sayısında önce 3 veya 5 kontrol edilirse true olur ve fizzbuzz yazılacağına yalnızca kontrol edilen değer yazılır. Çok uzattım, özür, işte kod:
(Derlenmiş ve gözle test edilmiştir.)

private void btnStart_Click(object sender, EventArgs e)
{
int fizz = 3;
int buzz = 5;

DataTable dt = new DataTable("Numbers");
dt.Columns.Add("Number", typeof(int));
dt.Columns.Add("FizzBuzz", typeof(string));

for (int i = 1; i <= 100; i++)
{
DataRow row = dt.NewRow();
row["Number"] = i;

if ( (i % (fizz * buzz)) == 0)
{
row["fizzbuzz"] = "fizzbuzz";
}
else if ((i % fizz) == 0)
{
row["fizzbuzz"] = "fizz";
}
else if ((i % buzz)==0)
{
row["fizzbuzz"] = "buzz";
}
else
{
row["fizzbuzz"] = "N/A";
}

dt.Rows.Add(row);
}

this.dgvNumbers.DataSource = dt.DefaultView;
}

Hüseyin SARIOĞLU tarafından  8/1/2007 10:37 AM tarihinde atılmıştır.
# re: FizzBuzz testi

biraz geç olabilir ama yeni okudum napıyım:)
Bence sayılar 6 dan başlamamalı çünkü 3 ve 5 de 3 ve 5 in zaten 1 katıdır ve kendilerine tam olarak bölünürler. bu da c' de yazdığım windows platformunda çalışan kod
int main()
{
int i;
for (i=1;i<=100;i++){

if((i%3==0 )&& (i%5==0)){printf("fizzbuzz\n");}
else{
if(i%3==0){printf("fizz\n");}
else if(i%5==0){printf("buzz\n");}
else printf("%d\n",i);
}
}
system("PAUSE");
}

Murat EKİCİ tarafından  3/18/2008 11:50 AM tarihinde atılmıştır.

Yorumunuzu buradan giriniz

Yorumlar onaylandıktan sonra yayınlanacaktır

*


*


 (Görüntülenmeyecek)


 (İsminizde link olarak görüntülenecek)

*
Bold Italic Underline Blockquote Hyperlink Hyperlink

 

Please add 7 and 6 and type the answer here:

Yorum Önizleme:

 

Arama



Hakkımda

Merhaba, ben Gürkan Yeniçeri. 9 yılı aşkın süredir özel sektör ve hükümet iştiraklerinde yazılım mühendisliği yapıyorum. Bu sitede 2005 Mart ayından beri genelde yazılım mühendisliği ve Microsoft teknolojileri hakkında yazmaktayım. Profesyonel iş geçmişim hakkında daha fazla bilgiyi aşağıdaki Çember.net linkinden alabilirsiniz.
Çember.net
Faturaları ödeyen günlük işim dışında Açık Kaynak Subtext Projesine katkıda bulunuyorum. Bu blogun alt yapısıda Subtext ile hazırlanmıştır. Ayrıca 1999 yılından beri Programlama.com sitesinde VB6 editörlüğü yapıyorum. Fakat takdir edersinizki VB6 artık ölü bir dil, bu nedenle beta sürümlerinden beri C# ve ASP.NET programcılığı ile uğraşıyorum.

kontak

Soru sormak veya öneride bulunmak isterseniz buradaki kontak formunu kullanın. Mesajlarınıza en kısa zaman içinde cevap vermeye çalışacağım. Ayrıca Windows Live Messenger kullanarak gyeniceri {AT} hotmail {DOT} com adresinden bana ulaşabilirsiniz.
Eğer İngilizce blogumu okumak isterseniz buraya buyrun.
Blogumu RSS Bandit gibi bir RSS okuyucusu ile de takip etmek için kullanın.
RSS 2.0

Reklamlar


imleme

Yumilerime ekle   Reddit Türkçe'ye ekle   Limkle   Bag-kur

Vezir

Vezir Proje Danışmanı
Sitede birde Vezir isminde wikimiz var. Bu wikiyi yazmayı düşündüğüm bir kitap için oluşturmuştum daha sonra herkese açmaya karar verdim. Vezir yazılım firması kurmak isteyenlere tavsiyeler vermek için hazırlandı. Ayrıca UML ve Modül Tabanlı Geliştirme hakkında da bilgiler mevcut. Vakit buldukça yeni eklemeler yapıyorum. Değişikliklerden haberdar olmak için RSS çıktısına üye olabilirsiniz.
www.flickr.com
This is a Flickr badge showing public photos from gurkanyeniceri. Make your own badge here.
Bu blogda 246 yazı ve 313 yorum var. Diğer sitelerden 7 adet link gelmiş.

Buradayım

my blogmap

Reklamlar