1. Yazılım yapmayı öğrenmek istiyorum ama hiçbirşey bilmiyorum. Nereden başlamalıyım?
Öncelikle özellikle kızlarda gördüğüm sorunu anlatarak başlayayım. Genellikle yazılım erkek işi olarak görüldüğü için, yazılım mühendisliği okusalar dahi kadın arkadaşlarda bir çekingenlik oluyor. Hatta mezun olan kadın arkadaşlar kodlamadan çekindikleri için yönetici, test uzmanı, analist gibi pozisyonlarda çalışıyorlar.
Yazılım geliştirme erkek işi falan değildir arkadaşlar.
Margaret Hamilton Apollo uzay aracı için yazdığı kaynak kodu ile
Bilinen ve kabul edilen ilk programcı Ada Byron Lovelace isimli bir kadındır. Hatta aya giden Apollo uzay aracının uçuş kontrol yazılımını Margaret Hamilton adındaki bir kadın yapmıştır ki daha geçenlerde kendisi Beyaz Saray’da Obama’dan madalya aldı.Hatta ince detayların farkına varmadaki aşinalığımız sayesinde biz kadınlardan çok iyi yazılımcılar çıkar. Zaten 1980’lere kadar bilgisayar ve yazılım işleri daktiloculukla eşdeğer görüldüğünden bu alanda daha çok kadınlar hakimdi. Daha sonra parası, vb’si nedeniyle erkek mesleği olarak görülmeye başlandı. Yine geçenlerde yapılan bir araştırmaya göre, Github üzerinde kadınların yazdıkları kod, (profillerinde cinsiyetleri belli değilse) daha çok kabul görüyormuş. Ama, eğer cinsiyet belliyse, önyargı nedeniyle kodlar daha çok inceleniyormuş. Yazılım alanındaki cinsiyetçilik ayrı bir yazı konusu tabii.
Dünyanın ilk programcısı Ada Lovelace
Herşeyin başı merak etmek. 2011 yılında uzmanlara nasıl başladınız diye bir soru sormuştum. Hiç unutamadığım bir konuşmacı Starbucks’ta barista (Kahve yapan yeşil önlüklü) olduğunu, bir arkadaşının yazılım geliştirmeden iyi para kazandığını, kendisinin de bunun üzerine internetten tutorial yani adım adım öğretici materyal okuyarak işi öğrendiğini anlattı. Bu adam şu anda CakePHP konusunda dünyadaki en ünlü uzmanlardan biri. Dinleyenler arasındaki biz yazılım mühendisleri vb’ler olarak topluca ambale olduğumuzu belirtmeliyim.
Yazılım geliştirmek, halı dokumak, resim yapmak gibidir. Bilince aynı keyfi alırsınız. Yazılımcı olmak için süper matematik bilmek lazım dahi olmak lazım diye birşey de yok arkadaşlar. Hatta matematikle ilgili sorunumuz, matematiğin mantığını bilmemekten kaynaklanıyor.
Matematik aslında kolaydır, hayatı resmeden boya kalemidir. Yaptığımız, beynimizle verdiğimiz her karar aslında, halen bilim olarak çözemediğimiz (Yapay sinir ağları) bir matematiğin ürünüdür, her birimiz, en gelişmiş bilgisayarlardan daha ileri bir araca sahibimiz. Yani beynimize. Bir de, sanmayın ki yazılım alanında herşey olmuş bitmiş, bütün konular araştırılmış ve teoriler ispatlanmış ve standart hale getirilmiş. Binlerce yıllık Tıp bilimine veya atıyorum Jeolojiye, fiziğe, biyolojiye baktığımızda bile oturmuş çalışan işe yarayan teoriler görürüz. Yazılım alanında böyle birşey henüz yok arkadaşlar. Standartlar henüz çok yeni, sürekli bir gelişme ve icad edilme halindedir yazılım bilimi. Şu anda kullandığımız algoritmalar 1950’lerde vb, icad edilmiştir ve henüz 50 küsür yıllık bir geçmişi vardır. O yüzden kendinizi eksik hissetmeyin.
Yazılım alanında pir ya da guru, ultra özgüvenli süper uzman olmak diye birşey de yoktur arkadaşlar. Çoğu zaman hiçbir şey bilmeden taptaze bilgilerle işe başlamak, bir konuda uzman olmaktan iyidir. Mesela ben sahip olduğum yazılım bilgimi korumak için sürekli okumalıyım ve sürekli yeni sürümlerde çıkan yeniliklerle bilgimi taze tutmalıyım.
En önemli konu ise yaparak öğrenmek, birşeyler yapmak. Küçük küçük projelerle başlayın. Mesela kendi internet sitenizi yazmaya çalışın. Kötü de olsa deneyin, mükemmelliyetçi olmayın. Türkçe kaynak sorunumuz var evet, çünkü kaynaklarımız henüz çok yeni, çoğu ingilizceden kelime kelime, kullanım klavuzlarından yazılım bilmeyen insanlar tarafından çevirilmiş yayınlar. O kişilerin emeklerine saygı duyuyorum fakat konunun temel mantığını anlamak konusunda daha çok Türkçe yayınlara ihtiyacımız var ki ben de bu yüzden yazıyorum.
Bir de kullanım klavuzundan dil öğrenilmez arkadaşlar. Kullanım klavuzları veya A’dan Z’ye bir konuyu anlatan kitaplar, zaten belirli bilgileri olan kişiler için yazılmışlardır. Profesyonel bir şekilde yazılım geliştirirken, herşeyi ezbere bilemeyeceğimiz için başucu kaynaklarına, rehberlere ihtiyacımız vardır.
Bu kitaplara, bir konuda takıldığımızda başvururuz. Ancak hiç bilmiyorsanız, “User Manual” yani kullanıcı klavuzları sizi yorar. Bunun yerine, basit bir konuyu, örneğin, HTML öğrenmek istiyorsanız, konuyu bebek adımlarıyla anlatan, mesela kendi kişisel internet sitenizi yapmanızı öğretecek, tutorial yani öğreticilerle işe başlamanızı, temel mantığı kavradıktan sonra detaylara inmenizi öneririm. Öğreticilerle (Tutorial) ile bilgili bir diğer sorun da, genellikle hiçbir işe yaramayan, saçma sapan örnekler üzerinden gitmeleri. Ben, şahsen, makalelerimde, işe yarayacak, okuyucuyu heyecanlandıracak, az da olsa kendine güvenmesini sağlayacak profesyonel olarak para kazanbileceği örnekler vermeye çalışıyorum.
2. İlk olarak neleri bilmeliyim?
Bildiğimiz gibi, bilgisayarlar belli komutları alarak işleyen cihazlardır. Bir program da bu komutların bütünüdür. Bilgisayarların ortaya çıktığı ilk zamanlarda komutlar ard arda cihaza girilerek sonuç elde ediliyordu. Buna imperative programming yani emirli programlama deniyor. Tıpkı bir hesap makinesi gibi düşünebiliriz. Ancak ayrı ayrı programları farklı işlemler için tekrar tekrar yazmak gerekiyordu. Bu yüzden yazılımcılar bu programları düzenlemek için belli yapılara ihtiyaç duydular. Bunlardan ilki metod, işlev veya fonksiyon adını verdiğimiz, giriş değişkenleri ve döngü değeri olan yapılardır. Sadece bu yapılara dayalı olan programlamaya da Fonksiyonel programlama adı verildi. Smalltalk’ın kurucusu Alan Kay 1960’larda biyolojiden ve canlı hücrelerden esinlediği object yani nesneler sistemini önerdi. Buna göre bir nesne en basitinden ortak değişken ve metodlara sahip olan kod yapıları olarak tanımlanabilir.
3. Hangi dille başlamalıyım?
Bu soru çok geliyor. Neredeysa alfabenin harfleri kadar çok dil var. Şu dil daha üstündür, C, Javascripti döver diyen adam cahildir arkadaşlar. Nasıl çorba kepçesiyle, çorba içmeye çalışmıyorsak, ya da saatçi tornavidasıyla, duvar delmeye çalışmıyorsak, her dilin kendine ait bir kullanım amacı vardır. Benim hiçbilmeyen bir kişiye tavsiyem HTML, internet sayfası yazmaya yarayan dil ile başlamasıdır. Bu minik kişisel siteyi yaptıktan sonra ihtiyacınız olan ek özelliklere göre, CSS, JavaScript, PHP, Ruby, Python gibi dillere doğru zaten kendiniz yolalırsınız.
Algoritma, veri yapıları, nesne yönelimli programlama gibi kavramları bildiğinizde hangi dili bildiğinizin önemi pek yok. Google veya FB gibi büyük şirketler sınavlarında sadece algoritma ve veri yapıları soruyorlar. Bir de şu dil iyidir, bu dil iyidir gibi bir olay mevcut değil. Mühendsilikte iyilik kötülük olmaz, ihtiyacınıza göre en verimli olanı kullanırsınız. Mesela Raspberry Pi 1.2 Ghz bir işlemciye sahip ve atıyorum hayvani bi 3D oyunu çalıştırmaz, zaten ondan da onu beklemeyiz. Böyle düşünün.
Değinmek istediğim bir diğer konu ise algoritmalar ve veri yapıları. Bilgisayar Mühendisliğinde en lanet, en zor dersimizdi. Çok zorlanıyorduk. Aslında zor bir konu değildi ama çok emek istiyordu. Okul bittikten sonra Google’ın sınavında sadece bu konuyu sorduklarını gördüğümde o dersin değerini anlamıştım. Google, Microsoft, Facebook, Amazon gibi büyük şirketler eleman alırlarken, sadece algoritma ve veri yapıları sorarlar arkadaşlar. Çok emek ister, çok çalışma ister ama yapılmayacak birşey değil. Bu şirketlerde çalışan kişiler de sizin bizim gibi insanlar ve bir şekilde oralara gelmişler. Siz niye yapamayasınız? Tabii ki de yapabilirsiniz.
En son ve en önemli önerim de kesinlikle İngilizce. İngilizce’yi ne yapıp, ne edip öğrenmelisiniz. Tabii ki bir konuyu en kolay şekilde anlamanın yolu anadilinizden okumak, fakat yazılım zırt pırt diye iki ayda bir herşeyi değişen bir alan olduğu için, dünyadaki yeniliklerden haberdar olmanın en kolay yolu, İngilizce kaynakları takip etmektir. İngilizce zor bir dil değil ayrıca arkadaşlar. Dünyanın en kolay gramerine sahip, tüm bilimsel yayınların yapıldığı dildir. İngilizce öğrenmeye mecbursunuz.
Sonuç olarak, biraz merak, biraz araştırma duygusu, biraz özgüven ile başaramayacağınız birşey yok. Aklınıza takılan bir konu olursa da, internet yani tüm insanlığın bilgisi elinizin altında, yine bulamazsanız, buyrun bana sorun ben anlatayım.
4. Sıfırdan öğrenmek için makul bir uğraş mıdır? Yoksa nafile bir çaba mi olur hiç bilmeyen biri için?
Yazılım öğrenirken hiç bilginiz olmaması daha iyidir. Çünkü öğrenip derinleştiğiniz konu 1 sene içinde eskimeye başlar. O yüzden yeni öğrenen daima taze bilgiyle işe başlar. Sıfırdan öğrenmek için makul bir uğraştır. Programlamayı resim yapmaya benzetebiliriz. Uğraştıkça, projeler yaptıkça gelişir. Sadece konunun temel mantığını iyice oturtmak gerekir. Temelleri kavradığınızda daha zor işleri de tek tek halledersiniz. Genelde, yazılımcılar biraz kasarlar, yani işte yaptığımız iş çok zor vb havalarında gezerler. Bu havalar genellikle konunun derinliklerine inildikçe söner, çünkü yazılımcılık bitmeyen bir uğraştır, resim çizmek gibidir, teknik kuralları vb. vardır ama öğrenilebilir. Bu yüzden hiç bilmiyorum diye çekinmeyin.
5. Nesne Yönelimli Programlama ne işimize yarar? Öğrendiğimizde neler yapabiliriz?