features · Sep 3, 2014

Quire: Dart ile Büyük Ölçekli Bir Uygulama Geliştirmek

✦
Yapay zeka ile çevrildi
· İngilizce görüntüle

Dart programlama diliyle geliştirilen Quire uygulaması

Son güncelleme: 28 Mayıs 2026

TL;DR

Quire (53.992 satır, 1.620 KB Dart kodu), 2014'te hem istemci hem sunucu tarafında Dart ile geliştirildi. Daha ince DOM kontrolü için AngularDART ya da Polymer.dart yerine DQuery ve Bootjack kullanıldı. Temel kararlar (tüm yığında güçlü tip denetimi, paylaşılan istemci-sunucu veri modelleri, sunucuda olay döngüsü ve JS çıktısı için tree shaking) 2026'da da geçerliliğini koruyor.

Quire, Dart ile yazılmış ilk web uygulaması değil ve son da olmayacak. Ancak hem istemci hem sunucu tarafında Dart'a bu kadar yoğun biçimde dayanan ilk uygulama olabilir.

Quire web uygulaması için Dart programlama dili logosu ve çatısı

Kökünde ağaç yapısı olan eğlenceli bir görev yöneticisi. Proje kendi başına 53992 satır, 1620KB Dart kodundan oluşuyor ve topluluktan birkaç açık kaynak kütüphaneyle geliştirildi.

Quire'ı kim geliştirdi?

Bu projeye başlamadan önce biz, Rikulo ekibi olarak bilinen Dart meraklılarıydık. Arayüz çatısı, arayüz kütüphanesi, web sunucusu, mesajlaşma sunucusu, veritabanı istemcisi gibi birçok Dart kütüphanesi yayımlamıştık.

Dart 2011'de ilk çıktığında geleceğinin değerine heyecanlanmıştık ve hemen projelerin küçük bölümlerinde Dart ile çalışmaya başladık. Sonunda ağırlıklı olarak Dart'tan oluşan eksiksiz bir uygulama geliştirmeye geçtik. Burada tecrübelerimizin bir kısmını alçakgönüllülükle paylaşmak, Dart ile geliştirme hakkında size fikir vermek istiyoruz.

Quire neden JavaScript yerine Dart'ı seçti?

Dart'ı seçmek için pek çok neden var. Bizim için en önemlileri şunlar:

  • Dart'ın güçlü tip sistemi bizi sayısız küçük hatadan koruyor. Resmi IDE olan Dart Editor, tip hatalarında hızlı geri bildirim ve otomatik tamamlama sunuyor, izlemeyi de kolaylaştırıyor.
  • Sınıf tabanlı kalıtım modelinin prototip tabanlı olandan çok daha sezgisel olduğunu düşünüyoruz.
  • Dart, hem istemci hem sunucu tarafında aynı dili kullanma, aynı veri modelini ve kod tabanını paylaşma imkânı veriyor.
  • Dart, JavaScript'teki tuzakların çoğunu düzeltiyor. Bu konuda kusursuz değil ama eski kötü sürprizlerin %99'unu hallediyor.
  • Dart, popüler JavaScript Harmony özelliklerinden birkaçını bugünden sunuyor: Future (promise), Arrow Function vb.
  • Dart'ın arkasında güçlü bir ekip, çok sayıda kaliteli resmi kütüphane ve iyi düzenlenmiş API'ler var. Dart hâlâ gelişiyor ama spesifikasyonu şimdiden oldukça kararlı.
  • Sunucu tarafında çoklu iş parçacığı yerine olay döngüsü modelini tercih ediyoruz.
  • Dart, JavaScript'e derlenirken tree shaking uyguluyor. (Aşağıya bakın.)

Dart'ı seçmenin olumsuz yanları da var:

  • Dart topluluğu, JavaScript topluluğundan çok daha küçük.
  • Dart ile JavaScript arasındaki iletişim basit değil.
  • Güçlü tipli bir dilde API'leri polyfill etmek daha zor.
  • Dart Editor'ın performansı büyük projelerde (henüz) en iyi düzeyde değil.

Güçlü tip desteğiyle Dart'ta yazmak, JavaScript'e göre çok daha güvenilir. Dart ayrıca Java'dan daha az ayrıntılı; bazen (örneğin fonksiyon ifadelerinde) sade JavaScript'ten bile daha kısa. Genel olarak Dart ile çalışmak rahat, birkaç şey dışında:

  • Final alanlar, yapıcı gövdesinden önce, başlatıcıda ilklendirilmek zorunda.
  • Mixin spesifikasyonu henüz olgunlaşmamış ve 2.0'dan önce düzeltilmeyecek.
  • Fonksiyon bildirimlerinde jenerik tip parametresi yok, yalnızca sınıflarda var. (Elbette bu, derleyicinin iş yükünü artırırdı.)

Dart istemci tarafında nasıl çalışıyor?

Dart VM Chrome'a gelene kadar ürününüzü JavaScript'e derleyerek sunmanız gerekiyor. JavaScript'e derlenen çok sayıda dil var, ancak Dart birkaç ek avantajıyla öne çıkıyor.

  • Geliştirme sırasında Dart'ı, yerleşik Dart VM'li ve Chromium'dan çatallanmış bir tarayıcı olan Dartium'da yerel olarak çalıştırıyoruz. Bu aşamada derlemeye gerek kalmıyor, sayısız kesintiden kurtuluyoruz.
  • Testlerde ve üretimde, kodu JavaScript'e derleyip tüm büyük tarayıcılarda çalıştırıyoruz. Dart'tan JavaScript'e derleyici tree shaking uyguluyor ve kullanılmayan kodu çıktıdan ayıklıyor. Bu, JavaScript kod boyutumuzu büyük ölçüde azaltıyor.

Sunucu tarafında neden Dart kullanılır?

Sunucu tarafında Dart, Dart topluluğunda hiçbir zaman sıcak bir konu olmadı. Yine de onu güçlü bir sunucu tarafı dili adayı olarak görüyoruz, çünkü:

  • Web hizmeti, asenkron doğası gereği olay döngüsü modeliyle (çoklu iş parçacığına kıyasla) çok iyi çalışır.
  • Sunucu tarafı kodu, istemciye göre çok daha fazla sağlamlık ve güvenlik ister. Güçlü tipli bir dil burada gerçekten işe yarar.

İlgili yazı: Quire, Verilerinizi Korumak İçin ISO Sertifikası Aldı — sunucu tarafında sağlamlık ve güvenliğe verilen aynı önem, yıllar sonra Quire'ın resmi veri koruma sertifikasında da karşımıza çıkıyor.

Quire, Dart yığınında hangi kütüphaneleri kullanıyor?

Quire yaklaşık 30 kütüphane içe aktarılarak geliştirildi; bunların 10'u topluluktan, geri kalanı Dart ekibinden geliyor. Dart uzmanıysanız AngularDART ve Polymer.dart'ın olduğunu tahmin edebilirsiniz, ancak ikisi de aslında yok.

AngularDART kullanmıyoruz, çünkü:

  • İnce bir DOM kontrolü istiyoruz.
  • İstemci yapısını tasarlarken kendimize özgü mimari yönergeler kullanıyoruz ve bu yaklaşım Angular'ın mantığından farklı.
  • AngularDART'ı incelediğimizde derlenmiş JavaScript kod boyutunda büyük bir yük oluşturuyordu, ancak bu büyük ölçüde iyileştirildi.

Polymer.dart da kullanmıyoruz, çünkü:

  • Kapsülleme ve olay yeniden hedefleme nedeniyle ShadowDOM, örneğin Bootstrap gibi seçici odaklı çatılarla birlikte çalışamıyor.
  • ShadowDOM'un dışından stil ekleyemezsiniz. Üçüncü taraf bir bileşen seti Polymer ile yapılmışsa, kullanıcıların görünümünü değiştirmesi neredeyse imkânsız. Güncelleme: Aralık 2013 itibarıyla iç stili dışarıdan değiştirebilirsiniz. Bkz. Shadow DOM 201.

DQuery ve Bootjack nedir?

İstemci tarafı yığınımızın temel taşları DQuery ve Bootjack'tir. İkisi de Rikulo ekibinin yayımladığı açık kaynak projelerdir:

  • DQuery, jQuery'nin olay delegasyonu sistemine odaklanan kısmi bir Dart portudur.
  • Bootjack, neredeyse aynı CSS ve API'lere sahip, Bootstrap 3'ün eksiksiz bir portudur.

Uygulama yığınımızı, JavaScript dünyasındaki bilgi ve becerilerimizi kullanabilmek için bu yönde kurduk.

Stream web sunucusu nedir?

Stream, saf Dart ile yazılmış web sunucumuzdur; yönlendirme, filtre, sunucu tarafı MVC gibi yeteneklerle donatılmıştır. Stream, olay döngüsü modeliyle sorunsuz çalışır. Bir istek işleyicisi yazmak, engellemeyen rutinleri art arda zincirlemekten ibarettir.

Bu yaklaşım geleneksel çoklu iş parçacığı modelinden hem daha verimli hem de çalışması daha keyifli. Ayrıca web hizmetimizi ölçeklendirmeyi ve HTTPS'i nginx ile yönetiyor, istekleri Stream'e devrediyoruz. Bu mimariyle Dart VM'leri tek tek başlatıp durdurabiliyor, sunucuyu kullanıcı etkinliğini kesmeden yükseltebiliyoruz.

Sonuç

Dart ile çalışmak bizim için keyifli bir deneyim oldu ve Dart topluluğundaki yeni, heyecan verici gelişmeleri sabırsızlıkla bekliyoruz. Son olarak, Dart ile neler yapabileceğinizi merak ediyorsanız gelin, uygulamamız Quire ile oynayın. Ücretsiz!

Devamı için: Quire'ın sonradan Mark II olarak nasıl yeniden tasarlanıp yeniden inşa edildiği.

Dart istemci-sunucu uygulamasını gösteren Quire mimari diyagramı

2014'teki bu yapımdan çıkan hangi dersler 2026'da hâlâ geçerli?

Bu yazı yazıldığından beri hem Dart dili hem de Quire kod tabanı önemli ölçüde gelişti. Dart 2.0 (sağlam tip sistemi) 2018'de, Dart 3.0 (null safety, records, patterns) 2023'te geldi. Flutter, çapraz platform arayüz dünyasını değiştirdi (Quire'ın kendi mobil ekibi de ona geçti). Ancak yukarıda anlatılan temel mimari kararlar, beklediğinizden daha iyi ayakta kalıyor.

Hem istemcide hem sunucuda güçlü tip denetimi hâlâ karşılığını veriyor. Güçlü bir tip sisteminin derleme aşamasında yakaladığı çalışma zamanı hataları, hâlâ aynı çalışma zamanı hataları. JavaScript, TypeScript sayesinde tip denetimine kısmen yaklaştı, ancak uçtan uca tam tipli bir yığın hâlâ nadir. Simon'ın işaret ettiği hata sınıfı (sayısız küçük hata), tipsiz bir yığının üretime gönderdiği hata sınıfıyla aynı.

İstemci ile sunucu arasında paylaşılan veri modelleri hâlâ iş yükünü azaltıyor. Çoğaltılan model sorunu (biri JS'te, biri Python'da, sessizce birbirinden sapan iki model), 2026'da da 2014'tekiyle aynı. Çözüm de (uçtan uca tek dil) aynı. Node üzerinde TypeScript kullanan ekipler tam da bu nedenle Quire tarzı mimariler kuruyor.

Web sunucularında olay döngüsü, çoklu iş parçacığına karşı hâlâ kazanıyor. Node, Deno, Bun ve Dart'ın kendi Stream kalıbı bu konuda hemfikir. Tartışma birkaç yılda bir yeniden açılıyor ve hep aynı yere varıyor.

Tree shaking azalmadı, daha da önemli hale geldi. 2014'te Dart'ın tree shaking yapan derleyicisi fark yaratıyordu. 2026'da JS hedefleyen her derleme hattı için temel beklenti. Webpack, Rollup, esbuild ve Vite hepsi bunu yapıyor. Ders geçerli; araçlar yetişti.

2014'teki ShadowDOM kaygıları büyük ölçüde çözüldü. Polymer.dart kullanımdan kaldırıldı. Web Components olgunlaştı. Simon'ın Polymer'den kaçınma gerekçeleri (stil ekleme, çatılarla iş birliği) sonunda platform tarafından giderildi. Genel ilke (üretim uygulamasının çekirdeği için en yeni çatılardan kaçınmak) 2026'da da, o günün "heyecan verici" çatısı ne olursa olsun geçerli.

İlgili yazı: Nasıl Yapıldı: Flutter Tabanlı Mobil Zaman Çizelgesi — Quire'ın mobil ekibinin Flutter'ı kullanarak bir Zaman çizelgesi görünümü nasıl geliştirdiğine bir bakış.

Büyük bir web uygulaması için dil seçerken en sık yapılan hatalar neler?

Çok yıllık bir uygulamanın dil yığınını seçmek, geri almanın pahalı olduğu az sayıdaki mühendislik kararından biri. Ekipler yanlış yaptığında dört kalıp tekrar ediyor.

1. Varsayılan olarak en büyük topluluğa sahip dili seçmek. En büyük topluluk JavaScript'te, ama "en büyük", "sorununuza en uygun" demek değil. Güçlü tip sistemi ve iyi araçları olan, topluluğu daha küçük bir dil, zayıf garantilere sahip dağınık bir ekosistemi geride bırakabilir. Topluluk büyüklüğü önemlidir, ama önemli olan tek şey değildir.

2. İstemci ve sunucu dillerini ayıran bir yığın seçmek. Çoğaltılan her veri modeli, patlamayı bekleyen bir hatadır. Sunucuda Ruby, istemcide JS kullanan ekipler bu bedeli sonsuza kadar öder. İki yüzeyde tek dil paylaşan ekipler (Dart, TypeScript, Kotlin) bütün bir hata sınıfından kurtulur.

3. En yeni teknolojiyi oturmadan benimsemek. Quire ekibi 2014'te AngularDART ve Polymer.dart'tan kaçındı, çünkü ikisinin de mimarisinde çözülmemiş sorular vardı. AngularDART köklü bir yön değişikliği yaptı, Polymer ise kullanımdan kaldırıldı. Genel kural (uygulamanızın çekirdeğini bir çatıya bağlamadan önce onun büyük ölçekte üretimde kendini kanıtlamasını bekleyin) 2026'da da, o günün "heyecan verici" çatısı için geçerli.

4. Kısa vadeli hız için tip sistemini atlamak. Tipsiz diller ilk hafta daha hızlı hissettirir. Altıncı ayda, kazanılan zaman hata ayıklama süresiyle fazlasıyla geri ödenir. Hem tipsiz hem tipli yığınları büyük ölçekte yaşamış mühendislik ekipleri, isteyerek geri dönmez.

Quire ekibinin 2014'teki Dart bahsi, geriye bakınca makul görünüyor. Bunun nedeni Dart'ın baskın hale gelmesi değil (gelmedi), altta yatan ölçütlerin (tipli, paylaşılan istemci-sunucu, olay döngüsü, tree shaking) izleyen on yılda sektör uzlaşısına dönüşmesi.

İyi yaşlanan şey belirli araç seçimleri değil, temel mühendislik ilkeleri oldu. Belirsizlik altında yapılan her dil seçimi için bu kalıp genelde geçerli: bugün ölçebildiğiniz popülerliğe göre değil, on yıl sonra da savunabileceğiniz ilkelere göre seçin.

100.000+ ekibin kullandığı Quire proje yönetimi yazılımına katılın — ücretsiz kaydolun

Sıkça Sorulan Sorular

Quire hangi dille geliştirildi?

Hem istemcide hem sunucuda Dart ile. Uygulama yaklaşık 54.000 satır Dart kodundan oluşuyor ve yaklaşık 30 kütüphane içe aktarıyor.

Quire neden JavaScript veya TypeScript yerine Dart'ı seçti?

Güçlü tip denetimi, sınıf tabanlı kalıtım modeli ve istemci ile sunucuda tek dil. Dart ayrıca bazı modern özellikleri JavaScript'te yaygın desteklenmeden önce sundu.

Quire neden AngularDART veya Polymer.dart kullanmadı?

Ekip, AngularDART'ın bağlamasının izin verdiğinden daha ince bir DOM kontrolü istiyordu. Quire'ın mimari kalıpları da Angular'ın mantığıyla uyuşmuyordu. Polymer.dart ise o dönemde ShadowDOM'un Bootstrap tarzı seçicilerle çakışması nedeniyle tercih edilmedi. Polymer sonradan kullanımdan kaldırıldı; bu da kararı doğruladı.

DQuery ve Bootjack nedir?

Rikulo ekibinin (Quire'ın mühendislik ekibi) açık kaynak kütüphaneleri. DQuery, olay delegasyonuna odaklanan kısmi bir jQuery Dart portudur. Bootjack ise neredeyse aynı CSS ve API'lere sahip, Bootstrap 3'ün eksiksiz bir portudur.

Quire yığınında Stream nedir?

Quire'ın saf Dart ile yazılmış, olay döngüsü modelini kullanan web sunucusu. Yönlendirme, filtreler ve sunucu tarafı MVC yerleşik geliyor. Quire, Stream'i nginx'in arkasında çalıştırır; ölçeklendirmeyi ve HTTPS'i nginx yönetir.

Simon Pai
Co-Founder at Bookshow