Stack ve Heap Gerçekten Önemli mi?

Stack ve Heap ile alakalı araştırma yaparken karşılaştığım iki makale fikrimi bu hususta değiştirecek bir bakış açısı kattı diyebilirim. Makale duyanlarınız bilir Eric Lippert’a ait. Ben kısaca Türkçe özetlemeye çalışacağım ve bu makalenin sonunda da linkleri vereceğim daha detay bulmak isteyen oradan bakabilir.

Şimdiye kadar Value ve Reference tiplerinden bahsederken genelde memory üzerinde nerede saklandıklarını anlatarak başlamışızdır. Hatta çoğu zaman o kadar ileriye gitmiş ve Value tiplerinin her zaman Stack üzerinde saklandığı bile söylemişizdir ki bu yanlıştır. Sonra da Reference tiplerinden bahsettiğimizde aklımıza hemen Heap gelir. Bunlar esasen Memory üzerinde hayali yerlerdir, CLR ve İşletim Sisteminin memory’i nasıl yönettiği ile alakalıdır. Yoksa iki farklı memory çeşidi değillerdir.

Bunun dışında veri tiplerinden bahsederken onları ikiye ayırmamızın yani Value ve Reference tipleri dememizin sebebi nerede saklandıklarından dolayı değil bilakis bu tiplere verdiğimiz manadan dolayıdır ve bunların nasıl bir semantic yapısına sahip oldukları ve nasıl çalıştıkları ile yakından alakalıdır. Ama sanki bu iki tipin farklı olmasının sebebi sadece memory üzerinde nasıl saklandıklarıymış gibi anlatılmaktadır. Hayır! Value tipi deyince bu tiplerinin değerlerinin kopyalanması manası anlaşılması gerekmektedir. Mesela bir method içerisine value tipinden olan int türünden bir değişken gönderildiğinde bunun değerinin kopyalanıp bu kopyalanan değerin gönderilmesi olarak algılamak lazımken, reference tipleri dediğimizde de kopyalanan değerleri değilde reference’lar olarak algılanması lazım. Bu hususta daha çok makale bulabilirsiniz onun için oraya bakmanızda yarar var eğer anlaşılmadıysa. İşte bu iki nedenden dolayı bu tiplere value ve reference tipler denilmektedir. Aksi halde Stack ve Heap tipleri diye ayırım yapılırdı ama böyle bir şey yok. Hatta Eric Lippert burada şunuda söylüyor: C# gibi Managed diller yazmamızın sebebi kullanıcıları Stack ve Heap gibi implementation detail olan kısımlardan kurtarmaya çalışmak ama insanlar hala kendileri için çok bir şey ifade etmeyecek Stack ve Heap kısımlarına bu kadar ilgi duyuyorlar. Belki C++ gibi dillerde bu kavramlar önemli olabilir ama C# için değil.

Bir işletim sistemi isterse value ve reference tiplerinin hepsini Stack hiç kullanmadan Heap de de saklayabilir ve bunun zararını ödemek isteyebilir. Ama bu İşletim Sistemi ve .NET kullanıyorsanız CLR’de bağlıdır. Stack ve Heap CLR’ın Desktop versiyonunda kullandığı iki memory yapısıdır ama belki başka diller ve runtime’lar bu iki yapıyı hiç kullanmıyorlar olabilir ve belkide kendilerine ait farklı memory modelleri var.

Kısacası şunu belirtmekte yarar var. Stack ve Heap memory management kısmına girer ve bu implementation detail olarak karşımıza çıkar. Yani bunu kullandığınız run time ve işletim sistemi kendi farklı algoritmalarına göre dizayn edebilir ve kullanabilirler ki kullanıyorlarda. Onun için bu kısımları bu kadar detaylı bilmek için kaybedilen zaman bir kayıp olabilir. Performance açısından hemen hemen hiç bir zaman hangi veri tipi kullanıldığına bağlı olarak bir sorun çıkmaz onun için bu hususta bir kaygınız olmasın. Burada daha çok asıl mesele hangi tip program yazarken beklentilerinizi karşılıyorsa onun kullanmanız. Tipin semantic kısmına yani mantığına ve nasıl çalıştığına bakınız, memory’de nasıl manage edildiğine değil.

Son olarak şu soru karşımıza çıkabilir: O zaman neden value tipleri Stack üzerinde saklanıyorlar. Cevap kısacası çünkü saklayabiliyoruz demek olacaktır. Stack ve Heap birer mühendislik harikalarıdır ve ciddi manada komplex bir çalışma mantığıyla çalışır. Stack bize daha basit ve hızlı saklama sunarken Heap bu hususta bir daha yavaş ama daha esnektir. Stack bu kadar esnek değildir. İnsanlar genelde Stack ile Heap arasında ki hız farkının verilerin ilk allocate edilme anında oldukları sanırlar ama bu tam tersidir. Bu hız farkı aslında veriler memory üzerinde deallocate edildiğinde yani boşaltığı anda meydana gelir. Çünkü bu Stack için Stack Pointer’in işaret ettiği adresi değiştirmek kadar kolayken, Heap için ise garbage collector’un çalışması, verilerin daha compact hale getirilmesi, ve boş yerleri söyleyen free list denilen listenin yeniden hesaplanması gibi işlerin yapılmasıdır.

Bunlar benim anladığım ve aldığım notlar, daha detaylı öğrenmek isteyen arkadaşlar şu makalelere bakabilirler:

  1. http://goo.gl/1Rbb3
  2. http://goo.gl/ITLsc
  3. http://goo.gl/eqsN
Paylaş herkes duysun!Share on Google+Share on LinkedInTweet about this on TwitterShare on Facebook

Devlet Konumunda Adam Kayırmanın Hükmü

Hayatü’s Sahabe isimli kitabı okurken gördüğüm nice can alıcı noktalardan bir taneside Hz. Ebübekir’in halife olduğu zamanlarda komutan tayin ettiği Yezid B. Ebi Süfyan’a verdiği öğüt ve Efendimizden (SAV) naklettiği bir hadistir:

Yezid b. Ebî Süfyan şöyle anlatıyor: Ebubekir Sıddîk beni Şam’a gönderdiğinde şunları söyledi: “Ey Yezid! Senin çok akraban vardır. Ben senin onları başkalarına tercih etmenden korkuyorum. Şunu bilmeni isterim ki Hz. Peygamber böyle kişileri tehdit edip şunları söylemiştir: “Müslümanların başına getirilen kişi, bir iş hususunda sevdiği kişilerden birini haksız olarak diğer hak sahiplerine tercih edecek olursa Allah ona lanet eder. Onun farz ve nafile ibadetlerini kabul etmez ve nihayet onu cehenneme atar. Kim de müslümanların malından, haketmedikleri halde sevdiklerine ve akrabalarına verecek olursa o da Allah’ın lanetini haketmiş olur”. Allah Teâlâ insanları kendisine iman etmeye çağırır. Kim Allah’ın korunmasını emrettiği sınırlardan birini çiğnemeye kalkışacak olursa Allah da ona lanet eder ve onun üzerinden korumasını kaldırır”(1).

Bu hadis günümüz Türkiyesinde ki vehametin ne boyutta olduğunu görmek açısından önemli. Kendi akrabalarını liyakat sahibi olanlara tercih etmeleri ve bunu yaparkende maalesef gurur duymaları sorunun hangi boyutlara geldiğini gözler önüne seriyor.  Bu konulara bazı örnekler vermek gerekirse:

  1. Devlet kurumlarında işi olan insanların tanıdıkları o kurumda çalışan insanlara gidip diğer insanların önüne geçmek süretiyle işleri daha hızlı yaptırmaya çalışmaları. Bunlara hastaneleri de ve hemen hemen diğer tüm devlet kurumlarını katabiliriz.
  2. Devletin malını haksız yere kullanan idareciler.
  3. Kadrolaşma yapan ve yaptıran insanlar.

Detaylara inilse daha fazla sayılabilir. Bizler bu meselelerde hassasiyetimizi kaybettikçe başka diğer tüm meselelerde kaybetmek şiarımız oluyor sadece.

[1] Kenz, III/143 (Ahmed, Hâkim ve Mansur b. Şûbe el-Bağdâdi de Erbain adlı kitabında); Heysemî V/232.

Paylaş herkes duysun!Share on Google+Share on LinkedInTweet about this on TwitterShare on Facebook

Fikir Sunarken Objective Olabilmek

Bazı tanımlamaları yaparken kendi fikirlerimizi bu tanım içinde genel bir kanı şeklinde anlatmamak gayet zor. Hatta bunları yazarken ben de bu sıkıntıya düşmüşümdür kesinlikle. Ama bu konuda bence sıkıntı daha büyük ve yaygın. İnsanlar bazı tanımlamalarda bulunurken ki özellikle iş dünyasında bu yaygındır, yaptıkları tanımlamalarda ciddi manada kişisel tecrübelerini genelleştirdiklerini görürsünüz. Kısacası yaşadıkları sıkıntıları sanki tanımlamaya çalıştıkları nesne, insan yada davranışların hepsi bu şekildeymiş gibi sunma vardır. Kişisel tecrübeler önemlidir ve kesinlikle paylaşımında fayda vardır ama bu tecrübeleri oldukları gibi meydana geldikleri zamana ve ortamın içinde tutmak ve genele yaymamak en mantıklı olanı. Aksi halde sizleri takip edip dediklerinize değer veren insanların zihinlerinde maalesef çok yanlış kanıların oluşmasına sebep olursunuz.

Genelleme bence görüldüğünden daha kirli bir hastalıktır ve tuzağına düşen insanlarda doğru karar verme ve düşünme kabiliyetlerini ciddi derecede dumura uğratır. Hatta işe alacağınız insanlarda bu meseleye dikkat etmek yararlı olacaktır diye düşünüyorum. Yani sadece teknik açıdan değilde bu gibi fikri açılardan da bence teste tabi tutulmaları takım içinde başarının artmasına vesile olacaktır.  Bu meselede demek istediklerimi herhalde basit bir şekilde açıklamış oldum.

Her ne kadar konudan sapacakta olsam bununla ilişkili olarak şu meseleyi de anlatmak ve düşüncelerimi burada sonlandırmak istiyorum. İnsanı melekeleri gelişmiş olmayan insanların teknik açıdan verebilecekleri şeylerden çok hayır gelmez. Bu şu demek siz eğer dürüst bir insan işe almazsanız konuya hakimiyeti ne kadar olursa olsun şirketinize zarar verecek bir insanı işe alıyorsunuz demektir. Bu onların kişisel hayatlarını inceleyin demek değil.  Zaten insanların hassasiyetini bazı basit sorular ile anlamanız mümkün. Bu noktada aklıma gelen bir olayı anlatayım. Bir arkadaşım vardı Güney Koreli. Kendisi bana orada şirketlerin sizin özel hayatınıza da baktığını ve bunun gayet sıradan olduğunu ve işci alırken bunun çok önemli bir kriter olduğunu söylemişti. Bu belki kültürel anlamda orada gayet sıradan bir mesele olabilir. Burada bu kültürü tenkit edecek değilim. Ama bu açıdan bakılıdığında bence çalışmak istediğiniz insanların insan sıfatına haiz olmaları çok ama çok önemli dersem bilmeme meselenin ciddiyetini anlatmış olurmuyum.

Paylaş herkes duysun!Share on Google+Share on LinkedInTweet about this on TwitterShare on Facebook

Dahi Programcı Masalı

2009 Google IO da yapılan bir konuşma. Güzel konulardan bahsediyor. Sadece programcılar için değil ders almasını bilen başka konumlardan ve geçmişlerden insanlar içinde yararlı bilgiler içeriyor. Bazı ufak tefek notlar:

  1. İnsanın egosu öğrenmesine zarar veriyor. Sadece öğrenmesine değil aynı zamanda parçası olduğu takıma ve üzerinde uğraştıkları projeye de aynı zararı okunuyor. İnsanlardan bir insan olun ve farklı olma çabasına girmeyin.
  2. Dahi programcı denilen bir kavram aslında görüldüğünden daha farklı ve belkide bir masal. Bizim dahi olarak gördüğümüz programcıların çoğu bir fikir ortaya atmış ve bazı şeyleri başlatmış olsalarda aslında ortaya çıkan proje tek başlarına ortaya döktükleri emeğin sonucu değil. Bir sürü insanın bu hususta her ne kadar isimleri geçmesede onlar kadar emeği var. Bu insanların ortak noktalarından birisi sorunlardan korkmamaları. Çözmek için eğer sormaları gerekirse sorularını sorarlar yada araştırma yapmaları gerekirse bunuda yaparlar. Ve belkide en önemlilerinden birisi ışıkları kapatıp sessizce kod yazmak yerine insanlar içine çıkıp onlar ile iletişim kurar ve fikir alışverişlerinde bulunular. Google mühendis aldığında başkaları ile iletişim kuran ve onların bilgilerinden ve tecrübelerinden yararlanmayı bilen insanlara daha çok dikkat ediyor.
  3. Hata yapabileceğiniz mantığını insanın kafasına yerleştirmesi lazım. Aslında bu bir düşünce değişimi. İnsanın utanmaması gereken bir şey. Ama ders alması gereken bir şey. Aslında hata yapmak ders alındığında gayet faydalı ve çoğu insan bu şekilde öğreniyor.
  4. Bir takımda herkesin size soru sorduğu ve size dayandığı bir konumda olabilirsiniz. Bu belki çoğumuz için daha rahat bir konumdur çünkü takım içinde bir otoritesinizdir. Ama bu konumda bulunan insanlar kendilerinden daha iyi bilen insanların arasında bulunan kişilere göre daha az şey öğrenirler. Tamam belki sizden daha zeki ve çok şey bilen insanların içinde kişi psikolojik olarak daha zor zamanlar ve korkulu dakikalar geçiyor olsa bile sonuçta bu insanların bilgilerinden yararlandığınızda öğrendiğiniz şeylere değecektir.
  5. Projede gruplaşmamak yada bir kısmın sahibi olmamak önemli. Herkesin projede her yere dokunmasını ve programlama yapmasını sağlamak lazım. Çalışanlarınızı sonsuza kadar tutamayabilirsiniz. Onun için birisi gittiğinde onun çalıştığı yere kimi koyacaksınız diye sormamanız lazım.
  6. Psikolojik sorunları teknik çözümler ile çözemezsiniz. Mesela ahlak yoksunu bir insanı yıllarca emek vererek yazdığınız bir programı license key satın almak suretiyle düzeltemeyebilirsiniz. Ama yinede teknik kısımlarda yapacağınız ufak tefek değişiklikler psikolojik alanda daha büyük değişimlere sebep olabilir. Mesela iş yerinde source control sistemleri kullanmak gibi. Code Review üzerine önem vermek gibi.

Tam bitirmedim ama şimdiye kadar aldığım notlar bu şekilde. Devamını bitirince güzel gördüğüm kısımları buraya eklemeye devam edeceğim.

Paylaş herkes duysun!Share on Google+Share on LinkedInTweet about this on TwitterShare on Facebook