Birçok programcının büyük bir büroda çalıştığını düşünelim ve böyle bir ortama girdiğimizi. Programcı olduklarını bilmiyoruz, ne yaptıklarını da. Bu çalışanların ne yaptığını düşünürdük? Büyük ekranlarda devamlı birşeyler yazdıklarını gözlemleyip yazar olduklarını düşünürdük belki. Birşeyler yazana yazar denir. Bu bir roman, bir ders kitabı ya da bir yemek tarifi olabilir ya da bir kod parçası.
Dışardan bakıldığında biz programcılar böyle algılanıyoruz. Bizler de birer yazarız ama bu ünvanı taşımayı hak etmiyoruz. Neden mi? Açıklamaya çalışayım.
Bir yazar kitaplarını okurları için yazar. Baştan savma yazmaz; nasılsa okur ne demek istediğimi anlar demez; bir kitap olsun da, içinde ne olduğu önemli değil demez; roman yazıyorsa roman kahramanlarına abx, xyz gibi anlaşılması zor isimler vermez; o isimleri özenle seçer, onlara kişilik, ruh ve beden verir; kısaca yazar işini severek yapar, bu uğurda yıllarını verir.
Şimdi bir yazarı bir programcı ile kıyaslayalım. İkisi de birşeyler yazıyor. Yazarın yazdıklarını okuyucuları okuyor, programcının yazdıklarını çalışma arkadaşları. Hangi grup daha mutlu okucuyu kitlesi? Ben ikinci guruba dahil olmakla beraber çok mutsuzum. Okuduklarım bana haz vermiyor. Hadi ondan da vazgeçtim. Ne yazdıklarını anlayabilsem…… Bahaneler de hep aynı: “yeterli zamanim yoktu”, “patron programı hemen bitirmemizi söyledi”…. Bir kitap yazarı bu bahanelerle bir kitap yazsa bu kitap ne kadar başarılı olabilir?
Haklı olarak “Bir romanın bir yazarı olabilir. Programlar zaman içinde onlarca ya da yüzlerce programcının elinden geçiyor” dediğinizi duyuyor gibiyim. Bu okunamaz kodun oluşması için bir gerekçe değil. Her programcının benimsemesi gereken birkaç prensip ve pratik ile bu sorunun önüne geçilebilir. Bunların neler olduğuna yazımın ilerleyen bölümünde değineceğim.
Elli yıl oldu neredeyse; programcılar program yazıyor, bilgisayarlar bu programları çalıştırmak için kullanılıyor. Elli yıl oldu ama biz programcılar hala yazarliğa terfi edemedik. Yazdıklarımız okunmuyor. Kendimiz bile bir süre sonra yazdıklarımızı okuyamıyoruz. Bu mu işimize verdiğimiz kıymet?
Elli satırlık bir metodu anlamak beni zorluyor; yüz satırlık bir metot beni çileden çıkartıyor. Sekiz yüz ya da daha fazla satırlık bir metot hakkında ne düşündüğümü anlayabiliyorsunuz sanırım…. Dışarda böyle metotlar bulmak çok kolay. Yazılım dünyası sanki böyle metotlardan oluşmuş…. Yazar olarak ne kadar kötüyüz…. Bu ünvanı hak edebilecek en son meslek gurubu biziz… biz programcılar.
Programcıların yazar olduğu bir evren düşlüyorum, gerçek yazarlar kadar yaptıkları iş taktir edilen, yazdıkları kodun herkes tarafından (buna ev kadınları da dahil) okunabildiği, kod yazarken değişken ve metot isimlerini roman kahramanı olarak görüp, isimlerini özenle seçtikleri, yazdıkları kodun bir hikaye anlattığı programcıların yaşadığı bir evren…
Böyle bir evren var ama bize yüzlerce ışık yılı uzaklıkta, ışık hızı ile hareket edebilsek bile yüzlerce sene sonra erişebileceğimiz bir evren. İyi birer programcı olmaktan yüzlerce ışık yılı ötedeyiz! Şimdi bir düşünce deneyi yapalım ve bu evreni keşfedelim. Düşünce deneyimizde bizim evrenimizden bahsettigimiz evrene seyahat edecek bir programcımız var. Programcımız ışık hızının çok üstünde bir hızla bu evrene gidecek, oradaki programcılarla sohbet edip geri dönecek. Döndü bile; ne kadar hızlı gidip geldi degil mi? Bize neler getirdi ona bir bakalım. Bundan sonrasını bu seyahati gerçekleştiren programcının ağzından okuyacaksınız.
Yolculuğum uzun sürmedi, birkaç saniye… Uzay aracımla programcıların yaşadığı gezegene indim. Beni çok hoş karşıladılar. Bizlerden bir farkları yok. Beni çalışma ofislerine götürdüler. Bir ekip, evrenler arası ışık hızıyla hareket edebilen uzay araçlarının yazılımı ile uğraşıyordu. Koda bakıp bakmak istemediğimi sordular. İlk önce çekindim; programcı olarak böyle roket mühendisliğinden ne anlarım ki… kodu okusamda anlamam imkansız diye düşündüm. Sen yine de bir bak dediler. Baktım. Bir daha baktım. Birkaç satır okudum. O da ne! Ne kadar kolay okunuyor, okuduğum herşeyi anlıyorum. İnanılacak gibi değil. Bizim programlama dilleri gibi if/else/while yapılar kullanıyorlar, ama yazdıklari kod roman gibi okunuyor. Çok temiz ve sade. Metotlar çok kısa tutulmuş, verilen isimler çok anlamlı. İnsan ne okuduğunu hemen anlıyor. Çok şaşırdım! Bizim dünyamızda durum çok farklı. Zamanımızın büyük bir bölümünü başkalarının yazdığı kodu anlamak için saatler boyu debugging oturumlarında harcıyoruz. Nasıl program yazdıklarını soruyorum. İçlerinden birisi şunları söylüyor:
- İlk önce bir test yazıyoruz. Ortada hiç birşey yok, sadece test kodu var.
- Daha sonra kodu yazmaya başlıyoruz. Testler bizi yönlendiriyor. Herhangi birşeye dikkat etmeden testlerin çalışır hale gelmesi için kodu geliştiriyoruz. İlk sürümde metotlar uzun, isimleri anlaşılmaz olabiliyor, ama ilk sürüm de bunlar önemli değil. Önemli olan kodu çalışır hale gelmesi.
- Kod çalışır hale geldikten sonra tekrar tekrar gözden geçirip, herşey anlaşılır hale gelene kadar değişiklik (refactoring) yapıyoruz. Elimizde otomatik çalışan testler olduğu için refactoring bizim için hiç sorun değil.
- Yaptığımız her değişikliğin ardından testleri koşturarak oluşan yan etkileri tespit etmeye çalışıyoruz. Testler yan etkileri hemen bulmamızı sağlıyor. Bu bizim güvenimizi ve cesaretimizi artırıyor. Çok ufak adımlarla refactoring yapıyoruz. Kodu böylece yavaş yavaş yoğuruyoruz.
- Programlarımızı KISS (Keep It Stupid Simple = Kısa tut) prensibine göre geliştiriyoruz. Her zaman en basit çözümü tercih ediyoruz. Basit olmayan çözümler kodun okunurluğunu olumsuz etkiliyor. Aramızda en iyi algoritmaları kim yazdı yarışı yapmıyoruz, en basitini ve okunuru kim yazdı yarışı yapıyoruz. Okunmayanar kod gözden geçirme oturumlarında diskalifiye oluyor
- Kod tekrarlamasını önlemek için DRY (Dont Repeat Yourself = Kendini tekrarlama) prensibine sadık kalıyoruz. Kod tekrarları programın geliştirilmesinin önünde büyük bir engel.
- Belirli etaplarda birden fazla çalışma arkadaşımızla kodu beraber gözden geçiriyoruz (code review). Burada amacımız kodu daha da okunur hale getirmek. Çalışan testlerimiz olduğu için kodu değiştirmek bizim için çocuk oyuncağı. Kodu bu şekilde yoğurmak bir zaman sonra çok zevkli bir uğraşı haline geliyor. En geç kod gözden geçirme oturumlarımızda uzun metotları ortadan kaldırma fırsatı buluyoruz.
- Yazdığımız metotlar en fazla dört satırdan oluşuyor. Her sınıfın ve metodun sadece bir sorumluğu (SRP) var. Sınıf, metot ve değişken isimlerini çok özenle seçiyoruz. Kesinlikle bir kod parçasını açıklamak için koda yorum eklemiyoruz. Kod yoruma ihtiyaç duyuyorsa o zaman ya seçtiğimiz isimler yetersiz ya da kodun birden fazla metoda bölünmesi gerekiyor. Kodu okunur hale getirmek için bir sebep daha.
- Genel olarak kod yazarken SOLID prensiplerine dikkat ediyoruz. SOLID testler kadar önemli.
- Testler bizim için yazdığımız kod kadar önemli. Test kodunu da zaman zaman gözden geçirip daha okunur hale getirmeye çalışıyoruz. Testlere üvey evlat muamelesi yapmıyoruz.
Bunların yanında kırık cam metaforu bize devamlı izci kuralını hatırlatıyor. Kırık cam ve izci kuralı nedir diye soruyorum. Programcı arkadaş şu şekilde açıklıyor:
Tamir edilmeyen bir cam mahalle sakinlerinde terkedilmişlik hissi uyandırır. Bu kırık cam binaya sahip çıkılmadığının göstergesi olarak algılanır. Kısa bir zaman sonra başka pencere camları kırılır ve bina sakinleri ya da bölgede oturan diğer şahışlar düzensizliğin artmasını çabuklaştırırlar. Binaya sahipleri tarafından sahip çıkılmadığı taktirde bina büyük hasar alır. Artan hasar nedeniyle bina sahipleri binayı tekrar düzene sokma şefkini yitirebilirler. Program kodları kırık cam misali düzensizlikler giderilmediği taktirde zamanla bakımı zor hale gelirler. Programcı izci kuralını uygulayarak koda sahip çıkar.
Her izcinin uyduğu bir kural vardır:
“Kamp yaptığın yeri bulduğundan daha iyi bir şekilde bırak!”
Biz programcı olarak geride bıraktığımız kodun kalitesi, işe başladığımızda bulduğumuz kodun kalitesinden daha iyidir. İzci kuralını uygulayan programcı kırık cam prensibinden dolayı oluşan düzensizlikleri gidermiş olur. İzci kuralının uygulanması durumunda kırık cam hiç oluşmaz ya da mevcut kırık camlar tek tek tamir edilmiş olur.
Bu programcılarla sohbetimiz saatler boyu sürdü. Birşeyi çok iyi anladım ki o da bu programcıların işlerini çok severek yaptıkları. Aramızda ne kadar büyük farklılıklar varmış! Bu programcıların benimsedikleri ve günlük iş hayatlarında uyguladıkları prensipler, pratikler ve bir değer sistemi varmış meğer. Vaybe! Keşke burada kalabilsem ve bu muazzam yazarlarla çalışabilsem. Onlarla çalışmak ne kadar zevkli olurdu kimbilir. Yaptıkları işten çok büyük haz aldıkları ve ortaya çıkan kodla gurur duydukları yüz ifadelerinden ne kadar da belli oluyor. Benim dünyamda programcılar devamlı endişe içinde. Kafalarındaki sorular hep aynı: “programı zamanında yetiştirebilecek miyim?”, “anlamadığım şeyi nasıl değiştireyim ben şimdi”, “bu metot bu kadar uzun olmak zorunda mı ya!”, “neden bu mesleği seçtim? herkesin pisliğini ben mi temizlemek zorundayım?”, “bir an önce yönetici olupta bu pislikten kurtulayım bari, zaten bir ömür programcılık yapan adama kim kıymet verir”….. Biz programcılar kendi dünyamızda çok mutsusuz. Bu değişmeli. Zaman ne çabukta geçmiş. Geri dönmem gerekiyor artık.
Uzay aracıma binmek ve dünyama geri dönmek üzere yola çıkıyoruz. Uzay aracıma doğru giderken tekrar yaşadıklarımı gözden geçiriyorum. Programcılık ve yazarlık arasındaki parallelliği ve farklılığı daha değişik bir gözle görüyorum. Programcılık yazarlık demek, bir yazardan farklı birşey yapmıyoruz, ama bir yazardan çok farklı bir şekilde yazıyoruz. Bunun değişmesi gerektiğini düşünüyorum. Bu mesajı mutlaka kendi dünyamdaki programcılarla paylaşmalıyım.
Böyle düşüncelere dalmışken, uzay aracıma geliyoruz. Beni bu evrenin programcıları uğurluyorlar. Bana veda ederken elime bir adet “Clean Code” isimli kitabın nüshasını tutuşturuyorlar. Aralarından birisi “biz bu kitabı sizin dünyanızda keşfettik, bizim için çok faydalı oldu, siz de mutlaka bir göz atın” diyor. Bu kitabı tanıyorum: Robert C. Martin yazmış. Okuma firsatı bulamamıştım. Şimdi mutlaka okuyacağım. Elveda diyorum ve uzay gemime biniyorum. Birkaç saniye geçiyor… Tekrar kendi dünyamdayım. Artık bir yazar olmaya karar veriyorum, programcı bir yazar….
Siz de bir yazar mısınız?
EOF (End Of Fun)
Özcan Acar
Elinize sağlık hocam. Kodlama kalitesi ancak bu kadar güzel anlatılabilirdi herhalde.
Hocam elinize sağlık. Farklı bir üslüp ile güzel ve yalın bir anlatım olmuş.
Tesekkür ederim hocam, sagol. Farkli üslup derken rahatsiz edeci olmamistir sanirim. Düsük cümleler kullanarak konu ile ilgili ruh halimi ifade etmeye calistim ;-)
Üstad eline sağlık..Güzel bir yazı olmuş…
Umarım bir gün düşlediğin evrende çalışma imkanı bulursun :)
Teşekkürler Özcan Bey. Son günlerde okuduğun en güzel, öz ve ruh halimizi genel olarak yansıtan bir yazı olmuş.
Malesef gerçek dünyadaki yazılım mühendisliği, ideallerimizkinden çok uzakta. İnşallah bir gün gelir de ortak bir noktada buluşurlar.
Bu yüzdendir ki, pek çok yazılımcı, belirli bir yaştan sonra, ya yönetici olmaya çalışıyor ya da sektör değiştiriyor. İş hayatımın ilk yıllarında 30 yaşında sonra yazılımcıların tavuk çiftliği kurma hayali kurmaya başladıklarını duyduğumda çok şaşırmıştım. Niye bilgi, tecrübe ve dinamizminin doruğundaki bu insanlar terk etmeyi düşünsün ki !
Ancak malesef fiili durum bunu gerektiriyormuş demek ki. Özellikle ülkemizde (hiç yurt dışında çalışmadım) sizin bahsettiğiniz gerçek yazılım mühendisliğine ihtiyaç yok. Beklentiler genelde günü kurtarmak, istenilenleri en kısa zamanda yerine getirmek üzerinde. Sürdürülebilirliği, bakımı, kaliteyi kimsenin takmadığını düşünüyorum.
Aracını tamire götürdüğünde, “en iyi ustaya götüreyim”, “yetkili servise götüreyim”, “aman usta iyi bak, bi daha olmasın, sağlam olsun, ne gerekiyorsa yap” diyen yöneticiler, koskoca kurumlarda, koskoca projeler geldiğinde, 1 ayda bitirilecek deyiveriyorlar. Araba tamircilerinin ustalıklarına değer verildiği kadar, yazılımcıların mühendisliklerine değer verilmediğini düşünmekteyim.
Çok ta karamsar olmaya de gerek bence. Sektörümüz daha çok yeni. Yönetim kademeleri yeni yeni değişiyor. Yazılım, hizmet sektörü olmaktan, üretim sektörü olmaya geçtiğinde kendi borumuzu öttürebileceğimiz kanaatindeyim.
Sağlıcakla kal, gelecekte sizin gibi yöneticilere çok ihtiyaç olacak.
Not: Tavuk Çiftliğini nereye kuralım ? Ben krediyi ayarladım.
Zaman ayirip yorum yazdiginiz icin tesekkür ederim, sagolun.
eyvallah, insallah bir gün :)
Hayır hocam:) Ben yanlış ifade ettim sanırım. Farklı üslüptan kastım, anlatımda hikayeleme tarzını kullanmanızdı. Bu, konuyu daha hayal edilebilir ve anlaşılır kılmış. Hikayeyi yaşayan “programcı” ile hikayeyi direk onun ağzından dinlediğimizden rahatlıkla empati kurabiliyoruz. Herkesin anlayabileceği bir dilden(yazılımcı harici kişilerin de anlayabileceği) anlatmışsınız, tekrar teşekkür ederim.
Merhaba Hocam ,
Bu sektördeki en büyük açığı iyi bir şekilde özetlemişsiniz.Şu dönemdeki yazılımların kalitesizliği bence zaman içinde agile , lean ve tdd gibi hayati derecede önemli olan konuların genç yazılımcılar (bende bu gruptayım) tarafından daha iyi anlaşılması ve bu kişilerin sektörde üst seviyelere gelmesi ile birlikte bir nebzede olsa azalacaktır.Günün yarısı daha önce yazılan kodların arasında hata ayıklamakla geçiyorsa bir yazılımcı nasıl üretken olabilirki? işte tamda burada yöneticilerin bunu anlaması ve önlem alması gerekiyor bu önlemlerin en başındada kaliteli bir yazılım ekibi kurmak ve olması gereken süreçlere gerçekten uymak geliyor.
İyi çalışmalar
Nasil bilge programci olunur isimli bir projeniz olacakti yanlis hatirlamiyorsam. Bir blog yazinizda okudugumu hatirliyorum. Bu proje ile ilgili son durum nedir? Gerceklestirecekmisiniz?
Bunu soruyorum cünkü sanirim cogu yazilimci benzer sorunlari yasiyor. Kendini nasil gelistirmesi gerektigini yada gelistirirken hangi adimlari izlemesi gerektigini bilmiyor.
Ayni durumda olan biri olarak sizin bu projenezi dört gözle bekledigimi belirtmek isterim.
Iyi calismalar
Yakinda tamamlayacagim insallah. Bilgiprogramci.com dan takip edebilirsiniz.
Vayy be!!! Sadece bende mi oluyor bilmiyorum, Özcan Acar hocam, yazdıklarınız o kadar müthiş şeyler ki… İnsanın hayal gücü bambaşka bir boyuta geçiyor. Ben hiç bu şekilde bakmamıştım kodlara, bu şekilde hiç hayal etmemiştim.
Evet haklı, kodun ilk başta çalışması önemli ancak, çalışır vaziyete getirirken kodun ne yaptığı çok önemli. kötü kod yazmamalıyız. Şöyle düşünüyorum, iyi bir yazar yazdığı kitabı okunsun amacıyla yazmaz. Oda bilir, değerinin daha sonra anlaşılacağını… Sadece kalıcı bir şey bırakmak için. Bizler bu yazarlıktan alacağımız şey ise; yazdığımız kodun bizden sonra gelenler için kaliteli bir kod oluşudur.
Ben umarım iş hayatına atıldığımda gerçek dünyanın gerçeklerine yenik düşmem. Ben isterim ki, çalıştığım şirkette kod yazarken mutlu olmak isterim. Yaptığım işi geçim sağlamak değil, kalıcı ve yapıcı olmak için çalışırım.
Clean Code kitabını bende okumak isterim. Şuan ingilizce düzeyim temel, en kısa zamanda geliştirip, amazondan ingilizce kitapları sipariş verip Java’da daha ince konularda kendimi geliştirmek…
Daha sonra blogum belki ileride türkçe kaynak içim üzerime düşenin fazlasını yaparım… :)
Ellerinize sağlık hocam.