Bir yazılım değişikliğinin canlıya çıkmadan önce geçtiği kontrollerin çoğu otomatiktir: derleme, testler, statik analiz. Ancak bu araçların cevaplayamadığı sorular vardır. Bu değişiklik doğru problemi mi çözüyor? Bir yıl sonra bu kodu okuyan biri ne yapıldığını anlayabilecek mi? Kullanıcının karşılaşacağı bir uç durum gözden kaçtı mı? Kod incelemesi, bu soruların bir başka geliştiricinin gözüyle sorulduğu aşamadır.
Kod incelemesinin üç amacı
- Hataları erken yakalamak: Mantık hataları, eksik hata yönetimi ya da güvenlik açıkları çoğu zaman yazan kişinin değil, okuyan kişinin dikkatini çeker.
- Bilgiyi yaymak: İnceleme, kod tabanının belirli bir bölümünü yalnızca tek bir kişinin bilmesini engeller. Biri izindeyken ya da ekipten ayrıldığında sistem sahipsiz kalmaz.
- Tutarlılığı korumak: Aynı problemin farklı yerlerde farklı biçimlerde çözülmesi, kod tabanını zamanla karmaşık hâle getirir. İnceleme, ortak desenlerin kullanılmasını teşvik eder.
İyi bir birleştirme isteğinin özellikleri
İncelemenin kalitesi, büyük ölçüde incelenen değişikliğin nasıl hazırlandığına bağlıdır.
Küçük ve tek amaçlı
Yüzlerce dosyayı etkileyen bir değişiklik, dikkatli incelenemez. İnceleyici bir noktadan sonra genel bir onay vermek zorunda kalır. Tek bir amaca odaklanan, makul büyüklükteki değişiklikler hem daha hızlı hem de daha derin incelenir. Büyük bir özellik, sırayla birleştirilebilecek küçük adımlara bölünebilir.
Açıklaması olan
Birleştirme isteğinin açıklaması; değişikliğin neden yapıldığını, nasıl test edildiğini ve inceleyicinin özellikle dikkat etmesi gereken noktaları anlatmalıdır. Arayüz değişikliklerinde ekran görüntüsü eklemek, inceleyicinin değişikliği çalıştırmadan anlamasını sağlar.
Otomatik kontrollerden geçmiş
Stil ve biçim tartışmalarını insanlara bırakmamak gerekir. Biçimlendirme ve kod stili araçları otomatik çalıştığında, inceleme gerçekten önemli konulara odaklanır.
İnceleyici neye bakmalı?
- Doğruluk: Kod, açıklamada anlatılan şeyi gerçekten yapıyor mu? Boş, eksik ya da beklenmedik girdilerde ne oluyor?
- Branş ayrımı: Acente yazılımında trafik, kasko ve DASK akışları farklı kurallara sahiptir. Bir branş için yazılmış mantığın, ortak bir bileşen üzerinden diğerlerine sızıp sızmadığı kontrol edilmelidir.
- Yetki ve veri erişimi: Yeni bir uç nokta ya da ekran, kullanıcının yalnızca yetkili olduğu veriyi mi gösteriyor? Bir şubenin kullanıcısı başka bir şubenin müşterisini görebiliyor mu?
- Kişisel veri: Loglara, hata mesajlarına ya da analitik olaylarına kimlik numarası, telefon veya plaka gibi bilgiler yazılıyor mu?
- Testler: Değişiklik için anlamlı testler eklenmiş mi? Testler yalnızca mutlu yolu mu kapsıyor?
- Okunabilirlik: Değişken ve fonksiyon adları ne yaptıklarını anlatıyor mu? Karmaşık bir bölümün neden böyle yazıldığı açık mı?
Geri bildirim nasıl verilmeli?
Kod incelemesi teknik bir süreç olduğu kadar iletişim sürecidir. Yapıcı bir inceleme kültürü için bazı alışkanlıklar faydalıdır:
- Kişiye değil koda odaklanmak: "Burada şu durum ele alınmamış" ifadesi, "Bunu unutmuşsun" ifadesinden daha yapıcıdır.
- Önem derecesini belirtmek: Birleştirmeyi engelleyen bir sorun ile isteğe bağlı bir öneri açıkça ayrılmalıdır.
- Gerekçe sunmak: Bir değişiklik önerirken nedenini kısaca açıklamak, yazanın aynı durumu gelecekte kendisinin fark etmesini sağlar.
- İyi olanı da belirtmek: Zarif bir çözüm ya da kapsamlı bir test, takdir edilmeyi hak eder.
İnceleme hızı da kalitedir
Günlerce bekleyen birleştirme istekleri, geliştiricinin bağlamı kaybetmesine, değişikliklerin birikmesine ve çakışmaların artmasına neden olur. İnceleme taleplerine makul bir süre içinde yanıt vermek, ekip içinde açık bir beklenti olmalıdır. Bunu desteklemek için küçük değişiklikler ve net açıklamalar yine en etkili araçlardır.
Kimler incelemeli?
Her değişikliği en kıdemli geliştiricinin incelemesi hem darboğaz yaratır hem de bilgi yayılımını engeller. Daha dengeli bir yaklaşım, kod sahipliğine göre en az bir uzmanın ve gerektiğinde ekibin farklı bir üyesinin incelemesidir. Güvenlik, ödeme ya da veri erişimi gibi hassas alanlarda ise ek bir inceleyici zorunlu tutulabilir.
Acenteler açısından
Kod incelemesi acente kullanıcısının hiç görmediği bir süreçtir; ancak sonuçları her gün hissedilir. Yetki kontrollerinin tutarlı olması, CRM verisinin yalnızca yetkili kişilere görünmesi ve yeni özelliklerin mevcut akışları bozmadan gelmesi, bu görünmez kontrolün ürünüdür. Bir acente yazılımı sağlayıcısının her değişikliği en az bir başka geliştiricinin gözünden geçirip geçirmediğini sormak, yazılım kalitesine dair basit ama anlamlı bir göstergedir.
Küçük ekiplerde inceleme
Birkaç kişilik ekiplerde kod incelemesi lüks gibi görünebilir; herkes zaten her şeyi biliyordur. Ancak küçük ekipler, tek bir kişiye bağımlılıktan en çok etkilenen ekiplerdir. Bu nedenle incelemeyi hafif ama sürekli tutmak önemlidir.
- Eşli çalışma: Karmaşık bir değişiklik iki geliştirici tarafından birlikte yazıldığında, inceleme yazım sırasında gerçekleşmiş olur.
- Kayıtlı kısa inceleme: Basit değişikliklerde bile en az bir kişinin onayı aranır; amaç derin analiz değil, ikinci bir gözün değişiklikten haberdar olmasıdır.
- Sonradan inceleme: Acil bir düzeltmenin hemen yayına alınması gerektiğinde, değişiklik yayından sonra mutlaka incelenir ve gerekirse iyileştirilir.
Otomatik inceleme araçları da küçük ekipler için güçlü bir destektir. Bu araçlar olası hataları ve güvenlik risklerini işaretleyerek insan inceleyicinin yükünü azaltır. Ancak son karar, değişikliğin iş bağlamını bilen bir geliştiriciye ait olmalıdır.
Ekip büyüdükçe, inceleme sürecinde öğrenilen dersleri yazılı bir rehbere dönüştürmek de faydalıdır. Sık tekrarlanan yorumlar bir kontrol listesine, otomatikleştirilebilen kontroller ise yayın hattına taşınır. Böylece inceleyicinin dikkati, yalnızca insan muhakemesi gerektiren konulara kalır ve inceleme hem hızlanır hem derinleşir.
Sonuç
Kod incelemesi, otomatik araçların yakalayamadığı hataları, bilgi adalarını ve tutarsızlıkları önler. Küçük ve açıklamalı değişiklikler, net bir kontrol listesi ve yapıcı bir geri bildirim kültürüyle birleştiğinde, yazılımın kalitesini her değişiklikte biraz daha güçlendirir.