SonarQube ile Statik Kod Analizi (iOS)
Merhaba,
Bu yazımızda statik kod analiz araçlarının neden faydalı olduğunu, niçin kullandığımızı, hangi strateji ile bunu gerçekleştirdiğimizi ve bunun sonuçu olarak projelerimizi nasıl geliştirdiğini anlatmaya çalışacağız. Bu yazı statik kod analizi nedir sorusuna veya nasıl entegre edilebileceğine sorusuna cevap aramayacaktır. Nedir ve nasıl entegre ederim sorularına cevap arıyorsanız yine de sizlere kaynaklar bölümünde linkler bırakacağız.
Bizler Ford Otosan içerisinde statik kod analizi için SonarQube aracını kullanıyoruz. iOS projesi özelinde aslında bir çok statik kod analizi yapan araç vardır. SonarQube dışında SwiftLint’i daha önce deneyimlemiştik. Fakat şirket içerisinde statik kod analizi için standart bir araç kullanıldığı ve SonarQube aracının da arayüzünün başarılı olduğunu düşündüğümüz için bizler de iOS özelinde bu araca entegre olduk.
Not: iOS projemizin SonarQube entegrasyonu için şirketteki diğer projelerden farklı olarak “Community Edition” yerine “Developer Edition” kullanmak zorunda kaldık. Çünkü Swift’in burada statik kod analiz yapabilmesi için Developer Edition seçeneğini kullanması gerekti. Farklı medium sayfalarında bunu third party framework ile gerçekleştiren kişiler var (Kaynaklar: backlite linki). Fakat biz third party bir seçenek kullanmak yerine SonarQube’ün resmi versiyonunu kullanmayı tercih ettik. Ek olarak third party seçenekte de bazı sıkıntılar yaşadık (unit test coverag’ı gösterebilmek gibi).
Statik kod analiz araçlarını hem kendi lokal makinelerinizde hem de uzaktaki reponuz üzerinde çalışan CI/CD süreçleriniz içerisine eklemeniz faydalı olacaktır. Bizler de bu strateji ile hem lokal makinelerimiz (geliştirme bilgisayarlarımız) hem de remote makinelerimiz üzerinde (azure devops aracı ile test, qa ve master branch’lerimizin build aldığı agent üzerinde) bunu gerçekleştiriyoruz. Öncelikle lokal makinelerimizde geliştirme yaptığımızda olası çıkaracağımız critical, blocker, major, minor hatalarımızı geliştirme ortamında fark edip çözebiliyoruz. Lokal makineniz üzerinde statik kod analizi koşmamız aslında farklı projelerin kalite standartlarına uyarak uzaktaki dev, test, qa, master branch’i gibi kullanabileceğimiz ortamlara birleştirilmesine (pull request ile merge edilerek) imkan sağlıyor. Böylece herkesin ortak olarak kullandığı uzaktaki dev, test, qa, master gibi branchler üzerinde olası güvenlik açığı barındırmadan, kalite hedeflerinize uyarak ve standart bir kod yazım şeklini benimseterek sizlere bir ortam sunuyor. Uzaktaki repo üzerinde Pull-Request açıp dev, test, qa veya master gibi ortamlara attığınızda da bu statik kod analiz araçlarını tekrar çalıştırarak projenizin kalite metriklerini bu sefer herkesin takip edebileceği SonarQube arayüzünden izlemeye devam edebiliyorsunuz (Resim-2).
Not: iOS projemizin azure üzerinden sonarqube’e nasıl entegre olduğumuz görmek isterseniz şuradaki yazımıza bakabilirsiniz.
Ref: https://medium.com/ford-otosan/azure-devops-ios-pipeline-3be1de48d7fd
Statik kod analiz araçlarının takımları geliştirdiği noktaların başında herkesin ortak bir kod yazım standardını belli bir ölçüde uymasına ortam oluşturuyor. Sadece ortam oluşturmakla kalmayıp bizce takımlarda bir bilinç de oluşturuyor.
Burada My Ford Trucks iOS projemizden örnek gösterebilirim (Resim-3). Kullandığımız switch statment yerine if statement kodun daha okunaklı hale getirebileceğinden bahsediyor. Dolayısıyla bu tarz durumları çözdüğünüzde sizin kodunuzun daha okunabilir hale gelmesine ve bundan tecrübe edinerek ekibin de kod yazım standartlarına yeni bir girdi üretmesine imkan sağlıyor. Bir yerden kodunuzu geliştirirken takımca kodların nasıl yazılabileceğine yönelik sizlere ortak bir kod yazım standardı oluşturmanıza imkan sağlıyor.
Birkaç diğer faydasından da sizlere bahsetmek isterim;
- Sürekli olarak kodunuzun bir analiz aracından geçmesinden dolayı açığa çıkabilecek bir güvenlik açığını ya da teknik borçları da gözler önüne seriyor.
- Kodunuzun eğer tekrar eden bir parçası varsa bunu gözler önüne seriyor. Böylece sizler tekrar eden kod parçacıklarını çözerek olası bakım maliyetlerinizi de azaltabilirsiniz. My Ford Trucks iOS projesinden bahsedecek olursak projeye sonarqube statik kod analizini ilk defa entegre ettiğimizde kod dublication oranımız ~%10 civarıydı. Bizlere bunu gözler önüne serdiğinde çözüm arayarak bunu düzelttik ve şu anda kod tekrar oranımız ~%1.5 oranında. Bizler de bunun sonucu olarak bakım maliyetlerimizde süre olarak ciddi bir düşüş olduğunu fark ediyoruz. Eğer çok fazla kodunuz tekrar ediyorsa bir yerde değişiklik yapmak istediğinizde aynı değişikliği bir kaç farklı yerde yapmak zorunda kalıyorsunuz. Bu yüzden kod tekrar oranınız ne kadar az ise bakım maliyetiniz o kadar az olacaktır.
- Unit test kapsama oranlarınızı da bu araç üzerinde görüntüleyebiliyorsunuz (Resim-4).
4. Sizin tekrar teknik borç yapmamanıza da imkan sağlıyor. Bunu da kalite kapılarında belirleyeceğiniz metrikleri ile sağlıyor (Resim-5). Bizler her iyileştirmemizde kalite hedeflerimiz daha da artırarak gittik. Bu stratejiyi uyguladığımızda da her zaman daha iyiye doğru odaklanmış olduk.
Bizler yaklaşık 2 sene sonunda teknik borçumuzu 20 günden nerdeyse 0'a indirdik (Resim-6). Sizler de bunu kendi projelerinizde aktivite sekmesine erişerek takip edebilirsiniz. Böylece bunu görünür kılarak takımınızın daha kaliteli kodlar geliştirmesini perçinleyebilirsiniz. Amacımız daha kaliteli kodlar üretmek.
Sonuç olarak; statik kod analizini projelerinizde kullanmanız hem sizi hem de takımınızı ileriye taşıyacaktır. Bunun sonucu olarak da uygulamalarınızın daha az hatalı ve bakım maliyetlerinin daha düşük olduğu için mutlu paydaşlar ile takımınızı harika bir sonuça ulaştırabileceksiniz.
Not: Bu kalite metrikleri tabii ki bir takım işi. Takım bu bilinçte olduğu zaman her şey yoluna gidiyor. Bunun için de takımımıza teşekkür ederiz.
Kaynaklar:
SonarQube Entegrasyonu (Backlite ile)
SonarQube Integration with iOS
SonarQube Entegrasyonu (Azure ile Developer Edition Kullanarak)
SonarQube nedir ?
Ford Otosan — Connected Products & Engineering Tribe
Mobile Chapter Team Member
Arda DİNLER