Size verebileceğim en büyük tavsiye, bir dili öğrenmeye başlamadan önce bu dil nedir, platform mimarisi nedir, tarihi nedir, hangi paradigmaları takip ediyor, kaput altında neler dönüyor bunları öğrenmeniz. Yukarıda Node.js'den bahsedilmiş. Mesela Node.js backend bir Javascript runtime'ı olmasına karşın bir çok dile benzemez. Event-driven bir mimari izler. Çünkü native olarak 3-5 modülde bulunan birkaç method harici her şey asenkron çalışır. Kodun belli bir başlangıç veya bitiş noktası yoktur. Yazan kişi neyin ne zaman olacağını bilemez. Yaptığınız her işlem event loopda bir kuyruğa girer ve işi bittiği zaman da belirlediğiniz callback çağrılır. Event loop kuyrukta bir şey olmadığı vakit ise idle durumda bekler. Javascript kodunuz single thread olarak çalışır genelde ama native modüller işletim sisteminin kendi async interfacelerini kullanamadığı zaman bir Thread Pool oluşturur. Yani C++ ile yazılmış kısımda yine birden fazla thread var ki bu da yanlış bir işlem yaptığınız zaman tüm event loop kitlenmesin diye olur. Buna örnek olarak işletim sistemi kernelleri de event-driven bir paradigma takip eder. Bir mouse driverini örnek verecek olursak mousedan gelen clickleri dinleyen bir listener (cb) vardır. Diğer diller gibi siz butona bastığınızda işlem bloklanmaz, devam eder. Node.js o yüzden throughput ve I/O işlemlerin ağırlıkta olduğu yerlerde kullanılır. CPU'ya yüklenen işlemlerde tavsiye edilmez çünkü işlem event loopda ne kadar süre alıyorsa, diğer işler o kadar bekleyecek demektir.
Diğer dillerde ise, Golang yahut Java fark etmez, bunlarda bir event loop yoktur; structured bir paradigmayı takip ederler. Kod üstten başlar ve bloklaya bloklaya en aşağıya kadar gelir. Peki concurrency nasıl sağlanıyor? Threadler ile. İstediğin zaman bir thread spawnlayabiliyorsun ve CPU çekirdeklerini tamamen utilize edebiliyorsun. Multithreading high-level Node.js de mümkün değil. High-levelden kastım Javascript yazdığın kısım. Core'da zaten modüller C++ ile yazılıyor ve threading gerektiği yerde libuv isimli bir library kullanılıyor. Vanilla taraflı yazmayı herkes yapamayacağına göre burada en yakın çözüm yeni process fork edip, event loop sayısını arttırmak böylelikle de maksimum sayıda CPU'dan yararlanmak. Bu iş sistem kaynağı açısından thread oluşturmak kadar ucuz olmuyor.
Burada anlatmak istediğim şey her amaç için her dil uygun olamayabiliyor. Node.js kullanacaksanız eğer, CPU-bound işi bir message queue'ya yollayıp daha uygun bir dil ile yazılmış bir program ile işlemek.