Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 4 - İşlemcinin Anatomisi

Öncelikle iyi bayramlar.

Aslında bu yazıda algoritmaları anlatacaktım fakat en düşük seviyede programlamanın nasıl bir şey olduğunu anlarsanız sonraki yazıyı daha rahat anlarsınız diye düşündüm, o yüzden 2. sınıfın 2. dönemine atlıyorum şimdi.

CS224 Computer Organization (Bilgisayar Mimarisi)

Bu derste işlemcinin int elmaSayısı = 10'u nasıl işlediği anlatılır özetle. 

Assembly Dili

Önce hoca bir giriş yapar, adam gibi bilgisayar mühendisi olmak istiyorsanız işlemcinin donanımın nasıl çalıştığını bileceksiniz der. Haklıdır.

Bilgisayarın tabanında 0 ve 1'ler vardır demiştik, aynı şekilde programlama dili de 0 ve 1'ler den oluşur hesapta. 0 ve 1'lerden oluşan dil en sade dildir, işlemci tarafından direkt okunabilir. Buna machine code denir. Halbuki siz java'da int elmaSayısı = 10; yazınca bilgisayarınızda yüklü java programı bunu machine code'a çevirip öyle okunur. Machine code bilgisayardan bilgisayara farklılık gösterir, o yüzden sizin bilgisayarınızda oluşturulan machine code'u başka bilgisayarda çalışmaz. Bu yüzden her bilgisayarın içinde java programı bulunmak zorundadır ki java dilinde yazılmış dosyalar çalışsın. O yüzden zırt pırt java kur uyarısı gelir.

int elmaSayısı = 10; aslında tek bir machine code ifadesine karşılık gelmemektedir. Birden fazla machine code ifadesi bulunur. Bu machine codeları kafadan okuyup yazmak zordur ve yapana da deli denir. Machine code ifadelerle birebir eşleşen dile assembly dili denir.

Bu derste MIPS isimli CPU'ya has dil öğretilir ama burada öğrendiklerinizi başka CPU'ların dilinde de kullanabilirsiniz. MIPS öğretilmesinin sebebi de dersin okutulduğu kitaptaki örneklerin MIPS'te yazılmış olmasıdır diyebiliriz. Önceki bilgiyi pekiştirirsek, MIPS işlemcili bir bilgisayarda MIPS kodu yazmakla aynı bilgisayarda java kodu yazmak aynı şeydir. Fark şu: MIPS yazarken kafayı yersiniz.

MIPS isimli işlemcinin içinde bir yerlerde 32 tane "Register" isimli hafıza birimi bulunur. Register'ın yapısını anlatmamıştım ama ne olduğunu söylemiştim. Yapısını soyutlayın gitsin, önemli değil. Bir register CPU'nun dizaynına göre bit tutar, 32 bit bilgisayarda 32 bit yani 32/8 = 4 byte (1 integer kadar) tutar. Yeni 64 bit bilgisayarlarda 8 byte tutar. 

MIPS isimli işlemcide 32 tane register vardır. Bunlar asıl bilgiyi tutmak için değil de geçici işlemler için kullanılır. Örneğin 1. register "0" sayısı için ayrılmıştır registerdır, ismi de zero'dur. $t0 - $t7 geçici değerler içindir. (t for temporary) Diğerlerinin de isimleri farklı farklıdır ve farklı görevler için kullanılır (fonksiyondan dönen registerı, fonksiyona verilen argümanlar için ayrı register vs. vs.)

(Asıl bilgiyi tutan hafıza birimleri Cache (İşlemcinin içindeki hafıza birimi), RAM ve harddisktir. İşlemcinin hangi sırayla bilgi çekeceğini sonra anlatacağım.)

Burada uzun uzun bu dili anlatmaya gerek yok. Merak eden MIPS'ı googlelasın.

Ben int elmaSayısı = 5; ifadesinin MIPS versiyonunu yazayım size.

Örnek buradan çalıntı

# da not işareti, yani okuyan insan için yazılmış. java'da bu // idi.

Not: Bilgisayarın en küçük işlem birimi byte demiştim hani, bir işlemcinin en küçük işlem birimine de word denir. İşlemciden işlemciye fark etmekle MIPS işlemcisinde 1 word 4 bytetır. Yani hafızadan en az bir word çekebilirsiniz, bir byte çekmek isterseniz yanında 3 byte bonus gelir. Bir tam sayının 4 byte olduğunu söylemiştik, e mantıklı o zaman.

li = load immediate = soldaki registera direkt bi sayı (immediate demişler buna) koy
sw = store word = soldaki registerın içindekilerini sağdaki değişkene ata ve hafızaya at.
Yukarıdakilere "instruction" denir.

example:
 .data                   # Bu "beyler burada değişken tanımlayacağım" demek.
elmaS: .word   # elmaS değişkenini (wordunu)tanımladım, içine önce 10 koydum.

 .text                   # bu da "beyler kodu yazıyorum sıkı durun." demek
__start: 
 li $t1, 5    #  $t1 = 5   ("load immediate")
 sw $t1, elmaS #  register $t1'dekileri elmaS'a at ve hafızaya depola yani :  var1 = $t1
 done               # assembly'im bitti
Burada uzun uzun diğer instructionları anlatacak halim yok tabii. Buradan çıkarmanız gereken iki sonuç var:

1- int elmaSayısı = 5 aslında o kadar basit değil.
2- tek satır olan iki kod aynı basitlikte değil.

Örneğin yukarıdaki örnekte önce bir registera 5 sayısını yükleyip ondan sonra o sayıyı hafıya atmak zorunda kaldık. İşlemci iki kez çalıştı. Bu mantıkla int elmaSayısınınKaresi = elmaSayısı * elmaSayısı yapsaydık önce elmaSayısını memoryden çekip $t1'e koyacaktık. Ondan sonra $t1 ile yine $t1'i çarpma instructionıyla çarpacaktık ve çıkan sonucu $t2'e koyacaktık. Buradan da bir işlem geldi. En son olarak $t2'yi elmaSayısınınKaresi değişkenine sw kullanarak atacaktık. Etti üç. Demek ki int ElmaSayısınınKaresi işlemi çok işlemci yakan bir işlemmiş.

Bu örnek kolaydı da, daha karmaşık kodlarda assembly okuyucu gibi düşünmek gerekiyor, işler karışıyor. Bu arada instruction ezberlemeye gerek yok çünkü bu dersin sınavları kitap açık yapılır.

Assembly dili özetle böyle bir şey. 

İşlemci Nasıl Çalışır?

Bu dil öğrenildikten sonra bu dildeki bir instructionın işlemcide nasıl çalışılacağı anlatılır.

Şöyle bir şeydir:


Durun! Hemen korkup ekranı kapatmayın! Parça parça anlatınca anlaşılacak.

Öncelikle şunu söyleyeyim, işlemci bir anda çalışmaz, adım adım çalışır. (MIPS işlemcisinin beş adımı var ama günümüzdeki işlemciler yirmi beş tane falan olabilir.) Her adımın süresi aynıdır ve bu süre de en yavaş adım tarafından belirlenir. Yani en yavaş adım atıyorum 50 pikosaniyede çalışıyorsa tüm adımlar 50 pikosaniyede çalışır ki en yavaş adım geride kalmasın. (1 saniye = 10^12 pikosaniye)

Yukarıda gördüğünüz yeşil şeritler register, o adım bitene kadar çıkan değerleri tutar. Yani atıyorum Insturction Fetch adımından 5 ve 10 değerleri çıktı, diğerleri de çalışmayı bitirene kadar o IF/ID registerı 5 ve 10'u tutar sonra bu değerleri sonraki adıma paslar.

Üstteki örnekteki li $t1, 5 instructionını kullanarak anlatayım. Yani işlemci $t1 registerına 5 koyacak.

Intruction Fetch:

En soldaki "Address" registerında sıradaki instructionın (bu durumda li $t1, 5'in) adresi bulunur. Bu address Instruction Memory dediğimiz kodumuz yer aldığı hafızaya girer, Memory adresi okur ve o adreste tutulan instructionı sıradaki adıma gönderir. Bu arada adres "Adder" yardımıyla artırılır ki işlemci bir daha çalıştığında sıradaki adres memory'e yüklensin böylece sıradaki instruction işlensin. (Gereksiz ek bilgi: bazı durumlarda, örneğin if-else ve looplarda, işlemcinin hemen altındaki satırın değil başka bir satırı işlemesi gerekir. En soldaki "Adder"dan çıkan kabloyu takip ederseniz göreceksiniz ki bir MUX'a bağlanıyor. MUX seçiyor sıradaki işlemi mi okutayım başka işlemimi. Olay bu.)

Instruction Decode, Registration Fetch:

Memoryden li, $t1 ve 5 bilgileri çıktı. $t1 registerın adresi yani kaçıncı register olduğu, bu registerlar derneğine gidiyor yani registerlara "Ben $t1 adresindeki registera yazı yazacam ha!" bilgisi gidiyor. Aynı zamanda 5 sayısı imm olarak çıkıyor. Burada bir sıkıntı var o da şu, 5 sayısı direkt olarak instructionın içinde. Yani instruction aslında 1 word = 4 byte = 32 bitten oluşuyor ya, bunun 5 tanesinde $t1 adresi tutuluyor (Çünkü 32 register var, 2^5 = 32) atıyorum 16'sında ise 5 sayısı tutuluyor. Halbuki bir tam sayı = 4 byte = 32 bit. Yukarıdaki "SignExtend" de bu sayıyı 32 bite çeviriyor.

Yukarı baka baka şaşı olmayın diye resmi tekrar koyuyorum:



Execute

Burada normalde toplama çıkarma yapacaktı ALU abi ama toplama çıkarma yapacak bir şey yok. ALU'ya 5 sayısı girer ve aynen çıkar. $t1'dekiyle 5 toplasaydık ikisini ALU'ya sokar ALU'ya da toplama yap derdik.

(Aradaki Zero? neydi unuttum)

Memory

Burada da hafızayla ilgili işleri yapıyor. Hafızaya koyacaksa "Memory"e adres ve değer giriyor. Yok hafızadan çekecekse adresi giriyor, Memory'den de değer çıkıyor. 

Writeback:

Duruma göre hafızadan çıkan değer registerlara geri yazılıyor. WB Data'dan çıkan oku takip edin.

İşlemci özetle böyle çalışıyor. Tabii her şeyi söylemedim, yoksa bu yazı uçar gider. Ama şu an bildikleriniz yanlış değil. Ve işlemci hakkında genel kültür edinmiş oldunuz.

Pipelining

Pipeline boru hattı demek. Bildiğiniz gibi boruda su küp küp akmaz!! Su akarken arkadan da su gelir, ta ki akacak su kalmayana kadar!!! Yukarıda da aynı mantık. Sadece bir tane instructionın sırayla Fetch, Decode vs. diye beş adımdan geçmesini bekleyip sonra en son yeni instructionı gönderirsek hapı yutarız.

Onun yerine ilk gönderdiğimiz instruction Fetch'ten Decode'a geçtiğimiz anda yani instructionı göndeririz.

Bir adım 100 pikosaniye olsa, tek tek gönderdiğimizde bir instruction için 5*100 = 500 pikosaniye harcarız. Bu on instruction için 5000 pikosaniye eder.

Halbuki on instructionda ilk instruction beşinci adıma geldiğinde tüm adımlar çalışır hale gelir. İşlemci toplam 14 kere aktif olur, 14*100 = 1400 pikosaniyede biter iş. 1400 <<<< 5000 pikosaniye. Kod bir anda 3.5 kat hızlandı. 

Fakat bu da sıkıntılar çıkarır. Sonradan gelen instruction, önceki instructionın registerına salça olabilir. Veya birinci instruction $t1 registerına yazarken ikinci instruction $t1 registerına okuyorsa, birinci instruction daha $t1'e yazamadan öbürü okumuş olur, sıkıntı çıkar. Bu tip sıkıntılara çeşitli çözümler var, derste de genel olarak bunlar anlatılır. En basit örnek şu: bilgisayarınızdaki java programı (derleyici denir buna aslında) java kodunu 1'lere 0'lara dökerken bu örnekteki gibi aynı register peşpeşe yazılıp okunuyorsa önce kodların arasında başka kodlar sokuşturmaya çalışır, beceremezse araya "nop" diye boş kodlar koyup işlemciyi oyalar. 

Hafıza

Üç tip hafıza tipi var diyebiliriz. Birincisi cache, işlemci en yakın olanı dolayısıyla en hızlı çalışanıdır. Oldukça küçüktür, fazla bir şey depolayamaz. Çok pahalıdır. RAM Cache'dan yavaştır ama yine de hızlıdır. Elektrik gidince içindeki bilgiler de gider. Harddisk içlerinden en yavaşıdır. Harddisk adı üzerinde disktir, dönerek çalışır, bilgisayardan vızzzzz sesini duyarsanız bilin ki harddisk çalışıyordur. Dolayısıyla çok da yavaştır. Dünyaları içine alabilir.

İşlemci hafızadan bir şey çekeceği zaman önce cache'e bakar. Cache'de yoksa (buna cache miss) denir anlar ki iş uzun sürecek. O ara memory'i kapatır başka instructionlara, yani aynı anda farklı instructionlar için bir şeyler çekemez. Yine bulamazsa harddiske gider.

Bilgilerin cache'te nasıl depolanacağı önemlidir çünkü çok vakit kazandırır. Bilgiler cache'ten tane tane değil bloklar halinde çekilir. Örneğin x marka cache'tan bir word (4 byte) bilgi çekilirse ondan hemen sonra gelen 3 word (12 byte) da peşinden gelir. Atıyorum bir dizinin ilk dört elemanını kullanan bir kod yazdık, cache'in bu özelliği sayesinde dizi[0] diyip ilk elemanı hafızadan istediğimiz anda diğer üç elemanı da istemiş oluruz ve zaman kazanırız.

Cache'te yer sınırlı olduğundan belli bir kurala göre cache kendi içeriğini çeker. En son kullanılanı sil veya en başta kullanılıp bir daha el sürülmeyenleri sil gibi kurallar vardır. Cache'in hangi kuralda çalıştığını bilip ona göre kod yazmak önemlidir. Örneğin atıyorum cache'imiz sadece 3 dizi/array elemanını depolayabiliyor, sonra en eski kullanılandan itibaren başlıyor. 

Bu durumda şu kodu yazmak büyük mallık olur:

int elmalar = new int[4];
int döngüSayısı = 100; // yüz kere dönsün
int gereksizSayı = 0;

while (döngüSayısı > 0) {
   gereksizSayı = elmalar[0];
   gereksizSayı = elmalar[1];
   gereksizSayı = elmalar[2];
   gereksizSayı = elmalar[3];

}

Bu durumda şu olacak, cache'e önce elmalar[0], sonra elmalar[1], sonra elmalar[2] depolanacak. Sonra cache'te yer kalmadığı için cache elmalar[0]'ı silip yerine elmalar[3]'ü yazacak. Ardından elmalar[0] için cache'e bakacak, baktı yok, elmalar[1]'i silip yerine elmalar[0]'ı yazacak. Bu böyle gidecek. Hiçbir zaman cache'i kullanamayacağız. 

Hafıza kısmında özet olarak bu ve bunun gibi mühendislik problemleri anlatılır. Çeşitli cache tipleri verilir ve verilen kodda cache'e ne olur o sorulur, sıkıntıları gidermek için çözüm istenir.

I/O Cihazları

Bu kısım "İşlemcinin her bir şeyini anlattık, bari bunu da anlatalım." diye anlatılır, mühendislik yoktur, tamamen ezberdir ve sıkıcıdır. Tam da havaların ısındığı zamana denk geldiği için pek dinlenemez de. Ben kitaptaki örneği değiştirip yazmıştım. Anlatmaya gerek yok, unuttum zaten. Tek hatırladığım, mouse takılan yere karşılık gelen bir değişken var, onun sayılarını falan değiştiriyoruz.

Tebrikler! Artık işlemci ne biliyorsunuz! 

Bu derste de haftalık lablar olur ve öğrencilerin anasını ağlatır. MIPS'le java kodu, Verilogla pipeline yazmak oldukça zordur. Ayrıca FPGA ile tetris yazmak gibi zor projeleri vardır. Ben aldığımda ders partnerliydi, partnerim çok zekiydi ve verilogları takır takır yapıyordu, ben MIPS varsa yapıyordum yoksa yatıyordum çünkü önceki dönem partnerim tüm labları arkadaşına yaptırdığı için Verilog öğrenememiştim. Sonra bireysel oldu iyice zorlaştı. Alacaklara geçmiş olsun.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 3 - 0 ve 1'lerden Bilgisayara

2. Sınıf 1. Dönem

Müfredatı hatırlayalım.

HIST200 History of Turkey (Tarih işte) : Sanırım Türk üniversitelerinde olması zorunlu tarih dersinin Bilkent ayağıdır, yalnız yabancı öğrencilere de zorunlu bu :P Bilkent farklı işler bunu, tarih araştırması falan yaptırır, birileriyle röportaj yaparsın, röportaj yapacağın kişi çok yaşlıysa proje bitene kadar ölmesin diye dua edersin vs. En sonunda da makale yazarsın. Geçiyorum.

HUM111 Cultures Civilizations and Ideas I (Kültürler, Medeniyetler ve Fikirler): Kısaca Humanities diye tabir edilen ve biraz insanlık öğrenin diye verilen bu derste medeniyet tarihi okutulur ve medeniyetten kasıt Batı medeniyetidir. Amerika'da okutuluyor biz de okutalım mantığıyla verilse de çok güzel bilgiler edinebilirsiniz bu dersten. Gılgamış destanıyla (semavi dinlerle alakalı çıkarımlar yapabilirsiniz bu destan) başlar, İlyada ile devam eder (güzel ahlaklı "iyi" ile yiğit, korkusuz "iyi" arasındaki farkı çatışmayı görürsünüz.) En güzeli ise Platon'un "Devlet"idir, Platon çürümüş demokrasinin yerine alternatif yönetim biçimi sunar. Hitabı iyi ve espirili bir hocayla keyifli geçer bu ders.

PHYS101 General Physics I (Kuvvet ve Hareket): Bildiğimiz lise fiziği. Sıkıcıdır. Tüm mühendislik ve temel bilim bölümleriyle beraber alırsınız.

CS223 Digital Design

0 ve 1'lerden bilgisayara evrimi anlatır. Nasıl evriliyor uzun uzun anlatalım.

Abstraction (Soyutlama)

Bu dersin en başında "Abstraction"  nedir ondan bahsedilir. Abstraction şudur, siz bir konuda uzman olursunuz ama uzman olduğunuz bazı alt kısımları bilmenize gerek yok. Örneğin mutfakta kek yapmakta anneninizi düşünün. Un, yumurta ve sütü karıştırıp fırınlıyıp kek yapıyor. Anneniz kek yapmayı "biliyor." Anneniz buğday toplamayı biliyor mu? Hayır. Un elemeyi? Hayır. Tavuk besliyor mu? Hayır. İnek sağıyor mu? Hayır. Demek ki anneniz kek yapmayı o kadar da bilmiyormuş. "Ama kek yapmak için bunları bilmeye gerek yok ki hazır alabilirsin." de diyebilirsin. Fakat ya bunları da bilseydi daha güzel kek yapabilirdi dersem?

Bu dersin başında soyutlama anlatılır ki aslında elektroniğin alanına giren bu derste bilgisayarcılar kendini elektronikçi sanıp elektronlarla transistörlerle kafayı yemesin, bir yazılımcı için gerekenleri bilsin, gerisini soyutlasın. Hayatımda sadece bir kere özel ders verdim onda da bunun dersini verdim, çocuk ıncık cıncık sorular sormaya başladığında mecbur kalıp "O kadarı önemli değil elektronikçilerin işi." diyordum. Çünkü öyle.

İkilik Tabanda İşlemler

Dersi anlatmadan önce bunları da hatırlatmakta fayda var, bu derste işlemler ikilik tabandadır. Yani 1 + 1 = 10. Ona göre okuyun :D

Bunu ve 2 tabanlı işlemleri derste de anlatırlar. Bir tane 1 veya 0'a bit denir. 1 byte sekiz tane bitten oluşur ve en küçük işlem biridir, bir bilgisayar bir byte'ın altında işlem yapamaz. 1 kilobyte 2^10 byte yani 1024 byte'dır ama kolaylık olsun diye 1000 byte denir. 1 megabyte 2^20 bytetır. Böyle gider bu. İndirme yaparken 8 megabit internetle 1024 mb/s'nin üzerine pek çıkamazsınız çünkü 8 megabit internet aslında 1 megabyte internettir. İnternet hızı eskiden bit olarak ölçüldüğü için hızlar hala megabit olarak söyleniyor, tabii bu da TTnet'in işine geliyor :P

0 ve pozitif tam sayı tutmak kolaydır, üç basamaklı bir sayınız varsa 2^3 = 8 yani 1'den 7'ye kadar sayıları tutabilirsiniz. Peki negatif tam sayıları tutarken ne yapacağız? Bir çözüm şu, ilk basamağı rezervetmek, ilk basamak 1'se negatif değilse pozitif diye okumak. Böylece 000-011 yani 0'dan 3'e kadar ve 100-111 yani -0'dan (???) -3'e kadar toplam 7 sayı tutabiliriz. -0 da bonus gelir. Tabii açgözlü amarigalılar "Ben o 0'ı da kullandırırım." der ve ortaya "Two's Complement Number" diye bir şey çıkar. Bir sayının negatifini bulmak için onun tüm bitlerini tersine çevirir sonra sayıya bir ekleriz.

Örneğin 10 tabanındaki 1 = 001. -1'i bulmak için önce bunu 110 yapar sonra çıkan sayıya 1 ekleriz 111 olur. Sonra bunu on tabanına çevirmek için ilk basamağı -'le çarparız gerisi normal. Yani -2^2 + 2^1 + 2^0 = -4 + 2 + 1 = -1 olur. Bu işlemi istediğimiz kadar basamakta sayıya uygulayabiliriz. Hepsinde de 111111111.....1 -1'e denk gelir.

Böylece -4'ten +3'e kadarki sayıları iki tabanında üç basamaklı sayıda gösteriyor olabildik.

Birinci yazıda gördüğümüz int elmaSayısı'nda int aslında 4 byte yani 4*8=32 basamaklıdır. 31 basamağı normal sayı için, ilk basamak negatif için (yukarıdaki metodla tabii). Yani intle gösterebileceğimiz maksimum sayılar -2^31...0....2^+31 -1 'dir.

Ondalık sayılar için de metot var da anlatması uzun şimdi, geçiyorum. (Virgülden sonra kaç basamak olduğunu belirliyorsunuz ona göre x*2^-1 + x*2^-2 diye gidiyor)

0 ve 1

Peki elektrik nasıl üretiyor bu 0 ve 1'leri. Çok basit: devre elemanına yüksek voltaj gelirse devre elemanı onu 1 diye okur, düşük gelirse 0 diye.
Elektrik sinyalleri devamlıdır, 4.8V, 3.7V, 0.9V, 1.2V diye gider, 1 ve 0 diye sinyal üretilmez. Fakat okuyan bunları "Ayrık" algılar ve 0 ile 1'lere çevirir. Buna dijital sinyal denir. Az önceki örnekte de devre elemanı 1 1 0 0 diye okur ve bilgisayara bu iletilir.

Peki ne yapacağız bu 1 1 0 0'larla. 1 ve 0'ları "Logic Gate" dediğimiz mantık kapılarına (diyorum işte İngilizce kullanmak daha iyi diye) sokup mantıklı bir şeyler elde edebiliriz. İki değişken var diyelim X ve Y. Bu durumda X'den 1 içeren dijital sinyal, Y'den 0 içeren dijital sinyal geldiği anda X AND Y'den 0 dijital sinyali yürür. (Mantık kapıları transistörlerle üretilir, bunun da nasıl oluşturulduğu anlatılır ama sonra bir daha kullanılmaz, soyutlanır.)



AND, NOT, OR (ve, değili, veya) diye sizin de bildiğiniz mantık kapıları yanı sıra XOR (gelen sinyallerin toplamı tek sayıysa doğru çift sayıysa yanlış, örneğin 1 XOR 0 = 1), XNOR, NAND gibi abidik gubidik kapılar mevcut.

MUX diye bir kapı vardır örneğin, 3 tane değişken girer, bir tanesi hangi değişkenin çıkacağını söyler.

Decoder vardır, iki değişken girer, dört değişken çıkarır. 00 girerse 0000, 01 0010, 10 0100, 11 1000 anlaşıldı herhalde.

Bu son iki kapı da and ve orların birleşimidir aslında.

Sınavlarda da bunları çizersiniz evet. Tablo falan yaparsınız.

Karışık Mantık Soruları

Derste lisede gördüğünüz karışık mantık problemleri verilir ve sadeleştirmeniz istenir. Bunun için sonradan "Karnaugh Map" diye bir teknik öğretirler. Mülakatlar dışında bir önemi olmadığı için geçiyorum.

Finite State Machine (Sonlu-durum Makineler)

Sonlu durumu olan makinelerdir, Allah'ım zekâ fışkırıyor benden.

Yukarıdaki mantık kapılarını kullanarak makine yaparsınız özetle. Mantığı şudur: bir makinemiz var bunun durumları var. Mutlu, kızgın, azgın vs. Değişkenlerimiz var. Bu değişkenlerin değerine göre başka durumlara geçiş yapabilir, bir durumda beklerken veya tam geçiş yaparken de "output" basar. Anlaşılmadı, resimli anlatalım.


Bir oyun geliştirme sitesinden aldığım yapay zekanın makinesi bu şekilde.

Çizen adam başlangıcı koymamış ama hadi diyelim başlangıç durumu "Wander" olsun yani yapay zeka "Kendince Takıl" modunda. Sonra yapay zekaya yön verecek değişken "Player is near" yani "Oyuncu yakınında" değerini alıyor ve makine "Saldırı" moduna geçiyor, yapay zeka saldırıyor.

Bunu oluşturmak için "Durumların" tek tek mantık formüllerini yazıyoruz. Durumlar eşitliğin sol tarafında da sağ tarafında da olabiliyor.

Oyuncu değişkeni tanımlayalım, player is near olunca 1, player is out of sight (oyuncu etrafta değil) olursa 0 olsun.

Makinenin durumları da

Wander = 00
Attack = 01

(öbürlerini anlatmayacağım)

Durum1 = birler basamağındaki sayı.

(öbürlerini anlatacak olsam bir de Durum2 tanımlamam gerekirdi çünkü iki basamak var)

Durum1 0'sa Durum Wander olur, 1'se Attack olur.

Yukarıdaki şekilde Durum Wander'ı gösterirken input "Player is Near" gelirse Durum Attack'a dönüşüyor.

Yani Durum1 0 (WANDER) ve OYUNCU 1 (PLAYER IS NEAR) ise Durum1 1'e çevrilmeli.
Durum1 1 (ATTACK) ama OYUNCU 0 (PLAYER IS OUT OF SIGHT) ise Durum1 0'a çevrilmeli.

2 değişkenimiz var yani aslında 2*2 = 4 durumumuz var.

WANDER ve PLAYER IS OUT OF SIGHT olur ne olacak? Bunu yazmamışlar ama ne olacağı belli, WANDER olmaya devam edecek. (yapay zekanın havayı yumruklamasını istemiyorsanız tabii)

ATTACK ve PLAYER IS NEAR olursa ne olacak? Yapay zekanın İrlandalı boksçu gibi otele girip dinlenip sonra dövmeye devam etmesini istemiyorsanız bu da ATTACK kalmalı.

Mantık tablosu yapalım lisedeki gibi.


Eski Durum1
Oyuncu
Son Durum1
0
0
0
0
1
1
1
0
0
1
1
1

Bu durumda Durum1 ve Oyuncuyu AND kapısına sokup Durum1'e eşitlersek doğru sonucu alıyoruz ama Durum1 0 Oyuncu 1 olunca da Durum1 oluyor.

Yani formül

Durum1 = (Durum1 AND Oyuncu) OR (NOT Durum1 AND Oyuncu) oldu.

Burada Aynştaylığımızı konuşturup "İyi de eski durum ne olursa olsun Oyuncu 1 olunca Durum1 1, Oyuncu 0 olursa Durum1 0 oluyor." diyoruz.

Dolayısıyla durum formülümüz aslında:

Durum1 = Oyuncu oluyor.

Find Aid ve Evade'i kullansaydım daha eğlenceli bir formül bulabilirdim belki, böyle sıkıcı oldu :(

Bunu mantık kapısı çizerek falan yapabiliriz ama daha fazla uzatmaya gerek yok hiç.

Basit İşlemler

Bu and ve orlar birleşir bildiğimiz toplama işlemi yapmaya başlar. Örneğin buna Full Adder denir.


Burada A ve B toplayacağınız basamaktaki rakamlar, C komşudan gelen birlik, basamağa yazacağımız yeni sayı, Cout ise komşuya gidecek elde var bilmemne.

S = A XOR B XOR C. Hepsi 1 olursa 1 + 1 + 1 = 3 = 11. S'ye 1 yazarız ama elde var biri de doğru hesaplamamız gerekir.

Cout yani elde formülü ise (A AND B) OR (B AND C) OR (A AND C) olup yorumu çok basit, eğer herhangi iki 1 ise kesinlikle elde var deriz ve Cout'a 1 yazarız.

Diğer Basit İşlemler

Çarpma, bölme, çıkarma vs. hepsinin bir karşılığı bulunur. Bunların karşılıklarını öğrendikten belli bir süre sonra kutu çizim üzerine + koyup onları da soyutlamaya başlarsınız. Sonra ALU diye bir şeyle karşılaşırsınız (Arithmetic Logic Unit) bu ALU'da basit işlemlerin hepsi bulunur.



Bu ALU'da 8 tane işlem var, yani o işlemleri yapabilecek bir sürü mantık kapısı var içinde full adder dahil. Hangi işlemin yapılacağını OPCODE belirliyor. Sonra iki tane değişkeni sokup cevabı alıyorsunuz.

İşlemci

Çeşitli hafıza birimlerimiz var, uzun uzun yapısını anlatmaya gerek yok. Buna bir değişken veriyorsunuz, o değişkenden adresi okuyup değeri dönüyor. Tam nasıl çalıştığını "Computer Organization" dersini anlatırken söyleyeceğim.

Şimdi bir de hangi işlemi yapacağınızı söyleyen ve yine 0 ve 1'lerden oluşan "Programlama ifadeleri" miz var, bunu Control Unit dediğimiz şey okuyor ve ALU'ya ona göre OPCODE'u yolluyor, hafızanın neresinden (hangi adresten) çekileceğini de o belirliyor.

I/O yani Input / Output cihazları için arayüz var. Geçen yazıda "Interface"den bahsettiğim ya aynı o mantık. Control Unitimiz monitor.masmaviOl() fonksiyonunu çağırıyor, monitör olarak taktığımız şey her neyse Monitor interface'ini kullandığı için otomatikman masmaviOl() fonksiyonu tanıyıp kendi içinde çağırıyor ve ekranınız bir anda mavi ekran veriyor!

Tebrikler! Artık işlemcinin ne olduğunu biliyorsunuz! ALU, Memory, (ram ve harddisk değil) I/O Arayüzü ve Control Unit işlemciyi oluşturur!



Dersin haftalık labları olur ve bu lablarda yukarıda anlattığım şeyleri Verilog dilinde kodlarsınız. (Elektronikçiler aynı dersi alır ve VHDL dilinde kodlar.) Başlarda yaptıklarınızı simüle edersiniz, sonra FPGA adını verdiğimiz programlanabilir cihaza yazarsınız, isterseniz cihazın işlemcisini kendiniz kodlayabilirsiniz, şarkı besteleyip bölümünüzdeki kızlara (varsa tabii) serenad yapabilirsiniz. Şu tip karmaşık işlerle uğraşırsınız yani:


İlk sene sürekli "dokundurulan" Algoritmaları anlatacağım dördüncü yazıda görüşmek üzere.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 2 - Ayrık Matematik ve Ivır Zıvır

ENG 102 (İngilizce 2): ENG101 çok tutulunca devamının çekilmesine karar verilir ve ortaya bu ders çıkar. Bu ders öncekinden biraz daha hafiftir, yine dersteki kaynakları kullanırsınız ama bir de ek kaynak bulup ona göre "Research Paper" (makalenin daha kapsamlısı) yazarsınız. Bu kadar.

MATH 102 (Calculus II): Çift integral öğretilir, bilgisayar mühendisleri için gereksizdir geçiyorum.

TURK 102 (Türkçe II): Önceki Türkçe'nin aynısı.

MATH 132 Discrete Mathematics (Ayrık Matematik)

Ayrık'tan kasıt tam sayılardır, yani sayılar birbirinden ayrıdır, 1 ile 2 arasında kesin çizgiler bulunur. (Devamlı Matematik olsaydı bu olmazdı, 1'den sonra gelen sayı 1+x limit x 0'a giderken olurdu.) Bu temadaki konular dersinin hocasının kafasına göre verilir. Bize Graph Theory, Permütasyon, Kombinasyon, Tümevarım ve Coding Theory dersi verildi. Bu dersler Bilgisayar Biliminin "Teori" alt alanında çalışacaklar için elzem olup Google mülakatlarına girecekler için de hayati önem taşır. Ben pek beceremediğimden ikisini de atlamıştım. Bilgisayar olimpiyatlarına giren arkadaşlar iyi biliyorlardı.

Permütasyon ve kombinasyonu biliyorsunuz, tümevarım = ispat yöntemi, geçiyorum.

Coding Theory'de derste öğrendiğimiz ve şu an hatırladığım kısım şuydu, örneğin A noktasındasınız B noktasına tebrik kartı göndereceksiniz. "Ramazan Bayramınız Mübarek Olsun" yazdınız kartı attınız. İyi de ya yolda kartın üzerindeki yazılar silinirse ve yazı bir anda "Ayranınız Mübarek Olsun" olursa? Tabii gerçekte absürt oluyor ama dijital ortamda bu hata çok kötü sonuçlara gebe olabilir. Dolayısıyla bir çeşit şifre kullanarak mesajın doğru gidip gitmediğini test ediyoruz. En basit yöntem gönderilen sayının (sayı 0 ve 1'lerden oluşuyor) rakamları toplamının tek mi çift mi olduğu. Örneğin 10101 bu tek, sonuna bir de 1 ekleyip gönderiyoruz. 101011. Alan kişi bakıyor kendisine 11101 gelmiş ama rakamları toplamı tek. Mesajın bir tarafları oynamış, bana yeniden gönder diyor. Coding theory bu tip şifreleme işleriyle ilgileniyor işte. Bunu da detaylı olarak Kriptografi ve Bilgisayar Ağları dersine öğreniyorsunuz.

Graph Theory: Bu derste bir sürü hayali grafik türü ve bunların özellikleri ve buna bağlı problemler var, ilkokuldan beri hayali üçgenlerle dikdörtgenlerle uğraşırız ya burada da hayali ağaçlar, çemberler falan var. Grafikler noktalar ve onları birleştiren kenarlardan oluşuyor. Her hangi bir noktadan başlayıp kenarlar üzerinde gidip başladığınız noktaya dönemiyorsanız o grafik bir ağaçtır mesela. Geçebiliyorsanız içinde bir tane çember (circle) vardır. Örnek ağaç:


Kulağa oldukça tırıvırı gelen bu kavramlar karışık bilgisayar problemlerini kullanmakta kullanılır. Örneğin çok ünlü bir problem olan "Traveling Salesman Problem" yani Gezgin Satıcı problemi. Bu problemde gezgin satıcımızın gitmesi gereken şehirler ve bu şehirlerin arasındaki bağlantı ve bu bağlantıların uzunlukları bulunur. Problem kısaca en kısa yolu sorar. Bu problemi çözmek için önce şehirler nokta, aralardaki uzaklıklar ise kenar olacak şekilde grafik çıkarmak gerekir. Bu probleme bulunan çözümlerin çalışma hızı kestirilemediğinden (yani çözümün sonsuza kadar çalışma ihtimali olduğundan) kestirilsin diye grafik "Minimum Spanning Tree" isimli ağaç türüne çevrilir falan fisman. Sıkılmadıysanız ve bu tip problemlerle uğraşmayı seveceğinize inanıyorsanız bilgisayar mühendisliği çok güzel, gelsene. Sıkılanlar için (ben de sıkıldım) geçiyorum.

CS 102 Introduction to Programming and Algorithms II : 

Bu derste sırasıyla: Nesne Tabanlı Yazılım temel ögelerinden Inheritance (Miras) ve Interface (Arayüz), Grafik Arayüzü verilir. Algoritma ve veri yapılarına da şöyle bir dokundurulmaya devam ettirilir.

Inheritance

Geçen yazıda GidenAraba objesi oluşturmuştuk ya. Diyelim biz şimdi bir de GidenKırmızıAraba objesi oluşturmak istiyoruz ama zaten bu da bir tür GidenAraba oluşturacağı için her şeyi baştan yazmakla uğraşmıyoruz. Şöyle yaparız:

public class GidenKırmızıAraba extends GidenAraba {
    String renk = "Kırmızı";
}

Böyle yazınca GidenKırmızıAraba GidenAraba'nın tüm değişkenlerini, constructorlarını, fonksiyonlarını miras edinmiş olur.

Bunun güzel yanı şu, GidenAraba'nın fonksiyonlarını GidenKırmızıAraba'da hatta bir de GidenÖküzArabası objesi yaratırsak onda, kullanabiliriz.

int hız = GidenKırmızıAraba.tekerleklerinHızıToplamı();

veya

int hız = GidenÖküzArabası.tekerleklerinHızıToplamı();

yalnız bunu yapmak için objeyi

GidenKırmızıAraba yeniAraba = new GidenKırmızıAraba();

diye değil

GidenAraba yeniAraba = new GidenKırmızıAraba(),

diye oluşturmak gerek ki bilgisayar oluşturduğumuz objenin GidenAraba olduğunu anlayıp fonksiyonu kullanmamıza izin versin.

Interface

Interface bir fonksiyonlar listesidir. Evet bu kadar. Örnek interface:

interface GidenHerhangiBirşey {
    public void hızıNe();
    public void maksimumHızıNe();
}

Not: void boş dönmek yani bir şey dönmemek demek. Hatırlarsanız int döneceğimiz zaman oraya int yazardık.

Bu interface'i kullanan herhangi bir class bunu belirtmek için implements GidenHerhangiBirşey demelidir ve o fonksiyonları tanımlayıp içini doldurmalıdır.

Örneğin

public class GidenAraba implements GidenHerhangiBirşey {
     // blablabla
    public void hızıNe() {
        // asdadadasd
    }
    public void maksimumHızıNe() {
        // asdadadasd
    }
}

Bir çok öğrenci ilk bakışta niye böyle bir şey yaptığımızı anlayamaz çünkü görünen o ki interface'i ha yazmışsın ha yazmamışsın. Ama interface yine Nesne Tabanlı Yazılım'ın temel taşlarındandır. Örneğin ben mühendis olsam ve bir program yazacak olsam, bu programda olan bir değişiklik on tane farklı ekranı etkilese, şöyle yaparım; ekibime döner arkadaşlar bana on tane ekran yazın ama hepsi bu interface'deki fonksiyonları kullansın derim. Atıyorum doların değişimini kaydeden bir program yazıyorum, bu değişim 1. Televizyon ekranında altyazı geçiyorum, 2. Sitede yayımlanıyor, 3. Teletext'te (liseliler bilmez gerçi) yayınlanıyor. Interface kullanmasaydım ekibimdeki dingolar bu güncellemeyi nasıl yaptıklarına, hangi fonksiyon isimlerini kullandıklarına bakmam gerekirdi ama Interface kullanmışlarsa buna gerek yok.

interface Ekran{
    public void güncelle();
}

Benim kodum:
televizyonEkranı.güncelle();
site.güncelle();
teletext.güncelle();

Hatta bunu daha da abartabiliriz de çünkü Interface bize Inheritance imkanı sunar. Bir "Ekran" interface'i kullanan ekranlar derneği, aman şey dizisi yaratırız, oradan while döngüsüyle yardırırız.

Ekran[] ekranlar = {televizyonEkranı, site, teletext};

int güncellenenEkranlar = 0;
while (güncellenenEkranlar < ekranlar.length) {
    ekranlar[0].güncelle();
    güncellenenEkranlar++;
}

Not: ++ yapınca otomatik olarak sayıyı bir arttırır. yani güncellenenEkranlar 0 ise 1 olur.

GUI (Grafik Arayüzü)

Bu derste öğrenciler öğrendiklerini uygulayabilsinler diye proje yaptırırlar, tabii proje de güzel bir şey yapsınlar resimli mesimli olsun isterler, öğrenciler de nereden başlayacağını bilsin diye koca koca profesörler bir web tasarımcı edasıyla GUI anlatır. Avantajı ileride GUI'li iş yaparken mantığını kavramak kolay olur. Burada GUI anlatmanın bir yararı olmayacağı için geçiyorum. Zaten Javanın grafik kütüphanelerinin hiçbirinin yüzüne bir daha bakmadım :)

Recursion

Recursion çok zevkli ama hayli zordur. Farklı bir düşünme şekli gerektirir. Recursion sorusunu çözen veya çözemese bile problemin çözümünü gören bir bilgisayar mühendisi adayı keyif almıyorsa kariyerini bir daha gözden geçirmelidir. Biraz net konuştum ama bence öyle.

Recursion'ı en iyi linkteki ekşi sözlük yazarı anlatmış.

Geniş özet: Hani fonksiyonlara return diyip döneceğimiz şeyi yazıyorduk ya, istersek fonksiyonun kendisini de yazabiliyoruz.

public int naber(){
    return naber();
}

Böyle olunca fonksiyon sürekli kendini çağırıp duruyor ve belli bir süre sonra bilgisayarımız çöküyor, geçmiş olsun tamire vermeye gidin. Ben şu ana kadar altı bilgisayar harcadım recursion yüzünden.

Şaka şaka, program duruyor ve "Stack overflow!" diyor.

Recursion en güzel faktöriyel hesaplamakta kullanabiliriz.

public int faktöriyel (int sayı) {
   if (sayı == 1)
      return 1;
   else
      return sayı * faktöriyel (sayı - 1);
}

Yani şöyle oluyor, önce fonksyion verilen sayı 1 mi diye bakıyor, değilse o sayıyı alıyor ve bir eksiğinin faktöriyeliyle çarpıyor, tabii o faktöriyeli bulmak için bir daha fonksiyona sokuyor. 6 * 5! = 6 * 5 * 4! diye gidiyor.

Algoritmalar ve Veri Yapıları

Bu dönem de aslında ikinci sınıf konuları olan bu konulara dokundurma var, ikinci sınıfı anlatırken anlatacağım.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 1 - Temel Programlama

Bu yazımda bilgisayar mühendisliği eğitimi alırsanız neleri öğreneceğinizin kısa bir özetini geçeceğim. Yazmayı düşünüyorsanız en azından neyle karşılaşacağınızı bilin.

Oldukça kompakt bir bilgisayar mühendisliği anlatımı içermektedir bu yazı. Halihazırda okuyanlar da yararlanabilir.

Bizim okulun ders programından hareketle yazacağım ama her okulun müfredatı %80 aynıdır. Zaman olursa bir müfredat karşılaştırması da yaparım.

Müfredat

Bilgisayar mühendisliği dersi olmayan dersleri kısa geçiyorum.

Önemli not: Terimlerin Türkçelerini kullanmıyorum. Birinci nedeni: hangilerinin kullanıldığını bilmiyorum, ikincisi önem arzetmiyor, üçüncüsü garip duruyor ve gündelik kelimelerle karışıyor, İngilizcesi'ni kullanınca onun terim olduğunu hemen anlıyorsunuz. Yine de İngilizce Türkçe karışık kullanacağım işime geldiği gibi.

1. Sınıf 1. Dönem


ENG101 (İngilizce 101): Bu derste resmi bir dil kullanarak akademik makale yazmayı öğrenirsiniz. Kuralları basittir, kurallara uymayanlar ağır cezalandırılır. Okulun en zor derslerinden biridir ilginç olarak. Sadece derste okutulan kaynakları kullanmanıza izin vardır, dolayısıyla bu makaleleri iyi okuyup çıkarım yapabilmeniz gerekir ki makale yazabilesiniz.

TURK101 (Türkçe 101): Kitap okuyup blog yazısı yazarsınız bu derste özellikle. Bizim iki haftada bir kitap okumamız gerekiyordu, ben kitaplara bir göz atıp bir tema belirleyip yazıyordum.

MATH101 (Calculus): Türev integral

MBG110 (Biyoloji): Temel lise biyolojisi: hücrenin yapısı, bölümleri, bölünmesi, evrim (mutasyon, adaptasyon, doğal seleksiyon vs. Lisede adamakıllı eğitim verilmediği için evrim bunlardan bağımsız ayrı bir şeymiş gibi bir algı oluşuyor.) Bu dersin verilmesinin asıl nedeni ABET kriterlerine göre birkaç tane temel bilim dersi üniversitelerde okutulmalıdır. Bizim okulda diğer okullarının aksine Kimya gibi gereksiz bir ders yerine biyoloji seçmiştir. Biyoloji Bioinformatik gibi bilgisayar alt alanlarında çalışacakların işine yarayabilir. (Bu alt alanlarda aşırı bir Biyoloji bilgisi gerekmemektedir.)

CS101: Programlama ve Algoritmalara Giriş


Aslında bunu bu yazıda yazmıştım. Ama kısaca üzerinden geçeyim.

Bizim okulda Java, ODTÜ'de C, Singapur'da Python, herhangi bir dil kullanılarak öğrencilere temel programlama eğitimi verilir. Amaç dili öğretmek değildir. Dilin özelliklerinden de biraz bahsedilse de bu dersteki problemleri başka bir dili kullanarak da çözebilirsiniz.

Temel İşlemler

Önce şu öğretilir:

int elmaSayısı = 5.

Bu bir "assignment" (atama) ifadesidir. elmaSayısı diye bir değişken (variable, matematiktenin aynısı) yaratırsınız, bu değişken tam sayı yani integer tutacak dersiniz ve içine 5 sayısını koyarsınız. Artık bir yere elmaSayısı yazarsanız aslında elmaSayısı'nın tuttuğu değeri kullanmış olursunuz, bu durumda bu 5'tir. Örneğin int armutSayısı =  elmaSayısı + 5 derseniz armutSayısı 10 tutmuş olur.

Yarattığınız (daha doğrusu tanımladığınız) değişkenler sadece tek bir tip değer tutar, karakter derseniz karakter, kesirli sayı derseniz kesirli sayı. Bunun mantığını isterseniz kendiniz okuyabilirsiniz ama kesin olarak ikinci senede öğrenirsiniz.

Tabii sadece atama yok, toplama çıkarma felan da var.

int elmaSayısı = 5 + 103212231038103;

Bu durumda bilgisayar önce 5 ile o malum sayıyı toplar, sonra çıkan sayıyı elmaSayısına atar.

Sonra size "if-else" (eğer, şartlı ifade) ve loop (döngü) öğretirler.

if-else = Bu buysa bunu yap, yoksa bunu yap. Örnek: elma sayım 5 ise armut sayımı 10 yap.

int armutSayısı;
if (elmaSayısı == 5)
    armutSayısı = 10;
else
    armutSayısı = 2309138012;

elmaSayısı == 5 demek elmaSayısı'nın içinde 5 mi var? demek. 5 varsa true değerini döner, bu da 1,2, 5 gibi bir değerdir. yoksa false döner.

Canınız isterse içinde doğru veya yanlış tutan bir değişken de tanımlayabilirsiniz yani. Bu tip değere "Boolean" denir. (George Bool bulmuş bunu, kendi adını koymuş.)

boolean elmalarımÇürükmü = 5;

Not: Önce armutSayısı diye bir değişken tanımlamak gerekiyor. Bu değişkeni if-else'in içinde tanımlarsanız sadece if-else'in altında yaşar, dışında çalışmaz. Neden böyle olduğunu üçüncü sınıfta anlatıyorlar, ben de o zaman anlatayım. ;'nın mantığı da aynı şekilde üçüncü sınıfta.

loop = Bunu şu olana kadar tekrarla. Armut sayım 5'e düşene kadar armutlarımı azalt. while, for, do while loopları vardır javada. While'ı yazayım.

== eşit mi? demekti ya, != ise eşit değil mi? demek.

int armutSayısı = 10;
while (armutSayısı != 5)
  armutSayısı = armutSayısı - 1;

if-else ve while sadece doğru mu yanlış mı onu çek edebilir, eğer siz doğru mu yanlış mı sorusunu soran bir işlem koymazsanız parantez içine, bilgisayar da bunu "doğru herhalde bu" diye okur ve kafasına göre takılır. Dolayısıyla siz if (elmaSayısı = 5) yazarsanız bilgisayar bunu elmaSayısı'nı 5 yap sonra takıl diye algılar. Hoca da tüm cevabınızı çizer. Dersten kalırsınız.

Diziler:

Dizi yani "array" (bazı dillerde list) demek önceden belirlenmiş sayıda değeri sırayla tutan eleman.

Örneğin ben 5 tane sayı tutacağım bir yerde, dizi yaratıyorum. Java'da şöyle yaratılır.

int[] kiminKaçElmasıVar = {2, 5, 10}

int[] demek int dizisi demek.

Böylelikle üç kişinin kaç elması olduğunu kiminKaçElmasıVar dizisinde tuttum. Birinci kişinin 2, ikinci kişinin 5 tane var.

Programlama dillerinin bir çoğunda saymaya 0'dan başlanır. Birinci kişinin elmaSayısına erişmek için kiminKaçElmasıVar[0] yazmalısınız.

int ahmetinElmalar = kiminKaçElmasıVar[0] derseniz ahmetinElmalar diye bir değişken yaratıp bu değişkenin içinde önceki yarattığımız dizinin birinci elemanının elma sayısını tutmuş olursunuz.

Eğer bir dizi yaratmak istiyorsanız ama sayıları önceden belirlemek istemiyorsanız şöyle bir ifade kullanmanız gerek:

int[] elmaSayısı = new int[3];

new nereden çıktı? Az sonra.

Buraya kadar anlattığım kısmı anladıysanız tebrikler! Basit mülakat sorularını çözebilecek hale geldiniz. Hatta buradan problem çözebilirsiniz bile. (Tabii daha fazla "incelik" öğrenmeniz gerek ben şu an kısa özet geçiyorum)

Fonksiyonlar:

Fonksiyonlar, (javacılar method der buna) bildiğimiz Matematikteki fonksiyonlardır. Bütün kodu bir sayfaya yazmak istemediğinizde veya başkasının kodunu kullanacağınız zaman veya daha başka zamanlar kullanırsınız. f(x) = x + 5. Diye bir fonksiyon yaratırsınız. f(elmaSayısı) diye yazarsanız aslında elmaSayısı + 5 yazmış olursunuz.

Java'da bir method şu şekilde yazılır.

public static int karesiNe (int değişken) {
    return değişken * değişken;
}

* çarpma işlemidir.

Bu fonksiyon verilen değişkenin karesini alıp geri verir.

int fonksiyonun döneceği değer. { ve } fonksiyonun tanımını çevreler ki kod başka şeylerle karışmasın. return ise geri verme ifadesi. "Üstte naparsan yap, bana fonksiyon ne çıkaracak onu söyle." demek yani.

Ayrıca fonksiyonların içini bilmeden de kullanabilirsiniz ki zaten genelde öyle yapacaksınız. Bir çok yazılımcı bir problem karşısında ne yapacağını bilir ama yapacağı şeyi sıfırdan yazmaz. Örneğin benim elimde bir sürü rakam var bunları sıralayacağım, bunları sıralamanın on farklı şekli var ben Quicksort yönteminin en iyi olduğunu biliyorum çünkü en süper benim, ama gidip Quicksort yazmama gerek yok. Javada hazır olarak yazılmıştır zaten, o yazılan fonksiyonu kullanırım olur biter. Quicksort nedir sonra anlatacağım.

Nesne Yönelimli Programlama

Buraya kadar her şey çok güzeldi ama nesne yönelimli programlama konsepti ve genel olarak "Obje" konsepti işleri biraz karıştırıyor.

Şimdi; şu ana kadar öğrendiğimiz tip değerler "Primitive" yani ilkel değerlerdi. Ben int elmaSayısı dediğim zaman bilgisayar kendi içinde belirlediği büyüklükte bir tam sayı kadar hafıza açar, 32 bit bilgisayarda bu değer iki milyar. elmaSayısı'nın içine - iki milyar ile + iki milyar arasında herhangi bir sayı yerleştirebiliriz.

Fakat ya istediğimiz büyüklükte sayı dizileri ve diğer ıvırzıvırlar yaratmak istiyorsak? İşte şimdi devreye objeler giriyor.

Objeler olmasaydı herhalde şöyle şöyle aptal aptal şeylerle uğraşırdık:

ikiTaneİnt elmaSayıları = 1, 2

üçTaneİnt elmaSayıları = 1,2, 5

dokuzYüzOnBinTaneİnt elmaSayıları = mavi ekran

Bu olmasın diye boyutunu önceden tanımlayabildiğiniz yani önceden ne tuttuğunu belirleyebildiğiniz objeler ortaya çıkmış.

örneğin ben bir GidenAraba objesi tanımlıyorum. Giden arabanın hızı var, maksimum hızı var bir de tekerlek sayısı var, malım tekerlek sayısını tutacağım. Önce böyle bir objeyi yaratacak taslak / şablon / blueprint / model bilmemne isminde bir şey tanımlıyoruz ki bu tanımladığımız şeyle bir sürü GidenAraba objesi tanımlayabilelim. Buna javada "Class" (sınıf) deniyor. Böyle tanımlanıyor:

Not: // demek not düşmek demek, // 'dan sonra aynı satırda gelen kısım bilgisayar tarafından okunmaz, siz okursunuz sadece.

public class GidenAraba {
   final int TEKERLEK_SAYISI = 4; // Ya ne olacağdı?
   int arabanınHızı = 60;
   int arabanınMaksimumHızı = 180;
   int bagajdakiElmaSayısı = 10; // O elma yenecek arkadaş :D
}

final int ne? Final demek sabit (örneğin fizikteki Coulomb sabiti) demek. Bir arabanın tekerlek sayısı 4 olduğundan (pırpır şirketinde yazılımcı değilseniz tabii) ve değişmeyeceğinden ben bunu "Sabit" olarak belirledim, programın bir yerinde değişirse bilgisayar hata verir bak burada sabiti değiştirmeye çalışmışın ayıp oluyo diye. Bu tür kod yazma incelikleri mevcut evet.

Şimdi ne yaptık biz? İçinde dört tane tam sayı tutan bir obje yapmış olduk.

Artık dilediğimiz gibi GidenAraba objesi yaratıp istediğimiz gibi kullanabiliriz.

GidenAraba ahmetinArabası = new GidenAraba()

Ama bu yaptığımız şey hiçbir işe yaramaz. Neden? Çünkü bütün yarattığımız gidenArabalar aynı olur.

O yüzden "constructor" denen özel fonksiyonları tanımlamamız gerekir ki değişik GidenArabalar yaratabilelim.

Bu da fonksiyon yapmanın aynısı, sadece return yok, bir şey return edilmiyor çünkü.

public GidenAraba (int gidenArabanınHızı) {
   arabanınHızı = gidenArabanınHızı;
}

Parantez içine daha fazla değişken de koyabiliriz ama üşendim şimdi.

Yaptığımız Class son olarak böyle oldu:

public class GidenAraba {
   final int TEKERLEK_SAYISI = 4; // Ya ne olacağdı?
   int arabanınHızı = 60;
   int arabanınMaksimumHızı = 180;
   int bagajdakiElmaSayısı = 10; // O elma yenecek arkadaş :D

  public GidenAraba (int gidenArabanınHızı) {
      arabanınHızı = gidenArabanınHızı;
  }

}

Böyle bir tane araba oluşturalım.

GidenAraba ahmetinArabası = new GidenAraba(80);

Böylelikle 80 km/h'de giden bir arabamız oldu. (Gerçi km/h mi m/s mi onu belirlemedik henüz.)

İstersek objenin içindeki değişkenlere erişebiliriz.

int ahmetinElmaSayısı = ahmetinArabası.bagajdakiElmaSayısı;

Şimdi buradaki new "Yeni bir araba yap." demek. İsteseydim Ahmet'in arabasını ara ara kullanan Mehmet için de bir GidenAraba objesi tanımlardım ama Mehmet'in arabasıyla Ahmet'in arabası aynı olduğu için Mehmet'in arabası değişkeni de aynı objeyi tutmuş olurdu.

GidenAraba mehmetinArabası = ahmetinArabası

İşte şimdi başka bir zurnanın zırt dediği yere geldik, birinci sınıflar için zor olan bir konsepte.

int elmaSayısı = 5 dediğim zaman elmaSayısı direkt olarak 5 sayısını tutarken ahmetinArabası, ahmetinArabasını tutmaz, ahmetinArabası objesinin adresini tutar. Böylece o obje birden fazla şekilde çağrılacağı zaman tekrar tekrar yeni obje (bu durumda yeni araba) yaratmamıza gerek kalmaz.

Yani şu:

GidenAraba ahmetinArabası = new GidenAraba(80);
GidenAraba mehmetinArabası = ahmetinArabası;
GidenAraba mehmetinAbisininArabası = ahmetinArabası; // mehmet abisi ahmet
GidenAraba ronaldonunYüzüneBakmayacağıDandikAraba = ahmetinArabası;

Bu durumda elimizde sadece tek bir araba ve o arabaya "işaret eden" dört tane değişken olur. Hepsinin içinde de o arabanın adresi yazılıdır.

Bu durumda araba değişirse ona işaret eden tüm değişkenler de aynı değişikliği tanımış olur.

Örneğin biz ahmetinArabası.arabanınHızı = 0; dedik araba durdu.
Bu durumda mehmetinArabası.arabanınHızı da 0 olur.

Eğer ortalık malı olmuş bu arabayı programdan silersek tüm değişkenler arabasız kalır.

Eğer ikinci araba yapıp Mehmet'e vermek istersek özel işlemler yapmalıyız. Gereksiz yere yazıyı uzatacağı ve başka programlama dillerinde farklılık göstereceği için bunu anlatmayacağım. Merak eden java için .clone() metodunu araştırsın.

Classlara özel fonksiyonlar koyduğumuz gibi normal fonksiyonlar da koyabiliyoruz! Örneğin bir GidenAraba'nın tekerleklerinin hızının toplamını hesaplayayım ve söyleyeyim. Niye bunu yapıyorum, çünkü hava çok sıcak burada ve canım sıkıldı.

public int tekerleklerinHızıToplamı() {
    return arabanınHızı * TEKERLEK_SAYISI;
}

Class'ın son hali: 

public class GidenAraba {
   final int TEKERLEK_SAYISI = 4; // Ya ne olacağdı?
   int arabanınHızı = 60;
   int arabanınMaksimumHızı = 180;
   int bagajdakiElmaSayısı = 10; // O elma yenecek arkadaş :D

  public GidenAraba (int gidenArabanınHızı) {
      arabanınHızı = gidenArabanınHızı;
  }

  public int tekerleklerinHızıToplamı() {
      return arabanınHızı * TEKERLEK_SAYISI;
  }

}

Bu fonksiyon her obje için farklı olduğu için anca objenin yanında . koyup çağırabiliriz.

int hız = ahmetinArabası.tekerleklerinHızıToplamı();

Önceki fonksiyondaki static neydi? Bir Class'ın içine fonksiyon yazarsak o fonksiyon dinamik olur ve her obje için farklı sonuçlar döner, ne de olsa ahmetinArabasıyla benim arabam aynı hızda gitmiyor olabilir. static dersek objeye bağlı olmaz özetle. (Class'a bağlı olup classın default değerlerini kullanır.)

Peki public ne? Eğer değişken ve fonksiyonları public değil private tanımlarsak o tanımadığımız şeye sadece yaşadığı yerden erişebiliriz. Örneğin private int bagajdakiElmaSayısı deseydik sonra başka yerde ahmetinArabaSayısı.bagajdakiElmaSayısı diyemezdik, kod hata verirdi. Bu kısımlar çok önemli değil.

Javada Arrayler yani diziler de objedir!  Yani

int[] elmaSayıları = new int[5] derseniz içinde 5 elma sayısı olan bir obje yaratmış olursunuz ayrıca bu arrayin uzunluğu içine "length" değişkeninde kaydolur, yani elmaSayıları.length derseniz 5 sayısını elde ederseniz.

Java'da String dediğimiz harf bütünlüğü de objedir!

String selam = "Naberlen" yazarsanız içinde 8 tane karakter olan bir objeniz olmuş olur. (Bu ifade aslında String selam = new String("Naberlen") dir ama java yapımcıları bunu kısaltmıştır haliyle) selam içinde 8 tane karakter olan objenin adresini tutar.

String selam = "Naber" yazarsanız içinde "Naberlen" yazan obje silinir, yeni obje oluşturulur. Yani ahmetinAraba gider ronaldonunAraba gelir farzı misal. Stringler bu özelliğinden dolayı zor yazılı sorularına gebedir, iyi çalışılması gerekir.

Nesne yönelimli programlar yazılım mühendisliğinin temelidir. Büyük şirketlerin büyük kodu olur ve görev paylaşımı düzenli olmak zorundadır dolayısıyla nesne yönetimi iyi yapılmalıdır. Her şeyi birbirine karıştıran dandik mühendisler bu yüzden tercih edilmez. Üniversitelerde "Nesne Yönelimli Yazılım Mühendisliği" dersi okutulur ki öğrenciler nesne yönetiminin tekniklerini öğrensin ve işlerinde uygulasın. (Bu ders üçüncü sınıfta, daha oraya geleceğiz.)

Programlamayı sadece simulasyon için kullanacak Elektronikçi, Makineci ve Endüstriciler hatta tüm bölümler buraya kadar anlattığım kısmın eğitimini alır (ve iyi öğrenmek zorundadır!) fakat sonra nesne yönetimi kısmına devam etmez.

Algoritmalar

Bu giriş dersinde bir de algoritmalardan bahsedilir ama detaylı bilgi verilmez o yüzden sonra bahsedeceğim.

Tebrikler birinci sınıf birinci dönemi bitirdiniz! Sadece bunları bilirseniz dersten pek iyi alamazsınız, ucundan geçersiniz. Ama bu anlattıklarım çok iyi bir giriştir.

Birinci sınıf ikinci dönemde görüşmek üzere, tabii ben bu detayda yazmaya devam ederseniz hepsi yetişecek mi bilmiyorum.

Canı Sıkılanlara Yazılıma Başlama Metodları

Oldukça kısa olan bu yazımda yazın canınız sıkılıyorsa nasıl yazılıma başlayabileceğinizden bahsedeceğim.

1- İlkokul / Lisedeyim, canım sıkılıyor, oyun yapayım ben.

RPG Maker kullanabilirsiniz. RPG Rol yapma oyunudur, bir karakteriniz olur, ortaçağ konseptinde bir tür olaylar olur siz de hikayeyi yaşayarak çözmeye çalışırsınız. Örnek oyunlar: Final Fantasy, Breath of Fire.

Benim üniversiteden önce yazılım adına yaptığım tek şey bu oldu. Ben bu tip oyunları sevdiğim için eğlenceliydi. Hiç tutorial okumadan karıştıra karıştıra oyun yapmıştım, sizin için de bu mümkün. Ama çok zamanda az şey öğrenirsiniz. Fakat if-else, loop, variable tipi şeyler olduğundan ve kullanmak mecburiyetinizde olduğundan başarılı.

2- RPG Maker ne ya? Biraz daha az çocukça şeyler lütfen!


3- Bunun üç boyutlusu yok mu?

Unreal Engine 4. Kodlama yok bunda, kodlama mantığı var. Yalnız çok fazla tutorial okumanız gerekecek. Unity 3D daha basit ama kodlama gerektiriyor, boşverin.

4- Ben kodlamanın nasıl bir şey olduğunu tatmak istiyorum, zorluklarını da görmek istiyorum.

Efenim öncelikle İngilizce öğrenin. 

İngilizce hiç bilmiyorsanız, bu tavsiyemi ciddiye alın, yazılımı falan boş verin. 

Biraz biliyorsanız: Udacity'den bu dersi alın, altyazı var, anlamadığınız yerde sözlüğe bakın. (Bu dersin içeriği Bilkentteki Programlamaya Giriş dersiyle aynıdır) if-else ve loop kısmını bitirince buradan soru çözün. 

5- Bir şeyler yaratmak istiyorum ben!

Buna genelde milletin cevabı Visual Basic olurdu da, ama çok eskidi boşverin. 

Sıfırdan websitesi yapmayı öğrenin. Önce "Front-end" denilen websitenin kullanıcı tarafında çalışan ve kullanıcıya gösterilen tarafını öğrenin. (örneğin Facebook'u açınca mavi şeritli beyaz sayfa gözükür ya bunun kodu sizin bilgisayarında "Mavi şerit at" diye çalışır ha işte o) Sırayla HTML, CSS, Javascript öğreneceksiniz bunun için. Ondan sonra sırada Back-end var yani sitenin sahibinin bilgisayarında (sunucu, server) çalışan kısım, bunun için de PHP ve SQL öğrenmelisiniz ama o taraf biraz karışık, hemen başlamayın.

(Ben sadece anahtar kelimeleri veriyorum, dolu kaynak var, en iyi kaynak diye bir şey yok, kendiniz araştırın.)

6- Ben kodlamayı biraz biliyorum aslında, bir şeyler yaratmak istiyorum!

Websitesi yaptınız mı? İsterseniz Android programlama öğrenebilirsiniz. 

7- Kodlamayı öğrendim, gerçek hayatta işime yarayacak şekilde devam ettirmek istiyorum.

Buradan problem çözün. Google mülakatlarında bunları soruyorlar. 


Bilgisayar Mühendisliği Tercihi Yaparken Dikkat Edilmesi Gerekenler



Bilkent'ten mezun oldum, şimdi ne oldu, başkaları ne yapıyor, siz ne yapacaksınız, neye göre tercih yapacaksınız, onları yazdım bu yazıda.

Öncelikle şu yazıları mutlaka okuyunuz. Bu yazı aşağıdaki yazıların devamı niteliğindedir.

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

Somut Örneklerle Bilgisayar Mühendisliği

Bilgisayar Mühendisinin Yazılımcıdan Farkı Ne? Okul Neden Şart?

Şimdi arkadaşlar eskiden bu tip yazıları kafamdaki bilgilerle tak tak yazamıyordum, oturup milletin facebook linkedin profiline falan girip analiz kasmam gerekiyordu. Mezun oldum ve benimle beraber yüz küsür arkadaşım mezun oldu, onların da neler yaptığı görebiliyorum. Üzerine mailime iş ilanları gelmeye başladı. Bu bilgiler ışığında merak ettiklerinizi cevaplandıracağım.

Genel bilgi vereyim: Bilkent'te tam burslu öğrenciyim. Tahminim okula MF4 puanımla ilk 10'da ya da 20'de girmişimdir. (Bunun pek bir işe yaramadığını kısa zamanda anladım.) 3.91 ortalamayla doktora başvurusu yapıp ocakta EPFL'ye kabul aldım. Sonra bir dönem tatil yaptım. Okulu da ilk 12. bitirdim 3.74 ortalamayla.

Yeni Mezunlar Şu An Ne Yapıyor?

Benim önümdeki 11 kişinin listesi bir yerde yazılı değil ama neredeyse hepsini tanıyorum. Neredeyse hepsi doktoraya başvurdu. Zaten yüksek not ortalaması yüksek lisans / doktora alımlarında etkiliydi daha çok, o yüzden aslında çalışkan ve iyi programcı olan bir çok kişi belirli bir süre sonra kendini fazla kasmamaya başladı, benim son dönemimde yaptığım gibi. (Burada aklınıza az çalışmak veya çalışmamak gelmesin. Az çalışınca veya çalışmayınca dersten geçemezsiniz üniversitede. Çok çalışmamak diyeyim.)

Bu bahsettiğim not ortalaması iyi öğrencilerin birçoğu yurt dışına doktoraya gitti. Doktoraya gidilen üniversiteler: Cornell, University of Washington, Brown, EPFL x 3, University Of Mary Land, College Park x2, Michigan State University x2. Suudi Arabistan'da doğup büyümüş şimdi ailesiyle Ankara'da yaşayan Suriyeli bir arkadaşım vardı, o sadece Kanada'ya başvurdu ileride vatandaşlık alırım diye, şimdi Simon Fraser üniversitesine burslu mastıra gitmekte. Galatasaray lisesi mezunu bir arkadaşım da programcılığı yemiş bitirmiş bir eleman olduğu için hali hazırda zaten para kazanıyordu, akademisyen olmak da istemediği için hiç doktoraya başvurmadı, EPFL'ye mastıra geliyor. Not ortalaması 3.90 küsür olan bir arkadaşım da Münih Tekniğe mastıra gitti. Not ortalaması benden yüksek bir arkadaşım Amerika'da sağlam yerlere başvurdu ama kabul alamadı, Bilkent'te mastır yapıp bir daha deniyeyim dedi, aynı not ortalamasına sahip başka bir arkadaşım tehlikeyi fark etti hiç kasmadı kendini direkt mastıra geçti. Bir arkadaşım da bir hocanın yanında biraz gönüllü çalışıp iyi referans alayım, hem de TOEFL GRE'ye okuldan sonra kasayım diye başvuru yapmadı.

MIT, Stanford, Carnegie Mellon ben de isterdim birileri gitsin ama yok, sadece EE'de ve IE'de Stanford'a giden birer kişi var, IE'ci olan kız kontenjanından gitti bence :P. (Yine de bir dönemde bu kadar çok kişinin doktoraya gidiyor olması alışılageldik bir şey değil, en başarılı dönemlerden biri olmalı. Not ortalamaları da normalden yüksek, iki sene önce mezun olan arkadaşım ben 3.56 ile 8. ydim diyor. (Ben 3.85 ile 8.ydim geçen dönem))

İşe gideceklere gelince. Birçok kişiye sordum nereye gitçen vs. Çoğu başvurmamış bile. Hele bir üniversite bitsin de derdinde herkes. Dolayısıyla şunlar şuraya gitti diye listeleyemeyeceğim. Google'a staja kabul alan iki arkadaşım oldu. Biri yukarıda bahsettiğim Suriyeli arkadaş, onu işe almadılar. Öbürü olimpiyatçıydı bayağı zeki bi elemandı. Onu işe aldılar. Gerçi gidemiyor adam son döneminde bir dersten kalmış devamsızlıktan (oha) Bir yaz okulu yapıp öyle gidecek. Bir de daha önce bahsettiğim lisede Android programlayan bir çocuk vardı, o da birkaç kez Kanada'ya gitti staja. Bunlar dışında öyle yurtdışında staj ve iş kovalayan birine rastlamadım ne yalan söyleyeyim, yurt dışına gidenler genelde üniversite stajına gitti birilerinin referansıyla. İstanbul'daki yazılım şirketlerinde, teknokentlerde, TUBİTAK, ASELSAN, HAVELSAN, TAİ tipi yerlerde takıldı millet.

Muhtemelen birçok orta-iyi öğrenci de henüz ne yapacağına karar veremediğinden mastıra (genelde Bilkent'te, olmazsa ODTÜ'de) başlayacaktır.

Boğaziçi, Bilkent, Koç, Odtü, Sabancı, İTÜ ???

Dört sene önce bu altılamda (?) ben de kaldım. Hepsi hakkında yazılıp çizilenleri okudum. Bu seçimi yaparken kullanılabilecek iki kriter kategorisi var.

1- Üniversitenin yeri, çevresi, öğrenci sayısı ve profili, yaşam koşulları, Erasmus için anlaşmalı okulları gibi uzaktan bakan birinin ölçebileceği kriterler

2- Üniversitedeki eğitimin kalitesi ve mezuniyetten sonra öğrenciden bağımsız olarak öğrenciye katacakları.

Öncelikle ben kendim nasıl karar verdiğimi anlatayım:
Koç'a girebilmek için zaten LYS sonucu açıklandığı anda yirmi dört saat içinde özel burs programına başvurmalıydım, başvurmadım ben de.

Sonra düz mantık düşündüm, dedim kim ne derse desin 2. kategorideki kriterleri kendim kavrayıp seçim yapamam, yapmam da saçma olur. Yani şimdi adam diyor ODTÜ'den çıkan mühendis olarak Boğaziçi'nden çıkan yönetici olur Boğaziçi yönetici olur da Boğaziçi mühendis yetiştirmez de bıdı bıdı. Yani ben LYS'de derece yapmış biri olacağım da ne kadar çabalarsam çabalayayım mühendis olamayacak mıyım, olur mu öyle bir şey? Bunu geçtim, ODTÜ'yle Bilkent'in eğitim kalitesini nasıl karşılaştıracaksın? ODTÜ'nün isminde teknik var ODTÜ Bilkent'i döver demek Supernatural dizisinin isminde Super var, Breaking Bad'de Bad var, Supernatural daha iyi demek eşdeğer. Hangisinin Google'a daha fazla adam gönderdiğine bakarak seçim yapmak tamamen saçmalık, bu okullara giren insanlar robot değil çünkü, eğitimin tamamını da Google'dan almıyorlar.

Hadi diyelim bir şekilde bu "eğitim kalitesi"nde farka işaret eden şeyler yakaladın. Bunları nasıl birinci kategorideki kriterlerle karşılaştıracaksın?

Benim mantığım şu şekildeydi; Bilkent bana ücretsiz iki kişilik oda ve ayda 600 lira burs verecek. ODTÜ bir şey vermeyecek, ayrıca muhtemelen diğer devlet yurtlarında olduğu gibi kaç kişilik odada kalacağım şansa (ve kaç yıldır yurtta kaldığıma) bağlı olacak. 600 + 2 kişilik yurt > 0. ODTÜ'nün sunduğu avantaj kampüste yeme içmenin daha ucuz olması ve ODTÜ'nün daha merkezi yerde olmasıydı. (Kampüsü görünce fark ettim ki aynı zamanda bisiklet binmek için dümdüz olması.) Benim için 600 + 2 kişilik yurtu bu avantajlar yenemezdi.

Bu durumda arayı kapatması için Bilkent'in "eğitim kalitesi" olarak çok çok kötü olması, mezunlarının çok çok başarısız olması gerekiyordu ama durum bunu göstermiyordu. Hangisi üstün olursa olsun arada burun farkı vardı.

Bu mantıkla ben Bilkent'i ODTÜ'nün önüne koydum. Yine Bilkent İTÜ karşılaştırmasında fazla düşünmeden rahat okumayı ve nispeten iyi bir İngilizce eğitim almayı (gerçi bu kulaktan dolma bir bilgiydi) kriter olarak kullanarak Bilkent > İTÜ dedim. Sabancı da felaket bir konuma sahipti ve burs falan vermiyordu, Bilkent'ten herhangi bir artısı yok gibi gözüküyordu, burssuz oranı fazlaydı. Doğrusu çok da düşünüp araştırmadım ama. Direkt Bilkent olsun dedim.

Geriye Boğaziçi ve Bilkent karşılaştırması kaldı. 1. kategorideki kriterlerde başa baş gibilerdi, Bilkent daha rahat bir hayat sunuyordu ama benim ailem Bursa Orhangazi'de yaşıyordu, abim de İstanbul'da. Bursa Orhangazi'den Ankara'ya gitmek 7 saat sürer ve günde iki sefer falan vardır. Halbuki İstanbul Yenikapıya deniz otobüsüyle gidip oradan metroyla yardırmak mümkün, şimdi bir de Osmangazi köprüsü yapılınca iyice kısaldı. Bir de benim bilgisayar mühendisliği yazma amacım kendi projelerimi gerçekleştirmek, girişimci olmak idi ve Boğaziçi buna daha uygun gözüküyordu (Şimdi bu saçma bir mantık gibi geliyor bana, girişimci adam her yerde proje yapmaya başlayabilir bence.) Biraz da "Boğaziçi olayım havalı olsun." diyip de Boğaziçini yazdım.

Kazanamadım. Projeleri ise startup kurma yoluyla değil akademide daha az para kazanarak ama daha risksiz olarak gerçekleştirmeyi, ayrıca kısa zamanda daha fazla ve değişik projelerle uğraşabilmeyi seçtim.

Neymiş Bu Eğitim Kalitesi 

Dört yıl eğitimin sonunda bir de değişim tecrübesiyle nihayet eğitim kalitesi okuldan okula nasıl fark eder çözdüm. Öncelikle söyleyeyim, bilgisayar mühendisliği müfredatı (en azından temel dersler) her okulda hemen hemen aynıdır. Önceki yazımda bundan bahsetmiştim. Batı medeniyetinin empoze ettiği ve tüm dünyada kabul görmüş bir standart var artık. Okullarımız da "Bizim sizden farkımız yok, saygın ve prestijli kurumlarız." demek için bu standarda uyuyor. Yukarıdaki altı kurum özellikle dikkat ediyor buna.

Peki okuldan okula değişen ne? Ankara Fen lisesiyle bizim mahalledeki düz lise aynı müfredatı okutuyor ama tabii eğitim kalitesi aynı olmuyor. Bu durum üniversitelerde de mevcut.

Trajik bir olayla anlatayım. Bundan iki sene önce Slovakya'da dijital işleme üzerine staj yaptım. Staj yaptığım Informatik bölümü elektronikçi ağırlıklı bir bölümdü, dijital işleme de malum elektronik konusu. Ben de ne yaptığımı anlamadan bir şeyler yaptım, sonra okul başladı bu işin teorisini bir öğreneyim dedim, "Basics of Signals and Systems" yani dijital sinyal dersi aldım (Sadece bilgisayar mühendislerine zorunlu verilen hafifletilmiş EE dersi.) Ne oldu o derste? Öncelikle ders çok Matematik ağırlıklı olduğundan ve derslerde uykum geldiğinden  iki-üç hafta sonra derse gitmeye bıraktım, kitaptan okurum dedim. Harbiden okudum da. Sinyal çizmeli programlama ödevi veriyordu ama bunları her nedense kod olarak alıp hırsızlık var mı diye test etmek yerine kağıtta istiyorlardı, yani sistem sömürülmeye açıktı. Oda arkadaşım benden bir sene ileride olduğundan onun ödevlerini alıp yeni ödevlere uyarlayıp verdim, kendim yapmaya uğraşmadım. Hocamız aslında okulda part-time çalışıyordu yani asıl işi başka yerdeydi. Kibar da bir adamdı. Benim en önde otururken bir anda buharlaştığımı gördü ve son derse geldiğimde "Sen de kayıplardasın :D :D" dedi fazlası olmadı. Dolayısıyla adamın öğrencilere işkence etmek için bir motivasyonu yoktu. Dönem sonunda da 60 kişiden 6'sı falan A aldı (ben dahil) ki çok büyük bir oran.

Bir yıl sonra bu hoca gitti ve yerine birini bulamayınca dersi EE bölümünde profesör olup, profesör olduğundan da daha hedeflediği bir şey kalmamış, ofiste kağıtları top yapıp çöpe atmaya çalışan bir hocaya verdirdiler dersi. Adamın yapacak işi yok tabii, o yüzden olayı abarttı. Benim kağıda print aldığım ödevleri adam millete sunduruyormuş, yapmazsan veya yapıp sunamazsan sınıfta bırakıyormuş. Not ortalaması 3.99 olan bir arkadaşım kolay soruları sona bırakmış, sonra sınavı yetiştirememiş. 90 falan almış. Hoca bunu ofisine çağırmış "Sen 90 aldın ama en kolay soruyu yapamamışsın, bu senin dersi anlamadığını gösterir. Sana A yerine C veriyorum." demiş. Tabii adam soruyu ofiste tahtada çözünce olay hallolmuş. Ama bu dediğim olaylar normal olaylar değil, dört yılda hiçbir hocanın ofisine çağrılmadım hele de not konusunda çağrılan duymamıştım. Dersi alan elemanlardan biri hocaya "Hocam bu dönem mezun olup işe başlayacağım bırakmayın da okula para vermeyeyim." dedi, hoca bana mısın demedi bıraktı. O dönem dersi alan 100 kişiden 60-70 tanesi kaldı sanırım, sayıyı tam hatırlamıyorum. Bu kadar çok kalan olunca öbür dönem fazla sınıf açmak zorunda kaldılar.

Bu ekstrem durumu kullanarak anlatmak istediğim şu: her ders aynı ciddiyetle verilmiyor. Hocadan hocaya olduğu gibi okuldan okula değişiklik gösterebiliyor. Örneğin Koç'ta mastır yapan arkadaşım Koç'ta asistan olmanın kolay olduğunu çünkü hocaların daha çok araştırmaya yöneldiğini ve ders anlatma konusunda lakayt davrandıklarını söylüyor. Bilkent'te Matematik hocaları tarafından verilen (dolayısıyla teorik olarak anlatılan yani programlamadan çok kanıtlara odaklanılan) "Ayrık Matematik" dersi Koç'ta Bilgisayar hocaları veriliyor diyor. (Hangisi daha iyi derseniz, Ayrık Matematik dersi Matematik hocasının işiyken diğeri üniversitede görüp çoktan unutmuştur.) Öbür tarafta ise Bilkent'te her ne kadar okulun en kariyerli hocalarından biri tarafından verilse de tek ders olarak genel kültür niyetine verilen "Programlama Dilleri" dersi Koç'ta ikiye bölünüp iki döneme yayılmış ve harbi harbi programlama dili dizayn ettirilecek şekilde veriliyormuş.

Bilkent'te İngilizce 101 dersi öğrencinin canı çıkarılacak şekilde verilirken bu ders ODTÜ'de hazırlık sınavından belli bir puanı alınca (bu puan çok yüksek bir puan değil) atlanabilmekte. Galatasaray Üniversitesi bir dönemde bir sürü bilgisayar mühendisliği dersini peşpeşe verip kendisine sövdürürken Bilkent tam tersine bir sürü bölüm dışı (hatta mühendislik dışı) dersi dayayıp bu derslerle öğrencileri germekte, bu nasıl mühendislik dedirtmektedir. Boğaziçi Üniversitesi birinci sınıfta Ölümüne Eşit Ağırlık mottosunu mühendislere de empoze edip Finansa giriş dersi verirken İTÜ "Ne finansı canım? Verin elektronik derslerini bilgisayar mühendislerine çalışsın şebelekler." diyerek yeni donanımcılar yetiştirmekte.

Böyle farklılıkları araştırıp en iyi üniversiteye karar vermek mümkün değil, zaten bu farklılıklar en iyi üniversiteyi belirleyici unsurlar değil.

Yalnız önceki yazımda da bahsettiğim çoook önemli bir fark var o da şu: öğretmen sayısı. Komik gelebilir ama gerçek. Öğretmen sayısı / öğrenci oranı değil direkt öğretmen sayısı. Şimdi arkadaşlar ben Singapur'da değişime gittim. Adamların 430 tane bilgisayar mühendisliği öğrencisi vardı. Bu 430 bilgisayar mühendisine ders vermek için okul hoca almak zorunda. Sınıfları ne kadar kalabalık tutarlarsa tutsunlar yine de fazla fazla öğretmene ihtiyaç duyacaklar. Fazla öğretmen ne demek? Gerizekalı gibi hepsini yapay zekada uzmanlaşmış olarak seçmemişlerse fazla öğretmen farklı konularda uzmanlaşmış bir sürü öğretmen demek. Bu farklı konularda uzmanlaşmış öğretmenler kendi uzmanlık alanındaki dersleri açarlarsa öğrencilerin hem teknik seçmeli ders seçeneği çok olur hem de dersi uzmanından almış olurlar. Temel ders sayısı 15-20 olan bilgisayar mühendisliği bölümünde beş hoca çalışıyorsa isterse bir kişiyi okutsunlar, şu durum değişmez: aynı kişi birden fazla dersi okutuyordur ve tabii Aynştayn değillerse bu derslere sonradan hazırlanıyordur, tabii hazırlanmaya vakitleri oluyorsa.

Bu durumda öğretmen sayısı da önemli bir kıstastır. Bölüme 50 kişinin alındığı ve on tane falan hocası bulunan Koç Üniversitesinde doğal olarak teknik ders sayısı Bilkent'ten az. Bazı dersleri elektronikçilerle bilgisayarcılar ortak alıyor. Bu tip bir dersi almaya mecbur olmak da iyi bir şey değil.

Okul size mezuniyetten sonra ne verebilir? Yurt dışı bağlantıları ne demek?

Tercih ederken Bilkent için "Yurtdışı bağlantıları iyi" filan derlerdi. Bunu açıklayayım. Öncelikle bu işin iki boyutu var: birincisi akademik boyutu ikincisi özel sektör.

Akademik boyutu şöyle: şimdi siz bir yere yüksek lisansa veya mastıra başvurduğunuzda sizden transkriptinizi (karnenin üniversitecesi) ve onun yanında sizin hakkınızda yazılmış üç referans mektubunu isteyecekler. Çok başvuru alan üniversitelerin adam silmek için yapabileceği çok şey var, adam bu okulu hayatımda duymadım der dosyaya da gözucuyla bakar sonra onu atar, not ortalaması vs. düşüktür, önemli bilgisayar derslerinden düşük almıştır bay der. Daha önce bloga şöyle bir mesaj gelmişti: "İyi o zaman ben yüksek ortalama yapabileceğim bir üniversiteye başvururum böylece düşük ortalamalı İTÜ'lünün önünde olur dosyam." benim de cevabım kısaca: "İkiniz de alınmazsınız." olmuştu. Sistemin böyle çakallıklara izin verecek açıkları yoktur.

Peki okulun kazandırdığı ne? Dosyanızı okuyacak kişiler robot değil. Ellerinde de en süper dosyayı bulacak bir yazılım yok. Bakıyor adam, Tayland'daki Ladyboylar Süper Üniversitesi'ni görüyor, bir şey anlamıyor dosyayı koyuyor kenara. Dosyayı gönderen çocuk 4.0 yapmış 5.0 yapmış önemli olmuyor. Sonra bakıyor geçen yıl doktorasını bitirmiş, çok sevdiği bir öğrencisinin okuldan biri, üniversite de Ukrayna'daki Putin Allah Belanı Versin Üniversitesi olsun. Haa bu PABVÜ'lüler çalışkan oluyor diyip onun dosyayı incelemeye koyabilir de. Veya alımları yapmakla görevli hocaların arasında biri PABVÜ'lüdür, "Abi ben oradan mezun oldum alın onu der." , "Düşünürüz." derler.

Diyelim bu okul çok başvuru alıyor ve PABVÜ'lü ilk aşamayı geçti, dosyası daha biraz daha incelenecek. Veya alternatif olarak kurul PABVÜ'yü bilmiyor ama çok başvuru almadıklarından bakalım şu dosyaya dediler PABVÜ neymiş. İşte o zaman devreye referanslar giriyor. Hocalar bakıyor, PABVÜ'nün ne olduğu belli değil ama meğerse vatansever Ukraynalıların gittiği bir üniversiteymiş, referans mektubunu yazan birinci hoca, atıyorum İvan Divandelen, gayet kariyer sahibi, bilmem kaç tane alıntılanması var, doktorayı MIT'den almış. Haa diyorlar bu PABVÜ'de iş varmış. Ama üç referans da PABVÜ mezunu, işi derslerde slayt okumak olan birileri olursa bb.

Ben başvuru yaparken referanslarımın çok kuvvetli değildi, Bilkent'ten referansı veren hocam süper kariyerli biri değildi ama okulun en zor derslerinden birinden A+ almıştım, o derste hocamdı, muhtemelen bunu yazmıştır. İkinci referansım Koç'taki hocadandı ama adam muhtemelen referansı nötr yazmıştı. Üçüncü referansım felsefe hocamdandı zaten, adamdan ders almaktan başka bir şey yapmadım, çok yararı olacağını düşünmüyorum. Bu referanslar bana Amerika'da iyi bir üniversitenin kapısını açamadı ama EPFL'nin kapısını muhtemelen şöyle açtı: EPFL bünyesindeki Türk hocalar (veya Bilkent'i bilen hocalar) "Bu çocuk Bilkent'te 3.91 ortalama yapmış, araştırma geçmişi yok ama olsun potansiyeli var. Amerika'ya kaptırmadan alalım." demiştir, öyle alınmışımdır.

Bu lisansta fazla yaşanmıyor ama yine de ekleyelim: kimi hocalar ise sizi direkt olarak meslektaşlarına önerebilir. Okul hayatım boyunca buna iki defa şahit oldum, birincisinde bir arkadaşım kariyerli bir hocanın projesini yapıyordu, bıraktı, sonra geri başladı, geri başladığında doktorayla ilgili muhabbet etmiler, hoca da demiş istersen seni önereyim ama çıkarsa kesin gideceksin. Birkaç yere daha önerebilirim ama onlarda garanti yok. Kesin gideceksin dediği yerlerin başvurusu geçmişti, garani olmayanlar da arkadaşı almadı ama en azından mülakata falan aldılar. Arkadaşın da C.V.'si acayip parlak değildi. (Şu an bu arkadaş Michigan State'e gidiyor, hocası Bilkentli, Bilkentli öğrencilere sordu "Bana bir öğrenci önerin." falan diyerek, öyle aldı. Aldırmak için de çok uğraştı çünkü arkadaşımın TOEFL puanı çok düşüktü, Speaking'i 12 miydi neydi.) Şahit olduğum ikinci olay ise şu, arkadaşım araştırma yaptığı hocayla muhabbet ederken "Staj ayarlamıştık reddettiler." demiş, hoca da sizi Amerika'ya göndereyim demiş, Amerika'daki hocalarla konuşmuş. Oradakiler de uçağı ve barınmayı karşılayabileceklerini söylemiş. (Vizeyi yetiştiremedi gidemedi ama, evden yapıyor :d)

Özetle işin akademik boyutu:
1- Alımdan sorumlu kurulun okulu ne kadar bildiği (daha önceki gerçek tecrübelerine dayanarak, interneten bakarak değil)
2- Referansları verenler
3- Gönderen okuldaki hocalar.

Başka varsa şu an bilmiyorum.

Peki Özel Sektörde Nasıl Oluyor Bu İşler?

Bu konuda şu an döşeyemiyorum çünkü özel sektörde işe başlayan arkadaşım henüz yok neredeyse. Ama bildiğimi yazayım.

Bir kere herkes şu hikayeyi bilir, yazılımın babaları (!) Bill Gates ve Steje Jobs üniversite terktir. Dolayısıyla bilgisayar mühendisliği okumak gereksizdir. Evde kendini eğiten biri de Google'da başarılı bir yazılımcı olabilir. Efenim ilk olarak babayı olabilir. İkincisi de yukarıda da bol bol Batı medeniyetinin her şeyi ne kadar standarda oturttuğundan bahsettim, bu standart yazılımda da yok mudur? Tabii ki vardır. Bill Gates'in Steve Jobs'un efendi olduğu Taktik Maktik Yok Bam Bam yıllarından her şeyin sürdürebilir olacak şekilde tasarlandığı çağa atladık. Yazılımı yazılmakla bitmiyor, onu çökmeden yıllarca dayanacak şekilde sürdürülmesi gerekiyor. Herkes evde facebook yazabilir ama herkes çökmeyecek, çökse bile bir saatte açılacak ve çökertene ödül verilecek, kullanıcıların fotoğraflarının korunduğu ve birilerinin eline geçmediği bir facebook sahibi olamaz. Özetle bu işi disiplinli yapacak kişilere ihtiyaç var, sadece yetenekli kişilere değil.

Hadiii diyelim yukarıdaki laf salatasının üzerini çizin ve kendinizi bir patronun yerine koyun. Önünüzde iki C.V. var biri bilgisayar mühendisliği diğeri değil, onun dışında kariyerleri aynı gibi. "Beleş ve ekstra bir diploma" diyerek bilgisayar mühendisliği okuyanını almaz mısınız?

Bilgisayar mühendisliği veya en azından mühendislik okumanın elzem olduğunu anlattık, peki üniversiteden üniversiteye nasıl bir fark var? Şöyle, bir kere ilk olarak mühendislik okusanız bile Google'a giremiyorsunuz, başvurunuzu sallamıyorlar bile. Elinizi sallasanız yazılımcıya çarpacak bu devirde başvurulara bakan kişi mecburen uzaktan en iyi gibi gözüken özelliklere göre başvuruları sıralıyor hatta eliyor. Dolayısıyla artık mecburen araya hatırı sayılır birilerini sokmak gerekiyor. Google gibi bir şirketin torpil yapması tuhaf değil mi? Hayır değil, Google çalışanına soruyor "Şu iki C.V. birbirinin tıpatıp aynısı gibi, ben ayrımı yapamadım, sen yapar mısın?" diyor çalışanı da "Bu daha iyidir." diyor. Sonra da Google ahiret mülakatlarına başlıyor. Tabii eleman fos çıkarsa yine giremiyor. Bir arkadaşım bu şekilde mülakata girdiği hangoutstan, bilgisayar mühendisliği ikinci sınıf dersi var bir tane Veri Yapıları (Data Structures) diye, oradan sordular, yapamadı, bir daha aramadılar.

Tabii hatırı sayılır kişiden kastım amcanız teyzeniz değil. Okul burada devreye giriyor. Palantir şirketinin Recruiter'ı (işe alımdan sorumlu kişi) Bilkentli mesela, bilgilerini alıyorsunuz linkedinden falan, veya okula gelip mailini veriyor zaten, siz de ona C.V.'nizi atıyorsunuz, o da inceliyor. Vatanseverlik yapıp önce Bilkentli'ye sonra Türkiye'liye öncelik verebiliyor. Veya atıyorum beraber çalışacağınız grup ful Bilkentlidir, aralarından birini görmek isterler muhabbet olsun diye, o yüzden öncelik kazanırsınız.

Aynı zamanda bu recruiterlar veya iş arayan herhangi bir şirket ve onun personelini iyi okulların bölüm başkanlarına mail atıyor "Böyle böyle adam arıyoruz, sizde var mı?" diye, bölüm başkanı veya sekreter de onu herkese iletiyor. Tabii bu mailler başka hangi okullara gidiyor bilmiyorum.

İlk üç sene pek mail gelmiyor, üçüncü sınıfta daha fazla olmakla beraber birkaç staj ilanı geliyor. Fraunhofer Enstitüsü (Almanya'da epey süper bir araştırma kurumu, TUBİTAK gibi) her yıl 2-3 kişi alıyor sanırım okul aracılığıyla. Normalde kendi kendinize başvurursanız biraz dosyanıza bakar işi bilmiyorsanız reddederler. Bilkent aracılığıyla olunca geleceğe yatırım yaptıkları için biraz da hoşgörülü olurlar. Hoşgörülü olmayanlar da var mesela Avusturya beni ve arkadaşımı reddetmişti ama orasını karıştırmayın şimdi :D IAESTE'nin staj mailleri gelir fakat bu zaten Erasmus gibi bir şey, Bilkent'e özel bir durum yok. IAESTE İTÜ ve YTÜ'de daha fazla aktiftir ayrıca.

Dördüncü sınıfta ise hem bölüm aracılığıyla hem de mezunlar merkezi aracılığıyla iş ilanları spamlenir.

Bana gelen maillerden bazılarını atıyorum şimdi:



Altta 5-6 daha var, 10 tane falan da sekreter yollamış ama ayıklamakla uğraşamayacağım. 5-6 tane de mezunlar merkezi yollamış. Linkedinden de Bilkentli veya Bilkentlilerle çalışan şirketler (onların recruiterları) bağlantı kurabiliyor, o bağlantılarla da yeni iş ilanları falan gözüküyor.

Tabii Google'dan falan iş ilanı beklemeyin. Geneli Türkiye'deki şirketlerden veya yurt dışında çiçeği burnunda startuplardan geliyor.

Ama bu ilanlar gazete ilanıyla eşdeğer değil. Ben bir kere staj başvurusunda bulundum bu ilanları kullanarak, aynı gün içinde cevap aldım. Rasgele staj başvurusunda bulunsanız cevap bile gelmez.

Bu arada yazıyı yazarken İTÜ'ye gönderilen ilanlara denk geldim: https://portal.cs.itu.edu.tr/tr/ilanlar
Bazıları bizimkilerle aynı.

Bir başka okulun imkanı diyebileceğimiz şey de hemen dibinde Bilkent Cyberpark olması ve buradaki şirketlerin Bilkentlilerle çalışmaya teşvik edilmeli, ama bilmiyorum bu teşvik ne boyutta. ODTÜ Teknokentte Bilkent'e oldukça yakın, yani Bilkentli ve ODTÜ'lü yazılımcılar iki teknokentten birden yararlanabiliyor. Ankara'da staj yapacak öğrencilere Bilkent yaz okulu için yurtta kalacakmış gibi yurdunu açıyor, diğer okulları bilmiyorum.

Burada yazdıklarımdan anladınız ki okul sizi staja / işe göndereyim diye uykusuz kalmıyor. Size fırsatları sunuyor. Fakat bazı okulların diğerlerinden daha fazla fırsatı oluyor.

Özet olarak iyi bir üniversite size
1- Alımlardan sorumlu kişilerle daha kolay iletişim.
2- Üniversitelere özel olarak iş ilanlarına erişim.

sağlar.

Derler ya, iyi bir üniversite sizi 1-0 önde başlatır ama sadece o kadar. Bu da doğrudur. Sizin C.V.'niz üç ayda bir iş değişikliğiyle dolarsa "Anlaşılan bu adam verimsiz, gönderiyorlar." derler. Kimse okulu felan sallamaz.

*

Yazı şimdilik bu kadar. Yazı çok fazla Bilkent ağırlıklı oldu farkındayım, Bilkent tanıtımı yapmak için değil, bahsettiğim kriterleri diğer okulları araştırırken kullanın diye yazdım. Bulgularınızı benimle de paylaşabilirsiniz tabii :P

Aklıma gelen diğer konuları bir ikinci yazıda yazacağım. Bir de her okulun bilgisayar mühendisliğinden bir arkadaşımı sorguya çekip onların fikirlerini yazdıracağım, tembellik yapmazlarsa o yazıyı da koyarım.

Görüşmek üzere.