Kod kalitesi hakkında düşüncelerim

Ben yedi yıldır kod yazmakla meşgulüm. Kod yazmak benim için ekmek parasından daha fazlasını ifade ediyor. Şimdiye kadar farklı sektörlerin ihtiyaçları için websiteleri, crm sistemleri, entegrasyonlar kodladım. Ama geçtiğimiz yıldan öncesine kadar “Ne kadar kaliteli kod yazıyorum?” sorusunu kendime hiç sormamıştım. Her projede tek başıma çalışıyorum, benim kodumu inceleyen başka geliştiriciler de olmadığı için “Ben doğru yolda mıyım?” nereden bileceğim? “Benim kodum gerçekten kaliteli mi?” gibi sorulara cevaplar aramaya başladım. Bu yazı yazdığım kodun kalitesini nasıl yükseltebileceğim, neler yapabileceğim, hangi araçları kullanabileceğim hakkında olacak. Yanlış bildiğim/bilmediğim ve ya eklenmesi gereken şeyler var ise yorumlarda iletirseniz çok sevinirim.

Neden kaliteli kod yazmalıyım?

Kendime sorduğum ilk soru buydu aslında. Şurada Osman Yüksel ‘in çok güzel bir yazısı var. Ben de “kaliteli kod yazarsam maaşım mı yükselecek?” gibi bahaneler türettim hep. Ama bunlar hep tembellikten arkadaşlar. Çalıştığım şirket kaliteli kod yazıyorum diye maaşımı yükseltmeyecek evet ama kaliteli kod yazdığım için bir sonraki işim daha büyük bir ekip içinde daha büyük projeler geliştirmek olabilir. Şuan “tek başıma yazıyorum çatır çatır çalışıyor, benden başka da kimse kodumu okumuyor” diye DGOP(Daya Geç Yönelimli Programlama) ve HDD(Hasbelkader Driven Development) metodolojisi ile yürütürüm diyordum. Peki işin içine başka bir geliştirici girdiği zaman ne olacak? Her gün kullandığımız açık kaynak yazılımları benim gibi yürüyen geliştiriciler kodluyor olsaydı? Ben sonraki işimde onlarca geliştirici ile birlikte takım olarak çalışmak zorunda olursam? Kısacası Önceki yazılımcı olarak kulaklarım fazla çınlamasın, ve sonraki işimde başarısız olmayayım, her şeyden önemlisi de işime olan sevgim ve saygım tükenmesin, hatta geri kalmayayım diye kaliteli kod yazmalıyım. Hem unutmayalım ki sevmeden başarılı olamayız.

Bir de bu konuda Lemi Orhan Ergin 'in Takımlar İçin Yazılım Geliştirme Manifestosu nu ve Yavuz Çalışır 'ın Kod Kalitesi'ne Dair başlıklı medium postunu okumanızı dilerim.

Peki kod nasıl kaliteli olur?

“Nasıl bulmak istiyorsan öyle bırak” felsefesi benimsenmiş ise kod kaliteli olur bence.

Nasil bulmak istiyorsan oyle birak  i697464

Ciddiyim. Ben önceki yazılımcıdan aldığım projede şunların olmasını isterim.

  • Readme
  • Dökümantasyon
  • Versiyon kontrol sistemi
  • Bağımlılık yönetimi
  • Kod içi yorumlar
  • Gerekli ise todo, fixme notları
  • Gerekli ise testler
  • Linter, kod analiz aracı
  • Temiz kod

Yukarıdaki maddelere uygun şekilde geliştirilen proje bence kaliteli kodlanmıştır. O zaman bu maddeleri nasıl uygulayacağımızdan bahsedebiliriz.

Readme ve dökümantasyon

Readme markdown formatında yazılan projenin özet, içindekiler, gereksinimler, kurulum, kullanım, geliştirme rehberidir. Ek olarak readme dosyasında projenin şuanki statüsü ve kısa bir todo listesi bulunabilir. Dökümantasyon gerekli ise docs diye bir dizin içinde yine markdown formatında düzenli yazılması iyidir. Şuraya bir de güzel readme örneği koyalım.

Versiyon kontrol sistemi

Git, mercurial, svn gibi araçlar kullanılabilir. Commit mesajları yapılan ekleme, silme, değiştirme hakkında detaylı bilgi verebilmeli. Basit bir aramayla ideal commit mesajı nasıl yazılır/yazılmalı hakkında bilgi bulunabilir. Commit mesaj başlığı 50 karakteri geçmemeli, cins cins karakterlerle yazılmamalı, mesaj gövdesinde gerekliyse detaylı bilgi verilmeli.

Bağımlılık yönetimi

Herhangi bir üçüncü parti yazılım ve ya kütüphaneye ihtiyaç varsa uygun versiyonu ile, hatta mümkünse npm(javascript)(package.json), composer(php)(composer.json), bundler(ruby)(Gemfile) gibi bir araçla kurulabilmeli.

Yorumlar ve todo, fixme notları

Her sınıf, metod, fonksiyon, parametre, değişken için bilinmesi gerekenler yorum ile açıklanmalı. Örnek olarak şuraya bakabilirsiniz. Todo ve fixme notları da yorumlar ile aynı şekilde yazılır. Kullandığınız dilin yorum satırında aşağıdaki gibi belirtebilirsiniz.

/* todo: yeni özellikleri yaz /
/* fixme: xx sorununu düzelt */

Testler

Testlerin farklı türleri vardır. Unit, integration, functional, performance vs. Test yazmak her projede gerekli değildir bence. Test yazmak proje süresini uzatabilir. Bu istenmeyen durum olduğu için TDD metodolojisi pek tercih edilmiyor çevremde. Belki 100 satırlık bir controller için 300 satırlık test yazmanız gerekebilir. Ama yazmakta fayda vardır. Bu konuda daha fazla araştırma yapabilir ve ya şu yazıyı okuyabilirsiniz.

Linter, kod analizi

Linter dediğimiz şey kodun beşlirlenmiş kod standartlarına uyup uymadığını kontrol eden ve istenirse kodu otomatik düzeltebilen araçlara verilen genel bir isimdir. Örneğin javascript için jslint, jshint, eslint gibi araçlar, php için phpcs, phpmd, phploc gibi araçlar, ruby için rubocop, reek gibi araçlar mevcuttur. Hemen hepsinde hazır belirlenmiş bazı standartlar vardır. Mesela php için pear, phpcs, psr1, psr2, squiz, zend, wordpress, joomla gibi belirlenmiş standartlar var. Javascript için airbnb var mesela. Ben ruby için rubocop, php için phpcs, javascript için de eslint kullanıyorum ve tavsiye ediyorum.

Temiz kod

Temiz koddan kastım kodun okunaklı olması, sınıf, metod, fonskiyon, değişken ve parametre isimlerinin alakasız saçma şeyler olmaması, kodun kendini tekrar etmemesi, proje dizin yapısının mantıklı olması gibi maddeler. Bunlara daha çok madde eklenebilir.

Sonuç

Yukarıdakileri uygularsak kodumuz kaliteli olur diye düşünüyorum/inanıyorum. Eklemek ve ya düzeltmek istediklerinizi yorumlarda belirtebilirseniz çok sevinirim. Esen kalın 🙏🏻