Mobil Neden Sağlam Bir Temel Kuramadı?
Neden CTO, staff ve principal seviyelerinde daha çok backend'ci görüyoruz? Bu yazı, frontend'in (özellikle mobilin) neden olgun bir mühendislik temeli kuramadığını tartışıyor.
Bir süredir kafamı kurcalayan bir gözlem var: Neden CTO, staff, principal gibi üst seviyelerde backend’den gelen insanları daha çok görüyoruz? Bu sorunun altında daha da temel bir soru yatıyor: frontend neden olgun, paylaşılan bir mühendislik standardı yakalayamadı? Bence cevap yeteneklerle değil, tarihle ve zamanlamayla ilgili.
Backend’in miras aldığı temel
Backend, bilgisayar biliminin akademik geleneğinin doğrudan mirasçısı. Bilgisayarı kuranlar matematikçilerdi ve algoritma, veri yapısı, veritabanları, testing refleksleri gibi bugün temel saydığımız ne varsa hepsi akademiden geldi. Yani backend, disiplinin zaten bir beklenti olduğu bir geleneğin üstüne doğdu; o kültür hazırdı. Mobil ve frontend ise bambaşka bir ortama doğdu: tüketim, ürün odağı, ship first. Üstelik backend’in bu birikimi bir gecede de oluşmadı: tasarım desenleri, katmanlı mimari, transaction yönetimi, caching, indeksleme stratejileri… Mainframe günlerinden enterprise yazılımlara, ASP.NET ve Java foundationlarına kadar uzanan yarım asırlık bir geçmişte yavaş yavaş oturdu.
Bunun yanında günlük pratiği besleyen ikinci bir şey daha vardı: hatanın mühendisin yüzüne çarpması. Backend’de hata senin log’una düşer; anında, faili göstererek. Mobilde ise hata kullanıcının cihazında, sen orada değilken patlar; üstelik çoğu hata (layout bozulması, regression, yanlış davranış) bir crash bile değildir, yani sana hiç ulaşmaz. Hata her iki dünyada da pahalıdır; ama biri seni anında uyarır, diğeri kullanıcıyı sessizce kaçırır, ölçülmesi gerekir.
Özetle backend bu disiplini “daha iyi mühendis olduğu” için kurmadı. İki şey birden işine yaradı: bir, disiplinin zaten standart olduğu akademik bir geleneğin içine doğdu; iki, yaptığı hata anında kendi yüzüne çarptığı için o disiplin sürekli pekiştirildi. Bir de bunların üstüne zamanı ekleyin, bu mecburiyet tek tek insanların alışkanlığı olmaktan çıkıp ortak bir kültüre dönüşecek zamanı buldu. Mobilde ise bu üçünden hiçbiri yoktu: ne hazır bir gelenek, ne yüze çarpan bir hata, ne de kültürün oturmasına yetecek zaman.
Bu yüzden bugün bir backend ekibinde bazı şeyler tartışılmaz kabul edilir. Contract testleri yazılır. Protokoller üzerinden ilerlenir. Bir veritabanı mühendisi, doğru indeksi seçmekten önbelleği nasıl kullanacağına kadar birçok optimizasyonu zaten bilir. Bu bilgi tek tek insanların kafasında değil; community’nin ortak hafızasında yaşar. Yeni bir junior geldiğinde, bu temelin içine doğar.
Somut bir örnek vereyim. İki backend servisinin konuştuğu bir yerde, aralarındaki “anlaşmayı” (contract) bir testle sabitlemek rutin haline gelmiştir. Bir taraf değişiklik yaparsa, test anında uyarır ve o değişiklik production’a taşınmadan durdurulur. Bu, kimsenin “iyi mühendislik yapayım” diye düşünüp eklediği bir lüks değil; ekibin ortak hafızasına çoktan kazınmış, tartışılmayan bir refleks. Yeni gelen biri bunu sorgulamaz; içine doğduğu kültürün bir parçası olarak benimser.
Frontend bir koşunun ortasına doğdu
Frontend ise bambaşka bir dünyaya doğdu. Doğal olarak mobile odaklanacağım: iPhone 2007’de çıktı, App Store 2008’de. Yani bugün mobil ekosistem daha 20 yaşına bile gelmedi.
Buraya kadar olan kısmı kendi hikayem de özetliyor. Symbian geliştirdiğim dönemlerde, koca dünyada soru sorabileceğim Nokia forumlarında tek bir kişi vardı. Ne doğru düzgün bir dokümantasyon, ne kitap, ne de başka bir kaynak. Sonra iPhone 2.0 SDK yayınlandı ve oraya geçtim; Apple’ın liderliğinde zamanla bu boşluk biraz kapandı. Ama bu iyileşme hep dar, kendi içine kapalı bir çevrede kaldı. O odaklı sohbet, dışarıdaki insanlara, geniş mühendislik dünyasına dokunmadı; frontend’in ortak bir standarda kavuşmasını sağlayacak bir dalgaya dönüşemedi.
Ve bu genç ekosistem, tarihin en hızlı büyüyen sektörlerinden birinin tam ortasına düştü. Cihazların kalitesi inanılmaz bir hızla arttı. HTML, iOS, Android gibi platformlar geliştiriciye olabildiğince kolay API’ler sundu. Bir düğme koymak, bir ekrandan diğerine geçmek çocuk oyuncağı oldu. Bu kolaylık, hızlı delivery’yi resmen özendirdi.
Sonuç olarak ortaya bir sürü ürün çıktı. Ama hepsi birer programdı; birer sistem değildi. The Mythical Man-Month‘taki çok sevdiğim o grafiği hatırlayın: her şey sol üstteki bölmedeki gibi basit bir programla başlar, testi, code-convention’ı, dokümantasyonu, modülarizasyonu olmayan dümdüz bir program. O programı sağ alttaki “programming systems product”a taşımak için hem ürünleştirme (test, dokümantasyon) hem de sistemleştirme (entegrasyon) gerekir; bu da kabaca dokuz kat emek demektir. Frontend uzun süre o sol üst bölmede, “program” aşamasında takılı kaldı. Çıkan işler iş görüyordu, para kazandırıyordu, insanların hayatına giriyordu; ama o hız, programları birer sisteme dönüştürecek temelin oluşmasına fırsat bırakmadı.
Görünürlük tuzağı
Frontend’de başarı görünür. Ekran çalışıyorsa, düğmeye basıldığında bir şey oluyorsa, demo akıyorsa, iş “bitmiş” görünür. Ama o görünen bitmişlik, altındaki teknik borcu da kusursuzca gizler. Demoda çalışan bir düğme, olmayan bir testi de saklar.
Backend’de hata mühendisin yüzüne çarpıp disipline zorlarken, frontend’de bu görünen başarı tam tersini yaptı; disiplini gereksiz gösterdi. “Zaten çalışıyor, ne diye test yazayım?” Bu cümle, bir nesil mühendisin kafasında sessizce yer etti.
Ve daha kötüsü, bu kültür yukarıdan da beslendi. Bir noktadan sonra basit bir unit test yazmak bile üstler tarafından sorgulanır oldu. “Bunun için zaman mı harcıyorsun?” “Ekran zaten görünüyor, geçelim.” Halbuki bir snapshot testleri gibi göz önündeki gereksinimlerin etrafında bile bir temel hiç oluşmadı.
Yanlış olanı ödüllendiren kültür
Düşünün: iki mühendisten biri bir ekranı bir günde “çalışır” hale getirip demoya yetiştiriyor; diğeri aynı ekranı iki günde, test ederek, edge case’lerini düşünerek, snapshot’larını alarak teslim ediyor. Demo gününde ikisi de aynı görünür. Hatta hızlı olan daha çevik, daha “iş bitirici” görünür. Yavaş olanın yatırdığı emek görünmezdir, çünkü o hatalar hiç olmaz. Görünmeyen bir şeyi takdir etmek zordur.
Backend’de bu denklem tersine işler: orada acele eden mühendisin açtığı yara er ya da geç, çoğu zaman herkesin önünde patlar. Yani sistem, dikkatli olanı zamanla haklı çıkarır. Frontend’de ise yara, kullanıcının cihazında, sizin göremediğiniz bir yerde, sessizce açılır. Feedback döngüsü kapanmadığı için ders de hiç öğrenilmez. Bu, mühendislerin tembelliği değil; ortamın onlara verdiği yanlış sinyalin sonucu. Aynı insanları backend kültürünün içine koysanız, büyük ihtimalle aynı disiplini onlar da gösterirdi. Mesele yetenek değil, içine doğulan ortam.
Döngünün kapanmamasının asıl nedeni de tam burada: çoğu zaman hatayı göremiyoruz bile. Observability, tıpkı testler gibi frontend’ciler için uzun süre ikinci planda kaldı; hâlâ da büyük ölçüde öyle. Bugün loglama için ortak, oturmuş bir standart yok; çoğu ekip crash detection’ın ötesine geçemedi. Backend tarafında bir isteğin nereden geçtiğini, ne kadar sürdüğünü, tam olarak nerede patladığını adım adım izleyebilirsin; ama frontend’de ise kullanıcının cihazında ne olup bittiği çoğu zaman kapkaranlık bir kutudur. “Kullanıcı tam olarak ne yaşadı, hangi adımda zorlandı, nerede vazgeçti?” sorusuna cevap verecek ortak bir kültür gelişmedi.
“Mobil daha basittir” yanılgısı
Şimdi bu işin en sevdiğim kısmına geliyorum, çünkü çoğu insanın sezgisinin tam tersi.
Yukarıda anlattıklarım, mobilin teknik olarak “sığ” olduğu izlenimini verebilir. Gerçek bunun tam tersi. Mobil, teknik yelpaze olarak diğer platformlardan aşağıda değil; pek çok eksende üstünde. Bir mobil mühendisin aynı anda dengede tutması gereken şeyleri şöyle bir düşünün: güvenlik, sınırlı bellek ve CPU, ısınma ve pil ömrü, kötü network ve offline-first senaryolar, detaylı cihaz API’leri (kamera, lokasyon, sensörler), push notification, deep linking, OS sandbox’ı ve app lifecycle, UI constraintleri ve farklı çözünürlükler, geriye dönük uyumluluk, erişilebilirlik, localization ve belki en acımasızı, hotfix’in olmaması.
Bu listeye bakınca ortaya ironik bir tablo çıkıyor: temele en çok ihtiyaç duyan platform, temeli kurmaya en az fırsat bulan platform oldu.
Peki bu bizi nereye getiriyor?
Ama tabloyu karamsar bitirmek istemiyorum, çünkü buna inanmıyorum. O temel tam da şimdi oluşuyor: unit testler, snapshot testleri, tasarım sistemleri, modülarizasyon, localization, accessibility… Mobil ve frontend ergenliğini yavaş da olsa geride bırakıyor. Ve bence bu denklemi hızlı biçimde değiştirecek asıl şey AI olacak. Yıllardır ertelenen ne varsa bugün AI ile çok ucuza ve çok hızlı kurulabiliyor. Yani backend’in yarım asırda, mecburiyetten oturtmak zorunda kaldığı o “tartışılmaz temeli”, frontend artık çok daha kısa sürede kurabilecek konuma geliyor.