29 Ekim 2009 Perşembe

Server-centric, Client-centric. Peki ya Developer-centric?

Uzun zamandır tartışma konusuydu sunucu ya da istemci odaklı RIA (Kallavi İnternet Uygulamaları) çözümlerinden hangisinin daha etkin olduğu. Kimine göre istemci odaklı olanlar daha iyi, kimine göre ise sunucu odaklı olanlar. İtinayla tartışılır...

Peki farkı neydi bu ikisinin? İstemci odaklı çalışanlar uygulama ekranlarında yapılan alengirli hokus-pokus hareketlerini (ki kullanıcıyı cezbeden çok güzel hareketlerdir bunlar) javascript falan kullanarak kullanıcının tarayıcı uygulaması (IE, Firefox vs.) üzerinde çalıştırırlar. Ha böyle olunca ne olur? Ufak tefek kıytırık getir-götür işleri için sunucu tarafı boşuna yorulmaz. Kullanıcının bilgisayarının da çorbada bir nevi tuzu olur.

Amma ve lakin bu işin bir de baş ağrıtıcı, mide bulandırıcı bir yönü vardır. Bu javascript denen dil çok karmaşık şeylerden bahsederse saçmalar, tarayıcılar söylemek istenenden farklı anlamlar çıkarabilir. O zaman da siz "akım" kodlarsınız kullanıcıya "b.kum" olarak gider, ayıp olur. Bunu önlemek için de tarayıcının suyuna gidilir, anladığı dilden konuşulur. Böyle olunca da buna uygun RIA'yı geliştirmek üstün nitelikler ve çelik gibi bir sinir sistemi gerektirir. Oluşan javascriptin WTFs/min oranı yüksektir. Bu ölçümün nasıl yapıldığından sonra bahsederim.

Bu işi başaran babayiğitlere örnek vermek gerekirse en başta bir Google iştiraki olan GWT gelir. GWT ile kodladığınız java kodları Google'ın yeminli tercümanları tarafından Javascript kodlarına tercüme edilerek tarayıcıya gönderilir. Bilindiği üzere bilgisayarlar "aptal" makinelerdir. Yani ne yapacağını inceden inceye söylemek gerekir. Yoksa şaşırıp afallar, salak. Madem ki serde istemci odaklı olmak var, o zaman çalışacak kodu tümüyle kullanıcının makinesine göndermek gerekli. Bu da sunucudan istemciye giden veri trafiğini artırır. Her ne kadar teknoloji ilerlemiş, fiber optik kablolar falan ayağa düşmüş olsa da bilinçli yazılımcı donanıma güvenerek iş yapmaz, (Hacettepe Bilgisayar Müh. mezunları bilirler, Mustafa hoca veri yapıları dersinde sineğin yağını çıkarır, posasını da geri dönüşüme gönderirdi. Sınav sorularında "yeni değişken tanımı yapmaksızın" ibaresi saç baş yolduracağına delalettir) istemciye göndereceği kodu kısa tutmaya çalışır. Bilgisayarın kitabını yazmış olan Tanenbaum amcamız 'As I did 20 years ago, I still fervently believe that the only way to make software secure, reliable, and fast is to make it small.' demiş dilinden anlayana. Kısacası "kısa kesin, Aydın havası olsun" demiş. Neyse gene çok dağıttık, toplayalım: istemci odaklı RIA çözümleri tarayıcıya çok yüklenirler. Bu da istemci tarafını şişirir. Bu da muhtelif meclislerde yazılımınızın yavaşlığının mevz-u bahis edilmesine sebep olur.

Gelgelelim, sunucu odaklı RIA çözümlerinde yukarıdakilerin hiç biri olmaz. Bunun yerine kullanıcılar Lütfen Bekleyiniz..., Processing..., Loading..., Lan iki dakka sabret... gibi AJAX sonrası dilimize pelesenk olmuş nevi şahsına münhasır deyimlerimizle sıkça aşina olurlar. Çünkü istemci tarafı tembeldir ve herşeyi sunucudan bekler. Tabiri caizse yerinden kalkıp mutfaktan su almak yerine yan odada ütü yapan karısından su isteyen tembel kocalar (aaa çok ayıp!) gibidir. Kadıncağız söylene söylene suyu getirir, bazen de sabrın sınırı aşılır, küser cevap vermez. (Ping! cevap yok!) Çünkü aynı anda bir yandan bebek altına yapmıştır, temizlenmesi için zırlar durur, küçük çocuk acıkmıştır, büyük olanın ise yarına yetişecek bir ödevi mutlaka vardır. Apache kabilesinden Wicket da bu mantıkla çalışır.

Bir "made in China" RIA çözümü olan ZKyı da sunucu odaklı bilirdik. Fakat Çan, çin çun ve Chen amcalar şu sıralar çıktım çıkacam (release candidate - RC) diyen 5. sürümde yukarıdaki yaman çelişkiyi farketmiş olacaklar ki orta yolu bulmuşlar ve az biraz kılıbıklaşarak, geliştiricileri de düşündüklerini beyan ederek developer-centric bir RIA yaklaşımı ortaya atmışlar. Server-Client Fusion diye adlandırdıkları bir yapı ile turnayı gözünden vurmuşlar. İşin detayına girip de kafa karıştırmaya hiç niyetim yok, merak eden zkoss.org'dan kendisi bakar. Hazır bakmışken ajax-as-a-service kısmına da bakar, bence. Zaten bileşen zenginliğiyle ön plana çıkan ZK'ya bu iki işlevsellik tuz-biber olmuş. (Diğer RIA çözümlerine de kapak olmuş da denebilir.)

Tadından yenir mi yoksa yanında mı yatılır bilmem ama üzerine tatlı niyetine güzel bir haber daha vereyim: Lisanslamayı değiştirmişler. Artık bundan böyle GPL (Kimine göre GPL bir virüstür, bulaştığı yazılıma kendini kopyalar ve yayılır.) değil, LGPL. Yani bundan böyle binbir emekle yazdığınız kodları sırf ZK kullandığınız için cümle aleme mal etmek zorunda değilsiniz. Bu da günün güzel haberi olsun.

Benden bu kadar, yorumlarınızı bekliyorum. Bundan önce bi kaç kere daha farklı konularda blog yazdım. Sonra da bi kaç kere okudum, beğenmedim sildim. Üsluba bir türlü karar veremedim, çünkü. Yarın biraz daha ağır takılayım dersem belki bunu da silerim, belki de silmem. Herkesin 29 Ekim Cumhuriyet Bayramı kutlu olsun. Ne mutlu TÜRK'üm diyene!


* Bu arada WTFs/min yöntemi (What the fucks per minute): Yazılmış kod parçası başka bir yazılımcı ile beraber kapalı bir odada başbaşa bırakılarak yazılımcının kodu incelemesi istenir. Kapının dışından bir gözlemci kulağını kapıya dayar ve içeriden gelen "What The Fuck" ünlemlerini sayar. Elde edilen sonuç incelenen kod kalitesi açısından oldukça belirleyicidir :)

2 yorum:

Unknown dedi ki...

Süper makele olmuş Muammer :)

Yalnız ben Client-Centric, Server-Centric farkını tam anlıyamadım. GWT harbi client-centric mi oluyor diğer ajax frameworklerinde farklı olarak ?

Devamını bekliyoz...

Muammer Yücel dedi ki...

Teşekkürler Murat Can. Sorduğun soruya gelince, basitçe şöyle açıklayabiliriz: Öncelikle ilgilendiğimiz konu MVC'nin V'si. Yani view katmanı. Client-centric mevzu bahis olduğunda amaç uygulamayı kullanıcının makinasında çalıştırmak. Konu web tabanlı uygulamalar olduğuna göre kullanıcı ile uygulama arasında bir web tarayıcısı var. Apleti mapleti bir kenara bırakırsak web tarayıcı ya html'den anlar ya da javascript benzeri script dillerinden. Durağan bir içerikten bahsetsek html tamamdır. Ama yapmak istediğimiz şey istemci tarafında atraksiyonlar yapmak. Şimdi sana diyorum ki uygulamayı javascript ile yazalım, sunucu tarafı servislere de RPC ile erişelim. Servis bize veriyi serialize edip göndersin, biz bunu yazdığımız javascript kodu ile işleyelim. Sen de diyorsun ki ben javayı severim, javascript'ten nefret ederim. Ben de diyorum ki o zaman sen java yaz, ben uygulamayı devreye almadan önce onu javascripte çevirim. Böylece GWT ortaya çıkıyor. Yani yazdığın java kodu deployment öncesi optimize edilmiş javascript'e çevriliyor. Yani her şey istemci tarafında. JSF'de böyle bir şey yok. İstemci tarafındaki bileşen yapısının sunucu tarafında da bir eşleniği var. İstemci tarafına render edilmiş HTML gidiyor. Wicket'ta her şey bileşen ve bileşenin bir HTML tarafı, bir de java tarafı var. Bunlar eşlenik halde. İstemci tarafı HTML içerisinde wicketId'lerle belirtilen span tagleri uygun bileşenin render edilmiş HTML'si ile dolduruluyor. Ortada JSF'de olduğu gibi özel tag kütüphaneleri yok. Süper bişey yani. ZK'da ise istemci tarafı zul dosyalarından JSF'deki mantıkla HTML render edilmesiye yapılıyor. AJAX çağrıları da sunucu tarafında asenkron update engine tarafından karşılanıyor. Burada da istemci tarafının sunucu tarafında eşlenik bir bileşen ağacı var. Adamların getirdiği yenilik ise bu mevcut yöntemin yanısıra istemci odaklı olarak da uygulama geliştirebilme yeteneği. Umarım açıklayıcı olmuştur. Sürç-ü lisan ettiysek affola.