İyi kavramının 'maalesef' herkese göre değişiklik gösterebildiği aşikar ve bence ana çıkış noktası beklentilerdir. Yazılım ekosistemi bunun en somut örneklerindendir. Geliştirici ile paydaşlar veya müşterinin 'iyi' beklentileri tamamen farklı olabilir. Yani bir kullanıcının müthiş gördüğü bir proje aslında çok kötü ya da tam tersi olabilir. Bu yüzden ö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 karmaşık bir mekanizmadır. Aslında ne demek istiyorum? 'Ölümüne kod yazmak'la yazılımcı olunmaz! Yazılımın aslında gerçek hayattan farklı olmadığını yansıtan bir düşünce tarzı vardır ve bunu kavrayabilmek kod yazmaktan çok daha önemlidir.

Bilgisayar denen aletin ilk yıllarına şöyle bir dönüp öncesinde fark makinesi, hesap makinesi, turing makinesi gibi örneklerini düşünelim... Bizim şu an klavye ve monitörle bir satırda yaptığımızı sandığımız işin gerçeğini yapan makineler. Toplama çıkarma bir yana çarpma ve bölme yapabilme becerileri! Aslında hepsi birer 'soft-ware' olsa da o zamanlar böyle süslü bir isim sadece kumaşların yumuşak kısımları için kullanılırmış. Yani bu kelimenin etimolojik tarihinde bilgisayar için kullanılmaya başlanması 1960'lar civarına denk gelir. Çünkü ilk yıllarında bilgisayarı yapan ve onu programlayan zaten aynı kişi olduğu için işletim sistemi gibi bir ihtiyacı yok. Hal böyle olunca başlarda yazılım benzeri genel bir tabire de ihtiyaç yokmuş.

Biraz daha yakın geçmişe bakarsak; örneğin uzun yıllar 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. 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

Yandaki merdiven aslında bahsetmeye çalıştığım senaryonunun küçücük bir örneği olabilir. Bu keşmekeşe rağmen, farkında olmadan merdivendeki arkadaşımızın yerinde olmayı isteyen; yani sadece kar odaklı olmaya zorlanmış, baştan yanlış başlayarak öyle devam etmiş, kısaca katostrofik hale gelmiş projelerde yer almak için sırada bekleyen bir sürü insan doludur. Bu kesimin bir kısmı, bırakın projede sadece çalışmayı, yanlış giden bu yöntemleri öyle içine sindirmiş öyle benimsemiştir ki; bunlar artık onun tek doğrularıdır. Bu yanlışları gündeme getirdiğinizde bunları savunmak için yanıp tutuşurlar.

team jumping

Bir diğer kısmı ise, en azından projedeki yanlışların farkındadır. Bunları kabul eder ve 'bununla yaşamayı öğrenir' 🤦‍ Şahsen; tamamen profesyonel yaklaşımları uygulayarak büyüdüğünü düşündüğüm bir sürü projede bunu birebir gördüm. Benim de yapmaya çalıştığım zamanlar oldu ama anladım ki ben, bile-isteye kötü kod yazamıyorum; böyle bir "yeteneğim" yok(!) Buna karşın yapmaya çalıştıklarım şahsi meseleler olduğu için değinmeyeceğim. Şurası koca bir gerçek ki; bu anlayışı değiştirmek çok uzun bir yol Gerçi işin şöyle bir boyutu da var: %100 herşeyin doğru olduğu bir proje beklemek zaten fazla ve gereksiz bir iyimserlik, hayalperestlik olur. Yani koskoca google, facebook gibi yazılım devlerinin bile halen neler geliyor başına. Ama çok temel şeylerde yapılacak yanlışlar bir projeyi içinden çıkılmaz hale getirir. Benim üzerinde durduğum konu bu. Yani koddaki 'yan etki' kabul edilebiilr seviyede olmalıdır. 'Bağımlılık(en ufak değişkenden, fonksiyondan; sınıfa, pakete kadar...)', 'esneklik', 'genişletilebilirlik', 'yönetilebilirlik' gibi etkenler benim bahsettiklerim... Hatta daha koda geçmeden çıkarılacak analizler, testler hepsi bir bütündür. Bunları doğru uyguladığınız zaman 'Agile Software Development', 'Extreme Programming', SCRUM vb. yaklaşımlar adı havalı geldiği için kullanılan&kullanılmaya zorlanan kavramlar olmaktan çıkıp; işe yarar birer yöntem halini alır. Yani aslında bu yaklaşımlar 'clean' olan&olmuş&olacak ya da son çare olmasına izin verilecek kod içindir. Eğer kod böyle değilse bunları uygulayamaz, sadece uyguladığınızı sanırsınız. Bu kültürü doğru edinebiliyor olmak yazılım geliştirmekten çok daha önemli bence.

Programlama dili

Üst paragraflarda bahsetmeye çalıştığım 'programlama dili' hadisesi bilgisayarı yapan kişi dışında bir kullanan olması ihtiyacı ile doğmuştur. Diğer türlü o kadar karışık bir yapıdır ki şu an yazdığımız bir satırlık kodu yazabilmek demek saatleri alacak bir süreçtir. Bu yüzden günümüz modern 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 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. Hoş, nesne yönelimin de kullanılmaması gerektiğini savunan çok küçük bir kesimvar ama ben bunlardan değilim. Yani 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.

Bilmemne framework'ü muhteşem(!)

Bir dil, bir framework, bir teknoloji adına ne derseniz deyin bağımlısı olmak anlamsız ama gerçekten bildiğinizi düşündüğünüz bir dil tabi ki şart. Ancak bildiğiniz dil sayısıyla övünmek ancak konuşma dillerinde işe yarar. Çünkü CPU denen işlem birimi sadece makine kodundan anlar ve siz onunla arada bir tercüman olmadan birebir konuşamazsınız. Özellikle son yıllarda CIL, JWM, interpreter benzeri 'tercümanlar'  bu ihtiyacı bir nevi soyutlamıştır. Dil bu şekilde soyutlanınca modellemenin soyutlanmasına da daha fazla yük binmiştir ve asıl mesele bu modellemeyi düzgün bir şekilde kugulayabilmektir. ihtiyacı verimli şekilde karşıladıkça bir dil yeterlidir, iyi ya da kötü tarafları muhakkak vurgulanabilir, paylaşılabilir ama ateşli savunucusu olmak gereksiz. Yeterli gelmediği eskide kalıyor demektir. Kısacası; eğer illa bağımlısı olunacaksa yaklaşımların bağımlısı olunabilir. 

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. 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ığım özellikle dikkatinizi çekmiştir. Haliyle algoritmayı da zaten bilimsel terimleri ile binlerce kaynaktan bulabilirainiz; 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.

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.
  • Çok kesin bir plan yapmayın ama bir teknoloji, bir framework, bir prensip, bir kütüphane veya metodoloji ne olursa olsun 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 bile olsa mutlaka kendiniz deneyin.
  • Ve bence en önemlisi ki özellikle bir açıklama yazmayacağım; şu muhteşem söz... : "Bir insanın zekası, verdiği cevaplardan değil; soracağı sorulardan anlaşılır" Albert Einstein

Software development