Hizmetler
Hizmetler
Yazılım geliştirme süreçlerinin tamamında, baştan sona veya talep edilen noktasında hizmet verebiliyoruz. Aşağıda her başlığı, neyi kapsadığı ve elinize ne geçtiğiyle birlikte anlattık.
Analiz
İş analizi
Projenin amacını, hedef kitlesini ve varsa mevcut sorunlarını çıkarıyoruz. Ne yapılacağına karar vermeden önce neyin gerektiğini netleştiriyoruz.
Bir ekibin en çok ihtiyaç duyduğu şey sıklıkla daha fazla kod değildir. Sisteme bakıp neyin yanlış olduğunu, gerekçesiyle birlikte, yazılı olarak açıkça söyleyecek dışarıdan bir okuyucudur.
Bu çoğu zaman doğru ilk iştir. Küçüktür, süresi bellidir ve sonrasında bizimle çalışsanız da çalışmasanız da elinizde işe yarar bir şey bırakır.
Bir sistemi nasıl okuyoruz
İzlenimle değil kanıtla çalışıyoruz: üretim logları, APM izleri, hata profili, dağıtım geçmişi, var olan ve olmayan testler. Sonra da kodu, işin gerçekte neye ihtiyaç duyduğuna bakarak okuyoruz.
Bulguları etki alanı ve çözülebilirlik sırasına göre veriyoruz, çünkü etkisi dar olan zor bir problemi, etkisi geniş olan kolay bir problemden önce çözmek, iyileştirme programlarının meşruiyetini kaybetme biçimidir. Günde yaklaşık 1.000 hata kaydı üreten bir kurumsal e-ticaret platformunda, sınıfları bilinçli bir sırayla çalışmak bu sayıyı çift haneye indirdi.
Teslim edilen bir doküman değil, bir karardır
Rapor sıralanmış bir planla biter: önce ne yapılacak, bu ne kazandırıyor, neye mal oluyor ve güvenle neyi bekletebilirsiniz. Bunu hem CTO’nuza hem CFO’nuza verdiğinizde ikisinin de anlaması gerekir.
Mimari
Mimari karar
Projeye uygun alternatifleri belirliyor, araştırıyor ve ön testlerini yapıyoruz. Karar varsayımla değil, ölçümle veriliyor.
Backendlerin çoğu yanlış çatı seçildiği için çökmez. Bir sorumluluğun nerede bittiğini ve bir sonrakinin nerede başladığını kimse yazmadığı için çöker; böylece her yeni özellik, bir öncekinin etki alanını sessizce biraz daha genişletir.
Biz sınırlardan başlıyoruz: her servis veya modül neyi sahipleniyor, neyi bilmesine izin yok, geri kalanla nasıl konuşuyor. Sonra da bu kararlardan doğan API yüzeyini tasarlıyoruz.
İzolasyon, uygulanan bir sözleşme olarak
Kendi platform işimizde servis izolasyonunu, inceleyicinin hatırlaması gereken bir gelenek değil, kodun ihlal edemeyeceği bir kural olarak tutuyoruz: servisler veritabanı, önbellek örneği veya çalışma zamanı durumu paylaşmaz ve birbirini doğrudan çağırmaz. Tüm servis arası trafik, aşağı akıştaki servislerin herhangi bir iş yapmadan önce doğruladığı istek bağlamını enjekte eden bir gateway üzerinden geçer.
Bu katılık bedelsiz değil ve her zaman da doğru değil. Bulunduğunuz noktada daha iyi cevap modüler bir monolitse, bunu söyleriz.
İşin çoğu sıralamadır
Var olan bir sistem parçalanacaksa, sıra hedef diyagramdan daha önemlidir. Bir lead-generation SaaS platformunda tek bir yük her şeyi domine ediyordu: canlı önizlemeli editör her tuş vuruşunda bir JavaScript paketini yeniden üretiyordu ve 10-15 eşzamanlı kullanıcıyla tüm platform dakikalarca beklemeye düşüyordu.
O yükü önce izole ettik. Bu tek adım, baskın yükü diğer tüm yetenekleri bozmasına izin vermek yerine tek bir yerde sınırladı; ayrıca ayrıştırmanın kalanını, ürün yol haritasıyla birlikte normal bir hızda yapmayı güvenli hâle getirdi.
Geliştirme
Yazılım geliştirme
Belirlenen mimariye uygun, okunabilir ve sürdürülebilir kod yazıyoruz; bugünkü özellik listesini değil, önümüzdeki yılların değişimini taşıyacak şekilde.
Kod, bir mimarinin ya ayakta kaldığı ya da sessizce geçerliliğini yitirdiği yerdir. Onu anlaşılan sınırlara göre, bizim tercih ettiğimiz üslupla değil, katıldığı kod tabanının üslubuyla yazıyoruz.
Ayar ekranı değil, kural motoru
İş kuralları zamanla, hiçbir platformun hazır özelliklerine sığmayacak kadar karmaşıklaşır. Gerçek bir kampanya şöyle okunur: A ürünündeki indirimi al; müşteri daha önce X ürününü aldıysa ikincisini üstüne ekle; ama yaşam boyu harcaması bir eşiği geçtiyse ikisini de kaldır ve yerine üçüncüsünü uygula.
Bu mantık doğrudan uygulama koduna yazıldığında, ürün sayfasında bir, sepette bir, ödeme öncesinde bir daha yapılan bir yeniden hesaplamaya dönüşür. Üç ila beş çakışan kampanya aktifken de istek basitçe zaman aşımına düşer. Biz bunu yönetilen bir katmanla değiştiriyoruz: çakışmaları deterministik çözen açık bir öncelik listesi, kampanyaların deploy olmadan açılıp kapanmasını sağlayan aktif/pasif durum ve hesabın bir kez yapılmasını sağlayan önbellek.
Bir kurumsal platformda bu tek iş, sepet yarış koşullarının, ödeme tutar tutarsızlıklarının ve zaman aşımlarının çoğunu çözdü.
Devredilmek üzere kurulur
Yalnızca tek kişinin işletebildiği mimari, varlık kılığına girmiş bir yüktür. Kurduğumuz her şeyi, onu dürüst tutan kalite kapılarıyla birlikte ve iş mantığını sunum katmanından bilinçli olarak ayırarak teslim ediyoruz. Bir ticaret platformunda bu, her biri tek bir sorumluluğu sahiplenen on ayrıştırılmış eklenti demekti; böylece çekirdek işlevler tema ve platform güncellemeleri boyunca stabil kaldı.
Entegrasyon
Entegrasyon
ERP, CRM, ödeme sistemleri ve üçüncü taraf servislerle entegrasyonları kuruyoruz. Araya sınır koyuyoruz ki dışarıdaki bir sistemin arayüzü değiştiğinde uygulamanız kırılmasın.
Entegrasyonlar, kontrol etmediğiniz sistemlerin kontrol ettiğiniz sisteme uzandığı yerdir. İşin aslı, çağrının başarılı olmasını sağlamaktan çok, olmadığında ne olacağına karar vermektir.
İki tarafın da değişebilmesi için bir sınır
Yalnızca SOAP açan, REST API’si olmayan bir kurumsal platform, web katmanından doğrudan entegrasyonu kırılgan kılar ve yayın döngünüzü başkasının şemasına bağlar. Araya dedike bir ara katman servisi koyuyoruz: dahili platformu SOAP üzerinden tüketiyor, uygulamaya temiz bir REST API açıyor. İki taraf böylece bağımsız evriliyor.
Ana veri ve finansal işlemler (kullanıcılar, ofisler, ödemeler, iadeler, iptaller) çoğaltılmak yerine kayıt sistemi üzerinden geçiyor. Uygulama, sahiplenmemesi gereken veriden arınmış kalıyor.
Yavaş kısımlar istek yolunun dışında
Satın alma, iptal ve iade işlemleri bir mesaj kuyruğu üzerinden asenkron işleniyor; bildirim hattını da aynı kuyruk tetikliyor. Uzun süren kurumsal çağrı, kullanıcının beklediği bir şey olmaktan çıkıyor.
Paranın hareket ettiği yerde doğruluk
Entegre edilmiş bir ödeme sağlayıcısı, doğru çalışan bir ödeme yolu demek değildir. Bir platformda üst üste binen indirim kuralları, yarış koşulları ve hatalı öncelik sıralaması nedeniyle yanlış hesaplanıyor, tahsil edilen tutar borçlanılandan sapabiliyordu. Altta yatan hesaplama kusurlarını teşhis edip düzelttik; doğrudan finansal ve müşteri güveni sonuçları olan bir hata sınıfıydı.
Test
Yazılım testleri
Unit, integration, e2e, smoke ve güvenlik testlerini kurup CI'da bloklayan kapılar hâline getiriyoruz. Test edilmemiş kod, yalnızca çalıştığı varsayılan koddur.
Test takımı bir kalite rozeti değildir. Koda dokunacak bir sonraki kişinin ondan korkmadan değişiklik yapabilmesini sağlayan şeydir.
Gelenek değil, kapı
Linting, statik analiz ve testler, ekip içi bir mutabakat olarak değil CI’da bloklayan kapılar olarak kat kat daha değerlidir. Bunları hiçbiri olmayan kod tabanlarına ekledik; kendi platform işimizde ise ilk commit’ten itibaren varlar; bunları koymanın ucuz olduğu tek an da zaten odur.
Bir kısıtın içinde çalışmak
Bir kurumsal platformda müşteri otomatik testi en baştan reddetmişti; gerekçesi, sistemi gerçek kullanıcı gibi deneyen bir QA mühendisinin zaten olmasıydı. Tartışmaya girip elimiz boş dönmek yerine, o kısıtın içinde yapılabilecek en iyi şeyi yaptık: ne testi ne statik analizi olan, üstelik bazı geliştiricileri dile yeni olan bir kod tabanına linter kurduk.
İdeal çözüm değildi. Ama gerçekten benimsenen çözüm buydu ve o güne kadar üretime sızan bir hata türünü yakaladı.
Teslim
CI/CD süreçleri
Yayına çıkmayı elle yapılan bir işten otomatik ve tekrarlanabilir bir sürece çeviriyoruz. Her dağıtım health-check'ten geçiyor, geri alma yolu önceden tanımlı oluyor.
Teslim problemlerinin çoğu araç problemi değildir. Üç sorunun üzerinde anlaşılmış bir cevabının olmamasıdır: bir değişiklik üretime nasıl ulaşır, çalıştığını nasıl biliriz, çalışmadığında ne olur.
Doğruyu söyleyen ortamlar
Geliştirme ortamı hızlı bir yerel döngü için ayarlanıyor. Staging ise üretimde olduğu gibi her servisi ayrı ayrı ayağa kaldırıyor ve hepsinin health-check’i bulunuyor. Yeni bir geliştirici de makinesine hiçbir şey kurmadan, tek bir konteyner imajıyla tüm yığını çalıştırabiliyor.
Yayın, denetlenebilir bir olay olarak
Her değişikliğin staging’e dağıtıldığı ve paydaşlara neyin değiştiğinin özetini e-postayla ilettiği hatlar kurduk; onay sonrasında aynı hat üretime yükseltiyordu. Bu, kurumsal bir müşteriye araya bir yayın yöneticisi girmeden dokümante edilmiş bir inceleme-onay izi verdi.
Dağıtımlar her push’ta tetiklenmek yerine etiket veya işaretle açıkça başlatılıyor, her yayından önce ve sonra tam anlık görüntü alınıyor.
Bu bileşim, %100 uptime garantisi altındaki 18 aylık bir iş boyunca üretim geri alımına hiç ihtiyaç duyulmamasının nedenidir.
Operasyon
Bakım ve izleme
Üretimi merkezi loglama, panolar ve uyarılarla izliyoruz. Amaç, problemi müşteriniz bildirmeden önce görüp aksiyon almak.
İstikrarsız bir sistem nadiren tek bir nedenden istikrarsızdır. Aynı anda sekiz nedenden istikrarsızdır; fırsatçı hata düzeltmenin bu sayıyı bir türlü aşağı çekememesinin nedeni de budur.
Çalıştığımız sıra
- Temel kusurlar: kaynak kod hâlâ canlıysa, düz başarısızlıklar temizlenir. Ucuzdur ve geri kalan her şeyi saklayan gürültüyü ortadan kaldırır.
- Yarış koşulları: yanlış toplamlar ve aşağı akışta hiç oluşmayan kayıtlar üreten eşzamanlılık hataları.
- Zaman aşımları: genellikle yavaş bir sorgu değil, birleşerek büyüyen bir hesaplama.
- Üçüncü taraf dayanıklılığı: ödeme, arama ve checkout yollarının yanıt vermeyi bırakan dış servislere karşı sertleştirilmesi.
- Platformun kendi ürettiği yük: önbellek ısınmanızın ve sunucu taraflı render’ınızın yarattığı sıçramalar.
Günde yaklaşık 1.000 hata kaydıyla çalışan bir kurumsal e-ticaret platformunda, üstelik teşhis için yalnızca kayan altı aylık bir log penceresi varken, bu sıra sayıyı çift haneye indirdi.
Önbellek katmanlı bir karardır
İstek başına önbelleklenmemiş on API çağrısı yapan bir uygulamanın önüne konan tam sayfa önbelleği problemi çözmemiş, saklamıştır. Önbelleği aşamalarla kuruyoruz: önce kullanıcıdan bağımsız dış servis yanıtları, sonra müşteriye özgü veriler müşteri kapsamlı anahtarlar altında, sonra birleştirilmiş çıktının kendisi. Daha önce dış servislere on çağrı yapan istek yolları yaklaşık üçe indi.
Önce gözlemlenebilirlik
Yukarıdakilerin hiçbiri üretimi görebilmeden mümkün değil. Merkezi loglama, log taksonomisi, pano veya uyarı yoksa, başladığımız yer orasıdır; çünkü gözlemleyemediğiniz bir sistem hakkında yalnızca tahmin yürütebilirsiniz.
Araçlar
Yapay zekâ destekli geliştirme
Kod tabanınızın kurallarını bilen ajan ve skill araçları kuruyoruz; ayrıca sistemlerinize kurallı erişim veren MCP sunucuları. Kazancın nerede bittiğini de açıkça söylüyoruz.
Bu araçları günlük üretim işinde kullanıyoruz; hizmet olarak sunmamızın tek nedeni de bu. Kazanç gerçek ve aynı zamanda piyasanın iddia ettiğinden daha dar. Sınırın nerede olduğunu size söylemeyi, ötesini satmaya tercih ediyoruz.
Kod tabanınızı bilen araçlar
Genel amaçlı bir asistan genel amaçlı kod yazar. Değer, araçların sizin konvansiyonlarınızı kodladığı yerde ortaya çıkar: çatı deyimleriniz, adlandırmanız, test yapınız, inceleme standartlarınız.
PHP, Laravel, PHPUnit, microservices, Go, Kotlin, SwiftUI, Vue, Docker ve SQL alanlarında 21 alana özgü skill’den oluşan açık bir kütüphane ve dört farklı AI kodlama aracına yayılan 18 özelleşmiş ajan tanımı sürdürüyoruz. Aynı yaklaşım tek bir kod tabanı için de geçerli.
MCP sunucuları
Model Context Protocol, bir AI asistanının bir sistem hakkında tahmin yürütmek yerine ona gerçek erişim elde etme biçimidir. MySQL için bir MCP sunucusu olan mysql-mcp’yi yayınladık ve dahili sistemler için bunları kuruyoruz; erişim sınırlarını bilinçli tanımlayarak, çünkü her şeyi okuyabilen bir araç her şeyi okuyacak araçtır.
Tasarımdan koda
Figma tasarımlarını doğrudan Jetpack Compose ve SwiftUI implementasyonlarına dönüştüren figma2compose ve figma2swiftui skill’lerini yazdık. Tasarım sisteminin tutarlı olduğu yerde bu, mobil teslimden gerçekten tekrarlı bir çeviri adımını kaldırıyor.
Eğitim
Eğitim
Devrettiğimiz sistemi ekibinizin çalıştırabilmesi ve geliştirebilmesi için eğitim veriyoruz. Yerinde ya da uzaktan, konuya ve karşımızdakinin seviyesine göre.
Başka kimsenin çalıştıramadığı bir sistem, ne kadar iyi olursa olsun bitmiş değildir. Eğitim, teslimden sonra satılan bir ek değil, teslimin parçasıdır.
Bakımını yapacak olanlar için
Bunun en işe yarar biçimi sunum dosyası değildir. Üretim kodunda referans implementasyonlardır: hedef mimarinin sizin kod tabanınızda yazılmış hâli, izlenecek somut bir standart olarak. Buna, biz hâlâ sorulara cevap verebilecek durumdayken yapılan kod incelemesi ve eşli programlama eşlik eder.
Bir monolit ayrıştırmasında backend kod incelemesini yürütüp geliştiricilere tam olarak böyle mentorluk yaptık; ekibe bir doküman değil, net servis sınırları, dokümante edilmiş mimari yön ve çalışan örnekler kaldı.
Kullanacak olanlar için
Her devir mühendislere yapılmaz. Bir B2B platformunda müşterinin satış ve arka ofis ekiplerine son kullanıcı eğitimi verdik, devreye alma sonrasında da uzun süre destekledik; çünkü sistem ancak şubelerdeki insanlar ona güvendiğinde karşılığını verdi.
Danışmanlık
Danışmanlık
Yazılım süreçlerinin tamamında ya da yalnızca ihtiyaç duyduğunuz noktasında danışmanlık veriyoruz. Bazen en işe yarar cevap, hiçbir şey inşa etmemektir.
Her işin sonu bizim kod yazmamız olmak zorunda değil. Yaptığımız en değerli işlerin bir kısmı, müşterinin sonra kendi uyguladığı bir öneriydi.
Pahalı olanı erken söylemek
Bir ticaret platformunda katalog arama birinci sınıf bir problemdi: en hızlı sorgular on saniye sürüyor, bazıları tamamen zaman aşımına düşüyordu. Cevap, var olan aramayı optimize etmek değildi. Aramayı ayrı bir arama motoruna taşımayı önerdik; çünkü ticaret backend’ini besleyen hat, küçük bir değişiklikle arama indeksini de besleyebilirdi. Böylece yük backend’den kalkacak, gecikme düşecek ve yan ürün olarak benzer ürün önerileri açılacaktı.
Aynı platformda en pahalı hata sınıfı bir hata değil, yapısaldı: sessizce üretime hiç girmeyen ya da fiziksel olarak imkânsız bir spesifikasyona göre üretilen siparişler. Yerine geçecek akışı ve gecikmeli onay modelini biz önerdik, ekip uyguladı.
Kendimiz hakkında yanıldığımızı yüksek sesle söylemek
Satın alabileceğiniz bir ürün probleminizi çözüyorsa, bunu söyleriz. Doğru iş bir inşa değil de inceleme ise, daha küçük olan işi, incelemeyi öneririz. Bunu size söyleyen taraf olmayı, alternatifi faturalayan taraf olmaya tercih ederiz.