<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Kurumsal Java Yazılımı - Özcan Acar</title>
	
	<link>http://www.kurumsaljava.com</link>
	<description>Java Enterprise Architecture by Ozcan Acar</description>
	<lastBuildDate>Thu, 17 May 2012 19:26:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kurumsaljava" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="kurumsaljava" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">kurumsaljava</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Çöplerin Efendisi</title>
		<link>http://www.kurumsaljava.com/2012/05/17/coplerin-efendisi-garbage-collection/</link>
		<comments>http://www.kurumsaljava.com/2012/05/17/coplerin-efendisi-garbage-collection/#comments</comments>
		<pubDate>Thu, 17 May 2012 10:56:12 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[garbage collection]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2154</guid>
		<description><![CDATA[<p>Java programcısının çok sadık bir hizmetçisi var. Her türlü çöplüğü, pisliği arkasından devamlı toplar, hiç sesini çıkarmaz. Çöplerin efendisidir, ama bir o kadar da mütevazidir. Kimseye belli etmeden işini görür. Bu yüzden birçok Java programcısı onun farkında bile değildir. Ama o işini yapmasa Java programcısının hali çok vahim olur, C/C++ ile kod yazan meslektaşlarından bir farkı kalmaz, bilgisayarın hafızası denilen kara delikte kaybolur gider, yazdığı programlar devamlı sallanır.</p>
<p><span id="more-2154"></span></p>
<p>Garbage Collector&#8217;dan bahsediyorum. Çoğu Java programcısının varlığından bile haberdar olmadığı, bazılarının çekindiği, bazılarının ne yaptığını tam olarak anlamdığı, bazılarının ise yaptığı işe hayran olup, ince ince hayranlık duyduğu Garbage Collector&#8230; Java&#8217;yı Java yapan özelliklerinden bir tanesi bir Garbage Collector&#8217;e sahip olmasıdır. Şimdi yakından tanıyalım bu kahramanı.</p>
<p>Java dilinde herhangi bir sınıftan bir nesne oluşturmak için new operatörü, Class.forName().newInstance(), clone() veya readObject() metodu  kullanılır. Örneğin new operatörü sınıfın konstrüktörünü kullanarak <a href="http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/" target=_blank>JVM</a> bünyesinde yeni bir nesne oluşturur. Nesne inşa edildikten sonra <a href="http://www.kurumsaljava.com/2012/05/12/java-heap/" target=_blank>Java Heap</a> içinde konuşlandırılır. Nesnelerin hepsi kullanıldıkları sürece heap icinde mutlu, mesut hayatlarını sürdürürler. Ama her canlı gibi onlar da birgün ölürler. Öldüklerinde onları toplayıp, ebediyete intikal ettiren Garbage Collector&#8217;dür.</p>
<p>İngilizce&#8217;de garbage çöp anlamına gelmektedir. Garbage Collector JVM bünyesinde hem yeni nesnelerin doğmasına yardımcı olan, hem de ölen nesneleri ortadan kaldıran modüldür. new operatörü ile doğan yeni nesneler için Garbage Collector hafıza alanını temin eder. Ölen ve çöp olarak isimlendirilen nesnelerin işgal ettikleri hafıza alanını Garbage Collector boşaltır ve yeni nesnelere tayin eder. Garbage Collector kısaca Java&#8217;da otomatik hafıza yönetiminden sorumludur. Onsuz Java&#8217;nın C/C++ dilinden bir farkı kalmazdı.</p>
<p>Garbage Collector&#8217;ün nasıl çalıştığını görebilmek için aşağıda yer alan videoyu hazırladım. Collector&#8217;ü kızdırmak için bolca çöp (garbage) üreten minik bir Java programını şu şekilde oluşturmak yeterli:</p>
<pre name="code" class="java">

package com.kurumsaljava.jvm.garbage;

import java.util.ArrayList;
import java.util.List;

public class Heap {

	public static void main(String[] args) throws Exception {
		List&lt;String&gt; temp = new ArrayList&lt;String&gt;();

		Thread.sleep(10000);
		while (true) {

			temp.add(&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;);
			//System.out.println(temp.size());

			if(temp.size() &gt; 3000000) {
				temp = null;
				temp = new ArrayList&lt;String&gt;();

			}
		}
	}
}
</pre>
<p>Heap ismini taşıyan sınıf bünyesinde x&#8217;lerden oluşan uzunca bir String nesnesini sonsuz bir döngü içinde temp ismindeki bir listeye yerleştiriyoruz. Liste bünyesinde yer alan String nesne adedi 300.000&#8242;e ulaştığında listeye null değerini atayarak siliyor ve yeniden bir liste oluşturuyoruz. Döngü içinde tekrar String nesneleri yeni listeye ekleniyor. Buradaki amacım hafızanın tükenmesi ile java.lang.OutOfMemoryError oluşmasını engellemek ve Garbage Collector&#8217;ün değişik heap alanları üzerinde nasıl çalıştığını gösterebilmekti. Java&#8217;da herhangi bir nesneye null degeri atandığında Garbage Collector&#8217;e &#8220;bu nesne ölmüştür, yok edilebilir&#8221; mesajı verilmektedir. Eğer bu nesneye herhangi başka bir nesneden referans yoksa, Garbage Collector bu nesneyi öldü kabul edip, temizleyecektir. Şimdi beraber videoyu izleyelim.</p>
<p><iframe width="600" height="400" src="http://www.youtube.com/embed/gylkkP9HIrQ" frameborder="0" allowfullscreen></iframe></p>
<p>Videoda yer alan program için 64 MB büyüklüğünde bir heap alanını -Xms64m -Xmx64m JVM parametreleri kullanarak tahsis ettim. Eğer heap alanı 10 MB olursa OutOfMemoryError hatası oluşmaktadır. Aynı şekilde liste içindeki String nesne adedini 600.000&#8242;e çıkardığımda hafıza yetersizliğinden dolayı OutOfMemoryError hatası oluşmaktadır. </p>
<p>Video ve oluşan Garbage Collection aktiviteleri hakkında detaya girmeden önce, değişik Garbage Collector mekanizmalarını ve algoritmalarını gözden geçirelim.</p>
<p><font size="5">Generational Garbage Collection</font></p>
<p>Tipik bir Java uygulaması gözlemlendiğinde, uygulamanın hayatı süresince oluşan birçok nesnenin kısa ömürlü oldukları görülmektedir. Oluşturulan nesnelerin çogu bir metot son bulduktan sonra, sadece metot bünyesinde kullanıldıkları için hayata gözlerini yumarlar. Bunun yanısra bir Java uygulaması bünyesinde nesneler yaşlanarak belli bir yaşa erişebilirler. Bir nesnenin yaşlanma süreci uygulama bünyesinde kullanılma derecesini yansıtmaktadır. </p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim1.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim1.png" alt="" title="resim1" width="655" height="282" /></a><br />Resim 1</p>
<p>Java uygulamarında oluşturulan nesnelerin hayat döngülerini yönetmek icin Sun firması tarafından JDK 1.3 versiyonu ile Generational Garbage Collection geliştirilmiştir. Resim 1’de görüldüğü gibi Generation Garbage Collection ile Java uygulamasının kullandığı hazıfa iki jenerasyona bölünmektedir. Yeni doğan nesneler genç jenerasyon (young generation), orta ve ileri yaşlı nesneler yaşlı jenerasyon (old generation) bölümünde konuşlandırılırlar.</p>
<p>Nesnelerin ait oldukları yaş gurubuna gore ihtiyaç duyulan hafıza yönetim mekanizmaları farklılık gösterir. Yeni jenerasyon bünyesinde nesne doğum ve ölümleri çok hızlı gerçekleşir. Bu bölümde kullanılan Garbage Collection algoritmasının yeni doğan nesnelere hızlı bir şekilde hazıfa alanı tahsis etmesi, ölen nesneleri ortadan kaldırması gerekmektedir. Bu jenerasyon için kullanılan Garbage Collection algoritması bu ihtiyaca cevap verecek şekilde geliştirilmiştir. Yaşlı jenerasyonda durum farklıdır. Bu bölümde Formel 1’de olduğu gibi hızlı haraket etme gerekliliği yoktur. Bu jenerasyonda nesneler daha yavaş bir hayat temposuna sahiptir. Bu jenerasyonda kullanılan Garbage Collection algoritması buna uygun şekilde geliştirilmistir.</p>
<p><font size="5">Young Generation Garbage Collection</font></p>
<p>Young generation üç hafıza alanından oluşmaktadır. Bunlar Eden, Survivor 1 ve Survivor 2 hafıza alanlarıdır. Bir Java uygulamasında nesnelerin hepsi gözlerini Eden hafıza alanında dünyaya açarlar. Survivor 1 ve Survivor 2 alanları geçici ara hafıza alanı olarak kullanılır. Eden hafıza alanı dolduğunda, Garbage Collector hayatta kalan nesneleri önce boş olan Survivor alanlarından birisine kopyalar. Bu işlemin ardından Garbage Collector Eden ve kullanımda olan Survivor alanını boşaltır. Eden hafıza alanı tekrar dolduğunda, hayatta kalan nesneler ve dolu olan Survivor alanındaki nesnelerin hepsi tekrar boş olan Survivor alanına kopyalanır. Her zaman bir Survivor alanı boştur ve bir sonraki Garbage Collection işlemi sonunda hayatta kalan nesneleri bünyesine alacak şekilde pasif olarak bekler. Videoda da Eden ve Survivor hafıza alanlarının Garbage Collector tarafından doldurulma ve boşaltılma işlemleri görülmektedir. Young generation bünyesinde çalışan Garbage Collection mark &#038; copy (işaretle ve kopyala) algoritmasını kullanmaktadır. Şimdi bu algoritmanın nasıl çalıştığını yakından inceleyelim.</p>
<p><font size="5">Mark &#038; Copy Algoritması</font></p>
<p>JVM bünyesinde kullanılan tüm Garbage Collection mekanizmaları hayattaki nesneleri işaretleme (mark) işlemi ile işe başlarlar. Garbage Collector hangi nesnelerin hayatta olduğunu anlamak için kök setini (root set) oluşturan nesnelerden yola çıkıp, diğer nesnelere olan bağlantıları takip eder. Bu işlemi bir ağacın kökünden yola çıkarak, dallarına kadar erişme olarak düşünebiliriz. Garbage Collector bu şekilde hayatta olan tüm nesneleri işaretler. Erişemediği diğer nesnelerin hepsini ölü kabul eder ve bir sonraki Garbage Collection ile ortadan kaldırılmalarını sağlar. Kök setinde kendisine doğru nesne referansı olmayan, ama kendisinden başka nesnelere referans giden nesneler yer alır. Bu tip nesneler genelde metot parametreleridir ya da global geçerliliği olan statik olarak tanımlanmış nesnelerdir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim2.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim2.png" alt="" title="resim2" width="632" height="272"/></a><br /> Resim 2</p>
<p>Resim 2’de kök setin A ve E nesneslerinden oluştuğu görülmektedir. Garbage Collector işaretleme işine önce A nesnesinden yola çıkarak başlar. B, C ve dolaylı olarak D nesnelerine erişir ve bu nesne kümesini (A,B,C,D) hayatta olan nesneler olarak işaretler. İşaretleme işine E nesnesi ile devam eder. E nesnesi kök setinde yer alan bir nesnedir, lakin E’den yola çıkarak başka bir nesneye erişmek mümkün değildir. Ayrıca başka bir nesne de E nesnesine işaret etmemektedir. Bu yüzden E nesnesi artık ölmüş bir nesnedir ve bir sonraki Garbage Collection ile E nesnesinin işgal ettiği hafıza alanı temizlenir. </p>
<p>Garbage Collector işaretleme (mark) işlemini tamamladıktan sonra hayatta kalan nesneleri aktif olan Survivor alanına kopyalama işlemine başlar. Garbage Collector resim 2’de görüldüğü gibi hayatta kalan nesne kümesini (ABCD) aktif olan Survivor 1 alanına kopyalar. Nesneler, işgal ettikleri adres alanları arka arkaya gelecek şekilde Survivor 1’de konuşlandırılır. Garbage Collection işlemi sonunda hayatta kalan nesnelerin birbirlerine olan referansları ve sahip oldukları adres alanları değişeceği için Garbage Collector işaretleme ve kopyalama işlemi öncesinde uygulama bünyesinde çalışan tüm threadleri durdurmak zorundadır. Bu işlem JVM terminolojisinde dünyayı durdurma (stop the world) olarak adlandırılır. Belli bir süre boyunca uygulama durur ve uygulama bünyesinde aktif olan sadece Garbage Collector’dür. Eğer Garbage Collector işine başlamadan önce dünyayı durdurmamış olsa, aktif olan uygulama threadleri nesne referansları üzerinde değişiklik yaparak, Garbage Collector’ün yanlış nesneler üzerinde işlem yapmasına sebep olabilirler. Bu sebepten dolayı Garbage Collection öncesi dünyanın durması gerekmektedir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim3.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim3.png" alt="" title="resim3" width="638" height="272"/></a><br />Resim 3</p>
<p>Resim 3’de Garbage Collection sonrasınra Eden bünyesinde yeni nesnelerin oluştuğu görülmektedir. Kök set içinde X ve W nesnesi yer almaktadır. Garbage Collector X,Y,Z ve Survivor 1’de yer alan ABCD nesnelerini Survivor 2’ye kopyalar. Garbage Collection işlemi sonunda young generation hafıza alanındaki son durum resim 4’de yer almaktadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim44.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim44.jpg" alt="" title="resim4"/></a><br />Resim 4</p>
<p>Görüldüğü gibi her Garbage Collection sonunda Survivor alanları rolleri değiştirmektedir. Survivor alanlarının her Garbage Collection sonrası yer degiştirmeleri resim 5’de de görülmektedir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim5.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim5.png" alt="" title="resim5" width="763" height="551"/></a><br />Resim 5</p>
<p>Resim 5’de yer alan birinci kolon Survivor 1’in, ikinci kolon Survivor 2’nin, üçüncü kolon Eden’in, dördüncü kolon Old hafıza alanının doluluk oranını göstermektedir. Görüldüğü gibi Garbage Collector düzenli olarak hayatta kalan nesneleri kopyalamak için pasif olan Survivor alanını kullanmaktadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim6.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim6.png" alt="" title="resim6" width="599" height="360"/></a><br />Resim 6</p>
<p>Bir Java uygulaması -XX:+PrintHeapAtGC JVM parametresi ile çalıştırıldığv zaman, resim 6’da yer alan Garbage Collection log kayıtları oluşmaktadır. İlk kırmızı işaretli alan içinde Survivor 1 from, Survivor 2 ise to olarak isimlendirilmiştir. Survivor 1’in hafıza başlangıç adresi 0x30e40000, Survivor 2’nin hafıza başlangıç adresi 0x30c20000’dir. İkinci kırmızı işaretli alana baktığımızda from ve to’nun adres alanlarının değiştiğini görmekteyiz. Garbage Collection işlemi oluşmuş ve Survivor alanları yer degiştirmiştir. Garbage Collector tarafından hep bir Survivor alanı reserve durumunda bir sonraki Garbage Collection içinde kullanılmak üzere beklemede tutulur. Bu dogal olarak belirli bir hafıza alanının kullanılmayarak israf edildiği anlamına gelir. Ne yazık ki bu Mark &#038; Copy algoritmasının bir dejavantajıdır. Bunun haricinde bu algoritma hızlı bir şekilde Eden bünyesinde olup bitenlere cevap verebilecek yetenekte ve kapasitededir.</p>
<p><font size="5">Minor &#038; Major Garbage Collection</font></p>
<p>Garbage Collection minor (küçük) ve major (büyük) olmak üzere ikiye ayrılır. Minor Garbage Collection’ı kendi odamızı, Major Garbage Collection’ı evimizi temizleme gibi düşünebiliriz. Young Generation bünyesinde yapılan Garbage Collection işlemine minor Garbage Collection, JVM kontrolündeki tüm hafıza alanlarının temizlenme işlemine major Garbage Collection ismi verilir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim7.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim7.png" alt="" title="resim7" width="333" height="377"/></a><br />Resim 7</p>
<p>Resim 7’de Garbage Collector tarafından yapılan minor ve major Garbage Collection işlemleri yer almaktadır. GC ile başlayan satırlar minor, Full GC ile başlayan satırlar major Garbage Collection yapıldığınin ibaresidir. Major Garbage Collection işlemi için ayrıca Full Garbage Collection ismi de kullanılmaktadır.</p>
<p>İlk satırda young generation tarafından işgal edilen hafıza alanı toplamda 11994 kilobytetır (~ 12 MB). Minor Garbage Collection işlemi sonunda ölen nesneler temizlenmiş ve hayatta kalan nesnelerin kapladığı alan 4048 (~ 4 MB) kilobyte olarak değişmiştir. Garbage Collector minor Garbage Collection işlemi ile 8 MB civarında ölü nesneyi hafıza alanından kaldırmıştır. Bu minor Garbage Collection işlemi 0.02 saniye sürmüştür. Bu zaman diliminde JVM bünyesinde sadece Garbage Collection işlemi yapılmıştır. Parantez içinde yer alan 63360K (~ 64 MB) JVM tarafından kullanılan tüm hafıza alanlarının toplamını yansıtmaktadır. JVM parametreleri olarak -Xms64m -Xmx64m kullandığımız için, programın işgal ettiği toplam hafıza alanı 64 MB’dir. </p>
<p>Eden hafıza alanı, Old hafıza alanına göre daha küçük olduğu için bu alanda minor Garbage Collection işlemleri Old generation bünyesinde olan major Garbage Collection işlemlerinden sayıca çok daha fazladır. Resim 7’de Garbage Collector 20 minor Garbage Collection, buna karşılık sadece 4 major Garbage Collection gerçekleştirmiştir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim8.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim8.png" alt="" title="resim8" width="767" height="770"/></a><br />Resim 8</p>
<p>Yedinci satırda major Garbage Collection yapıldığını görmekteyiz. Tüm JVM bünyesinde 56241 kilobyte (~56 MB) hafıza alanı kullanımdadır (young + s0 + s1 + old). Görüldüğü gibi bu değer JVM hafıza büyüklüğü olan 64 MB’ye yakın bir değerdir. Resim 8’de young ve old generation hafıza alanlarının dağılım oranları yer almaktadır. JVM Eden için 17 MB, S0 için 2 MB, S1 için 2 MB ve Old icin 42 MB alan ayırmıştır. JVM parametreleri ile hafıza alanlarının büyüklüklerini değiştirmek mümkündür. Buna yönelik bir ayarlama yapılmadığında JVM otomatik olarak hafıza alanlarının büyüklüğünü ayarlar. Full GC ardından hayatta kalan nesnelerin kapladığı alan 6011 kilobyte (~6MB) olarak değişmiştir. Bu major garbage collection işlemi ile 50 MB büyüklüğünde nesneler Garbage Collector tarafından ebediyete uğurlanmıştır.</p>
<p><font size="5">Durdurun Dünyayı</font></p>
<p>“Durdurun dünyayı başım dönüyor” diyor Ferdi Tayfur şarkısında. JVM mucitleri Ferdi Tayfur’un bu şarkısından esinlenerek dünyayı durduran Garbage Collector algoritmaları geliştirmişlerdir. Arabesk müziğin Java üzerindeki etkilerini başka bir yazımda detaylı olarak ele alacağım. Arabeskin programcılık üzerinde etkileri düşünüldüğünden çok daha fazladır.  (:)</p>
<p>Garbage Collector minor Garbage Collection için tek bir thread (Reaper Thread) kullanmaktadır. Garbage Collection işlemi esnasında Garbage Collector JVM bünyesinde çalışan tüm threadleri durdurur. Uygulama için dünya durmuş olur. Dünya ne kadar uzun durursa, uygulamanın kullanıcıya verdiği cevaplar o oranda gecikir. Buradan Garbage Collection işlemi esnasında verilen araların mümkün olduğunca kısa olması gerektiği sonucu çıkmaktadır. JVM mucitleri bunu göz önünde bulundurarak paralel çalışan minor Garbage Collection algoritması geliştirmişlerdir.</p>
<p>Paralel çalışan minor Garbage Collection algoritması, tekil threadle işini gören minor Garbage Collection ile teoride aynı yapıdadır. Aralarındaki tek fark, parelel minor Garbage Collection için birden fazla threadin çalışmasıdır. Bu şekilde stop the world duraklamaları daha kısaltılmış olur. Bu uygulamanın kullanıcıya karşı cevapkanlık oranını artırmaktadır.</p>
<p>Paralel minor Garbage Collection nasıl çalışmaktadır? Garbage Collector’ün temizleme işlemine hayatta kalan nesneleri işaretleyerek (mark) başladığını yazmıştım. Garbage Collector bu amaçla kök setinde yer alan nesneleri tarar ve bu nesnelerden yola çıkarak işaretleme işlemini yapar. Akabinde hayatta kalan tüm nesneleri aktif olan Survivor alanına kopyalar (copy). Paralel Minor Garbage Collection için kök setinde yer alan nesneler birden fazla Garbage Collection threadine atanır. Birden fazla thread paralel olarak kök setindeki bir nesneden yola çıkarak hayatta kalan nesneleri tararlar. Bu şekilde işaretleme performansı artırılır ve işaretleme için harcanan zaman azalır.</p>
<p>Hayatta kalan nesnelerin aktif olan Survivor alanına da kopyalanma işlemi buna benzer bir şekilde gerçekleşir. Her threade Survivor hafıza alanında PLAB (PLAB – Parallel Local Alocation Buffer) ismi verilen bir alan atanır. Garbage Collection threadleri birbirlerinden bağımsız olarak keşfettikleri ve hayatta kalmış olan nesneleri kendi PLAB alanlarına kopyalarlar. </p>
<p>Paralel Garbage Collection paralel çalışan threadlere rağmen dünyayı durduran bir algoritmadır. Tekil threadle çalışan Garbage Collection algoritmasına göre daha hızlı çalışır ve uygulamanın durma zamanlarını kısaltır. Birden fazla işlemcisi (CPU – Central Processing Unit) olan bir sunucu üzerinde paralel Garbage Collection algoritmasını kullanmak bu kazancı getirir. Lakin sadece bir işlemcisi olan sunucularda paralel Garbage Collection’ın kullanılması tam tersi bir etki yaratır. </p>
<p>Yazımın ikinci bölümünde major Garbage Collection’ın nasıl çalıştığını inceleyeceğim.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar<br />
</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Java programcısının çok sadık bir hizmetçisi var. Her türlü çöplüğü, pisliği arkasından devamlı toplar, hiç sesini çıkarmaz. Çöplerin efendisidir, ama bir o kadar da mütevazidir. Kimseye belli etmeden işini görür. Bu yüzden birçok Java programcısı onun farkında bile değildir. Ama o işini yapmasa Java programcısının hali çok vahim olur, C/C++ ile kod yazan meslektaşlarından bir farkı kalmaz, bilgisayarın hafızası denilen kara delikte kaybolur gider, yazdığı programlar devamlı sallanır.</p>
<p><span id="more-2154"></span></p>
<p>Garbage Collector&#8217;dan bahsediyorum. Çoğu Java programcısının varlığından bile haberdar olmadığı, bazılarının çekindiği, bazılarının ne yaptığını tam olarak anlamdığı, bazılarının ise yaptığı işe hayran olup, ince ince hayranlık duyduğu Garbage Collector&#8230; Java&#8217;yı Java yapan özelliklerinden bir tanesi bir Garbage Collector&#8217;e sahip olmasıdır. Şimdi yakından tanıyalım bu kahramanı.</p>
<p>Java dilinde herhangi bir sınıftan bir nesne oluşturmak için new operatörü, Class.forName().newInstance(), clone() veya readObject() metodu  kullanılır. Örneğin new operatörü sınıfın konstrüktörünü kullanarak <a href="http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/" target=_blank>JVM</a> bünyesinde yeni bir nesne oluşturur. Nesne inşa edildikten sonra <a href="http://www.kurumsaljava.com/2012/05/12/java-heap/" target=_blank>Java Heap</a> içinde konuşlandırılır. Nesnelerin hepsi kullanıldıkları sürece heap icinde mutlu, mesut hayatlarını sürdürürler. Ama her canlı gibi onlar da birgün ölürler. Öldüklerinde onları toplayıp, ebediyete intikal ettiren Garbage Collector&#8217;dür.</p>
<p>İngilizce&#8217;de garbage çöp anlamına gelmektedir. Garbage Collector JVM bünyesinde hem yeni nesnelerin doğmasına yardımcı olan, hem de ölen nesneleri ortadan kaldıran modüldür. new operatörü ile doğan yeni nesneler için Garbage Collector hafıza alanını temin eder. Ölen ve çöp olarak isimlendirilen nesnelerin işgal ettikleri hafıza alanını Garbage Collector boşaltır ve yeni nesnelere tayin eder. Garbage Collector kısaca Java&#8217;da otomatik hafıza yönetiminden sorumludur. Onsuz Java&#8217;nın C/C++ dilinden bir farkı kalmazdı.</p>
<p>Garbage Collector&#8217;ün nasıl çalıştığını görebilmek için aşağıda yer alan videoyu hazırladım. Collector&#8217;ü kızdırmak için bolca çöp (garbage) üreten minik bir Java programını şu şekilde oluşturmak yeterli:</p>
<pre name="code" class="java">

package com.kurumsaljava.jvm.garbage;

import java.util.ArrayList;
import java.util.List;

public class Heap {

	public static void main(String[] args) throws Exception {
		List&lt;String&gt; temp = new ArrayList&lt;String&gt;();

		Thread.sleep(10000);
		while (true) {

			temp.add(&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;);
			//System.out.println(temp.size());

			if(temp.size() &gt; 3000000) {
				temp = null;
				temp = new ArrayList&lt;String&gt;();

			}
		}
	}
}
</pre>
<p>Heap ismini taşıyan sınıf bünyesinde x&#8217;lerden oluşan uzunca bir String nesnesini sonsuz bir döngü içinde temp ismindeki bir listeye yerleştiriyoruz. Liste bünyesinde yer alan String nesne adedi 300.000&#8242;e ulaştığında listeye null değerini atayarak siliyor ve yeniden bir liste oluşturuyoruz. Döngü içinde tekrar String nesneleri yeni listeye ekleniyor. Buradaki amacım hafızanın tükenmesi ile java.lang.OutOfMemoryError oluşmasını engellemek ve Garbage Collector&#8217;ün değişik heap alanları üzerinde nasıl çalıştığını gösterebilmekti. Java&#8217;da herhangi bir nesneye null degeri atandığında Garbage Collector&#8217;e &#8220;bu nesne ölmüştür, yok edilebilir&#8221; mesajı verilmektedir. Eğer bu nesneye herhangi başka bir nesneden referans yoksa, Garbage Collector bu nesneyi öldü kabul edip, temizleyecektir. Şimdi beraber videoyu izleyelim.</p>
<p><iframe width="600" height="400" src="http://www.youtube.com/embed/gylkkP9HIrQ" frameborder="0" allowfullscreen></iframe></p>
<p>Videoda yer alan program için 64 MB büyüklüğünde bir heap alanını -Xms64m -Xmx64m JVM parametreleri kullanarak tahsis ettim. Eğer heap alanı 10 MB olursa OutOfMemoryError hatası oluşmaktadır. Aynı şekilde liste içindeki String nesne adedini 600.000&#8242;e çıkardığımda hafıza yetersizliğinden dolayı OutOfMemoryError hatası oluşmaktadır. </p>
<p>Video ve oluşan Garbage Collection aktiviteleri hakkında detaya girmeden önce, değişik Garbage Collector mekanizmalarını ve algoritmalarını gözden geçirelim.</p>
<p><font size="5">Generational Garbage Collection</font></p>
<p>Tipik bir Java uygulaması gözlemlendiğinde, uygulamanın hayatı süresince oluşan birçok nesnenin kısa ömürlü oldukları görülmektedir. Oluşturulan nesnelerin çogu bir metot son bulduktan sonra, sadece metot bünyesinde kullanıldıkları için hayata gözlerini yumarlar. Bunun yanısra bir Java uygulaması bünyesinde nesneler yaşlanarak belli bir yaşa erişebilirler. Bir nesnenin yaşlanma süreci uygulama bünyesinde kullanılma derecesini yansıtmaktadır. </p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim1.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim1.png" alt="" title="resim1" width="655" height="282" /></a><br />Resim 1</p>
<p>Java uygulamarında oluşturulan nesnelerin hayat döngülerini yönetmek icin Sun firması tarafından JDK 1.3 versiyonu ile Generational Garbage Collection geliştirilmiştir. Resim 1’de görüldüğü gibi Generation Garbage Collection ile Java uygulamasının kullandığı hazıfa iki jenerasyona bölünmektedir. Yeni doğan nesneler genç jenerasyon (young generation), orta ve ileri yaşlı nesneler yaşlı jenerasyon (old generation) bölümünde konuşlandırılırlar.</p>
<p>Nesnelerin ait oldukları yaş gurubuna gore ihtiyaç duyulan hafıza yönetim mekanizmaları farklılık gösterir. Yeni jenerasyon bünyesinde nesne doğum ve ölümleri çok hızlı gerçekleşir. Bu bölümde kullanılan Garbage Collection algoritmasının yeni doğan nesnelere hızlı bir şekilde hazıfa alanı tahsis etmesi, ölen nesneleri ortadan kaldırması gerekmektedir. Bu jenerasyon için kullanılan Garbage Collection algoritması bu ihtiyaca cevap verecek şekilde geliştirilmiştir. Yaşlı jenerasyonda durum farklıdır. Bu bölümde Formel 1’de olduğu gibi hızlı haraket etme gerekliliği yoktur. Bu jenerasyonda nesneler daha yavaş bir hayat temposuna sahiptir. Bu jenerasyonda kullanılan Garbage Collection algoritması buna uygun şekilde geliştirilmistir.</p>
<p><font size="5">Young Generation Garbage Collection</font></p>
<p>Young generation üç hafıza alanından oluşmaktadır. Bunlar Eden, Survivor 1 ve Survivor 2 hafıza alanlarıdır. Bir Java uygulamasında nesnelerin hepsi gözlerini Eden hafıza alanında dünyaya açarlar. Survivor 1 ve Survivor 2 alanları geçici ara hafıza alanı olarak kullanılır. Eden hafıza alanı dolduğunda, Garbage Collector hayatta kalan nesneleri önce boş olan Survivor alanlarından birisine kopyalar. Bu işlemin ardından Garbage Collector Eden ve kullanımda olan Survivor alanını boşaltır. Eden hafıza alanı tekrar dolduğunda, hayatta kalan nesneler ve dolu olan Survivor alanındaki nesnelerin hepsi tekrar boş olan Survivor alanına kopyalanır. Her zaman bir Survivor alanı boştur ve bir sonraki Garbage Collection işlemi sonunda hayatta kalan nesneleri bünyesine alacak şekilde pasif olarak bekler. Videoda da Eden ve Survivor hafıza alanlarının Garbage Collector tarafından doldurulma ve boşaltılma işlemleri görülmektedir. Young generation bünyesinde çalışan Garbage Collection mark &#038; copy (işaretle ve kopyala) algoritmasını kullanmaktadır. Şimdi bu algoritmanın nasıl çalıştığını yakından inceleyelim.</p>
<p><font size="5">Mark &#038; Copy Algoritması</font></p>
<p>JVM bünyesinde kullanılan tüm Garbage Collection mekanizmaları hayattaki nesneleri işaretleme (mark) işlemi ile işe başlarlar. Garbage Collector hangi nesnelerin hayatta olduğunu anlamak için kök setini (root set) oluşturan nesnelerden yola çıkıp, diğer nesnelere olan bağlantıları takip eder. Bu işlemi bir ağacın kökünden yola çıkarak, dallarına kadar erişme olarak düşünebiliriz. Garbage Collector bu şekilde hayatta olan tüm nesneleri işaretler. Erişemediği diğer nesnelerin hepsini ölü kabul eder ve bir sonraki Garbage Collection ile ortadan kaldırılmalarını sağlar. Kök setinde kendisine doğru nesne referansı olmayan, ama kendisinden başka nesnelere referans giden nesneler yer alır. Bu tip nesneler genelde metot parametreleridir ya da global geçerliliği olan statik olarak tanımlanmış nesnelerdir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim2.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim2.png" alt="" title="resim2" width="632" height="272"/></a><br /> Resim 2</p>
<p>Resim 2’de kök setin A ve E nesneslerinden oluştuğu görülmektedir. Garbage Collector işaretleme işine önce A nesnesinden yola çıkarak başlar. B, C ve dolaylı olarak D nesnelerine erişir ve bu nesne kümesini (A,B,C,D) hayatta olan nesneler olarak işaretler. İşaretleme işine E nesnesi ile devam eder. E nesnesi kök setinde yer alan bir nesnedir, lakin E’den yola çıkarak başka bir nesneye erişmek mümkün değildir. Ayrıca başka bir nesne de E nesnesine işaret etmemektedir. Bu yüzden E nesnesi artık ölmüş bir nesnedir ve bir sonraki Garbage Collection ile E nesnesinin işgal ettiği hafıza alanı temizlenir. </p>
<p>Garbage Collector işaretleme (mark) işlemini tamamladıktan sonra hayatta kalan nesneleri aktif olan Survivor alanına kopyalama işlemine başlar. Garbage Collector resim 2’de görüldüğü gibi hayatta kalan nesne kümesini (ABCD) aktif olan Survivor 1 alanına kopyalar. Nesneler, işgal ettikleri adres alanları arka arkaya gelecek şekilde Survivor 1’de konuşlandırılır. Garbage Collection işlemi sonunda hayatta kalan nesnelerin birbirlerine olan referansları ve sahip oldukları adres alanları değişeceği için Garbage Collector işaretleme ve kopyalama işlemi öncesinde uygulama bünyesinde çalışan tüm threadleri durdurmak zorundadır. Bu işlem JVM terminolojisinde dünyayı durdurma (stop the world) olarak adlandırılır. Belli bir süre boyunca uygulama durur ve uygulama bünyesinde aktif olan sadece Garbage Collector’dür. Eğer Garbage Collector işine başlamadan önce dünyayı durdurmamış olsa, aktif olan uygulama threadleri nesne referansları üzerinde değişiklik yaparak, Garbage Collector’ün yanlış nesneler üzerinde işlem yapmasına sebep olabilirler. Bu sebepten dolayı Garbage Collection öncesi dünyanın durması gerekmektedir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim3.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim3.png" alt="" title="resim3" width="638" height="272"/></a><br />Resim 3</p>
<p>Resim 3’de Garbage Collection sonrasınra Eden bünyesinde yeni nesnelerin oluştuğu görülmektedir. Kök set içinde X ve W nesnesi yer almaktadır. Garbage Collector X,Y,Z ve Survivor 1’de yer alan ABCD nesnelerini Survivor 2’ye kopyalar. Garbage Collection işlemi sonunda young generation hafıza alanındaki son durum resim 4’de yer almaktadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim44.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim44.jpg" alt="" title="resim4"/></a><br />Resim 4</p>
<p>Görüldüğü gibi her Garbage Collection sonunda Survivor alanları rolleri değiştirmektedir. Survivor alanlarının her Garbage Collection sonrası yer degiştirmeleri resim 5’de de görülmektedir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim5.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim5.png" alt="" title="resim5" width="763" height="551"/></a><br />Resim 5</p>
<p>Resim 5’de yer alan birinci kolon Survivor 1’in, ikinci kolon Survivor 2’nin, üçüncü kolon Eden’in, dördüncü kolon Old hafıza alanının doluluk oranını göstermektedir. Görüldüğü gibi Garbage Collector düzenli olarak hayatta kalan nesneleri kopyalamak için pasif olan Survivor alanını kullanmaktadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim6.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim6.png" alt="" title="resim6" width="599" height="360"/></a><br />Resim 6</p>
<p>Bir Java uygulaması -XX:+PrintHeapAtGC JVM parametresi ile çalıştırıldığv zaman, resim 6’da yer alan Garbage Collection log kayıtları oluşmaktadır. İlk kırmızı işaretli alan içinde Survivor 1 from, Survivor 2 ise to olarak isimlendirilmiştir. Survivor 1’in hafıza başlangıç adresi 0x30e40000, Survivor 2’nin hafıza başlangıç adresi 0x30c20000’dir. İkinci kırmızı işaretli alana baktığımızda from ve to’nun adres alanlarının değiştiğini görmekteyiz. Garbage Collection işlemi oluşmuş ve Survivor alanları yer degiştirmiştir. Garbage Collector tarafından hep bir Survivor alanı reserve durumunda bir sonraki Garbage Collection içinde kullanılmak üzere beklemede tutulur. Bu dogal olarak belirli bir hafıza alanının kullanılmayarak israf edildiği anlamına gelir. Ne yazık ki bu Mark &#038; Copy algoritmasının bir dejavantajıdır. Bunun haricinde bu algoritma hızlı bir şekilde Eden bünyesinde olup bitenlere cevap verebilecek yetenekte ve kapasitededir.</p>
<p><font size="5">Minor &#038; Major Garbage Collection</font></p>
<p>Garbage Collection minor (küçük) ve major (büyük) olmak üzere ikiye ayrılır. Minor Garbage Collection’ı kendi odamızı, Major Garbage Collection’ı evimizi temizleme gibi düşünebiliriz. Young Generation bünyesinde yapılan Garbage Collection işlemine minor Garbage Collection, JVM kontrolündeki tüm hafıza alanlarının temizlenme işlemine major Garbage Collection ismi verilir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim7.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim7.png" alt="" title="resim7" width="333" height="377"/></a><br />Resim 7</p>
<p>Resim 7’de Garbage Collector tarafından yapılan minor ve major Garbage Collection işlemleri yer almaktadır. GC ile başlayan satırlar minor, Full GC ile başlayan satırlar major Garbage Collection yapıldığınin ibaresidir. Major Garbage Collection işlemi için ayrıca Full Garbage Collection ismi de kullanılmaktadır.</p>
<p>İlk satırda young generation tarafından işgal edilen hafıza alanı toplamda 11994 kilobytetır (~ 12 MB). Minor Garbage Collection işlemi sonunda ölen nesneler temizlenmiş ve hayatta kalan nesnelerin kapladığı alan 4048 (~ 4 MB) kilobyte olarak değişmiştir. Garbage Collector minor Garbage Collection işlemi ile 8 MB civarında ölü nesneyi hafıza alanından kaldırmıştır. Bu minor Garbage Collection işlemi 0.02 saniye sürmüştür. Bu zaman diliminde JVM bünyesinde sadece Garbage Collection işlemi yapılmıştır. Parantez içinde yer alan 63360K (~ 64 MB) JVM tarafından kullanılan tüm hafıza alanlarının toplamını yansıtmaktadır. JVM parametreleri olarak -Xms64m -Xmx64m kullandığımız için, programın işgal ettiği toplam hafıza alanı 64 MB’dir. </p>
<p>Eden hafıza alanı, Old hafıza alanına göre daha küçük olduğu için bu alanda minor Garbage Collection işlemleri Old generation bünyesinde olan major Garbage Collection işlemlerinden sayıca çok daha fazladır. Resim 7’de Garbage Collector 20 minor Garbage Collection, buna karşılık sadece 4 major Garbage Collection gerçekleştirmiştir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim8.png"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/resim8.png" alt="" title="resim8" width="767" height="770"/></a><br />Resim 8</p>
<p>Yedinci satırda major Garbage Collection yapıldığını görmekteyiz. Tüm JVM bünyesinde 56241 kilobyte (~56 MB) hafıza alanı kullanımdadır (young + s0 + s1 + old). Görüldüğü gibi bu değer JVM hafıza büyüklüğü olan 64 MB’ye yakın bir değerdir. Resim 8’de young ve old generation hafıza alanlarının dağılım oranları yer almaktadır. JVM Eden için 17 MB, S0 için 2 MB, S1 için 2 MB ve Old icin 42 MB alan ayırmıştır. JVM parametreleri ile hafıza alanlarının büyüklüklerini değiştirmek mümkündür. Buna yönelik bir ayarlama yapılmadığında JVM otomatik olarak hafıza alanlarının büyüklüğünü ayarlar. Full GC ardından hayatta kalan nesnelerin kapladığı alan 6011 kilobyte (~6MB) olarak değişmiştir. Bu major garbage collection işlemi ile 50 MB büyüklüğünde nesneler Garbage Collector tarafından ebediyete uğurlanmıştır.</p>
<p><font size="5">Durdurun Dünyayı</font></p>
<p>“Durdurun dünyayı başım dönüyor” diyor Ferdi Tayfur şarkısında. JVM mucitleri Ferdi Tayfur’un bu şarkısından esinlenerek dünyayı durduran Garbage Collector algoritmaları geliştirmişlerdir. Arabesk müziğin Java üzerindeki etkilerini başka bir yazımda detaylı olarak ele alacağım. Arabeskin programcılık üzerinde etkileri düşünüldüğünden çok daha fazladır.  (:)</p>
<p>Garbage Collector minor Garbage Collection için tek bir thread (Reaper Thread) kullanmaktadır. Garbage Collection işlemi esnasında Garbage Collector JVM bünyesinde çalışan tüm threadleri durdurur. Uygulama için dünya durmuş olur. Dünya ne kadar uzun durursa, uygulamanın kullanıcıya verdiği cevaplar o oranda gecikir. Buradan Garbage Collection işlemi esnasında verilen araların mümkün olduğunca kısa olması gerektiği sonucu çıkmaktadır. JVM mucitleri bunu göz önünde bulundurarak paralel çalışan minor Garbage Collection algoritması geliştirmişlerdir.</p>
<p>Paralel çalışan minor Garbage Collection algoritması, tekil threadle işini gören minor Garbage Collection ile teoride aynı yapıdadır. Aralarındaki tek fark, parelel minor Garbage Collection için birden fazla threadin çalışmasıdır. Bu şekilde stop the world duraklamaları daha kısaltılmış olur. Bu uygulamanın kullanıcıya karşı cevapkanlık oranını artırmaktadır.</p>
<p>Paralel minor Garbage Collection nasıl çalışmaktadır? Garbage Collector’ün temizleme işlemine hayatta kalan nesneleri işaretleyerek (mark) başladığını yazmıştım. Garbage Collector bu amaçla kök setinde yer alan nesneleri tarar ve bu nesnelerden yola çıkarak işaretleme işlemini yapar. Akabinde hayatta kalan tüm nesneleri aktif olan Survivor alanına kopyalar (copy). Paralel Minor Garbage Collection için kök setinde yer alan nesneler birden fazla Garbage Collection threadine atanır. Birden fazla thread paralel olarak kök setindeki bir nesneden yola çıkarak hayatta kalan nesneleri tararlar. Bu şekilde işaretleme performansı artırılır ve işaretleme için harcanan zaman azalır.</p>
<p>Hayatta kalan nesnelerin aktif olan Survivor alanına da kopyalanma işlemi buna benzer bir şekilde gerçekleşir. Her threade Survivor hafıza alanında PLAB (PLAB – Parallel Local Alocation Buffer) ismi verilen bir alan atanır. Garbage Collection threadleri birbirlerinden bağımsız olarak keşfettikleri ve hayatta kalmış olan nesneleri kendi PLAB alanlarına kopyalarlar. </p>
<p>Paralel Garbage Collection paralel çalışan threadlere rağmen dünyayı durduran bir algoritmadır. Tekil threadle çalışan Garbage Collection algoritmasına göre daha hızlı çalışır ve uygulamanın durma zamanlarını kısaltır. Birden fazla işlemcisi (CPU – Central Processing Unit) olan bir sunucu üzerinde paralel Garbage Collection algoritmasını kullanmak bu kazancı getirir. Lakin sadece bir işlemcisi olan sunucularda paralel Garbage Collection’ın kullanılması tam tersi bir etki yaratır. </p>
<p>Yazımın ikinci bölümünde major Garbage Collection’ın nasıl çalıştığını inceleyeceğim.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar<br />
</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F17%2Fcoplerin-efendisi-garbage-collection%2F&amp;linkname=%C3%87%C3%B6plerin%20Efendisi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/17/coplerin-efendisi-garbage-collection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mantığın Köleleri</title>
		<link>http://www.kurumsaljava.com/2012/05/14/mantigin-koleleri-2/</link>
		<comments>http://www.kurumsaljava.com/2012/05/14/mantigin-koleleri-2/#comments</comments>
		<pubDate>Mon, 14 May 2012 16:11:39 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2130</guid>
		<description><![CDATA[<p><a href="http://www.kurumsaljava.com/2012/05/08/programcilik-sanat-mi-zanaat-mi" target=_blank>Programcılık Sanat mı, Zanaat mı?</a> başlıklı yazıma gelen yorumlar, programcılığın sanat olduğu yönünde. Bunun aksini düşünenler de var. Programcılığın bir sanat olarak algılanması subjektif ve bir yanılgıdır. Programcılığın bir sanat olmadığının altını bu yazımla tekrar çizmek istedim.</p>
<p><span id="more-2130"></span></p>
<p>Sanat ve sanat eserleri görecelidir. İnsanlik var olduğundan beri sanat vardır, ama hala bu konudaki tartışmalar son bulmamıştır. „Renkler ve zenkler tartışılmaz“ sözünü sıkça işitmişizdir. Bu her bireyin sanat algılayış tarzının değişikliğine işaret etmektedir. Benim beğendiğim bir resmi, başka bir insan beğenmeyebilir. Bu yüzden sanatı tanımlamak ve bu işin içinden çıkmak çok karmaşık bir şeydir. Programcılığın da bir sanat olarak algılanıp, savunulması bu açıdan baktığımızda anlaşılabilir bir durumdur. </p>
<p>Bir sanat ya da sanat eseri ruha, göze ve gönüle hitap eder. Sanatın doğasında soyutluk vardır ve insanın kendisine özgün yorumuna ihtiyaç duyar. Bu yüzden herkesin sanatı algılayış tarzı değişiktir. Herkes sanatı kendi tarzında yorumlar. Eğer yazılan bir program parçası bir sanat eseri olmuş olsaydı, o zaman bu programa bakan herkes başka bir şey algılayacaktı ya da ondan kendi yorumladığı bir davranış biçimi bekleyecekti. Böyle bir şeyin yazılımda ne anlama geldiğini düşünebiliyor musunuz? Programcılık deterministik sonuçlar üretmek, mantık çerçevesinde kalıp, çözüm sunmak zorundadır. Ruha, gönüle değil, mantığa hitap eder. Sadece bu özelliğinden dolayı bile bir sanat olma şansı yoktur. Kim bir programa bakarsa baksın, aynı davranış biçimini görür, görmek zorundadır. Bir program her zaman aynı sonucu üretmek zorundadır, kod nasıl yazılmış olursa olsun. İnsanların yorumuna ihtiyacı yoktur, çünkü herkes aynı şeyi görür, daha dogrusu görmek zorundadır.</p>
<p>Programlar ihtiyaçtan doğarlar. Aynı şeyi sanat eserleri için söylemek mümkün değildir. Sanatkar bir şeylerden esinlenerek sanatını icra eder, zorda kalmadan, birilerine sanatını nasıl icra etmesi gerektiğini danışmadan. Programlar müşterileri tarafından kendi gereksinimlerini tatmin etmek için sipariş edilir. Müşterinin gereksinimleri programı yoğururken ön plandadır.  Programı oluşturulurken müşteri ile iletişim esastır. Onun istediği olur.</p>
<p>Bunu yanısıra programcının kod yazarken soyutluğu ifade etmek için çok fazla seçenegi yoktur. Java dilinde interface ya da abstract sınıfları kullanarak soyut bir şeyler ifade edebilebilir. Bu ressamın paletinde sadece bir, iki renk olduğu anlamına gelir. Sadece iki rengi kullanarak sanat eseri oluşturmak mümkün müdür? Belki! Bir ressamın paletinde onlarca renk vardır, bunları karıştırarak sonsuz sayıda yeni renk elde edebilir. Bu renklerin hepsini kullanma potansiyeline sahiptir ve bu sanatına yansır. Günümüzün programlama dillerinde böyle bir zenginlik söz konusu değildir. Kaldı ki en tabana indiğimizde bir programcı sıfır ve birlerden oluşan verilerden başka bir şeyle ugraşmaz. Sadece iki renkli olan bir dünyada yaşar ve bir takım verileri A’dan B’ye taşıyacak programlar yazar. İşin hepi, topu budur.</p>
<p>Günümüzde nesneye yönetlik programlama paradigması popülerdir. Ne olduğuna baktığımızda programcı olarak işimizi yapabilmemiz için çok kısıtlı sayıda araç ihtiva ettiğini görmekteyiz. Gerçek dünyayı modellemek için sınıfları, bu modellere hareket kabiliyeti verebilmek icin metotları kullanırız. Koca dünyayı modellemek için sadece bu iki aracı kullanabiliyoruz. Kod yazarken yapmak istediklerimizi ifade etmek için if ya da while gibi basit komutları kullanıyoruz. Kullanabileceğimiz başka ne var ki? Bu araçlardan faydalanıp nasıl bir sanat eseri ortaya koyabiliriz? Bu bir sanat eseri olsa bile fonksiyonel işlevi haricinde nesi kimi ilgilendirir?</p>
<p>Görüldügü gibi programcı sahip olduğu araçlar itibari ile çok kısıtlı bir dünyada yaşamaktadır. Oysaki bir sanatçının dünyası rengarenk ve pırıl pırıldır. Sayısız derecede kombinasyon imkanları vardır. Bunlardan faydalanarak sanatını icra eder ve sanat eserleri oluşturur. Biz programcılar sıkışıp kaldığımız mantıksal dünyada bu araç gerece ve lükse sahip degiliz.</p>
<p>Kanımca programcılıkta kreatif olma, sanat icrası ile karıştırılmaktadır. Programcılar kreatiftir. Devamlı karşılaştıkları sorunları aşmak için çözümler üretirler. Bunun için bir zanaatkar usta gibi bir takım alet, edevata ihtiyaç duyarlar. Usta programcılar örneğin tüm <a href="http://www.kurumsaljava.com/yazilim-metotlari/yazilim-mimarisi/" target=_blank>tasarım prensiplerine</a> hakımdirler. Nerede hangi <a href="http://www.kurumsaljava.com/yazilim-metotlari/tasarim-sablonlari/" target=_blank>tasarım şablonunu</a> kullanmaları gerektiğini bilirler. Az ve öz kod yazmayı yeğlerler. Yazdıkları kod roman gibi okunur, kod okundukça bir hikaye gibi kendisini anlatır. Burada bir tutam estetiklik yok değildir. Ama yinede bu aktivitelerin hiçbirisi bir sanat eseri ortaya koymaz.</p>
<p>Programcılık mantık işidir. <strong>Biz programcılar mantığın kölesiyiz</strong>. Programcılıkta bütün gidişati mantık yönetir. Mantığın bittiği yerde programcılık biter. Bir sanatçı hiçbir şeyin kölesi değildir. Aradaki fark budur. Mantıkla sanatı kavramaya çalışmak beyhude bir iştir.</p>
<p><em><br />
EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kurumsaljava.com/2012/05/08/programcilik-sanat-mi-zanaat-mi" target=_blank>Programcılık Sanat mı, Zanaat mı?</a> başlıklı yazıma gelen yorumlar, programcılığın sanat olduğu yönünde. Bunun aksini düşünenler de var. Programcılığın bir sanat olarak algılanması subjektif ve bir yanılgıdır. Programcılığın bir sanat olmadığının altını bu yazımla tekrar çizmek istedim.</p>
<p><span id="more-2130"></span></p>
<p>Sanat ve sanat eserleri görecelidir. İnsanlik var olduğundan beri sanat vardır, ama hala bu konudaki tartışmalar son bulmamıştır. „Renkler ve zenkler tartışılmaz“ sözünü sıkça işitmişizdir. Bu her bireyin sanat algılayış tarzının değişikliğine işaret etmektedir. Benim beğendiğim bir resmi, başka bir insan beğenmeyebilir. Bu yüzden sanatı tanımlamak ve bu işin içinden çıkmak çok karmaşık bir şeydir. Programcılığın da bir sanat olarak algılanıp, savunulması bu açıdan baktığımızda anlaşılabilir bir durumdur. </p>
<p>Bir sanat ya da sanat eseri ruha, göze ve gönüle hitap eder. Sanatın doğasında soyutluk vardır ve insanın kendisine özgün yorumuna ihtiyaç duyar. Bu yüzden herkesin sanatı algılayış tarzı değişiktir. Herkes sanatı kendi tarzında yorumlar. Eğer yazılan bir program parçası bir sanat eseri olmuş olsaydı, o zaman bu programa bakan herkes başka bir şey algılayacaktı ya da ondan kendi yorumladığı bir davranış biçimi bekleyecekti. Böyle bir şeyin yazılımda ne anlama geldiğini düşünebiliyor musunuz? Programcılık deterministik sonuçlar üretmek, mantık çerçevesinde kalıp, çözüm sunmak zorundadır. Ruha, gönüle değil, mantığa hitap eder. Sadece bu özelliğinden dolayı bile bir sanat olma şansı yoktur. Kim bir programa bakarsa baksın, aynı davranış biçimini görür, görmek zorundadır. Bir program her zaman aynı sonucu üretmek zorundadır, kod nasıl yazılmış olursa olsun. İnsanların yorumuna ihtiyacı yoktur, çünkü herkes aynı şeyi görür, daha dogrusu görmek zorundadır.</p>
<p>Programlar ihtiyaçtan doğarlar. Aynı şeyi sanat eserleri için söylemek mümkün değildir. Sanatkar bir şeylerden esinlenerek sanatını icra eder, zorda kalmadan, birilerine sanatını nasıl icra etmesi gerektiğini danışmadan. Programlar müşterileri tarafından kendi gereksinimlerini tatmin etmek için sipariş edilir. Müşterinin gereksinimleri programı yoğururken ön plandadır.  Programı oluşturulurken müşteri ile iletişim esastır. Onun istediği olur.</p>
<p>Bunu yanısıra programcının kod yazarken soyutluğu ifade etmek için çok fazla seçenegi yoktur. Java dilinde interface ya da abstract sınıfları kullanarak soyut bir şeyler ifade edebilebilir. Bu ressamın paletinde sadece bir, iki renk olduğu anlamına gelir. Sadece iki rengi kullanarak sanat eseri oluşturmak mümkün müdür? Belki! Bir ressamın paletinde onlarca renk vardır, bunları karıştırarak sonsuz sayıda yeni renk elde edebilir. Bu renklerin hepsini kullanma potansiyeline sahiptir ve bu sanatına yansır. Günümüzün programlama dillerinde böyle bir zenginlik söz konusu değildir. Kaldı ki en tabana indiğimizde bir programcı sıfır ve birlerden oluşan verilerden başka bir şeyle ugraşmaz. Sadece iki renkli olan bir dünyada yaşar ve bir takım verileri A’dan B’ye taşıyacak programlar yazar. İşin hepi, topu budur.</p>
<p>Günümüzde nesneye yönetlik programlama paradigması popülerdir. Ne olduğuna baktığımızda programcı olarak işimizi yapabilmemiz için çok kısıtlı sayıda araç ihtiva ettiğini görmekteyiz. Gerçek dünyayı modellemek için sınıfları, bu modellere hareket kabiliyeti verebilmek icin metotları kullanırız. Koca dünyayı modellemek için sadece bu iki aracı kullanabiliyoruz. Kod yazarken yapmak istediklerimizi ifade etmek için if ya da while gibi basit komutları kullanıyoruz. Kullanabileceğimiz başka ne var ki? Bu araçlardan faydalanıp nasıl bir sanat eseri ortaya koyabiliriz? Bu bir sanat eseri olsa bile fonksiyonel işlevi haricinde nesi kimi ilgilendirir?</p>
<p>Görüldügü gibi programcı sahip olduğu araçlar itibari ile çok kısıtlı bir dünyada yaşamaktadır. Oysaki bir sanatçının dünyası rengarenk ve pırıl pırıldır. Sayısız derecede kombinasyon imkanları vardır. Bunlardan faydalanarak sanatını icra eder ve sanat eserleri oluşturur. Biz programcılar sıkışıp kaldığımız mantıksal dünyada bu araç gerece ve lükse sahip degiliz.</p>
<p>Kanımca programcılıkta kreatif olma, sanat icrası ile karıştırılmaktadır. Programcılar kreatiftir. Devamlı karşılaştıkları sorunları aşmak için çözümler üretirler. Bunun için bir zanaatkar usta gibi bir takım alet, edevata ihtiyaç duyarlar. Usta programcılar örneğin tüm <a href="http://www.kurumsaljava.com/yazilim-metotlari/yazilim-mimarisi/" target=_blank>tasarım prensiplerine</a> hakımdirler. Nerede hangi <a href="http://www.kurumsaljava.com/yazilim-metotlari/tasarim-sablonlari/" target=_blank>tasarım şablonunu</a> kullanmaları gerektiğini bilirler. Az ve öz kod yazmayı yeğlerler. Yazdıkları kod roman gibi okunur, kod okundukça bir hikaye gibi kendisini anlatır. Burada bir tutam estetiklik yok değildir. Ama yinede bu aktivitelerin hiçbirisi bir sanat eseri ortaya koymaz.</p>
<p>Programcılık mantık işidir. <strong>Biz programcılar mantığın kölesiyiz</strong>. Programcılıkta bütün gidişati mantık yönetir. Mantığın bittiği yerde programcılık biter. Bir sanatçı hiçbir şeyin kölesi değildir. Aradaki fark budur. Mantıkla sanatı kavramaya çalışmak beyhude bir iştir.</p>
<p><em><br />
EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F14%2Fmantigin-koleleri-2%2F&amp;linkname=Mant%C4%B1%C4%9F%C4%B1n%20K%C3%B6leleri"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/14/mantigin-koleleri-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java Heap Nedir?</title>
		<link>http://www.kurumsaljava.com/2012/05/12/java-heap/</link>
		<comments>http://www.kurumsaljava.com/2012/05/12/java-heap/#comments</comments>
		<pubDate>Sat, 12 May 2012 17:27:40 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[BT Sözlüğü]]></category>
		<category><![CDATA[java heap]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2104</guid>
		<description><![CDATA[<p>Herhangi bir Java sınıfından new operatörü ile bir nesne oluşturulduğunda, bu nesnenin bilgisayarın hafızasında konuşlandırıldığı alana <strong>Java Heap</strong> adı verilir.</p>
<p><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg"></p>
<p><span id="more-2104"></span></p>
<p>Java Heap <a href="http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/" target=_blank>JVM</a> tarafından oluşturulur ve aşağıdaki hafıza alanlarından oluşur:</p>
<ul>
<li>Eden &#8211; new operatörü ile oluşturulan tüm nesneler önce bu hafıza alanında oluşturulur.</li>
<li>Survivor &#8211; nesneler old heap hafıza alanına transfer edilmeden önce bir müddet survivor hafıza alanlarında kalır. Buradaki amaç kısa ömürlü olan nesnelerin Garbage Collector tarafından toplanmasına ve old heap alanına geçmelerini engellemektir.</li>
<li>Old &#8211; uzun ömürlü  nesnelerin ölene kadar kaldıkları hazıfa alanıdır.</li>
<li>Permanent &#8211; sınıfların ve statik değerlerin yer aldığı hazıfa alanıdir.</li>
</ul>
<p>Yukarda yer alan resime baktığımızda JVM tarafından yönetilen hafıza alanının (Java Heap) toplamda 5 GB olduğunu, bunun 1 GB’lik gibi bir kısmının EDEN Heap space, 150 MB’sinin iki SURVIVOR Heap Space ve 4 GB’sinin OLD Heap space tarafından kullanıldığını görmekteyiz. Toplamda JVM’in yönettiği ve içinde Java nesneleri oluşturabileceğimiz alan 5 GB büyüklüktedir.</p>
]]></description>
			<content:encoded><![CDATA[<p>Herhangi bir Java sınıfından new operatörü ile bir nesne oluşturulduğunda, bu nesnenin bilgisayarın hafızasında konuşlandırıldığı alana <strong>Java Heap</strong> adı verilir.</p>
<p><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg"></p>
<p><span id="more-2104"></span></p>
<p>Java Heap <a href="http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/" target=_blank>JVM</a> tarafından oluşturulur ve aşağıdaki hafıza alanlarından oluşur:</p>
<ul>
<li>Eden &#8211; new operatörü ile oluşturulan tüm nesneler önce bu hafıza alanında oluşturulur.</li>
<li>Survivor &#8211; nesneler old heap hafıza alanına transfer edilmeden önce bir müddet survivor hafıza alanlarında kalır. Buradaki amaç kısa ömürlü olan nesnelerin Garbage Collector tarafından toplanmasına ve old heap alanına geçmelerini engellemektir.</li>
<li>Old &#8211; uzun ömürlü  nesnelerin ölene kadar kaldıkları hazıfa alanıdır.</li>
<li>Permanent &#8211; sınıfların ve statik değerlerin yer aldığı hazıfa alanıdir.</li>
</ul>
<p>Yukarda yer alan resime baktığımızda JVM tarafından yönetilen hafıza alanının (Java Heap) toplamda 5 GB olduğunu, bunun 1 GB’lik gibi bir kısmının EDEN Heap space, 150 MB’sinin iki SURVIVOR Heap Space ve 4 GB’sinin OLD Heap space tarafından kullanıldığını görmekteyiz. Toplamda JVM’in yönettiği ve içinde Java nesneleri oluşturabileceğimiz alan 5 GB büyüklüktedir.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F12%2Fjava-heap%2F&amp;linkname=Java%20Heap%20Nedir%3F"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/12/java-heap/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JVM (Java Virtual Machine) Nedir?</title>
		<link>http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/</link>
		<comments>http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/#comments</comments>
		<pubDate>Sat, 12 May 2012 17:18:52 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[BT Sözlüğü]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2102</guid>
		<description><![CDATA[<p>JVM (Java Virtual Machine &#8211; Java Sanal İşlemcisi)  C++ dilinde yazılmış bir programdır. Bir Java programı javac.exe ile derlendikten sonra byte code ismi verilen bir ara sürüm oluşur. Byte code, ana işlem biriminin (CPU – Cental Processing Unit) anlayacağı cinsten komutlar ihtiva etmez, yani klasik Assembler değildir. Java byte code sadece JVM bünyesinde çalışır. JVM, derlenen Java programı için ana işlemci birimi olma görevini üstlenir. Bu özelliginden dolayı Java programlarını değişik platformlar üzerinde çalıştırmak mümkündür. Her platform için bir JVM sürümü Java programlarını koşturmak için yeterli olacaktır. Bu sebepten dolayı Java “write once, run anywhere – bir kere yaz, her yerde koştur” ünvanına sahiptir. </p>
<p><span id="more-2102"></span></p>
<p>JVM hakkında daha geniş kapsamlı bilgiyi <a href="http://www.kurumsaljava.com/2012/05/12/matrixde-yasayan-programcilar/">Matrix’de Yaşayan Programcılar</a> başlıklı yazımda bulabilirsiniz.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>JVM (Java Virtual Machine &#8211; Java Sanal İşlemcisi)  C++ dilinde yazılmış bir programdır. Bir Java programı javac.exe ile derlendikten sonra byte code ismi verilen bir ara sürüm oluşur. Byte code, ana işlem biriminin (CPU – Cental Processing Unit) anlayacağı cinsten komutlar ihtiva etmez, yani klasik Assembler değildir. Java byte code sadece JVM bünyesinde çalışır. JVM, derlenen Java programı için ana işlemci birimi olma görevini üstlenir. Bu özelliginden dolayı Java programlarını değişik platformlar üzerinde çalıştırmak mümkündür. Her platform için bir JVM sürümü Java programlarını koşturmak için yeterli olacaktır. Bu sebepten dolayı Java “write once, run anywhere – bir kere yaz, her yerde koştur” ünvanına sahiptir. </p>
<p><span id="more-2102"></span></p>
<p>JVM hakkında daha geniş kapsamlı bilgiyi <a href="http://www.kurumsaljava.com/2012/05/12/matrixde-yasayan-programcilar/">Matrix’de Yaşayan Programcılar</a> başlıklı yazımda bulabilirsiniz.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F12%2Fjvm-java-virtual-machine%2F&amp;linkname=JVM%20%28Java%20Virtual%20Machine%29%20Nedir%3F"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/12/jvm-java-virtual-machine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Matrix’de Yaşayan Programcılar</title>
		<link>http://www.kurumsaljava.com/2012/05/12/matrixde-yasayan-programcilar/</link>
		<comments>http://www.kurumsaljava.com/2012/05/12/matrixde-yasayan-programcilar/#comments</comments>
		<pubDate>Sat, 12 May 2012 11:52:29 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Proje Günlüğü]]></category>
		<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[process heap]]></category>
		<category><![CDATA[programcılık]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2059</guid>
		<description><![CDATA[<p>Hemen hemen her programcının Matrix filmini seyrettiğini düşünüyorum. Star Wars gibi Matrix filmi de biz yazılımcılar için bir kült. Biraz abartı da olsa fikir olarak çok enteresan, en azından bir yazılımcı için. Matrix&#8217;de kullanılan yazılım sistemi dikkat çekiyor. En çok ilgimi çeken dejavü olarak isimlendirilen yazılım hataları (bug) ve Neo&#8217;nun bir tren istasyonunda hapis kalması ve trene binmesine rağmen tekrar tekrar aynı istasyona geri dönmesi, yani bir nevi for döngüsü olmuştur. Bir for döngüsünün bu kadar güzel görselleştirilmesi beni çok etkilemişti. Böyle bir sistemin entegrasyon testleri nasıl yapılıyor acaba?<span id="more-2059"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/matrix07.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/matrix07.jpg" alt="" title="matrix07" width="495" height="266" class="aligncenter size-full wp-image-2097" /></a></p>
<p>Gelelim gerçek hayattaki Matrix&#8217;e. Java ile program yazan programcılar da yazdıkları programlar gibi bir Matrix içinde yaşarlar. Bu dünyanın ismi <em>JVM &#8211; Java Virtual Machine </em>yani <em>Java Sanal İşlemcisi</em>&#8216;dir. JVM C++ dilinde yazılmış bir programdır. Bir Java programı <em>javac.exe</em> ile derlendikten sonra <em>byte code</em> ismi verilen bir ara sürüm oluşur. <em>Byte code</em>, ana işlem biriminin (<em>CPU &#8211; Cental Processing Unit</em>) anlayacağı cinsten komutlar ihtiva etmez, yani klasik Assembler değildir. Java byte code sadece JVM bünyesinde çalışır. JVM, derlenen Java programı için ana işlemci birimi olma görevini üstlenir. Bu özelliginden dolayı Java programlarını değişik platformlar üzerinde çalıştırmak mümkündür. Her platform için bir JVM sürümü Java programlarını koşturmak için yeterli olacaktır. Bu sebepten dolayı Java &#8220;<em>write once, run anywhere &#8211; bir kere yaz, her yerde koştur</em>&#8221; ünvanına sahiptir. </p>
<p>Java programları <em>java.exe</em> komutu kullanılarak koşturulur. java.exe işletim sistemi bünyesinde bir JVM meydana getirir yani Matrix&#8217;i oluşturur. Bu Matrix Java programının yaşaması için gerekli ortamı ihtiva eder. Sıra dışı olmayan Java programları bu Matrix içinde dış dünya ile ilişkileri kesik bir şekilde yaşayıp giderler. Onların ihtiyaç duyduğu herşeyi Matrix onlara sunar. Java programları hangi işletim sistemi ya da hangi donanım üzerinde koştuklarını bile zorda kalmadıkça bilmezler. Onlar için her donanım üzerinde bir integer 4 byte yani 32 bittir. Bu sebepten dolayı Java&#8217;da C/C++ dan tanıdığımız unsigned int bulunmaz. İnteger hangi donanım olursa olsun 32 bittir, işletim sistemi ya da donanıma göre değişmez. Bu Java dilini tasarlayan mühendislerin Java programcılarının hayatını kolaylaştirmak için aldıkları bir tasarım kararıdır. Bir Java programının gördüğü alt yapı her zaman aynıdır. Java programcıları bunu bildikleri için Matrix haricinde olup bitenlere pek önem vermeden kodlarını yazarlar ve Matrix içinde yaşamaya devam ederler, <strong>taki Morpheus gelip programcıya mavi ve kırmızı hapları taktim edene kadar</strong>.</p>
<p>Klasik kurumsal Java projelerinde çalışan Java programcısı Matrix&#8217;in dışında olup bitenlerle ilgilenmez. JVM ona ihtiyaç duyduğu herşeyi sağlar. O yüzden programcının tercihi mavi hap ve Matrix içinde yaşamaya devam etmek olur.</p>
<p>Java sadece kurumsal projeler için kullanılmaz. Sıra dışı projelerde de Java&#8217;ya rastlamak mümkündür. Şu an çalıştığım proje bunun en iyi örneklerinden birisidir. Navteq/Nokia firmasının GeoCoder (<a href="http://maps.nokia.com" target=_blank>http://maps.nokia.com</a>) isminde, harita üzerinde lokasyon arama yapan bir servisi bulunmaktadır. Bu servis aynı zamanda Bing ve Yahoo tarafından kullanılmaktadır. Kısa bir zaman sonra Facebook tarafından kullanılma planları yapılmaktadır. Ben lokasyon arama işlemlerinin programlandığı ekipte çalışıyorum. Bu gibi projelerde <strong>Morpheus&#8217;un verdiği kırmızı hapı yutup</strong>, Matrix&#8217;in dışına çıkmak gerekiyor, aksi taktirde Matrix, yani JVM içinde kalarak uygulamanın tabiyatındaki sıra dışılığı anlamak ve kodlamak mümkün değildir. Bu sıra dışılık programcıyı çok daha değişik kategorilerde düşünmeye ve değişik disiplinlerde çalışmaya zorlamaktadır.</p>
<p>Nokia&#8217;nin lokasyon arama servisi için dünya çapında altı değişik hosting lokasyonunda 300 den fazla VM (virtual Machine &#8211; sanal sunucu) kullanılıyor. Aşağıdaki resimde de görüldüğü gibi her JVM işletim sistemi bünyesinde 40 GB&#8217;den daha fazla yer kaplıyor. Neden JVM için bu kadar büyük bir hafıza alanının kullanıldığını anlamak için, uygulamanın tabiyatını anlamak gerekiyor.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/11.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/11.jpg" alt="" title="11" width="600" height="358" class="aligncenter size-full wp-image-2060" /></a></p>
<p>Yukarıda yer alan resimde işletim sistemi (RedHat Linux) JVM için yeni bir işlem (process) oluşturmuştur. Bu işlemin işletim sistemi bünyesindeki  hafıza büyüklüğü toplamda (<strong>VIRT</strong> &#8211; Virtual &#8211; sanal) 44GB&#8217;dir. JVM için kullanılan hafıza (Heap size) 5 GB&#8217;dir. Heap ayarı -Xmx5g ile yapılmaktadır. Peki geriye kalan 39 GB neyin nesidir? Bunu anlamak için Matrix&#8217;in dışına çıkmamız gerekiyor, çünkü geriye kalan 39 GB Matrix&#8217;in dışında olup bitenleri temsil etmektedir.</p>
<p>Lokasyon arama servisi için klasik veri tabanı sistemi kullanıl<strong>ma</strong>maktadır. Klasik bir veri tabanı sisteminin kullanılması ve lokasyon arama işlemlerinin bu veri tabanı üzerinden yapılması arama süresini dakikalara çıkarabilir. Arama sonuçlarının 100 ms (100 milisecond bir saniyenin onda biridir) gibi bir zaman diliminde oluşturulması şartı bu projede klasik veri tabanlarının aksine bir tercihi zorunlu kılmıştır. Veri tabanından çekilen verilerle dosya tabanlı yeni bir veri tabanı oluşturulmakta ve bu dosyalar onlarca GB büyüklükte olabilmektedir. Bu veri tabanında bulunan verilere index dosyaları üzerinden erişilmektedir. Örneğin kullanıcı İstanbul Kadıköy lokasyonunu aradığında, arama işlemi önce index dosyasında yapılmaktadır. İndex dosyasında İstabul Kadıköy için bir veri bulunduğunda, bu veri adres nesnesinin dosya veri tabanındaki gerçek adresini (storage id) ihtiva etmektedir. Bu şekilde index üzerinden dosya veri tabanındaki adres nesnesine ulaşmak mümkün olmaktadır. Arama işlemlerinin hızlı yapılabilmesi için bu index ve diğer veri tabanı dosyalarının topluca hazıfaya yüklenmesi gerekmektedir. Aksi taktirde arama işlemleri çok uzun sürebilmektedir, çünkü arama esnasında hafızada yüklü olmayan bir adres nesnesi bulundu ise, bu nesnenin disk üzerinde bulunan veri tabanı dosyalarından yüklenmesi gerekmektedir. Bu gibi IO (Input/Output) işlemleri zaman aldığı için, genel olarak arama işlemi bu gibi durumlarda uzamaktadır. Bunun önüne geçmek için tüm dosyaların hafızaya yüklenmesi gerekmektedir. Bu işlemi yapmak için de<em> Java Memory Mapped Files</em> yapıları kullanılmaktadır.</p>
<p><strong><i>-bash-3.2$ pmap PID</i></strong> komutunu girdiğimizde 39 GB alanın ne için kullanıldığını görebiliyoruz.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/22.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/22.jpg" alt="" title="22" width="600" height="358" class="aligncenter size-full wp-image-2061" /></a></p>
<p>Yukarıda yer alan resimde görüldüğü gibi uygulama bünyesinde kullanılan tüm dosyalar işletim sistemi tarafından oluşturulan işleme (process) dahil edişmiştir. Bu dosyalara Java terminolojisinde <em>Memory Mapped Files</em> (hazıfada yüklü dosyalar) ismi verilmektedir. Yüksek performansın önemli olduğu durumlarda bu dosyaların %100 hafızaya yüklenmiş olmaları büyük önem taşımaktadır. Aksi taktirde dosyaların kullanılmak istendiğinde hafızada olmamaları performansı kötü etkilemektedir. Kullanılan hafıza alanının arkasında bir dosya yoksa yani bir memory mapped file kullanılmıyorsa, bu alanlar [ anon ] (anonim) olarak listede gözükmektedir.</p>
<p>Bizim örneğimizde ihtiyaç duyulan tüm dosyaların hepsinin %100 hafızaya yüklen<strong>me</strong>diğini görüyoruz. İlk resimde yer alan <strong>RES</strong> (resident &#8211; aktüel işgal edilen hazıfa alanı anlamnda) kolonuna göre JVM&#8217;in aslında 36 GB hafıza alanı işgal etmektedir. İşletim sistemi biz zorlamadıkça kullanılan tüm dosyaları %100 hafızaya yüklemez. Bu şekilde örneğin kullanılmayan fonsiyon kütüphanelerinin hafızada boş yere yer işgal etmesi engellenmiş olur.  Bunun yanısıra işletim sistemi her program tarafından kullanılan ortak fonksiyon kütüphanelerini sadece bir kez hazıya yükleyerek, bu dosyaların değişik işlemler (process) tarafından ortaklaşa kullanılmasını sağlar. Birinci resimde <strong>SHR</strong> (shared &#8211; ortaklaşa kullanılan hafıza alanı anlamında) kolonuna baktığımızda bu değerin 12 GB oldugunu görmekteyiz, yani başka programlarla paylaştığımız 12 GB büyüklügünde dosyalar işlemci hafızamıza (Java Process Heap) yüklenmış durumdadır.</p>
<p>Belirttigim gibi bu dosyalar 5 GB&#8217;lik Java Heap içinde yer alma<strong>ma</strong>ktadırlar. Bu dosyalar daha önce bahsettiğim 39 GB&#8217;lik hafaza alanında yer almaktadir. Bu hafıza alanına <strong>Java Process Heap</strong>, normal Java nesnelerinin yer aldığı alana ise <strong>Java Heap</strong> ismi verilmektedir.  Java Heap ve Java Process Heap bir araya geldiğinde 44 GB&#8217;lik, ilk resimde gördüğümüz Java işleminin tüm hafıza alanı ortaya çıkmaktadır. Java Process Heap alanı işletim sisteminden <em>malloc()</em> sistem fonksiyonu kullanılarak oluşturulan hafıza alanıdır. Java&#8217;da bu hafiza alanına genel olarak <strong>native memory</strong> ismi verilir. JNI (Java Native Interface) kullanılarak Java uygulamaları için native memory alanı oluşturmak ve kullanmak mümkündür.  Java içinde ise hafıza alanı <strong>new</strong> operatörünü kullanarak tedarik edilir. Bu hafıza alanı oluşturduğumuz nesne için direk Java Heap bünyesinden gelir ve tamamen JVM tarafından, daha doğrusu <em>Garbage Collector</em> (kullanılmayan nesnelere garbage ismi verilir) tarafından yönetilir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg" alt="" title="33" width="599" height="395" class="aligncenter size-full wp-image-2062" /></a></p>
<p>Yukarda yer alan resime baktığımızda JVM tarafından yönetilen hafıza alanının toplamda 5 GB olduğunu, bunun 1 GB&#8217;lik gibi bir kısmının <strong>EDEN</strong> Heap space, 150 MB&#8217;sinin iki <strong>SURVIVOR</strong> Heap Space  ve 4 GB&#8217;sinin <strong>OLD </strong>Heap space tarafından kullanıldığını görmekteyiz.  Toplamda JVM&#8217;in yönettiği ve içinde Java nesneleri oluşturabileceğimiz alan 5 GB büyüklüktedir.</p>
<p>Bahsettiğim index ya da veri tabanı dosyalarının normal heap içinde bulunmaları JVM&#8217;e fazladan yük getirmekte ve Garbage Collection işlemini uzatmaktadır. Bu tür dosyaları  normal Heap içinden Java Process Heap&#8217;e (native memory alanına) taşımak için <strong>ByteBuffer</strong> sınıfı kullanılmaktadır. <em>ByteBuffer.allocateDirect()</em> metodu ile en fazla 2 GB büyüklüğünge, Java Heap dışında hafıza alanı rezerve etmek mümkündür. Bu hafıza alanı Java Process Heap içinde yer alacaktır. <em>allocateDirect()</em> metoduna baktğımızda native hafıza rezervasyonu için<em> sun.misc.Unsafe</em> sınıfının <em>allocateMemory()</em> metodunun kullanıldığını görmekteyiz. Bu native olarak tanımlanmış ve C++ dilinde kodlanmış bir metotdur. Buradan da anlaşıldığı gibi Java bünyesinde bu sınıfı kullanmadan native memory rezervasyonu mümkün değildir. </p>
<p>JVM bünyesinde tüm hafıza otomatik olarak JVM ve Garbage Collector tarafindan yönetilir. Programcının bu konuda yapması gereken fazla birşey yoktur. Java Heap dışında işlem yapmak zorunda kalındığında durum farklıdır. <strong> Native hafıza alanını JVM bünyesindeki Garbage Collector yönetmez</strong>. Programcının C/C++ dillerinde olduğu gibi native hafıza alanını kendisi yönetmesi gerekir. Bu yüzden Morpheus&#8217;un verdiği kırmızı hapı yutup, Matrix&#8217;in dışına çıkması gerekir. Sadece Matrix&#8217;in dışında olan programcılar gerçekte olup bitenlerden haberdardırlar. </p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Hemen hemen her programcının Matrix filmini seyrettiğini düşünüyorum. Star Wars gibi Matrix filmi de biz yazılımcılar için bir kült. Biraz abartı da olsa fikir olarak çok enteresan, en azından bir yazılımcı için. Matrix&#8217;de kullanılan yazılım sistemi dikkat çekiyor. En çok ilgimi çeken dejavü olarak isimlendirilen yazılım hataları (bug) ve Neo&#8217;nun bir tren istasyonunda hapis kalması ve trene binmesine rağmen tekrar tekrar aynı istasyona geri dönmesi, yani bir nevi for döngüsü olmuştur. Bir for döngüsünün bu kadar güzel görselleştirilmesi beni çok etkilemişti. Böyle bir sistemin entegrasyon testleri nasıl yapılıyor acaba?<span id="more-2059"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/matrix07.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/matrix07.jpg" alt="" title="matrix07" width="495" height="266" class="aligncenter size-full wp-image-2097" /></a></p>
<p>Gelelim gerçek hayattaki Matrix&#8217;e. Java ile program yazan programcılar da yazdıkları programlar gibi bir Matrix içinde yaşarlar. Bu dünyanın ismi <em>JVM &#8211; Java Virtual Machine </em>yani <em>Java Sanal İşlemcisi</em>&#8216;dir. JVM C++ dilinde yazılmış bir programdır. Bir Java programı <em>javac.exe</em> ile derlendikten sonra <em>byte code</em> ismi verilen bir ara sürüm oluşur. <em>Byte code</em>, ana işlem biriminin (<em>CPU &#8211; Cental Processing Unit</em>) anlayacağı cinsten komutlar ihtiva etmez, yani klasik Assembler değildir. Java byte code sadece JVM bünyesinde çalışır. JVM, derlenen Java programı için ana işlemci birimi olma görevini üstlenir. Bu özelliginden dolayı Java programlarını değişik platformlar üzerinde çalıştırmak mümkündür. Her platform için bir JVM sürümü Java programlarını koşturmak için yeterli olacaktır. Bu sebepten dolayı Java &#8220;<em>write once, run anywhere &#8211; bir kere yaz, her yerde koştur</em>&#8221; ünvanına sahiptir. </p>
<p>Java programları <em>java.exe</em> komutu kullanılarak koşturulur. java.exe işletim sistemi bünyesinde bir JVM meydana getirir yani Matrix&#8217;i oluşturur. Bu Matrix Java programının yaşaması için gerekli ortamı ihtiva eder. Sıra dışı olmayan Java programları bu Matrix içinde dış dünya ile ilişkileri kesik bir şekilde yaşayıp giderler. Onların ihtiyaç duyduğu herşeyi Matrix onlara sunar. Java programları hangi işletim sistemi ya da hangi donanım üzerinde koştuklarını bile zorda kalmadıkça bilmezler. Onlar için her donanım üzerinde bir integer 4 byte yani 32 bittir. Bu sebepten dolayı Java&#8217;da C/C++ dan tanıdığımız unsigned int bulunmaz. İnteger hangi donanım olursa olsun 32 bittir, işletim sistemi ya da donanıma göre değişmez. Bu Java dilini tasarlayan mühendislerin Java programcılarının hayatını kolaylaştirmak için aldıkları bir tasarım kararıdır. Bir Java programının gördüğü alt yapı her zaman aynıdır. Java programcıları bunu bildikleri için Matrix haricinde olup bitenlere pek önem vermeden kodlarını yazarlar ve Matrix içinde yaşamaya devam ederler, <strong>taki Morpheus gelip programcıya mavi ve kırmızı hapları taktim edene kadar</strong>.</p>
<p>Klasik kurumsal Java projelerinde çalışan Java programcısı Matrix&#8217;in dışında olup bitenlerle ilgilenmez. JVM ona ihtiyaç duyduğu herşeyi sağlar. O yüzden programcının tercihi mavi hap ve Matrix içinde yaşamaya devam etmek olur.</p>
<p>Java sadece kurumsal projeler için kullanılmaz. Sıra dışı projelerde de Java&#8217;ya rastlamak mümkündür. Şu an çalıştığım proje bunun en iyi örneklerinden birisidir. Navteq/Nokia firmasının GeoCoder (<a href="http://maps.nokia.com" target=_blank>http://maps.nokia.com</a>) isminde, harita üzerinde lokasyon arama yapan bir servisi bulunmaktadır. Bu servis aynı zamanda Bing ve Yahoo tarafından kullanılmaktadır. Kısa bir zaman sonra Facebook tarafından kullanılma planları yapılmaktadır. Ben lokasyon arama işlemlerinin programlandığı ekipte çalışıyorum. Bu gibi projelerde <strong>Morpheus&#8217;un verdiği kırmızı hapı yutup</strong>, Matrix&#8217;in dışına çıkmak gerekiyor, aksi taktirde Matrix, yani JVM içinde kalarak uygulamanın tabiyatındaki sıra dışılığı anlamak ve kodlamak mümkün değildir. Bu sıra dışılık programcıyı çok daha değişik kategorilerde düşünmeye ve değişik disiplinlerde çalışmaya zorlamaktadır.</p>
<p>Nokia&#8217;nin lokasyon arama servisi için dünya çapında altı değişik hosting lokasyonunda 300 den fazla VM (virtual Machine &#8211; sanal sunucu) kullanılıyor. Aşağıdaki resimde de görüldüğü gibi her JVM işletim sistemi bünyesinde 40 GB&#8217;den daha fazla yer kaplıyor. Neden JVM için bu kadar büyük bir hafıza alanının kullanıldığını anlamak için, uygulamanın tabiyatını anlamak gerekiyor.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/11.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/11.jpg" alt="" title="11" width="600" height="358" class="aligncenter size-full wp-image-2060" /></a></p>
<p>Yukarıda yer alan resimde işletim sistemi (RedHat Linux) JVM için yeni bir işlem (process) oluşturmuştur. Bu işlemin işletim sistemi bünyesindeki  hafıza büyüklüğü toplamda (<strong>VIRT</strong> &#8211; Virtual &#8211; sanal) 44GB&#8217;dir. JVM için kullanılan hafıza (Heap size) 5 GB&#8217;dir. Heap ayarı -Xmx5g ile yapılmaktadır. Peki geriye kalan 39 GB neyin nesidir? Bunu anlamak için Matrix&#8217;in dışına çıkmamız gerekiyor, çünkü geriye kalan 39 GB Matrix&#8217;in dışında olup bitenleri temsil etmektedir.</p>
<p>Lokasyon arama servisi için klasik veri tabanı sistemi kullanıl<strong>ma</strong>maktadır. Klasik bir veri tabanı sisteminin kullanılması ve lokasyon arama işlemlerinin bu veri tabanı üzerinden yapılması arama süresini dakikalara çıkarabilir. Arama sonuçlarının 100 ms (100 milisecond bir saniyenin onda biridir) gibi bir zaman diliminde oluşturulması şartı bu projede klasik veri tabanlarının aksine bir tercihi zorunlu kılmıştır. Veri tabanından çekilen verilerle dosya tabanlı yeni bir veri tabanı oluşturulmakta ve bu dosyalar onlarca GB büyüklükte olabilmektedir. Bu veri tabanında bulunan verilere index dosyaları üzerinden erişilmektedir. Örneğin kullanıcı İstanbul Kadıköy lokasyonunu aradığında, arama işlemi önce index dosyasında yapılmaktadır. İndex dosyasında İstabul Kadıköy için bir veri bulunduğunda, bu veri adres nesnesinin dosya veri tabanındaki gerçek adresini (storage id) ihtiva etmektedir. Bu şekilde index üzerinden dosya veri tabanındaki adres nesnesine ulaşmak mümkün olmaktadır. Arama işlemlerinin hızlı yapılabilmesi için bu index ve diğer veri tabanı dosyalarının topluca hazıfaya yüklenmesi gerekmektedir. Aksi taktirde arama işlemleri çok uzun sürebilmektedir, çünkü arama esnasında hafızada yüklü olmayan bir adres nesnesi bulundu ise, bu nesnenin disk üzerinde bulunan veri tabanı dosyalarından yüklenmesi gerekmektedir. Bu gibi IO (Input/Output) işlemleri zaman aldığı için, genel olarak arama işlemi bu gibi durumlarda uzamaktadır. Bunun önüne geçmek için tüm dosyaların hafızaya yüklenmesi gerekmektedir. Bu işlemi yapmak için de<em> Java Memory Mapped Files</em> yapıları kullanılmaktadır.</p>
<p><strong><i>-bash-3.2$ pmap PID</i></strong> komutunu girdiğimizde 39 GB alanın ne için kullanıldığını görebiliyoruz.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/22.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/22.jpg" alt="" title="22" width="600" height="358" class="aligncenter size-full wp-image-2061" /></a></p>
<p>Yukarıda yer alan resimde görüldüğü gibi uygulama bünyesinde kullanılan tüm dosyalar işletim sistemi tarafından oluşturulan işleme (process) dahil edişmiştir. Bu dosyalara Java terminolojisinde <em>Memory Mapped Files</em> (hazıfada yüklü dosyalar) ismi verilmektedir. Yüksek performansın önemli olduğu durumlarda bu dosyaların %100 hafızaya yüklenmiş olmaları büyük önem taşımaktadır. Aksi taktirde dosyaların kullanılmak istendiğinde hafızada olmamaları performansı kötü etkilemektedir. Kullanılan hafıza alanının arkasında bir dosya yoksa yani bir memory mapped file kullanılmıyorsa, bu alanlar [ anon ] (anonim) olarak listede gözükmektedir.</p>
<p>Bizim örneğimizde ihtiyaç duyulan tüm dosyaların hepsinin %100 hafızaya yüklen<strong>me</strong>diğini görüyoruz. İlk resimde yer alan <strong>RES</strong> (resident &#8211; aktüel işgal edilen hazıfa alanı anlamnda) kolonuna göre JVM&#8217;in aslında 36 GB hafıza alanı işgal etmektedir. İşletim sistemi biz zorlamadıkça kullanılan tüm dosyaları %100 hafızaya yüklemez. Bu şekilde örneğin kullanılmayan fonsiyon kütüphanelerinin hafızada boş yere yer işgal etmesi engellenmiş olur.  Bunun yanısıra işletim sistemi her program tarafından kullanılan ortak fonksiyon kütüphanelerini sadece bir kez hazıya yükleyerek, bu dosyaların değişik işlemler (process) tarafından ortaklaşa kullanılmasını sağlar. Birinci resimde <strong>SHR</strong> (shared &#8211; ortaklaşa kullanılan hafıza alanı anlamında) kolonuna baktığımızda bu değerin 12 GB oldugunu görmekteyiz, yani başka programlarla paylaştığımız 12 GB büyüklügünde dosyalar işlemci hafızamıza (Java Process Heap) yüklenmış durumdadır.</p>
<p>Belirttigim gibi bu dosyalar 5 GB&#8217;lik Java Heap içinde yer alma<strong>ma</strong>ktadırlar. Bu dosyalar daha önce bahsettiğim 39 GB&#8217;lik hafaza alanında yer almaktadir. Bu hafıza alanına <strong>Java Process Heap</strong>, normal Java nesnelerinin yer aldığı alana ise <strong>Java Heap</strong> ismi verilmektedir.  Java Heap ve Java Process Heap bir araya geldiğinde 44 GB&#8217;lik, ilk resimde gördüğümüz Java işleminin tüm hafıza alanı ortaya çıkmaktadır. Java Process Heap alanı işletim sisteminden <em>malloc()</em> sistem fonksiyonu kullanılarak oluşturulan hafıza alanıdır. Java&#8217;da bu hafiza alanına genel olarak <strong>native memory</strong> ismi verilir. JNI (Java Native Interface) kullanılarak Java uygulamaları için native memory alanı oluşturmak ve kullanmak mümkündür.  Java içinde ise hafıza alanı <strong>new</strong> operatörünü kullanarak tedarik edilir. Bu hafıza alanı oluşturduğumuz nesne için direk Java Heap bünyesinden gelir ve tamamen JVM tarafından, daha doğrusu <em>Garbage Collector</em> (kullanılmayan nesnelere garbage ismi verilir) tarafından yönetilir.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/33.jpg" alt="" title="33" width="599" height="395" class="aligncenter size-full wp-image-2062" /></a></p>
<p>Yukarda yer alan resime baktığımızda JVM tarafından yönetilen hafıza alanının toplamda 5 GB olduğunu, bunun 1 GB&#8217;lik gibi bir kısmının <strong>EDEN</strong> Heap space, 150 MB&#8217;sinin iki <strong>SURVIVOR</strong> Heap Space  ve 4 GB&#8217;sinin <strong>OLD </strong>Heap space tarafından kullanıldığını görmekteyiz.  Toplamda JVM&#8217;in yönettiği ve içinde Java nesneleri oluşturabileceğimiz alan 5 GB büyüklüktedir.</p>
<p>Bahsettiğim index ya da veri tabanı dosyalarının normal heap içinde bulunmaları JVM&#8217;e fazladan yük getirmekte ve Garbage Collection işlemini uzatmaktadır. Bu tür dosyaları  normal Heap içinden Java Process Heap&#8217;e (native memory alanına) taşımak için <strong>ByteBuffer</strong> sınıfı kullanılmaktadır. <em>ByteBuffer.allocateDirect()</em> metodu ile en fazla 2 GB büyüklüğünge, Java Heap dışında hafıza alanı rezerve etmek mümkündür. Bu hafıza alanı Java Process Heap içinde yer alacaktır. <em>allocateDirect()</em> metoduna baktğımızda native hafıza rezervasyonu için<em> sun.misc.Unsafe</em> sınıfının <em>allocateMemory()</em> metodunun kullanıldığını görmekteyiz. Bu native olarak tanımlanmış ve C++ dilinde kodlanmış bir metotdur. Buradan da anlaşıldığı gibi Java bünyesinde bu sınıfı kullanmadan native memory rezervasyonu mümkün değildir. </p>
<p>JVM bünyesinde tüm hafıza otomatik olarak JVM ve Garbage Collector tarafindan yönetilir. Programcının bu konuda yapması gereken fazla birşey yoktur. Java Heap dışında işlem yapmak zorunda kalındığında durum farklıdır. <strong> Native hafıza alanını JVM bünyesindeki Garbage Collector yönetmez</strong>. Programcının C/C++ dillerinde olduğu gibi native hafıza alanını kendisi yönetmesi gerekir. Bu yüzden Morpheus&#8217;un verdiği kırmızı hapı yutup, Matrix&#8217;in dışına çıkması gerekir. Sadece Matrix&#8217;in dışında olan programcılar gerçekte olup bitenlerden haberdardırlar. </p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F12%2Fmatrixde-yasayan-programcilar%2F&amp;linkname=Matrix%26%238217%3Bde%20Ya%C5%9Fayan%20Programc%C4%B1lar"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/12/matrixde-yasayan-programcilar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Meğer Neymişiz!</title>
		<link>http://www.kurumsaljava.com/2012/05/10/meger-neymisiz/</link>
		<comments>http://www.kurumsaljava.com/2012/05/10/meger-neymisiz/#comments</comments>
		<pubDate>Thu, 10 May 2012 06:34:54 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>
		<category><![CDATA[programcı]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2042</guid>
		<description><![CDATA[<p>Bu sabah yanımda kocaman, Coca Cola pet sişeleri taşıyan TIR vari bir araç durup, yol soruyor. Sürücünün neden navigasyon aleti yok diye düşünürken, bu yazıyı yazma fikri oluşuyor kafamda.</p>
<p><span id="more-2042"></span></p>
<p>Şimdi birkaç saniyeliğine bir dünya hayal edelim; İçinde IPhone ve Android akıllı telefonların olduğu, ama app denen birşeyin bilinmediği, bilgisayarların olduğu, ama işletim sistemi diye birşeyin icat edilmediği, internetin olduğu, ama iletişim kurmak için e-posta ve web sunucularının olmadığı bir dünya&#8230; Bu dünyada eksik olan nedir? Evet, yazılım yapılmıyor bu dünyada. Yazılım sistemlerini kim yapıyor? Evet, biz programcılar. Yani? Bu dünyayı daha yaşanır hale getiren, oluşturdukları yazılım sistemleri ile devrim yaratan, insanlığa yön veren, insanlık tarihinde dünyanın ilk kez kocaman bir köy olmasını sağlayan ve insanlığa hizmet eden biz programcılarız. Ameliyat eden robotlardan tutun, uzaya gönderilen uydulardan, havada uçan uçakların kontrol sistemlerine hadar her yerde, içinde program çalışan birşeyler görmek mümkündür. Yazılım sistemleri modern insanın sürdürdüğü yaşam tarzının vazgeçilmez bir parçası haline gelmiştir.</p>
<p>Hacker&#8217;ları bunun dışında tutmak şartıyla oluşturduğumuz birçok yazılım sistemi doğrudan insanlığa hizmet etmektedir. Bunun en güzel örneğini açık kaynaklı yazılım sistemleri oluşturmaktadır. Onların başında da Linux işletim sistemi gelmektedir. Toplum yazılım sistemlerinin insanlık için önemini anlamış olmalı ki, yazılımcılara nişanlar verilmektedir.  Bunun bir örneğini geçtigimiz ay Linux işletim sisteminin mucidi Linus Torwald&#8217;e verilen <strong>Millennium Technology Prize 2012</strong> nişanı teskil etmektedir.</p>
<p>Ödülü veren akademi tarafından yapılan açıklamada Linus&#8217;un açık kaynaklı bir yazılım sistemi geliştirmesinin dağıtık yazılım sistemleri oluşturmaya ve internetin özgür olmasına katkıda bulunduğu belirtilmektedir. Linux işletim sistemi milyonlarca, belki de milyarlarca insan tarafından kullanılma potansiyeline sahiptir. Linus yaptığı açıklamada, yazılım sistemlerinin modern dünyada çok önemli olduklarını ve insanlığa hizmet edebillmeleri için mutlaka açık kaynaklı olmaları gerektiğinin altını çizmiştir.</p>
<p>Durum böyle iken biz programcıların üstlendiği toplumsal sorumluluk artmaktadır. Hatasız yazılım sistemleri oluşturmamız gerekmektedir. Birçok insan günlük hayatında kullandıkları yazılım sistemlerinin hatasız çalışmasına güvenmek zorundadır. Yazılım hatalarının meydana gelmesi  onların hata yapmasına sebep verebilmektedir.  Baştan savma yazılım sistemleri oluşturarak onların güvenini yitirmeyelim.</p>
<p>Bu arada TIR sürücüsüne &#8220;<em>navigasyon aygıtınız yok mu</em>&#8221; sorusunu sormadan edemedim. &#8220;<em>Var, ama çalışmıyor</em>&#8221; dedi. Bir yazılım hatasıymış sanırım ;-) Yazılımda daha iyi olmamız lazım. İnsanlar bize güveniyor.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Bu sabah yanımda kocaman, Coca Cola pet sişeleri taşıyan TIR vari bir araç durup, yol soruyor. Sürücünün neden navigasyon aleti yok diye düşünürken, bu yazıyı yazma fikri oluşuyor kafamda.</p>
<p><span id="more-2042"></span></p>
<p>Şimdi birkaç saniyeliğine bir dünya hayal edelim; İçinde IPhone ve Android akıllı telefonların olduğu, ama app denen birşeyin bilinmediği, bilgisayarların olduğu, ama işletim sistemi diye birşeyin icat edilmediği, internetin olduğu, ama iletişim kurmak için e-posta ve web sunucularının olmadığı bir dünya&#8230; Bu dünyada eksik olan nedir? Evet, yazılım yapılmıyor bu dünyada. Yazılım sistemlerini kim yapıyor? Evet, biz programcılar. Yani? Bu dünyayı daha yaşanır hale getiren, oluşturdukları yazılım sistemleri ile devrim yaratan, insanlığa yön veren, insanlık tarihinde dünyanın ilk kez kocaman bir köy olmasını sağlayan ve insanlığa hizmet eden biz programcılarız. Ameliyat eden robotlardan tutun, uzaya gönderilen uydulardan, havada uçan uçakların kontrol sistemlerine hadar her yerde, içinde program çalışan birşeyler görmek mümkündür. Yazılım sistemleri modern insanın sürdürdüğü yaşam tarzının vazgeçilmez bir parçası haline gelmiştir.</p>
<p>Hacker&#8217;ları bunun dışında tutmak şartıyla oluşturduğumuz birçok yazılım sistemi doğrudan insanlığa hizmet etmektedir. Bunun en güzel örneğini açık kaynaklı yazılım sistemleri oluşturmaktadır. Onların başında da Linux işletim sistemi gelmektedir. Toplum yazılım sistemlerinin insanlık için önemini anlamış olmalı ki, yazılımcılara nişanlar verilmektedir.  Bunun bir örneğini geçtigimiz ay Linux işletim sisteminin mucidi Linus Torwald&#8217;e verilen <strong>Millennium Technology Prize 2012</strong> nişanı teskil etmektedir.</p>
<p>Ödülü veren akademi tarafından yapılan açıklamada Linus&#8217;un açık kaynaklı bir yazılım sistemi geliştirmesinin dağıtık yazılım sistemleri oluşturmaya ve internetin özgür olmasına katkıda bulunduğu belirtilmektedir. Linux işletim sistemi milyonlarca, belki de milyarlarca insan tarafından kullanılma potansiyeline sahiptir. Linus yaptığı açıklamada, yazılım sistemlerinin modern dünyada çok önemli olduklarını ve insanlığa hizmet edebillmeleri için mutlaka açık kaynaklı olmaları gerektiğinin altını çizmiştir.</p>
<p>Durum böyle iken biz programcıların üstlendiği toplumsal sorumluluk artmaktadır. Hatasız yazılım sistemleri oluşturmamız gerekmektedir. Birçok insan günlük hayatında kullandıkları yazılım sistemlerinin hatasız çalışmasına güvenmek zorundadır. Yazılım hatalarının meydana gelmesi  onların hata yapmasına sebep verebilmektedir.  Baştan savma yazılım sistemleri oluşturarak onların güvenini yitirmeyelim.</p>
<p>Bu arada TIR sürücüsüne &#8220;<em>navigasyon aygıtınız yok mu</em>&#8221; sorusunu sormadan edemedim. &#8220;<em>Var, ama çalışmıyor</em>&#8221; dedi. Bir yazılım hatasıymış sanırım ;-) Yazılımda daha iyi olmamız lazım. İnsanlar bize güveniyor.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F10%2Fmeger-neymisiz%2F&amp;linkname=Me%C4%9Fer%20Neymi%C5%9Fiz%21"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/10/meger-neymisiz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programcıyım, Yönetici Değil!</title>
		<link>http://www.kurumsaljava.com/2012/05/08/programciyim-yonetici-degil/</link>
		<comments>http://www.kurumsaljava.com/2012/05/08/programciyim-yonetici-degil/#comments</comments>
		<pubDate>Tue, 08 May 2012 16:15:13 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>
		<category><![CDATA[programcı]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2024</guid>
		<description><![CDATA[<p>Türkiye’de genç programcı adaylarının kariyer planlaması şu şekilde:<br />
 Üniversite »» Birkaç yıl programcılık »» Proje yöneticiliği »» Bölüm yöneticiliği »» Bölüm müdürlüğü</p>
<p><span id="more-2024"></span></p>
<p>Benim kariyer planlamam şöyle:<br />
Üniversite »» Ömür boyu programcılık<br />
<strong><br />
Ben programcıyım, yönetici değilim!</strong> Üniversitede eğitimini almadığım birşey nasıl olabilirim? Neden programcıların çoğu bir yerlere yönetici ya da müdür olmak istiyor? Bunun açıklaması kolay: daha fazla maaş alacaklarını düşündükleri ya da pozisyon itibariyle daha fazla dikkate alınmak istedikleri için.</p>
<p>Herşeyin statü sembolleri ile ölçüldüğü bir toplumda programcıların daha fazla para kazanmak için yönetici olma sevdalarını ayıplamıyorum. Bu sadece programcılar için geçerli bir durum değil. Benim ayıpladığım programcının bu uğurda ruhunu satmasıdır. Eğer bir insan programcı oldu ise, bu işe gönül verdiği için olmuştur. Mecburiyetten olan programcı zaten programcı sayılmaz. Eğer yaptığı işi sevmiyorsa, bırakıp başka bir iş yapması mübahtır. Aldığı para kendisini tatmin etmiyorsa, benim kişisel olarak yapabileceğim birşey yok (ama daha fazla nasıl kazanabileceğine daha sonra değineceğim). Ama bu işin birde manevi tarafı yok mu? Haz alarak yaptığı bir iş insanı mutlu etmez mi? Neden daha fazla maaş, insanı mutlu eden bir işe tercih edilir ki? Bunu anlamam çok zor.</p>
<p>Yöneticilik ya da müdürlük öyle her babayiğidin harcı değildir. Yönetici olmak isteyen programcılar bunu bilmiyor galiba. Bu işin bir defa eğitimini almak gerekir. Yönetim kademesindeki insanların liderlik, çalışanlara örnek olma, onları motive etme, güçlü iletişim gibi vasıflara ihtiyacı vardır. Çok ağır şartlarda çalışıp, neticesi geniş kapsamlı kararlar vermek zorunda kalırlar. Üstlerinde büyük sorumluluk taşırlar. Daha fazla maaşı hak ederler, ama bedelini de öderler.</p>
<p>Saydığım bu sebeplerden dolayı yöneticiliğe talip değilim. Ben bu işten anlamam. Ben bildiğim işi yapmayı yeğlerim. Programcıyken, yöneticiliğe soyunanlara da kazaları mübarek olsun derim.</p>
<h2>Programcılar Yönetici Olmaya Zorlanıyor</h2>
<p>Ömür boyu programcı olarak çalışmak isteyenler de yok değil. Nedendir bilmiyorum ama Türkiye’de „<em>insan kırk yaşından sonra programcı olarak çalışmaz</em>“ kanısı oluşmuş. Yaşlı programcılara kötü gözle bakıldığı bir toplum içinde yaşıyoruz. Hala bir baltaya sap olamamış ve programcılık yapıyor denilebiliyor. Aman allahım, inanılacak gibi değil!</p>
<p>Bu şartlar altında programcıların üzerinde yönetici olma doğrultusunda baskı oluşmuyor değil. Lakin bu baskıya karşı koyup, programcının programcı olarak yoluna devam etmesi şarttır. Programcının gönlünde yatan aslan bellidir. Programcılar kendi kariyer planlamalarını kendileri yapmalı, başkalarının buna müdahele etmesine karşı koymalıdırlar. Müdahele olduğunda buna baş kaldırıp, dik durmalı ve statükolarını korumalıdırlar. Yoksa sonuç bellidir: yaptığı işten memnun olmayan bir sürü eski programcı yönetici.</p>
<p>Bunun yanısıra birde firmalardaki kariyer yapma imkanlarına göz attığımızda, çoğu programcıya yönetici olmaktan başka seçenek kalmadığını görmekteyiz. Avrupa ve Amerika&#8217;da durum çok farklıdır. Büyük yazılım firmalarına baktığımızda, ömür boyu mühendis kalınabildiği, bu konuda uzmanlaşma imkanı veren kariyer patikalarının olduğunu görmekteyiz. Bunun bir örneğini IBM&#8217;in çalışanlarına sunduğu <strong>Distinguished Engineer</strong> olma imkanı teşkil etmektedir.</p>
<h2>Programcılar Mutlu Değil</h2>
<p>Programcılar ne yazık ki yaptıkları işten memnun ve mutlu değiller. Devamlı günü kurtarmaya çalışmak, verilen emeğe ilgi ve saygının olmaması, fazla mesai yapmaya zorlamalar programcının içindeki şevki kırabilir. Ama bir programcı yöneticiliğe upgrade yaptığında durum farklı mı olacaktır? Pek zannetmiyorum.  Öyleyse gönül verdiğimiz işi yapacak şekilde ortam hazırlamaya bakalım.</p>
<h2>Programcılar İşsiz Kalmaz</h2>
<p>Programcılar şarap gibidir. Kendilerini geliştirmeleri, ustalaşmaları şartıyla yaşlandıkça kıymetlenirler. Yetkin bir programcının piyasada işsiz kalması imkansızdır. Herhangi bir işi yapan bir yöneticinin işsiz kalma ya da işten çıkarılma rizikosu yetkin bir programcıdan çok daha yüksektir. Yetkin bir programcıyı kolay kolay kimse işten çıkartamaz. Geliştirdiği uygulama hakkında o kadar çok bilgiye sahiptir ki yeri kolay kolay doldurulamaz. Yetkin programcılar piyasada freelancer olarak çalışıp, maaşlarının birkaç katı fazlasını kazanabilirler. </p>
<p>Bu kadar uzman progragramcının arandığı bir piyasada kim ne yapsın yöneticiliği. Programcılık güzel ve geleceği olan bir meslektir. Kıymetini bilelim.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Türkiye’de genç programcı adaylarının kariyer planlaması şu şekilde:<br />
 Üniversite »» Birkaç yıl programcılık »» Proje yöneticiliği »» Bölüm yöneticiliği »» Bölüm müdürlüğü</p>
<p><span id="more-2024"></span></p>
<p>Benim kariyer planlamam şöyle:<br />
Üniversite »» Ömür boyu programcılık<br />
<strong><br />
Ben programcıyım, yönetici değilim!</strong> Üniversitede eğitimini almadığım birşey nasıl olabilirim? Neden programcıların çoğu bir yerlere yönetici ya da müdür olmak istiyor? Bunun açıklaması kolay: daha fazla maaş alacaklarını düşündükleri ya da pozisyon itibariyle daha fazla dikkate alınmak istedikleri için.</p>
<p>Herşeyin statü sembolleri ile ölçüldüğü bir toplumda programcıların daha fazla para kazanmak için yönetici olma sevdalarını ayıplamıyorum. Bu sadece programcılar için geçerli bir durum değil. Benim ayıpladığım programcının bu uğurda ruhunu satmasıdır. Eğer bir insan programcı oldu ise, bu işe gönül verdiği için olmuştur. Mecburiyetten olan programcı zaten programcı sayılmaz. Eğer yaptığı işi sevmiyorsa, bırakıp başka bir iş yapması mübahtır. Aldığı para kendisini tatmin etmiyorsa, benim kişisel olarak yapabileceğim birşey yok (ama daha fazla nasıl kazanabileceğine daha sonra değineceğim). Ama bu işin birde manevi tarafı yok mu? Haz alarak yaptığı bir iş insanı mutlu etmez mi? Neden daha fazla maaş, insanı mutlu eden bir işe tercih edilir ki? Bunu anlamam çok zor.</p>
<p>Yöneticilik ya da müdürlük öyle her babayiğidin harcı değildir. Yönetici olmak isteyen programcılar bunu bilmiyor galiba. Bu işin bir defa eğitimini almak gerekir. Yönetim kademesindeki insanların liderlik, çalışanlara örnek olma, onları motive etme, güçlü iletişim gibi vasıflara ihtiyacı vardır. Çok ağır şartlarda çalışıp, neticesi geniş kapsamlı kararlar vermek zorunda kalırlar. Üstlerinde büyük sorumluluk taşırlar. Daha fazla maaşı hak ederler, ama bedelini de öderler.</p>
<p>Saydığım bu sebeplerden dolayı yöneticiliğe talip değilim. Ben bu işten anlamam. Ben bildiğim işi yapmayı yeğlerim. Programcıyken, yöneticiliğe soyunanlara da kazaları mübarek olsun derim.</p>
<h2>Programcılar Yönetici Olmaya Zorlanıyor</h2>
<p>Ömür boyu programcı olarak çalışmak isteyenler de yok değil. Nedendir bilmiyorum ama Türkiye’de „<em>insan kırk yaşından sonra programcı olarak çalışmaz</em>“ kanısı oluşmuş. Yaşlı programcılara kötü gözle bakıldığı bir toplum içinde yaşıyoruz. Hala bir baltaya sap olamamış ve programcılık yapıyor denilebiliyor. Aman allahım, inanılacak gibi değil!</p>
<p>Bu şartlar altında programcıların üzerinde yönetici olma doğrultusunda baskı oluşmuyor değil. Lakin bu baskıya karşı koyup, programcının programcı olarak yoluna devam etmesi şarttır. Programcının gönlünde yatan aslan bellidir. Programcılar kendi kariyer planlamalarını kendileri yapmalı, başkalarının buna müdahele etmesine karşı koymalıdırlar. Müdahele olduğunda buna baş kaldırıp, dik durmalı ve statükolarını korumalıdırlar. Yoksa sonuç bellidir: yaptığı işten memnun olmayan bir sürü eski programcı yönetici.</p>
<p>Bunun yanısıra birde firmalardaki kariyer yapma imkanlarına göz attığımızda, çoğu programcıya yönetici olmaktan başka seçenek kalmadığını görmekteyiz. Avrupa ve Amerika&#8217;da durum çok farklıdır. Büyük yazılım firmalarına baktığımızda, ömür boyu mühendis kalınabildiği, bu konuda uzmanlaşma imkanı veren kariyer patikalarının olduğunu görmekteyiz. Bunun bir örneğini IBM&#8217;in çalışanlarına sunduğu <strong>Distinguished Engineer</strong> olma imkanı teşkil etmektedir.</p>
<h2>Programcılar Mutlu Değil</h2>
<p>Programcılar ne yazık ki yaptıkları işten memnun ve mutlu değiller. Devamlı günü kurtarmaya çalışmak, verilen emeğe ilgi ve saygının olmaması, fazla mesai yapmaya zorlamalar programcının içindeki şevki kırabilir. Ama bir programcı yöneticiliğe upgrade yaptığında durum farklı mı olacaktır? Pek zannetmiyorum.  Öyleyse gönül verdiğimiz işi yapacak şekilde ortam hazırlamaya bakalım.</p>
<h2>Programcılar İşsiz Kalmaz</h2>
<p>Programcılar şarap gibidir. Kendilerini geliştirmeleri, ustalaşmaları şartıyla yaşlandıkça kıymetlenirler. Yetkin bir programcının piyasada işsiz kalması imkansızdır. Herhangi bir işi yapan bir yöneticinin işsiz kalma ya da işten çıkarılma rizikosu yetkin bir programcıdan çok daha yüksektir. Yetkin bir programcıyı kolay kolay kimse işten çıkartamaz. Geliştirdiği uygulama hakkında o kadar çok bilgiye sahiptir ki yeri kolay kolay doldurulamaz. Yetkin programcılar piyasada freelancer olarak çalışıp, maaşlarının birkaç katı fazlasını kazanabilirler. </p>
<p>Bu kadar uzman progragramcının arandığı bir piyasada kim ne yapsın yöneticiliği. Programcılık güzel ve geleceği olan bir meslektir. Kıymetini bilelim.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F08%2Fprogramciyim-yonetici-degil%2F&amp;linkname=Programc%C4%B1y%C4%B1m%2C%20Y%C3%B6netici%20De%C4%9Fil%21"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/08/programciyim-yonetici-degil/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Programcılık Sanat mı, Zanaat mı?</title>
		<link>http://www.kurumsaljava.com/2012/05/08/programcilik-sanat-mi-zanaat-mi/</link>
		<comments>http://www.kurumsaljava.com/2012/05/08/programcilik-sanat-mi-zanaat-mi/#comments</comments>
		<pubDate>Tue, 08 May 2012 06:12:42 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>
		<category><![CDATA[programcı]]></category>
		<category><![CDATA[programcılık]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=2007</guid>
		<description><![CDATA[<p>Çoğu zaman aklımda olan bir soru var: „Programcılık bir sanat mıdır yoksa bir zanaat mıdır? Biz programcılar sanatkar mıyız yoksa zanaatkar mıyız?</p>
<p>Vikipedi’ye baktığımızda sanat ve zanaat için aşağıdaki tanımlamayı yapmakta:</p>
<p><span id="more-2007"></span></p>
<p><em><strong>Sanat</strong>  en genel anlamıyla, yaratıcılığın ve hayalgücünün ifadesi olarak anlaşılır. Tarih boyunca neyin sanat olarak adlandırılacağına dair fikirler sürekli değişmiş, bu geniş anlama zaman içinde değişik kısıtlamalar getirilip yeni tanımlar yaratılmıştır. Bugün sanat terimi birçok kişi tarafından çok basit ve net gözüken bir kavram gibi kullanılabildiği gibi akademik çevrelerde sanatın ne şekilde tanımlanabileceği, hatta tanımlanabilir olup olmadığı bile hararetli bir tartışma konusudur. Açık olan nokta ise sanatın insanlığın evrensel bir değeri olduğu, kısıtlı veya değişik şekillerde bile olsa her kültürde görüldüğüdür. Sanat sözcüğü genelde görsel sanatlar anlamında kullanılır.</em></p>
<p><em><strong>Zanaat</strong> , sermayeden çok nitelikli emeğe dayalı; öğrenimin yanısıra el becerisi ve ustalık gerektiren meslek. Zanaatkâr, zanaatle uğraşan kişi anlamına gelir. Marangozluk, ayakkabıcılık, kuyumculuk (takı üreten), kumaş boyama, çömlekçilik, berberlik, bakırcılık gibi mesleklerin hepsi birer zanaattir. Bir kimsenin zanaatkâr olması için el becerisi gerektiren bir malı veya hizmeti sadece satması değil, bilfiil üretmesi gerekir.</em></p>
<p>Yaptığımız işte he ikisinden de birşeyler var değil mi? Okunması kolay estetik kod yazarak bir sanatkar, müşteri gereksinimlerini tatmin eden uygulamalar geliştirerek bir zanaatkar olabiliyoruz. Ama gerçek hayatta durum ne yazık ki çok farklı. Sanatkar değiliz, çünkü müşterimiz güzel kod yazıyoruz diye bize iş vermiyor. Zanaatkar değiliz, çünkü yazılımcı olarak usta-çırak geleneğinden yetişerek işimizin başına gelmiyoruz.  Neden böyle düşündüğümü bu yazımda sizinle paylaşmaya çalışacağım.</p>
<p>Birgün yolunuz Gaziantep’e düşerse Bakırcılar Çarşısı’na mutlaka uğrayın.  Orada çalışan bakır ustaları kelimenin tam anlamıyla hem sanatkardırlar hem de zanaatkar. Sanatkardırlar, çünkü estetik değerler oluştururlar. Zanaatkardırlar, çünkü usta-çırak kültürüyle yetişip, el emekleri ile bu değerleri oluştururlar.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/1.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/1.jpg" alt="" title="1" width="495" height="329" class="aligncenter size-full wp-image-2009" /></a></p>
<p>Bir bakır ustasının elinde vücut bulan ve yirmi ile yüz Türk Lirası arasında bir fiyata sahip bir bakır kupanın sadece su içmek için edinildiğini görmedim. Ufak bir sanat eseri olan bu bakır kupayı evimizdeki vitrinleri süslemek için ediniriz. Bizim için önemli olan kupanın fonksiyonel işlevi (kupadan su içmek) değildir. Daha ziyade kupanın estetik yönü ilgimizi çeker. Bu yüzden bakır kupa bir sanat eseridir, bakır ustası da bir sanatkar.</p>
<p>Peki camdan üretilen su bardakları sanat eserleri midir? Bu su bardaklarını üretenler sanatkar mıdır? Şüphesiz tanesi yüzlerce Türk Lirası’nı bulan su bardakları bulmak zor değildir. Ama pahalı olmaları sanat eserleri oldukları anlamına gelmez. Camdan yapılmış bir su bardağını su içmek için alırız. Bizim için su bardağının tatmin etmesi gereken fonksiyonel bir işlevi vardır. Su bardağının bu fonksiyonel işlevi yerine getirirken bir sanat eseri olup, olmadığı bizi ilgilendirmez. Herhangi bir marketten tanesi bir Türk Lirası olan onlarca su bardağı alıp, mutfaktaki dolaba koyarız. Su içmek istediğimizde bir bardak alıp, kullanırız. Bizim için camdan üretilmiş bir su bardağının fonksiyonel işlevi ön planda oldugu için, bu  su bardağı bir sanat eseri değildir. Aynı şekilde bu bardakları üretenler de bizim gözümüde sanatkar değildirler.<br />
<a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/2.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/2.jpg" alt="" title="2" width="500" height="500" class="aligncenter size-full wp-image-2011" /></a><br />
Buradan çıkardığım sonuç şudur: Sanat eserlerinde fonksiyonel işlev önemli değildir. Dikkat bulan, icra edilen sanattır. İcra edilen bu sanat, sanat eserleri meydana getirir. Fonksiyonel işlevin önemli olduğu yerlerde ise sanat eserleri tercih edilmez. Sanat eseri ve sanatkar olmayı belirleyen faktör budur.</p>
<h1>Programcılık Sanat, Programcı da sanatkar değildir.</h1>
<p>Bazı programcılar program yazma aktivitesini sanat olarak, bu işi yaptıklarından dolayı kendilerini de sanatkar olarak görmektedirler. Bu ne yazık ki doğru değildir. Program yazmak fonksiyonel bir işlevi meydana getirmek için yapılan bir aktivitedir. Camdan su bardağı örneğinde olduğu gibi, müşterimiz bizim yazdığımız programın estetik kısmıyla ilgilenmez. Onun için oluşturulan uygulamanın tatmin etmesi gereken sadece fonksiyonel bir işlevi vardır. Uygulamanın ne kadar güzel kodlandığı ile ilgilenmez. Hiç, bir müşterinin kodu açıp, okumaya çalışıp, ne kadar güzel yazılmış,  ya da yazılmamış diye yorum yaptığını görmedim. Durum böyle iken, müşteriye sattığımız uygulama bir sanat eseri değildir. Bir sanat eseri oluşturup, satmadığımıza göre, programcı olarak sanatkar olmamızda mümkün değildir.</p>
<p>Bir programcı olarak  müşterinin gereksinimlerini tatmin eden, sadece fonksiyonel işlevi olan ürünler ortaya koyarız. Müşteri oluşturduğumuz uygulamaya baktığında bir sanat eseri, bize baktığında bir sanatkar görmez. Ama aynı şahıs bir bakır ustasına baktığında bir sanat eseri ve sanatkar görür.  Demek oluyor ki sanat eserine ve sanatkara bu sıfatı değer görenler başkalarıdır. Kendi kendimize sanat eseri ortaya koyduğumuzu ve sanatkar olduğumuzu iddia etmemiz birşeyi değiştirmez. Bu yüzden programcının kendisini sanatkar olarak görmesi doğru değildir, çünkü müşterisinin gözünde sanatkar değildir.</p>
<h1>Programcılar Zanaatkar Değildir</h1>
<p>Zanaat demek ustalık demektir; gelenek demektir; ustadan öğrenmek demektir. Siz hiç bir berber çırağının ilk işe başladığı gün saç kestiğini gördünüz mü? Çırak önce ustasına hizmet edip, ondan birşeyler öğrenmeye ve yavaş yavaş olgunlaşmaya başlayacaktır. Usta ise çırağını kendi tecrübeleri doğrultusunda ve kendi ustasından öğrendigi şekilde  yönlendirecektir. Belli bir zaman diliminden sonra çırak yavaş yavaş bir zanaatkara dönüşecektir. Bunun gerçekleşmesi için ustasının kendisine gösterdigi yolu takip etmesi gerekmektedir. Bu yolu gitmek yıllar sürebilir. Ama bu yolun sonunda çırak için kendi ustası gibi bir usta, bir zanaatkar olma ödülü vardır. Ustalaşmak ve bir zanaatkar olmak hiç te kolay olmayan bir süreçtir. Ustası olmayan bir çırağın, bu yolu tek başına giderek ustalaşması çok zor olacaktır ya da mümkün olmayacaktır.</p>
<p>Yukarda yer alan tanımlamaya gore programcılar zanaatkar değildir, çünkü programcılar usta-çırak geleneginden gelerek yetişmezler. Programcılar için işe başlama bariyeri yok denecek kadar azdır. Bir bilgisayar ya da başka bir mühendislik ögrencisi diplomasını eline aldığı andan itibaren programcı olarak çalışmaya başlayabilir. Hiç kimse senin ustan kim ya da kaç sene çırak programcı olarak çalıştın diye soru sormaz.  Programcının daha önce hangi projelerde çalıştığı sorulur.  Buradaki amaç daha çok programcının ne kadar tecrübeli olduğunu anlamaya çalışmaktır. Ama yıl bazında edinilen tecrübe, şahsın ustalık oranını göstermez. On sene tecrübesi olduğunu söyleyen bir programcı, son dokuz senesini, birinci sene öğrendiği şeyleri tekrarlamakla geçirdiyse, son dokuz sene tecrübe topladığı söylenemez.</p>
<p>Tecrübesiz ve bir usta tarafından yetiştirilmemiş bir programacının hemen program yazmaya başlamasını, diplomasını almış bir doktorun hemen kalp ameliyatı yapmaya başlamasıyla kıyasladığımızda, durumun programcılar açısından aslında ne kadar absürd olduğunu görebiliriz. Kalp ameliyatı yapmaya aday bir doktor  yıllarını usta doktorlara asistanlık yapmakla geçirir. Bu ona kalp ameliyatlarının nasıl yapıldığını ustalarından öğrenme fırsatı verir. Asistanlık dönemi bittikten sonra, asistan doktor seçtiği dalda uzmanlaşma dönemine girer. Hem asistanlık hem de uzmanlaşma döneminde doktor adayı ustalarından gerekli herşeyi öğrenerek, onlarca seneyi bulacak bir zaman diliminden sonra kalp ameliyetlarını yapabilecek kıvama gelir. Yukarda da belirttiğim gibi programcılar için bunların hiçbirisi geçerli değildir. Programcı diplomasını alır, masasının başına oturur ve hemen müşteri için program yazmaya başlar. Neden birçok projenin yapılan hatalı kalp ameliyatlarından dolayı öldüğü ortadadır, çünkü ameliyatı yapan programcılar yetkin değildir.</p>
<p>Usta-çırak geleneğinin olmadığı yerde bir zanaatin icrası ya da yapılan işin zanaat olarak tanımlanması çok zordur. Programcılar ustasız yetiştikleri için, zamanlarının büyük bir kısmını deneme yanılmayla boşuna sarf ederler.  Yıllarca aynı şeyleri yapıp, yerlerinde saysalar bile, bunu tecrübe yapmış olarak algılarlar. Kendilerine yön gösteren bir ustaları olmadığı için kendilerini geliştirmekte ve ustalaşmakta çok zorlanırlar. Bu sebepten dolayı birçok programcı ustalık mertebesine erişemez. Oysaki bir ustanın denetiminde olsalar ustalaşmaları çok daha kolay olacaktır.</p>
<h1>Programcılık Zanaattir</h1>
<p>Bir önceki bölümün başlığına baktığınızda bu bölümün başlığı tezat gibi algılanabilir. Bir önceki bölümde neden zanaatkar olamadığımızı anlatmaya çalıştım. Bu bölümde ise aslında neden zanaatkar olduğumuzu anlatmak istiyorum.</p>
<p>Zanaati, sermayeden çok nitelikli emeğe dayalı; öğrenimin yanısıra el becerisi ve ustalık gerektiren meslek şeklinde tanımlamıştık.  Bunun yanısıra bir zanaat usta-çırak geleneğini kapsamaktadır. Bu tanımlama bir programcıya tamamen uygun yapıdadır. Eksik olan programcıların ustasız yetişmeleridir. Ama bu onların zanaatkar olmadıkları anlamına gelmez. Bu eksiği kapatmak için ustalığa giden yolun tarifini yapmamız gerekmektedir. Bilge Programcı programı (http://www.bilgeprogramci.com &#8211; şu an üzerinde çalıştığım, yapım aşamasında olan projemdir) böyle bir yolun tarifesini ihtiva eder. Daha once bu yoldan geçmiş, şimdilerde usta programcılardan kendimize örnek alarak, bizde yaptığımız işte ustalaşabiliriz. Ustalaştıkca bir zanaatkar olmaya başlarız ve yaptığımız iş bir zanaat haline dönüşür. Usta programcılar zanaatkardırlar. Genç programcılara da onlara çırak olmak düşer. Eti senin, kemiği benim misali :)</p>
<p>Not: Bu yazının devamı olarak <a href="http://www.kurumsaljava.com/2012/05/14/mantigin-koleleri-2/">Mantığın Köleleri</a> başlıklı biz yazı daha oluşturdum. Bilginize sunarım.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Çoğu zaman aklımda olan bir soru var: „Programcılık bir sanat mıdır yoksa bir zanaat mıdır? Biz programcılar sanatkar mıyız yoksa zanaatkar mıyız?</p>
<p>Vikipedi’ye baktığımızda sanat ve zanaat için aşağıdaki tanımlamayı yapmakta:</p>
<p><span id="more-2007"></span></p>
<p><em><strong>Sanat</strong>  en genel anlamıyla, yaratıcılığın ve hayalgücünün ifadesi olarak anlaşılır. Tarih boyunca neyin sanat olarak adlandırılacağına dair fikirler sürekli değişmiş, bu geniş anlama zaman içinde değişik kısıtlamalar getirilip yeni tanımlar yaratılmıştır. Bugün sanat terimi birçok kişi tarafından çok basit ve net gözüken bir kavram gibi kullanılabildiği gibi akademik çevrelerde sanatın ne şekilde tanımlanabileceği, hatta tanımlanabilir olup olmadığı bile hararetli bir tartışma konusudur. Açık olan nokta ise sanatın insanlığın evrensel bir değeri olduğu, kısıtlı veya değişik şekillerde bile olsa her kültürde görüldüğüdür. Sanat sözcüğü genelde görsel sanatlar anlamında kullanılır.</em></p>
<p><em><strong>Zanaat</strong> , sermayeden çok nitelikli emeğe dayalı; öğrenimin yanısıra el becerisi ve ustalık gerektiren meslek. Zanaatkâr, zanaatle uğraşan kişi anlamına gelir. Marangozluk, ayakkabıcılık, kuyumculuk (takı üreten), kumaş boyama, çömlekçilik, berberlik, bakırcılık gibi mesleklerin hepsi birer zanaattir. Bir kimsenin zanaatkâr olması için el becerisi gerektiren bir malı veya hizmeti sadece satması değil, bilfiil üretmesi gerekir.</em></p>
<p>Yaptığımız işte he ikisinden de birşeyler var değil mi? Okunması kolay estetik kod yazarak bir sanatkar, müşteri gereksinimlerini tatmin eden uygulamalar geliştirerek bir zanaatkar olabiliyoruz. Ama gerçek hayatta durum ne yazık ki çok farklı. Sanatkar değiliz, çünkü müşterimiz güzel kod yazıyoruz diye bize iş vermiyor. Zanaatkar değiliz, çünkü yazılımcı olarak usta-çırak geleneğinden yetişerek işimizin başına gelmiyoruz.  Neden böyle düşündüğümü bu yazımda sizinle paylaşmaya çalışacağım.</p>
<p>Birgün yolunuz Gaziantep’e düşerse Bakırcılar Çarşısı’na mutlaka uğrayın.  Orada çalışan bakır ustaları kelimenin tam anlamıyla hem sanatkardırlar hem de zanaatkar. Sanatkardırlar, çünkü estetik değerler oluştururlar. Zanaatkardırlar, çünkü usta-çırak kültürüyle yetişip, el emekleri ile bu değerleri oluştururlar.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/1.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/1.jpg" alt="" title="1" width="495" height="329" class="aligncenter size-full wp-image-2009" /></a></p>
<p>Bir bakır ustasının elinde vücut bulan ve yirmi ile yüz Türk Lirası arasında bir fiyata sahip bir bakır kupanın sadece su içmek için edinildiğini görmedim. Ufak bir sanat eseri olan bu bakır kupayı evimizdeki vitrinleri süslemek için ediniriz. Bizim için önemli olan kupanın fonksiyonel işlevi (kupadan su içmek) değildir. Daha ziyade kupanın estetik yönü ilgimizi çeker. Bu yüzden bakır kupa bir sanat eseridir, bakır ustası da bir sanatkar.</p>
<p>Peki camdan üretilen su bardakları sanat eserleri midir? Bu su bardaklarını üretenler sanatkar mıdır? Şüphesiz tanesi yüzlerce Türk Lirası’nı bulan su bardakları bulmak zor değildir. Ama pahalı olmaları sanat eserleri oldukları anlamına gelmez. Camdan yapılmış bir su bardağını su içmek için alırız. Bizim için su bardağının tatmin etmesi gereken fonksiyonel bir işlevi vardır. Su bardağının bu fonksiyonel işlevi yerine getirirken bir sanat eseri olup, olmadığı bizi ilgilendirmez. Herhangi bir marketten tanesi bir Türk Lirası olan onlarca su bardağı alıp, mutfaktaki dolaba koyarız. Su içmek istediğimizde bir bardak alıp, kullanırız. Bizim için camdan üretilmiş bir su bardağının fonksiyonel işlevi ön planda oldugu için, bu  su bardağı bir sanat eseri değildir. Aynı şekilde bu bardakları üretenler de bizim gözümüde sanatkar değildirler.<br />
<a href="http://www.kurumsaljava.com/wp-content/uploads/2012/05/2.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/05/2.jpg" alt="" title="2" width="500" height="500" class="aligncenter size-full wp-image-2011" /></a><br />
Buradan çıkardığım sonuç şudur: Sanat eserlerinde fonksiyonel işlev önemli değildir. Dikkat bulan, icra edilen sanattır. İcra edilen bu sanat, sanat eserleri meydana getirir. Fonksiyonel işlevin önemli olduğu yerlerde ise sanat eserleri tercih edilmez. Sanat eseri ve sanatkar olmayı belirleyen faktör budur.</p>
<h1>Programcılık Sanat, Programcı da sanatkar değildir.</h1>
<p>Bazı programcılar program yazma aktivitesini sanat olarak, bu işi yaptıklarından dolayı kendilerini de sanatkar olarak görmektedirler. Bu ne yazık ki doğru değildir. Program yazmak fonksiyonel bir işlevi meydana getirmek için yapılan bir aktivitedir. Camdan su bardağı örneğinde olduğu gibi, müşterimiz bizim yazdığımız programın estetik kısmıyla ilgilenmez. Onun için oluşturulan uygulamanın tatmin etmesi gereken sadece fonksiyonel bir işlevi vardır. Uygulamanın ne kadar güzel kodlandığı ile ilgilenmez. Hiç, bir müşterinin kodu açıp, okumaya çalışıp, ne kadar güzel yazılmış,  ya da yazılmamış diye yorum yaptığını görmedim. Durum böyle iken, müşteriye sattığımız uygulama bir sanat eseri değildir. Bir sanat eseri oluşturup, satmadığımıza göre, programcı olarak sanatkar olmamızda mümkün değildir.</p>
<p>Bir programcı olarak  müşterinin gereksinimlerini tatmin eden, sadece fonksiyonel işlevi olan ürünler ortaya koyarız. Müşteri oluşturduğumuz uygulamaya baktığında bir sanat eseri, bize baktığında bir sanatkar görmez. Ama aynı şahıs bir bakır ustasına baktığında bir sanat eseri ve sanatkar görür.  Demek oluyor ki sanat eserine ve sanatkara bu sıfatı değer görenler başkalarıdır. Kendi kendimize sanat eseri ortaya koyduğumuzu ve sanatkar olduğumuzu iddia etmemiz birşeyi değiştirmez. Bu yüzden programcının kendisini sanatkar olarak görmesi doğru değildir, çünkü müşterisinin gözünde sanatkar değildir.</p>
<h1>Programcılar Zanaatkar Değildir</h1>
<p>Zanaat demek ustalık demektir; gelenek demektir; ustadan öğrenmek demektir. Siz hiç bir berber çırağının ilk işe başladığı gün saç kestiğini gördünüz mü? Çırak önce ustasına hizmet edip, ondan birşeyler öğrenmeye ve yavaş yavaş olgunlaşmaya başlayacaktır. Usta ise çırağını kendi tecrübeleri doğrultusunda ve kendi ustasından öğrendigi şekilde  yönlendirecektir. Belli bir zaman diliminden sonra çırak yavaş yavaş bir zanaatkara dönüşecektir. Bunun gerçekleşmesi için ustasının kendisine gösterdigi yolu takip etmesi gerekmektedir. Bu yolu gitmek yıllar sürebilir. Ama bu yolun sonunda çırak için kendi ustası gibi bir usta, bir zanaatkar olma ödülü vardır. Ustalaşmak ve bir zanaatkar olmak hiç te kolay olmayan bir süreçtir. Ustası olmayan bir çırağın, bu yolu tek başına giderek ustalaşması çok zor olacaktır ya da mümkün olmayacaktır.</p>
<p>Yukarda yer alan tanımlamaya gore programcılar zanaatkar değildir, çünkü programcılar usta-çırak geleneginden gelerek yetişmezler. Programcılar için işe başlama bariyeri yok denecek kadar azdır. Bir bilgisayar ya da başka bir mühendislik ögrencisi diplomasını eline aldığı andan itibaren programcı olarak çalışmaya başlayabilir. Hiç kimse senin ustan kim ya da kaç sene çırak programcı olarak çalıştın diye soru sormaz.  Programcının daha önce hangi projelerde çalıştığı sorulur.  Buradaki amaç daha çok programcının ne kadar tecrübeli olduğunu anlamaya çalışmaktır. Ama yıl bazında edinilen tecrübe, şahsın ustalık oranını göstermez. On sene tecrübesi olduğunu söyleyen bir programcı, son dokuz senesini, birinci sene öğrendiği şeyleri tekrarlamakla geçirdiyse, son dokuz sene tecrübe topladığı söylenemez.</p>
<p>Tecrübesiz ve bir usta tarafından yetiştirilmemiş bir programacının hemen program yazmaya başlamasını, diplomasını almış bir doktorun hemen kalp ameliyatı yapmaya başlamasıyla kıyasladığımızda, durumun programcılar açısından aslında ne kadar absürd olduğunu görebiliriz. Kalp ameliyatı yapmaya aday bir doktor  yıllarını usta doktorlara asistanlık yapmakla geçirir. Bu ona kalp ameliyatlarının nasıl yapıldığını ustalarından öğrenme fırsatı verir. Asistanlık dönemi bittikten sonra, asistan doktor seçtiği dalda uzmanlaşma dönemine girer. Hem asistanlık hem de uzmanlaşma döneminde doktor adayı ustalarından gerekli herşeyi öğrenerek, onlarca seneyi bulacak bir zaman diliminden sonra kalp ameliyetlarını yapabilecek kıvama gelir. Yukarda da belirttiğim gibi programcılar için bunların hiçbirisi geçerli değildir. Programcı diplomasını alır, masasının başına oturur ve hemen müşteri için program yazmaya başlar. Neden birçok projenin yapılan hatalı kalp ameliyatlarından dolayı öldüğü ortadadır, çünkü ameliyatı yapan programcılar yetkin değildir.</p>
<p>Usta-çırak geleneğinin olmadığı yerde bir zanaatin icrası ya da yapılan işin zanaat olarak tanımlanması çok zordur. Programcılar ustasız yetiştikleri için, zamanlarının büyük bir kısmını deneme yanılmayla boşuna sarf ederler.  Yıllarca aynı şeyleri yapıp, yerlerinde saysalar bile, bunu tecrübe yapmış olarak algılarlar. Kendilerine yön gösteren bir ustaları olmadığı için kendilerini geliştirmekte ve ustalaşmakta çok zorlanırlar. Bu sebepten dolayı birçok programcı ustalık mertebesine erişemez. Oysaki bir ustanın denetiminde olsalar ustalaşmaları çok daha kolay olacaktır.</p>
<h1>Programcılık Zanaattir</h1>
<p>Bir önceki bölümün başlığına baktığınızda bu bölümün başlığı tezat gibi algılanabilir. Bir önceki bölümde neden zanaatkar olamadığımızı anlatmaya çalıştım. Bu bölümde ise aslında neden zanaatkar olduğumuzu anlatmak istiyorum.</p>
<p>Zanaati, sermayeden çok nitelikli emeğe dayalı; öğrenimin yanısıra el becerisi ve ustalık gerektiren meslek şeklinde tanımlamıştık.  Bunun yanısıra bir zanaat usta-çırak geleneğini kapsamaktadır. Bu tanımlama bir programcıya tamamen uygun yapıdadır. Eksik olan programcıların ustasız yetişmeleridir. Ama bu onların zanaatkar olmadıkları anlamına gelmez. Bu eksiği kapatmak için ustalığa giden yolun tarifini yapmamız gerekmektedir. Bilge Programcı programı (http://www.bilgeprogramci.com &#8211; şu an üzerinde çalıştığım, yapım aşamasında olan projemdir) böyle bir yolun tarifesini ihtiva eder. Daha once bu yoldan geçmiş, şimdilerde usta programcılardan kendimize örnek alarak, bizde yaptığımız işte ustalaşabiliriz. Ustalaştıkca bir zanaatkar olmaya başlarız ve yaptığımız iş bir zanaat haline dönüşür. Usta programcılar zanaatkardırlar. Genç programcılara da onlara çırak olmak düşer. Eti senin, kemiği benim misali :)</p>
<p>Not: Bu yazının devamı olarak <a href="http://www.kurumsaljava.com/2012/05/14/mantigin-koleleri-2/">Mantığın Köleleri</a> başlıklı biz yazı daha oluşturdum. Bilginize sunarım.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F08%2Fprogramcilik-sanat-mi-zanaat-mi%2F&amp;linkname=Programc%C4%B1l%C4%B1k%20Sanat%20m%C4%B1%2C%20Zanaat%20m%C4%B1%3F"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/08/programcilik-sanat-mi-zanaat-mi/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ekibin Dikkati ve Saygısı Nasıl Kazanılır?</title>
		<link>http://www.kurumsaljava.com/2012/05/05/ekibin-dikkati-ve-saygisi-nasil-kazanilir/</link>
		<comments>http://www.kurumsaljava.com/2012/05/05/ekibin-dikkati-ve-saygisi-nasil-kazanilir/#comments</comments>
		<pubDate>Sat, 05 May 2012 08:11:33 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1964</guid>
		<description><![CDATA[<p>Her programcı yeni bir ekibe dahil olduğunda kendisini ispatlamak zorundadır. Bu gerçekleşene kadar ekip içindeki diğer programcılar yeni programcıyı dikkate almazlar. Birilerinin ekibe dahil olduğunu beyinlerinin en arkasında çalışan bir thread ile belki farkederler, ama bunu dikkate almadan günlük işlerine devam ederler. <span id="more-1964"></span>Yeni programcıya kendisini ispatlayana kadar pek ekibin bir parçası olarak bakmazlar. O yokmuş gibi davranabilirler, çünkü kendi aralarında sosyal bir ağ kurmuşlardır ve tüm iletişim trafiği mevcut bu ağlar üzerinden gerçekleşir. Programcı bu sosyal ağa henüz dahil olmadığı için oyun dışı kalabilir. Ekibe ve ekibin sosyal ağına dahil olmak ve ciddiye alınmak için programcının derhal kendisini ispatlaması gerekmektedir.</p>
<p>Yeni bir ekibe katılan bir progrmacının kendini ispatlama stratejisi nasıl olmalıdır? Eğer programcının ünü yeni ekibe kendisinden önce ulaşmadı ise, o zaman programcının işi hiç te kolay değildir. Eğer ünü yoksa, durum daha da vahimdir. Kendisini o projede ispatlayana kadar canı çıkabilir, belki de bunu hiç başaramaz ve bu onu mutsuz olmaya itebilir.</p>
<p>Bu stratejinin nasıl olma<strong>ma</strong>sı gerektiği ile başlayalım isterseniz. Eğer programcı bir kenara çekilip, &#8220;<em>bana verilen işleri yapmaya çalışayım</em>&#8221; derse, o zaman baştan oyunu kaybetti demektir. Farklılık yaratmak ve profil oluşturmak istiyorsa, bir görevin (task) kendisine verilmesini beklemeyip, kendisi görev seçmelidir. Genelde kimsenin cesaret edip, üstlenemediği görevler ortada kalır. Bu tip görevler, diğer ekip arkadaşları arasından sıyrılıp, kendisini kısa zamanda ispatlamak için biçilmiş kaftan gibidir. Doğal olarak zor görevler yetkinlik gerektirir. Ama programcıyı pişiren bu tür görevlerdir. Örneğin her projede mutlaka ve mutlaka performans problemleri yaşanır. Uygulama sunucusu göçer, JVM takılır kalır, threadler bloke olur vs. Yaşanan bu tür problemler her programcının ilgi alanına girmediği için bu tür işlere bulaşmadan kendi işlerine devam ederler. Yeni programcı bunu fırsat bilip balıklama bu tür görevlerin üstüne atlamalıdır. Herkesin başını ağrıtan bu tür problemlerden birisini çözdüğü andan itibaren kendisini ispatlamış sayılır ve yeni ekibi kendisini sevgi, hürmet ve selamla kuçaklar. <strong>Buradan da anlaşıldığı gibi en büyük erdemlerden birisi cesarettir; cesaret edip görev üstlenmektir.</strong></p>
<p>Hadi diyelim yeni programcı üstlenebileceği enteresan bir görev bulamadı ya da kendisine bir görev tayin edildi. Bu durumda işini en iyi şekilde tamamlayıp, elde ettiği neticeleri tüm ekibe duyurmanın yollarını bulmalıdır. Her ekibin kullandığı e-posta listeleri vardır. Bir e-posta iletisi ile tüm ekibe, hatta proje ve takım yöneticilerine erişmek mümkündür. Yeni programcı kod yazarken nasıl farklılık yaratarak, takım arkadaşlarının dikkatini çekebileceği hakkında düşünmelidir. Örneğin kendisine verilen görevi <a href="http://www.kurumsaljava.com/2008/11/26/test-gudumlu-yazilim-test-driven-development-tdd/" target=_blank>test güdümlü</a> kodlayıp, elde ettiği yüksek seviyedeki testlerin kod kapsama alanı metriğini e-posta listesi üzerinden duyurabilir. Otomatik çalışan unit testleri, %90 üzerindeki code coverage (kod kapsama alanı), <a href="http://www.kurumsaljava.com/2011/12/30/solid/" target=_blank>SOLID</a> uyumlu ve kolay okunan sınıflar ekip arkadaşlarını etkileyecektir. Birçok projede programcılar unit testleri yazmadığı için, yeni programcının oluşturduğu ve otomatik çalışan testler dikkat çekmeyi kolaylaştıracaktır. Yerlerde sürünen kod kapsama alanı, yeni programcının oluşturduğu unit testleri ile birden bire tavana fırladığında, bakın bakalım kim anında yıldız programcı oluveriyor. <strong>Yeni programcının yazılımın nasıl olması gerektiği yönündeki dolaylı boy göstermeleri, onun kısa sürede ekibin sosyal ağına dahil olmasını kolaylaştıracaktır</strong></p>
<p>Eger proje bünyesinde <a href="http://jenkins-ci.org/" target=_blank>Jenkins</a>, <a href="http://www.sonarsource.org/" target=_blank>Sonar</a> gibi araçlar kullanılmıyorsa, yeni programcının söz alıp, bu araçların kullanımının proje için ne kadar faydalı olduğunu dile getirmesinde fayda vardır. Örneğin yeni programcı Sonar kurulduktan sonra tüm kodun statik analizini yapıp, sonuçları daha önce bahsettiğim e-posta listesi üzerinden tüm ekip çalışanlarına duyurabilir. <strong>Kendisi bu gibi araçları kurmaya ve işletmeye talip olmalıdır</strong>. Bu onu bir vuruşta belli bir alanda söz sahibi yapar. Yeni araçları kullanmak isteyecek olan ekip çalışanları yeni programcıya danışmak isteyecekler ve bu şekilde yeni programcının ekibe entegre edilme sürecini kolaylaştıracaklardır. <strong>Yeni programcının, yazılım sürecini olumlu etkileyecek yeni fikirlerle gelmesi, kendisini ispatlama sürecini kısaltacaktır.</strong></p>
<p><strong>Yeni programcı ekip toplantılarında mutlaka kendi fikrini beyan etmelidir</strong>. Yanlışta olsa bir fikir beyan etmek, hiç fikir beyan etmemekten daha iyidir (tamamen saçmalamamak şartıyla). Eğer susup, konuşulanları dinlerse, ekip arkadaşları onu dikkate almamayı sürdüreceklerdir. Bir fikir sahibi olmayan ya da bunu beyan etmeyi bilmeyen bir insanın toplum içinde yer bulması zordur. Ekip içindeki programcılar karşılaştıkları problemleri e-posta aracılığı ile çalışma arkadaşlarına duyururlar. Bu gibi e-postalara herkesin okuyacağı şekilde cevap vermek, çözüm önerilerinde bulunmak, zaman içinde yeni programcının profilini biler.</p>
<p>Kendini ispatlamanın bir diğer yolu takım arkadaşları ile kod inceleme (code review) seansları düzenlemektir. Çoğu ekip bu tür bir alışkanlığa sahip değildir. Beraber kod inceleme seansları karşı tarafı eleştirme olarak algılanır ve bu yüzden bu aktiviteden kaçınılır. Yeni programcı bunu fırsat bilip, kendi kodunun ekip içinden başka bir programcı tarafından incelenmesini sağlamalıdır. Daha önce de bahsettiğim gibi kodun özenli yazılmış, her sınıfın sadece bir sorumluluğa sahip <a href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>(SRP prensibi</a>), diğer SOLID prensipleri ile uyumlu, otomatik çalışan unit testlerine sahip, değişken ve metot isimlerinin kodun ifade gücünü artıracak şekilde seçilmiş olması, kodu inceleyen programcıda hayranlık uyandıracaktır. Bunu kendisi için tutmaz ve mutlaka diğer ekip arkadaşları ile paylaşır. Bundan emin olabilirsiniz. Yeni programcı bu şekilde kendisi için bir taban oluşturduktan sonra, diğer programcılar tarafından kod inceleme seanslarına davet edilip, fikri alınan bir programcı olacaktır.</p>
<p>Her ekip içinde mutlaka en az bir tane, rahatsızlık veren, sivri, kendisinin yıldız programcı (star developer) olduğunu düşünen bir programcı vardır. Bu tip programcılarla çalışmak çok zordur. Yeni programcı da mutlaka bu yıldız programcının hışmına uğrayacaktır. Bu gibi durumlarda yeni programcı alttan almaya çalışmalı, ekip içinde soğuk bir atmosferin oluşmasını sağlayacak karşı karşıya gelmenin önüne geçmelidir. Eğer yeni programcı yıldız programcı ile karşı karşıya gelirse, diğer ekip çalışanları yıldızın yanında olmayı tercih edeceklerdir. Yeni programcı ne kadar haklı olursa olsun, ekip içinde bir nevi sürü içgüdüsü olduğundan, yıldız programcının tarafinda olacaklardir. Bu gibi durumlarda yıldız programcı ile aynı görev üzerinde beraber çalışma fırsatı kollanmalıdır. Yıldız ile iletişim içinde olmak onu yumuşatacaktır. Yeni programcı aynı zamanda yetkinliğini yıldıza gösterme firsatı bulursa, aradaki buzlar eriyip, diyalog normalleşecektir. Yeni programcı aynı zamanda firsatını yakaladığında yıldıza haddini bildirme cesareti göstermelidir. Örneğin sorduğu bir soruya alaylı bir cevap alıyorsa, takım liderinin de bulunduğu bir ortamda yıldıza neden böyle bir cevap verdiği sorulabilir. Yıldız kem, küm edip, afallayacaktır. Bu şekilde yeni programcı yıldızı hafiften ısırabilir ve yıldıza fazla üzerime gelme sinyali verebilir.<strong> Yeni programcı başını dik tutma cesareti gösterdiği andan itibaren, yıldızın davranış biçimi değişecektir</strong>. Kimse karşısında dik duramayan insana saygı göstermez. Yıldıza karşı dik durma yeni programcıya diger ekip arkadaşlarının saygısını getirir.</p>
<p><strong>Ekibin dikkatini ve saygısını kazanmanın diğer bir yolu ekibe bilgi transferi (know-how tranfer) yapmaktır</strong>. Örneğin yeni programcı ekipden diğer bir programcıya &#8220;<em>istersen üstlendiğin yeni görevi test güdümlü (Test Driven) ve eşli (pair programming) kodlayalım, bunun nasıl yapıldığını sana gösterebilirim</em>&#8221; teklifini götürebilir. Böyle bir teklife, konuyla ilgili bilgisi olmayan programcı hayır diyemez. Teklifi alan programcı yeni birşeyler öğrenme hevesi ile yeni programcıya kendini ispatlama firsatını tanıyacaktır. Yeni edindiği bilgiler programcıda hayranlık uyandırır ve bunu mutlaka diğer ekip arkadaşları ile paylaşır.</p>
<p>Her programcının Xing ya da LinkedIn platformlarında mutlaka bir profili olmalıdır. Programcı bu profillerinde hakim olduğu konuları, daha önce çalıştığı projeleri, sahip olduğu ünvan ve sertifikaları ve kendi projelerini (örneğin açık kaynaklı bir yazılım) sergilemelidir. Bu tür profiller artık programcılar için kartvizit ya da vitrin görevini üstlenmektedir. Mülakata giden her programcı hakkında mutlaka internette araştırma yapılır. Bu tür profillerin keşfedilmesi, mülakatın gidişatını olumlu etkileyebilir. Bu tür profillerin önemli başka bir fonksiyonu daha mevcuttur. Yeni programcı ekip içinde yazılmamış, boş bir defter sayfasıdır. Ekip üyelerinin yeni programcı hakkında geniş çaplı fikirleri yoktur. <strong>Bunu değiştirmenin en kolay yolu, ekip üyelerinin internet profillerini araştırmak ve onlara bahsettiğim platformlar üzerinden arkadaşlık teklifi göndermektir</strong>. Arkadaşlık teklifi alan diğer programcılar, yeni programcının profilini inceleme ve onun hakkında fikir edinme fırsatı bulacaklardır. Hele hele yeni programcı ender sertifikalardan birine sahipse, bu yemek aralarındaki sohbetlere malzeme olacak ve bu şekilde yeni programcının ekibe entegrasyonunu kolaylaşacaktır.</p>
<p>Ekip elemanları ile <strong>smalltalk</strong>, onlara çalışma esnasında <strong>tatlı birşeyler ikram etmek</strong> ve ekip liderine düzenli olarak <strong>rapor vermek</strong> sayabileceğim diğer yöntemler arasındadır. Olumlu dikkat çekmek her zaman önemlidir. Yetkin ve tecrübeli bir programcı farkında olmadan yukarda saydığım konularda çalışma yapacaktır. Verimli olmanın en önemli şartı, en kısa sürede ekibe entegre olmaktır. Bunu başarmak programcının elindedir.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
]]></description>
			<content:encoded><![CDATA[<p>Her programcı yeni bir ekibe dahil olduğunda kendisini ispatlamak zorundadır. Bu gerçekleşene kadar ekip içindeki diğer programcılar yeni programcıyı dikkate almazlar. Birilerinin ekibe dahil olduğunu beyinlerinin en arkasında çalışan bir thread ile belki farkederler, ama bunu dikkate almadan günlük işlerine devam ederler. <span id="more-1964"></span>Yeni programcıya kendisini ispatlayana kadar pek ekibin bir parçası olarak bakmazlar. O yokmuş gibi davranabilirler, çünkü kendi aralarında sosyal bir ağ kurmuşlardır ve tüm iletişim trafiği mevcut bu ağlar üzerinden gerçekleşir. Programcı bu sosyal ağa henüz dahil olmadığı için oyun dışı kalabilir. Ekibe ve ekibin sosyal ağına dahil olmak ve ciddiye alınmak için programcının derhal kendisini ispatlaması gerekmektedir.</p>
<p>Yeni bir ekibe katılan bir progrmacının kendini ispatlama stratejisi nasıl olmalıdır? Eğer programcının ünü yeni ekibe kendisinden önce ulaşmadı ise, o zaman programcının işi hiç te kolay değildir. Eğer ünü yoksa, durum daha da vahimdir. Kendisini o projede ispatlayana kadar canı çıkabilir, belki de bunu hiç başaramaz ve bu onu mutsuz olmaya itebilir.</p>
<p>Bu stratejinin nasıl olma<strong>ma</strong>sı gerektiği ile başlayalım isterseniz. Eğer programcı bir kenara çekilip, &#8220;<em>bana verilen işleri yapmaya çalışayım</em>&#8221; derse, o zaman baştan oyunu kaybetti demektir. Farklılık yaratmak ve profil oluşturmak istiyorsa, bir görevin (task) kendisine verilmesini beklemeyip, kendisi görev seçmelidir. Genelde kimsenin cesaret edip, üstlenemediği görevler ortada kalır. Bu tip görevler, diğer ekip arkadaşları arasından sıyrılıp, kendisini kısa zamanda ispatlamak için biçilmiş kaftan gibidir. Doğal olarak zor görevler yetkinlik gerektirir. Ama programcıyı pişiren bu tür görevlerdir. Örneğin her projede mutlaka ve mutlaka performans problemleri yaşanır. Uygulama sunucusu göçer, JVM takılır kalır, threadler bloke olur vs. Yaşanan bu tür problemler her programcının ilgi alanına girmediği için bu tür işlere bulaşmadan kendi işlerine devam ederler. Yeni programcı bunu fırsat bilip balıklama bu tür görevlerin üstüne atlamalıdır. Herkesin başını ağrıtan bu tür problemlerden birisini çözdüğü andan itibaren kendisini ispatlamış sayılır ve yeni ekibi kendisini sevgi, hürmet ve selamla kuçaklar. <strong>Buradan da anlaşıldığı gibi en büyük erdemlerden birisi cesarettir; cesaret edip görev üstlenmektir.</strong></p>
<p>Hadi diyelim yeni programcı üstlenebileceği enteresan bir görev bulamadı ya da kendisine bir görev tayin edildi. Bu durumda işini en iyi şekilde tamamlayıp, elde ettiği neticeleri tüm ekibe duyurmanın yollarını bulmalıdır. Her ekibin kullandığı e-posta listeleri vardır. Bir e-posta iletisi ile tüm ekibe, hatta proje ve takım yöneticilerine erişmek mümkündür. Yeni programcı kod yazarken nasıl farklılık yaratarak, takım arkadaşlarının dikkatini çekebileceği hakkında düşünmelidir. Örneğin kendisine verilen görevi <a href="http://www.kurumsaljava.com/2008/11/26/test-gudumlu-yazilim-test-driven-development-tdd/" target=_blank>test güdümlü</a> kodlayıp, elde ettiği yüksek seviyedeki testlerin kod kapsama alanı metriğini e-posta listesi üzerinden duyurabilir. Otomatik çalışan unit testleri, %90 üzerindeki code coverage (kod kapsama alanı), <a href="http://www.kurumsaljava.com/2011/12/30/solid/" target=_blank>SOLID</a> uyumlu ve kolay okunan sınıflar ekip arkadaşlarını etkileyecektir. Birçok projede programcılar unit testleri yazmadığı için, yeni programcının oluşturduğu ve otomatik çalışan testler dikkat çekmeyi kolaylaştıracaktır. Yerlerde sürünen kod kapsama alanı, yeni programcının oluşturduğu unit testleri ile birden bire tavana fırladığında, bakın bakalım kim anında yıldız programcı oluveriyor. <strong>Yeni programcının yazılımın nasıl olması gerektiği yönündeki dolaylı boy göstermeleri, onun kısa sürede ekibin sosyal ağına dahil olmasını kolaylaştıracaktır</strong></p>
<p>Eger proje bünyesinde <a href="http://jenkins-ci.org/" target=_blank>Jenkins</a>, <a href="http://www.sonarsource.org/" target=_blank>Sonar</a> gibi araçlar kullanılmıyorsa, yeni programcının söz alıp, bu araçların kullanımının proje için ne kadar faydalı olduğunu dile getirmesinde fayda vardır. Örneğin yeni programcı Sonar kurulduktan sonra tüm kodun statik analizini yapıp, sonuçları daha önce bahsettiğim e-posta listesi üzerinden tüm ekip çalışanlarına duyurabilir. <strong>Kendisi bu gibi araçları kurmaya ve işletmeye talip olmalıdır</strong>. Bu onu bir vuruşta belli bir alanda söz sahibi yapar. Yeni araçları kullanmak isteyecek olan ekip çalışanları yeni programcıya danışmak isteyecekler ve bu şekilde yeni programcının ekibe entegre edilme sürecini kolaylaştıracaklardır. <strong>Yeni programcının, yazılım sürecini olumlu etkileyecek yeni fikirlerle gelmesi, kendisini ispatlama sürecini kısaltacaktır.</strong></p>
<p><strong>Yeni programcı ekip toplantılarında mutlaka kendi fikrini beyan etmelidir</strong>. Yanlışta olsa bir fikir beyan etmek, hiç fikir beyan etmemekten daha iyidir (tamamen saçmalamamak şartıyla). Eğer susup, konuşulanları dinlerse, ekip arkadaşları onu dikkate almamayı sürdüreceklerdir. Bir fikir sahibi olmayan ya da bunu beyan etmeyi bilmeyen bir insanın toplum içinde yer bulması zordur. Ekip içindeki programcılar karşılaştıkları problemleri e-posta aracılığı ile çalışma arkadaşlarına duyururlar. Bu gibi e-postalara herkesin okuyacağı şekilde cevap vermek, çözüm önerilerinde bulunmak, zaman içinde yeni programcının profilini biler.</p>
<p>Kendini ispatlamanın bir diğer yolu takım arkadaşları ile kod inceleme (code review) seansları düzenlemektir. Çoğu ekip bu tür bir alışkanlığa sahip değildir. Beraber kod inceleme seansları karşı tarafı eleştirme olarak algılanır ve bu yüzden bu aktiviteden kaçınılır. Yeni programcı bunu fırsat bilip, kendi kodunun ekip içinden başka bir programcı tarafından incelenmesini sağlamalıdır. Daha önce de bahsettiğim gibi kodun özenli yazılmış, her sınıfın sadece bir sorumluluğa sahip <a href="http://www.kurumsaljava.com/2009/10/14/single-responsibility-principle-srp-tek-sorumluk-prensibi/" target=_blank>(SRP prensibi</a>), diğer SOLID prensipleri ile uyumlu, otomatik çalışan unit testlerine sahip, değişken ve metot isimlerinin kodun ifade gücünü artıracak şekilde seçilmiş olması, kodu inceleyen programcıda hayranlık uyandıracaktır. Bunu kendisi için tutmaz ve mutlaka diğer ekip arkadaşları ile paylaşır. Bundan emin olabilirsiniz. Yeni programcı bu şekilde kendisi için bir taban oluşturduktan sonra, diğer programcılar tarafından kod inceleme seanslarına davet edilip, fikri alınan bir programcı olacaktır.</p>
<p>Her ekip içinde mutlaka en az bir tane, rahatsızlık veren, sivri, kendisinin yıldız programcı (star developer) olduğunu düşünen bir programcı vardır. Bu tip programcılarla çalışmak çok zordur. Yeni programcı da mutlaka bu yıldız programcının hışmına uğrayacaktır. Bu gibi durumlarda yeni programcı alttan almaya çalışmalı, ekip içinde soğuk bir atmosferin oluşmasını sağlayacak karşı karşıya gelmenin önüne geçmelidir. Eğer yeni programcı yıldız programcı ile karşı karşıya gelirse, diğer ekip çalışanları yıldızın yanında olmayı tercih edeceklerdir. Yeni programcı ne kadar haklı olursa olsun, ekip içinde bir nevi sürü içgüdüsü olduğundan, yıldız programcının tarafinda olacaklardir. Bu gibi durumlarda yıldız programcı ile aynı görev üzerinde beraber çalışma fırsatı kollanmalıdır. Yıldız ile iletişim içinde olmak onu yumuşatacaktır. Yeni programcı aynı zamanda yetkinliğini yıldıza gösterme firsatı bulursa, aradaki buzlar eriyip, diyalog normalleşecektir. Yeni programcı aynı zamanda firsatını yakaladığında yıldıza haddini bildirme cesareti göstermelidir. Örneğin sorduğu bir soruya alaylı bir cevap alıyorsa, takım liderinin de bulunduğu bir ortamda yıldıza neden böyle bir cevap verdiği sorulabilir. Yıldız kem, küm edip, afallayacaktır. Bu şekilde yeni programcı yıldızı hafiften ısırabilir ve yıldıza fazla üzerime gelme sinyali verebilir.<strong> Yeni programcı başını dik tutma cesareti gösterdiği andan itibaren, yıldızın davranış biçimi değişecektir</strong>. Kimse karşısında dik duramayan insana saygı göstermez. Yıldıza karşı dik durma yeni programcıya diger ekip arkadaşlarının saygısını getirir.</p>
<p><strong>Ekibin dikkatini ve saygısını kazanmanın diğer bir yolu ekibe bilgi transferi (know-how tranfer) yapmaktır</strong>. Örneğin yeni programcı ekipden diğer bir programcıya &#8220;<em>istersen üstlendiğin yeni görevi test güdümlü (Test Driven) ve eşli (pair programming) kodlayalım, bunun nasıl yapıldığını sana gösterebilirim</em>&#8221; teklifini götürebilir. Böyle bir teklife, konuyla ilgili bilgisi olmayan programcı hayır diyemez. Teklifi alan programcı yeni birşeyler öğrenme hevesi ile yeni programcıya kendini ispatlama firsatını tanıyacaktır. Yeni edindiği bilgiler programcıda hayranlık uyandırır ve bunu mutlaka diğer ekip arkadaşları ile paylaşır.</p>
<p>Her programcının Xing ya da LinkedIn platformlarında mutlaka bir profili olmalıdır. Programcı bu profillerinde hakim olduğu konuları, daha önce çalıştığı projeleri, sahip olduğu ünvan ve sertifikaları ve kendi projelerini (örneğin açık kaynaklı bir yazılım) sergilemelidir. Bu tür profiller artık programcılar için kartvizit ya da vitrin görevini üstlenmektedir. Mülakata giden her programcı hakkında mutlaka internette araştırma yapılır. Bu tür profillerin keşfedilmesi, mülakatın gidişatını olumlu etkileyebilir. Bu tür profillerin önemli başka bir fonksiyonu daha mevcuttur. Yeni programcı ekip içinde yazılmamış, boş bir defter sayfasıdır. Ekip üyelerinin yeni programcı hakkında geniş çaplı fikirleri yoktur. <strong>Bunu değiştirmenin en kolay yolu, ekip üyelerinin internet profillerini araştırmak ve onlara bahsettiğim platformlar üzerinden arkadaşlık teklifi göndermektir</strong>. Arkadaşlık teklifi alan diğer programcılar, yeni programcının profilini inceleme ve onun hakkında fikir edinme fırsatı bulacaklardır. Hele hele yeni programcı ender sertifikalardan birine sahipse, bu yemek aralarındaki sohbetlere malzeme olacak ve bu şekilde yeni programcının ekibe entegrasyonunu kolaylaşacaktır.</p>
<p>Ekip elemanları ile <strong>smalltalk</strong>, onlara çalışma esnasında <strong>tatlı birşeyler ikram etmek</strong> ve ekip liderine düzenli olarak <strong>rapor vermek</strong> sayabileceğim diğer yöntemler arasındadır. Olumlu dikkat çekmek her zaman önemlidir. Yetkin ve tecrübeli bir programcı farkında olmadan yukarda saydığım konularda çalışma yapacaktır. Verimli olmanın en önemli şartı, en kısa sürede ekibe entegre olmaktır. Bunu başarmak programcının elindedir.</p>
<p><em>EOF (End Of Fun)<br />
Özcan Acar</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F05%2F05%2Fekibin-dikkati-ve-saygisi-nasil-kazanilir%2F&amp;linkname=Ekibin%20Dikkati%20ve%20Sayg%C4%B1s%C4%B1%20Nas%C4%B1l%20Kazan%C4%B1l%C4%B1r%3F"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/05/05/ekibin-dikkati-ve-saygisi-nasil-kazanilir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eşli Programlama, Code Review, Code Retreat ve Adada Yaşayan Programcılar</title>
		<link>http://www.kurumsaljava.com/2012/04/15/esli-programlama-code-review-code-retreat-ve-adada-yasayan-programcilar/</link>
		<comments>http://www.kurumsaljava.com/2012/04/15/esli-programlama-code-review-code-retreat-ve-adada-yasayan-programcilar/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 19:54:04 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Yazılım Hakkında Genel Düşünceler]]></category>
		<category><![CDATA[code retreat]]></category>
		<category><![CDATA[code review]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1839</guid>
		<description><![CDATA[<p>Bir programcıyı alıp bir adaya koysanız, diğer insan ve progcılarla bağlantı kurmasını engelleseniz, kendi başına çalışmasını ve kendisini geliştirmesini isteseniz, bu programcı programcılık konusunda nasıl bir gelişme sağlardı? <span id="more-1839"></span></p>
<p>Eğer programcıya o imkanı sağladıysanız ve kitap okuma alışkanlığı varsa bol bol kitap okuyacaktır. Kitap okumaktan canı sıkıldığında kod yazacaktır. Kod yazmaktan canı sıkıldığında tekrar kitap okuyacaktır. Belki de hiçbir şey yapmayacaktır. Adada olduğunu hatırlayıp yüzmeye gidecektir. Gününü gün etmeye çalışacaktır. Bu durum programcıdan programcıya değişecektir. Bu şartlar altında programcının kendisini geliştirebileceğini pek düşünmüyorum. Gelişim için insanlar arası interaksiyon ve iletişim gereklidir. Çoğu zaman başka insanların davranış biçimlerini kopyalayarak gelişim sağlamak bile mümkündür. Sıfır-altı yaş gurubu çocuklarda bunu görmek mümkün; zamanlarının büyük bir kısmını ebeveynlerinin davranışlarını incelemek ve kopyalamakla geçer. Kendi kızımdan bir örnek vereyim. Şimdi iki yaşında. Evin içinde saklanbaç oynuyoruz. O saklandıktan sonra &#8220;baba ben oturma odasında, perdenin arasındayım&#8221; gibi anonslar yapıyor. Gidip, elimle koymuş gibi buluyorum. Kısa bir zaman önce oyunu tersine çevirip, ben saklanmaya başladım ve kızımın beni bulmasını istedim. Ben doğal olarak saklandığım yeri anons etmiyorum. Bu şartlarda kızımın evin içinde beni bulması zorlaşıyor. Ufaklık olayı çakmış, şimdilerde saklandığında &#8220;kızım nerdesin&#8221; diye sormama rağmen, gıkı çıkmıyor. Benden öğrendi ve olayı çaktı. Şimdi bu yazıyı yazarken mouse-pad&#8217;imi kaçırdı. Bir saniye gidip, alıp, geleyim&#8230;. {5 dakika sonra} -Mouse-pad kayıp, bulamıyorum. Nerede kızım diye soruyorum; oturma odasındaki masada, git ara diyor&#8230;</p>
<p>Gerçek hayatta da bazı programcılar bir adada yaşıyor gibi kod yazarlar. Diğer programcılarla bilgi alışverişinde bulunmadan ve kodu paylaşmak zorunda kalmadan işlerini görürler. Projeyi zamanında yetiştirme telaşı bu tip programcıların işine gelir.  Hatta kodu sahiplenirler. Kimse ne yazdığımı anlamasın diye komplike kod yazan programcılar gördüm. Bunun maksadı <b>Job Protection</b> yapmaktır, yani çalıştığı iş yerini korumak ve başkalarına kaptırmamaktır. Ama bu yazımın konusu bu değil. Bu yazımda programcının kendisini geliştirmesi için neden diğer programcılarla interaksiyona girmesi gerekği konusunu incelemek istiyorum.  Adada yaşayan programcılar için söylüyorum: kendi kendilerine kendilerini geliştirmeleri biraz zor gibi görünüyor.</p>
<p>Gelişim için insanlar arası interaksiyonun gerekliliğinden bahsettim. Bu özellikle programcılar için geçerli olan bir durumdur. İnsanlar adeta bir araya gelip beraberce çözüm üretmek için yaratılmıştır. Programcılar da kendi aralarındaki iletişimi ve beraber çalışmayı güçlendirerek, birbirlerinden çok şeyler ögrenebilirler. Eğer konumuz programcıların gelişimi ise o zaman bunun sağlandığı en önemli yerlerden birisi programcılar arası interaksiyondur. Bunun örneklerini <b>eşli programlama (pair programming)</b>, <b>beraber kod inceleme</b> (code review) ve <b>beraber pratik yapma</b> (code retreat) aktiviteleri teşkil eder. Bu aktiviteleri ve programcıya kattığı artı değeri yakından inceleyelim.</p>
<h2>Eşli Programlama (Pair Programming)</h2>
<p>Eşli programlama Extreme Programming (XP) çevik süreci ile popüer olmuş bir programlama aktivitesidir. İki programcı bir araya gelerek, bir müşteri gereksinimini test güdümlü kodlarlar.  Eşli programlama oturumunda programcılar sıkça klayveyi kendi aralarında değişirler. Bu hem fikir alışverişini, hem programcıların birbirlerinden öğrenmelerini, hem de ekipte her programcının proje hakkında aynı bilgiye sahip olmasını teşvik eder. Eşli programlama oturumlarda benim en büyük kazancım, partnerimden onun kullandığı yazılım tekniklerini öğrenerek kendi günlük işlerimde adapte etmem olmuştur. Bu şekilde çok şey öğrendigimi itiraf etmem lazım. Bu yüzden eşli programlama çok severek dahil olduğum bir aktivitedir. Eşli programlama yapan programcılar birbirlerinden farkında olmadan çok şey öğrenmektedirler. Bu programcının şimdiye kadar tanımadığı bir kısa yol tuşundan, değişik tasarım prenbiplerinin nasıl uygulandığına kadar geniş bir yelpazeyi kapsamaktadır.</p>
<p>Eşli programlama pratiği ekibe yeni katılmış ya da tecrübesiz programcıların hızlıca bilgilendirilip, takıma entegre edilme süreçlerini kısaltacaktır. Bu amaca doğru yola çıkılmak istendiğinde tecrübeli bir programcı ile tecrübesiz bir programcı bir araya getirilip, eşli programlama oturumunda bilginin serbestçe akışı sağlanabilir. Eşli programlama sadece bu durumda kullanılır diye bir kural yoktur. Mümkün mertebe her fırsatta uygulanması gereken bir aktivitedir. Eşli programlama metodu, iki programcının aynı işi yaptığı düşünüldüğü için zaman kaybı olarak algılanabilir. İlk etapta bu böyle olsa bile, bu yönde yapılmış olan yatırım projenin başarısına katkıda bulunacaktır. Eşli programlama oturumlarında iki çift göz kodu geliştirdiği için hata oranı daha düşük olacaktır. Bilgi ekip içinde eşit olarak dağıldığından, bir programcının projeden ayrılması proje gidişatını olumsuz yönde etkilemeyecektir. </p>
<h2>Kod İnceleme (Code Review)</h2>
<p>Eşli programlama oturumunda olduğu gibi birden fazla programcı bir araya gelerek bir kod parçasını beraberce incelerler (code review). Genelde bir müşteri gereksinimini kodlamış olan bir programcı çalışmasını tamamladığında, diğer bir çalışma arkadaşını beraberce kod incelemek üzere  kendi çalışma masasına davet eder. Dört göz iki gözden daha fazla görür prensibinden yola çıkarak iki programcı kod parçasını beraberce incelerler. </p>
<p>Geçenlerde yaptığımız bir toplantıda beraber kod inceleme konusunda konuşurken, bir çalışma arkadaşım bu tür aktivitelerden hoşlanmadığını, çünkü parmağıyla bir kod satırını gösterip, burası olmamış demenin, kodu yazan tarafından yanlış algılanabileceğini söyledi. Doğru, bu çogu zaman olan birşey, ama birbirimizden birşeyler ögrenmek istiyorsak, o zaman egomuzu artık bir kenara koymamız gerekiyor. Herşeyi bilmemiz, doğru çalışan kod yazmamız her zaman mümkün değil. Bunu böyle kabul etmemiz gerekiyor. Bir çalışma arkadaşımızın kod inceleme oturumunda yanlışlarımızı yüzümüze vurmasını hakaret olarak değil, bir şans olarak algılamalıyız. Bu gibi durumlarda kendisine hakaret edildiğini düşünen programcı adada yaşayan bir programcıdır. Kendimizi geliştirmek istiyorsak kritiğe açık olmamız gerekiyor.</p>
<h2>Beraber Pratik Yapma (Code Retreat)</h2>
<p><a href="http://coderetreat.org/" target=_blank>Code retreat</a> <b>Corey Haines</b> tarafından başlatılmış, bir tam gün boyunca 15-25 arası programcının bir araya gelerek, beraber kod yazdıkları bir aktivitedir. Böyle bir çalışmaya katılmış olan Ryan Weald bir günde ögrendiklerinin okulda bir sene öğrendiklerinden daha fazla olduğunu söylemekte. Bu tür aktivitelerin programcılar için ne kadar önemli olduğu ortadadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/04/coderetreat.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/04/coderetreat.jpg" alt="" title="coderetreat" width="600" height="166" class="aligncenter size-full wp-image-1942" /></a></p>
<p>Diğer programcılarla interaksiyona girmeyen bir programcı, kendisini daha hızlı geliştirmek için sağlanan avantajlardan mahrum kalacaktır. Buradan çıkardığımız sonuç şudur: Job protection yapanlar aslında bindikleri dalı keseler. Oysaki bilgi paylaşımına açık olan programcılar diğer programcılarla olan ilişkilerinde devamlı yeni birşeyler öğrenerek, kendi piyasa değerlerine değer katarlar.</p>
<p>Adada yaşayan programcılara allah kolaylik versin. İşleri kolay değil.</p>
<p><i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bir programcıyı alıp bir adaya koysanız, diğer insan ve progcılarla bağlantı kurmasını engelleseniz, kendi başına çalışmasını ve kendisini geliştirmesini isteseniz, bu programcı programcılık konusunda nasıl bir gelişme sağlardı? <span id="more-1839"></span></p>
<p>Eğer programcıya o imkanı sağladıysanız ve kitap okuma alışkanlığı varsa bol bol kitap okuyacaktır. Kitap okumaktan canı sıkıldığında kod yazacaktır. Kod yazmaktan canı sıkıldığında tekrar kitap okuyacaktır. Belki de hiçbir şey yapmayacaktır. Adada olduğunu hatırlayıp yüzmeye gidecektir. Gününü gün etmeye çalışacaktır. Bu durum programcıdan programcıya değişecektir. Bu şartlar altında programcının kendisini geliştirebileceğini pek düşünmüyorum. Gelişim için insanlar arası interaksiyon ve iletişim gereklidir. Çoğu zaman başka insanların davranış biçimlerini kopyalayarak gelişim sağlamak bile mümkündür. Sıfır-altı yaş gurubu çocuklarda bunu görmek mümkün; zamanlarının büyük bir kısmını ebeveynlerinin davranışlarını incelemek ve kopyalamakla geçer. Kendi kızımdan bir örnek vereyim. Şimdi iki yaşında. Evin içinde saklanbaç oynuyoruz. O saklandıktan sonra &#8220;baba ben oturma odasında, perdenin arasındayım&#8221; gibi anonslar yapıyor. Gidip, elimle koymuş gibi buluyorum. Kısa bir zaman önce oyunu tersine çevirip, ben saklanmaya başladım ve kızımın beni bulmasını istedim. Ben doğal olarak saklandığım yeri anons etmiyorum. Bu şartlarda kızımın evin içinde beni bulması zorlaşıyor. Ufaklık olayı çakmış, şimdilerde saklandığında &#8220;kızım nerdesin&#8221; diye sormama rağmen, gıkı çıkmıyor. Benden öğrendi ve olayı çaktı. Şimdi bu yazıyı yazarken mouse-pad&#8217;imi kaçırdı. Bir saniye gidip, alıp, geleyim&#8230;. {5 dakika sonra} -Mouse-pad kayıp, bulamıyorum. Nerede kızım diye soruyorum; oturma odasındaki masada, git ara diyor&#8230;</p>
<p>Gerçek hayatta da bazı programcılar bir adada yaşıyor gibi kod yazarlar. Diğer programcılarla bilgi alışverişinde bulunmadan ve kodu paylaşmak zorunda kalmadan işlerini görürler. Projeyi zamanında yetiştirme telaşı bu tip programcıların işine gelir.  Hatta kodu sahiplenirler. Kimse ne yazdığımı anlamasın diye komplike kod yazan programcılar gördüm. Bunun maksadı <b>Job Protection</b> yapmaktır, yani çalıştığı iş yerini korumak ve başkalarına kaptırmamaktır. Ama bu yazımın konusu bu değil. Bu yazımda programcının kendisini geliştirmesi için neden diğer programcılarla interaksiyona girmesi gerekği konusunu incelemek istiyorum.  Adada yaşayan programcılar için söylüyorum: kendi kendilerine kendilerini geliştirmeleri biraz zor gibi görünüyor.</p>
<p>Gelişim için insanlar arası interaksiyonun gerekliliğinden bahsettim. Bu özellikle programcılar için geçerli olan bir durumdur. İnsanlar adeta bir araya gelip beraberce çözüm üretmek için yaratılmıştır. Programcılar da kendi aralarındaki iletişimi ve beraber çalışmayı güçlendirerek, birbirlerinden çok şeyler ögrenebilirler. Eğer konumuz programcıların gelişimi ise o zaman bunun sağlandığı en önemli yerlerden birisi programcılar arası interaksiyondur. Bunun örneklerini <b>eşli programlama (pair programming)</b>, <b>beraber kod inceleme</b> (code review) ve <b>beraber pratik yapma</b> (code retreat) aktiviteleri teşkil eder. Bu aktiviteleri ve programcıya kattığı artı değeri yakından inceleyelim.</p>
<h2>Eşli Programlama (Pair Programming)</h2>
<p>Eşli programlama Extreme Programming (XP) çevik süreci ile popüer olmuş bir programlama aktivitesidir. İki programcı bir araya gelerek, bir müşteri gereksinimini test güdümlü kodlarlar.  Eşli programlama oturumunda programcılar sıkça klayveyi kendi aralarında değişirler. Bu hem fikir alışverişini, hem programcıların birbirlerinden öğrenmelerini, hem de ekipte her programcının proje hakkında aynı bilgiye sahip olmasını teşvik eder. Eşli programlama oturumlarda benim en büyük kazancım, partnerimden onun kullandığı yazılım tekniklerini öğrenerek kendi günlük işlerimde adapte etmem olmuştur. Bu şekilde çok şey öğrendigimi itiraf etmem lazım. Bu yüzden eşli programlama çok severek dahil olduğum bir aktivitedir. Eşli programlama yapan programcılar birbirlerinden farkında olmadan çok şey öğrenmektedirler. Bu programcının şimdiye kadar tanımadığı bir kısa yol tuşundan, değişik tasarım prenbiplerinin nasıl uygulandığına kadar geniş bir yelpazeyi kapsamaktadır.</p>
<p>Eşli programlama pratiği ekibe yeni katılmış ya da tecrübesiz programcıların hızlıca bilgilendirilip, takıma entegre edilme süreçlerini kısaltacaktır. Bu amaca doğru yola çıkılmak istendiğinde tecrübeli bir programcı ile tecrübesiz bir programcı bir araya getirilip, eşli programlama oturumunda bilginin serbestçe akışı sağlanabilir. Eşli programlama sadece bu durumda kullanılır diye bir kural yoktur. Mümkün mertebe her fırsatta uygulanması gereken bir aktivitedir. Eşli programlama metodu, iki programcının aynı işi yaptığı düşünüldüğü için zaman kaybı olarak algılanabilir. İlk etapta bu böyle olsa bile, bu yönde yapılmış olan yatırım projenin başarısına katkıda bulunacaktır. Eşli programlama oturumlarında iki çift göz kodu geliştirdiği için hata oranı daha düşük olacaktır. Bilgi ekip içinde eşit olarak dağıldığından, bir programcının projeden ayrılması proje gidişatını olumsuz yönde etkilemeyecektir. </p>
<h2>Kod İnceleme (Code Review)</h2>
<p>Eşli programlama oturumunda olduğu gibi birden fazla programcı bir araya gelerek bir kod parçasını beraberce incelerler (code review). Genelde bir müşteri gereksinimini kodlamış olan bir programcı çalışmasını tamamladığında, diğer bir çalışma arkadaşını beraberce kod incelemek üzere  kendi çalışma masasına davet eder. Dört göz iki gözden daha fazla görür prensibinden yola çıkarak iki programcı kod parçasını beraberce incelerler. </p>
<p>Geçenlerde yaptığımız bir toplantıda beraber kod inceleme konusunda konuşurken, bir çalışma arkadaşım bu tür aktivitelerden hoşlanmadığını, çünkü parmağıyla bir kod satırını gösterip, burası olmamış demenin, kodu yazan tarafından yanlış algılanabileceğini söyledi. Doğru, bu çogu zaman olan birşey, ama birbirimizden birşeyler ögrenmek istiyorsak, o zaman egomuzu artık bir kenara koymamız gerekiyor. Herşeyi bilmemiz, doğru çalışan kod yazmamız her zaman mümkün değil. Bunu böyle kabul etmemiz gerekiyor. Bir çalışma arkadaşımızın kod inceleme oturumunda yanlışlarımızı yüzümüze vurmasını hakaret olarak değil, bir şans olarak algılamalıyız. Bu gibi durumlarda kendisine hakaret edildiğini düşünen programcı adada yaşayan bir programcıdır. Kendimizi geliştirmek istiyorsak kritiğe açık olmamız gerekiyor.</p>
<h2>Beraber Pratik Yapma (Code Retreat)</h2>
<p><a href="http://coderetreat.org/" target=_blank>Code retreat</a> <b>Corey Haines</b> tarafından başlatılmış, bir tam gün boyunca 15-25 arası programcının bir araya gelerek, beraber kod yazdıkları bir aktivitedir. Böyle bir çalışmaya katılmış olan Ryan Weald bir günde ögrendiklerinin okulda bir sene öğrendiklerinden daha fazla olduğunu söylemekte. Bu tür aktivitelerin programcılar için ne kadar önemli olduğu ortadadır.</p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2012/04/coderetreat.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2012/04/coderetreat.jpg" alt="" title="coderetreat" width="600" height="166" class="aligncenter size-full wp-image-1942" /></a></p>
<p>Diğer programcılarla interaksiyona girmeyen bir programcı, kendisini daha hızlı geliştirmek için sağlanan avantajlardan mahrum kalacaktır. Buradan çıkardığımız sonuç şudur: Job protection yapanlar aslında bindikleri dalı keseler. Oysaki bilgi paylaşımına açık olan programcılar diğer programcılarla olan ilişkilerinde devamlı yeni birşeyler öğrenerek, kendi piyasa değerlerine değer katarlar.</p>
<p>Adada yaşayan programcılara allah kolaylik versin. İşleri kolay değil.</p>
<p><i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2012%2F04%2F15%2Fesli-programlama-code-review-code-retreat-ve-adada-yasayan-programcilar%2F&amp;linkname=E%C5%9Fli%20Programlama%2C%20Code%20Review%2C%20Code%20Retreat%20ve%20Adada%20Ya%C5%9Fayan%20Programc%C4%B1lar"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2012/04/15/esli-programlama-code-review-code-retreat-ve-adada-yasayan-programcilar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

