Öncelikle bu yazı ile ilgili bir konuya direk açıklık getirmek istiyorum.🙋‍♂️Eğer halihazırda bir yazılım uzmanıysanız ve ömrünüz boyunca sadece tek başınıza kod yazacaksanız ki bu neredeyse imkansıza⚠️yakındır; bu yazı size hitap etmemektedir. Yok yazılımcı değil, olmak isteyen biriyseniz ve 'Nasıl Yazılımcı olunur' sorusunu soruyorsanız, yazılımda bir isteği karşılamanın onlarca değişik yolu vardır. Bu yollardan en doğru olanını seçmek, belli bir bilgi ve birikim sonucu oluşan bir mekanizmadır. Aslında ne demek istiyorum? Ölümüne kod yazmakla yazılımcı o-lun-maz! Yani ömrünü bilgisayar başında tüketip, bir günde ezbere yüzlerce satır çöp yığını kod blokları yazmak bir insanı yazılımcı yapmaz. Hasbelkader bu şekilde çalışan bir program ortaya çıkarılmış olabilir ama onda bir değişiklik veya yeni geliştirmeler istendiğinde, bahse konu arkadaşımızı afakanlar basacaktır. Çünkü kurduğu, daha doğrusu kuramadığı yapı buna uygun değildir. "Her yiğidin bir yoğurt yiyişi vardır" atasözü yazılımda pek sökmez.🤓Hatta özellikle söktürülmemelidir diye düşünenlerdenim.

kaydirak

Örneğin uzun yıllardır denenip sınanan network topolojilerini düşünün. Bunlar ilk denendiğinde, bilgisayarlar sınırlı sayıda ve sadece ofislerde kullanılan makinelerdi. Daha sonra bir sürü farklı donanım, farklı işletim sistemi... Birbirleriyle bırakın anlaşmayı tanışık bile değillerdi. Zamanla bu tanışıklığı ilerletmek için TCP/IP, FTP, HTTP, NetBEUI gibi protokoller oluşturulmuş ve dünyadaki broadcast geçirmeyen en büyük network olan internette de doğru çalışabilmesi için bu protokollere uyma zorunluluğu getirilmiştir. Yoksa ilk zamanlarında olduğu gibi hiçbir cihaz birbiriyle anlaşamaz bütün yapı arapsaçına dönerdi. Buradan hareketle; şahsen bunun açık kaynak da dahil yazılım dünyasında da böyle olması gerektiğine inanırım. Aslında açık kaynak için keskin kurallar getirmeye çalışmak adına ters gibi gelebilir. Ama inanın açık kaynak projeler, olmayanlara kıyasla çoğundan daha gelişmiştir. Çünkü projeye katkı sağlanması isteniyorsa herkesin isteyeceği standardizasyonlar sağlanmalıdır. En basit örneğiyle, kodlamanızda bir standart getirilmez ve 'herkes kafasına göre' yazarsa ki bizde durum çoğu yerde maalesef halen böyledir, kodu baştan yazmak bir hafta alacaksa onu düzeltmek 1 ay sürer. Hatta çoğu zaman hiç düzeltmeye değmez. Yukarıda örneğini verdiğim protokoller gibi yazılımda da böyle standartlar getirilmesi için çeşitli mimariler ve yaklaşımlar ortaya çıkmıştır. Bu yaklaşımlar uzun yıllar sonucu oluşmuştur;  çünkü kimse bir başkasının kapısının önüne attığı çöpleri temizlemek istemez! 😒

merdiven

Günümüz geçerli dillerinden herhangi birisi ile introduction bitip nesne yönelimli programlamaya gelene kadar, öncesindeki diller ile öğreneceğiniz birçok bilgiyi edinirsiniz. Zaten bu diller de eskiden geçerliliği sayılan birçok dilin kullanışlı özelliklerini bünyesinde barındırdığı ve önceki dillerde bulunmayan esnekliği programcıya sağladığı için bu kadar rağbet görmektedir. Ancak özellikle platforma özel donanım özelliklerinden dolayı halen özellikle tercih edilen diller de vardır.  Donanım olmasa da başka bir açıdan örnek olması için; çoğu bankada yıllar önce COBOL ile yazılmış koca bir sistemi baştan aşağı kayıpsız değiştirmek neredeyse imkansız ve aşırı maliyetli olduğu için halen bu dil ile yürütülen eskiden yazılmış çok sayıda bankacılık operasyonu bulunur.

Programlama Dilleri Soyağacı - Etkileşim içindeki diller

Ayrıca, öncesindeki birkaç dilde daha yer almasına rağmen asıl C++ ile Bjarne Stroustrup tarafından öne çıkarılan nesne yönelim konseptinin büyüyen projelerden soğumamanız için çığır açtığını düşünürüm. Nesne yönelimli programlamanın ilk temelleri, bundan 50 sene kadar önce Simula programlama dili ile Ole-Johan Dahl ve Kristen Nygaard tarafından atılmıştır. Fakat işin aslı nesne yönelim şu an böyle tek bir makalenin bir köşesine sığmayacak kadar geniş bir kavram, kıymeti bilinmesi gereken apayrı bir yaklaşımdır.

Burada teknoloji ile dili ayırmak lazım. Bir balta bile insanoğlunun işini kolaylaştırdığı için sonuçta teknoloji olarak kabul görür. Bir teknoloji olmadan da yapacağınız işi yine yaparsınız yalnız aradaki zaman ve iş gücü kaybı su götürmez bir gerçektir. Ancak bu bazen insanı garip bir ikileme sokuyor. Yazmanız gereken satırlar kalkmış oluyor ama mutlaka yapılan işte araya girme ihtiyacı doğuyor. Bunu sizin yerinize başkaları bir nevi "otomatikleştirdiği" için, öğrenmeniz gereken bazı şeyleri es geçmiş sayılıyorsunuz. Fakat bunların sonradan önünüze çıkma ihtimali oluyor. Onun için sürekli yeni şeyler öğrenerek kendini geliştirmenin ötesinde, bunun ayrımını zamanla ve ihtiyaç olduğunda yapabilmek bence çok daha önemli.

Programlama Dili

Hangisinin daha esnek olduğu tartışılabilir fakat bu aşamada hangi dil diye bir soru olmaz, her dilin kendince kolaylıkları ve zorlukları vardır. Ayrıca derleme(compile) süreci sonunda hepsi bir şekilde makine koduna dönmek zorundadır. Eğer başta doğru programlamanın kriterlerini öğrenmeye çalışarak başlarsanız, böyle bir soruyu sormamanız gerektiğini zaten anlarsınız.

Kısacası bu işi gerçek manasıyla öğrenmek isterseniz, etraftan duyduğunuz "Sişarpda ne var ben her şeyi komple öğrendim; javada bir şey yok, yedim yuttum" benzeri söylemler sizi uçuruma sürükler. Bu söylemlerin %90'ı, çeşitli framework yapılarını kulaktan dolma duymuş ve sağladığı kolaylıklara atıfta bulunarak "n'olacak ki artık herkes programlama yapabilir" algısından öte gidememiş hayal mahsulü söylemlerdir. Hatta programlamanın ne olduğunu bilmeden alacağınız o bildik programlama kitaplarının hemen hepsi direk dile giriş yapar ve siz bilmediğiniz kavramlar içinde bocalar durursunuz. Doğru şekilde öğrenmek istediğinizde ayrıntılara inme ihtiyacı hissettiğiniz yerler gelir. Ancak bu bilmediğiniz kavramlar bir türlü o ayrıntılara inmenize izin vermez. Sonuçta boşuna zaman ve emek harcamış olursunuz ki bir programcının en büyük sermayesi aslında bu ikisidir. Ha bu şekilde bodoslama da olsa öğrenilmez mi, tabi öğrenilir ama şuna emin olun öğrendiğinizin adı programlama veya dili değil, çocuk yaşta ezberlenen şiirlerin bir benzeridir. Programlama dilini geçtim bir konuşma dilini öğrenmek için bile dilbilgisinde genel kabul görmüş özne, yüklem, tümleç gibi cümleyi oluşturan öğeleri anlar; ardından nerede sıfat, nerede zamir olur gibi ayrıntılara girersiniz. Yani dilbilgisi olmayan birinin yüzlerce sayfalık bir roman yazdığını düşünün. 😵 Programlamada da bu böyle olmalıdır.

Programcılığın en basit konusu olan karar yapılarını ele alalım. Bir if-else bloğu yazarken 2 durumu karşılaştırırsınız. Eğer bunun dışında, "Bu doğru olabilir, eğer bu seçenek doğru değilse aşağıdakine atla, hiçbiri değilse zaten yanlıştır" diyeceğimiz zaman ise if-else if ya da switch-case bloklarından oluşur yapımız. İşte bu yapıyı öğrenirken aslında yazılım diye öğretilen ama yüzyıllar öncesinde bulunan mantık biliminin özünü öğrenirsiniz. O da bizi, bir kolu olduğunu düşündüğüm algoritmaya götürür. Eğer buraya kadar okuduysanız, aslında çok zorda kalmadıkça kafa karıştırıcı teknik açıklamalar kullanmaktan kaçındığıma özellikle dikkatinizi çekmiştir. Haliyle algoritmayı da zaten bilimsel terimleri ile binlerce kaynaktan bulabilirsiniz. Kısa bir örneği için şu yazıma da göz atabilirsiniz. O yüzden burada tanımından bahsetmeyeceğim ama şunu özellikle belirtmek istiyorum. İlk defa duysanız bile aslında algoritmanın ne olduğunu biliyorsunuz. çok ciddiyim, şu an bu yazıyı okurken dahi "algoritma motorunuz" zaten çalışıyor. Bu kısma gelene kadar açıkladıklarıma belki hak verdiniz, belki saçma buldunuz. İşte bunun kararını size verdiren, şu an seçeneği düşünürken beyninizin size verdirdiği kararların bütününe algoritma diyoruz.

Daha önce benzeri şeyleri doğru olarak uyguladıysanız tekrar etmezsiniz. Tabi gelişimi ayrı ama daha önce çözülmüş bir problem için tekrar bir algoritma kurmanın gereksiz olduğu aşikar. Kısacası insanız işte, ayrıntıları unutabilir, yazdığımız uygulamanın eksiklerini ilk yazışta göremeyebiliriz. Bu yüzden adına her ne derseniz deyin bir ön hazırlık her zaman avantajdır. üst paragfarda mantık üzerindeki vurguma şimdi gelirsek; algoritmalarda karşılaşılan en sık hatalar mantıksal hatalardır. çözüm aşamasında yapılacak ufak bir mantık hatası zincirleme hatalara neden olabilir ve en basit algoritmayı bile bir süre sonra içinden çıkılmaz bir hale getirebilir.🤙

Sonuç olarak, şahsen önerilerim

  • Programlama dili ile ya da ondan bağımsız olarak 'algoritma motoru'nuzu olabildiğince işler hale getirin.
  • Programlama dışında kafanızı rahatlatacak -mümkünse tamamen ilkel- birşeyler mutlaka bulun.
  • Bir teknoloji, bir framework, bir prensip, bir kütüphane veya metodoloji adına her ne derseniz deyin adım adım gidin. Derede yüzmeden okyanusta boğulmayın!
  • Şu dil ile başlamam gerek gibi bir saplantıya kapılmayın. Modern dillerden biriyle başlayıp önce temelleri öğrenin.
  • En saçma kodunuz olacak olsa bile mutlaka kendiniz deneyin.
  • Ve bence en önemlisi ki özellikle bir açıklama yazmayacağım; şu muhteşem sözün önemini kavrayın, üzerine düşünün, uygulayın... :"Bir insanın zekası, verdiği cevaplardan değil; soracağı sorulardan anlaşılır" Albert Einstein