• ogrenmek isteyen icin onerilerimin oldugu bir javascript calisma zamani ortamidir.

    1. oncelikle node.js icin kullanilan dil javascript dir. javascript temelde browserlarda calismasi ve web uygulama gelistirmek icin tasarlanmis bir dildi. ama bu node.js ile birlikte degisti, javascript artik server tarafindan da calisiyor. bu nedenle node.js ogrenmeden once javascript ogrenilmesi gerekir.

    2. javascript alt uniteleri taninmalidir. javascript browser tarafinda 3 farkli parcaya ayrilir, ecmascript, dom(document object model) ve bom(browser object model). dil olarak javascriptden bahsederken genelde ecmascript i kastederiz. ecmascript javascript de yazilan her bir kod parcasinin nasil yorumlanacagini belirleyen bir standarttir. dom ise bir web sitesi uzerinde yazdigimiz dokuman objelerinin javascript deki modellemesidir. ornegin bu sitedeki sol frame bir dokuman objesidir. bom ise browserdaki objelerin modellemesidir. ornegin borwsera yazdigimiz web sitesi adresi bir bom objesidir, ya da browser penceresi. daha sonra node.js temel parcalari taninmasinda yarar vardir. yine ecmascript, ama bunun yaninda libuv ve google v8 konusunda temeli bilmek, neyin ne ise yaradigini bilmek yararlidir.

    3. daha sonra javascript dilinin temel dil kaliplarini ogrenilmesi gerekir, bunlar klasik her dilde olan degiskenler, donguler, karar yapilari, diziler, objeler.

    4. daha sonra javascripte ozel dil yapilari ogrenilmelidir. bunlardan en onemlileri sunlardir; prototype nedir, inheritance nasil yapilir, closure nedir, object composition nedir.

    5. javascript temelleri ogrendikten sonra yeni nesil javascript yani ecmascript6 ve 7 versiyonlarina giris yapilmalidir. bu konu genelde giris yapan kisileri en cok zorlayan konu cunku genelde ogrenme suresinde neyin ecmascript6 (es6), neyin ise ecmascript5(es5) ve oncesi oldugunu ayirmak guc olabiliyor. bunun icin bol bol dokumantasyona basvurmak gerekebiliyor. es6 ile ilgili temel konular ise yeni degisken yapilari (let, const), arrow functions, default parameters, spread operator, string interpolation, destructuring, class, getter setter, iterators, generators.

    6. daha sonra javascript higher order functions lar cok onemlidir.

    7. bundan sonra node.js tarafinda cokca lazim olan ve artik cok onemli hale gelmis asenkron programlama ile ilgili kisimlar yani promise, async/await ogrenilmeli. bu ogrenilmeden node.js tarafinda ciddi problem yasanir cunku neredeyse her sey buna bagli. event loop nedir, nasil calisir, asenkron javascript kodu nasil yorumlanir ogrenilmeli. kodumuza bir is yaptirirken paralel olrak bir baska isleri de yaptirmamiza asenkron programlama diyebiliriz. ornegin kodumuz kendine ait isleri yaparken bir tarftan da arka planda su dosyadan bu veriyi oku, ya da bu web sitesinden bu veriyi bekle diyebiliriz. ama ornegin daha once veri okuma islemi bittiginde, ya da web sitesinden beklenen veri geldiginde "callback" fonksiyon denilen fonksiyonlar yazardik. bu callback fonksiyonlar o kadar cok artti ve karmasik hale geldik kii "callback hell" denilen karmasa oldu. iste bunun cozumu daha sonra "promise" kullanmak oldu. promisler de o kadar cok artti ve karmasik hale geldik "promise hell" oldu. daha sonra neyse ki async/await yapisi geldi. bu yapilarin ogrenilmesi asenkron programlamanin temelidir.

    8. bundan sonra artik node.js tarafinda daha derinden girilebilir. en onemli arac npm yani node package manager dir. bununla beraber temel node uygulamasinin yapisi ogrenilmeli. package.json nedir ve hangi konfigurasyonlar yapilir ogrenilmeli. node.js konusunda bir uygulamanin en onemli temeli budur.

    9. daha sonra node.js de paketlerin kullanilmasi ogrenilmeli. require, ve import nasil kullanilir, hangi versiyonda require, hangi versiyonda import kullanilir ogrenilmeli.

    10. bu asamada artik bu isin en temeli ogrenilmis olur, bundan sonrasi tamamen node.js paketlerinin ogrenilmesidir. yani artik duzluge cikilmistir. tum paketler nerdeyse standart sekilde calisir ve dokumantasyona bakarak gelistirme yapilabilir. duruma ihtiyaca gore istenilen paket ogrenilir ve kullanilir. ornegin dosya sistemi islemi yapilacaktir node.js dokumantasyonunda gerekli sayfaya gidilir https://nodejs.org/api/fs.html ve dokumantasyona gore ogrenme ve gelistirme yapilabilir. ya da httpsislemleri yapilacaktir buraya https://nodejs.org/api/https.html gidilir ogrenilir ve yapilir. bu konuda node.js cok genis ve anlasilir dokumantasyona sahiptir.

    11. daha sonra da npm veya github dan cesitli node.js paketlerinin kesfedilmesi, ogrenilmesine baglidir. o kadar cok paket var ki hepsini ogrenmek guc, ama ihtiyaca gore her gun yeni bir paket kesfedilir.
  • 1 senedir geliştirdiğimiz bütün projelerin****** altında koşandır. mutlu edendir. başlarda event loop kaynaklı scale sorunları canımızı yaksa da hakim hale geldikçe bu sorunları da tarihe karışandır.

    vazgeçemediğimiz node.js araçları şurada: https://line.do/…mez-nodejs-araclari/1jn/horizontal
  • ufak projelerde çok tatlı gider. sevimli gelir.

    büyük bir projede ya da büyük çaplı bir code base üzerinde çalışmaya başladığınızda ise bütün gün söver durursunuz.

    uzun vadede eksileri şöyle sıralanabilir:

    - hemen her yeni dosyada onlarca farklı dosya require etmek gerekiyor. ortalık relative path'lerden geçilmez hâle geliyor. (diğer dillerde daha temiz ve hoş duran çözümler var)
    - callback'ler ne kadar dikkatli olursanız olun eninde sonunda başınızı ağrıtıyor. tek çaresi promise kullanmak ya da callback'leri düzgünce handle edebilmek için yazılmış kütüphanelerden birini kullanmak. bu kulağı kafanın arkasından dolaştırıp tutmak gibi bir şey, ister istemez complexity artırıyor.
    - memory leak durumunda sıkıntıyı bulup çözmek çok zor.
    - javascript'in server taraflı bir dil olmak için yazılmadığı aşikar, server tarafında sürekli kullandığınızda bir şeylerin yerine oturmadığını hisediyorsunuz.
    - sürekli değişen context'i takip etmek gerek, this'in habire global objeyi işaret etmesi zaten javascript'in en saçma tarafı, server tarafında bu daha da belirgin bir hâl alıyor.(böyle saçma bir şeyi çözmeye efor harcamak çok gereksiz)
    - nodejs kodunu debug etmek diğer dillere göre çok zor.
    - en basit şeyler için bile modül yüklemek gerektiği için bir süre sonra 100'lü sayılara ulaştığında bağımlılıkları yönetmek çok zorlaşıyor.
    - bütün bu sebepler birleşince kodun bakımı gittikçe daha da zorlaşıyor.

    bu arada bütün bu listedekiler, javascript'in adeta götünü toplayan coffeescript ile yazılmış bir code base içindir. javascript'in pek çok çirkin yanı coffeescript ile örtülmüş olduğundan bu listede yer almadılar. yani javascript'in bütün o gereksiz function vb. keyword'leri ve parantezlerden arınmış (mesela "function(){}" yerine "->"), neredeyse yarısı kadar yer kaplayan bir koddan bahsediyorum. coffeescript ve benzeri javascript compiler'ları yine bir dereceye kadar kurtarıyor. düz javascript'le büyük projeye girmek kesinlikle akıl kârı değil.

    kısacası büyük projede kullanmayın üzülürsünüz. ben de çok severdim kendisini zamanında, hatta javascript aşığı adamdım, lakin gördüm ki sevgi karın doyurmuyor (imiş).

    son zamanlarda kendisine olan antipatim nefret seviyesine doğru gidiyor. 3-4 kişi toplanıp saatlerce nerede memory leak olabilir, acaba bu sefer neden "rangeerror: maximum call stack size exceeded" hatası aldık diye düşünüp çözüm bulmaya çalışıyoruz yahu. üzerinde çalıştığımız ürünün bir milyon kullanıcısı var. ve bu neredeyse düzenli olarak gerçekleşen bir durum.

    zamanın ötesinden edit: bu entry'inin üzerinden geçen senelerde node.js'in bahsi geçen çoğu sorunlara çeşitli çözümler üretmiş olduğunu ve kendini toparlamayı başardığını düşünmekteyim.
  • en büyük sıkıntısı internetin outdated dökümanlarla dolu olması. hadi bi bakayım neymiş ne değilmiş diye bi başladım, bi tane step by step tutorial buldum, tutorial'de geçen, node, express, expresso, mongodb, mongoose, jade vs hepsinin yeni sürümü çıkmış, hepsinde ciddi değişiklikler yapılmış, dolayısıyla tutorial da bulunan örnek kodlar çalışmıyor. zaten hepsini yeni yeni öğreneceğin teknolojilerden öğrenmeden soğumuş oluyorsun. o açıdan sıkıntılı, 2. günümde canım sıkılmaya başladı kendisinden.
  • frontendcilere backend kodu yazdıran şirketlerin projelerinin hızlı bir şekilde batmasına kolaylık sağlayacak olan framework. o paraları backendcilere boşuna vermiyorlar.*
  • tükiyenin matematik ortalaması 3 doğru falan. kimler yazabiliyor bu dilleri ben anlamıyorum:/
  • son zamanlarda populer olmasinin birkac zincirleme nedeninin oldugu bir javascript "runtime" dir.

    oncelikle hayatimiza bulut sistemler girdi. yani atik kendi sunucumuzu tutmuyoruz,
    ve kodlarimizi da tek bir sunucuda barindirmiyoruz. aws, google cloud platform, microsoft azure gibi kendi iclerinde de bircok alt sisteme ayrilan bircok bulut sunucuda kodlar barindiriliyor. ornegin agir matematik islemleri iceren kodlar bu konuda guclu olan sistemlerde (aws lambda), ya da veriler buyuk kapasitesi olan sistemlerde (s3) ya da fotograf tanima ile ilgili kodlar o konuda ozel makina ogrenmesi iceren sistemlerde (aws rekognition) calismasi icin dagitiliyor.

    dolayisi ile kendi projelerimizi de bu tarz sistemlere ozel tasarlamamiz gerekiyor. eskiden tum sistem ayni makinada oldugu icin katmanli mimari kullanirken artik microservice mimarisi ile kodlar yaziliyor. her bir microservice birbirinden buyuk oranda bagimsiz ama birbiri ile haberlesebilir sekilde tasarlaniyor.

    bu ayni zamanda "serverless" sekilde kodlarin barindirilip calistirilmasini sagliyor. yani bu kodlar bir is icin bu bulut sistemlerde calisip isini bitirdikten sonra her seyi unuttuklari, fonksiyonlarin birbirlerini tetikledikleri bir sistemi olusturuyor.

    tum bu mimari yapi nedeniyle artik daha esnek ve farkli diller ve teknolojiler bir arada kullanilarak kodlar yazilabiliyor. ornegin ayni sistemin arkasinda api kismi node.js, business logic tarafi java, yapay zeka tarafi python, fotograf isleme c++ ile yazilabiliyor. hangi dilin secilecegi de prototip gelistirme hizi, ekip yetenekleri, esneklik, scalability gibi kriterlere gore karar veriliyor.

    bu sartlar altinda da ozellikle api tarafinda node.js ve javascript one cikiyor. cunku prototip gelistirme hizi acisindan javascript cok iyi, ekip yetenekleri acisindan front-end back-end ayrimi olmadan tum herkes full-stack yazabiliyor. serverless icin dilin fonksiyonel programlamayi destekleyen stateless ozellikleri avantaj. esneklik ve scalability acisindan da bircok avantaj barindiriyor. bunlarla ilgili detayli bilgi icin buraya https://hackernoon.com/…-using-node-js-22074e13caad bakilabilir

    yani bu teknolojinin dogusu da populer hale gelmesi de bir zincirleme etkinin sonucunda gerceklesti.
  • yazılımla ilgili başlıklarda diğer yazılımcılara durmaksızın bok atan, "şunu yapamayan siktirsin gitsin", "bunu yapamayan kendine developer'ım demesin" dışında cümle kuramayan trollerin başlığı altında entry sıçtığı efsane.
  • server tarafinda javascript calistirmak icin kullanilan bir "runtime environment"(calisma zamani ortami)dir. yillardir java ve object oriented konularinda front-end gelistirici olarak calisan biri olarak degerlendirdigimde cok ciddi gelistirme avantajlarini barindirir. bir front-end gelistirici olarak benim bir gelistirme projesinde en onem verdigim kriterler;

    -performans
    -basitlik ve gelistirme zamanindaki verimlilik
    -"modularity" ve tekrar kullanilabilirlik
    -"scalability" ve genisleyebilirlik
    -test yazma kolayligi

    elbette farkli proje tipleri icin, farkli ortamlar icin veya farkli gelistiriciler icin bu kriterler farkli olacaktir ama musteri isteklerinin bitmedigi dolayisi ile degisimin kacinilmaz oldugu, cok fazla "thread" (is parcacigi) nin ayni anda asenkron calistigi, icinde cok farkli ortamlar ve degiskenler barindiran web gelistirme icin bu kriterlerin cok onemi var. bu konuda yanlis bir secim sirketlerin batmasina veya cok buyuk zarar etmesine neden olabilir. ısin kotusu bu konuda yapilan yanlis secimler cok sinsidir, yani tespit edilmesi cok guctur. su anda almanyada calistigim sirkette bu kriteler konusunda yapilan yanlis degerlendirme sonucu 1 kisinin yapacagi isi 5 kisi yapmak zorunda kaliyor, ve bu 5 kat daha buyuk masraf, cok daha zor proje yonetimi demektir. en kotu tarafi da bu verimsizlik tespit edilse bile girilen bu yoldan donmek cok daha pahali oldugu icin mecbur ayni sekilde devam etmek zorunda.

    node.js teknolojisini bu kriterler bakimindan diger diller ile ozellikle alanim olan java ile karsilastirdigimda ne dusunuyorum. elbette bu dusunce nihai degil, mutlaka degisiklik gosterecektir ama temelinin ayni kalacagini dusunuyorum.

    performans: node.js konusunda degerlendirme yaparken gelistiricileri en cok aldatan konu bu oluyor genelde. javascript herkes tarafindan malum bu konuda cok iyi bir izlenime sahip degil. zaten ozellikle byte seviyesi daha dusuk islemler icin yeterli ozelliklere sahip degil. burdan yola cikarsak dosya ve database islemleri, yada yuksek matematik islemleri icin node.js javascript ile yazildigi icin yetersiz olacakmis gibi gozukse de isin asli astari oyle degil. ısin ozunde bu tarz islemleri node.js altinda javascript yapmamakta. bu tarz islemleri aslinda tamamen uzerinde oturdugu dil olan c ve c++ dilleri uzerinden yapar (bkz v8 ve libuv). hatta bu tarz islerde pek sorumluluk almaz, o nedenle performans degelendirmesi yaparken c ve c++ baz alindiginda diger bircok dil (java da dahil) geride kalacaktir. daha detayli bilgi icin paypal tarafindan yapilan java ve node.js testlerine goz gezdirilebilir. yani benim gibi java gelistiriciler ve ayrica c# gelistiricilere kotu bir haber, node.js (aslinda c/c++) dusuk seviye islerde daha hizli. golang ile karsilastirildiginda ise yine google tarafindan gelitirilen v8 ile golang dilini yani aslinda ozunde c/c++ karsilastirmasi yapmis oluyoruz. buda bize cok da ciddi bir fark yaratmayacaktir.

    basitlik: bu konuda "syntax" olarak basitlige cok deginmeyecegim cunku java ve c# gelistiricilerin node.js icindeki yeni nesil javascipt ec6 arasinda yabancilik cekecegini dusunmuyorum. gelistirme zamani konusunda ise javascript gelisitiriciye cok daha esnek bir ortam sagliyor, o nedenle proje cok buyuk olmadikca (bankacilik uygulamalari gibi) yuksek seviye web uygulamalari icin ciddi zaman kazandiriyor. cunku kullanilan tum methodlar sanki bir web gelistiricinin ihtiyaclari on plana alinmiscasina basitlestirilmis. ornegin bir dosyadan veri okunmak istendiginde javaya gore cok daha az kod ile ayni isi yapmak mumkun. bir web container acmak istedigimizde ise is o kadar basit ki, birkac kod satiri ve port tanimlamasi ile web container hazir. java icin bu cok daha kulfetli.

    modularity: gelistirme yaparken bircok programci gibi ben de sanki hep ayni isi yapiyormusum gibi geliyor, ki aslinda bu cok dogru cunku temelde hep ayni seyler. yazdigim bir kod baska bir yere uyumlu olmadigi icin bazen yeniden yazmam bazen de uyarlamam gerekiyor. bu konuda javascript ve node.js elimi guclendiriyor, cunku javascipt objeleri java objelerinin aksine cok daha basit objeler, aslen temelde "key-value pair". bu nedenle iyi yazilmis javascript kodunu ozellikle web projeleri icin cok daha esnek kullanmak daha kolay. java objeleri cok daha guclu isleri yapabildigi icin daha karmasik yapilari dogal olarak web alaninda modularity konusunda daha uyumsuz. java guc, javascript esneklik sagliyor.

    scalability: ıste burada node.js ve javascript acigini veriyor. scalability projenin omru uzadikca "backward compatibility" (geriye donuk uyumluluk) konusunda dilin, kutuphanenin, frameworkun onemi cok artiyor. bu konuda javascipt ve node.js gelistiriciyi cok uzuyor. bu gun kullandigin bir kod ilerde calismayan bir yigina donebilir, cunku o kadar hizli o kadar umursamadan gelisiyor ki yeni bir versiyondaki degisiklikleri ogrenmeye ve mevcut kodu uyarlamaya yetisilmiyor. bunun nedeni ise web alaninda hizli gelisme ve buna bagli dillerin de cok hizli gelisiyor olmasi etken. java bu konuda agir ama saglam adimlarla ilerliyor.

    test: node.js ve javascript icinde barindirdigi test arac gerecleri ile cok esnek bir ortam hazirliyor. testleri yazmak ve uyarlamak cogu zaman gercek kodu yazmaktan uzun suruyor, cunku web projelerine yani client-server uygulamalarinda ayrica "multi thread" asenkron uygulamalarda olasiliklar, karmasa ve hata olasiligi o kadar fazla ki. bu nedenle de javascript ve node.js web ihtiyacari icin bicilmis kaftan. ama bu konuda java test araclari (junit vs.) cok da zayif degil. tek buyuk sorun java derlenmesi gereken bir dil, o nedenle de her kod degisikliginde yeniden derleme yapmak bazen biktiriyor.

    ozetle benimle ayni kriterleri benimsiyorsaniz node.js konusuna ucundan girmenizi tavsiye ederim, bunu bir java gelistirici ve object oriented programlamaya inanan biri olarak soyluyorum. ama kriterler degistikce java ve c# gibi daha agirbasli diller, veya python, golang gibi icinde guc ve esnekligi beraber barindiran diller avantajli hale gelecektir. hersey ihtiyaclara gore degisir.
  • son aylarda aslında belki de tj 'in - aslında 5 kişi olduğuna dair rivayetler var - node.js den go 'ya geçiyorum ben ya adlı blog postundan beri sık sık aynı şey söyleniyor,

    "büyük projeler için dezavantaj"

    başlık altında production 'da node.js kullanan büyük firmaları listelemiş bir arkadaş, bunun yanında,
    koding gibi start-up ların yaptığı çok basit hatalar var.

    projeniz eğer 10 kloc üzerine çıkacaksa, kolay scale olması gereken ve 2+ kişilik bir takım tarafından kodlanacaksa yapılacaklar listesine uyduktan sonra yönetimi gayet basit.

    * linter şart, eslint ile aşk yaşıyoruz bir nevi.
    * mutlaka ama mutlaka bir kod style belirlenmeli ve tüm proje ekibi buna uymalı.
    * proje gereksinimlerine göre immutable.js / flow.js artı olabiliyor.
    * npm-shrinkwrap.json önemli, dependency management konusu bazen karman çorman olabiliyor.
    * dökümentasyon ve test konusu özellikle javascript static typing olmadığı içi asla ve asla ikinci plana atılmamalı.

    artı olarak, yeni projeye başlayacaksanız,

    * es6 'nın tüm nimetlerinden yararlanmak gerekiyor, bu yüzden babel şart.
hesabın var mı? giriş yap