Yazar Arşivi
Evrim karşıtlığı
Bugün Taksim'den metroya girerken gözüme bir sergi ilişti: Fosil sergisi. Kapıda bir görevli var. Geçen herkese "sergimize buyurun, ücretsiz" diyor.
Hayırdır dedim, girdim. Gözüme ilk çarpan şey fosillerin üstündeki açıklayıcı yazıların altındaki bastıra bastıra yazılmış ibare. Fosillerin ışık tuttuğu en önemli maddeler şunlarmış:
- Canlılar (türler) hiç değişmemiş. Fosillerde nasılsa şu anda da öyleymiş.
- Tüm canlılar kusursuzmuş.
İkinci şey de içerde küçük bir seminer olması ve gelenlerin bilgilendirilmesi.
Deniyor ki tüm canlılar böyle küt diye olmuş ve hiç değişmemiş. Yani insanoğlu da hiç mağara adamı falan olmamış, peyderpey günümüz insanı olmamış da, öyle pat diye oluvermiş bir anda. Hatta tüm canlılar insan için öyle pat diye yapılıvermiş.
Görevliler biyolog değil.
Gelen geçen herkes elini kolunu sallayarak yanlarından geçiyor, güvenlik neredeyse sıfır.
Burası İstanbul Taksim Metrosu'nun girişi. Günde yüzbinlerce kişi önünden geçiyor. Belki de bazı günler milyonlarca. Türkiye'deki en yoğun noktalardan biri. Orada bu sergiyi açabilmek için izin almak gerekiyor.
Gösterilen fosiller milyonlarca yıllık. Yanlış duymuyorsunuz, milyonlarca yıllık! Yani, bu organizasyonu yapanlar, milyonlarca yıllık fosilleri bulup bizim iyiliğimiz için ayağımıza kadar getirmişler. Hangi müzeden ne kadar süreli kiralandıklarını falan yazmaya gerek duymamışlar. Kendilerinin kim oldukları, nasıl finanse edildikleri, sergi açma iznini nasıl alabildikleri de pek önemli değil tabii. Bir de üşenmemişler, ne anlama geldiğini de bizim için düşünmüşler ve hap yapmışlar.
Bize düşen de bunu yutmak...
mı?
Hayır!
Sesimizi değil sözümüzü yükseltmek...
Bilimin ve özgür düşüncenin ışığını daha çok kişiye taşımak. Bunu, yorumlarla değil bulguları göstererek yapmak. Bunu yaparken bilimi de kutsallaştırmamak...
Bana kalırsa daha da önemlisi kardeşlerimize, çocuklarımıza, küçüklerimize mantığı, analitik düşünceyi, özgürce sorgulamayı öğretmek. Cevap vermek yerine soru sormanın daha önemli olduğunu göstermek. Bu özellikler kişinin olaylara bakışındaki temel yapıtaşlarını oluşturuyor. Bilim hayattaki onlarca önemli konudan yalnızca biri.
Notlar:
- İlgili bir video için buraya bakabilirsiniz. Kapıda duran, milyonlarca yıllık fosilleri hemen göreceksiniz.
- Burası bir evrim bloğu değil. Bilgisayar bilimleri odaklı bir blog. Genetik algoritmalar gibi konular da bilgisayar bilimlerinin ilgi alanında. Bilgisayarınızı bir evrim laboratuvarına çevirebilirsiniz.
- Evrim 'karşıt'ları her zaman olacaktır. Evrim güçlenmeye devam ettikçe karşıtlarının takipçi konumları daha da yerleşecek.
- Evrim Allah yok demez: İnsanoğlu dahil tüm canlılar böyle pat diye olmadı, yaşamın kanunu evrilmektir der ve bunun açıklamasını yapar. İnançlı bir insan yerçekimi kanununa nasıl bir hayranlıkla bakıyorsa evrime de aynı gözle bakabilir. İnanmak onun kendi tercihidir, başkalarını ilgilendirmez.
- Bir gün evrim de insanlığın nazarında dünyanın yuvarlak olması gibi bir yere gelecek ve şu anki 'karşıt' zihniyet bunun nasıl da mucizevi bir kanun olduğunun, her şeyin bu kurallarla evrildiğinin, bunun önceden müjdelendiğinin tellâlliğini yapacak. Fakat arkada, inanç sömürüsüyle elde ettikleri dağlar yanlarına kâr kalacak.
Zaman ölçer
Büyük büyük verilerde uzun uzun işlemler yapıyoruz. Kodu yazdık, bastık 'run'a. Bekle Allah bekle...
Bir sayaç olaydı da bize geçen süreyi göstereydi, hatta kalan süreyi tahmin edeydi ne de güzel olurdu diye iç geçiriyoruz. Biliyoruz tic/toc var ama daha modüler bir şeyler olsun istiyoruz. Gelin, bugün böyle bir şey yazalım.
Bunun için persistent anahtar sözcüğünü kullanacağız. Hatırlarsanız kalıcı değişkenler yaratmamıza yarıyordu kendisi. Kalıcı olmasını istediğimiz şey ölçümün ilk yapıldığı an.
Yazacağımız zaman ölçme fonksiyonu bir döngünün içinden çağıracağımızı düşünelim. Toplamda n tane iterasyon olsun ve fonksiyonu i. iterasyonda çağıracağımızı varsayalım ve başlayalım:
function [gecenSure, kalanTahminiSure, mesaj] = zaman_olcer(i, n)
persistent zaman
Fonksiyon ilk kez çağrıldığında zaman değişkeni boş olacak, bunu hesaba katarak ilklendirmeyi yapalım:
if(isempty(zaman)) % İlk çağrıldığında t'yi şu anki zamana eşitle
zaman = clock;
end
Geçen süreyi etime fonksiyonu ile ölçmek çok kolay:
gecenSure = etime(clock, zaman); % Geçen süre = şu anki zaman - bir önceki ölçüm
Buraya kadar hava hoştu. Eğer kalan süreyi tahmin etmemiz bekleniyorsa, döngünün neresinde olunduğu bilgisi (i ve n parametreleri) verilmeli:
if nargout > 1 % Birden fazla sonuç isteniyorsa
assert(nargin == 2) % Şu anki döngü numarası ve toplam döngü sayısı verilmeli
kalanTahminiSure = gecenSure / i * (n-i);
if nargout > 2 % mesaj olarak basılacaksa
mesaj = sprintf('Geçen süre: %.1f sn. Tahmini kalan süre: %.1f sec\n', ...
gecenSure, kalanTahminiSure);
end
end
end
Şimdi de test için, her döngüde (aynı dağılımdan gelen rastgele) bir süre harcayan şöyle basit bir betik yazalım:
zaman_olcer(); % ilklendirme
K = 200;
for k = 1:K
pause(rand/10) % Döngüde bir takım işlemler yapılsın ve biraz zaman alsın
[gecenSure, kalanTahminiSure, mesaj] = zaman_olcer(k, K);
fprintf(mesaj)
end
İşimiz bittiğinde fonksiyonu silmeyi aman unutmayalım:
clear zaman_olcer;
Sonuçların her döngüde yeni bir satıra yazılması sizi rahatsız ediyor mu? Beni çok rahatsız ediyor. Gelin tek satırda bu işi çözelim! Sonucu eskisini güncelleyerek göstermeye yarayacak bir 'akıllı çıktı' fonksiyonu yazalım:
function cikti = akilli_cikti(girdi)
persistent silgi
if(isempty(silgi))
silgi = '';
end
cikti = sprintf([silgi, girdi]);
silgi = repmat(sprintf('\b'), 1, length(girdi));
end
Burada silgi dediğimiz değişken girdi'deki karakter sayısı kadar '\b' karakterinin yan yana dizilmesinden oluşuyor. '\b', backslash yerine geçiyor; yani önceki yazılan karakterleri siliyor. repmat ise belli bir girdiyi yatay veya dikey döşeyerek daha büyük değişkenler elde etmeye yarıyor. Bu durumda '\b'leri yan yana döşüyor.
Artık test betiğimizdeki ekrana basma satırını güncelleyebiliriz:
fprintf(akilli_cikti(mesaj))
Harika! Artık yüzlerce satır görmek yerine her döngüde güncellenen tek bir satırda ne olup bittiğinden haberdar olabiliyoruz.
Bu arada unutmayalım: Akıllı çıktıyı sadece zaman ölçmede değil, kaçıncı turu attığımızı görmek gibi binbir türlü küçük ekran raporlamalarında kullanabiliriz.
Stackexchange'de puan arttırmak için birkaç tüyo
Türkçe yazılım geliştirme soru cevap sitesi için birçok destek geldi ve kısa sürede 200 destekçiye ulaştık. Beta aşamasına geçebilmemiz için herhangi bir SX sitesinde 200+ puana sahip en az 100 kullanıcıya ihtiyacımız var. Şu an 44 kişideyiz. Yani özetle, nicelik cepte, şimdi sıra nitelikte.
Arkadaşlarla konuşuyoruz, nasıl puan toplanır diye muhabbet çeviriyoruz. Bir sürü üstad varken ben bu işin muhatabı sayılmam ama yine de birkaç tüyo verebilirim.
Öncelikle SX siteleri arasından gözünüze birini kestirin. Teknik konularda bir sürü site var. Ama dahası da var. Örneğin, gezmeyi çok severseniz Travel'ı seçebilirsiniz, ya da oyun oynamayı seviyorsanız oyun siteleri de olur. Veya aşçılık, dil, her ne isterseniz.
Sonra bu site içindeki ilgi alanınıza giren etiketi "favorite tags" kısmına ekleyin. Siteye girdiğinizde etikete tıklayarak filtrelemeye olanak sağlayacak ve navigasyonu kolaylaştıracaktır. Birkaç etiket de ekleyebilirsiniz.
RSS okuyucunuz ile etiketin sayfasına abone olun. Örneğin ben Google Reader'a adresini girerek MATLAB etiketine üye olmuştum. İsterseniz sadece bunun için bir "RSS notifier" programı indirip yeni gelen soruları ilk okuyan siz olursunuz. Sadece bunun için diyorum çünkü Reader'a her gelen yazı için uyarılmayı istemem. Sizin de isteyeceğinizi sanmıyorum.
İlk cevap veren siz olun. Cevabını bildiğiniz soruya hızlıca cevap verin. Eksikler olabilir, sonradan düzenleme yapabilirsiniz.
Stackoverflow meta sitesindeki şu soruya ve cevaplarına bir bakın: 6 simple tips to get Stack Overflow reputation fast
Başka önerileriniz varsa yorum olarak girmeniz beni çok mutlu eder.
Sadece çekiç yetiştirmek
Eğitim sistemimizde en başarılılar belli mesleklere yöneltiliyor. Bu yıllara göre değişebiliyor. Şimdilerde durum bilgisayar, elektrik-elektronik ve endüstri mühendislikleri ile tıp leyhinde. Bütün üniversitelerde istisnasız bu meslekler en gözde öğrencileri alıyor. Neredeyse sözel veya sanatsal hiçbir meslek bu kadar gözde değil. En üzücü olanı ise idealist öğrencilerin hayallerini süsleyen matematik, fizik, biyoloji gibi bölümlerin sırf bu kadar puan yaptın, yazık olmasın diye gelen mahalle baskısından çektikleri.
Zamanında Almanya'da bilişsel bilimcilerin düzenlediği kod reçeli (code jam) denilen birkaç günlük bir etkinliğe katılmıştım. Aralarındaki bilgisayarla görü alanındaki tek araştırmacı bendim. Hatta bilgisayar mühendisi kökeninden gelen ender katılımcılardandım. Biyoloji veya fizik mezunu birçok katılımcı mevcuttu. Öğle yemeklerinde yazılımla ilgili muhabbet dönerdi. Ağzım açık dinlerdim. Memlekette alışmışım, temel bilimciler C'yi öğrenene kadar mezun olurlar. Oysa burada durum bambaşka; nasıl olur da bu kadar iyi yazılım bilirler! Geliştirdikleri onlarca yazılım kütüphanesi var. Bir eleman vardı, Pragmatic Programmer kitabını ondan öğrendim, kendisi biyolog... Bir de bizim üniversite sayfalarımıza bir göz atın. Kütüphane geliştirmeyi bir yana bırakın, çoğunun web sayfası bile yok.
Boğaziçi'nde Calculus dersi veya herhangi bir kitle dersi alan herkes bilir. Bölümlere göre öğrencileri sıralarsak üniversite giriş puanlarıyla korelasyon cidden de çok yüksek çıkar. Geçende fizikten bir hocam eğitim bölümü öğrencilerinden yakınıyordu. Hazırladığı excel tablosunu gösterdi; fizik giriş dersinden kalan öğrencilerin çoğu eğitim fakültesi öğrencileri. Hatta çiftdikişden bile fazla. İleride fizik öğretmeni olacaklar da azınlık değil! Bölümler bir organizmanın organları gibiler. Bir taraf eksik kalınca diğerleri de bundan nasibini alıyor. Biz matematik bölümünden matematik dersi alırız, başkası bizden programlama öğrenir, birlikte sosyal dersler alırız...
Maalesef ipler en baştan kopuyor. Öğrenciler çeşitli mesleklere yöneltilmek yerine belli meslek gruplarına resmen itiliyor ve bölümler arası uçurum doğuyor. Buna tek yönlü yetiştirilen öğrenciler de eklenince etraf çekiçten geçilmiyor. Sanki şu hayattaki her problem çivi!
Not: Üniversite giriş sınavlarının bir öğrencinin ne kadar iyi olacağının salt göstergesi olduğuna inanmıyorum. Fakat tamamen değersiz olduğunu da düşünmüyorum. Bu sebeple, başarılı tabirini kullandım. Buradaki başarı eğitim sisteminin sunduğu basamaklardaki başarıyı ifade ediyor.
Beyin bu(ğu)lama
Bugün bir dersin proje sunumlarına girdim. Ne kaldı aklında diye sorsalar iki kelimeyle şöyle özetleyebilirim: Beyin bu(ğu)lama.
Beyin bu(ğu)lama şöyle yapılır:
Malzemeler
- Bir adet özenle hazırlanmış powerpoint sunumu. Sunumda olması gerekenler:
- Düzyazı
- Karmaşık denklemler
- Eğlencelik malzeme (gülücük falan)
- Müthiş yüksek başarımlı sonuç tabloları
- Kopyala-yapıştır resimler ve figürler
- Tutarsız notasyon, hatta notasyonsuzluk
Öz hazırlık
Sunum için ışıkları kapanınca uyumaya müsait olabilecek, havasız bir sınıf seçin. Kaloriferi sonuna kadar açın, pencereleri açmayın. Dinleyiciler pembeleşinceye kadar bekleyin.
Yapılışı
Öncelikle bir saattir zaten orada bekleyen dinleyicilere bi welcome çekin.
Perdenin önüne geçin, sırtınızı dinleyicilerinize dönün ve yaptıklarınızı elinizle göstererek anlatın.
Konuları sürekli karıştırın ki dibi tutmasın. Bir ondan bahsedin, bir bundan bahsedin. Dedikleriniz tam anlaşılmasın, well, yea, hmm diye yuvarlayıp geçin.
Figürler gösterin. Dikkat edin, figürlerde eksen adları veya tanımlayıcı bir şey olmasın. Bu figürleri kendiniz üretmekle aman aman hiç uğraşmayın, İnternet ne güne duruyor? Figürler çok önemli, ne demiş Juan Osbourne; bir resim bin kelimeye bedel. Bol bol kopyala yapıştır resim ve figür kullanın. Saydamda boş yer kalmasın.
Denklemler sade olmasın. Formüller havada uçuşsun ki görenler vay be adama bak, amma matematik koymuş haa desinler.
Dile önem verin. Aynı kelimeleri tekrar tekrar söyleyin. Beynin aynı kılcallarına sıkı çalışın. Örneğin her saydam değişmesinde yes diyerek radyo spikerliğinden tv'ye terfi eden Orhan Ayhan misali sayfa değiştirdiğiniz için sunumunuza katılanları bilgilendirin. Soru sorulduğunda güzelce bir cevaplayın. Karşıdaki anlamazsa aynı şeyi tekrar anlatın. Anlamaz da tekrar sorarsa aynı biçimde bir kez daha anlatın. Daha da anlayamıyorsa, yuh, o artık onun sorunudur. Özel muamele yapmanıza gerek yok; süreçte o da bu(ğu)lanacaktır. Geçin.
Sonuçları afilli, janjanlı ve de cafcaflı gösterin. Özellikle yüksek olanları kalın yapın veya farklı renk ile gösterin. Yorumlayın. Ama dikkat edin, yorumu sonuçları göstermeden önce yapmayın. Yani sunumda ilerlerken böyle yapmak mantıklı olacak, motivasyonumuz budur, bu yöntemden şu anlamda daha üstün falan demeyin. Sonuç üstünden dönen tartışmalar her zaman daha çekicidir, bunu asla unutmayın. Yoksa sonuçlanan maçların üstünden 2 saat geçmeden değerli Fanatik okurları yüzlerce yorum bırakmazdı. Sonuçları görünce en ilgisiz kişinin bile bir yorumu olacaktır, bunu göz ardı etmeyin.
Kontrollü deney yapmayın. Öyle bir deneyin, ne çıktıysa artık. Tek bir örnek gösterin. Hele istatistiksel öneme hiç girmeyin. Maazallah, yakarsınız beyni.
Yaptığınız şeylerin gizemli olmasına özellikle dikkat edin. Anlaşılır olmasın. Temel örnekler hazırlamayın, karmaşık figürler yaptığınız işin ne kadar da zor olduğunun göstergesidir. Hatta siz bile anlamayın. Kara kutular açılmadan kalsın.
Sos için
Kısaltmalar bu(ğu)lamaya tat katar. Mutfaktaki tüm kısaltmaları kullanın; FFT, PCA, DTW, DCT, NN, GS, F16, AKM, TDK, 559c... elde ne varsa artık. Kullanımdan önce ne olduğunu tanımlamayın, öyle daha iyi sonuç alırsınız.
Afiyet olsun.
* * *
Not: Bu yazıyı herhangi birini kişisel olarak eleştirmek ya da rencide etmek adına kesinlikle yazmadım. Hatta bugün bu(ğu)lanan beynim yaşadığım tüm eski bu(ğu)lanmaları yeşertti, genele atfen düşündüm. Maalesef hepimiz bu bu(ğu)lanmanın içinde bir şekilde çırpınıyoruz ve araştırma yaptığımızı sanıyoruz. Bu durum yüksek eğitim/öğretim sistemimizde sürekli tekrarlıyor; maalesef kronik bir vaka haline gelmiş gibi görünüyor. Bu(ğu)lanmam gidince bunun sebep ve olası çözüm yolları üstüne kafa yormayı çok istiyorum.
Yazılım kardeşliğine davet
Profesyonel ve hevesli programcılar için önerilen soru/cevap sitesine destek toplamak için hazırlanmış Yazılım Kardeşliği sitesi yayında! Twitter hesabı da burda.
Hatırlayalım: Bir ay kadar önce Stackexchange sitelerinin yeşerdiği Area51 alanında Türkçe Stackoverflow için tohum atılmıştı. Destek için iki kez çağrıda bulunmuştuk (1, 2). Bir sürü destekçi çıktı, duyuruldu ve bir ay gibi kısa sürede %44 gibi müthiş bir orana ulaştık! Oranı %100 yapınca beta aşamasına geçebileceğiz ve sitemiz deneme uçuşlarına başlayacak.
İsterseniz, şu yollarla destek olabilirsiniz:
- Taahhüt ('commitment') aşamasına katılabilirsiniz. (Burada şunu ifade etmek isterim. Şu anda nicelik için gerekli olan 200 kullanıcıyı tamamlamak üzereyiz. Nitelik konusunda ise yeterli değiliz. Herhangi bir Stackexchange sitesinde 200+ puana sahip 44 kullanıcımız var, bu sebeple %44'teyiz. %100'e erişebilmek için 66 tane daha 200+ puanda kullanıcıya ihtiyaç var. Eğer taahhüt aşamasına katıldıysanız ve 200+ puanda değilseniz sorular sorup cevaplar vererek 200+ puana ulaşmanıza ihtiyacımız var. Ya da yeni katılıp bu puanı hedefleyebilirsiniz. Acelemiz yok, peyderpey gidelim, nitelikten ödün vermeyelim.)
- Facebook, Twitter, Friendfeed, vd. sosyal ortamlarda site önerisini veya davet sitesini duyurabilirsiniz.
- Blogunuzda tanıtım yazısı ekleyebilirsiniz.
Yazılım Kardeşliği davet sitesine, Area51 Sıkça Sorular sorular'ın Türkçe çevirisi ve düşündüğüm grafikler dışında elimden geldiğince geniş içerik ekledim. Eksik kısımları da tamamlayınca yeniden duyuracağım.
Türkçe yazılım geliştirme soru/cevap sitesi, Çağrı 2
Birkaç gün önce Türkçe yazılım geliştirme soru/cevap sitesi önerisi için bir çağrıda bulunmuştuk. Tanım ('definition') aşamasında olan site için en az 60 kullanıcıya ve 10'ar puanlı 10 soruya ihtiyaç vardı. Bu aşama sitenin çerçevesini oluşturacak sorular sorma aşamasıydı. Çok kısa bir sürede bu ihtiyacı karşıladık ve birçok örnek sorumuz oldu.
Şimdi ise taahhüt/söz ('commitment') aşamasındayız. Yani, site açılırsa ben en azından 10 soru sorar, 10 da cevap veririm diye söz verme aşaması. Yani yeşermeye çalışan sitenin can suyunu veririm deme aşaması. Zaten yeterli içeriğe erişildiğinde insanların ihtiyaçları için buraya başvuracağını ümit ediyorum.
Şu aşamada yapabileceklerimiz:
- Öneriye katkıda bulunmak için söz vermek: Tüm Stackexchange (SX) ağına aynı kullanıcı adı ile bağlanabilirsiniz. Zaten güncel bir Stackoverflow hesabınız varsa onunla giriş yapıp öneriye 'commitment' seçeneği ile vaatte bulunabilirsiniz.
- Yaygınlaştırmak: Öneriyi ve sitenin ayağa kalkabilmesi için neler yapılabileceğini duyurabilirsiniz.
- Stackexchange'de etkinleşmek: SX'de ilginizi çeken sitelerde sorular sorup cevaplar vererek itibar ('reputation') toplayabilirsiniz.
Eğer yeterli miktarda kullanıcıya ulaşabilirsek site beta aşamasına geçebilecek. Bu kullanıcıların ve ileride yaratılacak olan içeriğin niceliğinden ziyade niteliği önemli diye düşünüyorum. Zaten kullanıcıların yüzdeye katkısı itibar puanına göre değişiyor. Söz aşaması hakkında buradan daha ayrıntılı bilgiye erişebilirsiniz.
Bu aşamayı geçersek daha önemli bir süreçten geçeceğiz: Beta aşaması. Bu aşamada siteye eklenen günlük soru miktarı, cevap miktarı, ziyaretçi trafiği, vb. önemli olacak. Örneğin Sinyal İşleme sitesi gibi yeterli ilgiyi toplayamayan bir site olursak kurumaya yüz tutacağız ve büyük ihtimalle sitemiz hayat bulamadan kapanacak. Zaten olması gereken de bu olacak çünkü ancak yeterli can suyunu alabilen ve ilgi gösterilen siteler ayakta kalabilecek. İlgi yoksa, gerek de olmayacak. Fakat, öte yandan Startup Business (İş Kurma) gibi yeterli ilgiyi görebilen bir site kurabilirsek sağlam bir topluluk ile hayata geçeceğiz. Bu projede noktasal bir hedef yok, önemli olan süreç. Nitelikli, sürdürülebilir bir site oluşturmalıyız.
Eğer hayata geçirebilirsek böyle bir sitenin pratik getirisi konusundaki fikrimi söylemek isterim. Şu anda bilişim dili malumunuz İngilizce ve uzun süre böyle kalacak. Yani iyi bir yazılım geliştirmek isteyen birisi İngilizce bilmeden yapamaz. Fakat öte yandan, diğer tüm diller gibi evrimleşen anadilimizin de bilim ve teknoloji konusunda geri kalmaması, bu anadile sahip her çocuğun hayata 1-0 yenik başlamaması için önemli. Özet maddeler olarak geçersem:
- Bazı durumlarda sorular cevaplardan daha önemlidir. Örneğin bir kelimeyi çevirmeye çalışırken ya da kendi cümlelerimle anlatmaya çalışırken "bu kelime ne demek diye düşünmeden sadece ezberlediğimi" fark ettiğim oluyor. Bunu ise anlatmaya çalışırken fark ediyorum. Özellikle de anadilimde anlatırken.
- Önerilen site dış dünyadan yalıtılmış bir site değil. Dikkat ederseniz SX sitelerine yeni bir kardeş site. Yani büyük bir ağın parçası. Türkçe siteye gelen kişi mutlaka diğer sitelerden de haberdar olacak ve fayda sağlayacaktır. Buradaki içeriği anlamak için yabancı dil bilmenin önemini fark edecektir.
- SX'teki siteler aldıkları trafiğin ötesinde öneme ve referansa sahipler. Örneğin bazı kişilerin tek satırlık özgeçmişleri var: "100k reputation in Stackoverflow"! Yani, bu paylaşım tek yönlü bir paylaşım değil. Ben bir işveren olsam ve örneğin Python kodlayacak çalışan arıyor olsam ve bana Stackoverflow'da Python konusunda 20k itibar puanı toplamış biri gelse, karar vermek için çok da düşünmem.
- Lokalizasyon önemli bir sorun. Türkçe dil desteği konusunda Türkçe konuşmayan bir topluluğun yardımını beklemek pek de mantıklı değil. Bu konuda sorulan sorular cevapsız da kalabiliyor. Böyle bir site bu konuda önemli bir kaynak oluşturacaktır.
- İster şirketlerde olsun ister akademide olsun, yazılım geliştiren biz programcılar birbirimizden maalesef kopuğuz. Böyle bir topluluk oluşturmak bu kopukluğu gidermede önemli.
- Herkes [henüz] İngilizce bilmeyebilir. Örneğin 11 yaşındaki kuzenim bilgisayara çok meraklı fakat şu anki İngilizcesi henüz yeterli değil. Tatilde Scratch kurmuştum öğrenmesi için, bir hayli de ilerlemiş. Daha fazlasını istedi. Belki Python kodlayabilir umuduyla İstihza'yı önerdim. Bu site olmasaydı kuzenime "Sen şimdi [muhteşem eğitim sistemimizde] İngilizce öğren, 20 yaşına gelince Merhaba Dünya! dersin" demek durumunda kalacaktım. Hem bence kuzenim sadece programlamayı değil, önemini kavrayıp İngilizceyi de çok daha şevkle öğrenecek. Fakat ona bu kapıyı aralayan anadilinde üretilmiş nitelikli içerik olacak.
- Yazıda bilişim dili olarak kullandığım dil İngilizce. Fakat yarın bunun böyle olacağını kimse garanti edemez. Yüz yıl önce Fransızca'nın dünya dili olduğunu söylüyorladı. Yüz yıl sonra ikinci yabancı dil olarak Çince konuşuyor ve bilimi Çince ile geliştiriyor bile olabiliriz. Fakat anadil her zaman önemini koruyacaktır. Anadilin geliştirilmesini bilim dilini dışlamak olarak görmek çok yanlıştır.
Türkçe yazılım geliştirme soru/cevap sitesi
Stackexchange'de Türkçe yazılım geliştirme soru/cevap site önerisi mevcut. Eğer gerekli topluluk desteği sağlanırsa site hayata geçebilecek. Şu anda tanımlama (definition) aşamasında olan önerinin bir sonraki aşamaya geçmesi için toplam 60 takipçiye ve 10ar puanlı 10 soruya ihtiyaç var. Ardından taahhüt/söz (commitment) aşamasına geçilecek ve ancak yeterli destek sağlanabilirse beta sürümüyle hayata geçecek.
Yazılım konusunda böyle bir siteye ihtiyaç olduğunu düşünüyorum; umarım gerekli topluluk desteğine erişebiliriz.
Şu anki aşamada yapabileceklerimiz:
- Öneriyi takibe almak: Tüm Stackexchange ağına aynı kullanıcı adı ile bağlanabilirsiniz. Zaten güncel bir Stackoverflow hesabınız varsa onunla giriş yapıp öneriyi takibe alabilirsiniz.
- Soru sormak: İlgi alanlarınızla ilgili yeni sorular ekleyebilirsiniz. Genel sorular olması, oy toplaması açısından şu anki aşamada daha iyi olabilir. Örneğin, ben Stackoverflow'daki meşhur soruların çevirisini ekledim. Her kullanıcının 5 soru sorma hakkı var. Bu aşamada sorular hazırlanacak; cevap vermeye henüz gerek yok, sadece soru soralım.
- Soruları oylamak: Beğendiğiniz soruları oylayabilirsiniz. Toplam 5 oy hakkınız var.
- Yaygınlaştırmak: Öneriyi ve sitenin ayağa kalkabilmesi için neler yapılabileceğini duyurabilirsiniz.
Sonraki aşama için Stackexchange ağında en az 200 puanı olan kullanıcılara ihtiyaç olacak. Eğer kullanıcısı değilseniz olmanızı tavsiye ederim. Yazılımdan yemeğe, bisikletten elektroniğe birçok site var. Mutlaka ilgi alanınıza giren olacaktır. StackOverflow'da 868k kullanıcı, 2.3m soru, 4.9m cevap var!
MATLAB'de neden döngülerden kaçınmalıyız ve ilklendirme yapmalıyız?
Bildiğimiz üzere, MATLAB, yorumlayıcı (interpreter) diller sınıfına ait. Yavaşlığa neden olan bu altyapı yüzünden MATLAB kullanırken döngülerden kaçınmamız tembihlenir. Peki biz bu tembihlere denemeden inanır mıyız? Cevabı aldım, evet, inanmayız!
Bir e-deney (bunu yeni uydurdum, bilgisayarcının deneyi böyle olur) tasarlayalım. Döngü kullanmanın ve ilklendirme yapmanın, yani MATLAB diliyle konuşursak, for kullanmanın ve zeros ile değişken için yer açmanın etkisini merak ediyoruz. Bunun için şu üç farklı yöntemi test edeceğiz:
- Döngülü ve ilklendirmesiz
- Döngülü ve ilklendirmeli
- Vektörleştirme (vectorization)
Deneyleri bir kere yapmaktansa çok kere tekrarlayıp ortalamasını almak bizim gibi titiz e-deneyciye daha çok yakışır. Bunları gözönünde tutarak elemanlar üstünde $y = x^2-4x+3$ polinomunu hesaplayan şöyle bir kod yazalım:
clc, clear
n = 1000000;
x = 1:n;
deneySayisi = 100;
%% Döngülü ve ilklendirmesiz
tic;
t = 0;
for d = 1:deneySayisi
clear y
for i = 1:n
y(i) = x(i)^2 - 4*x(i) + 3;
end
t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))
%% Döngülü fakat ilklendirmeli
tic;
t = 0;
for d = 1:deneySayisi
clear y
y = zeros(size(x));
for i = 1:n
y(i) = x(i)^2 - 4*x(i) + 3;
end
t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))
%% Vektörleştirme kullanımı
tic;
t = 0;
for d = 1:deneySayisi
clear y
y = x.^2 - 4*x + 3;
t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))
Şimdi de sonuçlara bakalım:
Geçen ortalama süre: 13.945716 sn Geçen ortalama süre: 1.209971 sn Geçen ortalama süre: 0.304579 sn
Görüldüğü üzere ilklendirme yapmak, yani döngü kaçınılmazsa zeros ile yer açmak işleri 10 kat kadar hızlandırıyor. Döngüden kaçınmak ise daha iyi bir yol ve ilk yönteme göre 40 kat kadar daha iyi! Örnekteki süre zaten kısa olduğu için fark size önemsiz gelebilir, fakat daha uzun çalışan kodlarda bu gelişme ciddi bir avantaj sağlayacaktır. Koda işlev kazandırdıktan sonra bir es verip kodu toparlamak iyi bir alışkanlıktır.
Not: Son sürümlerde bu konunun geliştirildiğini söylüyorlar, fakat görüldüğü üzere buna dikkat etmekte hâlâ çok fayda var.
Not 2: Polinom hesaplamak yerine sin fonksiyonu ile de denedim, onda da benzer sonuçlar elde ediliyor.
Eleman eleman işlem yapma - 2
Önceki yazıya takviye olan bu yazıda bsxfun fonksiyonuna bakacağız. İlk yazıda bahsi geçen fonksiyonlar tek bir dizilimdeki elemanlar üstünde işlem yapmaya yarıyordu. bsxfun ise iki farklı dizilimde eleman eleman ikili işlem (binary operation) yapıp sonuçları yine bir dizilimde saklamaya yarıyor. Örneğin iki vektörde toplama yapmanın türlü türlü yolu var:
a = [1 2 3];
b = [5 10 15];
a + b
ans =
6 12 18
plus(a,b)
ans =
6 12 18
bsxfun(@plus, a, b)
ans =
6 12 18
Son ifadede kullandığımız bsxfun'a parametre olarak bir fonksiyon tutucu ve iki adet dizilim verdik. Dizilimler şu türlerden birine ait olabilir: numeric, logical, char, struct, cell. Örnekte numeric değerler kullandık. Bu örnek işlevsel bir örnek değildi, sadece konuyu anlamak için verdim.
Şimdi işe yarar bir kullanıma bakalım. Problemimiz özgün veriden ortalanmış veri (centralized data) elde etmek olsun. Daha net ifade edersek, elimizdeki veri matrisinin her sütunundan (her örneklemden) ortalama sütunu çıkaralım. Mesela eldeki veri şöyle olsun:
A = [2.1 3.2 4.8 2.1 4.8 2.7 5.3 3.4 5.8 -1.1 5.8 3.3
1.8 3.7 0.7 -2.7 1.8 3.2 1.8 5.2 3.8 0.6 0.1 4.8];
plot(A(1,:), A(2,:),'.')
grid on
axis([-10 10 -10 10])

Özgün veri ortalanmamış görünüyor. Şimdi bsxfun kullanarak her sütundan ortalamayı çıkaralım ve tekrar çizelim:
A2 = bsxfun(@minus, A, mean(A,2)); plot(A2(1,:), A2(2,:),'.') grid on axis([-10 10 -10 10])

İlk satırda veriyi ortaladık. mean(A,2) ile sütun ortalamasını bulduk. 2xn'lik bir matris ile 2x1'lik bir vektörü ikili işleme koyduğumuzda matrisin her vektörünü eleman eleman bu vektörle işleme koymuş olduk. Görüldüğü üzere veri ortalandı.
Bir adım daha öteye gidelim ve boyutları normalize edelim. Yani standart sapmaya bölelim:
A3 = bsxfun(@rdivide, A2, std(A2, 0, 2)) plot(A3(1,:), A3(2,:),'.') grid on axis([-10 10 -10 10])

İlk satırdaki std(A2, 0, 2) kodu ile her satırdaki standart sapmayı hesapladık. İki satır olduğu için sonuç yine 2x1'lik bir sütun vektörü oldu. Bunu std(A2')' ile de yapmak mümkündü. Ortalanmış veri matrisinin her sütununu standart sapma sütun vektörüne rdivide ile böldük. Bu fonksiyon "./" ile ifade de edilebilen eleman eleman bölmü yapma fonksiyonu. Sonuç itibariyle iki boyut için de ortalama sıfır, standart sapma 1 oldu. Aradaki çizim fonksiyonlarını atarsak, veriyi iki satırda normalize ettik:
A = bsxfun(@minus, A, mean(A,2)); A = bsxfun(@rdivide, A, std(A, 0 ,2));
Not: Eleman eleman işlem yapmayı anlatırken ikili işlemlerden bahsetmeyi unutmuşum, bu yazı M. Gönen'in tavsiyesiyle ortaya çıktı.

