Kıymeti Bilinmeyen Eskimiş Bilginin Kıymeti

Bilginin yarı ömrünün aylar seviyesinde ölçüldüğü bir çağdayız. Her şeyi çok hızlı tüketiyoruz. Bu bilgi için de istisnasız geçerli. Bu durumun en büyük mağdurlarından birisi yazılımcılar. Sürekli yeni bir şeyler öğrenmek zorundalar. Onlarca çatıya (framework) ve onların neredeyse her ay çıkan yeni sürümlerine hükmetmek hangi yazılımcıyı zorlamıyor ki. Zaman zaman bu konuda ipin ucunu kaçırmışlık hissinin oluşması da cabası, öyle değil mi?

Yazılımda aslında bilgi bahsettiğim şekilde eskimiyor. Bu sadece subjektif bir algı. Bu yazımda bahsettiğim gibi değişen ya da gelişen sadece soyutluk seviyesi. Yaptığımız işin birkaç temel prensibi mevcut. Bugün yazılımda geldiğimiz soyutluk seviyesi bu birkaç temel prensibin üzerine inşa edilmiş durumda. Yeni çatıları ve onların sürümlerini kanser hücreleri gibi çoğaltan yazılımcının soyutlama ihtiyacı.

Yazılımcılar herhangi yeni bir çatıyı öğreneceklerse, edindikleri kaynakların mevzubahis çatının en son sürümüne vakfedilmiş olmasına dikkat ederler. Eski sürümlerle ilgili kaynaklara itibar etmez, onları eskimiş olarak sınıflandırırlar. Ama burada ne yazık ki gözden kaçan bir nokta bulunmakta. Bu yazımda bu noktaya değinmek istiyorum. Eskimiş olarak tabir edilen bilginin içinde çok büyük hazineler yatıyor olabilir. Söz konusu yazılım ise, eskimiş bilgi yazılımın temellerini açıklayıcı türden olabilir.

Ne demek istediğimi açıklamak için elektronikten bir örnek vermek istiyorum. Bugünkü modern mikro işlemcilerin temelinde dijital elektronik yatıyor. Dijital elektronik denince benim aklıma gelen TTL (transistor to transistor logic) bazlı AND ve NOR gibi mantık kapıları (gatter). Bu yazımda TTL bazlı mantık kapılarından yaptığım sayaç yer alıyor. Bu tür entegre devreler bundan elli, altmış sene önce yapılmış ve günümüzdeki modern mikro işlemcilerin temelini oluşturuyorlar. Bu mantık kapıları ile deneyler yapmış bir yazılımcıya bir programlama dilindeki &, |, &&, ||, ^ gibi operatörleri anlatmanıza gerek yok. Ne işe yaradıklarını ve nasıl kullanıldıklarını içgüsel olarak bilir, çünkü onları daha önce entegre devre olarak elinde tutmuştur. Bunun nasıl bir devlet olduğunu eline donanıma ait hiçbir parça almadan yazılımcı olma yolunda ilerleyen müstakbel programcılara baktığımızda anlayabiliyoruz.

Bahsetmiş olduğum entegre devrelerle 8, 16 ya da 32 bitlik bir mikro işlemciyi kendiniz oluşturabilirsiniz. Buna ne gerek var diyebilirsiniz. Dijital elektronik ve mikro işlemcilerin temel çalışma prensiplerini kavramak için bunun yapılması şart. Aksi taktirde bu yazımda belirttiğim gibi mikro işlemcilerden bihaberlik söz konusu olucaktır. Mikro işlemcileri ve çalışma prensiplerini tanımayan bir yazılımcının ne kadar iyi kod yazdığı tartışılır.

Günümüzdeki modern yazılımın ve donanımın temelini oluşturan ve transistör bazlı bu entegre devreleri anlatan güncel bir tane kitap bile bulamazsınız. Bu konularda muhtemelen en son kitaplar yetmişlerin sonunda yazıldı. Bu konuda ihtisas yapma istegim benden daha yaşlı kitapları edinmeme sebep oldu.

Bugün hangi yazılımcının eline 1974 de yayımlanmış TTL cookbook kitabını verseniz, “bu ne, bunun 2016 sürümü yok mu” diye size soracaktır. İronik ama ne yazık ki gerçek: yazılımcı her daim bilginin en son sürümünü tüketme eğilimi gösteriyor. Bunun ne kadar fatal error olduğunu bu yazımda aktarmaya çalışacağım.

Bu yazıyı kaleme alma fikri node.js öğrenmek için aldığım bir kitabı okurken oluştu. Kitap 2012 yılında yayımlanmış ve node.js in 0.8 sürümünü baz alıyor. Kitaptaki örnekleri uygulayabilmek için node.js sayfasına giderek, oradaki en güncel sürümü edinmem gerekti. Bir de ne göreyim, en güncel sürüm 5.5 versiyon numarasına sahip. Aradaki farka bakar mısınız! Yerimde kim olsa hemen o kitabı çöpe atıp, node.js 5 sürümünü inceleyen bir kitap alırdı, hatta hatta o kitabı almazdı. Bir ara kendimi güncel node.js kitaplarını araştırırken bulmadım değil. Bunun başlıca sebebi, en yeninin en iyi olduğunu düşünmemiz. Lakin ben node.js öğrenmeye bu kitapla devam ediyorum. Neden mi?

Her çatının temelinde yatan bazı prensipler vardır. Bu Spring çatısında örneğin bağımlılıkların enjekte edilmesi ve bağımlılıklerın tersine çevrilmesi (DIP – Dependency Injection Principle) prensibidir. Bugün güncel bir Spring kitabı alın, bahsettiğim bu iki konunun derinlemesine incelenmediğini ya da bir, iki sayfada geçiştirildiğini göreceksiniz. Bunun yerine artık onlarca modülden oluşan bir Spring çatısının yüzlece sayfada ve onlarca örnekte nasıl konfigüre edildiğini okursunuz. Bu büyük bir buzdağının su üstünde kalmış küçücük bir kütlesi ile ilgilenmek ve derinde olup, bitenlerden bihaber olmaktan başka bir şey değildir. Günümüzüm bilimum bilişim kitapları bu buzdağının görünür kısmını incelerler, çünkü soyutlama dediğimiz şey o buz dağının en tepesine çıkma eğiliminden başka bir şey değildir. Oradan suyun altında olup, bitenler hakkında fikir yürütmek imkansızdır. Buzdağının nereye gideceğini tayin eden suyun altındaki kütlesidir, suyun üstünde kalmış şapkası değil.

Şimdi node.js örneğine geri dönmek istiyorum. Node.js günümüzün en popüler çatılarından birisi. Kısa zamanda 5.5 sürümüne gelmiş olması bunun en güzel ispatı. Bugün node.js in 5.5 sürümünü anlatan bir kitap ile node.js öğrenmeye başlayan birisi, node.js in var olma nedeni olan temel prensipleri anlayamadan, node.js in ve ihtiva ettiği modüller içinde kaybolup, gidecektir. Sürüm versiyon numarası çatının hacmine işaret etmektedir. Hacim ne kadar büyükse, yazılımcının onun altında kalma ve ezime teklikesi o kadar büyüktür. Yazılımcı bu kütle altında kalmamak için ondan uzak durur. Sadece onu yüzeysel olarak anlar ve kullanır yani buz dağının tepesinden ona hükmetmeye çalışır. Buna karşın çatının ilk sürümlerini inceleyen bir kitap kendini olmayan bu hacme değil, çatının temelinde yatan ana prensiplere adayacaktır, çünkü işin başlangıcından temel prensiplerden başka anlatılabilecek bir mevzu yoktur. Bu şekilde çatının temelinde yatan temel prensipleri kavramak ve doğru yerde kullanmak mümkün olacaktır.

Bu radikal bir fikir gibi görünüyor olabilir. Lakin soyutluk denen canavardan kurtulmak ve motor kapağı altında olup, bitenleri kavramak, daha iyi bir yazılımcı olabilmek için günümüz koşullarında artık zaruri hale geldi. Biraz daha geriden sarmak ve eski sürümlerden öğrenmeye başlamak zaman alıcı bir uğraş gibi görünebilir. Lakin bu yatırımın size yol ve su olarak geri döneceğinden emin olabilirsiniz 😉

Neden Spring, JPA ve Diğer Çatılar ÖğrenilmeMEli” başlıklı bir yazım olmuştu. O yazımda da belirttiğim gibi “Teknolojiler gelip, geçicidir, felsefeler ise her zaman daim”.


EOF (End Of Fun)
Özcan Acar


Yorumlar

“Kıymeti Bilinmeyen Eskimiş Bilginin Kıymeti” için 2 yanıt

  1. Hocam, yazınız için teşekkürler.
    Bir not: bu node.js’nin versiyonlaması ve release’leri biraz karışık. Daha geçen seneye kadar 1.0’a ulaşamamıştı versiyonu, bir anda 2,3,4,5… gidiyor 🙂 https://github.com/nodejs/node/releases

  2. Ertuğrul avatarı
    Ertuğrul

    Güzel bir yazı, gerçekten çok önemli bir noktaya değinmişsiniz hocam. Bu serinin bir sonraki yazısını dört gözle bekliyor olacağız..
    Bu cümle çok isabet olmuş , aynen hissiyatımızı yansıtmış “Zaman zaman bu konuda ipin ucunu kaçırmışlık hissinin oluşması da cabası, öyle değil mi?” 🙂
    Teşekkürler hocam, Elinize sağlık..