29 Haziran 2014 Pazar

Bilgisayar Mühendisliğine Ne Kadar Hazırsın?

Bilgisayar mühendisleri adayları için hazırladığım yazı. Yazı bilgisayar mühendisliğiyle ilgili teknik olaylara girdiği için biraz karışık olabilir bu yüzden dikkatli okuyun. Anlamadığınız yeri bana sorabilirsiniz. Unutmayın, bu yazı geleceğinizle ilgili önemli bir karar vermenizi sağlayabilir. O yüzden bu yazıyı ciddiye alın.

Not: Yazıda hata bulursanız lütfen beni uyarın.

Dikkat! Bu yazı Bilkent Üniversite Bilgisayar Mühendisliğinde 2.sınıfa henüz geçmiş bir öğrenci tarafından yazılmıştır. Bu yazı bilgisayar mühendisliğinin iş olanakları ve mezuniyetten sonra yaşayacakları vs. üzerine yazılmış bir yazı değildir, öyle olursa piyasadan habersiz bir kimse tarafından yazılmış olur ve dolayısıyla güvenilir bir kaynak olmaz. Bilgisayar mühendisliği tercih edecekler önce bu konu üzerinde düşünsün ve araştırsın. Ben, ne yalan söyleyeyim, bu tip şeyleri çok araştırmadım. Yazılımsız bir hayat düşünülemez, dolayısıyla "Türkiyede bilgisayar mühendisi asla iş bulamaz." gibi dogmatik düşüncelere katılmıyorum, illa birileri iş bulacak ve benim bölümümdekiler de ilk iş bulanlar olacak. Ama belli üniversitelerin alt seviyesindeki üniversitelerden mezun olan kişiler benim kadar şanslı olabilecek mi? Kendilerini tatmin edecek bir iş bulabilecekler mi? İşte bunu araştırmak size kalıyor.

Benim görüşüme göre, eğer bir kişi bu bölümü okumaktan zevk alırsa geleceği de parlak olur. Dolayısıyla ben okulda ne yaptığımızı yazdım, kısa bir ders yayınladım ve "kendini geliştirme" gibi bazı konulara açıklık getirdim.

Bir şeye dikkat çekmek istiyorum; bilgisayar mühendisliği gerçekten sevilebilir bir bölüm/meslek. Daha ilk senesinde androide multiplayer oyun çıkaran arkadaşlarım oldu. Adamlar hiçbir şey bilmiyordu, biraz okuldan öğrendiler biraz kendileri öğrendiler. Ve şimdi risk+bil ve fethet karışımı bir oyunları var. Müthiş. İşte bu şekilde meraklı ve çalışkan kişilerin geleceğinin parlak olacağından şüphem yok. Sorun şu ki siz meraklı+çalışkan olabilecek misiniz?

*

Öncelikle şu yazıyı okuyun:

http://www.ceng.metu.edu.tr/~ucoluk/bm/

(Meraklısı için burada da epey güzel bilgiler var. "Yahu ne yapıyor bu bilgisayar mühendisliği?" diye kendi kendinize soruyorsanız buradan cevabınızı alabilirsiniz:

http://www.ceng.metu.edu.tr/~ucoluk/bm/#Bilgisayar Mühendisliği)

İlk verdiğim yazı epey bir sorunuza cevap olmuştur. O yazıda dikkat çekmek istediğim birkaç nokta var:

Ücretler: Ben tercih zamanı bu yazıyı ilk okuduğumda ücret konusunda tatmin olmamıştım açıkçası. Ama gerçek dünyaya dönmekte yarar var. Mezun olduğunuzda patronların size 8-9 bin teklif etmesini beklemeyin. Aynı, üniversitede kızların teklif etmesini beklememeniz gerektiği gibi. Geçen gün bana bilgisayar mühendisliği konusunda danışan bir arkadaşa hiçbir zaman işe 8-9 bin lirayla başlayamayacağını, bunun için bir 8-10 sene iş tecrübesine ihtiyacı olduğunu yazdım. (Bu bilgi sallama, ama benim tercih yaparken okuduklarım bu minvaldeydi.) O da bana "O zaman 15 bininci olup tıp yazarım, ezberlerim, tusu bir şekilde geçerim mühendislikteki gibi çile çekmem paramı alırım vs." buna benzer bir şeyler dedi. Şimdi arkadaşlar diyorum ya gerçek dünyaya dönmek lazım diye. Öyle tıpı kazanır, dersleri geçerim tusu kazanırım asarım keserim olmuyor öyle. TUS dediğin sınav = 10000 x YGS. YGS TUS'un önünde diz çöker tövbe ister. YGS İspanya'ysa TUS Hollanda'dır. Üstelik de TUS'u bitiren doktor 30 yaşındadır ve yine ne kadar alacağı görecelidir. İnternette birinin bilgisayar mühendisi veya doktor halasının/amcasının/yedi göbekten yeğeninin altında ferrari olduğunu okuyabilirsiniz ama hayat sizin için o kadar toz pembe olmayabilir. Böyle diyorum çünkü tercih döneminde aynı ikileme ben de düştüm. Ağabeyim İTÜ denizcilikten mezun, bilgisayar mühendisine göre de, doktora göre de fazla para kazanıyor. Üstelik geziyor. Her limanda bir sevgili. 6 ay çalışıp 6 ay yatabiliyor. Ne kadar güzel değil mi? Fakat adam mesleğine küfrediyor. Üzerine çok sorumluluk bindiğinden yakınıyor. Gemide kendine ait boş zamanını anca yatmaya ayırabiliyormuş. Bir kere de Somalili korsanlarla karşılaştı. (Ama bir şey olmamış.)  Bu sene KPSS'ye hazırlanıyor kurtulmak için. Bana tercihler konusunda dediği şey: "Sen anneme babama bakma. Onların gözünde doktorsun. Ama okurken ve çalışırken ne çektiğini ancak sen bilirsin."

Uzun lafın kısası: bu mesleği tercih ederken paraya bakmayın. Severek okuyacak mısınız, işinizden biraz olsun zevk alabilecek misiniz ona bakın. (Yani paraya da bakın ama asıl sebebiniz bu olmasın, para kazandıran tek meslek bu değil sonuçta.) Tercihinizi ona göre yapın. Bu mesleğe ilginiz varsa ve programlama ve bilgisayar mühendisliğinin çalışma alanları konusunda bilgi sahibiyseniz, eee, zaten çoktan bu bölümü yazmaya kafayı koymuşunuzdur ve dolayısıyla bu yazıyı zaman geçirmek için okuyorsunuz. Fakat biliyorum ki bu yazıyı okuyanların %99'u bilgisayar kullanmayı seviyor, bir şeyler üretmek istiyor, mühendislik seçmek istiyor ve bilgisayar mühendisliği kalbine en yakın geliyor. Fakat "kod yazmak" dışında ne yaptıklarından bihaber. "Eeee?" diyor kendi kendine. "Koca mesleğin olayı bilgisayarda kod yazmak mıdır? Öyleyse dışarıdan öğrenilemez mi? Veya bu mesleği zor, mezunlarını değerli yapan nedir? Bu microsoft çalışanlarını neye göre seçiyor madem herkes kod yazabiliyor?" Hah işte bu tip sorular kafanızı kurcalıyorsa tekrar hatırlatayım, doğru yazıyı okuyorsunuz.

Ha bu mesleği sevmeden yapabilir misiniz? Evet. Meslek meslektir sonuçta, dünyada herkesin üzerine düşeni yapması gerek, sevse de sevmese de. Açıkçası sevdiği için çöpçülüğü seçen biri olacağını sanmıyorum. Sevmeden yapan bir kişinin düşüncelerini de paylaşayım, gayet güzel yazmış:
https://eksisozluk.com/entry/8053110

ODTÜ'nün yazısındaki başka bir önemli nokta ise şu:

Bilgisayarımda XXX çalışmıyordu, tanışım bir bilgisayar mühendisinden yardım istedim, çalıştıramadı, başka birisi ise geldi, birşeyler yaptı, sorun çözüldü. Nasıl bilgisayar mühendisi bu?

Arkadaşlar bizim ders programında "Şu hata nasıl çözülür? Windows mavi ekran verirse ne yapmalıyız?" tarzı bilgiler içeren bir ders yok. Varsa benim haberim yok. Peki bu tür konularda nasıl bilgi sahibi olacağız?

Cevap: Google!
Google bir bilgisayar mühendisinin en önemli silahıdır arkadaşlar. Google kullanabilen bilgisayar mühendisi her şeyi bilebilir. Fakat bilmek ister mi?

Dönem projesi yaptık geçende 4 arkadaş. (Bu konuda yazının en sonunda bahsettim.) Ben müzik koymayı öğrendim ve projeye koydum, oyundayken bilgisayarın içindeki bir text dosyasına yazı yazmayı öğrendim. Bunun gibi birkaç tane okulda öğretilmeyen şeyi öğrenip, birçok sorunla karşılaşıp hepsini çözüp projeye uyguladım.

Gruptaki 2 arkadaşa ise bir kutu üzerinde başka bir kutunun gözükmesini sağlayan bir hazır kod sayfası attım.
"Bununla da siz uğraşın." Adamlar onunla saatlerce uğraştılar. 2 kişi kod açıklamasını isteksizce okuyup deneme yanılmayla dediğim olayı yapabildi.
(Hazır kod şu: siz kod yazarken her şeyi kendiniz yazmazsınız. Bazı şeyler ya çok üstdüzey programlama bilgisi gerektirdiği için ya da kullanıcılara kolaylık olsun diye internette paylaşılır. Örneğin Unreal engine, cry engine gibi "fizik motoru" denen şeyleri duymuşsunuzdur. Hah işte bunlarla oyun yapmak için yine bol kodlama gerekir. Fakat bu fizik motorundaki "fizik" kısmı fizik motorunu yapan yapımcılar tarafından önceden yazılmıştır. Atıyorum unreal engine'e yani fizik motoruna bir bina yerleştirdiniz. Binanın çatısına bir adam yerleştirdiniz. Adam binadan atlarsa yerçekiminin onu nasıl etkileyeceği, ne hızla düşeceği ve düşme hızının ivmeden kaynaklı ne kadar artacağı. İşte bunları siz yazmazsanız. Bu bir "hazır kod" örneğidir.) 

Şimdi burada arkadaşlarıma laf mı giydirmeye çalışıyorum? Hayır. Olay şu: adamlar elektronikçi. Verilen ödev grafikli arayüz üzerine. Yani elektronikçiler için gereksiz. Dolayısıyla adamlar öğrenmeye isteksiz. Verdiğim hazır kod ise öğrenmesi zor çünkü açıklamalar upuzun. Tüm gece onunla uğraştılar. Bu olaya gerekli gözüyle bakıp motive olsalardı çok daha kısa zamanda işi kapabilirlerdi.

Burada söylemek istediğim şey ise şu: Google'da herbir şeyin bilgisi var. Bilgisayar mühendisi olacak insan ise ihtiyacı olan bilgiyi google'dan bulup uzun İngilizce metinleri (Türkçe her zaman yetersiz kalır.) sabırla okuyacak ve uygulamasını yapacak. Uygulama safhasında ilk testlerde hep hata çıkar. Gerek deneme yanılmayla, gerek de o bulduğu hazır kodla ilgili başka kaynaklar tarayacak internetten. Öğrenme safhası sıkıcıdır. Kimi zaman eğlenceli olduğu da olur tabii. Örneğin ben 14 yaşındayken RPG Maker motorundan kendi kendime oyun yapmayı öğrenmiştim hatta yapmıştım. Gayet de iyi bir oyundu. Fakat orada çalışmalarımın sonucunu hemen görebiliyordum. Yani çok çabuk "geri-bildirim" alıyordum ve aldığım olumlu sonuçlar beni daha da istekli hale getiriyordu. Fakat geri-bildirim olayını yani olumlu sonuçları hemen görmüyorsanız ve öğrendiğiniz şey zor ve karmaşıksa öğrenme safhası sıkıcı ve uzun olabiliyor. Şu an okuduğum kitap "Head First Design Patterns". 600 sayfa. Gayet uzun ve pratik ve sonuç-veren geribildirimli kısımdan önce epey yol gitmeniz gerekiyor. Ve inanmayacaksanız ama bu kitabın kodlamayla hiçbir alakası yok? Bu kitabı okuyunca daha iyi kod yazmaya başlamıyorsun, problemleri daha kısa zamanda çözmüyorsun. Peki nedir bu kitabın kerâmeti? Bu kitap size tasarım kalıplarını öğretiyor. 600 sayfanın içinde 10 tane tasarım kalıbı var. Hepsini bilmek gerekiyor ki yapacağımız program için en uygun olanına karar verebilelim. (Eğer doğru tasarımı yaparsak, yapacağımız program daha sağlıklı ve uzun ömürlü olur.) Düşünsenize! Bir program yapmak istiyorsunuz. Programın en yapacağını, arayüzünü falan tasarladınız kağıt üzerinde her şey var. Fakat kodu da tasarlamanız gerekiyor! Kodu tasarlamaktan gram kod yazamıyorsunuz! En uygun kod tasarısını bulmak için tasarım kalıplarını bilmeniz gerekiyor ve bunun için de önce 600 sayfalık bir kitap okumak zorundasınız. Daha sonra sizi uzun ve yorucu günlere sevkedecek olan programlama kısmına geçebilirsiniz. İşte sıkıcı ve uzun öğrenme safhasından kastım bu. Peki bu kalıplar okulda öğretilmiyor mu? diye sorarsanız bize okulda bir tane tasarım kalıbı gösterildi. Fakat iyi bir programcının daha fazla kalıp bilmesi gerek.

Gösterilen kalıbın adı "Model View Controller". Bunun ne olduğunu açıklayayım, kod yazma prensipleri hakkında ilk bilgilerinizden biri olsun.

Model-View-Controller üç kısımdan oluşuyor. Model verileri ve hesaplama fonksiyonlarını tutan kısım. View yani görüntü, kullanıcının gördüğü kısım. Bu ikisi arasında bir bağlantı yok yani birbirini etkileyemiyorlar. Controller adından da anlayacağınız üzere bu ikisini kontrol ediyor, yani değiştiriyor. Örneğin bir hesap makinesi yapıyoruz. Modelin içinde "toplama", "çarpma" gibi fonksiyonlar var. View'ın içinde bir kutu var, üstte beyaz ve boş bir kutu var. Altta kutular var ve kutuların üzerinde rakamlar yazıyor. Tuşlar yani. Controller'da ise "dinleyici" ismi verilen şey var. Bu dinleyici kullanıcının bastığı tuşu algılıyor ve controllera rakamı depolattırıyor. Kullanıcı çarpma tuşuna basıyor. Controllerdaki dinleyici "aha çarpacak" diyor. Kullanıcı tekrar bir rakama bastığında controller depoladığı rakamları modele gönderiyor ve modele "Model kardeş senin içinde bir "çarpma" fonksiyonu vardı hani.." diyor. "Sana zahmet şu iki rakamı çarpıp sonucu bana söyler misin?"  diyor. Model de "Hay hay." diyor ve controllera sonucu gönderiyor. "Başka bir isteğin var mı?" diye soruyor. Controller da "Model kardeş bir de rica etsem Pembe Mezarlığı çalabilir misin?" diyor. Model de "Defol buradan iğrenç liseli!" diyor. Neyse tamam kötüydü. Bundan sonra controller sonucu alıyor ve viewa gönderiyor. View'a diyor ki "Bak kardeşim bu kullanıcının istediği sonuç. Bunu yayınlama fonksiyonunu kullanarak yayınla." View sonucu alıyor ve yukarıdaki boş kutuda yayınlıyor. Hesap makinesinde girdiği iki rakamın çarpımının belirdiğini gören kullanıcı... bön bön bakıyor zil takıp oynayacak hali yok ya :)

Toparlarsak şu: hesap makinesinin içinde hesap yapmaya yarayan çip var. Bu model. View ise bizim dışarıdan gördüğümüz, üzerinde rakamlar yazan ince kutu. Controller ise tuşların altındaki dedektörler. Hesap makinesinin nasıl çalıştığını biz bilmeyiz, sadece tuşa basıp hesap yapmayı biliriz. Aynı şekilde, MVC kullanan bir programda da sadece view kısmı kullanıcıyla haşır neşir olur. Model ve Controller programcıya özeldir.

Not: Controller nasıl depo yapıyor? Model nasıl çarpıp controllera gönderiyor? Bunları şu anlık bilmenize gerek yok arkadaşlar. Yukarıdaki yazıyı bunları bilmeden de anlayabilirsiniz. Bilgisayar mühendisiyken çok kez "nasıl çalıştığını bilmediğiniz ama sonucunu bildiğiniz" şeyleri kullanacaksınız. En bariz örnek bilgisayarın ta kendisi. Şu an bu yazıları yazarken klavyenin harfleri nasıl tanıdığını ve bunu bilgisayara nasıl gönderdiğini bilmiyorum. Tek bildiğim şey "view" ve onu nasıl kullanacağım. Controller ve model bilgisayarı yapan elektronikçiye kalmış.

Model-View-Controller'ın ne olduğunu öğrendiniz... Bunu öğrenmesi sıkıcı mıydı? Bu oldukça kısa ve öz, hap bilgiydi. Model-View Controller'ı gerçekten öğrenmeniz için size ahanda şu an okumakta olduğunuz blog yazısı kadar bir yazıyı okumanız gerekebilir. Tabii sonra pratik yapmak için birkaç tane program yazmanız gerek. Tüm bunları okumak ve öğrenmek sıkıcı geldiyse bilgisayar mühendisliğinden vazgeçin demeyeceğim. Çünkü yaz ayındasınız, sınavdan yeni çıktınız, oruçlu olabilirsiniz. Okumak ve öğrenmek her meslekte mevcut. Asıl olay siz bu şeyleri okuyup iyice anladığınızda "Ben azimliyazarın öğretmeye çalıştığı şeyi anladım ve şimdi biraz bilgisayar mühendisliği konusunda bilgi sahibiyim. Tüm bunlardan çıkardığım sonuç şu: Ulan benim ne işim var burada? Kod tasarımı ne ulan? Ömür geçer mi bunlarla. Benim makine yapmam lazım, robot yapmam lazım. Ben dünyaya kod tasarlamak için gelmedim gardaş..." diyor musunuz? Bunu dürüst bir şekilde demek için yazının tamamını okuyun.

Bulmaca 1 : Yukarıda Model-View-Controllerı anlatırken View-Controller ilişkisinde atladığım bir kısım var. Eğer programı yukarıdaki gibi yazarsam çalışır, ama gerçek bir hesap makinesi gibi çalışmaz. Bakalım bu hatayı bulabilecek misiniz? Hesap makinesinin çalışma prensibini düşünün.

*

Özetlersek ODTÜ'nün yazısından yola çıkarak iki şeyden bahsettim.

1- İşinizi sevecekseniz gelin. Dolayısıyla bölümü okumayı sevecekseniz gelin.

2- Öğrenmeyi sevecekseniz gelin. Bir ömür boyunca google taraması yapmayı, araştırmayı göze alacaksanız gelin.

Bu bölümü okumayı & araştırma yapmayı sevip sevmediğiniz konusunda bu yazıdaki MVC kalıbı olayını okuyarak biraz bilgi sahibi olmuşsunuzdur.

*

Şimdi diğer bir başka yararlı siteye gelelim.
http://www.bilgisayarmuhendisleri.com/

Bu site oldukça güzel. Bu sitede ufkumu açan ve bilgisayar mühendisliğinin oldukça zor olacağını gözler önüne seren harikulade bir kavram var: "Patlak mühendis."

Nedir patlak mühendis? Kısaca şu "kendini geliştirmeyen", üniversiteyi sadece "dersleri geçmekle" geçirmiş, mezun olduğu halde kodlama yazamayan mühendis.

Özellikle burada çok iyi açıklamış admin reis: http://www.bilgisayarmuhendisleri.com/sayfa.aspx?s=165

Bakın arkadaşlar en alta, patron diyor ki bana "ananas seviyor musun?" diye soru soran program yap. Patlak mühendis patronun dediğini aynen yapıyor veya tam yapamıyor. Asıl sorun şu, ya patron program üzerinde önemli değişiklikler yapmak isterse? Örneğin atıyorum counter strike oyununa kılıç kalkan koyduğunuzu düşünün. Eğer counter strike oyununu patlak mühendisler yazsaydı kılıç kalkanla yapılacak tek şey düşmana 500 metreden ateş etmek olurdu ki bu da saçma olurdu. Super Mario'yu düşünün. İlk oyunda Super Mario uçamıyordu. Dolayısıyla yapımcılar oyunu sadece monitöre sığacak yükseklikte yaptılar. Patron geliyor, Mario'yu uçurun diyorlar. Programcılar şaşkın çünkü hiç bunu düşünmemişler. Kameranın yukarı doğru kayması var. Yer çekimini marionun uçmasına göre ayarlamak var. Maksimum yüksekliği ayarlamak var. Var oğlu var. İşte bilgisayarmuhendisleri sitesinin admini diyor ki patlak mühendis eklenebilecek özellikleri düşünmeden programlama yaparlar. Dolaysıyla yeni bir özellik ekleneceği anda eski versiyonu ya silmek gerekir ya da çok büyük bir kısmını değiştirmek.

Tasarım kalıplarının önemini anlatırken "daha sağlıklı ve uzun ömürlü" programlar yazarsınız demiştim hatırlarsanız. Hah işte kastettiğim bu. Patlak mühendis bunları bilmediği için kullanamaz. Dolayısıyla yeni bir şey ekleyeceği zaman tüm sistemin dengesi bozulur, program uzun ömürlü olmaz. Ama örneğin programa Model-View-Controller ekleyen mühendis varolan programa yeni bir View eklenmesi gerektiğinde yapacağı şeyler sadece o yeni View'u yazmak ve Controller'a o yeni bir viewla ilgili küçük bir parça kod yazmak olur. Modella View arasında bağlantı olmadığı için Model'a dokunmaya gerek kalmaz. Bu kısım biraz karışık gelmiş olabilir, anlamadıysanız aşağıda sorabilirsiniz.

Programcıları "patlak mühendis" olmadığı çok bariz olan oyunlar Skyrim, Mount&Blade, Medieval Total War gibi mod sistemini destekleyen oyunlar. (Gerçi hiçbir kaliteli oyun patlak mühendisler tarafından yazılmıyor. Ama bu oyunlardaki modül sistemi apaçık bir kanıt olduğu için örnek verdim.) Bu adamlar öyle bir ayarlama yapıyorlar ki oyunun kaynak kodunu yani kendi yazdıkları kodu vermiyorlar. Size verdikleri kısıma siz düzenleme yapıyorsunuz ve bu kısımdaki düzenlemeler kaynak kodu değiştiriyor, fakat bu değişikler kaynak kodda hasara yol açmıyor dolayısıyla oyun sessiz sedasız çalışmaya devam ediyor. Bu adamlar önceden buna uygun bir tasarım kalıbı kullanıyorlar.

Patlak mühendis olmayıp çok okur, çok araştırır, çok programlarsanız orta seviye üniversitelerden de iyi yerlere gelebilirsiniz. Alın bakın Hacettepe'den Microsoft'a:
http://www.bilgisayarmuhendisleri.com/sayfa.aspx?s=92

Kendini geliştirmekle ilgili yazıları: http://www.bilgisayarmuhendisleri.com/sayfa.aspx?s=178

Bu sitedeki makaleler gayet iyi. Yalnız bence admin üniversite seçimi konusunda fazla idealist davranıyor. "İstanbuldan başka bir yeri seçmeyin, sektörün kalbi oradadır, hem ek iş yaparsınız." gibi doğru şeyler söylüyor. Yani teorikte doğru. Pratiğe gelince söylemeliyim ki İstanbul "dikkat dağıtıcı" bir şehir. Abim gezmekten eve uğramıyordu öyle söyleyeyim. Epey para yiyen bir şehir. Bu yüzden üniversite seçimi yapacak kişiler idealist takılırken bir yandan da kendi bütçesine baksa ve insan olduğunu unutmasa iyi olur. Adminin tanımladığı gibi İstanbul'u sektöre hazırlanmak için kullanan mühendis adayının sayısının fazla olduğunu düşünmüyorum.

Bu sitedeki diğer "patlak mühendislik" yazılarını okuyun. Burada listelenmiş:
http://www.bilgisayarmuhendisleri.com/sayfalar.aspx?k=15

ODTÜ'nün yazısını yorumlarken bu mesleği seçecek kişilerin bu bölümü sevecek ve aynı zamanda üşenmeden araştırma ve google taraması yapacak + bir de bunları sabırla okuyup uygulamaya dökecek nitelikte olması gerektiğini iddia etmiştim. Yazımın bu kısmında ise böyle olmayan (bölümü sevse de sevmese de, araştırmayan, okumayan, vaktini boşa harcayan) kişilerin "patlak mühendis" olduğunu ve patlak mühendis/hakiki programcı farkını gördünüz. (Tabii eğer attığım linkteki diğer yazıları okumadıysanız göremediniz, okuyun arkadaşlar. Bilgisayarmuhendisleri sitesinin admini önemli noktalara zaten parmak bastığı için ben yazının bu kısmını kısa tuttum.)

*

Şimdi gelelim bölümde ilk sene yapacağınıza. Yani programlamayı öğrenmeye.

Size çok basit bir iki şey öğreteceğim. Sonra sizi bir soruyla test edeceğim.

İlk olarak kod yazmak / programlamak nedir ondan başlayayım. Kod yazmak yazı yazmaktır.
Kod yazarken yaptığınız şey kullandığınız dilin prensiplerine uyarak aklınızdaki şeyi bilgisayara yapmaktır. Yani Matematiksel bir yabancı dili kullanmaktır diyebiliriz. Her kod yazabilen kişi iyi bir programcı değildir, tıpkı her yazı yazabilen kişinin iyi bir romancı olamayacağı gibi. Burada önemli olan o "aklınızdaki şey"dir. Yani algoritmadır.

Peki algoritma nedir?

Algoritma: "eksiksiz olarak takip edildiğinde, önceden belirlenmiş bir işi sonlu zamanda gerçekleştiren sonlu sayıda komutlar topluluğu"

Bu tanımı ekşi sözlükten aldım, daha teknik bir tanım yapmak istemedim. Algoritma şu: patron size bir program yazmanızı istendi. Dedi ki  "Bir sayı tek mi çift mi onu kontrol eden bir program yaz." Siz önce bunu nasıl yaparım diye düşünüyorsunuz, sonra adım adım yapmanız gerekenleri yazıyorsunuz. Patron fazla detay vermediği için programı farklı şekillerde de yapabilirsiniz, bu konuda özgürsünüz. Ama yapacağınızı adım adım yazdığınızda muhtemelen şu minvalde bir şey olacak:

1. Kullanıcıdan bir sayı al. (Bu patron tarafından belirtilmemiş ama içgüdülerimize güvenerek burayı ekliyoruz çünkü tek mi çift mi kontrol etmek için bir sayıya ihtiyacımız olacak.)

2. 2'ye böl, kalanı bul/depola ve kontrol et.

3. Eğer kalan 0'sa
          Ekrana "Çift" yaz.
    Eğer kalan 1'se
          Ekrana "Tek" yaz.

4. Kullanıcıdan başka bir sayı iste.

Algoritma bilgisayar mühendisliğine has bir şey değil. Matematiğe has. Milattan önce 300 sene önce yaşamış Öklid'in bulduğu ebob hesaplayan "Öklid algoritması" birçok programlama ve matematik kitabında yer alır. E adam ne bilsin 2200 sene sonra bilgisayar diye bir dalganın icat edileceğini? Meraklısı için Öklid algoritması:
https://eksisozluk.com/euclid-algoritmasi--357583

İşte "Bilgisayar mühendisliği matematik ulan!" diyip duruyorlar ya o buradan geliyor. Bizim yaptığımız şey aslında bir problemin çözümünü bilgisayara yazdırıp sonucu bilgisayara buldurtmak. Lise matematiğinin aksine, biz çözümü yapıp sonucu bulup sınavdan 10 almıyoruz. Çözümü bilgisayara anlatır gibi kağıda yazıyoruz. Onu kontrol ediyorlar. 2x^3 ün türevini alacaksınız örneğin. Bilgisayara diyorsunuz.

1- Üstü başa düşürüp katsayıyla çarp.
2- Üstten bir eksilt.

Hah işte algoritma bu. Bu algoritmayla 6x^2 doğru cevabına ulaşırsınız. Fakat 1.adım ve 2.adımın yerlerini karıştırırsanız, yani önce üstten bir eksiltip sonra üstü başa yazarsanız, cevap 4x^2 çıkar bu da hatalı bir algoritma doğal olarak hatalı bir kodu doğurur.

(Ekleme: Bilgisayar mühendisliğinin matematikle bu bağlantısından dolayı bilgisayar mühendisleri epey bir matematik dersi görecek. Calculus (türev-integral-seriler) , ayrık/sonlu matematik (olasılık, bağıntılar, fonksiyonlar), lineer cebir, istatistik vs. Bizim bölümde zorunlu olarak okutulan 5 matematik dersi var. Anlayacağınız dışarıdan programlama öğrenen sertifikalı mühendislerin epey bir matematik kursuna gitmesi gerekiyor.)

Algoritmanın ne anlama geldiğini pratik olarak öğrendiniz sanıyorum. Özetle bir işin yapılması için adım adım yazılan küçük işler diyebiliriz. Ekşi sözlük tanımında "sonlu" demesinin sebebi eğer bilgisayar sonsuz iş verirseniz o da sonsuza kadar çalışır dolayısıyla siz de sonucu asla göremezsiniz en fazla bilgisayarın vereceği mavi ekranı görürsünüz. O yüzden sonlu deyip durmuşlar.

Algoritmayı belirledikten sonra uygun dile çevirirsiniz yani işin kodlama kısmını yaparsınız. Bunu yaptıktan sonra çıkan hataları düzeltirsiniz. Test edersiniz doğru çalışıyor mu diye.

Normalde matematik ve genel bilgisayar kitaplarında algoritmalar "pseudo code" adlı sahte kodlarla verilir. Bu sahte kodları okuyan okuyucular başka dillere uyarlayabilir. Fakat ben yazımda bu olaya girmeden öğreteceğimi direkt Javayla öğreteceğim.

Önce şu ifade (statement) ile başlayalım.

int elmaSayısı;

(Sondaki ";" javaya has bir şey, bir ifadenin bitişini gösteriyor. Cümlenin sonuna nokta koymak gibi bir şey. Önemsiz yani)

Bu javadaki en temel ifadelerden. Yaptığı şu: elmaSayısı diye bir değişken (variable) belirliyor. Matematikteki x yani. Baştaki "int" kelimesi bu değişkenin yani elmaSayısının sadece "Tam sayı" tutacağını belirtiyor. Yani burada yaptığımız şey şu; bilgisayara diyoruz ki hacı bir değişken üret. Ürettiğin bu değişkenin adı elmaSayısı olsun. Bu elmaSayısı sadece tamsayı tutsun. Yani elmaSayısı 1 , 2, -5 , +2323 filan alabilir. 1,5 (15/10) değerini alamaz.

Bunu deyince bilgisayar hafızasından bir bölümü elmaSayısı değişkeninin tutacağı değerin yani sayının kaplayacağı alan için rezerv ediyor.

Şu anda elmaSayısı bir değer tutmuyor. Tanımsız. Yani elmaSayısını başka bir değerle toplamaya çalışırsak bilgisayar hata verir. Bir değer atamak için ise şunu yapıyoruz.

elmaSayısı = 5;

Bunu diyince elmaSayısı içinde 5 yazan bir kutuya sahip oldu. Yani demek istediğim elmaSayısı direkt olarak 5'e eşit demek değil. Sonradan canımız isterse "elmaSayısı = 7" yazarak değiştirebiliriz elmaSayısı'nın tuttuğu değeri değiştirebiliriz çünkü. İkisi ayrı şeyler.

Şu ana kadar yazdığımız kodlar:

int elmaSayısı;
elmaSayısı = 5;

Bu iki satırı tek satırda da yazabilirdik. Yani:

int elmaSayısı = 5; diyebilirdik.

Resim üzerinde göstereyim:



Yani yaptığımız şey Matematik dersinde yaptığımız "x'e 5 diyelim." olayının aynısı. Burada "elmaSayısı'na 5 diyelim." demiş olduk.

Değişkenin ismini neden "elmaSayısı" koydun? Neden elma sayısı değil?
Program yazarken bazı görünmez kurallar var, görgü kuralı gibi bir şey. Bir kurala göre birden fazla kelimeden oluşan değişken isimleri birleşik yazılır ve birinciden sonra gelen kelimelerin baş harfi büyük yazılır. Ben de bu kurala uydum. (Yalnız şunu da söyleyeyim, bir değişkene isim verirken araya boşluk koyamıyorsunuz, yani "elma sayısı" hata veriyor. elma_sayısı yazabilirsiniz, ELMASAYISI yazabilirsiniz fakat bunu yazarsanız bana hakaret etmiş olursunuz ehehe.)

Şu ana kadar yazdığımız kod:

int elmaSayısı;
elmaSayısı = 5;

Şimdi bir de armutSayısı tanımlayalım ve 10 değerini verelim.

int armutSayısı = 10;

Yukarıdaki yaptığımız şeyin armut versiyonunu yaptık.
Sizce elmaSayısını armutSayısına eşitleyebilir miyiz? Tabii ki! Ama nasıl? Ahanda böyle:

elmaSayısı = armutSayısı;

elmaSayısı'nda 5 vardı. armutSayısı'nda 10 vardı. Eee ne oldu şimdi? Çorba oldu her şey, demeyin.
Bakın arkadaşlar burada kullandığımız "=" sembolü Matematikteki sembol değil. Burada hocaların problemin sonunda "Veee son olarak 2x + 5 = 15 ve buradan x = 5 çıkıyor." derken yaptığı şeyi yapmıyoruz. Burada problemi yazan, o problemde x'i 5 olarak önceden belirleyen kişi biziz.

Yani elmaSayısı = armutSayısı derken dediğimiz şey: "Az önce canım istedi elmaSayısını 5 değerini atadım. Şimdi canım istedi elmaSayısına artmutSayısı değişkeninin tuttuğu değeri atıyorum."
Ve her zaman eşitliğin sağ tarafındaki değişkenin tuttuğu değeri eşitliğin sol tarafındaki değişkene atarız. Yani armutSayı'sının kutusundaki değeri elmaSayısının kutusuna monte ediyoruz. Eğer önceden armutSayısı büyük hissediyor idiyse elmaSayısı da büyük hissetmeye başlıyor.

Bunun sonucunda elmaSayısı 10 oluyor, armutSayısı da değişmeden kalıyor:





(Neden elmaSayısı = 10 yazmak yerine elmaSayısı = armutSayısı yapıp kafamızı karıştırdık derseniz, her zaman armutSayısı'nın içinde ne var bilemezsiniz. Veya bazen kodlarınız kadar uzun ve karışık bir hal almıştır ki armutSayısı'nın içinde ne var takip etmesi zordur. Ama en önemlisi; diyelim canınız istedi ve en baştaki armutSayısına atadığınız değeri 10 değil de 8 yaptığınız. yani int armutSayısı = 8 yaptınız. Bu durumda kodlamanızı elmaSayısı = armutSayısı şeklinde yaptıysanız en başta armutSayısı'na hangi değeri atadıysanız elmaSayısı da onu alır yani bu durumda 8 olur siz de bir değişiklik yapmak durumunda kalmazsanız. Fakat elmaSayısı = 10 yaptıysanız ve hala elmaSayısı'nın armutSayısı'na eşit olmasını istiyorsanız elmaSayısı = 8 yapmanız gerekir. Bu yüzden elmaSayısı = armutSayısı yazmak daha doğrudur.

Bir değişken tanımlamayı, o değişkene bir değer atamayı ve başka bir değişkenin içindeki değeri tanımladığınız değişkenin değeri olarak atamayı öğrendiniz. Elimden geldiğince basit anlatmaya çalıştım. Muhtemelen ilk kez programlamayı öğrenirken böyle basit, "salağa anlatırmış gibi anlatan" kaynaklarla karşılaşacaksanız. Başlangıç için en iyi kaynaklar bu tip kaynaklardır. Bir dile epey aşina olduğunuzda ve tecrübe kazandığınızda ise öğrenme safhası kolaylaşır diyebiliriz. Çünkü programlama dillerinin mantığını birbirine benzer.

Biraz daha yapabileceğiniz şeylere geleyim. Canınız isterse toplama çıkarma da yapabilirsiniz bu değişkenlerle.

Şu anda elimizde halihazırda bulunan kod:
int elmaSayısı;
elmaSayısı = 5;
int armutSayısı = 10;

!!!
Bu işaret arasında kalan bütün kodlar birbirine eklemedir. Yani kod içinde armutSayısını değiştirdim 15 yaptım. Artık armutSayısı'nın asıl değeri 15 olmuş olur.

Bunu eklerseniz:

elmaSayısı = elmaSayısı + 3;

elmaSayısının mevcut değer 5. 5 e 3 eklersek 8 buluruz ve elmaSayısı = 8 demiş oluruz. elmaSayısının mevcut değeri 8 olmuş olur.

Bunu eklerseniz:

elmaSayısı = elmaSayısı + elmaSayısı;

elmaSayısı'nın değeri ne olur? 10 mu? Hayır! Bakın yukarıda elmaSayısı'nın değeri 8 idi. Sağ tarafta iki elmaSayısı var. 8 + 8 = 16. elmaSayısı = 16 yani elmaSayısına 16 değerini vermiş olduk.

armutSayısı = 7 + 8;

armutSayısı'nın yeni değeri 7 + 8 yani 15 olmuş oldu.

elmaSayısı = elmaSayısı - armutSayısı;

Bunu yapınca önce sağdaki kısmı hallediyoruz yani elmaSayısı'nın değerinden armutSayısı'nı çıkarıyoruz. elmaSayısı şu an 16. armutSayısı 15. Çıkardık 1. elmaSayısı 1 olmuş oldu.

!!! (Yukarıyla işiniz kalmadı.)

Şimdi ben size bir alıştırma vereceğim. Oldukça kolay. Eğer yukarıda anlattığım şeyi anladıysanız bunu kolaylıkla yaparsınız. (Not: Kodu kolaylıkla takip etmek için kağıt kalem alıp her satırda ne neye eşit oluyor onu yazmanızı öneririm.)

Kodumuz:

int naberLen = 2;

int iyiSenden = 5;

iyiSenden  = naberLen;

naberLen = naberLen - iyiSenden;

iyiSenden = naberLen * naberLen + 2;

naberLen = 3 + 5 * 4 - 1;

Soru: naberLen ve iyiSenden değişkenlerin kodun en sonunda tuttukları değerler nedir? Çözüme bakmadan kendiniz bi uğraşıp cevabınızı bir yere yazın.

Hadi göreyim sizi.


Çözüm:
Az önce demiştim ya programlamada görgü kuralları var diye. İşte burada o kuralları çiğniyorum ve değişkenlere çok kötü isimler veriyorum öyle ki kodumuz okunması zor bir hal alıyorum.

int naberLen = 2;

int iyiSenden = 5;

Bu iki satırda iki değişken atayım onlara değer veriyoruz.

iyiSenden  = naberLen;

iyiSenden 5 değerini tutuyordu. Fakat naberLen'deki 2 değerini iyiSenden'e verince 2 değerini tutmaya başladı. 5'ten bir daha haber alınamadı. iyiSenden'e 5 vermek gereksiz oldu, direkt olarak int iyiSenden = naberLen de yazabilirdik.

naberLen = naberLen - iyiSenden;

naberLen ile iyiSenden eşit. Bu yüzden naberLen artık 0 değerini tutuyor.

iyiSenden = naberLen * naberLen + 2;

naberLen*naberLen = 0. 0'a 2 ekliyoruz ve iyiSenden'in yeni değeri 2 oluyor.

naberLen = 3 + 5 * 4 - 1;

naberLen hakkında önceden ne yaptığımızı silip atıyoruz ve ona yepyeni bir değer veriyoruz. Programlamada da Matematikteki gibi işlem önceliği var unutmayın. Önce 5*4'ü buluruz. 20.  20 + 3 - 1 = 22.

Cevap: naberLen 22 değerini tutuyor. iyiSenden 2.


Evet arkadaşlar değişkenler üzerine yapabileceğiniz işlemleri de gördünüz. Ders burada bitti. Şimdi size bir sorum var. Bu soruyu doğru cevaplayabilmek için yeterli bilgiye sahipsiniz şu anda.

Bulmaca 2: Elimizde iki değişken var. Biri elmaSayısı. Diğeri armutSayısı. Hangi değerleri tuttuğunu bilmiyorsunuz. Şimdi öyle bir kod yazınki bu değerler yer değiştirsin. Yani en sonunda elmaSayısı armutSayısı'nın tuttuğu değeri tutacak. armutSayısı ise elmaSayısının tuttuğu değeri tutacak. Atıyorum önceden elmaSayısı 5 değerini tutuyordu. armutSayısı 10 değerini tutuyordu. Sizin yazacağınız kod şöyle bir durum yaratacak: elmaSayısı 10 değerini tutacak. armutSayısı 5 değerini tutacak. Fakat 5 ve 10'u siz bilmiyorsunuz. Doğal olarak elmaSayısı = 10; armutSayısı = 5; şeklinde bir kod yazamazsınız. elmaSayısı = armutSayısı; yazarsanız ikisi de eşit hale gelir doğal olarak elmaSayısının eskiden tuttuğu değeri kaybedersiniz. E ne yapacaksınız o zaman?

Çarkları döndürme vakti geldi :) Hadi göreyim sizi! Çözüm en aşağıda ama yanıta bakmadan önce bir yarım saat düşünün en azından.

*

Bulamacaları doğru cevaplarsanız tebrikler. Yanlış cevaplarsanız bu sizden bilgisayar mühendisi olmayacağı anlamına gelmiyor. Önemli olan şey şu: bu tip işlerle, problem çözümüyle, kod taramayla, okumakla, araştırmakla uğraşmak istiyor musunuz? Kendini geliştirmenin ne olduğunu merak etmiştiniz değil mi? İşte söyliyeyim. Ben ilk bilgisayar sınavımdan yani vizemden 59 aldım. 59 almaya alışık bir öğrenci değilimdir. Bu vizeye gelene kadar yaptığım şey konulara çok iyi çalışıp mantığını kavramam ve derste daha önce çözdüğümüz örnek soruları çözmek. Lisede matematik sınavına böyle çalışırdık sonra 85 alır rahatlardık. Fakat burası üniversite. Benim üniversitemin adına kanmayın, her yerde böyle. Finale ise www.codingbat.com daki soruları çözerek girdim. Bi 30 soru filan çözmüşümdür. Finalden 79 aldım. Bu da düşük demek ki daha fazla çalışmam gerekiyormuş. Ama kendimi geliştirdiğim çok açık. Ekşi sözlükten sürekli bilgisayar mühendisliğiyle ilgili başlıklara entry atan biriyle konuştum. Bizim okuldanmış. Microsoft'a çalışıyormuş!!! Ve çok komik, bu yazarın kendi başlığında biri bu yazar için "Birkaç sene önce bana 'Ağabey bilgisayar mühendisliği yazmayı düşünüyorum önerir misin?' diye sorduğunu dün gibi hatırlarım." minvalinde bir şey yazmış. Yani bu Microsoft'ta çalışan kişinin programlama geçmişi yokmuş. Blogunu inceledim. Kişisel projelerine günde 8 saat ayırdığı oluyormuş adamın. Şöyle bir hesap yapsak, bir kişi günde 8 saat bilgisayar çalışsa 1-2 ayda bir bilgisayar/programlama kitabını bitirebilir. 4 sene de 24 kitap demek ki 24 kitap demek 24 alan hakkında bilgi sahibi olmak demektir bu da bilgisayar olayını yemek bitirmek demek. İşte kendinizi geliştirmekten kasıt bu. Kendi kendine öğrenmek, kendi kendine projeler yapmak. Şu an için benim yaptığım yukarıda gördüğünüz tipte bulmacaların / algoritmaların / problemlerin daha zor olanlarını çözmek. İlk sene böyle şeylerle haşır neşir olacaksınız yani. Tabii bu ilk dersti, kolaydı, daha ilerisi için bir dili öğrenmek (java öneririm) ve bu dilde matematik problemleri çözmek olur.

Dil öğrenmeye şimdiden başlarsanız bu işte sıkılıp sıkılmayacağınıza karar verebilirsiniz. Ama çok da bağlanmayın, aklınızda başka mühendislikler varsa onları da araştırın.
Dil öğrenmek için: https://www.udacity.com/course/viewer#!/c-cs046
Veya www.codeacademy.com ama java yok.
Türkçe kaynak da bulabilirsiniz, benim bildiğim var ama saf videodan oluştuğu ve kişi profesyonel olmadığı için yukarıdakiler gibi eğlenceli gelmeyebilir. Ben sadece anlayamadığım kısımlarda yardım aldım bu arkadaştan:
http://www.youtube.com/watch?v=QmwC_p0OGmI
Java sorusu çözmek içinse www.codingbat.com

*

Yazı bitti. Bulmacaların cevaplarına bakmayı unutmayın!

Son olarak aklınızda bilgisayar mühendisliği varsa şu sorulara cevap verin:

1- İngilizce'yi iyi öğrenip upuzun kitaplar okuyacak, bitmek bilmeyen eğitim videoları izleyecek şevki kendinizde buluyor musunuz? ( Ekleme: İngilizce'ye çok yabancıysanız söyleyeyim, zor bir dil değil.)

2- Okuldan bağımsız öğrenme yapabilecek misiniz? Okulda gösterilmeyen şeyleri öğrenmek için günlerinizi, haftalarınızı harcayabilecek misiniz?

3- Zor ve karışık problemlerle uğraşıp çözüm için gerekli araştırmayı yapabilecek misiniz? Oldukça zor problemlerin çözümlerinin mantığını anlamak için uğraşmanız, çözümde hata çıkarsa nerede çıkıyor diye uzun uzun kodları satır satır taramanız gerekecek. Bunun için yeterli misiniz ? (Aslında yeterlisiniz, sadece gerekli uğraşıvermeniz lazım.)

4- Program yazmayı hobi olarak yapabilecek misiniz?

Aslında bu soruların çoğunu herhangi bir mühendis adayı "Evet" olarak cevaplamalı. Yani bu sorulara hayır diyorsanız başka bir mühendislik alanı size göre olabilir diyemem pek. Kodlama elektronikçilere de lazım. Karışık problemler çözme, bağımsız öğrenme, İngilizce bunlar tüm mühendislere lazım. Tabii patlak mühendis olmak istemiyorlarsa.

Son soru: Saatlerce program yazabilecek misiniz?

Bundan bahsedecektim ama unutmuşum. Arkadaşlar ben bu mayıs ilk oyunumu çıkardım. Dönem ödeviydi, mayısın 1'inde başladım, 16'sında bitirdik. 4 kişiydik, fakat herkesin eşit çalıştığını söyleyemeyeceğim, bunda grup arkadaşlarımın elektronikçi olması dolayısıyla bilgisayar dersini fazla sallamaması, benim liderlik yapmaya çalışıp çok fazla sorumluluk almam ve sonunda fail olmam var. 16 gün boyunca kod yazdım ama 16 günün 5 gününde geceli gündüzlü yazdık. Sabah 9'da oturuyordum başına gece 11'de kalkıyordum. Her gün babama dert yanıyordum. Psikolojim bozulmuştu. Üstüne bir de grip oldum ve finallere hasta girdim.

Hocalar programı incelediler ve programlama açısından zayıf buldular. 7/10 verdiler, kahroldum. Fakaat;

16 günün sonunda her şey bitince ve program daha doğrusu oyun tıkır tıkır tam istediğiniz gibi çalışınca yaşadığınız mutluluk paha biçilemez arkadaşlar. Düşünsenize az önce bir şey ürettiniz. Sizin fikriniz, sizin emeğiniz. Ki benim oyun orjinal bir fikir üzerineydi. Şu anda elimde MEB'e satabileceğim bir proje var. Ha, oyunu javadan körlemesine yazdığımız için baştan kaybetti. Unity2D'te tekrar yazacağım, orada nesneleri sürükleyerek de program yazabiliyoruz çünkü. (Java sırf yazıdan ibaret) Özetle ben 5 gün geceli gündüzlü kod yazdığıma memnunum çünkü bilgisayar mühendisliği yazarken içimde olan "bir şeyler üretme" arzusunu çok kısa bir sürede tatmin ettim. "Nasıl katlanıyorlar bu insanlar bu kadar uzun süre bilgisayar başında oturmaya" derseniz işte böyle. (Gerçi abim bankada yönetici o da sürekli bilgisayar başında oturuyor. Masabaşı olmayan iş bulmak zor, sırf bilgisayar mühendisliğine has değil masa başı iş.)

İyi tercihler:

Bulmaca 1 Cevap: http://pastebin.com/T2Wkjrud

Bulmaca 2 Cevap: http://pastebin.com/YyQim47u

Edit: Siteler engelliymiş. O zaman buraya yazayım direkt:

Bulmaca 1:
  1. Kullanıcı rakam tuşuna bastığında dinleyici rakamı algılıyor dedik. Bir hesap makinesinde bir rakama basarsanız ne olur? Yukarıdaki boş kutuda rakamı görürsünüz değil mi? Yani atladığım kısım şu; kullanıcı rakam tuşuna basınca controller rakamı algılamalı daha sonra ikinci rakamı beklemeden hemen viewa rakamı göndermeli ki view da söz konusu rakamı boş kutuda yayınlasın.
  2. Yani 5 tuşuna bastık. 5 rakamını hemen hesap makinesinde görmeliyiz. Fakat blogta bu kısmı atladım. Blogta yazdığım yönergelere göre kullanıcı anca 5'e çarpıya ve 6'ya basınca hesap makinesinde 30'u görüyoruz. Çünkü sadece burada controller view'ı güncelliyor.

Bulmaca 2:
  1. Cevap: Atıyorum elmaSayısı 5 olsun. armutSayısı 10 olsun.
  2. Üçüncü bir değişken belirleyelim. Bunun adı "geçiciDeğişken" olsun.
  3. int geçiciDeğişken;
  4. geçiciDeğişken = elmaSayısı;
  5. Böylelikle geçiciDeğişken elmaSayısı'nın tuttuğu değeri aldı. Yani 5 oldu.
  6. elmaSayısı = armutSayısı;
  7. elmaSayısı da armutSayısı'nın tuttuğu değeri aldı. Yani 10 oldu. Üçüncü bir değişken belirlemeseydik elmaSayısı'nın eski değerini yani 5'i kaybederdik. Fakat elmaSayısı'nın eski değerini "geçiciDeğişken" adındaki değişkende yedeklediğimiz için 5'i tarihin tozlu sayfalarına gömülmekten kurtarmış olduk.
  8. armutSayısı = geçiciDeğişken;
  9. Yani kod şu;
  10. int geçiciDeğişken = elmaSayısı;
  11. elmaSayısı = armutSayısı;
  12. armutSayısı = geçiciDeğişken
  13. Bunun sonucunda elmaSayısı ve armutSayısı değişkenlerindeki değerler yer değiştirmiş oluyor. geçiciDeğişken neyi tutuyor önemsiz. Adı üzerinde geçici o.
  14. DURUN! Daha bitmedi. Microsoftta çalışan ekşi sözlük yazarından bir kitap önerisi almıştır. Bu kitapta şöyle bir soru var:
  15. elmaSayısı ve armutSayısı isimli iki değişkenimiz olsun. Bu değişkenlerin tuttuğu değerler yer değiştirsin. Yani yine aynı soru. Fakaaat.
  16. 3. bir değişken kullanamazsınız. geçiciDeğişken kullanamazsınız yani.
  17. Bu soruyu çözebilecek bilgiye kesinlikle ama kesinlikle sahipsiniz arkadaşlar. Cevabınızı bloga gönderebilirsiniz. Hadi göreyim sizi! İyi kodlamalar :)
  18. İpucu: Matematiksel düşünün.

Hiç yorum yok:

Yorum Gönder