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:
- 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.
- 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:
- Cevap: Atıyorum elmaSayısı 5 olsun. armutSayısı 10 olsun.
- Üçüncü bir değişken belirleyelim. Bunun adı "geçiciDeğişken" olsun.
- int geçiciDeğişken;
- geçiciDeğişken = elmaSayısı;
- Böylelikle geçiciDeğişken elmaSayısı'nın tuttuğu değeri aldı. Yani 5 oldu.
- elmaSayısı = armutSayısı;
- 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.
- armutSayısı = geçiciDeğişken;
- Yani kod şu;
- int geçiciDeğişken = elmaSayısı;
- elmaSayısı = armutSayısı;
- armutSayısı = geçiciDeğişken
- 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.
- 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:
- 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.
- 3. bir değişken kullanamazsınız. geçiciDeğişken kullanamazsınız yani.
- Bu soruyu çözebilecek bilgiye kesinlikle ama kesinlikle sahipsiniz arkadaşlar. Cevabınızı bloga gönderebilirsiniz. Hadi göreyim sizi! İyi kodlamalar :)
- İpucu: Matematiksel düşünün.
58 Yorumlar
Verdiğiniz bulmacaları algılamam saniyelerimi aldı, java dilini kendi başıma öğrendim, unity2d ile birçok oyun yaptım kendi çapımda. Unity 3d ile basit bir oyun yaptım küçük bir oda ve bahçesinden ibaret olan. Gel gelelim ünivsite sınavında sıralamam rezalet. Muhtemelen büyük şehirlerden birine gideceğim ama üniversite bir ODTÜ, bir Bilkent olmayacak. Sizce bu nasıl bir dezavantaj sağlar bana?
YanıtlaSile normal kardeş ben hiç bilmeyenlere yazdım bu yazıyı, dil bilen adam için değil. bilemiyorum nasıl bir dezavantaj sağlar. çalışan adam yine yapar bence ya.
Sillink acilmiyor, engelli site.
YanıtlaSilben 3. bir sayi tanimlayip kolayca cozdum umarim dogrudur?
bu guzel yazin icin tesekkur ederim.
pastebin güvenli bir site. başka bir browserdan deneyin veya hidemyass.com dan girin.
Silevet doğru.
mahkeme karariyla engelli. telefonla girince acilmiyor
SilSiteler engelli. Rica etsem ilgilenir misin?
YanıtlaSilÜçüncü değişken kullanmadan böyle mi ? Kısaca yazıcam mobildeyim de.
YanıtlaSilArmut=armut-elme
Elma=armut+elma
Kısaca yazarsam böyle. Ayrıca kod yazma hakkında hiçbir fikrim yok ama yazını okumak bana umut verdi. Kesinlikle bilgisayarı düşünüyorum artık. Her ne kadar cevabımın doğru olup olmadığını bilmesem de :D
Mantık doğru da tam olarak böyle değil. Sen elma = 5 armut = 10 diye düşünmüşsün ama ben onları kafadan attım. armut 8 elma 3 olursa patlar.
SilPardon. O zaman şöyle dersek ?
SilElma=a
Armut=b
Elma=elma+armut
Armut=elma-armut
Elma=elma-armut
doğru.
Silelmasayısı=armutsayısı+elmasayısı armutsayısı=elmasayısı-armutsayısı elmasayısı=elmasayısı-armutsayısı deneyelim elmasayısı=3 armutsayısı=8 3+8=11 11-8=3 11-3=8
YanıtlaSildoğru
SilElma=elma-elma
YanıtlaSilArmut=armut-armut
Aynı soru olduğundan elma sayısı armut sayısının tuttuğu değeri, armut sayısıda elma sayısının tuttuğu değeri tutmuş olur.
Bende bilgisayar mühendisliği istiyorum çevremden ne kadar ehe format atıcaksın yorumu alsamda bu yola başkoyucam umarım cevabımda doğrudur.
iyi de bunu yaparsan ikisi de 0 olur?
Silint elmeSayısı = 5
YanıtlaSilint armut sayısı = 10
int meyveSayısı = elmaSayısı + armutSayısı
elmaSayısı = meyveSayısı - elmaSayısı
armutSayısı = meyveSayısı - armutSayısı
olabilirmiydi hocam ?
olabilirdi fakat 3 değişken olmuş. 3 değişken olursa yine aynı kapıya çıkar toplama çarpmaya gerek olmaz çünkü her halükarda 3.değişken hafızada yer kaplıyor. önemli olan 2 değişkende çözmek.
SilMF4 1248. oldum. Büyük ihtimalle Bilkent Bilgisayarı yazacağım. Cope ile alakalı bilgi verebilir misin? İngilizcem pek iyi değil. Çalışmak için neler önerirsin?
YanıtlaSilBu arada
armutSayısı=elmaSayısı-armutSayısı
elmaSayısı=elmaSayısı-armutSayısı
armutSayısı=elmaSayısı+armutSayısı
Cope çok zor bir sınav değil. Hazırlıkta iyi çalışırsanız seviyenize göre ya yarım senede ya bir senede geçersiniz. Ya da direkt atlarsınız.
SilCevap doğru.
Merhaba, daha 2.sınıfa gidiyormuşsun sanırım ama bir soru sormak istiyorum, Bu bölüm için gittiğin üniversite okadar önemli değil diyorlar. Sen ne düşünüyorsun bu konuda ? Böyle düşünen insanların çokluğu benim hedefimi ilk 5000'den ilk 20.000'e çekmeyi başardı . YTÜ yeter diyorum şuan. Düşüncelerini öğrenebilir miyim ?
YanıtlaSilGittiğin üniversite önemli, işe girerken 1-0 öne geçirir. Büyük şirketlere çok başvuru olur, onların da cvlere bakarak eleme yapması gerekir. Bu elemeyi üniversite üzerinden yapma durumları var, herkesin tek tek naptığına bakmayabilirler.
SilGerçekten çok yararlı ve bilgilendirici bir yazı,teşekkürler.Ben araştırmayı,öğrenmeyi seven, meraklı,kolay pes etmeyen biriyim.Geçen sene mühendisliklerle alakalı bir kampa katılmıştım.Her mühendislikle ilgili çalışmalar yapmıştık.O yüzden az da olsa bir bilgim var mühendisliklerle alakalı ve en çok bilgisayar mühendisliği çalışmasında yaptığım oyun beni mutlu etmişti.Sizin de yazınızda bahsettiğiniz çalışmanın ürününü görme durumu.O zamandan beri bilgisayar mühendisliği istiyorum.Ancak bilgisayar hakkında pek bir bilgim yok.Bu bölümü okumak isteyenlerin bilgisayar ilgisi ve bilgisi var gibi geliyor fazlasıyla.O yüzden bilgisayar mühendisliğine gittiğimde öğrenme,araştırma isteğime rağmen çoğu kişiden geri kalacakmışım gibi bir his var.Sizce öğrenmeye meraklı ama bilgisayar hakkında pek de bilgisi olmayan birinin bilgisayar mühendisliği okuması ne kadar doğru?
YanıtlaSilGelmeden önce benim de bilgim yoktu. O androide multiplayer risk yazan arkadaşların da yoktu.
SilBen bilgisayar mühendisliği okumamı doğru buluyorum, ösym bana bu hakkı tanıyor :)
cevap:
YanıtlaSilarmut=armut+elma
elma=armut-elma
armut=armut-elma
bilgisayarda daha önce kod yazmakla falan uğraşmadım aslında daha önce pek ilgimi de çekmiyordu ama bu yıl biraz araştırdıktan ve bilgisayarla neler yapılabileceğini farkettikten sonra odtü bilgisayar için çalıştım (geçen yıllarda biraz tembel bir öğrenciydim ve bir daha hayatım boyunca tembellik yapmak istemiyorum) ve odtü, itüye göre sıralamam gerilerde kaldı. Bir yıl daha sizce odtü için çalışmalı mıyım yoksa hacettepe bilgisayarı mı tercih etmeleiyim. Hacettepe teknik bir ünüversite olmamasına rağmen bilgisayar mühendisliğinde eğitimi nasıl ? sektörde ne kadar aranan elaman konumundalar yardımcı olur musunuz ?
Tekniğe bakmaz o iş. Açıkçası cevabı bilmiyorum, o okullar kalitesinde olacağını sanmam. Hocalar pek ilgilenmiyormuş diye duydum. İyi çalışan Havelsana filan girebilir herhalde, bunu araştır. Ben ikinci seneye kalmazdım uğraşmaya değmez ama sen bilirsin. Bilkent CTIS de düşünebilirsin bu arada.
SilÜçüncü değişkensiz çözmüştüm ben de, senin çözümünü görünce bayağı bozuldum üçüncü değişken hiç aklıma gelmemişti :D Sanırım ben de Bilkent Bilgisayara geliyorum yurt bursu hakkında bir sorum var aradaki farkı ödeyerek karyolalı odalara ya da tek kişilik odalara geçebiliyor muyuz? :)
YanıtlaSilKaryolalı için fark yok ama ilk dönem geçirmezler. Merkezdeki karyolalara geçmek için de ya 3.sınıf filan olacan ya da torpil yaptırcan. Tek kişi oda tuzlu yıllık 5000 tl.
SilJavadan nefret ederim.c++ gibisi yok bence :D bu arada azimli yazar,sana person of interest dizisini öneririm.dehşettir bilgisayarcı adam için
YanıtlaSilteşekkürler yaz okulu bitince izlerim
Silsana ulaşabileceğim adres varmı? Hayatım için öemli bişeyler sormam gerekecek.
YanıtlaSilBuradan veya mailden sor dolkrutos@gmail.com
Silhocam ben 14.521 oldum. 13500 ile alan tipa girme sansim zor. yeniden mi hazirlanayim? baska uni.ye gecip gecis mi yapayim?
YanıtlaSilBaşka tıp yaz? O sıra iyi bir sıra ben tekrar hazırlanmazdım o sırayla.
SilAbi aklımdaki tüm soru işaretlerini giderdi. Harika ve uzun bir yazı.
YanıtlaSilLise 1 i bitirdim her hafta yeni bir basit program yapmaktayım ve hobi olarak yapıyorum. İlerideki hedefim bilgisayar mühendisi olmak. Bu yazı aklımdaki soru işaretlerini kaldırdı.
Eğitimim olmadığı için Google'lu etkin şekilde kullanmaktayım ama bulamadığım bazı kaynaklar var bunları direk size sorabilir miyim?
Benim de yapacağım google taramasından başka bir şey olmayacak. Kafamda kaynak listesi yok yani. Kendin bulmayı dene. İltifatların için teşekkürler.
Silint elmaSayısı;
YanıtlaSilint armutSayısı;
elmaSayısı = elmaSayısı + (armutSayısı-elmaSayısı)
armutSayısı = armutSayısı - (armutSayısı-elmaSayısı)
sizce bilgisyar mühendisliğinde üniversitenin en büyük avantajı nedir yani MF-4 te100 bine giren bir öğrenci için herhangi bir üniversitede okunabilir mi ?
YanıtlaSilbüyük şirketler 100 binle alan üniversiteyi sallamayabilir.
Silİngilizce için ne öneriyorsun?
YanıtlaSilTuğrul sen yazıyor muydun ya :D Vallahi süper yazmışın okudum hepsini.
YanıtlaSilEyvallah kardeşim.
SilDüz lise mezunu %50 bursla bilgisayar mühendisliğini kazanan biri sence bu bölümü rahat okuyabilir mi
YanıtlaSilHayır, çok çalışması gerek, nereden mezun olursa olsun.
SilBilgisayarın b sini bilmeyen biri okuyabilir mi bu bölümü
YanıtlaSilEvet
SilBeni meslekten soğuttun ben bilgisayarla haşır neşir olan bir adamdım ne bunlar intler.elma sayısı falan feci.derecede.karışık geldi. Okumakla uğraşamadım.bile ki anadol lisesine giden adamım kıt kafalı biri de değilim cidden çok karışık.işler.şimdi ne yapıcam.bilmiyorum. Ağlaycak gibi hissediyorum :(
YanıtlaSilMerhaba bu yazdıklarınızın beni biraz.meslekten soğuttuğunu söyleyebilirim. Ben bilgisayarla haşır neşir olan bir insanım fakat anlattığınız formüller.bana çok karışık geldi hiçbirini nerdeyse anlamadım. Hayalimdeki meslekti ağlayacak gibi oldum
YanıtlaSilYukarıdakiyle aynı kişisin sanırım toplu cevap veriyorum. Hayır anlattığım formüller karışık filan değil. İlkinde anlamadıysan ikinci defa oku. Üniversitede bu bir saatin konusu ve bu kadar basit anlatmıyorlar orada durum daha feci. "Okumakla uğraşamadım" komik bir laf ve neden yazının karışık geldiğini özetliyor. Okumazsan karışık gelir tabii. Mühendislik bölümü yazarsan derslerden kalmamak için zorla uğraşacaksın okumakla.
SilBilgisayar mühendisliği için bilgisayarla haşır neşir olmak yetmiyor/gerekmiyor. Torrentten nasıl oyun indirirsin diye sormuyorlar.
Birinci.yorumda.biraz duygusallığa vurduğumdan tam.olarak doğru yazamamışım. Okumakla uğraştım okudum ama bir yerden sonra hiçbir şey anlamamaya başlayınca bırakmak zorunda kaldım. Belki sınavdan sonra fikrim değişir ama şu anlık.başka bir.mühendislik yazmayı düşünüyorum sizce se doğru olmaz mı? Teşekkürler
SilBütün mühendislikler zordur. Sınavdan sonra yazmayı düşündüklerinin ne yaptığını etraflıca araştırırsın, introduction/giriş seviyesindeki derslerine bakarsın ona göre karar verirsin.
SilYok zaten zor olması önemli kavrıyorsam ve yaptıklarını da seversem sıkıntı yok. Tekrardan teşekkür ederim.
YanıtlaSilHocam 12. Sınıfım. Bilkent yazmayı düsünüyorum. 1 yıl yurtdışında kaldığım için ingilizcem gayet iyi. 15 yaşında basit kodlar yazabiliyordum ama derslerden dolayı bıraktım ve unuttum. Mac OS X ve diger isletim sistemlerini 8 yaşından beri kullanıyorum. Yaz tatilinde tekrar kod yazmaya başlamayı düşünüyorum neler yapmalıyım?
YanıtlaSilAndroid uygulaması veya website geliştirmeden birisini seç, hangisinde hayalin varsa. İkisinde de de yoksa önce javaya sonra androide başla.
YanıtlaSilmühendisliklerle alakalı bir kampa katılan, her mühendislikle ilgili çalışmalar yapan arkadaş acaba gittiği kampın adı neydi, hangi şehirde biraz bilgi verebilir mi, gerçi biraz geç yazdım sanırım ama olsun :d azimli yazar sen bu tür kamplar biliyor musun her mühendisliği yakından incelemek istiyorum biraz kararsızım da :/
YanıtlaSilKampa gitmene gerek yok. İnternetten çalış. Malesef bilmiyorum arkadaş hangi kampa gitti. Ben linux yaz kampına gittim daha önce de pek işime yaramadı.
YanıtlaSilYazına kesinlikle bayıldım.Ben meslek lisesinde okudum bu alanı ve bu özelliklerin biri bile olmadan yazılımcı-bilgisayar mühendisi olunmayacağını öğrendim.Belirttiğin gibi bir şeyler ortaya koymak harika bir duygu ki projenin sorumluluğunu sen üstlenmişsin o notu sen aldın sayılır.Yazında belirttiğin her şeyi birebir yaşadığım için gerçekleri olduğu gibi yansıtmanı çok beğendim.
YanıtlaSilNedensiz bir şekilde anlatılanlar hoşuma gitti. Ama 40 yıl düşünsem bile üçüncü değişkeni akıl edemezdim. Direkt üçüncü değişken kullanmadan ikinci sorduğunuz şekilde çözdüm. Ama bu çarpanlara ayırma bilmeyen birinin tam kare yapmak için her iki tarafa bir şeyler eklemesi gibi bir şey sanırım. Alışınca bu tarz şeyleri akıl edebileceğimi düşünüyorum :)
YanıtlaSilyıl 2020 üniversiteyi bitirmişsindir ama bu yazının bana çok yararlı olduğunu söylemek istiyorum bulmacalarla fazla uğraşmadım ama emek verilmiş ve zekice hazırlanmış oldukları belli ama yazının geri kalanı bence daha önemli ve yararlıydı felan filan teşekkür ederim emeğine sağlık yazılım veya bilgisayar okucayacağım inşallah ama 30 bin derece yaptım kötü üni olcak yapcak bişe yok
YanıtlaSilarmutSayısı = armutSayısı + elmaSayısı
YanıtlaSilelmaSayısı = armutSayısı - elmaSayısı
armutSayısı = armutSayısı - elmaSayısı
yorumları okumadan direkt gelip yazdım.