İnsan doğasını şekillendiren temel gereksinimler, düşünce ve davranışları biçimlendiren, evrimsel süreçte zihnimizin üzerinde en çok durduğu ve kalıtımsal olarak kuşaklara aktarılan içkin unsurlardır. Bu unsurlardan olan güvenlik gereksinimi, insan belleğini hatırı sayılır derecede meşgul eder. Her yaştan ve her kesimden insan, günlük yaşantısında zihni tarafından uyarıldığı tehditlerle karşılaşır. Bu tehditlere gösterdiği tepkiler çoğunlukla içgüdüseldir ve büyük bölümü unutulur.

Bir çeşit otomasyon sürecinin işletildiği zihnimiz, güvenli alan oluşturma ve kendini korumaya alma gibi doğuştan gelen yetilerinin yanında deneyim ve bilişsel çaba ile de birtakım içgüdüsel beceriler geliştirmektedir. Hangi meslekte olursa olsun, çalışma ve üretim süreçlerinde elde edilen deneyim ve bu deneyimlere bağlı çıkarımlar, kişinin fiziksel yahut bilişsel olarak motor becerisi haline gelebilmektedir.

Yazılım mühendisliği de deneyim ve çıkarımlarla, benzersiz örüntüler inşa ederek mühendislere içgüdüsel beceriler kazandıran mesleklerdendir. Bu kapsamda yazılım mühendisliğini bazı mesleklerden ayıran kritik bir faktör bulunur. Bu faktör, yazılımın özünü teşkil eden “dil” kavramıdır. Kendi içinde çeşitli dil modellerini barındıran yazılım mühendisliği, yaratıcılıkta sınırsız bir esnekliğe sahiptir. Günümüzde yaşanan yapay zekâ geliştirmeleri, bu yaratıcılığın kanıtı niteliğindedir.

Yazılım dilleri işlevsellik açısından doğal dillerden farksızdır. Yaşantımızda konuştuğumuz, yazıp işlettiğimiz doğal diller, mikro ölçekte doğrudan doğruya düşünce biçimimizi, davranışlarımızı ve dünya görüşümüzü kodlayan, bize kişilik ve irade özelliği kazandıran temel bileşendir. Makro ölçekte kültürü, gelenek ve medeniyetin tüm bileşenlerini şekillendirir ve geleceğe aktarır. Bu bileşenin yaşantımızı doğrudan şekillendirmesindeki yeri ve önemi, yazılım dillerinin gelişimiyle birlikte iyice belirginleşmiştir. Ludwig Wittgenstein’ın 1922 yılında dil felsefesi alanında kaleme aldığı ‘Tractacus Logico-Philosophicus’ (Mantıksal Felsefi Bir İnceleme) adlı eserinde ifade ettiği “Dilimin sınırları dünyamın sınırlarıdır.” önermesindeki haklılığını, geliştirilen yazılım dillerinin oluşturduğu işlev, örüntü ve çıktılar neticesinde tam anlamıyla kavramaya henüz yaklaşabildik.

Belleğin Çağırma Fonksiyonu

Temel yazılım dillerinden C’de fonksiyonlar için ‘değer ile çağırma’ (call by value) ve ‘referans yoluyla çağırma’ (call by referance) olmak üzere iki çağırma yöntemi vardır. Call by value ile yapılan çağırma işleminde çağıran program argümanındaki veriler, çağrılan fonksiyon içindeki değerlere import edilir. Fonksiyon içinde yapılan parametre değişiklikleri, çağıran program argümanlarını etkilemez. ‘return’ komutuyla çağrılan fonksiyon geri gönderildiğindeyse veriler silinir. ‘Call by referance’ yönteminde ise çağıran program argümanının bellek adresi referans gösterilir, bu da argüman ile çağrılan fonksiyon parametrelerinin aynı bellek alanını kullanması anlamı anlamına gelir. Böylece çağrılan fonksiyonun çağıran program argümanına doğrudan aktarılmasını sağlar.

Zihnimizin çalışma prensipleri de benzer yöntemleri kullanmaktadır. Geçici ve kalıcı hafızanın farklı araçsallıklara sahip olması, birbirlerini doğrudan etkileyebilecek bağıntılardan uzak oldukları anlamına gelmez. Kısa süreli bellekte tutulan veri -tıpkı C dilindeki fonksiyon çağırma yöntemlerindeki gibi- gerekmiyorsa kalıcı hafızaya aktarılmaz. Bu aktarımın gerçekleşmesi için bilişsel ya da motor öğrenme gibi olguların devreye girmesi gerekir. İsan belleği bu bağıntı ve fonksiyonları bir yazılımcı eliyle değil, anadil aracılığıyla kendiliğinden, bilişsel bir işlev olarak yürütür. Peki bu bağlamda deneyimli bir yazılımcının belleği, hangi koşullarda, ne tür yöntemler kullanarak, neleri çağırır?

Peter Naur 1984 yılında yayınladığı “Yazılım Geliştirmede İçgüdü” başlıklı makalesinde bu durumu şu ifadelerle açıklamaktadır:

“Deneyimli bir programcının deneme-yanılma eylemi, zihnin mantık yürütmeksizin anında kavrayışına dayalı olarak kasıtlı bir eylemde bulunmayı içermesi bakımından, içgüdü olarak nitelendirilebilir.”

Peter Naur – 1984

Fakat “acemi programcı”ların içkin (varoluşun parçası haline gelmiş) bir deneyim ve çıkarım örüntüsüne sahip olmadıklarını da vurgulayan Naur, onlardan gelen çıktıları öğrenme süreçlerinin bir parçası olarak ele almış, bu içgüdüselliğin dışında tutmuştur.

Deneyimli programcının belleğinde, kendi bilgi, tecrübe ve çıkarımları arasında oluşmuş örüntüler, doğru fonksiyonlar neticesinde ihtiyaç belirleme, planlama, tasarlama, uygulama vb. Iterative (Yinelemeli) Yaklaşım Modeli’nin barındırdığı süreç adımlarının hemen hepsini nefes alır gibi, içgüdüsel olarak uygulayabilmektedir.

Örnek Bir Programlama Deneyimi

Bu deneyim, içgüdüsel becerilerle ortaya konulan programlama çıktıları hakkında fikir vermesi açısından ele alınmalıdır. Yazılım mühendisinin rutin yaşantısından küçük bir kesit sunduğumuz bu bölüm, BioAffix projelerinde uzun yıllar yöneticilik yapan yazılım mühendislerinden biriyle yapılan mülakata dayalı olarak hazırlanmıştır. Mühendis, yaratım sürecini doğal akışında soru-cevap şeklinde anlatmış ve bu esnada deneyimine herhangi bir literal tanımlama getirmemiştir. Yaşadığı deneyimin içgüdüsel bir kodlama örneği olduğu kanaati okurun değerlendirmesine sunulmuştur.

Soru: Bu programı yazmaya iten sebepler nedir?

Cevap: Her bilgisayar kullanıcısının farklı amaç ve ihtiyaçlarına uygun bir ekran kullanım tercihi vardır. Çoklu ekran kombinasyonları veya geniş ekran tercihleri yanında farklı kullanım türleri hepimizin malumudur. İşimiz için olsun, oyun oynamak, müzik dinlemek yahut video ve film izlemek olsun, her birini farklı veya aynı zaman diliminde deneyimlemek günümüzde oldukça yaygın. Benim ekranlarla ilişkim, zamanı etkin kullanmak, benim için rutin hale gelen işlerin yanında literatür taraması yapmak ya da soluklanıp zihnimi durağan hale getirmek gibi aktivitelerin bir bölümünü içeriyor. Bu ekran deneyimini kişiselleştirilmiş bir pratikle ele alma ihtiyacı, yazacağım programla ilgili tüm bağlantı şemasını ve tasarım detaylarını zihnime yansıttı diyebilirim.

Soru: Yazdığınız program tam olarak neyi çözüyor?

Cevap: Çalışma odam, aslında evimin salonu. Sırtımı yasladığım duvarla karşı duvar arasında bir oturma bölümü ve duvarda da bir televizyon bulunuyor. Oturduğum yerde bilgisayar masam ve geniş ekran bir monitörüm var ve bilgisayarım HDMI bağlantısı ile karşı duvardaki televizyona bağlı. Çoklu ekran kullanırken kodlar arasında gezinmek, göremediğim ya da fark edemediğim detayları analiz etmek ama daha çok projeyi diğer paydaşlar ile paylaşıp üzerine düşünmek için çoğu zaman televizyon ekranını devreye sokuyorum. Ancak bu düzen, işletim sisteminin varsayılan ayar havuzunun yetersizliği nedeniyle, ekranı yönetebilmek için oturduğum yerden TV ekranına odaklanmaya çabalamak gibi bir handikap doğuruyor. Ben bilgisayar ekranını TV ekranına yansıtarak iki monitörü tek bir monitör olarak kullanmanın, güncellenmemiş oldukça ilkel bir işlev bozukluğu olduğunu düşünüyorum. O nedenle iki monitörü tek bir monitöre dönüştüren bu durumu aşıp, iki monitörü sayısız monitör gİbi davranabildikleri bir aynalama programı yazdım.

Soru: Programı yazmak ne kadar zamanınızı aldı?

Cevap: Ne kadar sürdüğünü anımsamak zor ancak masama oturmadan önce aldığım çay, programı yazıp çalıştırdığımda soğumamıştı.

Soru: Sizin için çok kolay bir iş miydi?

Cevap: Hayır, demek istediğim zor ya da kolay bir iş oluşu değil. Ben şuna yoruyorum: Evimde kurulu ekosistemle o kadar haşır neşirim, o kadar iç içeyim ki, nelere ihtiyacım olduğunu ve neleri değiştirmem gerektiğini farkına bile varmadan netleştirmiş olmalıyım.

Soru: Yani aslında bilinçaltında çoktandır kodlanmış ve çalışmaya başlamış bir programı bilinç düzeyinde yeniden yazmışsınız. Böyle mi anlamalıyız?

Cevap: Evet durumu bu şekilde özetlemek mümkün.

Soru: Son olarak BioAffix projelerinde de benzer bir süreçle hareket ettiğinizi söylemek mümkün mü?

Cevap: BioAffix’i oluşturan ürünler, bu ürünlerdeki gömülü yazılımlar, cihazların birbiriyle haberleşmesini ve bu haberleşmeyi hiçbir veri kaybı ya da sabotaja imkân vermeden sağlayan köprü yazılımlar, denetim ve yönetim programları… Devasa bir ekosistemi baştan ayağa bilinçaltı ile açıklamaya çalışmak absürt olurdu. Kartınızın bu olmadığını biliyorum ancak bu işlerin temelinde doğru planlama ve ekip çalışması yatmaktadır. Öyle ki burada uyguladığımız planlama ve iş-yaşam döngüsü, CMMI Seviye 3 ile tescillenmiş ve CMMI Seviye 5 gibi önemli bir dereceye aday gösterilmiş durumdadır.

Soru: Peki BioAffix’le bu kadar haşır neşir olmak yukarıda anlattığınıza benzer deneyimler yaşamanıza neden olmadı mı?

Cevap: Unutmamak gerekir ki Ones Technology bir AR-GE merkezidir. Biz burada yaratıcı fikirlerle, planlı çalışma ve geliştirmelerle yol alıyoruz. Elbette BioAffix ile ilgili yazılım operasyonlarının merkezinde çalışan Yazılım AR-GE ekibimiz, uzun yıllar yürütülen projelerin içinde olan; ihtiyaç, sorun ve çözümleri tespit edip uygularken oldukça pratik ve esnek davranabilen uzmanlardan oluşuyor. Tüm bunlar düşünüldüğünde, BioAffix projelerinde görev alanlarda, bilincin farklı katmanlarının aktif olmadığını söylemek hata olur.

Soru: Son olarak bu yazıyı ve yaptığımız mülâkatı okuyan BioAffix Blog okurlarına ve daha önemlisi genç mühendislere ne söylemek istersiniz?

Cevap: Denemekten yılmasınlar ve hata yapmaktan asla korkmasınlar. Zamanla düşünce ve tasarım dinamiklerini etkileyen pürüzlerin ortadan kalktığını görecekler. Dahil oldukları projelerde daha pratik, daha etkin hale gelecekler ve deneyimlerinin sağladığı esneklikle hızlı ve doğru karar alma becerileri gittikçe artacaktır.

Yararlanılan Kaynaklar

Alexey Braver, Dror G. Feitelson, How Developers Extract Functions: An Experiment, Psychology of Programming Interest Group

Meurig Beynon, Russell Boyatt, Zhan En Chan, Intuition in Software Development Revisited, Psychology of Programming Interest Group

Dört ayda bir yayınlanan BioAffix elektronik posta bültenine abone olarak yeni gelişmeler hakkında bilgi sahibi olabilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *