Referanslar · Bileşenler ve dağıtım

American Express bağlamında web bileşenleri

Batunet, 2022 sonundan 2026 başına kadar etkileşimli web bileşenlerinin teknik uygulamasını ve bakımını üstlendi: bir kredi kartı karşılaştırması, kişisel bir enflasyon hesaplayıcı ve bir dizi tablo, gezinme ve kampanya modülü. Geliştirme, American Express'in Almanca rehber bölümü için bir proje zinciri kapsamında yapıldı; American Express, Batunet'in doğrudan sözleşme tarafı değildi. Bileşen sayısı arttıkça bakım yükü de büyüdü; bundan, ürün bilgilerini ve içerikleri merkezi olarak yöneten ve bileşenleri JavaScript olarak dağıtan bir Symfony uygulaması doğdu.

Genel bakış

Bir dakikada proje.

Bağlam
American Express'in Almanca rehber bölümündeki sayfalar. Geliştirme bir proje zinciri kapsamında yapıldı; American Express, Batunet'in doğrudan sözleşme tarafı değildi.
Rol
Bileşenlerin teknik uygulaması ve çok yıllı bakımı; merkezi yönetim ve dağıtım uygulamasının geliştirilmesi.
Dönem
7 Aralık 2022 – 17 Mart 2026; sürüm geçmişiyle belgelenmiştir.
Bileşenler
Kredi kartı karşılaştırması, iki kartın doğrudan karşılaştırması, kişisel enflasyon hesaplayıcı, karşılaştırma tablosu, mobil sabit (sticky) gezinme, detay görünümlü sabit çubuk, kampanya modülleri.
Karşılaştırma mantığı
Birden fazla kriter için kullanıcının belirlediği ağırlıklar, her kart için puan, en üst sıradaki karta göre yüzdeye normalleştirme, filtreleme, ağırlık verilmediğinde tanımlı bir sıralama.
Merkezi yönetim
Ürün kayıtları ve bileşene özgü alan değerlerinden oluşan veri modeli, yaklaşık yirmi bileşen türü için bildirimsel (deklaratif) alan setleri, girişli ve rol kısıtlamalı editör arayüzü, dağıtımdan önce önizleme.
Dağıtım
Sunucu tarafında oluşturulan JavaScript; hedef sayfa bir script ekler ve bir kapsayıcı (container) sağlar.
Teknik ortam
Birinci kuşak HTML, CSS ve JavaScript; ikinci kuşak PHP ve Doctrine, Twig ve EasyAdmin ile Symfony 7.1.
Kapsam sınırı
Ürün içerikleri, koşullar, görseller ve marka varlıkları Batunet'e ait değildir. Grafik, karusel ve giriş maskesi kütüphaneleri üçüncü taraf kodudur. Sürüm geçmişi, projedeki başka bir katılımcının katkısını da içerir.
Bağlam

Başkalarına ait sayfalar için yapı taşları.

American Express'in rehber bölümü, kart ürünlerini ve finans konularını editoryal sayfalarda açıklar. Bu sayfalara, metinden fazlasını yapabilen araçlar yerleştirilecekti: karşılaştırmak, hesaplamak, ürünleri anlaşılır biçimde göstermek. Sayfaların kendisi, yapıları ve işletimi bizim sorumluluğumuzda değildi.

Bu projenin temel koşulu da buradan çıkar. Bir bileşen, kendisine ait olmayan bir belgede, genişliğini bilmediği cihazlarda çalışır. Bu nedenle her bileşen kendi işaretlemesini (markup), görünümünü ve verisini beraberinde getirir. Hedef sayfadan yine de beklediği şeyler (örneğin belirli bir kütüphane) sessizce varsayılmak yerine açıkça ön koşul olarak belirtilmiştir.

Batunet burada bir proje zincirine dahil olarak teknik uygulamadan ve bakımdan sorumluydu; Batunet, American Express'in sözleşme tarafı değildi. İçerikler, koşullar ve marka varlıkları bizden gelmedi.

Görev

Hesap yapan karar destek araçları.

Araçlardan ikisi, her okuyucunun farklı sorduğu soruları yanıtlar. Benim için önemli olana hangi kart uyuyor? Alışveriş sepetim ortalamaya uymuyorsa fiyat artışları beni ne kadar etkiliyor? Her iki yanıt da tarayıcıda, anında ve giriş yapmadan oluşur.

Bunlara kendi hesaplama mantığı olmayan yapı taşları eklendi: bir karşılaştırma tablosu, mobil bir ürün gezinmesi, ekranın altına sabitlenmiş detay görünümlü bir çubuk ve ürün görseli, avantajlar ve başvuru bağlantısı içeren statik kampanya modülleri. Bunlarda gereksinim mantıktan çok, her cihazda doğru görünümdü.

Hepsinin ortak noktası, ilk dağıtımdan sonra bitmiş olmamalarıydı. Bağlantılar, koşullar, görseller ve metinler sürekli değişti ve görevin bu kısmı projeyi daha sonra herhangi bir tek yapı taşından daha fazla şekillendirdi.

Karşılaştırma mantığı

Sıralama kullanıcıya aittir.

Sabit sıralı bir karşılaştırma, sağlayıcının sorusunu yanıtlar. Burada ağırlıklandırma okuyucudadır: Birden fazla kriter için her birinin kendisi için ne kadar önemli olduğunu üç kademede ayarlar. Bundan her kart için ağırlık ve özellik değerinden oluşan bir puan çıkar. İki kriter, yalnızca büyüklük ölçekleriyle sonucu tek başlarına belirlemesinler diye sabit bir dengeleme katsayısı taşır.

Puanın kendisi kimseye bir şey söylemez. Bu nedenle en üst sıradaki karta göre bir yüzde değeri gösterilir. Hiçbir ağırlık verilmemişse rastgele bir sıra yerine sabit bir başlangıç sırası devreye girer. Bir filtre, uygun kartları uygun olmayanlardan ayırır ama uygun olmayanları gizlemez; bunlar sonuç listesinin altında ayrı olarak gösterilir.

Geniş ekranlarda kartlar yan yana durur ve bir detay görünümü açar. Dar ekranlarda liste bir karusele dönüşür ve başvuru bağlantısı o anda ortada duran kartı izler.

2025'te ikinci bir araç eklendi: serbestçe seçilen iki kartın ücretlerden seyahat ve sigorta avantajlarına kadar on bir kategoride doğrudan karşılaştırması.

Giriş
Kriter başına ağırlık, Filtre, Başlangıç durumuna sıfırlama
Hesaplama
Ağırlık ve özellik değerinden puan, Sabit dengeleme katsayıları, En üst sıradaki karta göre normalleştirme
Sonuç
Yüzde değerli sıralı liste, Ayrı gösterilen uygun olmayan kartlar, Her kart için detay görünümü
Görünüm
Geniş ekranlarda kart ızgarası, Dar ekranlarda karusel, Başvuru bağlantısı ortadaki kartı izler
Hesaplama

Aynı endeks, farklı bir alışveriş sepeti.

Resmî enflasyon oranı ortalama bir haneyi tanımlar. Az araç kullanan ve çok ısınan biri farklı bir oran yaşar; rakam yanlış olduğu için değil, başkasının alışveriş sepetine göre ağırlıklandırıldığı için.

Bu nedenle enflasyon hesaplayıcı resmî endeks serilerini, genel endeksi ve on dokuz harcama kategorisini alır ve bunları kişinin kendi girdiği harcamalara göre ağırlıklandırır. Her ay için ağırlıklı ortalama olarak kişisel bir endeks değeri oluşur; yıllık oran, on iki ay önceki değerle karşılaştırmadan çıkar. Bir grafik kişisel ve resmî seyri yan yana, istenirse ayrıca tek bir kategoriyi gösterir.

Asıl emek formülün etrafındadır. Tutarlar, insanların para hakkında düşündüğü şekilde girilir: euro olarak, kuruş olmadan. Hesaplayıcı her kategori için, belirtilen toplam harcamaya göre standart bir ağırlıklandırmadan türetilen bir referans değer gösterir. Atanmamış harcamalar ayrı bir kalan kategorisine aktarılır ve sonuç her girişte yeniden hesaplanır. Kategoriler toplam harcamayı aşarsa hesaplayıcı, var olamayacak bir rakam yerine bir uyarı gösterir.

Modüller

Az mantık, çok cihaz.

Diğer yapı taşları hesap yapmaz. Bir karşılaştırma tablosu birden fazla kartı satır satır karşılaştırır ve dar ekranlarda küçültülmüş bir sürüm yerine kendine özgü bir yapı alır. Mobil bir ürün gezinmesi ekranın kenarında açılır. Alt kenara sabitlenmiş bir çubuk, tıklamayla, arka plana dokunarak veya Escape tuşuyla yeniden kapanan ve dar ekranlarda karusel olarak çalışan detay görünümlü bir genel bakış açar.

Birinci kuşağın kampanya modülleri üç varyantta statik HTML ve CSS'ten oluşuyordu: liste, kompakt menü ve kart ızgarası. Teknik olarak bu yapı taşları sadedir. Maliyetleri başka bir yerde ortaya çıktı: Aynı ürün bilgileri, her biri kendi deposunda ve kendi geçmişiyle birden fazla modülde yer alıyordu.

Bakım

Yer­leş­ti­ril­miş bile­şen­lerde zamanla eskiyenler.

2023 ve 2024 boyunca işin büyük kısmı kodla pek ilgisi olmayan değişikliklerden oluştu: yeni bağlantı hedefleri, değişen başlangıç bakiyeleri, değiştirilen görseller, yeniden adlandırılan ürünler. Bunların her birinin birden fazla ayrı yapı taşında, kısmen de aynı aracın paralel olarak bakımı yapılan varyantlarında güncellenmesi gerekiyordu.

Yapı taşları az olduğu sürece bu göze çarpmaz. Her yeni yapı taşıyla aynı bilgi bir yerde daha yer alır. Dengenin bozulduğu nokta teknik bir hata değil, bir miktar meselesidir.

Merkezileştirme

Dosyalar veriye dönüşüyor.

Yanıt yeni bir bileşen değil, bir alt katmandı: Ürün bilgilerinin ve bileşen içeriklerinin kaynak kod yerine veri olarak tutulduğu, Symfony 7.1 tabanlı bir uygulama.

Model küçük tutuldu. Bir ürün kaydı her yerde gereken bilgileri taşır: ad, görsel, bağlantılar. Her bileşen için adlandırılmış alan değerleri vardır. Bir bileşen türünün hangi alanları bildiği, en son yaklaşık yirmi tür için bildirimsel bir yapılandırmada tanımlıdır. Böylece yeni bir tür bir yapılandırma meselesi olarak kalır, model değişikliğine dönüşmez.

Alan değerleri ürün bilgilerine referans verebilir; oluşturma sırasında bu referanslar ürün kaydındaki değerlerle değiştirilir. Bu nedenle değişen bir bilgi, her dosyada tek tek güncellenmek yerine onu kullanan her bileşende etkili olur.

Dağıtım sunucu tarafında oluşturularak yapılır: Bir bileşenin şablonu, verileriyle birlikte hedef sayfanın eklediği JavaScript'e dönüşür. Bundan önce, aynı bileşeni farklı ekran genişliklerinde gösteren bir önizleme yer alır. Bakım, girişli ve rol kısıtlamalı bir editör arayüzünde yapılır.

Geçiş aşamalar hâlinde gerçekleşti. İçerikler önce CSV dosyalarıyla içe aktarıldı, daha sonra editör arayüzlü bir veri modelinde yönetilmeye başlandı. Kredi kartı karşılaştırması da dahil olmak üzere mevcut yapı taşları uygulamaya taşındı; hesaplama mantıkları korundu, veriler o zamandan beri sunucudan geliyor.

American Express bağlamında web bileşenleri: ürün verilerinden alan yapılandırması ve editör arayüzü üzerinden farklı ekran boyutlarında oluşturulan bileşene uzanan dağıtım yolunun şematik gösterimi
  1. 01

    Ürün verileri

    Her ürün için bir kayıt, tüm bileşenlerin ortak olarak ihtiyaç duyduğu bilgileri taşır.

  2. 02

    Alan seti

    Her bileşen türü için hangi alanları bildiği bildirimsel olarak tanımlanır.

  3. 03

    Editör

    Değerler kaynak kodda değil, rol kısıtlamalı bir arayüzde yönetilir.

  4. 04

    Birleştirme

    Oluşturma sırasında ürün bilgilerine yapılan referanslar kayıttaki değerlerle değiştirilir.

  5. 05

    Önizleme

    Bileşen, dağıtımdan önce birden fazla ekran genişliğinde kontrol edilir.

  6. 06

    Dağıtım

    Aynı bileşen JavaScript olarak üretilir ve hedef sayfa tarafından eklenir.

Süreç

Üç yıl, iki kuşak.

Çalışma, başlangıcı ve kabulü olan bir proje olarak değil, sürekli bir geliştirme olarak ilerledi. Sürüm geçmişi 7 Aralık 2022'den 17 Mart 2026'ya kadar uzanıyor ve iki kuşak gösteriyor: önce bağımsız yerleştirme bileşenleri, ardından mevcut bileşenlerin taşındığı merkezi bir uygulama.

  1. 01

    2022 sonu – 2023 başı

    Hesaplama, grafik ve giriş maskesiyle enflasyon hesaplayıcı.

  2. 02

    2023 baharı

    Kredi kartı karşılaştırması, karşılaştırma tablosu ve sabit (sticky) bileşenler.

  3. 03

    2023 ortası – 2024 sonu

    Sürekli bakım, statik kampanya modülleri, paralel olarak bakımı yapılan varyantlar.

  4. 04

    2024 sonu – 2025 ortası

    Symfony uygulamasının temel iskeleti, CSV içe aktarma, karşılaştırmanın taşınması.

  5. 05

    2025 ortası – sonu

    Editör arayüzlü veri modeli, doğrudan karşılaştırma, yeni bileşen türleri, diğer modüllerin taşınması.

  6. 06

    2025 sonu – Mart 2026

    Dağıtımın yeni veri modeline geçirilmesi ve sürekli bakım.

Rol

Bizim sorum­lu­lu­ğu­muzda olanlar ve olmayanlar.

Batunet'in sorumluluğunda olanlar: bileşenlerin teknik uygulaması, üç yılı aşkın süre boyunca bakımları ve yönetim ile dağıtım uygulamasının geliştirilmesi.

Bizim sorumluluğumuzda olmayanlar: bileşenlerin yerleştirildiği sayfalar ve bunların işletimi ile ürün içerikleri, koşullar, görseller ve marka varlıkları. Grafik, karusel ve giriş kütüphaneleri üçüncü taraf kodudur; sürüm geçmişi, projedeki başka bir katılımcının katkısını da içerir.

Batunet'in sorumluluğunda
Bileşenlerin uygulanması, Hesaplama ve karşılaştırma mantığı, Duyarlı (responsive) görünüm, Çok yıllı bakım, Veri modeli, editör arayüzü ve dağıtım
Batunet'in sorumluluğunda değil
Hedef sayfalar ve işletimleri, Ürün içerikleri ve koşullar, Görseller ve marka varlıkları, American Express ile sözleşme ilişkisi
Değerlendirme

Ayrı bir katman için doğru zaman.

Geriye bakıldığında ilginç olan tek tek yapı taşları değil, geçiştir. Bir avuç modül için ayrı bir yönetim uygulaması abartılı olurdu: Bir şey kazandırmadan önce işletim, bakım ve öğrenme maliyeti getirir. Aynı ürün bilgilerini taşıyan ve sürekli değişen birden fazla bileşen olduğunda ise hesap tersine döner.

Taşıma, birkaç ay boyunca bileşen bileşen, adım adım yapıldı. Bu, yapı taşları zaten önceden ayrı olduğu için mümkündü. Örneğin karşılaştırmanın hesaplama mantığı taşıma sırasında değişmedi; değişen, verinin kaynağıydı.

Kullanılan teknolojiler

Tek bir projede iki kuşak: framework ön koşulu olmayan HTML, CSS ve JavaScript ile bağımsız frontend yapı taşları, daha sonra yönetim ve dağıtım için bir Symfony uygulaması. jQuery, Owl Carousel, Highcharts ve Inputmask üçüncü taraf kütüphanelerdir ve bu şekilde belirtilmiştir.

JavaScriptPHPSymfonyDoctrineTwigEasyAdmin
Sorular

Bu projeyle ilgili sorular

  • American Express, Batunet'in müşterisi miydi?

    Hayır. Geliştirme, American Express'in Almanca rehber bölümü için bir proje zinciri kapsamında yapıldı; American Express, Batunet'in doğrudan sözleşme tarafı değildi. Batunet, bileşenlerin teknik uygulamasından ve bakımından sorumluydu. Ürün içerikleri, koşullar ve marka varlıkları bize ait değildir.

  • Ağırlıklı puanlamalı bir ürün karşılaştırması nasıl çalışır?

    Ağırlıklandırma kullanıcıdadır. Birden fazla kriter için her birinin ne kadar önemli olduğu ayarlanır; bundan her ürün için, en üst sıradaki ürüne göre yüzdeye normalleştirilen bir puan çıkar. Büyüklük ölçeği farklı olan kriterler sabit bir dengelemeye ihtiyaç duyar; aksi hâlde sonucu tek bir kriter belirler.

  • Kişisel enflasyon oranı nasıl hesaplanır?

    Tek tek harcama kategorilerinin resmî endeks serileri alınır ve ortalama alışveriş sepeti yerine kişinin kendi harcamalarına göre ağırlıklandırılır. Her ay için ağırlıklı bir endeks değeri oluşur; yıllık oran, on iki ay önceki değerle karşılaştırmadır.

  • Yerleştirilmiş bileşenler için merkezi bir yönetim ne zaman kendini amorti eder?

    Aynı içerik değişikliği birden fazla yerde yapılması gerektiği anda. Bir ya da iki yapı taşı için ayrı bir uygulama abartılıdır. Birden fazla bileşen aynı ürün bilgilerini taşıyorsa ve bunlar sürekli değişiyorsa, editör arayüzlü bir veri katmanı her dosyayı tek tek güncellemekten daha ekonomiktir.

  • Bir bileşen başka birine ait bir sayfaya nasıl eklenir?

    Bir script ve bir kapsayıcı (container) öğesiyle. Script, bileşenin görünümünü, davranışını ve verisini beraberinde getirir ve kapsayıcının içinde oluşturur. İkinci kuşakta bu script, şablon ve veri tabanından sunucu tarafında üretilir.

Projenizi konuşalım.

Projenizi kısaca anlatın. İlk görüşmeyi doğrudan yönetimle yaparsınız.