ile

Hiç bilmeyenler için 7 soruda Yazılım Geliştirme


1. Yazılım yapmayı öğrenmek istiyorum ama hiçbirşey bilmiyorum. Nereden başlamalıyım?

Öncelikle özellikle kızlarda gördüğüm sounu 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 Manchester’da katıldığım CakePHP konferansı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 PHP uzmanlığını 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. Projelerle PHP 7 kitabındaki, Kızılyıldız Matbaacılık, şirket internet sitesi yapma örneği bunun içindi mesela.

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. Bi kaç tanesine girdim, Microsoft’unkini de geçtim ordan biliyorum. Ben PHP uzmanı olduğum için (Zend Sertifikasına sahibim) ve web yazılılmları alanında kendimi geliştirdiğim için PHP anlatıyorum, ama mesela son bir senede Objective-C, Java ve Haxe gibi dillerle proje geliştirdim ve sorun yaşamadım. 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. Bir konferansta (2011’de Manchester’da cakePHP konferansı) nasıl başladıınız diye sormuştum panelistlere, elemanın biri Starbucks’ta barmendim, bi arkadaşım iyi para kazanıyordu ben de merak ettim başladım dedi. Dinleyenler falan da mühendis hep, bize anlatıyor işin inceliklerini. 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?


Nesne yönelimli programlama öğrendiğimizde, uygulama geliştirmek bizim için daha verimli hale gelir. Mesela meyve sebze yetiştirdiğinizi düşünün, eğer nesne yönelimli programlama kullanmazsanız, tarlanızda domatesler lahanalar biberler karmakarışık olur. Bunun yerine domatesleri bir tarafa, lahanaları bir tarafa yerleştirirseniz, tarlanızdaki sebzeleri daha rahat yönetirsiniz. Bu yüzden yapısal olmayan kodlara biraz da aşağılamak için “Spagetti kod” denir, kodu okuyan size küfreder. Konunun tam mantığını anladığınzda, örneğin Java öğrendiyseniz, C benzeri başka bir dili öğrenmek ve yapıları anlamak sizin için çocuk oyuncağı haline gelir. Nesne yönelimli programlamayı kullanarak, bir çok platformda çalışan mobil uygulamalar, web portalları, içerik ve diğer yönetim sistemleri, web siteleri geliştirebilir, kodlarınızı diğer kişilerle paylaşabailir, ve yeniden kolayca kullanabilirsiniz.

6. Algoritma Nedir?

Algoritmayı şöyle anlatabilirim. Mesela masada oturuyorsun ve masada bir bardak su var. Susadın ve suyu içeceksin. Önce gözünle masadaki bardak ile elin arasındaki mesafeyi ölçüyorsun,
sonra belli bir açıyla vücudunu eğeceksin, daha sonra yine tek tek hesaplanmış açılarla omzunu, kolunu dirsek ve bileğini büküp elini bardağa yaklaştıracaksın. Elini ve eklemlerini kullanarak bardağı tutacaksın. Suyun sıcak olup olmadığını kontrol etmen gerek tabi. Elindeki sinirlerle bunu hissedeceksin. Sonra bardağı belli bir kuvvetle tutman gerekiyor. Fazla sıkı tutarsan bardak kırılabilir. Fazla gevşek tutarsan bardak düşebilir ve sular yerlere saçılabilir. Bardağı belli bir mesafeye kadar kaldırman gerek. Ağzınla aynı seviyeye getirip kafanı da geri belli bir açıyla yatırarak suyu içmen gerekiyor ama tabi o sırada nefes almamalısın yoksa boğulabilirsin. Bardaktaki su bittiğinde aynı işlemleri yapıp bardağı tekrar yerine koyman gerek.
Gördüğün gibi, en basit masadaki bardaktan su içmemiz bile karmakarış bir algoritma, deli bir bilgisayar programı aslında. Ve biz bunun farkında değiliz.
Örneğimize geri dönersek; İki tane durum var susamış olma hali ve susuz olma hali. Birincisi başlangıç durumu. İkincisi de bitiş durumu. Amacımız susuz olma haline ulaşmak. Başta elimizdeki veriler
1. susama hissi
2. Masada gördüğümüz bir bardak su
İşlem süreci ise
1. Masaya doğru elimizle kolumuzla başımızla yaptığımız hareketler 
2. suyu içmemiz
Sonuç durumda da elde ettiğimiz durum
1. susuzluk hissi 
2.masada kalan boş bir bardak
Yani programın giriş durumu ve çıkış durumları başlangıcı ve bitişini böyle anlatabilirim. Programlama herkes içindir. Anlamadığım şey bilim değildir. Şu siteyi de incelemenizi öneririm: https://visualgo.net/

7. Model View Controller, MVC nedir?

Üstteki maddede PHP frameworklerinin MVC tabanlı olduğunu söyledik. MVC, Model, View, Controller kelimelerinden oluşur. Mantık olarak, bir yazılım bloğunun her işi yapması değil, belli sorumluluklara ayrılmış parçalara bölünmesi amaçlanır. Bu sayede yazılım hem daha kolay yönetilir, hem de hata düzeltmek daha kolay olur. Model verilerin kayıt edilmesiyle ilgilenen, (Persistence Layer) dediğimiz veri kayıt katmanıdır. Bunu bir yerdeki kütüphaneci veya arşiv memuru gibi düşünebilirsiniz. Controller dediğimiz (Business Layer), kontrolcü katmanını, vücuttaki beyin gibi düşünebilirsiniz. Beyin, gelen algılara göre tepkiler üretir. Mesela korkunç bir film izlediğimizde veya yüksek bir yere çıktığımızda, vücudumuza belli emirler verir, kalp atışlarımız hızlanır, bu sayede hayatta kalmamız kolaylaşır. View ise, sunum katmanıdır. (Presentation layer), yani modelden alınıp, kontrolcünün hesapladığı bilgileri, allayıp pullayıp süsler ve örneğin ekrana basar. Ayrıca görünüm-sunum katmanı sayesinde programı kullanan kullanıcıdan belli bilgileri de alırız. Örneğin, formları doldurur, bir butona basar gibi.


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/midorikocak.pdf 
Websitem:
http://mtkocak.net

Yorumla

Yorum