Günümüzde yazılım elli sene öncesi gibi if/else/while ile yapılsa da, en büyük farklılığı gelinen soyutluk seviyesi teşkil ediyor. Elli sene önceki gibi yazılımcılar artık mikro işlemcinin üzerinde işlem yapmıyorlar. Artık yazdıkları program parçaları mikro işlemcilerin anlayacağı dilden bile değiller. Bazı programcılar sadece sanal makinelar için (virtual machine) program yazar oldular. Yazılan kod mikro işlemcinin registerlerine düşene kadar beş, altı katmandan geçiyor. Bu yazılımda süre gelen soyutlamanın bir neticesi. Yazılımcılar soyutlayıp, bir üst katmana çıkarak, gidişatı daha kavranabilir ve yönetilebilir hale getirmeye çalışıyorlar. Bu bir nevi evrim. Yazılımda ilerleme sadece bu şekilde mümkün.
Soyutlama yetisinin yazılımdaki yeri şüphesiz çok önemli. Bu olmadan günümüzün karmaşık uygulamalarını makina kodunda yazmamız mümkün olmazdı. Bu bir gereklilik. Lakin bu gerekliliğin karanlık bir tarafı da yok değil. Evrende hiçbir şeyi bedelini ödemeden, sürekli kendi çıkarınıza hizmet edecek şekilde kullanamassınız. Kazancın olduğu yerde, kayıpta olmak zorunda. Bu soyutlama mekanizmaları için de geçerli. Siz soyutladıkça işiniz kolaylaşır, lakin bunun bedeli olarak neyin nasıl çalıştığını, hangi temel prensiplere dayandığını bir zaman sonra kavramanız zorlaşır.
Soyutlama işlemi bir nevi bilginin ziplenmesidir. Mevcut bilgi alınır, üzerine bir kulp takılır, bir başka kulp daha takılır, daha sonra bir kutuya konur, o kutu da başka bir kutuya konur, paketlenir, paketlenir ve daha büyük bir paketin yanına konur, bu paketlerden kocaman bir dağ oluşur. Birisi gelir ve bu dağı zipler, o kadar bilgiyi avuç içine sığacak bir paket içine sıkıştırır. Başka birisi gelerek, bu ziplenmiş pakete yeni bir kulp takar ve soyutlama döngüsü böyle devam eder gider.
Bir karadelik düşünün. Bu karadeliğin bir iğne başı büyüklüğündeki bir parçası güneş sistemimizdeki tüm gezegenlerin kütlesine eşit ağırlıkta olabilir. Karadelik soyutlama işleminin karanlık tarafını gösteren güzel bir metafor. Soyutlama süreci yazılımda sürekli karadelikler doğurur, bilginin anlaşılamayacak şekilde sıkıştırılıp, yeni bilgiye dönüştürüldüğü karadelikler.
İşte günümüzde yazılımcılar bu karadeliklerle savaş halindeler. Her yeni jenerasyon ile karadeliklerin kütleleri artıyor, çünkü soyutlama süreçleri onları devamlı besliyorlar. Bugün bu karadeliklerin iğne ucu kadar parçaları birkaç gezegen kütlesine eşitken, önümüzdeki on yıllarda bu iğne uçları galaksilerin kütlelerine eşit olacaklar. Bilgi arttıkça, soyutlama süreçleri bu bilgileri sıkıştırıp, yoğunlaştıracaklar. Hem bilgi artacak hem yazılımcının hayatındaki karadelikler hem de yazılımcının bilgisizliği.
Artan bilgiyi verimli kullanmanın tek yolu soyutlamadan geçiyor. Bunun bedeli yazılımcı olarak nasıl çalıştıklarını tam olarak anlamadığımız araç, çatı ya da metotları kullanma zorunluluğu. Bu detay bilgi eksikliği oluşan sorunları daha kısa bir zamanda çözmemizin önündeki en büyük engel.
Hem soyutlamayı çalışma verimimizi artırmak için işimize geldigi gibi kullanma isteğine sahip olmak hem de alt tarafta olup bitenleri kavrama sorumluluğunu reddetmek, birbiriyle uyuşmuyor. Kendi içimizde çelişkiye düşmemek adına bu ikisini bağdaştırmamız gerekiyor. Bunu nasıl yapabiliriz?
Gerçek şu ki bilgi sürekli artacak. Bu sebepten dolayı mantıklı bir çerçevede kullanılabilmesi için soyutlanması gerekiyor. Soyutlama süreçlerinin sonucu her zaman yoğunlaştırılmış bilgidir. Bu yoğunluk bir karadeliğin ufacık bir parçasına galaksi boyu yıldız ve gezegenlerin sığması seviyesinde olabilir. Bu yoğunluktaki bir bilgiyi kullanarak, istediğimiz bir neticeyi elde edebiliriz, ama ne olduğunu anlamayabiliriz. Ne olduğunu anlamak için bilginin içine değil, temeline göz atmamız gerekiyor. Bilginin içine girdiğimiz zaman detaylar içinde kaybolabiliriz. Temelini incelediğimiz zaman, onu kavramamız daha kolaylaşacaktır.
Soyutlamanın yan etkilerinden korunmanın, yoğunlaştırılmış bilginin temelinde yatan prensipleri anlamakla mümkün olduğunu düşünüyorum. Temelde yatan prensipleri anladığımız taktirde, bilginin nasıl kullanıldığını değil, aynı zamanda neden kullanıldığını da anlayabiliriz. Neden sorusuna cevap verebildiğimiz taktirde, bilginin doğru yerde ve doğru şekilde kullanılması mümkün hale gelmektedir.
Bu yazım yazılımda temel prensipleri anlatmaya çalışacak bir yazı serisinin başlangıcını teşkil ediyor. Bu yazı serisi “Temelinde Yatan Prensipler” başlığı altında değişik konulara ışık tutmaya çalışacak. Bu serinin ilk yazısı “Mikroservis Mimarilerinin Temelinde Yatan Prensipler” başlığını taşıyor. Bu yazıyı yakında beğeninize sunacağım.
EOF (End Of Fun)
Özcan Acar
Yorumlar
“Karadelikler, Soyutluk ve Yazılım” için 3 yanıt
Ellerinize sağlık hocam .
Çok derin bir konu. Merakla takip ediyorum hocam başlığın devamını 🙂
Ellerinize sağlık, devamını beklemedeyiz hocam.