Kategori arşivi: Kişisel Gelişim

Yeni Teknolojileri Öğrenme Konusunda Nasıl Bir Yol Haritası Oluşturmalıyım?

Birçok okurumdan bu ve buna benzer sorular aldığım için bu konuyu aydınlatmak adına bu yazıyı kaleme almak istedim.

Bilindiği üzere yazılım sektörü çok hızlı teknolojik gelişmelere sahne olmakta. Kullanıma sunulan yeni programlama dilleri, çatı ve yöntemlerin sayısı çok yüksek. Doğal olarak yazılımcılar işin neresinden tutmalıyım ya da başlamalıyım, hangi konulara ağırlık vermeliyim, neleri öğrenmeliyim gibi sorularla karşılaşmaktalar. Bu yazımda bu tür sorulara kendim için nasıl cevap bulduğumu aktarmak istiyorum. Vermek istediğim örnek bir nevi öğrenim ve kişisel gelişim konusundaki benim yol haritam.

Ben öncelikle öğrenmem gereken şeyleri somut olanlar ve soyut olanlar olarak ikiye ayırıyorum. Soyut olan tarafta genel yazılım prensip ve yöntemleri yer alıyor. Soyut olan bu yapılar genel olarak yazılımın temel prensiplerini oluşturmakta. Bu temelleri oluşturmadan sağlam bir bilgi hazinesinin inşa edilmesi hemen hemen olanaksız. Örneğin nesneye yönelik programlama teknikleri, ayrık matematik, soyutlama yeteneği, tasarım prensipleri, tasarım şablonları gibi konular benim icin geçerliliğini hiçbir zaman yitirmeyen ve yazılıma genel ve soyut bir çerceveden bakmamı sağlayan konulardır. Yazılım alanındaki bilgi ve teknoloji genişliğine baktığımızda, bahsetmiş olduğum soyut konular bu büyüklüğün çok küçük bir kısmını oluşturmaktadırlar. Geriye kalan da zaten yeni diller, yeni çatılar, bu çatıların yeni sürümleri vb. gibi konulardan oluşmaktadır.

Soyut olarak tanımladığım ve yazılımın temellerini oluşturan konuların ihtisası büyük önem taşımaktadır. Örneğin yazılım prensiplerine hakim olmak, onları herhangi bir dilde uygulanabilir hale getirmektedir. Bu konuya hakim olan bir yazılımcı “acaba yazılım prensiplerinin bir sonraki sürümü nasıl olacak” kaygısı taşımayacaktır. Evrensel geçerliliği olan bu konu büyük çapta bir değişikliğe uğramadan, varlığını sürdürecek ve yazılımcının yazılıma genel bir çerceveden bakmasını kolaylaştıracaktır. Soyut konular ve onların ihtisası ile bahsetmek istediğim asıl nokta budur, onların evrensel geçerliliğe sahip ve her ortamda ve programlama dili ile uygulanabilir olmaları.

Soyutluğu işin felsefesi olarak algılayabiliriz. Bu gibi yapıları bir interface sınıf olarak düşünebiliriz. Java gibi dillerde sıkça kullanılan ve soyut sınıflar olan interface sınıflar bir işin nasıl yapıldığından ziyade ne yapılması gerektiğini tanımlayan sınıflardır. Bu sınıflar bünyesinde soyut işlemler yer alır. Bunların nasıl implemente edilecekleri implementasyon sınıflarına bırakılmıştır. Bu analogiden yola çıkarsak, piyasada bulunan bu kadar bilgi kirliliği (çatılar, onların yeni sürümleri ve diğer teknolojik araç ve gereçler) soyut konuları taban alan somut implementasyonlardan ibarettirler.

Somut teknolojileri doğuran ve ileriye götüren yazılım sahasındaki soyut felsefelerdir. Bu felsefeleri anlamadan somut teknolojilere yönelmek verimli sonuçlar doğurmayacaktır. Bu sebepten dolayı yazılımcının öğrenmesi gerektiği konularda soyutluğa ve işin felsefesini ihtiva eden konulara öncelik vermesinde fayda bulunmaktadır. Bu konuyu kaleme aldığım yazıma bu link üzerinden ulaşabilirsiniz.

Doğal olarak işin sadece felsefesine hakim olmak, karın doyurucu nitelikte olmayabilir. Sonuç itibari ile programcı günlük iş hayatında bir takım somut araç, gereç, dil ve diğer yapılar ile irtibat halindedir. Somut yapılarda meydana gelen değişiklikleri programcı nasıl takip etmelidir?

Bu sorunun cevabını piyasa belirlemektedir. Piyasa ne isterse, onu alır. Bu yüzden somut konuların öğreniminde programcı piyasa ihtiyaçlarına paralel bir öğrenim haritası oluşturmalıdır. Örneğin tasarım prensip ve şablonlarının somut bir implementasyonu olan spring çatısı piyasada çok rağbet gören bir çatı haline gelmiştir. Bunun gibi nesneye yönelik programlama tekniklerinin uygulanabildiği java dili aynı konumdadır. Bir ara hype olan ve artık adından fazla bahsedilmeyen scala popülerliğini yitirmek üzeredir. Piyasa kendi ihtiyaçları doğrultusunda somut yapıların gelişim ve kullanımına yön vermektedir. Programcının yapması gereken tek şey, piyasa ihtiyaçlarini takip etmek ve kişisel gelişim yol haritasını buna göre adapte etmektir. Piyasanın sahip olduğu ihtiyaçları takip etmek için güncel iş ilanlarına bakmak yeterli olacaktır.

Bunun yanı sıra programcının yazılım sahasında oluşan trendleri iyi analiz ederek, gitmek istediği yönü adapte etmesi, ileride yazılımcı olarak bulunduğu mevkiyi koruması açısından faydalı olacaktır. Bu tür trendler yine piyasa ihtiyaçları doğrultusunda oluşma eğilimi göstermektedirler. Örneğin günümüzde javascript bazlı frontend projelerinde, kodun bakım ve geliştirilebilirliğini artırmak adına backend yöntemlerini kullanma eğilimi oluşmaya başlamıştır. Bunun en güzel örneğini Angular çatısı oluşturmaktadır. Bunun yanı sıra fullstack developer isminde yeni bir yazılımcı türü aranmaktadır. Proje sahipleri giderleri azaltmak adına hem frontend hem backend yazılım yapabilecek nitelikte yazılımcılar aramaktadırlar. Bu trendleri takip etmeyen bir yazılımcı, kısa zaman sonra sadece bir konuda uzman oldugu için işsiz kalma sorunu ile karşı karşıya kalabilecektir

Kanımca yazilim sektöründe oluşan teknolojik balonun büyüklüğü yazılımcıları tedirgin edecek boyutta değildir. Bu balon çok büyük gibi görünsede, büyük bir bölümünü somut yapılar oluşturmaktadır. Yazılımcılar işin temelinde yatan prensiplere ağırlık verdikleri ve piyasada olup, bitenleri takip ettikleri sürece, yeni gelişmelere her zaman ayak uydurabilme konumunda olacaklardır.


EOF (End Of Fun)
Özcan Acar

Neden Kafam Bu Kadar Rahat?

Kişisel Gelişim başlıklı yazımda kullandığım metot ve araçlardan bahsetmiştim. Bu yazımda çok faydalı bulduğum bir aracı daha tanıtmak istiyorum.

Yazının devamını okumadan önce sizden şunu yapmanızı rica ediyorum: Kağıt kalem kullanarak ya da bilgisayarınızda bir editör açarak yapmanız gereken şeylerin listesini çıkarın. Bu liste içinde mesai bitiminde sonra bakkaldan alacağınız ekmekten, iki hafta sonraki diş hekimi randevunuza kadar her şey yer alabilir. Önemli olan aklınızda tutmaya çalıştıklarınızı listeye dökmenizdir. Siz listenizi oluştururken, ben bekliyor olacağım…..

Listenizi görmedim, lakin listenizde en az 5, en kötü ihtimalle 20 başlığın olduğunu tahmin edebiliyorum. Aynı şeyi ben de üç gün önce tekrar yaptım ve kafamda 15 değişik şeyin yapılmak üzere beklediğini gördüm ve şok oldum.

Her insan kafasında ortalama 10-15 şeyle gün içinde yapması gereken işlerin üstesinden gelmeye çalışıyor. Bunun ne kadar verimsiz bir girişim olduğunu kendi edindiğim tecrübelerden biliyorum. Kafaların böyle yapılacak işlerle yüklü olması, verimli bir şekilde bir işe odaklanılmasının önündeki en büyük engellerden birisi. Çoğu zaman nedense akla gelen daha önemli bir işten dolayı üzerinde çalışılan iş yarıda bırakılıyor. Bunun tek sebebini kafada yapılacak işlerin cirit atması olarak görüyorum.

Her aktiviteyi akılda tutmak, ne zaman neyin yapılması gerektiğini organize etmeye çalışmak beyin için çok yorucu bir işlem. Beyin devamlı böyle yarım kalmış aktivitelerle haşır neşir ve onların nasıl üstesinden geleceğinin planını yapıyor. Bundan kurtulmanın ve beyni rahatlatmanın en verimli yöntemi, yapılacak işlerin bir listesini oluşturmak ve beyinden bu organizasyon yükünü uzaklaştırmak.

Ben bu işlem için daha önce Kanban panonsu kullanıyordum. Geçenlerde Any.do isminde yeni bir uygulama keşfettim. Bu yazımda bu uygulamayı size tanıtmak istiyorum.

bbbb

Any.do hem web üzerinden hem de akıllı telefonda app olarak kullanabileceğiniz basit bir “yapılacak şeylerin listesi” uygulaması. Oluşturduğum listeye internet erişimi olan herhangi bir bilgisayardan ulaşabiliyorum. Bu şekilde listemi bir bilgisayardan başka bir bilgisayara taşımam gerekmiyor. Özellikle cep telefonları için hazırlamış uygulamanın çok faydalı olduğunu gördüm. Kanban panosunu kullanırken bunun eksikliğini hissetmiştim. Cep telefonumda bir app olmadığı için kanban panomda olup, bitenleri takip etmem zor oluyordu. Gözden ırak olan, gönülden ırak olur misali bir zaman sonra kanban panosunun bir kopyasını kafamda oluşturup, işlerimi yine eski yöntemlerimle takip etmeye çalışıyordum. Taaki Any.do ile tanışana kadar.

Aklıma yapmam gereken bir şeyler geldiğinde, hemen cep telefonum aracılığı ile aktivite listemde yeni bir kayıt oluşturuyorum. Cep telefonum devamlı yanımda olduğu için olup, bitenleri takim etmem kolaylaşıyor. Any.do gerekli uyarıları yaparak, işleri takip etmemi kolaylaştırıyor.

Any.do nun birde Chrom eklentisi mevcut. Özellikle gelen e-postaların başlıklarını yapılacak iş listesine kaydetmek birçok yazışmadan dogan işleri takip etmeyi çok kolaylaştırıyor.

aaa

Aklımda artık yapmam gereken şeyler konusunda hiçbir kayıt yok. Yapmam gereken işlerin izini beynim değil, cep telefonum ve kullandığım bilgisayarlar sürüyor. “Kafam çok rahat“ sözünün tam olarak ne anlama geldiğini şimdi anlamış oldum :)

Kendinize bir iyilik yapmak istiyorsanız, Any.do uygulamasana bir göz atmanızı tavsiye ederim. Bu konudaki tecrübelerinizi bizimle paylaşın.


EOF (End Of Fun)
Özcan Acar

Kataların Eşli Programlanması

Yaptığım kataları KodKata.com‘da sizinle paylaştım. Her gün düzenli olarak kod katalarımı yapıyorum. Her gün değişik bir kata yapmaya gayret ediyorum. Kataları tekrarladıkça katanın öngürdüğü birçok işlem benim için rutinleşiyor. Zaman zaman katanın öngördüğü yoldan saparak, başka şeyler deniyorum. Bu yeni bir tasarım kararı olabiliyor ya da yeni bir refactoring metotunun kullanımı. Okumaya devam et →

Kişisel Gelişim

Bir programcının tipik bir haftasının kırk saati patronu için çalışmakla geçer. Daha önceki bir yazımda bir programcının mesai saatlerinde kendisini geliştirmesinin mümkün olmadığını, ama mesai haricinde pratik yaparak programcılık yeteneğini geliştirmesi gerektiğinden bahsetmiştim. Gel gelelim günde sekiz saat çalıştıktan sonra eve gelip, pratik yapmak ya da kitap okumak kolay bir şey olmayabilir. Yemek yedikten ve biraz televizyon seyrettikten sonra kişisel gelişim için gerekli motivasyon tabana vurabilir. Bu çok doğal bir şey. Bu sebepten dolayı kimse kendisine kızmamalıdır. Daha ziyade insan kendisine bu kısır döngüyü nasıl kırabilirim sorusunu sormalıdır.

Kişisel gelişim için hiç zaman yokmuş gibi görünse de, bu doğru değildir. Mesai saatlerini çıkardığımızda geriye 128 saat kalmaktadır, yani tam tamına 5.3 gün. Bu zaman dilimine kocaman bir dünyayı sığdırabiliriz, yeterki zaman yönetimini iyi yapabilelim.

Öncelikle kişisel anlamda bize bir fayda sağlamadan geçip, giden zaman dilimlerine bir göz atalım. Bu zaman dilimlerini kişisel gelişim için nasıl kullanabiliriz, onu da akabinde inceleyelim.

Eğer programcı binek otosuyla ile işe gidiyorsa, her gün ortamala 1-3 saatini anlamsız bir şekilde israf etmektedir. Programcı eğer mümkünse toplu taşıma araçlarını kullanarak işe gidip, gelmelidir. Bu şekilde yolculuk esnasında bir kitap okuyabilir ya da akıllı telefonu ya da tableti ile ilgilendiği konuda bir sunum seyredebilir. Bu şekilde her hafta bir kitabı bitirmek mümkündür.

Gelelim öğle aralarına. Kimin akıllı bir telefonu yok, el kaldırsın! Evet, herkesin varmış. O zaman akıllı telefonumuzu kişisel gelişim aracına çevirelim. Öğle aralarında bir programcı akıllı telefonu üzerinden ilginç bulup, takip ettiği blogları okuyabilir ya da sektörün önderliğini yapan kişilerin sunumlarını seyredebilir. Mesai arkadaşları ile lak lak yapmak yerine, her gün bir saatlik bir zaman dilimi kişisel gelişim için kullanılabilir. Yemek yerken bir blog okumak ya da sunum seyretmek düşünüldüğünden daha kolaydır.

Gelelim işin zor kısmına. Mesaiden eve döndükten sonra, motivasyon sorunumu nasıl çözerim? Yapılacak işi gözde büyütmeyerek ve küçük parçalara bölerek. Eğer yeni bir kitabı okumaya başladıysam, büyük bir ihtimalle motivasyonum ilk yirmi sayfa için yeter. Kitabın geri kalan beş yüz sayfasını okuyabilmek için motivasyonumu geri getirici bir taktik geliştirmem gerekir. Bunu sağlamak için Promodoro tekniğinden (http://www.pomodorotechnique.com/) faydalanılabilir. Ne yazık ki insanlar en fazla yarım saat, bilemediniz bir saat tam konsantre çalışabilir. Bu zaman dilimi dolduktan sonra beyin ara vermek için bahaneler uydurmaya başlar. Bu bize motivasyon eksikliği gibi yansır, ama sorunu ufak bir ara vererek çözebiliriz. Promodoro tekniğinde planlanan aktiviteler yirmi beş ya da otuz dakikalık birimlere bölünür. Örneğin iki saat ara vermeden kitap okumak yerine, okuma süreci otuz dakika uzunluğunda dört seansa bölünür. Her seans başında bir çalar saat otuz dakika sonra çalacak şekilde ayarlanır ve yapılmak istenen aktiviteye konsantre olunur. Seans süresince sadece seçilen aktiviteye konsantre olunması gereklidir. Eğer konsantreyi bozan yan etkiler tespit edilirse, bunların seans esnasında bir kenara not edilerek, daha sonra analiz edilmelerinde fayda vardır. Örneğin Promodoro seansında telefon çalıyorsa, bir sonraki seansta telefon kapatılmalıdır.

Her Promodoro seansından sonra beş dakikalık ara verilerek, beyin dinlendirilmelidir. Bu tarz aktivite yapılandırması kişisel gelişim için atılması gereken adımların daha kolay hazmedilmesini sağlar. Kişi her Promodoro seansından sonra verimli bir şeyler yaptığı hissine sahip olarak kişisel gelişimine katkıda bulunacaktır.

Kişisel gelişimi daha verimli ve istikrarlı bir hale getirmek için kisisel gelişim projeleri hazırlanabilir ve uygulanabilir. Bunun Promodoro ve Scrum kombine edilerek nasıl yapılabileceğini değinmek istiyorum.

Scrum çevik projeleri yönetmek için kullanılan bir metotdur. Proje bünyesindeki aktiviteler bir ya da iki haftalık Sprint ismi verilen zaman birimlerine bölünür. Sprint öncesi, o Sprint bünyesinde yapılmak istenen aktiviteler tespit edilir. Seçilen aktivitelerin Sprint bünyesinde tamamlanacak nitelikte olması gereklidir. Programcılar tahminlerde bulunarak, Sprint bünyesinde yer alacak aktivitelerin seçilmesine katkıda bulunurlar. Programcılar ayrıca seçilen aktivitelerin Sprint bünyesinde tamamlanmalarından sorumludurlar.

Kişisel gelişimimizi de bir proje olarak el alırsak, bu projeyi organize etmek için kişisel Scrum’dan (personal Scrum) faydalanabiliriz. Scrum bünyesinde gerçekleştirmek istediğimiz aktiviteler, kişisel gelişim aktivitelerimiz olacaktır. Bu aktiviteleri not ederek, bir aktivite listesi oluşturmakta fayda vardır. Bu aktivite listesinde örneğin okunacak kitaplar ve bloglar, yapılacak kod kataları, izlenecek eğitim videoları ve diğer kişisel gelişim için gerekli olduğunu düşündüğümüz aktiviteler yer alabilir.

Aktivite listesini oluşturduktan sonra Sprint planlamasına geçilebilir. Her Sprint belirli bir zaman dilimini kapsar. Bu zaman diliminde üzerinde çalışılacak aktiviteler seçilir ve Sprint başlatılır. Örneğin bir Sprint süresini bir hafta olarak seçti isem, o zaman bu Sprint bünyesinde bu bir haftalık zaman diliminde üstesinden gelebileceğim kadar aktivite tanımlaması ve seçimi yapmam gerekir. Bir haftalık Sprint süresi benim bu bir hafta içinde kişisel gelişimim için ayırmak istediğim zaman dilimini kapsayacaktır. Örneğin her gün iki saat kişisel gelişimim için ayırmayı düşünüyorsam, bir haftalık Sprint toplamda 10 saatlik çalışma planlamasını ihtiva eder (on saat, çünkü beş iş günü).

Seçilen aktivitelerin yarım saat ile en fazla üç saat içinde tamamlanabilecek türde olmasına dikkat edilmelidir. Örneğin üç saat süren bir aktiviteyi bir çırpıda tamamlamak mümkün olamayacağı için, bu tür aktiviteleri yarım saatlik Promodoro seanslarına bölmekte fayda vardır. Söz konusu bir kitabı okunamak olduğunda aktivite planlaması nasıl yapılmalıdır? Bir aktivitenin en fazla üç saat içinde tamamlanabilir yapıda olması gerektiğini yazmıştım. Bir kitap büyük bir ihtimalle üç saat içinde okunamayacağı için, kitabı okuma işleminin alt aktivitelere bölünmesinde fayda vardır. Örneğin kitabın her bir bölümü için ayrı bir aktivite tanımlanabilir. Böylece en fazla aktivite uzunluğu olan üç saat aşılmamış olur.

Sprint ve aktivite yönetimi için bir Kanban panosu kullanılabilir. Benim kullandığın Kanban panosu aşağıdaki şekildedir:


(Bakınız: leankitkanban.com)

Kişisel gelişim için gerekli gördüğümüz aktivitelerin gözümüzün önünde olması ve kaydettiğimiz gelişimi ölçebilir durumda olmamız büyük önem taşımaktadır. Ben örneğin bir Kanban panosu kullanmadan önce kişisel gelişimim için gerekli aktiviteleri aklımda tutmaya ve uygulamaya çalışıyordum. Kısa bir zaman sonra kafamdaki bu listenin aslında bir LIFO (Last In First Out – Son giren ilk çıkar) yapısı olduğunu gördüm. Karşıma devamlı ilgimi çeken yeni kitaplar ve bloglar, uygulamak istediğim yeni teknolojiler ve ilgimi çeken diğer konular çıkıyor. Durum böyle olunca karşılaştığım her şey tepeden aklımda yer alan LIFO listesine yerleşiyor ve listede yer alan diğer konuları aşağıya doğru itiyor. Zaman içinde listenin tepesinde olan aktivitelerin aşağıya doğru kaybolup gittiğini fark ettim. Bu şekilde kişisel gelişimi organize etmek verimli değil. Bunun için bir Kanban panosu kullanmaya başladım. Bu pano bana neyi ne zaman yapmam gerektiğini hatırlatıyor. Kafamdaki LIFO’yu silip, attım.

Kafamdaki LIFO’yu silip atmanın bana sağladığı bir avantajı daha olduğunu gördüm. Kafamdaki aktivite LIFO’su ile yaşadığım sürece devamlı tedirgin olduğumun farkına vardım. Her aktiviteyi akılda tutmak, ne zaman neyi yapmam gerektiğini organize etmeye çalışmak beyin için çok yorucu bir işlem. Beynim devamlı böyle yarım kalmış aktivitelerle haşır neşır ve onların nasıl üstesinden geleceğinin planını yapıyor. Bu yükten kurtulmak için Kanban panosu gibi bir yapıdan istifade edilebilir. Bu web tabanlı bir Kanban panosu olmak zorunda değil. Kağıt üzerinde buna benzer bir planlama yapılabilir. Önemli olan kafadaki LIFO’nun boşaltılması ve aktivitelerin Kanban panosuna eklenmesi. Kafadaki LIFO silindikten sonra beyin kişisel gelişim için daha zinde olacak ve daha verimli çalışacaktır. Bunu hayatın diğer alanlarına da yaymak mümkün. Aklımızda ne kadar LIFO varsa, tüm içeriklerini kağıda ya da Kanban panosuna dökün ve LIFO’ları silin. Ne kadar rahat ettiğinizi göreceksiniz. Ben yorulacağıma kağıt yorulsun :)

Buraya kadar kişisel gelişimimizi nasıl organize edebileceğimizden bahsettim. Şimdi birazda kişisel gelişim için gerekli pratiğin nasıl yapılabileceğine değinmek istiyorum.

Daha önce Kod Kata ve Pratik Yapmanın Önemi isimli bir blog yazdım. Biz programcılar ne yazık ki pratik nedir tam olarak bilmiyoruz. Sabah ofise geliyoruz ve direk kod yazmaya başlıyoruz. Aynı şey müzisyenler ya da sporcular için söylenemez. Bu iki meslek gurubu pratik ve performansı birbirinden ayırt ediyorlar. Sahnede olmak onlar için performans. Sahne aktiviteleri haricinde devamlı pratik yaparak, performansları için hazırlık yapıyorlar. Biz programcılar sadece performansı tanıyoruz ve pratik yapma yetimiz gelişmiyor.

Bu durumu aşmak için kod kataları yapmamız gerekiyor. Bu amaçla KodKata.com isminde bir web sayfası hazırladım. Kod kataları on beş ila bir saat arası süren kod yazma pratikleridir. Kod kataları hakkında detaylı bilgi için yukarda linkini verdiğim yazımı okumanızı ve KodKata.com’a bakmanızı tavsiye ederim.

Kişisel gelişim için kod katası yapmak çok önemli. Bu sebepten dolayı her sabah işe başlamadan önce bir kata yapmayı alışkanlık haline getirilmesini tavsiye ediyorum. Bu amaçla KodKata.com’dan bir kata seçin ve yapın. Yaptığınız kataları ve adetlerini bir yere not edin. Zaman içinde sağladığınız gelişmeler gözle görülür hale gelecektir. Bir programcının ustalaşmasının sırrı kod katalarında gizlidir.

Çok yazdım, kafanızı şişirdim, kusuruma bakmayın. Kişisel gelişim benim için çok önemli bir konu. Burada yer alan öneriler kendi kişisel gelişimimde kullandığım ve faydasını gördüğüm yöntemleri ihtiva etmektedir, laf olsun diye işkembeden salladığım şeyler değildir. Verimli olduklarını düşünmesem sizinle paylaşmazdım. Umarım faydasını görürsünüz. Kullandığınız kişisel gelişim metotlarını benimle paylaşırsanız sevinirim.

Güncelleme:
Bu yazımı 07.07.2014 tarihinde tekrar okudum ve bir süredir LIFO sistemine geri döndüğümün farkına vardım. Yapılacak işleri beyinde tutmaya ve organize etmeye çalışmak gerçekten çok zor bir iş. Beyin devamlı yapılması gereken şeyleri organize etmekle meşgul ve yapılacak işler listesinde tatmin edici bir ilerleme sağlamak mümkün değil, çünkü insan beyni bir mikro işlemci ve işletim sistemi gibi preemtif çalışmıyor. Multitasking insan beyni için mümkün değil. Bu yüzden beyinden yapılacak işlerin organiyasyon yükünün alınması gerekiyor ki beyin yapılması gereken asıl işlere
konstantre olabilsin. İş organizasyonu beyne bırakıldığı sürece kişisel gelişim konusunda elle tutulur bir gelişme elde etmek mümkün olmayacaktır.

EOF (End Of Fun)
Özcan Acar

Eşli Programlama, Code Review, Code Retreat ve Adada Yaşayan Programcılar

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ı? Okumaya devam et →

Kod Kata ve Pratik Yapmanın Önemi

Bizim ailede müzisyen geni var, babamdan bana geçmiş olsa gerek. Babam çok iyi bir ses sanatçısıdır. Keşke benim de onun kadar güzel sesim olsa diye düşünmüşümdür her zaman. Ama ne yazık ki yaratıcının benimle olan planları başka türdenmiş. İyi bir dinleyici olduğumu düşünüyorum. TSM parçalarını seslendirmeye çalıştığımda babam, detone olmadığımı söyler. Ama sesimin ne kadar kötü olduğunu ben bilirim. Keşke babam gibi güzel bir sesim olsaydı. Ufakken hatırlıyorum: TV yok; internet yok; radyo var; arkası yarın ve TSM var. TRT radyo yayınlarını dinleyerek büyüdüm; ne güzel günlerdi…

Bendeki müzisyen genini aktif hale getirmek için 2002 senesinde bir elektro gitar aldım. Aradan tam on sene geçmiş ve ben hala gitar çalamıyorum. Bir müzik aletini çalmaya çalışmak büyük fedakarlık istiyor. Eğer motivasyon yoksa o zaman başarı sağlamak hemen hemen imkansız. Motivasyonun yanısıra düzenli olarak pratik yapmak gerekiyor. Ben bunları ne yazik ki beceremedim ve gitar çalmak benim için her zaman bir hayal olarak kalacak. Şimdi bunun programcılıkla ne alakası var diyeceksiniz. Anlatmaya çalışayım.

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.

Nasıl pratik yapmayan bir müzisyenin sonu sahnede performans yaparken vahim olacaksa, pratik yapmayan programcının da sonu bundan farklı olmayacaktır. Pratik yapmayan programcı bir şeyleri çok kısa bir zaman diliminde bitirmek zorunda kalıp, strese girdiğinde yıllardan beri farkında olmadan geliştirdiği ve öyle pekte verimli olmayan yöntem ve mekanizmaları kullanmaya başlayacaktır (bu konuya daha sonra detaylı olarak değineceğim). Bunun önüne geçmek için programcının iş haricinde pratik yapması gerekmektedir.

Karate yapanlar katanın ne olduğunu bilirler. Kata bir karate ögrencisinin tekrar tekrar uyguladığı belli beden hareketlerinden oluşan şemadır. Sahip olduğu kuşağa göre karate ögrencisinin yaptığı katalar değişir. Karate ögrencisi katalarını yaparak karate yapma yeteneğini pekiştirir. Tekrar tekrar aynı kataları yapar, bıkmadan, sıkılmadan, usanmadan. Zamanı geldiğinde, örneğin kuşak imtihanlarında katalarını sular seller gibi sergiler ve bir üst kuşağa geçer. İmtihan olma ve katalarını ustalarına gösterme bir karate ögrencisi için performantır. Başarı sağlayabilmek için imtihan gününe kadar daima kataları üzerinde çalışır, yani pratik yapar. Katalarını yapmayan bir karate ögrencisinin imtihan günündeki hali malumur. Ama burada kata yapmanın ana amacı imtihanan geçmek ve bir üst kuşağı kazanmak değildir. Maksat usta bir karateci olmaktır. Bunun yolu da katadan geçer yani pratik yapmaktan.

Kata, programcıların kullanabileceği bir metafordur. Programcının uyguladığı kod katasıdır. Performans harici zamanlarımızda her gün on beş dakika, yarım saat ya da bir saat kod kata pratiği yapabiliriz. Örneğin benim sık yaptığım katalardan birisi roma rakamları kod katasıdır. Her gün ya da gün aşırı bu ve buna benzer kod kataları yaparım. Burada amaç çalışır bir program geliştirmek değildir. Çok basit bir kod katası bile işinizi görecektir, örneğin FizBuz kod katası.

Uyguladığımız kod kataları yaptığımız bazı işlemlerin, kod yazarken verdiğimiz tasarım kararlarının otomatikleşmesini sağlar. Örneğin ben yazılım geliştirme aracı olarak Eclipse kullanıyorum. Yaptığım kod kataları Eclipse bünyesinde bulunan ve fare kullanmandan yazılım yapmayı sağlayan kısa yol tuşlarını – shortcut key (örneğin STRG+SHIFT+F otomatik kod formatlaması için kullanılır) aklımda pekiştirmemi sağladı. Artık kod yazarken hiç düşünmeden neredeyse otomatikleşmiş bir seviyede kısa yol tuşlarını kullanıyorum ve çok daha hızlı programlayabiliyorum. Öğrenmem gereken daha çok kısa yol tuş kombinasyonu var, ama nasıl verimli bir şekilde öğrenebileceğimi biliyorum. Kod katası yapmadan önce birçok kısa yol tuşunu performansım (iş yerinde kod yazma) esnasında kullanmışımdır. Bazen internetten araştırma yapmışım ve yeni tuş kombinasyonları öğrenmişimdir. Lakin birkaç temel kısa yol tuş kombinasyonu harici bunları devamlı aklımda tutmam mümkün olmamıştır. Çok egzotik tuş kombinasyonları var. Bunları akılda tutmak için her gün kod pratiği yapmam gerekiyor. Kataları yaparken tekrar tekrar aynı kıya yol tuşlarını kullandığım için bunları akılda tutmam ve ezberlemem kolaylaşıyor. Ezberimde olan kısa yol tuşlarını da performansım esnasında kullanmam da çok kolay oluyor.

Kısa yol tuşlarına hakimiyet verebileceğim en basit örneklerden sadece bir tanesi. Kod kataları yaparak bir programcı yazılım esnasında gerek duyduğu yetenekleri geliştirebilir. Örneğin test güdümlü kod kataları yapmaya alışmış bir programcı, iş yerinde kod yazarken ister istemez bir test sınıfı oluşturarak işe başlayacaktır, çünkü bunu yapmaya alışmıştır. Test yazsam mı yazmasam mı diye kara kara düşünmez ve hemen test kodunu oluşturmaya başlar. Kafasındaki çalışma kalıbı artık bu şekildedir (doğru olan çalışma tarzı zaten budur). Test sınıfı ve metotları parmaklarından adeta akar gider. Bu durumu gitar çalan bir müzisyenle kıyaslayalım. Gitarist çalmak istediği parçayı devamlı çalıştığı için performansı esnasında beyninde oluşan kalıplar devreye girer ve müzisyen farkında bile olmadan parmakları perdeler üzerinde gider gelir. O esnada gitarist hangi parmakları ile hangi perdeye gidip hangi notayı basması gerektiğini düşünmez bile. Eğer düşünürse o zaman pratik eksikliği var demektir ve çaldığı parça bu durumun göstergesi olacaktır. 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. İş yerinde program yazarak bu repertuarı oluşturmak hemen hemen imkansız. Usta programcılar ağaçta yetişmiyor ya da gökten düşmüyor. Usta programcı olmak isteyen kişinin büyük fedakarlıklar yapması lazim. Bunun başlangıcı da kod kataları.

Özetle usta bir programcı olma yolunda kod katası yapmak çok büyük önem taşıyor. Bunun yanısıra kataların düzenli olarak yapılması gerekli, aksi taktirde beklenen neticeleri elde etmek zor olabilir. Ben kataları mecbur olduğum için yapmıyorum, işimi ve programcılığı sevdigim ve kod katası yapmayı zevkli bulduğum için yapıyorum. Bir hobi olarak değerlendirebilirsiniz. Kimse mecbur olduğu için karate kursuna gitmiyor, bu işten zevk aldığı ve karateyi öğrenmek istediği için gidiyor. Aynı şekilde bende daha iyi bir programcı olabilmek için kod katalarımı yapıyorum. Her yaptığım katayla yeni birşeyler öğreniyorum. Her kata seansında bir sorunu çözmek için daha kestirme yollar keşfedebiliyorum, başka tasarım kararları vererek başka çözümler üretebiliyorum. Bir zaman sonra artık bazı işlemleri yapmak otomatikleşiyor sanki. İş hayatımda, yani performans yaparken bunun faydasını görüyorum. Programcı olarak kendime olan güvenim artıyor.

Siz daha iyi bir programcı olmak için ne yapıyorsunuz? Kod katası yapmıyorsanız mutlaka denemelisiniz :)

Ustayı usta yapan pratikleridir.

Not: Yaptığım kataları KodKata.com‘da sizinle paylaşıyorum. Bir göz atmanızı tavsiye ederim.


EOF (End Of Fun)
Özcan Acar