<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	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/"
	>

<channel>
	<title>M. Aykut Bulgu</title>
	<atom:link href="http://www.mabulgu.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mabulgu.com</link>
	<description>Software Craftsman</description>
	<lastBuildDate>Mon, 25 Apr 2016 16:51:48 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.5.6</generator>
	<item>
		<title>Pratik Yapmanın Önemi</title>
		<link>http://www.mabulgu.com/2016/04/25/pratik-yapmanin-onemi/</link>
		<comments>http://www.mabulgu.com/2016/04/25/pratik-yapmanin-onemi/#respond</comments>
		<pubDate>Mon, 25 Apr 2016 09:18:29 +0000</pubDate>
		<dc:creator><![CDATA[mabulgu]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.mabulgu.com/?p=4</guid>
		<description><![CDATA[Hangi işi yapıyor, hangi sektörde çalışıyor olursak olalım tüm insanların tek bir amacı var. O da yaptığı işi tamamlamak, ve karşılığında para, saygınlık, kendini gerçekleştirme gibi (bkz. Maslow’un ihtiyaçlar hiyerarşisi) ihtiyaçlarını gidermektir şüphesiz. Bir topluluğun çöpçüye de ihtiyacı var, otobüs şöförüne de, radyocuya da, müzisyene de. Öğretmeninden tutun, yazılımcısına, hatta daha da alakasızı, çömlekçisine kadar&#8230;]]></description>
				<content:encoded><![CDATA[<div>
<div>
Hangi işi yapıyor, hangi sektörde çalışıyor olursak olalım tüm insanların tek bir amacı var. O da yaptığı işi tamamlamak, ve karşılığında para, saygınlık, kendini gerçekleştirme gibi (bkz. <a href="http://tr.wikipedia.org/wiki/Maslow_teorisi" target="_blank">Maslow’un ihtiyaçlar hiyerarşisi</a>) ihtiyaçlarını gidermektir şüphesiz.</p>
<p>Bir topluluğun çöpçüye de ihtiyacı var, otobüs şöförüne de, radyocuya da, müzisyene de. Öğretmeninden tutun, yazılımcısına, hatta daha da alakasızı, çömlekçisine kadar her sektörde en az bir kişi, işini iyi ya da kötü yapsın mühim değil, bir toplumun devinebilmesi, yaşam döngüsünü sürdürebilmesi için gerekli.</p>
<p>Peki, “işi iyi ya da kötü yapsın farketmez” dedik, dedik ama “bu sektördeki tüm işler için geçerli mi?” sorusunu sormadık. Bunun net yanıtının “Hayır” olduğunu siz de benim gibi biliyorsunuz. Bazı iş kolları var ki işi doğru yapmak zorunluluğu diğerlerinden daha da fazla. Daha da doğrusunu şöyle ifade etmek gerekirse öyle işler var ki o işin <strong>yapılmış olmasının</strong> tanımı o işi doğru yapmakta yatıyor. Müzisyenlik, çömlekçilik, Aikido hocalığı, atletizm vb. sektörler bahsettiğim iş kollarına birer örnek teşkil etmekte.</p>
<p>&nbsp;</p>
<div><a href="http://www.mabulgu.com/wp-content/uploads/2012/10/paco-de-lucia_63332.jpg" target="_blank"><img style="height: auto;" title="paco-de-lucia_63332" src="Pratik Yapmanın Önemi_files/Image.jpg" width="300" height="199" /></a></div>
<p>Bir müzisyen düşünün. Her gün düzenli pratik yapması gerekir ki işinde daha iyi olabilsin. Gitar dersi aldığım zamanlarda gitar hocam İlker Erköse’nin her gün 2-3 hatta bazen 5 saate kadar pratik yaptığından (ya da yapılması gerektiğinden) bahsettiğini hatırlıyorum. Yine yoğun olarak gitarla ilgilendiğim o sıralar kendimin de önce arpej çalışması, ardından ritm uygulamaları vb. çalışmalarla her gün en az 1 saat pratik yaptığımı ve faydasını gördüğümü belirtmeliyim.</p>
<p>&nbsp;</p>
<div><a href="http://www.mabulgu.com/wp-content/uploads/2012/10/330px-Shihonage.jpg" target="_blank"><img style="height: auto;" title="330px-Shihonage" src="Pratik Yapmanın Önemi_files/Image [1].jpg" width="290" height="300" /></a></div>
<p>Yine pratiğin önemli olduğu bir başka alan ise uzak doğu dövüş sanatları alanı. Aikido yaptığım yıllarda bizim dojo seanslarına katılarak pratik yapmamız yanında, bunu meslek edinmiş olan ustamız bizimle birlikte yaptığı antrenmanlar dışında ekstra pratik yapmak durumundaydı. Aksi halde Dan(seviye) atlayamaz, ya da bize iyi bir şekilde öğretemezdi. Tüm bu pratik yapma konusu atletler, futbolcular, ağır işlerle uğraşan zaanaatkarlar ve sanatın çoğu dalı için de geçerli. Pratik yapmayan futbolcu iyi futbol oynayamaz, saygınlık, para ve başarı kaybı yaşar. Camdan çeşitli eşyalar yapan bir cam üfleme ustası ustalık mertebesine gelebilmek için sizce ne kadar çalışmış, ne kadar pratik yapmıştır? Ve ustalık mertebesinde ilerleyebilmek için daha ne kadar cam üfleyip değişik metodlar deneyecektir?</p>
<p>&nbsp;</p>
<div><a href="http://www.mabulgu.com/wp-content/uploads/2012/10/LIF-BOS-0032.jpg" target="_blank"><img style="height: auto;" title="LIF-BOS-0032" src="Pratik Yapmanın Önemi_files/Image [2].jpg" width="300" height="300" /></a></div>
<p>İşte pratiğin öneminin bu denli fazla olduğunu gördüğümüz bu sektörlerden birisi de bazı kesimlerce zanaat olarak kabul edilen[Bu konuya başka bir yazımda detaylıca değineceğim] <em>Yazılımcılık</em>‘tır.</p>
<p>Biz yazılımcılar işimiz gereği sürekli teknolojiyi takip etmek ve bilgi edinmek zorundayız. Aksi halde teknolojinin artık günlerle değil saatlerle ifade edilen değişim hızına ayak uyduramayız. Ancak bilgi edinmek maalesef yetmiyor. Edinilen bilgiyi ezberden <em>öğrenilen</em>e aktarmak gerek. Bu da ancak pratik yapmakla oluyor. Adı, sanı yeni öğrenilmiş, ya da uzun zamandır duyulup da teoride bilinen bir teknolojinin, bir uygulama çatısının, bir açık kaynak API’nin vs. kütüphanelerini indirerek tabiri caizse oyuncak lego setiymişcesine oynamak yazılımcı için bir zorunluluk, zorunluluktan da öte bir hobi olmalıdır.</p>
<p>Bunların da yanında bilgi edinme ve o bilgiyi uygulama kısmını bir kenara bırakırsak yazılımcılık, kendi başına usul bakımından içinde birçok teknik ve şablonu barındırdığından pratik yapmak kaçınılmazdır. Örneğin <a href="http://www.kurumsaljava.com/" target="_blank">Özcan Acar Hoca</a>‘nın <a href="http://www.kurumsaljava.com/2012/04/07/kod-kata-ve-pratik-yapmanin-onemi/" target="_blank">Kod Kata ve Pratik Yapmanın Önemi</a> adlı makalesinde de belirttiği  IDE kısayolları, test güdümlü programlama, refactoring teknikleri vb. konular ancak iyi, planlı pratik yapılarak pekiştirilebilir.</p>
<p>“Ben zaten şirkette öğreneceğimi öğreniyorum,pratiğimi de orada yapıyorum” diyen yazılımcı arkadaşlarımı duyar gibiyim. Özcan Hoca yukarıda bahsettiğim makalesinde bu konuya şöyle değinmiş:</p>
<blockquote><p>Müzisyenler performans ve pratik yapma arasında ayrım yaparlar. Biz programcılar yapmayız! Müzisyenler için sahnede olmak performans yapmaktır. Programcılar için de iş yerine giderek kod yazmak performanstır. Müzisyenler düzenli olarak sahne harici pratik yaparlar. Biz programcılar yapmayız. İş yerinde yazdığımız kodları pratik yapmak olarak algılarız. Çok iyi müzisyenler pratik yapmaya çok önem verirler ve daima saatler boyu bu konuda çalışırlar. Bu yüzden sahnede çok muazzam bir performans ortaya koyarlar, çünkü yaptıkları pratikler onların sular seller gibi müzik yapmalarını sağlar. Biz programcılar pratik eksikliğinden dolayı zaman zaman kod yazmakta zorlanırız. Sular seller gibi program yazamayız, çünkü pratik yapma özürlüyüzdür. Pratik yapmanın ne olduğunu tam olarak bilmeyiz ve performansla pratiği birbirine karıştırırız. Bu yüzden ustalaşma sürecimiz zora girer. Orta halli idare edip gideriz. İçinde çalıştığımız projeler bizi sanki orta halde tutmak için ağız birliği yapmış gibidir. Proje yöneticilerinin ya da iş verenlerin, programcıların orta halden ustalığa geçmesi için çaba sarfettikleri enderdir. Doğruyu söylemek gerekirse biz onlar için kağıt üzerinden sağa sola kaydırdıkları kaynaklardan başka birşey değillizdir. Belki de çok iyi olmamızı bile istemezler, çünkü daha fazla maaş isteme ya da daha iyi bir iş bulma fikri aklımıza gelebilir. Bu yüzden ustalaşma sürecinde onlardan medet ummak doğru değildir. Kendi başımızın çaresine bakmamız gerekir.</p></blockquote>
<p>Yani olay tamamiyle yazılımcının, müzisyenin yaptığı pratik-performans ayrımını yapmasında yatıyor. Konuyla ilgili geçenlerde okuduğum bir <a href="http://www.codinghorror.com/blog/2008/06/the-ultimate-code-kata.html" target="_blank">makalede</a> yine aynı konudan bahsedilerek her gün işe arabayla gitmenin nasıl bizi profesyonel bir sürücü yapmayacaksa hergün iş yerinde program yazmanın da bizi iyi bir programcı yapmayacağından, ve iyi bir programcı olabilmek için fit bir vücuda sahip bir sporcunun her zaman yaptığı gibi pratik yapmak gerektiğinden söz ediyor ve yazılımcı için en uygun pratiğin Özcan Hoca’nın makalesinde belirttiği gibi <a href="http://en.wikipedia.org/wiki/Kata_%28programming%29" target="_blank">kod kataları</a> olduğunun altını çiziyor.</p>
<p>Peki nedir bu kata?</p>
<p>Kata Japon dövüş sanatlarındaki anlamıyla bazı temel hareketleri düzenli olarak tekrar edip <a href="http://tr.wikipedia.org/wiki/Refleks" target="_blank">kazanılmış refleks</a> haline getirip içselleştirme, otomatikleştirme demektir. Aikido yaptığım zamanlarda ben de özellikle Jo adı verilen uzun sopa ile <em>Jo 31 Kata</em> yapmış, her tekrarımdan sonra hareketlerimin otomatikleştiğini hissetmiştim. Nitekim şu anda aradan 3-4 yıl geçmesine rağmen aynı hareketleri gözüm kapalı tekrarlayabilirim. Bunu sağlayan da çalışmam, uygulamam yani pratik yapmamdı.</p>
<p>İşte bütün bu <em>içselleştirme</em> ve <em>kazanılmış refleks haline getirme</em> modelini yazılımcılığa uyguladığımızda ortaya yazılımcılar için bir kod kata benzetmesi çıkıyor. Kod kataları çeşitli algoritmaların ya da program parçacıklarının önceden belirlenmiş TDD ya da refactoring yöntemleri ile aynı Karate ya da Aikido kataları gibi belirli şablonları izleyerek yazılıp pratik edilmesi işlemidir. Katalardan bazılarına <a href="http://www.codekata.com/" target="_blank">http://www.codekata.com/</a>, <a href="http://content.codersdojo.org/home/" target="_blank">http://content.codersdojo.org/home/</a>, <a href="http://www.kodkata.com/" target="_blank">http://www.kodkata.com</a> adreslerinden gerek döküman gerekse screencast şeklinde ulaşabilirsiniz.</p>
<p>Yazılımcı işte bu kataları uygulayarak zihninde daha önce istemle yaptığı, refleksleştiremediği yukarıda da bahsettiğim bazı temel programlama becerilerini otomatize ederek istemsizleştirebilir ve  iş hayatındaki baskı-stres durumlarında rahatlıkla bu becerilerden yararlanabilir. Bu konuda Özcan Acar  şöyle diyor:</p>
<blockquote><p>Yeniden yapılandırma (refactoring) kataları yapan bir programcı bir switch komutunu ya da bir for düngüsünü nasıl yok edeceğini ya da yeniden yapılandıracağını bilir. Bu konuda tecrübesiz bir programcı genelde switch komutunun kullanılmasını bir sorun olarak bile algılamayabilir. Bunu sorun olarak algılasa bile bir switch komutunu nesneye yönelik programlama teknikleri kullanarak ortadan kaldırmada zorlanabilir. Buna karşın bu konuda pratik yapmış bir programcı hiç gözünün yaşına bakmadan switch komutunu dakikalar içinde yok edecek ve kodu bakımı ve geliştirilmesi daha kolay bir hale getirecektir. Pratik yapmış programcı için başka bir alternatif yoktur; switch komutunu görür görmez beyni ne yapması gerektiğini bilir; programcı hemen harekete geçer. Buradan yola çıkarak yıllar içinde farkında olmadan geliştirdiğimiz bazı yöntem ve kalıpların neden verimsiz program yazmamıza sebep olduklarına değinmek istiyorum. Hiç zaman yetersizliğinden dolayı çok hızlı bir şekilde program yazmak zorunda kaldınız mı? Böyle bir durumda nasıl kod yazıyorsunuz? Kullandığınız yöntem ve kalıplar nelerdir? Burada tasarım kalıplarından (design pattern) bahsetmiyorum. Değinmek istediğim daha çok beyninizde hangi mekanizmaların çalıştığı ve ellerindenizden hangi kod satırlarının nasıl döküldüğü. Ben kendimdem örnek vereyim. Kata, refactoring ve diğer yazılım tekniklerine kullanmadan önce oluşturduğum sınıflar ve metotlar binlerce ya da yüzlerce satırdan oluşmakta idi. Özellikle sürüm zamanı yaklaşmaya başlayınca panik olur, saçma sapan, ama en azından çalışan kod yazardım. İki gün sonra yazdığım kodları okuduğumda bu kadar kötü mü yazılır kod diye hayretlere düşerdim. Test sınıfları oluşturmamam da cabasıydı. Programcı bu gibi durumlarda ister istemez yıllarca farkında olmadan geliştirdiği ve öyle pekte verimli olmayan yöntemlerine geri döner. Normal şartlar altında özenle seçilen sınıf, metot ve değişken isimleri, zor şartlar altında artık pek önemsenmez, çünkü stresten dolayı ve günü kurtarmamız gerektiği için otomatik olarak beynimizdeki verimli olmayan mekanizmalar devreye girer. Bu davranışı hayatı tehlikede olan bir canlı ile kıyaslayabiliriz. Canlı kendini tehlikede hissettiği anda iç güdüleri ile haraket edip, tehlikeden uzaklaşmaya çalışacaktır. İnsanlarda da durum farklı değildir. Kendimizi tehlikede hissettiğimiz zaman ya da hayatımızı kaybetme rizikosuyla karşılaştığımızda beynimiz adrenalin hormonunu salgılar. Panik oluruz, ama iç güdüsel davranarak tehlikeye karşı koymaya çalışırız. Bu esnada beynimizde çalışan programlara hükmetmemiz hemen hemen imkansızdır. Onlar otomatik olarak çalışır ve bizim teklikeye karşı koymamızı sağlarlar. Aynı şekilde stres altında olan programcı da iç güdüsel hareket edecek ve daha önce geliştirdiği ve kullandığı tehlikeden kurtulma rutinleri devreye girecektir. Programcı bir an önce çalışan bir kod oluşturmak istiyecek ve bunun için sahip olduğu tüm prensipleri ayaklar altına alacaktır. Böylece okunması çok güç yüzlerce, binlerce satırdan oluşan metotlar, sınıflar oluşacaktır. Bu programcının gücüne gitmez, çünkü kendisi de farkında olmadan böyle çalışmak zorunda kalmıştır. Oysaki programcı sık pratik yapmış olsa böyle yapıların oluşması mümkün değildir. Neden? Kod kataları programcının beynini bir nevi yeniden programlar. Kod kataları programcının beyninde yeni kalıpların ve mekanizmaların oluşmasını sağlar. Programcı strese girdiğinde bu yeni mekanizmalar devreye girer. Aynı gitar çalan usta bir gitaristin parmaklarını farkında olmadan perdeler üzerinde oynatması gibi programcı da edindiği yeni mekanizmaları otomatik olarak kullanmaya başlar. Katacı programcı metotların uzun olmasına izin vermez, metot, sınıf ve değişken isimlerini yine özenle seçer, beyni programcıyı devamlı bu yönde çalışmaya zorlar, çünkü programcının beyninde yaptığı katalar ile yeni bir repertuar oluşmuştur ve beyin bunları otomatik olarak kullanmaya başlar. Kullanılan eski yöntemler kaybolur ve programcı stres altında bile çok verimli olabilir. Beyinde bu repertuarı oluşturmak için kod katası yapmak gerekiyor.</p></blockquote>
<p>Görüldüğü üzere kod pratiği yapmak, bunu bir alışkanlık haline getirmek gerek iş hayatında gerekse yazılımcının kişisel gelişiminde oldukça büyük rol oynuyor. Yazılımcının pratik yapmadığında yönetemeyip de geçici çözümler bulup <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank">temiz kod</a> yaklaşımından fazlaca uzaklaştığı acil, stres dolu durumlar, düzenli pratik yapıldığında daha kolay yönetilebilir ve üstesinden gelinebilir oluyor. Bu da dik, engebeli bir yolda bisiklete binmeyi öğrenmeye çalışıp, başaramayıp bisiklet yana alınarak binemeden bisikletle birlikte yürüyerek gitmeye benziyor. Öncesinde istemli hareketi reflekse dönüştürecek basit, temel işler yapılmalı. Yani öncekine göre kısmen düz bir yola çıkılıp bisiklete binme işlemi iyice refleksleşene kadar pratik yapmak gerekiyor. Ardından zaten temel bilgiler zihinde otomatize edildiğinden en engebeli, dik yolda bile önceden öğrenilenler otomatikman devreye girip tabiri caizse hayat kurtarıyor. Ki zaten bu mekanizmanın kendisi, yani istemli yapılan işlerin pratik yaptıkça refleksleşmesi, bir hayat kurtarma mekanizması değil mi?</p>
<p>&nbsp;</p>
<div><a href="http://www.mabulgu.com/wp-content/uploads/2012/10/bisiklet.jpg" target="_blank"><img style="height: auto;" title="bisiklet" src="Pratik Yapmanın Önemi_files/Image [3].jpg" width="300" height="300" /></a></div>
<p>Özetle şunu diyebilirim ki kod kataları yapmak, yazımın başlarında bahsettiğim gibi pratiğin başka bir şekli olan yap-boz ya da legoymuşcasına -özellikle açık kaynak olan- <a href="http://ofps.oreilly.com/titles/9780596518387/perpetual_learning.html#breakable_toys" target="_blank">API veya kütüphanelerle oynamak</a> veya bunları çeşitli demo projelerde kullanmak, öğrenmek ve pekiştirmek için efor sarfetmek yazılımcı için bir zorunluluk, zorunluluktan da öte bir hobi olmalıdır. Sarfedilmesi gereken bu efor ile ilgili StackExchange kurucularından Jeff Atwood bir makalesinde şöyle demiş:</p>
<blockquote><p>Effortful study means constantly tackling problems at the very edge of your ability. Stuff you may have a high probability of failing at. Unless you’re <a href="http://www.codinghorror.com/blog/archives/000300.html" target="_blank">failing some of the time</a>, you’re probably not growing professionally. You have to seek out those challenges and push yourself beyond your comfort limit.</p></blockquote>
<p>Türkçesi:</p>
<blockquote><p>Efor sarfederek çalışmak, yeteneklerini en uç noktasına kadar kullanarak sürekli olarak sorunların üstesinden gelmektir. Başarısız olma olasılığımız yüksek olan durumlar olabilir. Arada sırada da olsa başarısız olmamak demek, muhtemelen profesyonel anlamda gelişmediğinizin göstergesidir. Meydan okuyacak şeyler aramanız, kendinizi rahatlık limitinizin dışına çıkarmanız gerekmektedir.</p></blockquote>
<p>Pratik yapalım, uygulayalım, deneyelim, öyle öğrenelim, benimseyelim ve refleksleştirelim. Aksi halde  <em>rahatlık limit</em>‘imizi (<a href="http://www.kurumsaljava.com/2012/08/12/aci-cekmeden-ustad-olunmaz/" target="_blank">comfort zone</a>) aşamaz, burada sıkışıp kalırız.</p>
</div>
<p>&nbsp;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mabulgu.com/2016/04/25/pratik-yapmanin-onemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
