Test kapsamı metriklerini, sınırlamalarını ve yazılım kalitesini artırmak için nasıl etkili kullanılacağını anlayın. Farklı kapsam türleri, en iyi uygulamalar ve yaygın tuzaklar hakkında bilgi edinin.
Test Kapsamı: Yazılım Kalitesi İçin Anlamlı Metrikler
Yazılım geliştirmenin dinamik dünyasında kaliteyi sağlamak her şeyden önemlidir. Test kapsamı, test sırasında kaynak kodun ne kadarının çalıştırıldığını gösteren bir metrik olarak bu hedefe ulaşmada hayati bir rol oynar. Ancak, sadece yüksek test kapsamı yüzdelerini hedeflemek yeterli değildir. Yazılımımızın sağlamlığını ve güvenilirliğini gerçekten yansıtan anlamlı metrikler için çabalamalıyız. Bu makale, farklı test kapsamı türlerini, faydalarını, sınırlamalarını ve yüksek kaliteli yazılım oluşturmak için bunları etkili bir şekilde kullanmaya yönelik en iyi uygulamaları incelemektedir.
Test Kapsamı Nedir?
Test kapsamı, bir yazılım test sürecinin kod tabanını ne ölçüde çalıştırdığını nicel olarak belirtir. Esasen, testler çalıştırıldığında kodun ne kadarının yürütüldüğünü ölçer. Test kapsamı genellikle yüzde olarak ifade edilir. Daha yüksek bir yüzde genellikle daha kapsamlı bir test sürecine işaret eder, ancak inceleyeceğimiz gibi, bu yazılım kalitesinin mükemmel bir göstergesi değildir.
Test Kapsamı Neden Önemlidir?
- Test Edilmemiş Alanları Belirler: Test kapsamı, kodun test edilmemiş bölümlerini vurgulayarak kalite güvence sürecindeki potansiyel kör noktaları ortaya çıkarır.
- Test Etkinliğine Dair İçgörüler Sağlar: Kapsam raporlarını analiz ederek, geliştiriciler test setlerinin verimliliğini değerlendirebilir ve iyileştirme alanlarını belirleyebilirler.
- Risk Azaltmayı Destekler: Kodun hangi bölümlerinin iyi test edildiğini ve hangilerinin edilmediğini anlamak, ekiplerin test çabalarını önceliklendirmesine ve potansiyel riskleri azaltmasına olanak tanır.
- Kod İncelemelerini Kolaylaştırır: Kapsam raporları, kod incelemeleri sırasında değerli bir araç olarak kullanılabilir ve incelemecilerin düşük test kapsamına sahip alanlara odaklanmasına yardımcı olur.
- Daha İyi Kod Tasarımını Teşvik Eder: Kodun tüm yönlerini kapsayan testler yazma ihtiyacı, daha modüler, test edilebilir ve sürdürülebilir tasarımlara yol açabilir.
Test Kapsamı Türleri
Çeşitli test kapsamı metrikleri, test bütünlüğü hakkında farklı bakış açıları sunar. İşte en yaygın olanlardan bazıları:
1. İfade Kapsamı (Statement Coverage)
Tanım: İfade kapsamı, koddaki yürütülebilir ifadelerin yüzde kaçının test seti tarafından yürütüldüğünü ölçer.
Örnek:
function calculateDiscount(price, hasCoupon) {
let discount = 0;
if (hasCoupon) {
discount = price * 0.1;
}
return price - discount;
}
%100 ifade kapsamına ulaşmak için, `calculateDiscount` fonksiyonu içindeki her kod satırını yürüten en az bir test senaryosuna ihtiyacımız var. Örneğin:
- Test senaryosu 1: `calculateDiscount(100, true)` (tüm ifadeleri yürütür)
Sınırlamalar: İfade kapsamı, kapsamlı testi garanti etmeyen temel bir metriktir. Karar verme mantığını değerlendirmez veya farklı yürütme yollarını etkili bir şekilde ele almaz. Bir test seti, önemli köşe durumları veya mantıksal hataları gözden kaçırırken %100 ifade kapsamına ulaşabilir.
2. Dal Kapsamı (Branch Coverage / Decision Coverage)
Tanım: Dal kapsamı, koddaki karar dallarının (örneğin, `if` ifadeleri, `switch` ifadeleri) yüzde kaçının test seti tarafından yürütüldüğünü ölçer. Her koşulun hem `true` hem de `false` sonuçlarının test edilmesini sağlar.
Örnek (yukarıdaki aynı fonksiyonu kullanarak):
function calculateDiscount(price, hasCoupon) {
let discount = 0;
if (hasCoupon) {
discount = price * 0.1;
}
return price - discount;
}
%100 dal kapsamına ulaşmak için iki test senaryosuna ihtiyacımız var:
- Test senaryosu 1: `calculateDiscount(100, true)` (`if` bloğunu test eder)
- Test senaryosu 2: `calculateDiscount(100, false)` (`else` veya varsayılan yolu test eder)
Sınırlamalar: Dal kapsamı, ifade kapsamından daha sağlamdır ancak yine de tüm olası senaryoları kapsamaz. Birden çok yan tümce içeren koşulları veya koşulların değerlendirilme sırasını dikkate almaz.
3. Koşul Kapsamı (Condition Coverage)
Tanım: Koşul kapsamı, bir koşul içindeki boolean alt ifadelerinin yüzde kaçının en az bir kez hem `true` hem de `false` olarak değerlendirildiğini ölçer.
Örnek:
function processOrder(isVIP, hasLoyaltyPoints) {
if (isVIP && hasLoyaltyPoints) {
// Özel indirim uygula
}
// ...
}
%100 koşul kapsamına ulaşmak için aşağıdaki test senaryolarına ihtiyacımız var:
- `isVIP = true`, `hasLoyaltyPoints = true`
- `isVIP = false`, `hasLoyaltyPoints = false`
Sınırlamalar: Koşul kapsamı, karmaşık bir boolean ifadenin bireysel kısımlarını hedef alsa da, koşulların tüm olası kombinasyonlarını kapsamayabilir. Örneğin, hem `isVIP = true, hasLoyaltyPoints = false` hem de `isVIP = false, hasLoyaltyPoints = true` senaryolarının bağımsız olarak test edilmesini sağlamaz. Bu da bizi bir sonraki kapsam türüne götürür:
4. Çoklu Koşul Kapsamı (Multiple Condition Coverage)
Tanım: Bu, bir karar içindeki tüm olası koşul kombinasyonlarının test edilip edilmediğini ölçer.
Örnek: Yukarıdaki `processOrder` fonksiyonunu kullanarak. %100 çoklu koşul kapsamına ulaşmak için aşağıdakilere ihtiyacınız vardır:
- `isVIP = true`, `hasLoyaltyPoints = true`
- `isVIP = false`, `hasLoyaltyPoints = false`
- `isVIP = true`, `hasLoyaltyPoints = false`
- `isVIP = false`, `hasLoyaltyPoints = true`
Sınırlamalar: Koşulların sayısı arttıkça, gereken test senaryosu sayısı katlanarak artar. Karmaşık ifadeler için %100 kapsama ulaşmak pratik olmayabilir.
5. Yol Kapsamı (Path Coverage)
Tanım: Yol kapsamı, kod içindeki bağımsız yürütme yollarının yüzde kaçının test seti tarafından kullanıldığını ölçer. Bir fonksiyonun veya programın giriş noktasından çıkış noktasına kadar olan her olası rota bir yol olarak kabul edilir.
Örnek (değiştirilmiş `calculateDiscount` fonksiyonu):
function calculateDiscount(price, hasCoupon, isEmployee) {
let discount = 0;
if (hasCoupon) {
discount = price * 0.1;
} else if (isEmployee) {
discount = price * 0.05;
}
return price - discount;
}
%100 yol kapsamına ulaşmak için aşağıdaki test senaryolarına ihtiyacımız var:
- Test senaryosu 1: `calculateDiscount(100, true, true)` (ilk `if` bloğunu yürütür)
- Test senaryosu 2: `calculateDiscount(100, false, true)` (`else if` bloğunu yürütür)
- Test senaryosu 3: `calculateDiscount(100, false, false)` (varsayılan yolu yürütür)
Sınırlamalar: Yol kapsamı en kapsamlı yapısal kapsam metriğidir, ancak aynı zamanda ulaşılması en zor olanıdır. Kodun karmaşıklığı ile yolların sayısı katlanarak artabilir, bu da pratikte tüm olası yolları test etmeyi olanaksız hale getirir. Genellikle gerçek dünya uygulamaları için çok maliyetli kabul edilir.
6. Fonksiyon Kapsamı (Function Coverage)
Tanım: Fonksiyon kapsamı, koddaki fonksiyonların yüzde kaçının test sırasında en az bir kez çağrıldığını ölçer.
Örnek:
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
// Test Seti
add(5, 3); // Yalnızca add fonksiyonu çağrılır
Bu örnekte, fonksiyon kapsamı %50 olurdu çünkü iki fonksiyondan sadece biri çağrılmıştır.
Sınırlamalar: Fonksiyon kapsamı, ifade kapsamı gibi, nispeten temel bir metriktir. Bir fonksiyonun çağrılıp çağrılmadığını belirtir, ancak fonksiyonun davranışı veya argüman olarak iletilen değerler hakkında herhangi bir bilgi sağlamaz. Genellikle bir başlangıç noktası olarak kullanılır, ancak daha eksiksiz bir resim için diğer kapsam metrikleriyle birleştirilmelidir.
7. Satır Kapsamı (Line Coverage)
Tanım: Satır kapsamı, ifade kapsamına çok benzer, ancak fiziksel kod satırlarına odaklanır. Testler sırasında kaç kod satırının yürütüldüğünü sayar.
Sınırlamalar: İfade kapsamıyla aynı sınırlamalara sahiptir. Mantığı, karar noktalarını veya potansiyel köşe durumlarını kontrol etmez.
8. Giriş/Çıkış Noktası Kapsamı (Entry/Exit Point Coverage)
Tanım: Bu, bir fonksiyonun, bileşenin veya sistemin her olası giriş ve çıkış noktasının en az bir kez test edilip edilmediğini ölçer. Giriş/çıkış noktaları, sistemin durumuna bağlı olarak farklı olabilir.
Sınırlamalar: Fonksiyonların çağrıldığını ve geri döndüğünü sağlarken, iç mantık veya köşe durumları hakkında hiçbir şey söylemez.
Yapısal Kapsamın Ötesinde: Veri Akışı ve Mutasyon Testi
Yukarıdakiler yapısal kapsam metrikleri olsa da, başka önemli türler de vardır. Bu gelişmiş teknikler genellikle göz ardı edilir, ancak kapsamlı testler için hayati önem taşır.
1. Veri Akışı Kapsamı (Data Flow Coverage)
Tanım: Veri akışı kapsamı, kod içindeki veri akışını izlemeye odaklanır. Değişkenlerin programın çeşitli noktalarında tanımlandığını, kullanıldığını ve potansiyel olarak yeniden tanımlandığını veya tanımsız hale geldiğini sağlar. Veri elemanları ve kontrol akışı arasındaki etkileşimi inceler.
Türleri:
- Tanım-Kullanım (DU) Kapsamı: Her değişken tanımı için, o tanımın tüm olası kullanımlarının test senaryoları tarafından kapsandığından emin olur.
- Tüm-Tanımlar Kapsamı: Bir değişkenin her tanımının kapsandığından emin olur.
- Tüm-Kullanımlar Kapsamı: Bir değişkenin her kullanımının kapsandığından emin olur.
Örnek:
function calculateTotal(price, quantity) {
let total = price * quantity; // 'total' tanımı
let tax = total * 0.08; // 'total' kullanımı
return total + tax; // 'total' kullanımı
}
Veri akışı kapsamı, `total` değişkeninin doğru bir şekilde hesaplandığını ve sonraki hesaplamalarda kullanıldığını sağlamak için test senaryoları gerektirir.
Sınırlamalar: Veri akışı kapsamının uygulanması karmaşık olabilir ve kodun veri bağımlılıklarının sofistike bir analizini gerektirir. Genellikle yapısal kapsam metriklerinden daha fazla hesaplama maliyeti vardır.
2. Mutasyon Testi (Mutation Testing)
Tanım: Mutasyon testi, kaynak koduna küçük, yapay hatalar (mutasyonlar) eklemeyi ve ardından test setinin bu hataları tespit edip edemediğini görmek için çalıştırmayı içerir. Amaç, test setinin gerçek dünyadaki hataları yakalamadaki etkinliğini değerlendirmektir.
Süreç:
- Mutantlar Oluşturma: Operatörleri değiştirme (`+` yerine `-`), koşulları tersine çevirme (`<` yerine `>=`) veya sabitleri değiştirme gibi mutasyonlar ekleyerek kodun değiştirilmiş sürümlerini oluşturun.
- Testleri Çalıştırma: Test setini her mutanta karşı yürütün.
- Sonuçları Analiz Etme:
- Öldürülen Mutant: Bir test senaryosu bir mutanta karşı çalıştırıldığında başarısız olursa, mutant "öldürülmüş" olarak kabul edilir, bu da test setinin hatayı tespit ettiğini gösterir.
- Hayatta Kalan Mutant: Tüm test senaryoları bir mutanta karşı çalıştırıldığında geçerse, mutant "hayatta kalmış" olarak kabul edilir, bu da test setinde bir zayıflık olduğunu gösterir.
- Testleri İyileştirme: Hayatta kalan mutantları analiz edin ve bu hataları tespit etmek için test senaryoları ekleyin veya değiştirin.
Örnek:
function add(a, b) {
return a + b;
}
Bir mutasyon, `+` operatörünü `-` olarak değiştirebilir:
function add(a, b) {
return a - b; // Mutant
}
Eğer test seti, özellikle iki sayının toplanmasını kontrol eden ve doğru sonucu doğrulayan bir test senaryosuna sahip değilse, mutant hayatta kalacak ve test kapsamındaki bir boşluğu ortaya çıkaracaktır.
Mutasyon Skoru: Mutasyon skoru, test seti tarafından öldürülen mutantların yüzdesidir. Daha yüksek bir mutasyon skoru, daha etkili bir test setini gösterir.
Sınırlamalar: Mutasyon testi, test setini çok sayıda mutanta karşı çalıştırmayı gerektirdiği için hesaplama açısından maliyetlidir. Ancak, geliştirilmiş test kalitesi ve hata tespiti açısından sağladığı faydalar genellikle maliyeti aşar.
Yalnızca Kapsam Yüzdesine Odaklanmanın Tuzakları
Test kapsamı değerli olsa da, onu yazılım kalitesinin tek ölçüsü olarak görmekten kaçınmak çok önemlidir. İşte nedenleri:
- Kapsam Kaliteyi Garanti Etmez: Bir test seti, kritik hataları gözden kaçırırken bile %100 ifade kapsamına ulaşabilir. Testler doğru davranışı doğrulamıyor olabilir veya köşe durumlarını ve sınır koşullarını kapsamıyor olabilir.
- Yanıltıcı Güven Hissi: Yüksek kapsam yüzdeleri, geliştiricileri yanıltıcı bir güven hissine kaptırabilir ve potansiyel riskleri göz ardı etmelerine neden olabilir.
- Anlamsız Testleri Teşvik Eder: Kapsam birincil hedef olduğunda, geliştiriciler sadece kodu yürüten ancak doğruluğunu gerçekten doğrulamayan testler yazabilir. Bu "doldurma" testler çok az değer katar ve hatta gerçek sorunları gizleyebilir.
- Test Kalitesini Göz Ardı Eder: Kapsam metrikleri, testlerin kalitesini değerlendirmez. Kötü tasarlanmış bir test seti, yüksek kapsama sahip olabilir ancak hataları tespit etmede etkisiz kalabilir.
- Eski Sistemler İçin Ulaşılması Zor Olabilir: Eski sistemlerde yüksek kapsama ulaşmaya çalışmak son derece zaman alıcı ve pahalı olabilir. Yeniden düzenleme (refactoring) gerekebilir, bu da yeni riskler ortaya çıkarır.
Anlamlı Test Kapsamı İçin En İyi Uygulamalar
Test kapsamını gerçekten değerli bir metrik haline getirmek için şu en iyi uygulamaları izleyin:
1. Kritik Kod Yollarını Önceliklendirin
Test çabalarınızı güvenlik, performans veya temel işlevsellik gibi en kritik kod yollarına odaklayın. Sorun çıkarma olasılığı en yüksek olan alanları belirlemek için risk analizi kullanın ve testlerini buna göre önceliklendirin.
Örnek: Bir e-ticaret uygulaması için, ödeme süreci, ödeme ağ geçidi entegrasyonu ve kullanıcı kimlik doğrulama modüllerinin test edilmesini önceliklendirin.
2. Anlamlı Doğrulamalar (Assertions) Yazın
Testlerinizin sadece kodu yürütmekle kalmayıp, aynı zamanda doğru davrandığını da doğruladığından emin olun. Beklenen sonuçları kontrol etmek ve her test senaryosundan sonra sistemin doğru durumda olduğundan emin olmak için doğrulamalar kullanın.
Örnek: Sadece bir indirim hesaplayan bir fonksiyonu çağırmak yerine, döndürülen indirim değerinin giriş parametrelerine göre doğru olduğunu doğrulayın (assert).
3. Köşe Durumlarını ve Sınır Koşullarını Kapsayın
Genellikle hataların kaynağı olan köşe durumlarına ve sınır koşullarına özel dikkat gösterin. Koddaki potansiyel zayıflıkları ortaya çıkarmak için geçersiz girdiler, aşırı değerler ve beklenmedik senaryolarla test edin.
Örnek: Kullanıcı girdisini işleyen bir fonksiyonu test ederken, boş dizeler, çok uzun dizeler ve özel karakterler içeren dizelerle test edin.
4. Kapsam Metriklerinin Bir Kombinasyonunu Kullanın
Tek bir kapsam metriğine güvenmeyin. Test çabasının daha kapsamlı bir görünümünü elde etmek için ifade kapsamı, dal kapsamı ve veri akışı kapsamı gibi metriklerin bir kombinasyonunu kullanın.
5. Kapsam Analizini Geliştirme İş Akışına Entegre Edin
Derleme sürecinin bir parçası olarak kapsam raporlarını otomatik olarak çalıştırarak kapsam analizini geliştirme iş akışına entegre edin. Bu, geliştiricilerin düşük kapsama sahip alanları hızla belirlemesine ve proaktif olarak ele almasına olanak tanır.
6. Test Kalitesini İyileştirmek İçin Kod İncelemelerini Kullanın
Test setinin kalitesini değerlendirmek için kod incelemelerini kullanın. İncelemeciler, testlerin açıklığına, doğruluğuna ve eksiksizliğine ve ayrıca kapsam metriklerine odaklanmalıdır.
7. Test Güdümlü Geliştirmeyi (TDD) Değerlendirin
Test Güdümlü Geliştirme (TDD), kodu yazmadan önce testleri yazdığınız bir geliştirme yaklaşımıdır. Bu, testler yazılımın tasarımını yönlendirdiği için daha test edilebilir kod ve daha iyi kapsama yol açabilir.
8. Davranış Güdümlü Geliştirmeyi (BDD) Benimseyin
Davranış Güdümlü Geliştirme (BDD), sistem davranışının düz metin açıklamalarını testlerin temeli olarak kullanarak TDD'yi genişletir. Bu, testleri teknik olmayan kullanıcılar da dahil olmak üzere tüm paydaşlar için daha okunabilir ve anlaşılır hale getirir. BDD, gereksinimlerin net iletişimini ve ortak anlaşılmasını teşvik ederek daha etkili testlere yol açar.
9. Entegrasyon ve Uçtan Uca Testleri Önceliklendirin
Birim testleri önemli olsa da, farklı bileşenler arasındaki etkileşimi ve genel sistem davranışını doğrulayan entegrasyon ve uçtan uca testleri ihmal etmeyin. Bu testler, birim seviyesinde belirgin olmayabilecek hataları tespit etmek için çok önemlidir.
Örnek: Bir entegrasyon testi, kullanıcı kimlik doğrulama modülünün kullanıcı kimlik bilgilerini almak için veritabanıyla doğru şekilde etkileşime girdiğini doğrulayabilir.
10. Test Edilemeyen Kodu Yeniden Düzenlemekten (Refactor) Korkmayın
Test etmesi zor veya imkansız olan bir kodla karşılaşırsanız, onu daha test edilebilir hale getirmek için yeniden düzenlemekten korkmayın. Bu, büyük fonksiyonları daha küçük, daha modüler birimlere ayırmayı veya bileşenleri ayırmak için bağımlılık enjeksiyonu kullanmayı içerebilir.
11. Test Setinizi Sürekli İyileştirin
Test kapsamı tek seferlik bir çaba değildir. Kod tabanı geliştikçe test setinizi sürekli olarak gözden geçirin ve iyileştirin. Yeni özellikleri ve hata düzeltmelerini kapsamak için yeni testler ekleyin ve mevcut testleri açıklıklarını ve etkinliklerini artırmak için yeniden düzenleyin.
12. Kapsamı Diğer Kalite Metrikleriyle Dengeleyin
Test kapsamı, yapbozun sadece bir parçasıdır. Yazılım kalitesinin daha bütünsel bir görünümünü elde etmek için hata yoğunluğu, müşteri memnuniyeti ve performans gibi diğer kalite metriklerini göz önünde bulundurun.
Test Kapsamına Küresel Bakış Açıları
Test kapsamı ilkeleri evrensel olsa da, uygulamaları farklı bölgeler ve geliştirme kültürleri arasında değişiklik gösterebilir.
- Çevik (Agile) Benimseme: Dünya çapında popüler olan Çevik metodolojileri benimseyen ekipler, otomasyonlu test ve sürekli entegrasyona vurgu yapma eğilimindedir, bu da test kapsamı metriklerinin daha fazla kullanılmasına yol açar.
- Yasal Gereklilikler: Sağlık ve finans gibi bazı endüstriler, yazılım kalitesi ve testi ile ilgili katı yasal gerekliliklere sahiptir. Bu düzenlemeler genellikle belirli test kapsamı seviyelerini zorunlu kılar. Örneğin, Avrupa'da tıbbi cihaz yazılımları, kapsamlı test ve dokümantasyonu vurgulayan IEC 62304 standartlarına uymalıdır.
- Açık Kaynak vs. Tescilli Yazılım: Açık kaynaklı projeler, kod kalitesini sağlamak için genellikle topluluk katkılarına ve otomasyonlu testlere büyük ölçüde güvenir. Test kapsamı metrikleri genellikle halka açıktır, bu da katkıda bulunanları test setini iyileştirmeye teşvik eder.
- Küreselleşme ve Yerelleştirme: Küresel bir kitle için yazılım geliştirirken, tarih ve sayı formatları, para birimi sembolleri ve karakter kodlaması gibi yerelleştirme sorunları için test yapmak çok önemlidir. Bu testler de kapsam analizine dahil edilmelidir.
Test Kapsamını Ölçmek İçin Araçlar
Çeşitli programlama dillerinde ve ortamlarda test kapsamını ölçmek için çok sayıda araç mevcuttur. Bazı popüler seçenekler şunlardır:
- JaCoCo (Java Code Coverage): Java uygulamaları için yaygın olarak kullanılan açık kaynaklı bir kapsam aracı.
- Istanbul (JavaScript): JavaScript kodu için popüler bir kapsam aracı, genellikle Mocha ve Jest gibi çerçevelerle kullanılır.
- Coverage.py (Python): Kod kapsamını ölçmek için bir Python kütüphanesi.
- gcov (GCC Coverage): C ve C++ kodu için GCC derleyicisi ile entegre bir kapsam aracı.
- Cobertura: Başka bir popüler açık kaynaklı Java kapsam aracı.
- SonarQube: Test kapsamı analizi de dahil olmak üzere kod kalitesinin sürekli denetimi için bir platform. Çeşitli kapsam araçlarıyla entegre olabilir ve kapsamlı raporlar sağlayabilir.
Sonuç
Test kapsamı, yazılım testinin kapsamlılığını değerlendirmek için değerli bir metriktir, ancak yazılım kalitesinin tek belirleyicisi olmamalıdır. Farklı kapsam türlerini, sınırlamalarını ve bunları etkili bir şekilde kullanmaya yönelik en iyi uygulamaları anlayarak, geliştirme ekipleri daha sağlam ve güvenilir yazılımlar oluşturabilir. Kapsam metriklerinizin yazılımınızın kalitesini gerçekten yansıttığından emin olmak için kritik kod yollarını önceliklendirmeyi, anlamlı doğrulamalar yazmayı, köşe durumlarını kapsamayı ve test setinizi sürekli iyileştirmeyi unutmayın. Basit kapsam yüzdelerinin ötesine geçerek, veri akışı ve mutasyon testini benimsemek, test stratejilerinizi önemli ölçüde geliştirebilir. Sonuç olarak amaç, dünya çapındaki kullanıcıların ihtiyaçlarını karşılayan ve konumlarından veya geçmişlerinden bağımsız olarak olumlu bir deneyim sunan bir yazılım oluşturmaktır.