Günlük Yaşamın “strict” Noktaları

Selamlar herkese tekrar,

Geçen sayılarda devam ettirdiğim ve SCHEME Mi??…WEB’DE Mİ?? (VOL.3) başlıklı yazım ile hoş bir noktaya eriştirdiğim ufak araştırma konumuza, araştırma yoğunluğum nedeniyle bir süre ara vermeye karar verdim. Sizlerle bu sayıda geçenlerde fark ettiğim enteresan bir detayı paylaşmak istiyorum. Yazının başlığından belki anlayanlarınız olmuştur, fakat anlamayanlar dert etmesin ben her türlü açıklayacağım zaten.

Şimdi, öncelikle şunu ek bir bilgi olarak vereyim, rahatlayayım istiyorum zira nasıl anlatacağımı bilmiyorum şu an:)

Bölüm hayatımızda neredeyse her hafta uğraştığımız programlama projeleri ya da ödevlerini yaparken kullandığımız (C, Java, Python, Scheme gibi) programlama dillerinin genel bir özelliği vardır. O da hepsinin çoğunlukla “greedy” çalışmasıdır. Bu ne demek? Örneğin şu demek: elinizde en az bir tane argüman alan bir fonksiyon var ise, o fonksiyon bir noktada çalıştırılacağı vakit, fonksiyon işlenmeden önce, ona attığınız değerler bir elden geçer, hesaplanır, tam değerlerinin ne olduğuna karar verilir, ondan sonra fonksiyona verilir, en son o fonksiyon o değerlerle çalışmaya başlar. Somut örnek olarak:
((lambda (x y) (+ x y)) (+ 1 2) 3)
çalıştığı zaman, o (+ 1 2), fonksiyonun içinde x ile değiştirilmeden önce 3 olarak hesaplanır, sonra ikinci argüman olan 3 e bakılır ve ancak ondan sonra fonksiyon o değerle çalışmaya başlar.
Bunun gibi çalışan dillere “greedy” ya da “applicative order” diller denir (türkçesi aç gözlü oluyor sanırım:))
Bazı diller de vardır ki, bunlar da o yukarıdaki örnekten gidecek olursam, (+ 1 2) ifadesini hesaplamadan direkt olarak o “x” değeriyle değiştirir. Buradaki temel amaç şöyle zamanlarda işleri kolaylaştırmaktır.
((lambda (x y) y) (+ 1 2) 3)
Bu ifade çalıştığı zaman, o (+ 1 2) nin hesaplanması gereksiz olacağı için, aslında bizi lüzumsuz bir aktiviteden kurtarmış oluyor dilin bu nazik davranışı.
Böyle diller (örneğin Haskell), bu tür ifadeleri (aslında bütün ifadeleri) yalnızca gerekli olduğu zamanlarda hesaplarlar. Buna en güzel örnek, schemede de böyle çalışan “if” fonksiyonudur:
> (if true false ((lambda (x) (x x)) (lambda (x) (x x))))
#f
Bunu düşünen sevgili meslektaşlarımız bunun için zamanında çok güzel bir isim bulmuşlar, buna “laziness”(tembellik) ve bu gibi çalışan dillere de “lazy” dil demişler. Bir isim daha koymuşlar bununla ilgili, o da bir ifadeyi hesaplamak zorunda kaldığımız noktalara “strict point” demişler.

Konu aslında burada anlattığımdan çok daha kapsamlı olup, derin derin mevzulara iniyor. Fakat şimdi oralara inmeyeceğim tabi ki, çünkü hem anlatmak istediğim o değil, hem de daha ciddisi ben de o kadar derine inebilmiş değilim henüz.
Asıl nokta, işi sadece gerekli olduğu zaman yapmaktan ibaret, yani aslında burada tembel olmak, akıllı olmayı gerektiriyor.

Benim geçenlerde fark ettiğim şey ise, aslında bunun günlük yaşamımızın her noktasında var olduğu.
İşte bu yazıda size günlük yaşamımızın birkaç komik strict noktalarından bahsedeceğim.

Ben çok planlı programlı yaşayan birisiyim, herşeyimi planlamaya uğraşır, derin derin düşünürüm bu planlarım konusunda. Öyle ki gün geçtikçe planlama stillerimi bile geliştiriyorum:) Geçtiğimiz seneye kadar öyle çok çalışan bir insan değildim, fakat bu planlama mevzusu o kadar derinmiş ki ben de, çocukken yaptığım şeyleri bile planlarmışım. İlk planlamalarımın tarihi, sokağa oynamaya çıkacağım zamanlar ile, televizyondaki sevdiğim çizgi filmlerin zamanlarının çakışmaması için yaptığım planlamalara kadar uzanıyor. Şimdiki hayatımızın ne kadar karmaşık olduğunu düşünürseniz ne derece kafayı yediğimi anlayabilirsiniz:)
Bundan bu kadar çok bahsetmemin sebebi şu; geçen gün masamın başında oturmuş yapılacak işleri sıralıyorum, önümde birsürü kağıt var, üzerleri yapacağım işler ve bunlara ayıracağım zamanlar, nerede nasıl çalışarak bunları yapmak istediğim vs gibi birsürü bilgi ile dolu halde. Bir anda şunu fark ediyorum, saatler geçmiş, ben kağıtlar dolusu veri hazırlamışım, bazılarını işlemişim karar vermişim, bazıları hala karar aşamasında, fakat ben bu yazdığım işlerin hiçbirini yapmaya başlamamışım. Üstelik kafam da şişmiş, yorulmuş, kahveler sigaralar dolmuş taşmış.. Sanki günlük hayatımın programını geliştirmeye çalışıyormuşum da daha dizayn aşamasındaymışım gibi bir halim var. O anda ne kadar saçmaladığımı fark edip, elimdeki herşeyi bıraktım, gittim biraz abur cubur aldım ve o akşamı film izlemekle geçirdim. Kafamda o planlama ve geçen saatlerle ilgili tek bir şey vardı:

“Planı oluşturmak, planını yaptığın işleri yapmanı sürekli engelliyorsa, planı oluşturmayı da bir iş olarak kabul et, ve o planlama işi bitene kadar, işlerden en uygununu seçip belli zamanlar ayırarak hepsini yapmaya başla.”
(bkz. Round-Robin, OS Concepts 6th edition – Silbershatz, pg.163)

Bunun gibi günlük yaşamda o kadar fazla örnek var ki, oturup sayfalarca yazabiliriz. Ben de yazmayı planlıyordum ama şimdi biraz sizlerin düşünmesine fırsat vermek istiyorum, o nedenle şimdi bu “laziness” ile ilgili daha başka bir noktaya geleceğim.

Şu örneğe bir göz atalım:
((lambda (x) (+ x x)) (+ 1 2))
Şimdi bu ifade, eğer lazy olmayan bir dilde çalıştırılsaydı o (+ 1 2) olan argüman “x” değişkeni ile 3 olarak içeri girecek, dolayısıyla içeride işlenecek ifade (+ 3 3) olacaktı. Biz, bunun lazy bir dilde çalıştırıldığını düşünelim. Şimdi o (+ 1 2) ifadesi içeri olduğu gibi girecek ve içeride işlenecek ifade (+ (+ 1 2) (+ 1 2)) olacak, dolayısıyla bizim o (+ 1 2) ifadesini iki kere hesaplamamız gerekecek.
İşte tam bu noktada yukarıda söylediğim şu ifade anlam kazanıyor: “tembel olmak için önce akıllı olmak gerekiyor.”
Bu durumun çözümünü anlatmayacağım, gereksiz uzatmak istemiyorum yazıyı, fakat diller üzerine çalıştığınız zaman ne dediğimi anlayacaksınız, ki anlayanlarınız boldur sanıyorum.

Bunu da şu nedenden dolayı anlattım. Yine geçenlerde bir program yazarken “linked list” denilen bir yapı kullanmam gerekti, o anda özel bir durum ile karşı karşıya olduğum için önceden tanımlı olan linked list yapılarını kullanamadım, modifikasyon gerekliydi, dolayısıyla oturup yazmam gerekiyordu. Fakat sonradan bir şey aklıma geldi, sanırım 2 sene önce, veri yapıları dersini alırken ben şöyle bir karar almıştım. Derste gördüğüm yapıları hem pratik yapmak için hem de sonradan kullanmam gerektiğinde açıp kullanabilmem için, şöyle en genelinden, güzel güzel comment lenmiş bir şekilde yazıp kenara koyacaktım. Tabi o zamanlar serserilik yapmaya daha müsait bir bünyem olsa gerek, bu aldığım karar yalan oldu, derslerin çoğuna girmedim, hatta sanırım o dönem olan binary den de kalmıştım:)
Neyse ben bunları hatırlarken, o zamandan kalma, okuldaki hesabımın bir köşesinde duran, sanırım bu kararı aldığım gün yazdığım linked list yapısı karşıma çıkıverdi, içinde bazı yerlerde yalan yanlış, bazı yerlerde de çok güzel açıklamalar yapmışım, kendime notlar yazmışım, örneğin:

/*
BU NEDEN ÖMÜR TÖRPÜSÜ OLDU??? ÖĞREN!!
*/
(herşeyi iterative yapmaya çalışmak gibi bir huyum vardı o zaman:))

Sonuçta, şunu anladım ki sonradan kullanılabilecek bir şekilde olduğu ve kullanılacak yerde de aynı şekilde çalışacağından emin olunduğu sürece, yapılan her işi kenara koyup arşivlemek akıllıca bir şeymiş. Onu yazacağım zamanda güzel güzel sohbet ettim, pinekledim:)

Anlayacağınız, günlük hayatta böyle enteresan “strict” noktalar ortaya çıkıyor hep, bunları yakalayıp, akıllı olmak, hem üretken hem de tembel olabilmemizi sağlayıp, hakkaten en şahanesinden pineklememizi sağlıyor. Bir düşünün bakalım neler bulacaksınız kendi hayatınızdan??

Görüşmek üzere, teşekkür ederim..
caner..

Paylaş ve Eğlen:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • Live
  • MySpace
  • Twitter
  • Yahoo! Bookmarks
  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bir yorum yazın