Generic Lazy Tipi Olmasaydı

Merhaba Arkadaşlar,

Aklım üniversite kampüsünün çimlerinde hala...Pek çok gün İstinye Park' a giden öğle arası servisimiz, dönüş yolunda İTÜ kütüphanesi önünden geçmekte(Geçmekte idi...Sonrasında o yol trafiğe kapatıldı) Öğrencilerin çimlere yayılarak mavi gök yüzünü seyre dalmasına her zaman imreniyorum. Çoğu zaman bu psikolojideki öğrencinin kafasında oluşan sorunlar bellidir. Kız arkadaş veya erkek arkadaş sorunu, maddi sorunlar, dersler, vize ve finaller...Tabi iş hayatına giren ben gibi insanlar aynı çimlere yatmaya kalksa, kafada dönen sorunların sayısı azalacağına büyük ihtimalle artacaktır. Hele ki yazılımla uğraşıyorsanız mavi göğü seyre dalarken geçen bulutların çoğu birer Component haline dönüşecek ve üstünüze üstünüze gelecektir. Neyse...

Hatırlayacağınız üzere Tembellik Etmek İstiyorum (Generic Lazy Tipi ile Et) başlıklı yazımızda .Net Framework 4.0 ile birlikte Base Class Library' ye eklenen yeni tiplerden birisi olan Lazy<T> sınıfını irdelemeye çalışmıştık. Bu sınıfın T tipi için gerçek anlamda Lazy Initialization yaptığını örnekler üzerinden öğrendik ve yine hatırlayacağınız üzere Lazy<T> nesne örnekleri üzerinden Value özelliği çağırılmadığı sürece T tipinden değer döndüren bir operasyonun çağırılması söz konusu değildir. Üstelik Value özelliğine sonradan yapılan çağrılarda T dönüşü yapan operasyonların tekrardan çağırılmadığı da bilinmektedir. Şimdi Lazy<T> tipini kullanmadan bir sınıf özelliğinin Lazy Initializate işleminde değerlendirilip değerlendirilemeyeceğini düşünerek yola koyulalım. Bu amaçla aşağıdaki gibi bir kod örneğini göz önüne alabiliriz.

using System.Collections.Generic;

namespace LazyPart2
{
    class Program
    {
        static void Main(string[] args)
        {
            var productList=ProductCreater.Products;
            var productListAgain=ProductCreater.Products; // Bu çağrı sonrasında ProductCreator içerisindeki products alanının yeniden örneklenmediği görülecektir
        }
    }

    class ProductCreater
    {
        private static readonly List<Product> products = new List<Product>
        {
            new Product{ProductId=1,Name="Product X",ListPrice=1},
            new Product{ProductId=2,Name="Product Y",ListPrice=3},
        };

        private ProductCreater()
        {
        }

        public static List<Product> Products
        {
            get
            {
                return products;
            }
        }
    }

    class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public double ListPrice { get; set; }
    }
}

ProductCreator isimli sınıf new operatörü ile örneklenemeyecek şekilde tasarlanmıştır. products isimli field değişkeni static olarak tanımlanmıştır ve ilk değerleri atanmıştır. ProductCreator tipi üzerinden kullanılmak istenen ürün listesini alabilmek için static Products özelliğinin kullanılması yeterlidir. Bu kod debug edildiğinde Products özelliğine yapılan çağrılardan ilkinde, products isimli field' ın oluşturulduğu görülecektir. Yani ilk değerler yüklenecektir. İkinci çağrıda ise yeniden bir örnekleme söz konusu olmayacaktır. Bu da aslında tek bir products alanının olmasının garantilendiğini gösterir. Hatta şu anki tasarıma göre ProductCreator üzerinden çağırılabilen tek public üye Products özelliği olduğundan ürün listesinin kullanılmak istendiği yerde initialize olacağı sonucuna varabiliriz. Ki bu büyük bir aldatmaca olacaktır. Ne demek istediğimizi daha iyi anlamak için kod içeriğini aşağıdaki gibi değiştirdiğimizi düşünelim.

using System.Collections.Generic;

namespace LazyPart2
{
    class Program
    {
        static void Main(string[] args)
        {
            ProductCreater.DoSomething();
            var productList=ProductCreater.Products;
            var productListAgain=ProductCreater.Products; // Bu çağrı sonrasında ProductCreator içerisindeki products alanının yeniden örneklenmediği görülecektir
        }
    }

    class ProductCreater
    {
        private static readonly List<Product> products = new List<Product>
        {
            new Product{ProductId=1,Name="Product X",ListPrice=1},
            new Product{ProductId=2,Name="Product Y",ListPrice=3},
        };

        private ProductCreater()
        {
        }

        public static List<Product> Products
        {
            get
            {
                return products;
            }
        }

        public static void DoSomething()
        {
            System.Console.WriteLine("Do Something");
        }
    }

    class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public double ListPrice { get; set; }
    }
}

Dikkat edileceği üzere ProductCreator sınıfı içerisine, geriye bir şey döndürmeyen ve aslında anlamlı bir işte yapmayan static DoSomething metodu eklenmiştir. Bu metod modelin çökmesi için yeterlidir. Çünkü ProductCreator.Products için yapılan ilk çağrıdan önce gerçekleştirilen ProductCreator.DoSomething operasyonu, products alanının initialize edilmesine neden olmaktadır. Bu da products alanının kullanılmak istendiği zaman initialize olacağı teorisini ilk tasarladığımız sınıf yapısı düşünüldüğünde çökertmektedir. Örnek debug edildiğinde bu durumda daha net bir şekilde görülmektedir.

İşleyiş sırasına baktığımızda DoSomething çağrısını takiben 17nci satıra gelindiği görülmektedir ki burada da product isimli alanının doldurulması işlemleri söz konusudur. Aslında MSDN araştırması yapıldığında IL tarafında ProductCreator sınıfı için beforefieldinit isimli tanımlamanın yapılmasının bu initialize işlemine neden olduğu ifade edilmektedir. Gerçekten öyle midir acaba? Bu tanımlamayı bir şekilde kaldırmayı başarırsak static products alanı sadece çağırıldığı zaman mı doldurulacaktır. Önce IL tarafındaki tanımlamaya bir bakalım.

.class private auto ansi beforefieldinit ProductCreater
    extends [mscorlib]System.Object
{
    .method private hidebysig specialname rtspecialname static void .cctor() cil managed
    {
    }
    .method private hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
    }
    .method public hidebysig static void DoSomething() cil managed
    {
    }
    .property class class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> Products
    {
        .get class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> LazyPart2.ProductCreater::get_Products()
    }
    .field private static initonly class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> products
}

Bu noktada bir de static constructor kullanımı düşünülebilir. Nitekim static yapıcı metod kullanımı beforefieldinit tanımlamasını kaldıracaktır. Bu durumu ele almak için öncelikle ProructCreator sınıfını aşağıdaki hale getirelim. Hatta sınıfıda static olarak tasarladığımızdan, private erişim belirleyicisine sahip Constructor' unda kaldırılması gerekmektedir.

static class ProductCreater
{
	private static readonly List<Product> products = new List<Product>
	{
		new Product{ProductId=1,Name="Product X",ListPrice=1},
		new Product{ProductId=2,Name="Product Y",ListPrice=3},
	};

	static ProductCreater()
	{
	}

	public static List<Product> Products
	{
		get
		{
			return products;
		}
	}

	public static void DoSomething()
	{
		System.Console.WriteLine("Do Something");
	}
}

Bu durumda IL çıktısı aşağıdaki gibi olacaktır.

.class private abstract auto ansi sealed ProductCreater
    extends [mscorlib]System.Object
{
    .method private hidebysig specialname rtspecialname static void .cctor() cil managed
    {
    }
    .method public hidebysig static void DoSomething() cil managed
    {
    }
    .property class class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> Products
    {
        .get class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> LazyPart2.ProductCreater::get_Products()
    }
    .field private static initonly class [mscorlib]System.Collections.Generic.List`1<class LazyPart2.Product> products
}

Dikkat edileceği üzere beforefieldinit takısı görülmemektedir. İşte şimdi oldu diyerek rahat rahat koltuklarımıza yaslanabileceğimizi düşünebiliriz. Ama ne yazık ki bir anda irkilmemiz sadece an meselesidir. İşte Debug zamanındaki çalışma sırası.

O da ne? DoSomething sonrası yine product alanının initialize edildiği görülmektedir. Cry Tam bir hüsran diyebilir miyiz? Aslında olayı iyi tarafından ele alabiliriz. Şöyleki; sınıf içerisinde yer alan static alanlar, sınıfın başka bir static üyesi(metod, özellik) çağırıldığı takdirde otomatik olarak zaten initialize edilmektedir. Demek ki kalıbımızın uygulanış biçimi çok doğru değildir. Üstelik Thread Safe bir yaklaşım içermediği de gün gibi ortadadır. O halde ProductCreator tipimizi aşağıdaki gibi değiştirerek ilerlemeye devam edelim.

using System.Collections.Generic;

namespace LazyPart2
{
    class Program
    {
        static void Main(string[] args)
        {
            ProductCreater.DoSomething();
            var productList = ProductCreater.Products;
            var productListAgain = ProductCreater.Products; // Bu çağrı sonrasında ProductCreator içerisindeki products alanının yeniden örneklenmediği görülecektir
        }
    }

    static class ProductCreater
    {
        private static List<Product> products = null;
        private static readonly object lockObject = new object();

        static ProductCreater()
        {
        }

        public static List<Product> Products
        {
            get
            {
                if (products == null)
                    lock (lockObject)
                    {
                        if (products == null)
                        {
                            products = new List<Product>
                            {
                                new Product{ProductId=1,Name="Product X",ListPrice=1},
                                new Product{ProductId=2,Name="Product Y",ListPrice=3},
                            };
                        }
                    }

                return products;
            }
        }

        public static void DoSomething()
        {
            System.Console.WriteLine("Do Something");
        }
    }

    class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public double ListPrice { get; set; }
    }
}

Bu sefer ThreadSafe olan(Double Check yapıldığına dikkat edelim) ve gerçekten Products özelliği çağırıldığında initialize işlemini gerçekleştiren bir tip elde etmiş olduk. Her ne kadar DoSomething metodunu çağrısı sonrası çalışma zamanı products ve lockObject alanlarını oluşturacak olsa da, bizim için önemli olan ürün listesinin Lazy olarak başlatılmasıdır. Sanıyorum ki biraz daha elle tutulur bir sonuca vardık. Hatta bu kod parçasına göre en basit tasarım kalıbının(Design Pattern) uygulandığı ip ucunu verebiliriz. Ama daha iyisi olabilir mi? Söz gelimi içinde hiç bir iş yapılmayan bir static metodumuz var. Bu olmasa. Sınıfımızda static tanımlanmak zorunda değil aslında. Aslında işi yine .Net tarafına yıkabiliriz. Aslında ben Lazy<T> tipini kullanmak istiyorum diye haykırabiliriz Yell İşte haykırıyorum. Aşağıdaki kodu göz önüne alalım.

using System.Collections.Generic;
using System;

namespace LazyPart2
{
    class Program
    {
        static void Main(string[] args)
        {
            ProductCreater.DoSomething();
            var productList = ProductCreater.Products;
            var productListAgain = ProductCreater.Products; // Bu çağrı sonrasında ProductCreator içerisindeki products alanının yeniden örneklenmediği görülecektir
        }
    }

    class ProductCreater
    {
        private static readonly Lazy<List<Product>> products = new Lazy<List<Product>>(
            () =>
            {
                return new List<Product>
                            {
                                new Product{ProductId=1,Name="Product X",ListPrice=1},
                                new Product{ProductId=2,Name="Product Y",ListPrice=3},
                            };
            }
        ); 

        public static List<Product> Products
        {
            get
            {
                return products.Value;
            }
        }

        public static void DoSomething()
        {
            System.Console.WriteLine("Do Something");
        }
    }

    class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public double ListPrice { get; set; }
    }
}

Bu sefer products isimli değişken Lazy<List<Product>> tipinden tanımlanmıştır. Diğer yandan Products özelliği products isimli alanın Value özelliğini döndürmektedir. Buna göre çalışma zamanındaki kod icra sırasına bakıldığında DoSomething çağrısı sonucu Product listesinin oluşturulduğu kod bloğuna girilmediği görülecektir. Hatta Lazy<T> tipinin Lazy Initialize işlemini gerçekleştirdiği safha da Thread Safe bir ortam sağladığını da biliyoruz. Bu nedenle bir önceki yapı da uyguladığımız lock kilit mekanizmalı double check içeren kod parçasına da gerek kalmamıştır.

Vuuvvv!!! Baya bir karışık oldu yauv. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

LazyPart2.rar (21,80 kb) [Örnek Visual Studio 2010 Ultimate üzerinde geliştirilmiş ve test edilmiştir]

Yorumlar (19) -

  • Merhaba, Yazılarınızda neden bu kadar geyiğe bağlıyorsunuz, doğrudan anlatacağınızı anlatsanızda "çok değer verdiğiniz biz okurlarımız" zaman kaybetmesek ?  Allahaşkına ne gerek var şöyle bir geyiğe :

    Aklım üniversite kampüsünün çimlerinde hala... imreniyorum.... haykırmak istiyorum...  vuuuvvv...
  • Merhabalar Selçuk Bey,

    Aslında ilk paragraftaki girizgah sadece sizleri yazıya ısıtabilmek içindir. Bu yazım tarzını uzun süredir kullanıyorum. Ama ilk defa bir okurumdan(sizden) böylesine acı bir eleştiri aldım.

    Her ne olursa olsun ilk paragrafı okumanızın toplam süresi yarım dakikanın bile altında.

    Sonuçta bu benim kendi özgün tarzım ve bu tarzı beğenmek zorunda da değilsiniz.

    Gerçi bu tip eleştiriler zaman zaman gelmiyor değil. Ne yazık ki yazının teknik içeriği dışında gelen bu eleştirileri de her ne olursa olsun yayınlıyorum çünkü yorumu yapıldığına göre belli ki insanlar bu negatif eleştirilerini bir şekilde haykırmak, duyurmak istiyorlar.

    Ama ne kadar negatif olunsa da sonuçta benim tarzı değiştirmeye pek de niyetim yok. Ancak siz okumamakta özgürsünüz. Okumasanız da olur. Bakın ben sizin bu yorumunuz için nerden baksanız 5 dakika mı harcadım. Sizin yarım dakika bile ayırmaktan nefret ettiğiniz giriş yazısının 10 katı. Bu zaman da benim için ne kadar kıymetli bir bilseniz.
  • Merhabalar burak hocam, inanın sırf o hoş, esprili ve oldukça açıklayıcı anlatış tarzınız için aylardır sizin makalelerinizin bağımlısıyım. Siz bencede tarzınızı değiştirmeyin gerçekten biz okurlarınız için çok önemli sizin tarzınız.. Selçuk bey'in eleştirisinide hiç hoş karşılamıyorum, sanki onun istediği tarzda anlatım yapma zorumluluğunuz varmış gibi konuşmuş, enteresan bir insan...

    Amacım polemik çıkarmak değil, sadece haksız ve acımasız bir eleştiri yapılmış sessiz kalamadım.. Sizin gibi anlatımı kuvvvetli ve üstad kişileri bulabilmek ve yazılarından, eserlerinden faydalanabilmek çok zor, bulup bunayana da ne diyelim artık, gerçi çeşit çeşit insan var..

    Neyse sağlıklı ve mutlu günler dilerim, duacınızız..
  • Güzel dilekleriniz için çok çok teşekkür ediyorum Murat Bey. Allahtan sizin gibi değerli okurlarım var da Selçuk Bey' in ki gibi haksız eleştirileri hazmedebiliyorum. Sağolun var olun...
  • biraz sert ifade etmiş olsada yazıyı okunca ben selçuk arkadaşı haklı buldum. tabikide kimse okumak zorunda değil. öteyandan okumak zorunda değilsiniz ben yaptım oldu demekte işin kolay yolu. bence bu bir gazete değil sizde köşe yazarı. bu gibi sitelere insanlar genelde bir sorun yaşayınca googledan geliyor ve aradığını hızla bulup işine devam etmek istiyorki gereksiz cümleler okumayada kimsenin zamanı yok. ha bu benim tarzım diyorsanızda biraz eleştiriye açık olun sonuçta kimse size hakaret etmemiş hatta esprili yaklaşmış. bende bu tip siteleri takip eden biri olarak selçuk arkadaşla aynı şeyi düşünüyorum.
  • Melike Hanım,

    Zaten eleştiriye açık olmasam bu yorumlarınızı burada yayınlamam. Sonuçta onları onaylamak benim elinde olan bir iş.

    Ama bir kere daha önemli bir noktayı vurgulamak istiyorum. Şu bahsettiğiniz giriş mevzusu bu yazıyı okuyan kişinin yarım dakikasını bile almamakta. Ancak ne yazık ki hala aynı konu üzerinde tartışma uzayıp gidiyor. Ne kadar vakit kaybettiğimizi biraz düşünün bu tartışma ile. Şu anda bile bu yoruma cevap yazmak zorunda kaldığım için düzgün cümeleleri toparlarken onlarca dakikamı veriyorum.

    Aslında olayı bir hakaret olarak algılamadım ama çok da haksız ve yersiz bulduğumu çok net ve kesin olarak ifade etmek istiyorum. Sizin beni eleştirme hakkınız olduğu gibi ben de sizin tavrınızı eleştirebilirim.

    İster google' dan gelin ister başka bir arama motorundan; Selçuk Bey sadece bu yazının değil diğer yazıların girizgahına da eleştiride bulunuyor bu söylemi ile.

    "bu gibi sitelere insanlar genelde bir sorun yaşayınca googledan geliyor ve aradığını hızla bulup işine devam etmek istiyorki gereksiz cümleler okumayada kimsenin zamanı yok..." yorumunuza şunu eklemek istiyorum. İnanın bende bu yazıları hazırlarken dakikalarımı değil saatlerimi veriyorum. Bazıları günlerce sürebiliyor. Sırf sizlere ücretsiz bedava Türkçe paylaşım yapmak adına. Bunu yıllardır da yapmaktayım ve yapmayada devam edeceğim. Buna göre biraz da olsun saygıyı hak ettiğimi düşünüyorum. ,

    Açıkçası bu şekildeki yorumlar ile gündeme gelmek zorunda kaldığım için de gerçekten üzülüyorum ve teknik anlamda eleştirel yaklaşılmasının çok daha doğru olduğunu düşünüyorum.

    "bence bu bir gazete değil sizde köşe yazarı"
    çok doğru. Ama sonuçta bu blog içeriği bana ait ve ben kendi özgün düşüncem ile bir şeyler üretiyor ve bir yazım tarzını sunuyorum. Beğenmemek her ne kadar sizlerin hakkı olsa da, yazdıklarımı savunmak ve sahip çıkmakta benim en doğal hakkım. Ve ben okurlarımı seçemeyeceğime göre sizler beni tercih etmeyebilirsiniz. Google' dan girmeniz bir şeyi değiştirmez. Sonuçta bir iki yazıdan sonra ismimi ve yazım tarzımı zaten anlıyor olursunuz. Bir daha da arama sonucu çıkan o linke "ya bu adam gene geyik bir giriş atmıştır...Ne yapayım teknik olan kısmını...O teknik kısma gelene kadar yıllar geçiyor aradan..." deyip basmassınız bu kadar basit.

    Tüm bunlara ek olarak ne sizin ne de Selçuk Bey' in google' dan gelseniz bile arayıpta çözüp bulduğunuz bir şey oldu mu bilmiyorum ama teknik olarak ne olumlu ne de olumsuz bir yorumunuzu göremiyorum bu blog içerisinde yazılan 300' e yakın girdi içerisinde.

    Oysa ki bir giriş kısmını yargılamak ne kadar da kolay öyle değil mi?
  • @Melike ve @selçuk gerçekten olayı abartmışsınız. herkes kendi blogunda özgürdür kimseye şunu şöyle yazsanız diye eleştiremezsiniz o yazarın kendi stilidir, ifade kalıbıdır. ha yapılan bir yanlış bilgilendirme varsaki bunları eleştirirsiniz, yorumlama sistemi bunun için vardır, ben burada yanlışlık göremiyorum. siz tamamen eften püften şeylere takılmışsınız..

    Üslubu begenirsiniz, begenmezsiniz o ayrı dava ama birilerinin üslubunu değiştirip değiştirmeyeceği sizleri ilgilendirmez, hangi yazarı kendinize daha eğitici yada daha eğlenceli, yada daha açıklayıcı vs. nasıl buluyorsanız onu takip edersiniz. Genelde bu tür makalelerde, yazar yazının ilk başlarına yaşadıgı bir olayı, yada espriyi, yada kendi ile ilgili bir bilgiyi aktararak yavaş yavaş giriş yapar, sonra odaklanma yükselince takır takır yazılır makale, bu böyledir ve çok normal birşeydir.

    Zaten bu tür makaleler kısım kısımdır, açılışta 5-10 satır sohbet, sonra bir paragrafla makale girişi, gelişme ve sonuç diye gider.. Bilinçli bir okuyucununda zaten okumak iste mediği kısımı geçip kendini ilgilendiren kısma gözüyle gelmesi 2-3 saniyeyi bulmaz. Yani göz ucuyla 3-5 satırı atlayıp geri kalan kısmı okumaya devam etmek çok zor değildir. 2-3 saniyelik bir zaman kaybı için bu kadar emeğe laf ediyorsanız, o sizin vicdansızlıgınız vede nankörlüğünüz kusura bakmayın.

    Bende blog yazarıyım ve bu şekilde oluyor yazılarım çogunlukla ve tanıdıgım tüm yazar arkadaşlarımda hemen hemen aynı stilde yazıyor, tozdan nem kapmanıza gerek yok.
  • Sonuçta buda güzel bir anlatım şeklidir ve hatta bir tekniktir.

    Mesela yazının ilk kısımlarında "bulutların çoğu birer Component haline dönüşecek ve üstünüze üstünüze gelecektir" kısmını okuyunca gülmekten kırıldım açıkcası, meslektaşım ile aynı duyguları yaşıyoruz çünki. uzun bir çalışma saatinden sonra bilgisayar başında neredeyse yamulmuşken o espri sayesinde benim endorfin tavan yaptı ve yazıya iyice odaklanmamı sağladı.
    Bir yazılımcı olarak böyle 2-3 espride duymazsak vallahi bilgisayar başında beşon oluruz..

    Bkz: http://tr.wikipedia.org/wiki/Endorfin

    biraz tatlıya bağlayalım istedim (:
  • Gerek içerik gerek üslup açısından yazılarınızı beğenerek takip ediyorum, elinize aklınıza sağlık.
  • Yazının tarzı ne olursa olsun ortada değerli bir bilgi paylaşımı var tüm makalelerinizde. Ki biraz ilgili iseniz, bu tarz paylaşımcı yaklaşımların bu kadar özverili ve istikrarlı bir biçimde sürdürüldüğü çok fazla kişisel girişim olmadığını görebilirsiniz. Benzer bir yaklaşımı üstlenen bazı bloglarda 6 ay ara ile yazılmış makale serileri de gördüm ki bu kişileri de suçlamıyorum. İş hayatı ve kişisel hayat arasına böyle bir faaliyeti sıkıştırmanın oldukça özveri gerektirdiğini biliyorum. Bu şartlar altında daha önce söylediğim gibi özverili ve istikrarlı bir şekilde paylaşımlarını sürdüren bir kişinin en azından bu konuda ki isteğini ve motivasyonunu olumsuz etkilememk adına, negatif bir düşüncem olsa dahi bunu dile getirmez, hiç katlanamıyorsam paylaşımlarını takip etmemekle yetinirdim. Ayrıca Burak Hocanın eğitimler ve seminerlerdeki ciddiyetini ve samimiyetini görmüş biri olarak oldukça üzüldüm yorumlar karşısında.
  • ali
    Burada gördüğüm kadarıyla arkadaşın biri kral çıplak demiş diğerleri de kraldan çok kralcılık yapıp savunmaya geçmişler. Ben zaten Burak Şenyurt, Aykut Taşdelen, Daron Yöndem ve onlar gibilerini microsoft borazanlığı yaptıkları için kınıyorum. Bu isimleri saymamın sebebi şahsi bir düşmanlık değil ama en çok onlar ön plana çıktıkları içindir. Tarz eleştirisi konusunda ben de selçuk isimli okuyucuyu haklı buldum. çünkü bu tarz sizin deyiminizle sadece "girizgahta" kullanılmamış yazıların genelinde bu durum var.  
  • @Selçuk, @Melike bu paylaşım için bir teşekkür ettiniz mi ki bu denli eleştiriyorsunuz. Paylaşım yapmak bir gönül işidir,kimse paylaşmak zorunda değil ki Burak Hocam o kadar çok zamanını ayırıyor ki bu işe basiret sahibi olabilseniz keşke. Burak Hocam geyik!!! yaparak 300 e yakın makale yazmıştır diğer paylaşımlarını saymıyorum bile. Evet siz geyik yapmayanların paylaşımlarını görelim ?
  • Burak hocamızın harcadığı emeklere öncelikle teşekkür etmek istiyorum.Ben lise öğrencisi olduğum için ve Istanbul'a uzak kalıyorum ve sektörden uzaktayım.Burak hoca ve diğer MVP hocaların içeriklerini gün aşırı takip ediyorum. Benim için bu bilgiler hazine değerinde oluyor.Kıymetinin bilinmesi gerekir.

    Bence blog yazılarında bu tür giriş cümleleri @Kemal'in de dediği gibi  yazıyı okuyan yazılımcıların odaklanmasını sağlıyor. Burak hocamız "bulutların çoğu birer Compoonent haline dönüşecek ve üstünüze üstünüze gelecektir" sözünde bir benzetme yapmış. Bunun olması bence yazılımcı için çok doğaldır. Açıkcası Eleştirileri gereksiz buldum.
  • Oh oh benim de adım geçmiş Smile ne güzel biraz daha "öne çıktım" Smile böylece daha da "eleştiri" alır daha da kendimi "geliştiririm" Smile

    Arkadaşlar şeftalinin kıllısını, pardon tüylüsü seven de olur tüysüz isteyen de Smile Bu durumda şeftaliciye taşlamak yerine uygun manava gidersiniz Smile Neden mi? Çünkü tüylü veya tüysüzü satan onu satmaktan memnundur ve değiştirmek istemez. Bu tarz konularda eleştiriler tabi ki önemli ve değerlendirilmesi gerekir. Ben Burak'ın da değerlendirdiğinden eminim ve gördüğüm kadarı ile de kendisince anlamsız bulmuş eleştiriyi. Eh bitmiş demek ki. Çok büyütmemek gerek. Birinin eleştirdiği diğerinin hoşuna gidiyor da olabilir. Burada üreten Burak olduğuna göre kararı o verir. Ha bir de müşteri-üretici ilişkisi olmayan böyle gönüllü işlerde aslında bu dengeler çok daha farklıdır.

    Burak'cığım Smile Kendini hizmet veriyormuşsun gibi düşünme lütfen. Bu hatayı çoğumuz yapıyoruz. Sanki para karşılığı birşeyler satmışız da müşteri memnun kalmamış gibi bir psikolojiye girebiliyoruz. Oysa manzara tamamen keyfi yazılan yazıların birilerinin işine yaramasından öte değil. Eh burada kimsenin senin keyfine müdahale şansı yok bence.

    Eskiden bu gibi eleştirileri çok ciddiye alıyordum. Adam gibi cevap yazıyordum. Anlaşmaya çalışıyordum, kendimi anlatmaya çalışıyordum. Ama bence buna harcanan enerjiyle daha keyifli ve başkalarına daha faydalı işler yapabilirsin. Uğraşma derim.

    Benim bloğa, facebook'a vs de bir sürü mesaj geliyor böyle saldırgan Smile Eskiden onaylar cevaplardım. Artık siliyorum. Cidden uğraşma ;) Keyfine bak. İyi ki varsın.

    Ya bir de senden ricam Smile Bundan sonra benle ilgili buraya yorum gelirse bana cevap hakkı doğuracak şeyleri benim yerime sil. Bana kalırsa diğerlerini de sil Smile
  • Kral mı çıplakmış? Yoksa bir deli bir kuyuya taş mı atmış?

    Burak hoca gerçekten çok kaliteli makaleler yazıyor.Çok bilgili ve birikimli eğer direk kod yazmaya başlasaydı bir çoğumuz anlayamaz yada sıkılırdık.
    Ikinci hususta microsoft borozanlığı...
    Uzun zamandır blogu takip ediyorum sanılanın aksine takım tutar gibi taknoloji,dil tutmadıgını hatta "Profosyonel yazılımcılar ,bu işin önde gelenlerinin plartfomdan bağımsız çalıştığını projeye göre java , oracle yada başka teknolojileri kullandıklarını dile getiriyor" bunu bu blogu takip eden herkes bilir.Hatta burayı takip etmeyenler bile bilir bir çok yerde dile getiriyor.Ornek "Nedirtv Söyleşileri - Yazılım Dünyasının Merak Edilen Soruları-1".
  • Tartışma ilginç bir polemiğe dönüşüp Daron bey'in de dediği gibi bize de cevap hakkı gerektirecek noktaya gelmiş. Şu geyik meselesini şimdilik bir yana bırakırsak ben en çok "Microsoft borazanlığı" ifadesine takıldım. Her ne kadar paylaşımlarım Microsoft teknolojilerine odaklı olsa da (sebebi arz talep ilişkisidir) Java teknolojilerine dair de paylaşımlar da bulunmaya çalışıyorum. Zira asimetrik informasyonu sevmem. (Hatta WPF kitabı yazıp da Java Applet anlatan ilk kişiyimdir sanırım Smile

    Öte yandan beni tanıyanlar şunu iyi bilir ki, sistem programcılığı kökenli olup halen "C ve Sistem Programcıları Derneğinde" eğitimler veren biriyim ve .NET ile uğraştığım kadar Java ve C, C++, QT gibi teknolojiler üzerine de çalışıyor hatta bazı eğitimler veriyorum. Ayrıca Linux kullanıcısı ve programcısıyım. Yani hayat benim için Microsoft teknolojilerinden kesinlikle ibaret değil. Bunu yazan kişi sanırım bizim MVP olmamız üzerine böyle bir yaklaşımda bulunmuş ama ben 6 yıllık MVP'likten sonra bu sorumluluktan kurulmuş ve artık daha rahat konuşabilen biriyim. Ama borazan yakıştırmasını ne kendi adıma ve ne de diğer arkadaşlarım adına kabul edemem.

    Tarz, üslûp ve "geyik" konularına gelirsek; bunlar şüphesiz yazarı bağlayan konular. Hepimizin bir tarzı var. Kendi adıma ben de teknik bir yazıda (ki bunlara kategorik olarak makale denmesine de karşıyım) belirli bir yazım tarzına dikkat etmeye çalışıyorum. Bu konularda hatalar yapıyorsam eleştirilmekten de çok memnun olurum. Tabii belirli bir saygı çerçevesinde. Biz doğru eleştirmeyi beceremeyen bir toplumuz, Daron beyin de bahsettiği eleştiriler bazen gerçekten vandalizme varan çıkışlar. Yapılan şey hakaret ve vandallık olmadığı sürece eleştilerden kendi adımıza dersler çıkartabiliriz. Zaten ilk eleştiri ve Burak beyin cevabı bence gayet naifmiş ama sonra ipin ucu kaçmış.
  • Burak Hocanın makalelerini begenmiyorsanız okumazsınız olur biter. google gibi aradıgınızı bulmak istiyorsanız msdn e gidiniz orada arayınız.burak hocanın makalelerine anlatım biçimlerine eleştiri hakkına sahip değilsiniz-degiliz. istedigi tarzda yazar.
  • Aykut hocam durumu yine çok veciz özetlemişsiniz
  • Aykut Taşdelenmi microsoft borazanıymış Smile Adam bizim okulda Open Solaris ve Open Office kullanıp microsoft semineri vermişti ayrıca arkadaşları ve kendisi linux tabanlı bir işletim sistemi yazıyormuş. Böyle yorumlar yazanlar yazdıkları kişiler hakkında ne kadar bilgi sahibi acaba, Burak beyin java makalesi yazdığındanda haberi yok demekki Smile)

Yorum ekle

Loading