giriş
bilgisayar mühendisliği hakkında konuşmak biraz zor. çünkü aynı ismin altında birbirinden epey farklı şeyler yaşıyor. bir bilim alanı, bir üniversite bölümü, onlarca farklı meslek ve bütün bunların etrafında kurulmuş bir hayat beklentisi.
birisi bilgisayar mühendisliği okumak istediğini söylediğinde kod yazmaktan, yapay zekadan, oyun yapmaktan, iyi para kazanmaktan ya da yurt dışına çıkmaktan bahsediyor olabilir. bunların hiçbiri alakasız değil. fakat hiçbiri tek başına bilgisayar mühendisliği de değil.
sanırım kafa karışıklığının önemli bir kısmı burada başlıyor. bilgisayar bilimiyle yazılım sektörünü, üniversite eğitimiyle mesleki eğitimi, alanın sunduğu imkanlarla bu imkanlara ulaşmanın ne gerektirdiğini birbirine karıştırıyoruz. sonra aynı bölüm hakkında biri "geleceğin mesleği" derken bir başkası "artık okunmaz" diyebiliyor. çoğu zaman ikisi de aynı şeyden bahsetmiyor.
bu yazıda bu düğümü biraz açmak istiyorum. bilgisayar mühendisliğini yalnızca bir ders programından ya da bugün piyasada en çok gördüğümüz işlerden ibaret bırakmadan; bilimini, eğitimini ve mesleğini aynı resmin parçaları olarak ele alacağım.
çünkü bölümün ve mesleğin sunduğu imkanlar gerçekten geniş. iyi bir gelir, uluslararası bir kariyer, farklı ülkelerde ve sektörlerde çalışabilmek, kendi ürününü geliştirebilmek bu alanın gerçekten sunabildiği imkanlar. fakat bunların hiçbiri diplomayla birlikte verilen standart bir paket değil. aynı şekilde bugünün iş piyasasında yaşanan sıkışma da bilgisayar biliminin veya mühendisliğin değersizleştiği anlamına gelmiyor.
bu iki tarafı birbirinden ayırmadan bilgisayar mühendisliği hakkında sağlıklı konuşabilmek pek mümkün değil.
o yüzden başa dönmek gerekiyor. bilgisayar mühendisliğini anlamak için önce bilgisayar biliminin ne olduğunu anlamamız gerekiyor.
bilgisayar bilimi nedir?
ismine bakınca bilgisayar biliminin bilgisayarları inceleyen bir alan olduğunu düşünmek oldukça doğal. işlemciler, ekran kartları, klavyeler, işletim sistemleri ve kod yazmak gibi şeyler.
bunların hepsi bilgisayar bilimiyle ilişkili, fakat alanın merkezinde bilgisayarın kendisi değil hesaplama var.
hesaplama derken yalnızca sayılarla yapılan işlemlerden bahsetmiyorum. bir problemin belirli ve uygulanabilir adımlar kullanılarak çözülebilmesinden bahsediyorum. elimizdeki bilgiyi nasıl temsil edeceğimiz, hangi adımları hangi sırayla uygulayacağımız, çözümün ne kadar zaman ve kaynak gerektireceği, hatta bir problemin bu yöntemle çözülmesinin mümkün olup olmadığı bilgisayar biliminin temel soruları arasında.
örneğin bir şehirdeki iki nokta arasındaki en kısa yolu bulmak bir hesaplama problemi. milyonlarca internet sayfası arasından aradığınız şeyi getirmek de öyle. bir fotoğraftaki yüzü tanımak, mesajın başka biri tarafından okunmasını engellemek ya da aynı anda binlerce kişinin bilet almaya çalıştığı bir sistemin doğru çalışmasını sağlamak da.
bu problemlerin hepsi birbirinden oldukça farklı görünüyor. bilgisayar biliminin yaptığı şeylerden biri, yüzeyde farklı görünen problemlerin altında tekrar eden yapıları bulmak. sonra bu yapıları daha genel, daha anlaşılır ve tekrar kullanılabilir hale getirmek.
biz buna çoğu zaman soyutlama diyoruz.
bir arabanın her parçasının nasıl çalıştığını bilmeden araba kullanabiliyoruz. bir dosyayı kaydederken diskin hangi bölgesine hangi bitlerin yazıldığını düşünmüyoruz. bir internet sitesine bağlanırken verinin hangi kablolardan, yönlendiricilerden ve ülkelerden geçtiğini tek tek takip etmiyoruz.
bilgisayar sistemlerinde bunu mümkün kılan şeylerden biri soyutlama. altımızdaki bütün detaylarla aynı anda uğraşmak yerine, ihtiyacımız olan kısmı daha basit bir model üzerinden ele alabiliyoruz. bu sayede her problemi en başından, bitlerden ve elektrik sinyallerinden başlayarak çözmek zorunda kalmıyoruz. fakat soyutlama bilgisayar biliminin kendisi değil, alan boyunca kullandığımız temel araçlardan biri. bazen karmaşık sistemleri katmanlara ayırmak için, bazen birbirinden farklı problemlerin ortak yapısını görebilmek için, bazen de gereksiz ayrıntıları bir süreliğine dışarıda bırakıp asıl soruya odaklanabilmek için kullanıyoruz.
bilgisayar bilimi elbette yalnızca soyutlamayla ya da sistemleri katmanlara ayırmakla ilgilenmiyor. alanın içinde birbirinden oldukça farklı görünen sorular var.
- bir problemi hangi adımlarla çözebiliriz?
- ne kadar zaman ve kaynak ayırmamız gerekiyor?
- problemin bilgisayarla çözülmesi mümkün mü?
- veriyi nasıl temsil etmeliyiz?
- makineler birbiriyle nasıl haberleşmeli?
- öğrenen bir sistem nasıl kurulabilir?
bu soruların etrafında bilgisayar biliminin farklı alanları oluşuyor.
algoritmalar bir problemi çözmek için izlenecek adımları inceliyor. veri yapıları, üzerinde çalıştığımız bilgiyi nasıl düzenleyeceğimiz ve göstereceğimizle ilgileniyor. hesaplanabilirlik teorisi hangi problemlerin bir bilgisayar tarafından çözülebileceğini, karmaşıklık teorisi ise bu çözümlerin ne kadar kaynak gerektirdiğini araştırıyor. programlama dilleri düşüncelerimizi makinenin uygulayabileceği biçimlere dönüştürmenin farklı yollarını sunuyor.
işletim sistemleri bir makinenin kaynaklarının birçok program arasında nasıl paylaşıldığını, bilgisayar ağları birbirinden uzaktaki makinelerin nasıl haberleştiğini inceliyor. veri tabanları bilginin yalnızca saklanmasıyla değil, doğru, hızlı ve güvenilir biçimde erişilebilir kalmasıyla ilgileniyor. yapay zeka ise algılama, öğrenme, akıl yürütme ve karar verme gibi yeteneklerin hesaplama yoluyla nasıl gerçekleştirilebileceğini araştırıyor.
bütün bu alanları aynı başlık altında tutan şey, bilgiyi ve süreçleri hesaplama üzerinden ele almaları. bazen bir problemi çözmenin yolunu arıyoruz, bazen bulduğumuz çözümün ne kadar zaman ve kaynak gerektirdiğini inceliyoruz. bazen bir problemin bilgisayarla çözülmesinin mümkün olup olmadığını soruyor, bazen de bu çözümlerin gerçek makinelerde güvenilir biçimde çalışmasını sağlayan sistemler kuruyoruz.
kod yazmak bu yüzden bilgisayar bilimiyle uğraşmanın en görünür yollarından biri. fikirleri çalıştırmanın, denemenin ve gerçek sistemlere dönüştürmenin yolu çoğunlukla koddan geçiyor. fakat kod, alanın kendisi değil. daha çok düşüncenin bilgisayara aktarılmış hali.
aynı problemi yüz farklı dilde yazabilirsiniz. kullandığınız dil değişir, kütüphaneler değişir, bugün popüler olan araçlar birkaç yıl sonra ortadan kalkabilir. fakat veriyi nasıl düzenleyeceğiniz, sistemin hangi koşullarda bozulacağı, iki farklı işlemin aynı anda gerçekleşmesi halinde ne olacağı veya çözümünüzün ölçek büyüdükçe nasıl davranacağı gibi sorular karşınıza çıkmaya devam eder.
bilgisayar biliminin değeri de biraz burada yatıyor. yalnızca bugün kullanılan araçlarla değil, bu araçların altında tekrar tekrar karşılaşacağımız problemlerle ilgileniyor.
tam bu noktada bilgisayar bilimiyle bilgisayar mühendisliğini birbirinden ayırmak gerekiyor. çünkü bilgisayar mühendisliği, bilgisayar biliminin yalnızca uygulamalı hali değil.
bilgisayar mühendisliği bunun neresinde?
bilgisayar bilimi hesaplamayla ilgili soruları oldukça geniş bir alanda inceliyor. bilgisayar mühendisliği ise bu bilgiyle bilgisayar sistemlerinin tasarımı ve gerçekleştirilmesi arasındaki kesişimde duruyor.
buradaki mühendislik kelimesi önemli. çünkü yalnızca bir çözümün mümkün olup olmadığını ya da teoride nasıl çalıştığını sormuyorsunuz. hız, maliyet, güvenilirlik, güvenlik, kaynak tüketimi, bakım kolaylığı ve geliştirme maliyeti gibi birçok şeyi aynı anda düşünmeniz gerekiyor. çoğu zaman her açıdan en iyi olan tek bir çözüm yok. içinde bulunduğunuz koşullara göre hangi bedeli ödemeniz gerektiğine karar veriyorsunuz.
bu yüzden bilgisayar mühendisliği programlarında bilgisayar biliminin temel konularıyla bilgisayar sistemlerinin fiziksel tarafı bir arada bulunuyor. programlama, veri yapıları, algoritmalar, işletim sistemleri, veri tabanları ve bilgisayar ağlarının yanında sayısal mantık, elektronik, bilgisayar mimarisi ve mikroişlemciler gibi derslerle de karşılaşıyorsunuz. tabii bu denge her üniversitede aynı değil. bazı programlar donanıma ve elektroniğe daha fazla ağırlık verirken bazıları yazılım ve bilgisayar bilimine daha yakın duruyor. aynı isimle açılmış iki bölümün ders programları birbirinden epey farklı olabilir.
bu nedenle bilgisayar mühendisliği, yazılım mühendisliği veya bilgisayar bilimi isimlerinden birinin tek başına daha iyi ya da daha temel olduğunu söylemek çok anlamlı değil. bu alanların sınırları zaten büyük ölçüde birbirine değiyor. bilgisayar bilimi okuyan biri gerçek sistemler geliştirebilir, bilgisayar mühendisi teoriyle uğraşabilir, yazılım mühendisi de işletim sistemlerinden yapay zekâya kadar birçok alanda çalışabilir.
bölümün adı size genel bir yön gösteriyor. dört yıl boyunca gerçekten neyle karşılaşacağınızı ise ders programı, hocalar ve bölümün kültürü belirliyor.
peki üniversitelerde ne öğreniliyor?
burada biraz hayal kırıklığı yaratabilecek bir şey söyleyeyim:
üniversite, size mezun olduğunuz gün bir şirkete girip çalışabilmeniz için gereken her şeyi öğretmeyecek.
zaten üniversitenin asıl işi bu değil.
bir bilgisayar mühendisliği programının amacı sizi belirli bir programlama diline veya bir iş ilanına hazırlamak yerine, bilgisayar sistemlerini anlayabileceğiniz bir temel vermek. bugün kullanılan araçların önemli bir kısmı siz mezun olana kadar değişebilir. altında duran problemler ise o kadar hızlı değişmiyor.
eğitim genellikle matematik, fizik ve programlamaya giriş dersleriyle başlıyor. ilk başta yazdığınız programlar oldukça küçük olabilir. ekrana bir şeyler yazdırır, basit hesaplamalar yapar, döngüler ve koşullarla uğraşırsınız. bunlar dışarıdan bakınca pek etkileyici görünmez. fakat burada öğrenmeye çalıştığınız şey yalnızca bir programlama dilinin söz dizimi değil, bir problemi açık adımlara ayırmak ve bu adımları makinenin anlayabileceği kadar kesin ifade etmek.
daha sonra veri yapıları ve algoritmalarla karşılaşırsınız. bir veriyi liste, ağaç, tablo veya grafik olarak temsil etmenin çözümü nasıl değiştirdiğini görmeye başlarsınız. aynı sonucu üreten iki programdan birinin birkaç saniyede, diğerinin ise yıllar içinde tamamlanabileceğini öğrenirsiniz.
sayısal mantık ve bilgisayar mimarisi, yazdığınız kodla fiziksel makine arasındaki mesafeyi kapatır. bilgisayar işlemcisinin komutları nasıl çalıştırdığını, belleğin nasıl kullanıldığını ve en sonunda bütün bu soyutlamaların elektrik sinyalleri üzerinde nasıl ayakta kaldığını görürsünüz.
işletim sistemleri, veri tabanları ve bilgisayar ağlarıyla birlikte tek bir programdan daha büyük sistemlere geçiş yapılır. aynı makinede çalışan birçok programın kaynakları nasıl paylaştığını, verinin nasıl güvenilir biçimde saklandığını ve birbirinden uzaktaki bilgisayarların nasıl haberleştiğini anlamaya başlarsınız.
ilerleyen yıllarda yapay zeka, güvenlik, dağıtık sistemler, grafik, gömülü sistemler, programlama dilleri veya teori gibi farklı alanlara yönelmenizi sağlayan dersler gelir. burada alacağınız eğitimin önemli bir kısmını üniversitenizin sunduğu seçmeli dersler ve hocaların çalışma alanları belirler.
tabii bütün bunlar müfredatın kağıt üzerindeki hali. aynı dersi iki farklı hocadan almak bile birbirinden oldukça farklı iki deneyim doğurabilir. bazı bölümler teorik temelleri çok iyi verirken güncel uygulamalardan uzak kalabilir. bazıları ise öğrencileri hızlıca üretmeye alıştırırken altında duran fikirleri yeterince derin işlemeyebilir.
üniversite seçerken yalnızca bölümün adına ve sıralamasına bakmanın yetersiz olmasının sebeplerinden biri bu. zorunlu derslere, seçmeli derslere, hocaların ne üzerine çalıştığına ve öğrencilerin bölümün dışında ne ürettiğine de bakmak gerekiyor.
fakat müfredat ne kadar iyi olursa olsun, dört yıl boyunca yalnızca dersleri geçerek bu alanı öğrenmek pek mümkün değil. üniversite size bir öğrenme sırası, temel ve çevre sağlayabilir. o temelin üzerine ne kadar şey koyacağınız büyük ölçüde size kalıyor. bu temelin en çok tartışılan parçalarından biri de matematik.
matematik bu işin neresinde?
ders programında matematiğin bu kadar yer kaplaması ilk başta biraz garip gelebilir. çoğu bilgisayar mühendisliği programında kalkülüs, lineer cebir, ayrık veya sonlu matematik, olasılık ve istatistik gibi derslerle karşılaşıyorsunuz. bazı programlarda bunlara diferansiyel denklemler gibi başka dersler de ekleniyor. sonuçta çoğu insan bilgisayar mühendisliğine matematik öğrenmek için gelmiyor ve sektörde çalışan birçok insan da üniversitede gördüğü matematiğin büyük kısmını günlük işinde doğrudan kullanmadığını söylüyor.
bu büyük ölçüde doğru. yaygın yazılım geliştirme işlerinin çoğunda her gün diferansiyel denklem çözmüyor, matrislerle çalışmıyor veya matematiksel ispat yazmıyorsunuz. fakat buradan matematiğin bilgisayar bilimiyle pek ilgisi olmadığı sonucuna varmak doğru değil. çünkü matematik yalnızca sayılarla işlem yapmak veya formül uygulamak değil. bir şeyi açık biçimde tanımlamak, hangi varsayımlarla hareket ettiğimizi göstermek, bir sonucun neden doğru olduğunu açıklamak ve karmaşık bir problemi daha küçük parçalara ayırmak için kullandığımız bir dil.
bilgisayar biliminde ve mühendisliğinde de sürekli olarak benzer şeyler yapıyoruz.
özellikle ayrık matematik alanın birçok yerinde karşımıza çıkıyor. mantık, kümeler, ilişkiler, çizgeler, yani graf yapıları ve kombinatorik; algoritmalardan veri tabanlarına, bilgisayar ağlarından programlama dillerine kadar birçok konunun temelinde duruyor. burada çoğunlukla sürekli değişen fiziksel niceliklerle değil, birbirinden ayrı durumlarla, bağlantılarla ve adımlarla ilgileniyoruz.
diğer matematik alanlarının önemi ise ne üzerine çalıştığınıza göre değişiklik gösterebiliyor. lineer cebir bilgisayar grafikleri ve makine öğrenmesinde, olasılık ve istatistik veriyle ve belirsizlikle çalışırken, kalkülüs optimizasyon ve fiziksel sistemlerde, sayı teorisi ise kriptografide çok daha görünür hale geliyor.
bunların hepsini her gün kullanmanız gerekmiyor. bir frontend geliştiricisi yıllarca matris çarpımı yapmadan çalışabilirken bir grafik motoru veya makine öğrenmesi sistemi geliştiren biri için lineer cebir işin doğrudan merkezinde olabilir.
peki o zaman neden herkes bu dersleri alıyor?
bir sebebi, bölüme başladığınız gün ileride hangi alanda çalışacağınızı henüz bilmemeniz. daha önemli sebebi ise bu derslerin yalnızca ileride kullanacağınız formülleri öğretmemesi. soyut düşünmeyi, kesin konuşmayı ve bir sonuca hangi adımlarla ulaştığınızı göstermeyi de öğreniyorsunuz. tabii yks matematiğiyle üniversitede karşılaşacağınız matematik tamamen aynı şey değil. sınavda çoğu zaman belirli soru tiplerini sınırlı sürede çözmeniz bekleniyor. üniversitede ise tanımlar, ispatlar ve soyut kavramlar daha fazla öne çıkabiliyor. birinde iyi veya kötü olmanız diğerindeki sonucunuzu kesin olarak belirlemiyor.
bugün matematikte çok iyi olmamanız bu bölümü okuyamayacağınız anlamına gelmiyor. fakat soyut düşünmekten, anlamadığınız bir konunun üzerinde uzun süre durmaktan ve gerektiğinde matematikle uğraşmaktan tamamen kaçmak istiyorsanız bölümün bazı kısımları epey zorlayıcı olabilir.
matematiği sevmek zorunda değilsiniz. onunla uğraşmaya razı olmanız gerekiyor. severseniz işiniz kolaylaşır, sevmezseniz de tamamen kaçamazsınız.
dersleri geçmek neden yetmiyor?
aynı üniversitede, aynı dersleri aynı hocalardan alan iki insan dört yılın sonunda birbirinden oldukça farklı yerlerde olabilir.
bölümü okumakla mühendis olmak arasında devasa farklar var.
bunun sebebi yalnızca birinin daha yüksek notlar alması değil. üniversitenin sunduğu eğitimin önemli bir kısmı, onunla ne yaptığınıza göre değer kazanıyor.
bir algoritma dersini sınavdan geçecek kadar öğrenebilirsiniz. aynı dersi, karşılaştığınız problemlerin altında hangi yapıların bulunduğunu görmeye başlamak için de kullanabilirsiniz. bir programlama ödevini istenen çıktıyı verecek kadar tamamlayabilir veya yazdığınız şeyin neden çalıştığını, nerede bozulacağını ve nasıl daha iyi tasarlanabileceğini anlamaya çalışabilirsiniz.
aradaki fark ilk başta pek büyük görünmeyebilir. dört yıl boyunca tekrarlandığında ise epey büyüyor.
bu noktada sık sık "kendinizi geliştirmeniz gerekiyor" deniyor. bana kalırsa tek başına pek bir şey anlatmayan bir cümle bu. hangi yönde, ne yaparak ve ne kadar geliştireceğiniz belli değil.
bu alanda gelişmek çoğu zaman daha fazla programlama dili veya araç öğrenmek anlamına gelmiyor. daha önce çözemediğiniz problemleri çözebilir hale gelmek, daha büyük sistemleri anlayabilmek, verdiğiniz kararların sonuçlarını görebilmek ve giderek daha az yönlendirmeyle iş çıkarabilmek anlamına geliyor.
bunun önemli yollarından biri bir şeyler üretmek. burada yalnızca özgeçmişe koymak için yapılmış birkaç projeden bahsetmiyorum. başından sonuna kadar size ait olan, nereden başlayacağınızı tam olarak bilmediğiniz ve çalışır hale getirmek için onlarca, hatta yüzlerce farklı sorunla uğraşmanız gereken herhangi bir şey olabilir.
bir web sitesi, oyun, mobil uygulama, küçük bir işletim sistemi parçası, araştırma projesi veya açık kaynak katkısı. ne olduğu çok önemli değil. önemli olan, derslerde çoğunlukla ayrı ayrı gördüğünüz parçaların gerçek bir şey üretmeye çalışırken birbirine çarpması.
çünkü gerçek problemler ödevler kadar düzenli gelmiyor. gereksinimler eksik oluyor, kullandığınız araçlar beklediğiniz gibi çalışmıyor, dokümantasyon yetersiz kalıyor ve doğru görünen iki çözüm arasında seçim yapmanız gerekiyor. bazen de günlerce uğraştığınız şeyin asıl problemle hiçbir ilgisi olmadığını fark ediyorsunuz.
bu deneyimlerin önemli bir kısmını yalnızca ders dinleyerek edinmek imkansız.
stajlar ve yarı zamanlı işler de bu yüzden değerli. yalnızca kullanılan teknolojileri görmek için değil; başkasının yazdığı kodu okumayı, var olan bir sistemin içinde değişiklik yapmayı, yaptığınız işi anlatmayı ve verdiğiniz kararların başka insanları nasıl etkilediğini öğrenmek için.
aynı şekilde iyi bir çevrenin etkisini küçümsememek gerekiyor. meraklı ve üreten insanlarla aynı ortamda bulunmak, tek başınıza keşfetmenizin yıllar sürebileceği şeyleri çok daha erken görmenizi sağlayabilir. üniversitenin sunduğu en değerli imkanlardan biri bazen derslerden çok, yanınızda oturan insanlar oluyor.
ingilizce de bu alan için sonradan eklenen hoş bir beceri değil. kaynakların, araştırmaların, dokümantasyonun ve uluslararası iş piyasasının önemli bir kısmına eriştiğiniz dil. ingilizce bilmeden bu alanda çalışmak mümkün, fakat erişebildiğiniz bilgi ve fırsat alanı çok ciddi bir biçimde daralıyor.
notların hiçbir önemi olmadığını söylemek de doğru değil. iyi notlar, konuları düzenli takip ettiğinizi ve sizden beklenen işi yapabildiğinizi gösterebilir. akademik kariyer, yüksek lisans veya ilk stajlar için doğrudan karşılığı da olabilir.
fakat yüksek ortalama tek başına iyi bir mühendis olduğunuzu göstermiyor. düşük ortalama da sizi otomatik olarak pratik ve yaratıcı bir mühendis yapmıyor. derslerdeki performansla gerçek bir problem karşısındaki performans birbiriyle ilişkili olabilir, fakat aynı şey değiller.
ben iyi bir mühendisin en belirgin özelliklerinden birinin zaman içinde daha bağımsız hale gelmek olduğunu düşünüyorum. önüne gelen problemi anlayabilmek, bilmediği şeyi öğrenebilmek, seçenekler arasında karar verebilmek, başladığı işi tamamlamak ve ortaya çıkan sonucun sorumluluğunu taşıyabilmek.
bunların hiçbiri bir gecede oluşmuyor. çok zeki olmak elbette bazı şeyleri kolaylaştırabilir, fakat bu alanda uzun vadeli farkı çoğu zaman merak, süreklilik ve yaptığınız iş hakkında geri bildirim alabilmek belirliyor.
üniversite bütün bunları sizin yerinize yapmıyor. fakat doğru kullanıldığında bunları geliştirebileceğiniz oldukça iyi ve ilginç bir ortam sağlıyor.
mezun olduktan sonra...
bilgisayar mühendisliği okuduğunuzda mezuniyetinizin karşılığında tek bir meslek edinmiyorsunuz.
tıp okuyan birinin doktor, hukuk okuyan birinin avukat olmasına benzer şekilde tanımlanmış tek bir bilgisayar mühendisliği işi yok. diploma size oldukça geniş bir alanda çalışabilmeniz için gereken temeli veriyor. bu temeli hangi yönde kullanacağınız ise üniversite boyunca yaptıklarınıza, ilginize ve zamanla edindiğiniz tecrübeye göre şekilleniyor.
bugün mezunların önemli bir kısmı yazılım mühendisi olarak çalışıyor. fakat yazılım mühendisliği de kendi içinde tek bir iş değil. insanların kullandığı arayüzleri geliştirebilir, bu arayüzlerin arkasında çalışan sistemleri kurabilir, mobil uygulamalar yazabilir veya şirketlerin verilerini ve operasyonlarını yöneten araçlar geliştirebilirsiniz.
bazı mühendisler fiziksel dünyaya daha yakın çalışıyor. otomobillerin, üretim makinelerinin, tıbbi cihazların veya evimizde kullandığımız elektronik ürünlerin içindeki gömülü sistemleri geliştiriyor. bazıları işletim sistemleri, veri tabanları, derleyiciler, bulut altyapıları veya bilgisayar ağları gibi diğer yazılımların üzerinde çalıştığı sistemleri kuruyor.
güvenlik, yapay zeka, veri mühendisliği, bilgisayar grafikleri ve oyun geliştirme de aynı temelden çıkabileceğiniz farklı yönler. akademide kalıp hesaplama teorisi veya yeni sistemler üzerine araştırma yapmak da mümkün. bu alanların her biri farklı bir bilgi derinliği ve farklı bir çalışma biçimi gerektiriyor.
üstelik bu sınırlar pratikte her zaman temiz değil. bir yazılım mühendisi aynı gün içinde veri tabanıyla, ağlarla, güvenlikle ve bulut altyapısıyla ilgilenebilir. yapay zeka üzerine çalışan birinin yalnızca model geliştirmesi değil, o modeli gerçek kullanıcıların erişebileceği güvenilir bir sisteme dönüştürmesi de gerekebilir.
bu yüzden bölümde gördüğünüz konuların bir kısmı ilk başta çalışmak istediğiniz işle alakasız görünebilir. fakat gerçek sistemlerde bu alanlar sürekli birbirine dokunuyor. ağlardan hiç anlamadan dağıtık bir sistem kurmak, işletim sistemini hiç düşünmeden performans problemi çözmek veya veri yapılarından habersiz büyük miktarda veriyi verimli biçimde işlemek bir noktadan sonra zorlaşıyor.
tabii mezun olduğunuzda bütün bu alanları biliyor olmanız beklenmiyor. zaten böyle bir şey pek mümkün değil. üniversite size geniş bir harita gösteriyor. zaman içinde bu haritanın bazı bölgelerinde derinleşiyorsunuz. ne kadar erken uzmanlaşmanız gerektiğinin de tek bir cevabı yok. ilk yıllarda farklı şeyleri denemek oldukça değerli. neyi sevdiğinizi, neye yatkın olduğunuzu ve günün büyük kısmını hangi tür problemlerle uğraşarak geçirmek istediğinizi başka türlü öğrenmek zor.
bilgisayar mühendisliğinin sunduğu genişlik biraz böyle bir şey. aynı eğitimden başlayıp birbirinden tamamen farklı işler yapabiliyorsunuz. kariyeriniz boyunca yön değiştirme imkanınız da birçok mesleğe kıyasla oldukça yüksek.
bu hareket alanı yalnızca ne iş yaptığınızla sınırlı değil. nerede, kimlerle ve hangi koşullarda çalışabildiğinizi de etkiliyor.
bu meslek nasıl bir hayat sunuyor?
bilgisayar mühendisliğini birçok meslekten ayıran şeylerden biri, öğrendiğiniz bilginin oldukça taşınabilir olması.
bir fabrikanın işletilmesi doğrudan bulunduğunuz yere bağlı olabilir. yazılım ise çoğu zaman aynı bilgisayarla, aynı araçlarla ve aynı bilgiyle dünyanın farklı bir yerindeki insanlarla üretilebiliyor. türkiye'de öğrendiğiniz bir programlama dili, veri tabanı veya sistem tasarımı yaklaşımı başka bir ülkede geçerliliğini kaybetmiyor.
bu, dünyanın herhangi bir yerine gidip doğrudan çalışabileceğiniz anlamına gelmiyor. ülkelerin kendi çalışma izinleri, şirketlerin işe alım tercihleri ve farklı sektörlerin kendine özgü koşulları var. fakat mesleki bilginizin yeni bir ülkeye taşındığınızda büyük ölçüde kullanılabilir kalması önemli bir avantaj.
üstelik uluslararası çalışmanın tek yolu ülke değiştirmek değil. türkiye'de yaşamaya devam edip başka bir ülkedeki şirkette çalışabilir, farklı ülkelerden insanlarla aynı ekibin parçası olabilir veya belirli projeler için bağımsız olarak hizmet verebilirsiniz.
bu imkanların oluşmasında işin dijital olmasının yanında sektörün ortak bir dile sahip olması da etkili. kullanılan araçlar, teknik kavramlar ve çalışma biçimleri dünyanın farklı yerlerinde büyük ölçüde birbirine benziyor. ingilizceniz yeterliyse yalnızca yerel iş ilanlarına ve kaynaklara bağlı kalmak zorunda değilsiniz.
aynı hareketlilik çalışabileceğiniz sektörlerde de var. bugün bir finans şirketinde ödeme sistemleri üzerinde çalışıp birkaç yıl sonra sağlık, oyun, savunma sanayi, e-ticaret veya otomotiv sektörüne geçebilirsiniz. elbette her geçiş sıfır maliyetli değil. sektörlerin kendilerine ait bilgileri ve kısıtları var. fakat temel mühendislik becerilerinin önemli bir kısmı sizinle birlikte geliyor.
çalışma biçiminiz de kariyeriniz boyunca değişebilir. bir şirketin tam zamanlı çalışanı olabilir, belirli bir süre sonra bağımsız çalışmaya başlayabilir, danışmanlık verebilir veya kendi ürününüzü geliştirebilirsiniz. bunların hepsi aynı anda iyi seçenekler değil ve her biri farklı bir risk taşıyor. fakat önünüzde tek bir kariyer yolu olmaması başlı başına değerli.
gelir tarafındaki hareket alanı da bunun bir sonucu.
aynı ünvana sahip iki insanın kazandığı para arasında birkaç kat fark olabilir. çalışılan ülke, şirketin büyüklüğü, ürünün ekonomik değeri, uzmanlık alanı, deneyim ve sorumluluk seviyesi maaşı ciddi biçimde değiştiriyor. yerel bir şirkette çalışmakla uluslararası bir şirkette çalışmak veya çalışan olmakla bağımsız hizmet vermek aynı gelir yapısını oluşturmuyor.
bu yüzden internette gördüğünüz yüksek maaşlar yalan değil. fakat alanın ortalama sonucu da değiller.
mesleğin yüksek bir tavanının olması, herkesin o tavana ulaşacağı anlamına gelmiyor.
döviz üzerinden gelir kazanmak, yurt dışına taşınmak veya dünyanın büyük teknoloji şirketlerinden birinde çalışmak gerçekten mümkün. fakat bunlar yalnızca bilgisayar mühendisliği diplomasına sahip olduğunuz için gerçekleşmiyor. güçlü bir teknik temel, iyi ingilizce, birkaç yıl boyunca biriken gerçek deneyim, kendinizi gösterebilmek ve çoğu zaman doğru fırsatla doğru zamanda karşılaşmak gerekiyor.
bu meslek, çalışarak etkileyebileceğiniz değişkenlerin sayısını artırıyor. bilginizi derinleştirebilir, görünür hale gelebilir, uluslararası bir çevre kurabilir ve yalnızca bulunduğunuz şehirdeki birkaç şirkete bağlı kalmayabilirsiniz.
bence bilgisayar mühendisliğinin en büyük avantajlarından biri tam olarak bu. size tek bir hayat vaat etmiyor. farklı ülkelerde, sektörlerde ve çalışma biçimlerinde kullanabileceğiniz geniş bir hareket alanı sunuyor.
ama imkanla sonuç arasındaki farkı unutmamak gerekiyor.
bu bölümden mezun olan herkes yüksek maaş kazanmayacak, yurt dışında çalışmayacak veya kendi şirketini kurmayacak. bazı insanlar ortalama bir işte çalışacak, bazıları mesleği sevmeyecek, bazıları başka alanlara geçecek. bu da bilgisayar mühendisliğinin gerçeklerinden biri.
alanın sunduğu imkanlar geniş. bu imkanlara ulaşmak için gereken rekabet de öyle.
geleceği gerçekten parlak mı?
buraya kadar anlattığım imkanların önemli bir kısmı, yazılım sektörünün son yıllarda yaşadığı büyümeyle görünür hale geldi. çok sayıda şirket kuruldu, ekipler büyüdü ve henüz çok az tecrübesi olan insanlar bile görece kolay biçimde sektöre girebildi.
bugün aynı piyasadan bahsetmiyoruz.
şirketler işe alım konusunda daha dikkatli. başlangıç seviyesindeki pozisyonlar aşırı rekabetçi. birkaç programlama dili öğrenmek veya birbirine benzeyen birkaç proje yapmak, eskisi kadar güçlü bir sinyal değil. bunların üzerine bir de yapay zekanın kod üretme kapasitesi ekleniyor.
dolayısıyla insanların "bu alanın geleceği var mı?" diye sorması anlamsız değil.
kod üretmek uzun süre yazılım mühendisliğinin en görünür ve zaman alan parçalarından biriydi. bugün "yapay zeka" birkaç dakika içinde yüzlerce satır kod yazabiliyor, var olan kodu açıklayabiliyor, test oluşturabiliyor ve bilmediğiniz bir araçla çalışmaya başlamanızı ciddi biçimde hızlandırabiliyor.
bu yalnızca işimizi yaparken kullandığımız yeni bir araç değil. işlerin ekonomik değerini de değiştiriyor.
sınırları net biçimde çizilmiş, daha önce birçok kez çözülmüş ve sonucunun doğru olup olmadığını kolayca kontrol edebildiğimiz işler giderek daha ucuz hale geliyor. geçmişte yeni başlayan bir mühendisin saatlerce uğraşarak yapacağı bazı görevler artık birkaç komutla tamamlanabiliyor.
bu yüzden yapay zekanın hiçbir şeyi değiştirmediğini söylemek bana gerçekçi gelmiyor.
fakat burada bilgisayar biliminin veya mühendisliğin ortadan kalkacağı sonucuna varmak da aynı derecede hızlı bir çıkarım.
çünkü kod üretmekle bir sistem inşa etmek aynı şey değil. hangi problemin çözülmeye değer olduğunu anlamak, eksik ve çelişkili gereksinimlerle çalışmak, doğru soyutlamaları seçmek, sistemin nerede bozulacağını öngörmek, güvenliğini ve maliyetini düşünmek, farklı çözümler arasındaki bedelleri tartmak ve ortaya çıkan sonucun sorumluluğunu taşımak hala işin önemli bir kısmını oluşturuyor.
hatta kod üretmek kolaylaştıkça bu kararların göreceli önemi artıyor.
bu dönüşümü daha ayrıntılı olarak mühendisliğin evrimi ve kocaman yanılgılar yazımda anlatmıştım. oradaki temel düşüncem şuydu: mühendisliğin değeri ortadan kaybolmuyor, başka bir yere kayıyor.
daha az kod yazmak zorunda kalabiliriz. fakat daha fazla kodu anlamak, doğrulamak ve gerçek sistemlerin içinde güvenilir biçimde çalıştırmak zorundayız. daha küçük ekipler, geçmişte çok daha büyük ekiplerin yapabileceği işleri yapabilir. tek bir mühendisin üretebildiği değer artarken o mühendisten beklenen bağlam ve sorumluluk da büyüyebilir.
ben bilgisayar biliminin ve mühendisliğinin geleceğini hala parlak görüyorum.
bunun sebebi insanların önümüzdeki elli yıl boyunca bugünkü yöntemlerle kod yazmaya devam edeceğini düşünmem değil. tam tersine, kod yazmanın ve yazılım üretmenin giderek kolaylaşacağını düşünüyorum.
bir şeyi üretmenin maliyeti düştüğünde yalnızca mevcut işler daha az insanla yapılmıyor. daha önce yapılması ekonomik olmayan birçok şey de yapılabilir hale geliyor. daha küçük topluluklar, şirketler ve hatta tek bir insan kendi ihtiyaçlarına göre sistemler geliştirebiliyor. yazılımın girmediği sektörler dijitalleşiyor, zaten dijital olan sistemler ise giderek daha karmaşık hale geliyor.
başka bir deyişle, çözebileceğimiz problem alanı büyüyor.
üstelik hayatımızı emanet ettiğimiz sistemlerin sayısı arttıkça güvenlik, doğruluk, mahremiyet ve güvenilirlik gibi meseleler de daha önemli hale geliyor. bir modelin kod yazabiliyor olması, o kodun doğru problemi çözdüğü veya üretimde güvenle çalışabileceği anlamına gelmiyor.
bütün bunlar alandaki herkesin geleceğinin parlak olduğu anlamına gelmiyor.
bilgisayar biliminin geleceğiyle, bugün var olan her pozisyonun geleceği aynı şey değil. bazı görevler ortadan kalkacak, bazıları küçülecek ve yeni işler oluşacak. sektöre giriş yolları değişebilir. aynı bilgi ve sorumluluk seviyesinde kalan insanların ekonomik değeri düşebilir.
bu alan uzun zamandır sürekli öğrenmeyi gerektiriyordu. bundan sonra değişime ayak uydurmak muhtemelen daha da önemli olacak.
bana kalırsa bilgisayar mühendisliği hala güçlü bir eğitim ve kariyer seçeneği. sadece "yüksek" maaş veya yurt dışı ihtimalleri yüzünden değil, dünyayı şekillendiren ve sayıları giderek artan sistemleri anlayabilmek, geliştirebilmek ve gerektiğinde değiştirebilmek oldukça geniş bir temel sunuyor.
elbette bu temel tek başına yeterli değil.
iyi bir üniversite, iyi bir müfredat, matematik, projeler, stajlar ve diploma size birçok kapı açacak. o kapılardan geçmek için daha çok merak etmeye, daha çok üretmeye ve yanılmaya, sonucunda öğrendiğiniz şeylerin sorumluluğunu taşımaya devam etmeniz gerekiyor.
maalesef bilgisayar mühendisliği size bir hayat vermiyor. fakat kurabileceğiniz hayatların sayısını ciddi biçimde artırıyor.
sanırım bütün mesele de bu.
sorularınız, düşünceleriniz ya da tartışmak istediğiniz konular varsa [email protected] adresinden bana ulaşabilirsiniz. sonraki yazımda görüşürüz.