Hadouken: Nettsi’nin C/C++ Yazılım Geliştirme Ortamı

Mustafa Kemal GILOR
Nettsi Bilişim Teknoloji A.Ş.
7 min readMay 28, 2020

Merhabalar, bugünkü konumuz açık kaynak projesi haline getirdiğimiz, firmamızda C/C++ projelerinde kullanılan yazılım geliştirme ortamı Hadouken’i sizlere tanıtmak olacak.

Nettsi olarak yakın zamanda 1 yaşına basmış, genç bir firmayız. Yeni bir şirket olmanın en büyük artısı, geçmişten gelen, sürdürmemiz gereken eski projelerin, kodların olmaması. Bu durum dijital dönüşüme gerek olmadan, modern teknolojilerden faydalanabildiğimiz ve net adımları olan yazılım geliştirme yaşam döngüsü tanımlamaya olanak tanıyor. Şirket olarak herhangi bir kod geliştirme aktivitesine başlamadan önce süreçlere yatırım yaparak iyi tanımlanmış, kolay benimsenebilecek ve insan hatasını en aza indirgeyen bir süreç tanımlamayı hedefledik. Bu bağlamda yürüttüğümüz aktivitelerin bir parçasını da yazılım geliştirme ortamının tanımlanması oluşturuyor.

Yazılım geliştirme ortamlarının projelerin başarısına etkisi küçümsenmeyecek kadar fazla. Uzun yıllardır C/C++ ile uygulama geliştirmenin getirdiği bir etki olarak, farklı ekosistemlerde ve sektörlerde C ve C++ ile geliştirilen bir çok projeye dahil oldum ve bir çok geliştirici ile tanıştım. Projelerin kod kalitelerini ve kullanılan standartları bir kenarda tutacak olursak, gözlemlerime göre projelerin neredeyse tamamında eksikliği hissedilen üç büyük faktör var: bağımlılık yönetimi, ortam tutarlılığı ve araç entegrasyonları. Problemler sabit olmasına karşın her projede farklı bir şekilde çözümlenmekte, bu çözümlerin ise sürdürülebilirliği olmamakta.

Bu kısır döngüye bir çözüm getirmek için şirket olarak en sık kullandığımız ve sevdiğimiz programlama dillerinin C ve Modern C++ olması nedeniyle, geçmiş tecrübelerden yola çıkarak yazılım geliştirme yaşam döngüsünü tanımlarken bahsettiğim problemleri de enine-boyuna-derinliğine düşünerek ortaya Hadouken’i çıkarttık.

Hadouken adı; halk tabiri ile ‘aduket’ olarak bilinen, Street Fighter kahramanı Ryu’nun ünlü saldırı hamlesinden gelmekte.

Bu yazıda Hadouken’in kullanımından ziyade sizlere Hadouken’in ne olduğundan ve hangi problemleri, nasıl çözdüğünden bahsetmek istiyorum. Şimdi beraber Hadouken ile bahsettiğim üç problemi nasıl çözdüğümüze göz atalım.

Problem 1: Bağımlılık yönetimi

Günümüze kadar C ve C++ yazılım geliştirme projelerinde bağımlılık yönetimi ad-hoc gelişmekte idi. Bunun sebebi, C ve C++ programlama dilleri için oturaklı bir bağımlılık/paket yönetimi aracı bulunmaması olarak gösterilebilir. Diğer programlama ve betik dillerine baktığımızda, Java-Maven, Python-Pip, Rust-Cargo, Nodejs-Npm ikililerini görebiliyoruz. C ve C++ için uzun yıllar boyunca eşitliğin sağ tarafı boştu. C ve C++ kütüphanelerinin platform bağımlı olması, hatta C++ özelinde konuşmak gerekirse derleyici bağımlı (ABI uyumluluğu) olması bu eşitliğin bozuk olmasının başlıca nedenlerinden sayılabilir.

Bu durum 2016 yılının başlarında ortaya çıkan bir C/C++ bağımlılık/paket yöneticisinin gün yüzüne çıkması ile değişti. İsmi Conan olan bu bağımlılık yöneticisi, merkezi dağıtım sunucusunda diğer bağımlılık yöneticileri gibi önceden derlenmiş paketleri barındırıyor. Bu paketler, çeşitli platform (ARM, sparc, amd64), derleyici sürümleri(gcc-9, gcc-10, clang), optimizasyon seviyeleri ile derlenerek paket yöneticisi üzerinden sunulmakta. Kullandığımız platform, derleyici ve optimizasyon seviyesine uygun hazır paket mevcut ise, Conan bu paketi indirerek bağımlılığı sağlamakta. Bulunmadığı durumda ise alakalı bağımlılığın kaynak kodlarını indirerek makinenizde derlenmesini sağlayarak belirtilen bağımlılığı karşılamakta.

Conan Center’da paketi bulunmayan projeleri resmi olmayan farklı sağlayıcılardan temin edebiliyoruz. Bu sağlayıcıların başında referanslarda paylaştığım Bincrafters geliyor. Aradığınız kütüphaneyi bulamadığınız durumda kütüphaneyi Conan paketi haline getirmek için biraz uğraşmanız gerekli, fakat bu durum gözünüzü korkutmasın. Bir kütüphanenin projeye geleneksel metotlar ile entegre edilmesine benzer bir eforu var.

Conan tek başına kullanılabildiği gibi, CMake entegrasyonu sayesinde CMake ile beraber de kullanılabiliyor. CMake; kendisine özgü ayrı bir blog yazısını hak eden; bugünlerde C/C++ projeleri için sıkça tercih edilen bir yazılım inşa sistemi üreteci. Hadouken, temelinde bir CMake projesi olduğu için Conan’ın CMake entegrasyonu bizim için büyük bir artı.

Her ne kadar Conan istediği rağbeti görmemiş, popülerleşememiş olsa da, işlevsel ve gelecek vaat eden bir araç. Bu nedenle Hadouken’de bağımlılık yönetimi problemini çözmek için Conan kullandık. Bunun yanı sıra bağımlılık yönetimi için CMake’in sunmuş olduğu ExternalProject_Add gibi geleneksel yöntemleri de kullanabiliyoruz.

Problem 2: Ortam tutarlılığı

C/C++ projelerinde en çok baş ağrıtan ve gereksiz zaman kaybı yaratan konuların başında ortam tutarlılığı gelir. Geliştiriciler çoğunlukla uygulama geliştirmek için kendi makinelerindeki ortamı kullanırlar. Bu ortamda ortaya çıkan yazılımı etkileyebilecek derleyici, derleyici sürümü, üçüncü parti kütüphane sürümleri, ortam değişkenleri, araç sürümleri gibi birçok etken bulunur. Projelerde kurulması gereken araçlar ve araç sürümleri belirtilmiş olsa dahi, yazılı veya sözlü bir yönergeye uymak insan hatasına açıktır. Bu problemi çözmenin temeli, yazılım geliştirme ortamını net bir şekilde tanımlayarak, geliştiricinin ortamından izole etmektir. Bunu yapmanın yolu ise konteynerizasyon ve sanallaştırma teknolojilerinden geçiyor.

Yazılım geliştirme ortam izolasyonu konusunu ele alırken sanallaştırma konusuna çok sıcak bakmadım. Bunun birkaç sebebi var, birincisi performans/kaynak kullanımı yükü. İkinci ve en önemlisi ise sisteme ve donanıma erişim. C/C++ projelerinde tasarlanan yazılım genellikle sistem ve donanım ile dirsek teması halinde. Sanallaştırma ise buna engel teşkil eden bir unsur. Nettsi’de ağırlıklı olarak gerçek zamanlı sistemler ve sistem programlama projeleri üzerine çalıştığımız göz önünde bulundurulduğunda sanallaştırma ile gerçeklenmiş bir yazılım geliştirme ortamı, gelişitiriciye deyim yerindeyse destekten ziyade köstek oluyor.

Konteynerizasyon ise tam olarak ortam izolasyonu problemini çözmeyi hedefleyen bir yaklaşım. Geliştirme ortamında koşulan uygulamalar yine host makine üzerinde çalışıyor ve sistem kaynaklarına bir kısıtlama olmadan erişebiliyor. Performans açısından kısıtlar da daha kabul edilebilir seviyelerde olduğundan, tercihimiz konteynerizasyondan yana oldu.

Hadouken’de konteynerizasyon teknolojisi olarak Docker kullanıyoruz. Hadouken ile beraber, geliştirme ortamını tanımlayan bir Dockerfile bulunmakta. Geliştirme ortamı içerisinde derleyicisinden-hata ayıklayıcısına, sürüm kontrol yazılımından inşa araçlarına kadar Hadouken’in ve geliştiricinin ihtiyaç duyduğu tüm araçlar bulunuyor. Hadouken’i bu konteyner ile beraber kullandığınızda ilave olarak bir araç kurmanız gerekmiyor.

Hadouken’in sağladığı geliştirme ortamını projeye özgü özelleştirmeniz, yeni araçlar eklemeniz mümkün. Eğer Visual Studio Code kullanıyorsanız, eklemek istediğiniz araçların kurulum adımlarını .hadouken.bootstrap.sh dosyasına ekleyerek kurulumlarını sağlayabilirsiniz. Alternatif olarak .hadouken.docker-compose.extend.yml docker-compose dosyasını genişleterek yeni araç kurulumlarını sağlayabilirsiniz.

Aslında buradaki probleme özel geliştirilmiş Vagrant gibi araçlar da var. Lakin biz projelerimizde editör olarak hali hazırda Visual Studio Code kullandığımız için, Remote-Containers eklentisinden faydalanarak problemi daha hızlı bir şekilde çözebildik. Geliştirici Hadouken kullanan bir projeyi Visual Studio Code ile açtığında, Remote-Containers eklentisi proje içerisinde bulunan .devcontainer klasöründe tanımlı geliştirme ortamını algılıyor ve geliştiriciye projeyi geliştirme konteynerinde açmak isteyip istemediğini soruyor. Bu da kullanım kolaylığı ve adaptasyon açısından büyük bir artı.

İlerleyen safhalarda Hadouken’e Vagrant desteği de ekleyeceğimizi buradan duyurmuş olayım.

Biraz da bu izolasyonun faydaları üzerine konuşalım. Docker ile tanımlanmış bir geliştirme ortamı, geliştiricilerin projeye adaptasyon sürecini gözle görülür ölçüde kısaltmakta ve geliştirme ortamını deterministik kılarak karşılaşılan problemleri en aza indirgemekte. Bunların yanı sıra konteynerlerin sürüm kontrolü altına alınabilmesi ve çeşitli projelerde eş zamanlı olarak kullanılabilmesi işleri rahatlatıyor. Geliştirilen ortamın yeniden kullanılabilir olması ve tüm projelerde bu ortamın kullanılıyor oluşu, geliştiricilerin projeler arasında geçişini kolaylaştırmakta ve asıl odaklanılması gereken noktalara daha fazla zaman bırakmakta.

Problem 3: Araç entegrasyonları

Günümüzde yazılım geliştirme ekosisteminde kullanmakta olduğumuz bir çok araç bulunmakta. Her birisi kendi türüne özgü entegrasyon problemleri ve zorlukları barındırmakta. Hadouken araç entegrasyonlarını, araçlara özgü tanımlanmış CMake modülleri üzerinden sağlayarak Hadouken kullanan projenin kullanımına sunuyor. Bu modüller vasıtası ile desteklenen araçlar CMake üzerinde kolaylıkla konfigüre edilebilmekte ve kullanılabilmekte.

Soru-cevap kısmına geçmeden önce Hadouken kullanmanın avantaj ve faydalarından kısaca bahsetmek istiyorum.

Hadouken’in avantajlarları

  • Kolay kurulum ve güncelleme
  • Kısa öğrenme süresi, basit kullanım
  • Projeye göre özelleştirebilme olanağı
  • Visual Studio Code entegrasyonu
  • CI/CD pipeline dostu tasarım
  • Uzaktan geliştirme desteği (remote development)

Hadouken’in sağladığı faydalar

  • Yeni geliştiricilerin proje adaptasyon sürecini kısaltır
  • Proje kurallarını daha kolay denetleme (stil, yazım kuralları, standartlar)
  • Ortam tutarlılığı sağlar
  • Ortam kurulum derdini ortadan kaldırır
  • Projeler arası uyum ve entegrasyon kolaylığı sağlar
  • Sağladığı CMake modülleri ile geliştirme esnasında zaman kazandırır
  • İyi tanımlı bir geliştirme ortamı sayesinde geliştiricilerin iyi alışkanlıklar edinmesini sağlar

Bu kısma kadar Hadouken’in çözmeyi hedeflediği problemlere yaklaşımını inceledik. Şimdi aklınızda oluşmuş olabilecek soruları aydınlatmak istiyorum.

Q: Hadouken’i nereden edinebilirim?

A: Hadouken’in GitHub reposuna https://github.com/nettsi/hadouken adresinden erişebilirsiniz.

Q: Hadouken’i nasıl kullanabilirim?

A: Hadouken’in kurulum ve kullanımına dair yönergeyi https://github.com/nettsi/hadouken/blob/master/README.md adresinde bulabilirsiniz. Bu yönergeyi inceleyerek Hadouken’in kullanımı hakkında fikir sahibi olabilirsiniz.

Q: Hadouken’i ticari amaçla kullanabilir miyim?

A: Evet kullanabilirsiniz. Hadouken, Apache 2.0 lisansı ile umuma sunulmuş açık kaynaklı bir projedir. Apache 2.0 lisansının gerekleri karşılandığı sürece ticari amaçla kullanılmasında hiçbir sakınca yoktur. Apache 2.0 lisans metnine https://www.apache.org/licenses/LICENSE-2.0 adresinden, özet bilgiye ise https://choosealicense.com/licenses/apache-2.0/ adresinden erişebilirsiniz.

Q: Hadouken’e katkı sağlamak istiyorum, nasıl yapabilirim?

A: Fevkalade, projeye iki şekilde katkı sağlayabilirsiniz. Karşılaştığınız problemleri veya taleplerinizi https://github.com/nettsi/hadouken/issues kısmından bildirebilir, projeye geliştirici olarak katkı sağlamak istiyorsanız https://github.com/nettsi/hadouken/pulls adresinden pull request gönderebilirsiniz.

Hadouken projesi, tamamen özgür ve açık kaynak (FOSS) olarak kalmaya ve bizler ve umarım sizler tarafından geliştirilmeye, evrilmeye devam edecek.

Yukarıdaki soru-cevap kısmında cevabını bulamadığınız sorularınız veya sadece bir merhaba demek için foss@nettsi.com adresine e-posta atabilirsiniz.

Bir sonraki blog yazımda görüşmek üzere!

Referanslar

Bu kısımda makalede bahsedilen araçlara dair bağlantıları bulabilirsiniz.

Visual Studio Code: Remote Extensions

CMake

Conan

Conan Center

BinCrafters Conan Repository

Vagrant

Docker

--

--