İyi Programcı, Kötü Programcı

Ben kendimi nihayetinde programcı olarak görme eğilimindeyim. İşin matematiksel, mühendislik, sanatsal vb. taraflarının hepsinden çok zevk alıyorum. Gerek algoritmik çözümlemeler, gerek üzerine tekrar tekrar düşünerek, daha da etkin hale getirdiğim kod yapısı, çalışma zamanı performansı, bu sırada hissettiğim estetik kaygılar vs. hepsi bana çok zevk veriyor.

Eskiden bu yana, değişik fırsatlarla, kendimi teyzeler, amcalar arasında buluyorum. (Açıkçası, artık çocuklarımın arkadaşları da bana amca diyorlar ama, o tarafa girmeyelim şimdilik 🙂 ) Memleketim Ayvalık’ta olsun, Anadolu’nun farklı yerlerinde olsun, İstanbul’da olsun, aile, eş-dost, akraba vs. ortamları kastediyorum. Eskiden böyle ortamlarda doktor ve avukat olmak problemliymiş, herkes derdini anlatırmış. Uzun zamandır bu mesleklere bizler de eklendik, herkesin bilgisayar vs. ile ilgili bir derdi var. 500-600 km araba sürüp, gittiğim misafirlikte modem-wireless tamiri yaptığımı biliyorum.

Neyse, bu amcalar ya da teyzeler benim yazılımcı ya da amiyane tabirle “programcı” olduğumu öğrendiklerinde, etraflarındaki, örneğin torunları, “programcı”lardan söz açıp, konuyu “o da seninle aynı işi yapıyor”a getirirler. “Eyvallah, çok güzel” diye cevap veririm ben de. Eskiden merak edip, “aaa öyle mi?” diye de saf saf sorardım. Sonra, 5-10 dakika sonra, o torun gelirdi: 17-18 yaşlarında, meraklı, radyoyu parçalayıp ondan bir çamaşır makinesi çıkarma ruhuna sahip, cevval ama eğitimsiz, örneğin orta okuldan terk ya da meslek lisesinde okuyan bir genç örneğin. Tanışırız, konuşuruz, o doğmadan önce benim Fortran ya da C ile uğraşmışlığımın olduğu ortaya çıkar örneğin. Bu işleri yurt dışında öğrenmiş olmam, ne bileyim Netscape tarayıcısının ya da Java’nın yayınlandığı günleri hatırlamam, büyük projelerde, GE gibi yerlerde çalışmış olmam, tecrübelerim, C# ile ilgili soru sorduğunda rahatça “bilmiyorum” demem, vs. vs. sonuçta, tüm bunlar o gençte bana karşı son derece yüksek bir saygı, imrenme vb. duygular oluşmasına sebep olur. Bunu rahatlıkla farkedersiniz.

Size bir sır vereyim mi? Yukarıda saydığım ve o gencin bende görüp de içini çektiği, imrendiği bu şeylerin hiç birisi beni ondan daha iyi bir programcı yapmaz. Yukarıdakilerin hiç birisine kanıp da siz de birisinin iyi programcı olduğuna karar vermeyin. Peki, nedir iyi programcıyla, kötü programcıyı birbirinden ayıran şey? EJBleri çok iyi bilmek mi? Ya da yüzlerce kişiden oluşan bir yazılım projesinin parçası olmak mı? Ya da C, C++, ya da Java’yı sular seller gibi bilmek mi? Örneğin yukarıda bahsettiğim genç ile bana bir algoritmik ödev verin, mesela pi’ye en hızlı şekilde ve en az bellek harcayarak yakınsamak ya da başka bir graf sorusu örneğin, muhtemelen ben daha hızlı ve güzel bir şekilde yaparım o ödevi. Ya da bir proje verin ikimize de, son derece basit, Fahrenheit-Celcius çevirisi yapacak bir web yapısı kurmamızı isteyin örneğin. Muhtemelen ben, o gencinkine göre çok daha sağlıklı bir mimari ve çok daha performanslı ve scalable olacak şekilde bu projeyi tamamlarım. Yani programlama faaliyetinin ister matematiksel ister mühendislik taraflarında muhtemelen ben çok daha iyi performans gösteririm. Ama yine de bunların hiç birisi beni ondan daha iyi programcı yapmaz. Bunların hiç birisi, birisinin diğerinden daha iyi programcı olduğunu göstermez.

Nedir peki iyi programcıyı, kötü programcıdan ayıran en temel şey? Çok basit bir cevabı var bu sorunun. İyi programcılar, yazdığı kodu her yönüyle anlarlar ve başkasının anlayacağı şekilde kod yazarlar. Kötü programcılar ise ne yazdığını her yönüyle anlamazlar, bırakın bir başkası, kendisi bile bir müddet sonra ne yazdığını zor çözer.

Yani kötü programcı şöyle kod yazar:

...
cardInfo.setIdNo(cardInfo.getTcCitizen() ?                               
 (formUtils.isNullOrEmptyString(verifyOtpWSResponse.getTckn()) ? 
  registrationForm.getTckn() : verifyOtpWSResponse.getTckn()):   
(formUtils.isNullOrEmptyString(verifyOtpWSResponse.getCustno())) ? 
  registrationForm.getTckn(): verifyOtpWSResponse.getCustno());
...

İyi programcı ise böyle kod yazar:

// Burada CardInfo’nun Idsi atanır. Id olarak eğer musteri TC vatandasi ise
// ve ya WS’den ya da fromdan gelen tckn atanır. Eğer müşteri TC vatandaşı
// değilse Id olarak customerNo alınır. 
// Burada da yine ya WS’den ya da formdan gelen customer no atanır.

String idNo = null;
Boolean isTcCitizen =  cardInfo.getTcCitizen();
String tcknFromForm = registrationForm.getTckn();
String tcknFromWS = verifyOtpWSResponse.getTckn();
boolean nullOrEmptyTcknFromWS  = formUtils.isNullOrEmptyString(tcknFromWS);
String custNoFromWS = verifyOtpWSResponse.getCustNo();
boolean nullOrEmptyCustNoFromWS  = formUtils.isNullOrEmptyString(custNoFromWS);
  
 if(isTcCitizen){
      if(nullOrEmptyTcknFromWS)
          idNo = tcknFromForm;
      else
          idNo = tcknFromWS;
 }
 else{
       if(nullOrEmptyCustNoFromWS)
          idNo = tcknFromForm;
      else
          idNo = custNoFromWS
 }
 cardInfo.setId(idNo);

Max Kanat-Alexander’ın Code Simplicity isimli kitabında dediği gibi:

İyi programcıyla kötü programcı arasındaki fark anlamadır. Yani kötü programcılar ne yaptıklarını anlamazlar, iyi programcılar ise anlarlar. İster inanın, ister inanmayın ama bu gerçekten bu kadar basittir.

(The difference between a bad programmer and a good programmer is understanding . That is, bad programmers don’t understand what they are doing, and good programmers do. Believe it or not, it really is that simple.)

Ya da Martin Fowler’ın, Refactoring isimli kitabında yazdığı gibi:

Herhangi bir insan bilgisayarın anlayabileceği kod yazabilir. İyi programcılar ise insanların anlayabileceği kod yazarlar.

(Any fool can write code that a computer can understand. Good programmers write code that humans can understand.)

Evet bu fark, hakikatten bu kadar basittir. Yukarıda bahsettiğim genç ile beni sınarken yaptığımız ödevleri bir başka programcıya verin ve ciddi bir değişiklik yapmasını isteyin. yYaptığımzı şey bir algoritma ise, bir kaç adım sıkıştırın araya, ya da bir proje yapmışsak bir süreçte ya da iş kuralında değişiklik yapılmasını isteyin. Hangimizin kodu ya da projesi en kısa sürede bu üçüncü programcı tarafından başarıyla değiştirilebilirse, bilin ki en iyi programcı odur.

Linus Torvalds’ın dediği gibi, “Konuşmak ucuzdur. Bana kodu göster.” (Talk is cheap. Show me the code.)

Toplam görüntülenme sayısı: 2256