Açıklama: Yazılımcılara Tavsiyeler başlıklı yazı dizimizde Türkiye internet sektörünün tecrübeli yazılım geliştiricilerini teker teker Webrazzi.com’da konuk edip, kendilerinden genç yazılım geliştiricilere olan tavsiyelerini ve tecrübelerini dinliyoruz.
Konuk yazarımız Armağan Amcalar, Startup Kitchen'in baş yazılım mimarı. Kendisi, Startup Kitchen ailesi içerisinde onlarca projenin mimari tasarımı ve yazılım geliştirmesinden sorumlu.
Node.js, dünyayı kasıp kavuran startup akımının en "cool" çocuklarından biri. Adını duymayan geliştirici varsa hemen şöyle alalım. Node.js ile ilgili temel bilgilere Google ile sonsuz bir ölçekte ulaşabileceğiniz için, burada sizlere Node.js ile geçen 3 yılımızdaki edinimlerimizden kesitler aktarmak istiyorum.
Fakat daha önce, Node.js'yi büyük ölçekli, "ciddi" projelerinde kullanmak isteyen geliştiricilerin kafasındaki soru işaretlerini hemen sileyim; evet Node.js performanslı, evet sürdürülebilir kod yazabilirsiniz, evet debug edebilirsiniz ve evet, bir sonraki büyük işinizi Node.js üzerine kurabilirsiniz.
Şimdi gelelim Node.js'nin güzelliklerine;
Tek dil
Eğer projenizin bir önyüzü olacaksa, JavaScript kullanmaktan kaçınmanız mümkün değil. Bu durumda arkayüzde farklı bir dil kullandığınızda geliştiricilerinizin birbirinin işini yapması pek kolay değil. Node.js ile bütün ürününüzü tek dil ile çıkaracağınız için geliştiriciler arası uyum, anlayış ve işbirliği en üst seviyede oluyor. Hatta bunu bir sonraki aşamada önyüz ve arkayüz arasında kod paylaşımı yaparak da pekiştirebiliyorsunuz. Yani, bir tarafta yazdığınız kodu belki ufak bir değişiklikle, belki de doğrudan diğer tarafta da kullanabilirsiniz.
Örneğin, Google Closure Library bir önyüz kütüphanesi olmasına rağmen, nclosure modülü ile arkayüzde de kullanılabiliyor. Underscore.js gibi kütüphaneler yine aynı şekilde hem önyüzde hem de arkayüzde kullanılabiliyor.
Bu tarz kütüphaneler dışında siz de benzer bir şekilde, örneğin model katmanınızı paylaşabilirsiniz. Bu yazıda, önyüzde kullandığınız Backbone.js modellerinizi Node.js'de nasıl tekrar-kullanacağınız anlatılmış.
Asenkron mimari
Asenkron mimari günümüz uygulamaları için oldukça uygun. JavaScript'in olay güdümlü (event-driven), asenkron yapısı ise bunu oldukça kolaylaştırıyor. Veritabanı, başka bir web servise erişim vb. konularda, buralardan cevap gelene kadar beklemek yerine yeni istekleri hazırlayabilirsiniz. Bu, sunucu kaynaklarını son derece etkin kullanmanıza imkan tanıyor. Tek iş parçacığı (thread) ile aynı anda yüzlerce müşteriye hizmet verebilirsiniz. Bu şekilde günlük milyonlarca isteği bir tek sunucu ile karşılamanız mümkün. Burada belirtmek gerekir ki, performans testi konusu toplulukta çok gözde bir konu ve Node.js ile yeni tanışıp henüz tam olarak ne yaptığını anlamayan herkeste "vay, çok performanslı!" algısı oluşuyor.
Sonuç olarak buradaki gibi yazılar ortaya çıkıyor. Bu yazı zamanında epey büyük bir infial yaratmıştı ve hemen ardından buradaki yazı ile eksiklikleri gösterilmişti.
Asenkron I/O ve olay güdümlü mimari şüphesiz Node.js'ye özgü değil. Hatta ilk keşfeden Node.js bile değil. Fakat JavaScript'in bu yapıya olan uyumluluğu, tarayıcıda yazılan bütün kodların bu şekilde çalışması yüzünden edinilen alışkanlıklar, Node.js'nin bu yapıyı out-of-the-box desteklemesi ve bütün açık kaynaklı Node.js kütüphanelerinin bu paradigma etrafına kurulmuş olması olayı sadece "performans" karşılaştırması ile açıklayamayacağımızı gösteriyor. Benzer yapıda, PHP için ReactPHP ve Python için Twisted gibi alternatifler mevcut. Fakat, bu dillerin doğal olarak desteklemediği bir paradigma ile kod yazmak zorunda kalmak ve daha sonra kullanmak istediğiniz kütüphanelerin hepsi senkron olduğu için çileden çıkmak işten bile değil.
Günümüzde Go dili de asenkron I/O ile işlediği için bu tarz uygulamalarda oldukça tercih ediliyor. Fakat Go yepyeni bir dil ve yine alışmanız gereken farklı paradigmalar demek.
Modülerlik
Node.js çok modüler bir mimari üzerine kurulu ve modülerlik temel felsefesini oluşturuyor. Her türlü ihtiyacınız için topluluktaki geliştiriciler tarafından hazırlanmış onlarca modül mevcut. Böylelikle, devlerin omuzlarında yükselmek çok kolaylaşıyor.
Bunun iki önemli ayağı var; birincisi npm adı verilen paket yöneticisi. Node.js topluluğu önceki dillerin paket yönetimi konusundaki eksiklerini çok iyi analiz edip, çok başarılı bir paket yöneticisi ortaya çıkarmışlar. Projenizin bağımlılıklarını, ve onların bağımlılıkları arasındaki çakışmaları yönetme biçimi hataya izin vermeden her projeye özgü hareket edebilmenizi sağlıyor.
İkincisi ise çok aktif bir topluluk. Node.js topluluğu gerek kütüphaneler bazında gerekse soru/cevaplar konusunda çok hareketli. Kütüphaneler çok katılımcı ile çok hızlı geliştiriliyor. Olmazsa olmaz kütüphaneleri az sonra paylaşacağım.
MongoDB uyumluluğu
MongoDB ile ilişkisinin üst seviyede olması Node.js'nin birbaşka avantajı. NoSQL veritabanlarının en ünlüsü MongoDB de JavaScript tabanlı olduğu için üretkenliğiniz yine artıyor. MongoDB'de verileri JSON formatında saklayabilmeniz, veritabanından önyüze şekil değişikliği yapmadan iletebilmeniz işleri oldukça kolaylaştırıyor. Aynı şekilde sorgu dili de JSON tabanlı olduğu için güvenlik açısından çeşitli problemler barındırsa ve dikkatli kullanılması gerekse de, önyüzden direkt olarak veritabanını sorgulayabilmenizi sağlıyor. MongoDB, sizin projeniz için doğru araç olmayabilir (bkz. ACID uyumluluğu). Fakat hızlı prototipleme için geliştirici verimliliği düşünüldüğünde Node.js ve MongoDB ile optimum bir çözüm elde edebilirsiniz.
Durumlu uygulamalar
HTTP durumsuz (stateless) bir protokol olmasına rağmen aslında geliştirilen uygulamalar bu şekilde çalışmak zorunda değil. Her istek için açılış (bootstrap) aşamasında yeni veritabanı bağlantısı kurmak için harcadığınız süre ve kaynakları düşündüğünüzde, Node.js'nin durumlu (stateful) mimarisinin ne kadar işe yarayacağını tahmin edebilirsiniz. Bu bağlantıları bir kere açar, bütün açılış aşamalarını bir kere geçirir, her istekte tekrar yapmaktan kurtulursunuz.
Örneğin projeniz için Facebook'un sağ panelindeki gibi bir aktivite akışı yapmak istiyorsunuz. Sayfanız her yüklendiğinde veritabanından aktiviteleri çekmek imkansız! Bu yükü kaldıramazsınız. Geleneksel önbellekleme yöntemleri kullanabilirsiniz (bkz. Memcache). Ya da Node.js'nin sağladığı durumlu yapı ile buna bile ihtiyacınız kalmaz.
Yapacağınız şey basit: Aktivite oldukça, bunu genel bir dizi değişkenine ekleyin. Sonrasında gelen akış isteklerine bu değişkeni dönmeniz yeterli. Bu yazı için hazırladığım bir örneğini burada bulabilirsiniz. Bu tabii ki çok ilkel bir örnek fakat fikir vermesi için uygun buldum. Express’i anlamakla uğraşmadan, meselenin özünü bu dosyada görebilirsiniz. Evet, gerçekten çalışıyor.
Gerçek zamanlı uygulamalar
Socket.io gibi kütüphaneler sayesinde WebSockets teknolojisini kullanabilir, gerçek zamanlı web uygulamalarını kolaylıkla inşa edebilir, müşterilerinize çok üstün deneyimler sağlayabilirsiniz. Özellikle bir önceki başlıkta belirttiğim yapı ile birleştirildiğinde hem müthiş bir performans hem de çok kolay bir geliştirme ile karşı karşıya olacaksınız. Bu yapı sayesinde kaynak tüketimi bakımından çok ucuza çok değerli deneyimler yaratabilirsiniz.
Uygulamanızı gerçek zamanlı gibi göstermek için "polling" yöntemi ile her bir iki saniyede bir arkayüze istek gönderen bir yapı kullanmak yerine, WebSockets kullanarak tarayıcı ve sunucu arasında iki yönlü bir iletişimi tercih edebilirsiniz. Polling yöntemindeki en büyük problem güncelleme olmadığı durumdaki gereksiz sunucu kaynağı israfıyken, Socket.io uygulamaları ile bütün bu olumsuzluklar geçmişte kalıyor.
Startup Kitchen olarak 3 yıldır bütün projelerimizi Node.js üzerine kuruyoruz. Emekleme adımlarından itibaren takip ettiğimiz bu teknoloji sayesinde hem gerçek zamanlı deneyimler tasarlayabildik, hem sunucu maliyetlerimizi azaltabildik, hem de projelerimizde isteklere verdiğimiz cevapların sürelerini kısaltabildik. Ayrıca yaz kamplarımızda sadece JavaScript üzerine yoğunlaşarak öğrencilerimize bir projeyi baştan sona geliştirebilmeleri için gerekli bütün altyapıyı daha kolay bir şekilde verebildik.
Son olarak Node.js ile ilgili olmazsa olmaz paketlerden ve araçlardan bahsetmeliyim. Bunun için Startup Kitchen’da geliştirdiğimiz, Node.js tabanlı bir uygulama olan line.do ile aşağıdaki sunumu hazırladım. Sunuma buradan da ulaşabilirsiniz.
Node.js ile ilgili aktaracak çok fazla şey var fakat henüz yüzeyini bile çizemedik. Merak ettikleriniz için bana twitter’da @aamcalar olarak ya da e-posta yoluyla [email protected] adresinden ulaşabilirsiniz. Ayrıca Facebook'taki JavaScript TR grubunda da dilediğiniz konuları tartışabiliriz.