Yazılımcılığın Ne Olduğunu Anlamamış Bilgisayar Mühendisi

Bu yazıyı okuduğumda, “yazılım kimlere kalmış” dedim ve bu yazıyı kaleme almaya karar verdim.

Şimdi bu yazıyı alıntılar vererek, analiz etmek istiyorum. Kendimi bunu yapmak zorunda hissediyorum, çünkü yazı tam bir kargaşa ve tutarsızlıklar abidesi.

Amacım kimseyi rencide etmek değil. Bu arkadaşımızın yazmış olduğu tezlerin mevcut ve müstakbel yazılımcılara ve yazılım sektörüne zarar verdiğini ya da verecegini düşünüyorum. Bu işi severek yapan birisi olarak, buna izin vermem düşünülemez. Bunun yanı sıra yazıyı okuyan birisi olarak, cevap verme ve yanlışlıkları düzeltme hakkımı kullanıyorum.

Yazının ana konusu mühendlislik okumadan, yazılımcı olunup, olunamayacağı şeklinde. Yazı sahibinin görüşü bu işi sadece bilgisayar ya da yazılım mühendisi olanların yapabileceği yönünde ve şöyle bir çelişki ihtiva ediyor:

[sourcecode language=’java’]
Yazılım üretmek bir sanattır, aksi iddia edilemez. Sizin bu sanata
yatkın olup olmadığınızı ortaya çıkartacak çok kolay bir testi
aşağıda açıkladım.
[/sourcecode]

Yazar ne yazık ki burada sanatı kastetmekle birlikte sanat ile zanaati karıştırmış durumda. Kurmuş olduğu cümle çelişkili, çünkü savunduğu mühendislik olgusu ile sanatın yakından ve uzaktan hiçbir ilgisi olamaz. Yazılım mühendislik işidir kanısını savunurken, yazılım sanattır diyor. Programcılık sanat mı, zanaat mı? başlıklı yazımda bu konuya değindim. Programcılık sanat değildir. Programcılığın bir kısmı mühendislik bir kısmı da zanaattir. Uygulamalar bir mühendis kafasıyla tasarlanır, bir zanaat ustası gibi koda dökülür.

Yazar bir yazılımcı olup, olamayacağımızı anlayabilmemiz için bir test hazırlamış. Testi inceleyelim:

[sourcecode language=’java’]
Tek yapmanız gereken başlamak istediğiniz programlama veya uygulama
dilinin kitabını alıp okumaya ve uygulamaya başlamak. Şayet okuduğunuzu
anlayabiliyor ve uygulayabiliyorsanız, gayet güzel! Şayet okuduğunuzu
anlayamıyor, küçük uygulamalar geliştirirken dahi kitabı açıp bakma
ihtiyacı hissediyorsanız, bu durumda sizden yazılımcı olmaz.
[/sourcecode]

Programcı olmaya hevesli ama bu konuda hiçbir bilgisi olmayan bir şahsın bu testi geçmesi imkansız, çünkü test çok absürd. Yeni bir alana ayak bastığınızda, o alana has dili bilmediğiniz için başlangıçta bocalamanız çok doğal. Her çalışma sahasının kendine has zorlukları olur ve bu zorluklar çalışma sahasına aşina olundukça aşılır. Eğer herkes yeni bir sahaya adım atarken böyle bir test yapmak zorunda kalsaydı, o zaman bu dünyada kalifiye bir eleman bulmak mümkün olmazdı.

İşte çok cesur ortaya atılmış bir tez daha…

[sourcecode language=’java’]
Mühendis ile yazılımcı arasındaki fark, maaş konusunda keskinleşir.
[/sourcecode]

Yazar burada ne yazık ki genel değil, yerel bir bakış sergilemektedir. Türkiye çok genç bir nüfusa sahip olan bir ülke. Bunun yanı sıra yazılım sektörü Türkiyemizde çocuk ayakkabılarıyla geziniyor. Yazılımın gerçek anlamda nasıl yapılması gerektiği konusunda bilgili insan sayısı parmakla sayılacak kadar az. Çoğu bilgisayar mühendisi de bu işi bilmiyor, sonradan bu işi öğrenmiş şahıslar da.

Bilgisayar ya da yazılım mühendisi ile alaylı yazılımcı arasındaki fark kesinlikle maaş olamaz. Türkiye küçük bir piyasa olduğundan ve çok sayıda yazılımcı bu piyasada iş bulmaya çalıştığı için firmalar seçici olma ayrıcalığına sahipler. Doğal olarak arz edilen iş gücünün talep edilenden fazla olması, firmaların mühendis sıfatını taşıyan yazılımcıları tercih etmesini kolaylaştırıyor. Almanya gibi bir piyasada Türkiye’ye nazaran arz talep dengesi tam tersine olduğundan, mühendis ile alaylı yazılımcı arasında hiçbir fark yok. Fark olsa bile bu farklılık tecrübe bazındadır. Kim daha tecrübeli ise, daha çok maaş alır. Hesap bu kadar kolay. Mühendis, mühendis olduğu için daha çok para kazanır ya da kazanmalıdır demek, abesle iştigalden başka bir şey olamaz. Ayrıca bu bazı kafaların nasıl çalıştığının da çok iyi bir ispatıdır. Bir iş gücünü kıymetli kılan, iş konusunda ne kadar kalifiye olduğudur. Üniversite bitirerek hiçbir kimse kalifiye elemanım diye ortalıkta gezinemez. İnsan iş başında, öğrendiklerini uygulayarak pekişir ve kalifiye bir eleman haline gelir. Bu açıdan bakıldığında bir bilgisayar mühendisi ile kendini çok iyi yetiştirmiş bir alaylı yazılımcı arasında hiçbir fark yoktur. Nice fizik ve kimya mühendisleri tanıyorum. Yıllarca programcı olarak çalışmışlar ve benim diyen birçok bilgisayar ya da yazılım mühendisini ceplerinden çıkartırlar.

Yazarın bir sonraki tezine bir göz atalım:

[sourcecode language=’java’]
Mühendisler, kurumsal yapılı şirketlerde daima yazılımcıların
patronu olarak çalışır (başlangıçta böyle olmayabilir,
ama yazılımcının 5 yıldır beklediği terfiyi mühendis en çok
2 yılda alır.
[/sourcecode]

Ben yazılımcı olsam ve bu şekilde hakkım yense, böyle bir firmada beş dakika bile durmazdım. Çalışanlarına sarf ettikleri emeğe göre değil de, sahip oldukları bir takim mühendislik sıfatlarına göre öncelik tanıyan firmalar, bu hallerini piyasada eleman bulamayacak hale geldiklerinde çok çabuk değiştirirler. Yazarın tezinden de anlaşıldığı gibi Türkiye’de yazılım sektörü yok kadar küçüktür ve bu durumu kendi avantajları yönünde kullanan kurumsal firmalar, şimdilik alaylı programcıların haklarını yemektedirler. Yarın, bir gün piyasa büyüdüğünde ve programcılara olan talep arttığında, kim daha çabuk terfi alıyormuş, göreceğiz. Kim daha çok çalışıyor ve tecrübe sahibi ise, terfiyi o almalı. Mühendisi alaylının önünde gören zihniyet, iş gücüne ihtiyaç duyduğunda, o alaylının önünde eğilir. Bu kaypaklık zaten mühendisler önceliklidir zihniyetinin ne kadar kokuşmuş olduğunun ve dikkate ve ciddiye alınmaması gerektiğinin ibaresidir.

Devam edelim:

[sourcecode language=’java’]
Bazen kurumsal şirketler de “uzman” alabilir, ama bu durumda
“mühendisin” yanında takılan bir eleman gibi olursunuz, tavsiye etmem.
[/sourcecode]

Yazar ne yazık ki mühendis dediği şahısları cebinden çıkaran alaylılarla çalışma fırsatı bulamamış. Alaylı konumu itibari ile zaten mühendisin bildiğinin iki katını, çalıştığının iki katını, öğrendiğinin iki katını öğrenme eğilimi gösterir, çünkü kendisini mühendis ünvanı olmadan ispatlamak zorundadır. Bu şartlar altında boynuz kulağı çok çabuk geçer.

[sourcecode language=’java’]
İngilizce olmadan sıradan “programcı” olmanın ötesine geçemezsiniz.
[/sourcecode]

Yazara bu konuda haklıdır. Türkçe kaynakların artması ile ingilizce bilmenin de önemini yitireceğini düşünmekle birlikte, ingilizce bilmenin yazılımda şimdilik bir gereklilik olduğunu düşünüyorum.

[sourcecode language=’java’]
Üniversite okumadan, “yazılım uzmanı” olmaktan öteye geçemezsiniz…
Bu işin en doğru yolu mühendis olmaktır.
[/sourcecode]

Eğer kendim de bir bilgisayar mühendisliği okumuş bir yazılımcı olmasaydım, bu üniversitede ne öğretildiğini gerçekten çok merak ederdim. Ben size üniversitede ne öğretildiğini kısaca özetleyeyim: biraz matematik, biraz algoritma, biraz ondan, biraz bundan ve dört sene sonra diplomasını alıp, mühendis oldum diye böbürlenen, ama gerçek yazılımın nasıl yapıldığından ışık yılları uzaklıkta şahıslar. Bu mühendislik olayını büyütmenin gerçekten bir anlamı yok. Makine ve elektronik mühendisleri bile biz bilgisayar mühendislerinden mezun olduklarında çok daha donanımlı mühendisler. Bunun yanı sıra en doğru yolu kavramı göreceli bir kavramdır. Yolların hepsi Roma’ya çıkar diye bir söz vardır. İyi bir yazılımcı olmak için bilgisayar ya da yazılım mühendisi olma zorunluluğu var diye bir şey olamaz.

[sourcecode language=’java’]
Şu anda bir işveren olarak da “yazılım uzmanı” hiçbir arkadaşımızı
işe almadım, hep “yazılım veya bilgisayar mühendisi” işe aldım.
Çünkü bizim ürettiğimiz yazılımlarda, analiz ve matematiksel
yetenekler gerekiyor.
[/sourcecode]

Eğer uzay mekiği ya da bilgisayar oyunları için program yazmıyorsanız, yazdığınız kodun %99’unda toplama, çıkarma gibi basit matematiksel işlemler yaparsınız. En son yaptığım matematiksek işlem x++ idi.

Programcılığın matematikle çok ilgisi yok. Soyutlayabilme yeteneğiniz varsa, programcı olmak için en önemli yeteneğe sahipsiniz demektir. Geriye kalan her şeyi kitaplardan ve bu işin ustalarına bakarak, öğrenebilirsiniz.

[sourcecode language=’java’]
Bu işi kendi kendine veya kursta öğrenen hiç kimse de kalkıp,
“Yahu ben cebir, analiz, algoritma vb. de öğreneyim” demiyor.
[/sourcecode]

Mühendislerin çoğu ilerde mühendis ünvanım ile daha iyi bir yere gelir, daha fazla para kazanırım diye mühendis olurlar. Alaylı programcıların çoğu bu işe gerçekten gönül verdikleri için programcı olurlar. Bu işe gönül veren bir insan Java gibi mainstream olan diller haricindeki dilleri de öğrenir, çünkü kendini geliştirme yolunda her türlü bilgiyi sünger gibi emer. Kim Daha İyi Programcı? başlıklı yazımda bu konuya değindim. Verdiğim eğitimlerde bazı alaylı olan katılımcıların mühendislere nazaran daha geniş bir teknik altyapıya sahip olduklarına, kendi uzmanlık alanları haricindeki alanlarla da ilgilendiklerine ve yenilikleri yakından takip ettiklerine şahit oldum. Bunun sebebi bu işe gerçekten gönül vermiş olmaları ve severek yapıyor olmalarıdır. Ben bu tür adamları işe alırdım, çünkü projeyi uçuracak olanlar bu tür yazılımcılardır. Eğer bir yazılım mühendisi de bu tür özelliklere sahip ise, o zaman onun da başımızın üzerinde yeri var.

Hindistan’da insanları sınıflandırmak ve toplumu ayrıştırmak için kutu sistemi oluşturulmuş. Bir kutuya ait insanların başka bir kutuya geçmeleri mümkün değil. Yazar da yazılımcılar için böyle bir kutu sistemi oluşturmaya çalışmaktadır. Bunun kimseye bir faydası olmadığı ortadadır, çünkü oluşturulan bu kutu sistemi maddi olarak daha fazlasını hak eden alaylıların kötü şartlarda sömürülmelerine sebep vermektedir.

Bir işin üniversite eğitimini almış olmak şüphesiz iyi bir teknik altyapının oluşturulmasında faydalıdır. Lakin üniversitelerin ne kadar kolay ve uyduruk bir şekilde bitirilebileceğini hepimiz biliyoruz. Hele hele Türkiye gibi ezberciliğe dayanan bir eğitim sisteminin olduğu bir ülkede alınan üniversite eğitimini bir ayrıcalık olarak satmaya kalkmak, bu işin hakkını vererek çalışmaya çalışanlara yapılmış büyük haksızlıktır. Gerçek öğrenim süreci üniversite bittikten sonra başlar. Alaylı olsun, mühendis olsun, iyi bir programcı ile vasat bir programcının arasındaki farklılık da burada belirir. Kim her daim yeni bir şeyler öğrenme eğilimi gösterirse, öne geçer. Yazılım tutku işidir. O tutkuya sahip olmayanı mühendis ünvanı bile kurtaramaz. Benlik gütmeyelim.


EOF (End Of Fun)
Özcan Acar

Dağın Ayağına Gelmesini Bekleyen Birisi

Bir varmış, bir yokmuş. Evvel zaman içinde, kalbur saman içinde birisi varmış. Bu birisi çok inatçıymış. Birgün bir arkadaşı ile “ben dağa gitmem, dağı ayağıma getiririm” diye iddiaya girmiş.

Başlamış dağın ayağına gelmesini beklemeye. Bir zaman beklemiş, bakmış dağın geldiği falan yok. Bu eninde sonunda ayağıma gelecek diye beklemeye devam etmiş. Yine aradan bir zaman geçmiş. Bu durum dağın umurunda bile değilmiş. Birisi o zaman ben dağa biraz daha yaklaşayım, bakarsın dağ fikrini değiştirir ve ayağıma gelir demiş. Dağa doğru biraz ilerlemiş ve beklemeye başlamış. Gel zaman, git zaman dağdan ses yok, ne gelen varmış, ne giden. Galiba birisi dağı hala beklemeye devam ediyor…

Bu kısa hikayecikte dağın insanın ayağına gelmesini beklemeyi hayattan olan beklentilerimizi simgeleyen metafor olarak seçtim. İnsanlar hayattan her zaman büyük beklentiler içindedirler. Beklentinin fiil hali beklemektir. Beklemek pasif bir durumdur. Oturup pasif olarak bir şeyleri bekleriz, hikayedeki birisi misali.

Zamanla beklenti içinde olmakla hedef sahibi olmak durumsal olarak birbirine karışabilir. Birey beklentilerini düşünerek hedef sahibi olduğunu zanneder. Örneğin okulu bitirdikten sonra iş hayatına atılarak iyi bir gelecek sahibi olma beklentisine sahip oluruz. Bu beklenti zaman içinde hedef kılığına bürünür ve iyi bir gelecek sahibi olmayı hedeflediğimizi zannederiz. Oysaki pasif bir şekilde her şeyin beklediğimiz şekilde yolunda gitmesini ümit ederiz. Bu kendimize koyduğumuz bir hedef değil, bir beklentidir. Pasif bir şekilde bir şeylerin olmasını bekleriz. Pasif olmak faydalıdır, çünkü boşuna enerji harcanmasını engeller. Tek faydası da budur.

Dağı ayağına getirmeye çalışmak ya da iyi bir geleceğe sahip olmak beklentiden başka bir şey olamaz. Beklemek ve pasif olmak yerine hedef güdümlü olmak gerekir. Hedef bireyi mıknatıs gibi çekerken, beklenti hedefi mıknatıs gibi çekmeye çalışır. Hedefi kendine çekmenin ümitsiz bir vaka olduğunu hikayede gördük. Koca dağı kendine çekmeye çalışan birisi bu işte pek başarılı olamadı. Başarılı olmak için bir yerlere doğru, yani hedefe doğru çekilmemiz gerekir.

Hedef bireyi kendine doğru çekebilmek için bir şeye daha ihtiyaç duyar. Bu motivasyonun kendisi ya da motive edici sözler değildir. Bu daha ziyade hedefe doğru giderken nitrojen vazifesi gören, bir an önce hedefe ulaşılmayı isteyen bir şeydir. Bu şey tutkudur (passion).

Hedefe ulaşmak dağa tırmanmak gibi zahmetli bir  uğraştır. Düşer, yara alırız. Tutku aldığımız yaralardan doğan acıları dindirir ve bizi tekrar ayağa kaldırır. Yola devam etmemizi sağlar. Tutku olmadan hedefe giden yollar kat edilemez, yollar yarıda bırakılır. Hedefe ulaşılsa bile  yolda alınan darbeler o kadar büyüktür ki insan yola çıktığına bin pişman olur. Tutku ile yola çıkan ilacını yanına almıştır. Aldığı darbelerden gelen acıları hissetmez. Tutku bize bir zaman sonra bir şeyi daha gösterir. Bu şey bize bir zaman sonra gidilecek yerin aslında hedef değil, hedefe giden yolun kendisi olduğudur.

Beklenti motoru olmayan bir gemi gibidir. Buna karşın tutku insanı rotasında tutar. Yolculuğun nereye gittiğine o karar verir, sahibini de pesinde sürükleyip götürür. Peşinde sürüklenme de pasif bir durumdur. Demek oluyor ki tutku gemisine binen belki büyük emekler sarf ederek hedefine ulaşır, ama yolculuk ona elini, kolunu sallayıp, ıslık çalarak yaptığı bir sabah yürüyüşü gibi gelir. İçinde tutkunun olduğu iş aslında iş değildir, eğlencedir. Bu yüzden hedefe ulaşmak kolaydır. Emeği eğlenceye dönüştüren tutkudur.

Demek ki hedefi keşfetmeden tutkuyu keşfetmek gerekiyor. Onu keşfetmek için kalbinizi dinleyin. En çok neyi yapmayı seviyorsanız, tutku onun içinde gizlidir. Onu keşfettikten sonra hedefleriniz sizi bulur.


EOF (End Of Fun)
Özcan Acar

java.lang.IncompatibleClassChangeError: Implementing class Nedir ve Analizi Nasıl Yapılır?

Bu hata genelde bir interface ya da üst sınıf değişikliğe uğradıktan sonra, classpath içinde bu sınıfı eski haliyle implemente etmiş/genişletmiş bir sınıfın, üst sınıf tekrar kullanılarak derlenmeden kullanılması sonucu ortaya çıkan bir hata türüdür.

Çalıştığım projede bir web uygulamasını deploy ederken hatanın şu hali ile karşılaştım:

[source language=’java’]
javax.servlet.ServletException: Error instantiating servlet class xxx.xxx.emobility.webapi.EMobilityUMAdminServlet
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    com.vw.mbbc.dispatcher.access.webapi.WebServerSimulator.invoke(WebServerSimulator.java:140)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:744)
root cause

java.lang.IncompatibleClassChangeError: Implementing class
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2918)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    org.hibernate.ejb.Ejb3Configuration.(Ejb3Configuration.java:107)
    org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:124)
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
[/source]

Bu hatayı analiz etmek için HibernatePersistence sınıfının 124. satırından yola çıkıyoruz. Bu satırda Ejb3Configuration sınıfından bir nesne oluşturuluyor. Ejb3Configuration sınıfının 107. satırına göz attığımızda AnnotationConfiguration sınıfından bir nesne oluşturulduğunu görüyoruz. Stacktrace e göz attığımızda sınıf yükleyicisinin (classloader) bu sınıfı classpath içinde bulmak üzere işlem yaptığını görüyoruz.

AnnotationConfiguration sınıfı Configuration sınıfını genişletiyor. IncompatibleClassChangeError hatasının oluşmasının ana sebebi ise şu: org.hibernate.cfg.Configuration sınıfı AnnotationConfiguration sınıfı ile aynı jar dosyası içinde değil. Eğer aynı jar dosyasında olsalardı Classloader doğru Configuration sınıfını bulurdu ve IncompatibleClassChangeError hatası oluşmazdı. Benim ortamında org.hibernate.cfg.Configuration sınıfının iki değişik sürümü iki değişik jar dosyasındaydı ve classloader tesadüf eseri kullanımda olan AnnotationConfiguration sınıfı için değişikliğe uğramış olan Configuration sınıfını önce buldu ve yükledi. Classloader uyumsuzluğun farkına vardığı için IncompatibleClassChangeError hatası oluştu. 

Bu sorunu çözmek için değişikliğe uğramış olan üst sınıfı bulup, classpath dan uzaklaştırmak gerekiyor. Benim örneğimde iki Configuration sınıfı bulunmakta. Çoğu zaman classpath içinde değişikliğe uğramış bir üst sınıf yer alacaktır. Bu durumda üst sınıfı genişleten alt sınıfı tekrar derleyerek bu sorun çözülebilir.


EOF (Enf Of Fun)
Özcan Acar  

500 Beygir Gücünün Hazin Sonu

İdeal şartlar altında bir programcının savaş verdiği tek bir cephe vardır, o da müşteri gereksinimlerini önemlilik sırasına göre kodlamak.

Çevik süreçlerde müşteriye 2-4 hafta süren çalışmalar ardından çalışır bir uygulama prototipi sunulur. Bu prototip müşteriye uygulamanın hangi seviyeye geldiğini, isteklerinin doğru uygulanıp, uygulanmadığını ve hangi değişikliklerin gerekli olduğunu anlama fırsatı verir. Buradan change request olarak bilinen ve müşteri gereksinimlerine daha yerinde cevap verebilmek için atılması gereken adımları tanımlayan değişiklikler doğabilir. Bu değişiklikler bir sonraki 2-4 haftalık çalışma sürecinde kullanıcı hikayesi (user story) olarak programcıya yansır. Bu değişikliklere rağmen programcının savaşı hala bir cephede devam etmektedir.

Eğer proje bünyesinde kodun kalitesine dikkat edilmiyorsa, programcı için ikinci bir savaş cephesi
daha açılır: oluşan hataları gidermeye çalışma cephesi. Bu çok kısır bir döngünün oluşmasına sebep verebilir, çünkü müşteriye verilen prototiplerde hata sayısı çok yüksek olduğunda, programcı zamanının büyük bir bölümünü açılan ikinci cephede savaşarak harcar. İkinci cephe birim ve entegrasyon testleri yazılarak kapatılabilir ya da açılması engellenebilir.

Buraya kadar tanımladığım yazılım geliştirme süreci başın, ayakların ve kolların nerede olduğunu belli olan bir süreçtir. Ekip neyin, ne zaman yapılması gerektiğini bilir ve çalışmalarını ona göre yönlendirir. Başın, ayakların ve kolların nerede olduğu bilinmeyen ve en kötü ihtimalle bu uzuvların yerlerinin devamlı değiştiği projelere de rastlamak mümkündür. Bu tür projelerde programcı birçok cephede savaş verir. Programcının kendisini en çaresiz hissettiği ve cephanesinin ve motivasyonunun en çabuk azaldığı projeler bu tür projelerdir.

Bu tür projelerde change request çok başka bir kimliğe bürünerek programcılara musallat olur: acil iş!

Proje yönetimi acil iş olarak gelen talepleri hemen ekibe delege ederek, sonuç almak ister. Hadi gelin birlikte acil iş olarak gelen bir işin programcı için nelere sebep verdiğine bir göz atalım.

Acil işi öncelikle olağan üstü hal olarak tanımlayabiliriz. Normal proje akışı yanı sıra programcı bu olağan üstü hali normale dönüştürebilmek için birçok adım atmak zorundadır. Genel olarak acil değişiklik isteklerinin trunk olarak isimlendirilen ana kod dalında yapılması mümkün değildir. Bu yüzden programcı yan dal, yani branch oluşturmak zorundadır. Acil iş için gerekli kod değişikliği bu yan kod dalında yapılır ve değişiklikler daha sonra ana kod dalı ile birleştirilir. Bu işleme merge ismi verilmektedir. Her geçen gün ile merge işlemi daha komplike bir hal alır. İki hafta branch üzerinde çalıştıktan sonra muazzam emek ve dikkat sarf etmeden kodun ana dal ile birleştirilebildiğini hiçbir projede görmedim. Branch ve merge işlemleri başlı başına ağır işler olup, programcıyı çok yorarlar.

Bunun yanı sıra yapılan değişikliklerin staging olarak isimlendirilen değişik türdeki test sunucularında test edilmesi gerekmektedir. Bu da tüm ekibi rehin alabilecek türde bir işlemdir. Test sürecinden sonra yeni bir sürüm oluşturulup, bu sürümün müşteri için çalışır hale getirilmesi gerekir.

Şimdi çok acil iş, çok acil iş diye devamlı ekibin çalışma sepetine dökülen bu incilerin, programcıları ruhen ve bedenen ne kadar çok tıkadıklarını anlayabiliyoruz sanırım.

Ben programcıları 500 beygir gücünde yarış arabaları ile kıyaslıyorum. Verin kullanıcı hikayelerini programcının eline ve bir zamanlar Formel 1 yarışlarının olduğu İstanbul Parka salın. Nasıl son speed turladığını göreceksiniz.

Temcit pilavı gibi programcının devamlı acil iş, acil iş diye başına ekşirseniz, o zaman 500 beygirlik bu gücü birinci viteste parkurda koşturuyorsunuz demektir. Bu programcı bir gün ikinci vitese takar ve İstanbul Park’ın arka çıkış kapısından kaçar gider.

Programcılar sahip oldukları potansiyeli kullanarak, işlerini düzenli bir gidişat çerçevesinde en iyi şekilde yapmak isterler. Rahatsız edildikleri bir ortamda tam randımanlı çalışamazlar. Doğrusunu söylemek gerekirse, canları çok sıkıldığında çekip giderler.

Bunun önüne geçmek için şu acil iş ismi altında deklare edilmiş kime ne faydası olduğu belli olmayan anormal durumların bir son bulması gerekiyor. Aksi taktirde 500 beygir gücündeki spor arabalar Edirme-Kars arasında birinci viteste gidip, gelmeye devam ederler. İstediğinizin bu olduğunu zannetmiyorum.


EOF (End Of Fun)
Özcan Acar

Ne Zaman Başımız Göğe Erer?

Geçenlerde öğrenci bir arkadaş fikrimi almak için bana bir soru sordu. Belli bir meblağ için iki ay boyunca fulltime bir yazılım evi için çalışmasının doğru olup, olmayacağı hakkında fikrimi sordu. Bu okulunu aksatır mı diye sordum. Cevabı evet oldu. Benim de cevabım belliydi.

Yazılımda tek sorumluluk ismini taşıyan bir yazılım prensibi var. Birden fazla sorumluluğu olan sınıflar er ya da geç devrilirler. Aynı şey öğrenciler için de geçerlidir. Okulu yanı sıra iki ay gibi uzun bir süre iş peşinde koşturan iki karpuzu tek kolunda taşıyamaz.

Ben 1996 yılından beri freelancer olarak çalışıyorum. Üniversite yıllarında freelance programcı olarak çalışmaya başladım. İki binli yılların dotcom furyasını hatırlayanlar çok iyi bilirler. O zamanlar Java kelimesini yazanlar bile programcı olarak işe alınırdı. Para kazanmanın tadına varanların çoğu üniversiteyi bitiremediler. Ha bugün, ha yarın derken öğrenim yolda kaldı, business ve para kazanmak öne çıktı.

Paranın en büyük özelliği devamlı harcanmak isteyişidir. Para kazanan harcar ve belli bir zaman sonra belli bir hayat standardına kavuşur ve bu standardı korumak ister. Bu yüzden iki binli yıllarda programcı olarak çalışmaya başlayan bilgisayar mühendisi öğrencilerin çoğu bugün diplomasız hayatlarını sürdürüyorlar.

Ayakta kalabildilerse ne mutlu onlara. 2005 senesinden sonra gördüğüm iş ilanlarının hepsinde istinasız bilgisayar ya da benzeri bir mühendislikten mezun programcılar arandığına şahit oluyorum. Ben şahsen diplomanın şahsın yetenekleri hakkında çok fazla bir şey ifade etmediği kanaatindeyim. İnsan üniversiteden sonra kendi yaptığı işi öğrenmeye başlıyor. Lakin iş verenlerde ne yazık ki bir diploma takıntısı var. Bu sebepten dolayı insan eğer okumak üzere yola çıktı ise, o zaman bu işe diploma alarak bir nokta koymalıdır. Sonuç itibari ile çalışan ve tüketen toplumun ödediği vergilerle devlet üniversiteleri işliyor. Öğrenci bir yerde diplomasını alarak topluma da kullandığı kaynakların hesabını vermek zorunda. İşi yarıda bırakmak olmaz. Bu topluma ihanet olur. O yüzden diploma alınacak, bundan kaçış yok.

Şimdi tekrar yazımın başında bahsettiğim öğrenci arkadaşa geri dönmek istiyorum. Bu arkadaş iki aylık fulltime iş için 700 TL talep ettiğini söyledi. Öncelikle şunu söyleyeyim. Bu rakamın freelance bir iş için 700 değil, 7000 TL olması gerekirdi. Sahip oldukları değeri kestiremedikleri için çoğu öğrenci arkadaş böyle kendisini kullandırıyor. Eğer size teklif edilen işin hakkından geleceğinizden eminseniz, o zaman değeriniz ne ise, onu talep edin.

İkinci husus ise kazanılacak 700 TL için koca bir gelecek vaat eden öğrencilik statüsünün rizikoya sokulmasıdır. 700 TL insanın başını göğe erdirmez, ama diploma erdirir. Öğrenci arkadaşlar bunu unutmamalı. Para her zaman kazanılır, diploma bir kere.

EOF (End Of Fun)
Özcan Acar

Agile Türleri

Coca Cola’nın kaç türü var, bilirsiniz… Cola light, Cola zero, Cola classic…. Çevik süreçler için de aynı şey geçerli. Ben çevik süreçleri agile zero, agile light ve hardcore agile ya da classic agile olarak üç bölüme ayırıyorum.

Agile Zero

Çalışma ortamında çevikliğe dair hiçbir ibare yoktur.

Belirtileri

  • Projede hiçbir birim, entegrasyon ya da onay/kabul testi yoktur.
  • Proje kesinlikle zamanında yetişmez.
  • Yeni müşteri gereksinimlerinin uygulamaya eklenmeleri çok zaman alır, çünkü uygulama mimarisi esnek ve değiştirilebilir yapıda değildir. Öyle olsa bile testlerin olmaması, kodun ve mimarinin yeniden yapılandırılması engeller.
  • Uygulamada çok bug vardır ve çoğu keşfedilmemiştir.
  • Uygulama elden test edildiği için hem çok zaman kaybedilir hem de test geniş kapsamlı yapılamaz.
  • Entegrasyon çok zaman alır ya da yer yer mümkün değildir, çünkü uygulama sürekli entegre edilmemiştir.
  • Sürüm belli bir yazılımcının bilgisayarında alınır. O yazılımcı tatile gittiğinde başka bir kurban yazılımcı seçilir. Buna kısaca releaser hopping ismini veriyorum.
  • Müşteriye belirli aralıklarla çalışan bir prototip sunulamaz, çünkü uygulama entegre edilemediğinden çalışır halde değildir.
  • Yazılımcılar stres altındadır ve fazla mesai yapmaya zorlanırlar.
  • Her şey önceden planlanmaya çalışılır. Buna müşteri isteklerinin tam teşekküllü yazılım öncesi tespiti de dahildir.
  • Yazılım öncesinde uygulama mimarisi bir mimar tarafından tespit edilmiştir. Yazılımcılar bu mimaride öngörülen şartlara uymak zorundadırlar. Yeni müşteri istekleri ile mimarinin adapte edilmesi söz konusu iken, kod birim testleri eksikliğinden dolayı yeniden yapılandırılamaz. Böylece uygulama mimarisi yeni müşteri isteklerini taşıyacak şekilde adapte edilemez. Zaten mimar böyle bir şeye içgüdüsel olarak karşıdır. Kısaca yazılımcının uygulama mimarisini değiştirme konusunda inisiyatifi yoktur.
  • Müşteri için piyasadaki rekabet şartlarının değişmiş olabileceği bilindiği halde, sürüm zamanları uzun tutulur. Bu uzun bir zaman diliminden sonra müşteriye sunulan sürümün müşterinin işine yaramayacağı anlamına gelebilir. Kısa zamanlı sürümlerle müşterinin fikri alınmış olsa idi, bu sorunun önüne geçilebilirdi.
  • Son kullanıcılar tonlarca bug bulup, yazılımcıların uzun bir süre bu bugları temizlemek için uğraş vermelerine sebep olurlar. Böylece yeni müşteri gereksinimlerinin implementasyonu geriye atılır.

Agile Light

Scrum gibi bir çevik süreç kullanılıyordur. 

Belirtileri

  • Ekip sadece Scrum kullanarak gerçekten çevik olduğunu düşünür.
  • Projede hiçbir birim ve entegrasyon testi olmayabilir.
  • Çeviklik sadece proje yönetiminden (sprint planlaması ve uygulaması) ibarettir.
  • Sprint sonunda müşteriye çalışır bir sürüm/prototip sunulabilir.
  • Yeni müşteri gereksinimlerinin uygulamaya entegrasyonu çok zaman alır, çünkü test güdümlü yazılım ya da eşli programlama metotları uygulanmaz. Uygulamaya yeni gereksinimlerin eklenebilmesi için uygulamanın yeniden yapılandırmaya ihtiyacı olabilir. Test güdümlü çalışma neticesi olarak geniş kapsamlı birim test seti olmadığı taktirde, uygulamayı yeniden yapılandırmak harikiridir.
  • Ekip yazılımcılar ve testçiler olarak iki guruba ayrılır.
  • Uygulamayı test etmek için geniş çaplı onay/kabul test setleri hazırlanır. Onay/Kabul testlerini hazırlayan testçi ekibidir. Onay/kabul testleri yazılımcılar tarafından geliştirilen birim testlerin yerine hem geçemezler hem de yazılımcılar tarafından kodu yeniden yapılandırmak (refactoring) için kullanılamazlar, çünkü koşturulmaları saatler alır.
  • Uygulama bir sürekli entegrasyon sunucusu kullanılarak entegre ediliyor olabilir.
  • Agile Zero da uygulama mimarisi için söylediklerim agile light için de geçerlidir.

Agile Classic

Ekip katıksız olarak çevik süreç metotlarını uygular. 

Belirtileri

  • Ekibin parçası olan her yazılımcı test güdümlü yazılım yaparak geniş kapsamlı birim testi seti oluşturur. Test güdümlü çalışma zorunluluğu yoktur. Önemli olan testlerin gerçekleri yansıtacak şekilde kodu kapsamalarıdır (code coverage).
  • Proje yönetimi Scrum’da olduğu gibi iterasyon bazlı yapılır. İterasyon uzunluğu 2-4 hafta arasıdır.
  • Jenkins ya da Bamboo gibi bir sürekli entegrasyon sunucu kullanılarak kod devamlı entegre edilir.
  • Kodu yaptığı değişiklikle kıran yazılımcının masasına bunu gösteren bir oyuncak ayı bırakılır. Bu oyuncak ayı kodu kıran bir yazılımcıdan diğerine el değiştirir. Her yazılımcı kodu kullandığı versiyon kontrol sistemine eklemeden önce (commit) tüm birim testlerini koşturarak, kodun içinde bulunduğu durumu kontrol eder. Çalışmayan ya da kırık kod eklenmez.
  • Yeni müşteri istekleri zorluk çekilmeden uygulamaya dahil edilir, çünkü testler sayesinde kodun yeniden yapılandırılması (refactoring) kolaydır.
  • İterasyon sonunda müşteriye çalışan bir prototip sunulur. Müşteri isterse bu prototipi aktif olarak günlük işinde kullanmaya başlar.
  • Yazılımcının sorularını cevaplamak için ya müşteri ekibin yakınlarındadır ya da müşteriyi temsil eden bir vekil vardır. Yazılımcı sorularını doğrudan müşteriye ya da vekiline yöneltir. Müşteri ile yazılımcı arasına analist, proje yöneticisi, firma sahibi ya da başka bir şahıs giremez.
  • Ekipte Scrum Master ya da Product Owner gibi roller yoktur. Ekibin dadıya ihtiyacı yoktur. Ekip içindeki yazılımcılar her şeyden sorumludur.
  • Ekip uygulamayı müşteri isteklerinin öncelik sırasına göre geliştirir. Uygulamaya hangi özelliğin ekleneceğini her zaman müşteri belirler.
  • Yazılımcılar mesailerini sekiz saat ile sınırlı tutarlar. Daha fazlasına gerek yoktur, çünkü yazılım geliştirme süreci planlandığı şekilde ilerler.
  • Her iterasyon sonunda yazılımcılar bir araya gelerek, geçmiş iterasyonu analiz ederler (retrospective). Her yazılımcı düşündüğü artı ve eksiler hakkında düşünce beyan eder. Maksat başkası hakkında olumsuz fikir beyan etmek ya da sorumlu bulmak değildir. Bu da bir geri bildirim türü olduğu için ekip içinde bulunduğu durumu daha iyi kavrar ve tespit edilen olumsuzlukların bir sonraki iterasyonda meydana gelmelerini engeller.
  • Uygulama mimarisi yazılım sistemi ile geliştirilir. Her yazılımcı inisiyatif kullanarak, uygulama mimarisini güncel implemente edilen müşteri gereksimini taşıyacak şekilde adapte edebilir.

Ne zaman çevik oluruz? Kodu hamur gibi yoğurabildiğimizde!


EOF (End Of Fun)
Özcan Acar