Kurumsal Java Yazılımı

24 views
Skip to first unread message

Kurumsal Java Yazılımı - Özcan Acar

unread,
Apr 6, 2012, 10:52:13 AM4/6/12
to kurumsaljava+...@googlegroups.com

Kurumsal Java Yazılımı

Link to Kurumsal Java Yazılımı - Özcan Acar

Çevikliğin Böylesi

Posted: 05 Apr 2012 01:25 PM PDT

Son zamanlarda yazılımla yakından ya da uzaktan ilişkisi olan herkesin ağzında olan kelime; çeviklikten bahsediyorum. İngilizce de agile, lean gibi kavramlar kullanılıyor ve artık herşey için kullanılmaya başlandı. Gören de zannederki artık her proje çevik yazılım yöntemleri ile yapılıyor, herşey yolunda.

2010 senesinde Londra’da yapılan Domain Driven Design exChange konferansında Eric Evans, yazılımda çevikliğin anlamının kaybolduğunu çünkü artık herşeyin çevik olarak isimlendirildiğini söylemişti. Ne kadar haklı. Aşağıdaki fotografı bir trende çektim. Artık iş verenler bile çevik kelimesini kullanarak yazılımcıları oltaya düşürmeye çalışıyor. Çevik bir fare, çevik bir klavye belki de çevik bulut (agile cloud) bile kullanıyorken bulabiliriz kendimizi yakında. Yaşasın hayatın her safhasında karşılaştığımız çeviklik.

Son günlerin en moda çevik terimlerinden birisi Scrum. Avrupa’da artık birçok proje Scrum ile yapılıyor. Proje yöneticileri Scrum’la oturuyor, Scrum’la kalkıyor. Scrum yazılımda yeni bir dönemin başlangıcı. Diğer çevik süreçler on, on beş yıldır piyasada olmalarına rağmen, Scrum iyi pazarlandığı için çeviklik deyince ilk akla gelen süreç oluyor. Şahsen Scrum yöntemleri beni elektrik gibi çarpmamış olsa bile (çok fazla etkilenmediğim anlamında), Scrum doğru uygulandığında bir projede çevikliğin başlangıcı olabilir. Bugüne kadar birçok Scrum projesinde çalıştım ve doğru düzgün uygulandığını görmedim. Eski proje yöneticileri şimdilerde Scrum Master olmuşlar ve eski yöntemleri ile projeleri sürdürmeye devam ediyorlar. Kafalarda değişen fazla birşey olmamış. Scrum’ı elbise olarak almışlar, kendi bedenlerine uydurmaya çalışmışlar. Bu bir yere kadar doğru olabilir, ama daha doğrusu Scrum elbisesini alıp, bedeni ona göre uydurmaktır. Scrum harfiyen ne istiyorsa proje ve çalışmalar ona göre şekillendirilmelidir. Ama mevcut kafalar değişmedikçe Scrum ve diğer çevik süreçlerin başarılı olmaları mümkün değil. Çeviklik, eski kafaların eski yöntemlerle yaptıkları işleri kendi yöneticilerine satmak için kullandıkları bir kavram haline geldi. Scrum projelerinde edindiğim tecrübeleri size aktararak çevikliğin nasıl yarı yolda kaldığını ve gerçek çevikliğin ne anlama geldiğini aktarmaya çalışayım.

Katıldığım ilk Scrum projesini hatırlıyorum. Sıkı bir mülakatın ardından projeye alındım. Mülakat esnasında bana bir sürü Java bulmacası soruldu. Maksat ne kadar derin Java bilgisine sahip olduğunu anlamaktı. Ama test güdümlü yazılım ya da JUnit hakkında bir kelime bile edilmedi. Aynı tarzda mülakatlar ile başka programcılar da projeye dahil edildi. Onlarda da durum farkli değildi. Ben programlarımı test güdümlü yazmaya gayret gösterdim. Ama bazı programcılar kırık kodları versiyon kontrol sistemine ekledikleri için testlerim çoğu zaman çalışmıyordu. Bu beni çok rahatsız eden bir durumdu. Test yazmaya önem vermeyen bu tür programcılarla çok ağız dalaşımız oldu. Sürekli entegrasyon serveri kullanılmıyordu, test güdümlü çalışılmıyordu, müşteri gereksinimleri kullanıcı hikayeleri olarak hazırlanmamıştı. Hangi kullanıcı hikayesini ne kadar zaman diliminde tamamlarız diye tahmin etme oturumları yapılmıyordu. Ama bir Scrum ekibi ve projesiydik. Her sabah on beş dakika asker gibi sıraya girip, Scrum toplantımızı yapardık. Bunun neresi çeviklik, neresi Scrum. Günde on beş dakika toplantı yaparak çevik olunmaz! Zaman kaybından başka birşey değildir, göz boyamacadır.

Çalıştığım diğer bir Scrum projesinde Scrum’ın doğru adapte edilmesi için gayret gösterilmişti. Bir sürekli entegrasyon serveri ve yazılım metriklerini takip etmek için Sonar sunucusu kullanıyorduk. Zaman yetersizliğinden dolayı programcılar test yazmaya önem vermıyorlardı. Ayrıca uygulama bir uygulama sunucusu içinde çalışmak zorunda olduğu için test yazmak kolay değildi. Mevcut testlerin hepsi entegrasyon testi tarzındaydı. En ufak bir değişiklikte bile yeniden bir EAR paketi oluşturup, tüm uygulamayı uygulama sunucusuna çekmek gerekiyordu. Uygulama sunucusunun ayağa kalkması beş dakika sürüyordu. Yazılım geliştirme tamamen uygulama sunucusu ile iç içe geçmiş durumdaydı. Uygulama sunucusunu kullanmadan yazilim yapmak mümkün değildi. Test eksikliğinden ve uygulamanın bir uygulama sunucusuna çekilmesi gerektiğinden, uygulamayı yeniden yapılandırmak çok zordu. Uygulamayı uygulama sunucusundan bağımsız bir hale getirmek için çaba sarfetmemiz gerektiği konusunda çok dil dökmeme rağmen bu gerçekleşmedi. Sonuç olarak çevik değildik, çevik olamadık. Her yeni bir ekleme ile uygulamayı değiştirmek daha da zora girdi. Eğer programcılar ölmedilerse hala yaşıyorlar.

Çevik Nasıl Olunur?

Çevik olmak öncelikle cesaret ister. Gelenekleri bir kenara itip, yeniden başlamayı gerektirir. Felç geçirmiş bir insanın yeniden konuşmayı ya da yürümeyi öğrenmesi gibi çeviklikte herşeyi unutup, yeniden öğrenmeyi gerektirir. Çevik olmayı zor kılan da budur. İnsanlar alışkanlıklarından kolay kolay vaz geçemezler. Radikal değişimleri sevmezler. Yeniliklere kolay kolay adapte olamazlar. Dünya yerinde dursun isterler. Ama yazılım yapmak gibi dinamik bir ortamda değişmeyen tek şey değişikliğin kendisidir. Bununla yaşamak her babayiğidin harcı değildir. Cesur olanların, yeniliklere açık olanların işidir. Buraya kadar olan çevikliğin edebi tanımıydı. Şimdi gelelim teknik tanımlamasına.

Çevik olmayı ben hamur yoğurma ile kıyaslarım. Hamuru, içinde yeterince sıvı olduğu sürece yoğurabilirsiniz. Sıvı azaldıkça hamuru yoğurmak zorlaşır. İçinde sıvı kalmamış hamuru yoğuramassınız. Bu analogiden yola çıkarak çevikliğin yazılımdakı tanımlamasını yapalım. Hamur oluşturduğumuz yazılım sistemi, sıvı birim testleri, yoğurma ise yeniden yapılandırmadır (refactoring). Birim testleri olmadan yazılım sistemini yoğuramassınız (yeniden yapılandıramassınız), ama her yeni müşteri gereksinimi ile sizden yazılım sistemini yoğurmanız beklenir. Oluşturduğunuz uygulamaya yeni müşteri gereksinimlerini eklemek, yani uygulamayı yoğurmak zorundasınız. Bu işi yapmak yani programcı olarak çalışmak istiyorsanız başka alternatifiniz yok. Patronunuz ve müşteriniz sizden uygulamayı yoğurmanızı yanı kendi isteklerine cevap verecek şekilde geliştirilmenizi bekler. Birim, entegrasyon ya da onay/kabul testleri yazmıyorsanız uygulamayı yoğururken sıvı buharlaşacak ve siz belli bir noktadan itibaren uygulamayı yoğuramama rizikosuyla karşı karşıya kalacaksınız. Ama sizden yoğurmaya devam etmeniz beklenecektir. Birçok proje ya da geliştirilen uygulama bu sebepten dolayı başarısız olmaktadır. Devam etmek istiyorsanız uygulamaya sıvı katmanız gerekir. Oluşturacağınız yeni testler hamurunuz için yeni sıvı olacaktır. Bu testler hamuru tekrar yumuşatır ve yoğrulmasını kolaylaştırır. Programcı testleri kullanarak uygulamayı yeniden yapılandırabilir (refactoring). Bu hamuru yeniden yoğurabilme yeteneğini kazanmak demektir. Testler yoksa yeniden yapılandıramaz. Yeniden yapılandıramassa uygulama sıvı eksikliğinden katılaşır ve yoğrulamaz hale gelir. Çevikliğin ve esnekliğin gizli anahtarları testler ve yeniden yapılandırmadır. Bu iki anahtarı kullanmayı bilen programcı çeviktir. Tüm çevik olma hevesinin temelinde bu iki element yatar. Bu iki elementin olmadığı yerde çeviklik olamaz. Uygulamayı istekler doğrultusunda yoğuramadıktan sonra ne proje yönetiminin, ne Scrum’ın ne de çok iyi programcılardan oluşan ekibin bir anlamı kalır. Proje yöneticisi istediği kadar tavana zıplasın; katılaşmış bir uygulayı yeni kod yazarak yumuşatamayız, sadece test yazarak ve devamlı refactoring yaparak bu amaca ulaşabiliriz.

Çevik olabilmek için çevik yazılım metotlarına hakim olmak gerekir. Her sabah on beş dakika toplantı yaparak elde edilebilecek bir durum değildir bu. Çevikliği anlayanlarla, anlamayanlar arasındaki fark budur. Çevikliği anlamayanlar çeviklik buzulunun (eisberg) su üstündeki kısmını görürler. Su üstünde görünen kısım, su altında kalan kısımdan çok küçüktür. Asıl çeviklikle haşır, neşir olma su altında olur. Herşeye Scrum, lean, agile diye isim verenler su üstünde yaşarlar, suyun altında olup bitenlerden bihaberdirler, çünkü derine dalmaya korkarlar. Onlar değişikliği zaten sevmezler. Eski çalışma tarzlarına çeviklik etiketini yapıştırıp hayatlarına devam ederler. Çeviğiz diye kendilerini ve etraflarındaki insanları kandırırlar. Hamuru yoğururken sıvı tükenmeye yakın panik olurlar. Ne yapacaklarını şaşırırlar, neden böyle oldu diye kara kara düşünürler. Çevik olduklarına kendileri de o kadar inanmıştir ki, suçu çeviklikte bulurlar. Çevikliği sevmemeye başlarlar. Onlar için suçlu olan çevik olma paradigmasıdır. Bilmezler ki çevikliğin hakkını verememişlerdir, çünkü ne olduğunu tam olarak kavrayamamışlardır. Değişikliğe açık olmadıkları için kavramaları da kolay değildir.

Gelelim çevik olmayı anlayanlara. Onlar bahsettiğim iki anahtarın sahibidir. Test güdümlü kod yazmayı bilirler ve her fırsatta bunu uygularlar. Bunun yanısıra refactoring konusunda uzmandırlar. Her yeni müşteri gereksimi ile daha önce verdikleri tasarım kararlarını revide ederler. Uygulamanın katılaşmaya başladığında mevcut tasarımın yetersiz olduğunu anlarlar ve bu tasarımı bozup, yeni bir tasarım yapmaktan çekinmezler. Cesurdurlar. Bilirler ki ellerindeki testler yeniden yapılandırma işlemini mümkün kılar. Buradan çıkardığımız ilk sonuç şudur: çevik olabilmek için test güdümlü yazılım yapmak önem taşımaktadır. Test güdümlü yazılım yapılamıyorsa, o zaman uygulamanın büyük bir kısmını kapsayacak şekilde test kodu yazılmalıdır. Oluşturulan testlerin otomatik olarak çalışması gerekmektedir. Yeniden yapılandırma (refactoring) işlemlerinin birçok yan etkisi olabilir. Onları hızlı bir şekilde lokalize edebilmek için otomatik çalışan testlere ihtiyaç duyulmaktadır. Testlerin olmadıği ya da yetersiz olduğu projelerde programcılar yeniden yapılandırma işlemine cesaret edemezler. Cesaret edemedikleri için yazılım sistemi her gün biraz daha katılaşır ve bir zaman sonra yoğrulamaz hale gelir. Eğlencenin bittiği an budur. Bu noktadan itibaren programcılar için cehennem azabı başlar. Fazla mesailer yapılır, beraber ağıtlar yakılır, kollektif çığlıklar atılır, sende mi Brütüs, sana o kadar emek verdik, yaptıkların bize caiz mi diye yazılım sistemine yüklenilir. Ama Brütüs suçsuzdur. O beni yoğurmayın dememiştir ki. Yoğurma cesaretini programcılar gösterememiştir.

Gerçek çevikliğin temelinde gerçek yazılım mühendisliği metotları yatar. Birincisi test güdümlü yazılım; ikincisi yeniden yapılandırma (refactoring); üçüncüsü eşli programlama; dördüncüsü sürekli entegrasyon; beşincisi basit tasarım; altıncısı iteratif sürüm oluşturma; yedincisi ….

Bu metotların hepsi insanların bilgisayarları icadı ve program yazmaları ile birlikte yer yer uygulanmış metotlardır. Hiç biri yeni icat edilmemiştir Ama bundan on, on beş sene önce Extreme Programming (XP) olarak topluca karşımıza çıktılar. XP bünyesinde proje yönetimi için de metotlar barındırmaktadır. XP bu metotları Scrum’dan almıştır. Ama Scrum bünyesinde XP’nin sahip olduğu çevik metotlar yoktur. Bu yüzden içinde çalıştığım hemen hemen her Scrum projesi sadece kağıt üzerinde çevik olabilmiştir. Saha’ya inildiğinde çevikliğin bir tane atomuna bile rastlamak mümkün olmamıştır.

Sadece proje yönetmek için icat edilmiş çevik süreçleri kullananlara sesleniyorum buradan. Gerçek çevik yazılım metotlarını kullanmadığınız sürece çevik olmanız bir hayal olarak kalacaktır. Bu yüzden sürdürdüğünüz birçok proje 130 km/h ile duvara tosluyor. Cesaret edip işin temeline inmeniz gerekiyor. Daha fazla mühendis olup, çevik metotlara hakim olmanız gerekiyor. Her gün on beş dakikalık toplantılarınızdan vaz geçin demiyorum. Bu yerinde bir aktivite. Ama zaman ayırıp bir mühendis kafasıyla sistematik olarak çevik yazılım metotları ile ilgilenin, onları öğrenin, onlara hakim olun, onlari uygulayın. Her Scrum projesini testlerin yine en son safhada yazıldığı ya da zaman yetersizliğinden dolayı yazılamadığı bir ortama çevirmeyin. Profilime ben de kulağa hoş gelen Scrum Master ünvanını koyarım. Ama bu benim ne kadar çevik metotlara hakim olduğumu yansıtmaz. Ünvanlardan çok, hakim olduğunuz gerçek çevik yazılım metotları ile övünün. Hamuru yoğuran ünvan değildir. Hamuru yoguran tecrübeli beyin ve sistemli ve sonuç getiren metotlar kullanmaya alışmış ellerdir. Gerçek yazılım mühendisleri ile düzmece mühendislerin arasındaki fark işte budur. Parayla satın alınan sertifikalar programcıyı programcı yapmaz. Bu sevdadan vazgeçin. Scrum ve Scrum’a benzer çevik yöntemlerle ne dünyayı kurtarırsınız ne de yazılım dünyasına artı bir değer katarsınız.

Çekirdekte gerçek meselenin uygumalayı devamlı yoğurmak olduğunu göz ardı eden bu sözde çevik yöntemler, çevik teriminin her halt için kullanılması ve enflasyona uğramış olması, çevikliğin içinden çıkılamaz bir hale gelmesine sebep olmuştur. Kafalar iyice karışmıştır. Hangi yöntem çeviktir, nasıl çevik olunur, bu sorulara artık kimse net olarak cevap verememektir. Çeviklik artık ifade gücünü yitirmiştir. Bu gerçekten üzücü bir durum. Bir nevi komplo. Sanki eski şelale (waterfall) yöntemleriyle büyümüş bir zümre çevikliği ortadan kaldırmak için iş birliği içindedir. Böyle birsey yok doğal olarak. Fantazim yine kanatlandı.

Beni bir Scrum düşmanı olarak görmeyin. Doğru uygulandığında iyi bir başlangıç olabilir. Ne yazik ki Scrum’ın doğasından kaynaklanan bir sorun bu; Scrum’ı doğru uygulamak hemen hemen imkansız; her türlü uygulama tarzına açık; somut değil; isteyen istediği tarafa çekiyor, bu yüzden ortaya çok komik görüntüler çıkıyor. Scrum doğru uygulandığı taktirde ve proje bünyesinde XP vari yazılım metotları kullanıldığında bir proje tam anlamıyla çevik olabilir. Onun haricinde bu imkansız.

Çeviklikte herşeyin başı çevik mühendislik metotlarıdır. Bunun başında test güdümlü yazılım ve refactoring gelir. İçinde bu elementleri barındırmayan bir süreç çevik yazılım süreci olamaz. Para basmak ve dandik sertifikalar dağıtmak için oluşturulmuş sözde çevik süreçlerden uzak durmakta fayda var. Cesaret gösterip işin özüne inelim. Yeniliklere açık olalım. Yazılım mühendisi isek o zaman bir mühendis gibi çalışalım, sistemli ve metotlu. Buna izin verilmediği yerde durmayalım, baş kaldıralım. Yazılımda çeviklik sadece çevikliği kavramış mühendislerle mümkündür. Eski kafa bir proje yöneticisini Scrum Master yaparak proje çevikleştirilemez. Projede çevikliği yazılım mühendisleri ateşler, meşaleyi onlar ileri götürür, Scrum Master olmuş birisi değil. Onlar en fazla seyirci olabilirler. Sahada maçı oynayan çevik yazılım mühendisleridir.


EOF (End Of Fun)
Özcan Acar

Share/Bookmark
You are subscribed to email updates from Kurumsal Java Yazılımı - Özcan Acar
To stop receiving these emails, you may unsubscribe now.
Email delivery powered by Google
Google Inc., 20 West Kinzie, Chicago IL USA 60610

Kurumsal Java Yazılımı - Özcan Acar

unread,
Apr 7, 2012, 10:13:05 AM4/7/12
to kurumsaljava+...@googlegroups.com

Kod Kata ve Pratik Yapmanın Önemi

Posted: 07 Apr 2012 03:28 AM PDT

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 yazik 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ırliyorum: TV yok; internet yok; radyo var; arkası yarin 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. Programcilar 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 cok 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ş ya 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 hergü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. Hergü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 hergü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 ise 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 farkli 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ı yapmayi 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. Programci 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 :)

Ustayi usta yapan pratikleridir.


EOF (End Of Fun)
Özcan Acar

Share/Bookmark
Reply all
Reply to author
Forward
0 new messages