Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Serious question, why has nodejs become so ubiquitous in big companies (netflix, linkedin, walmart, trello, uber, paypal, medium, ebay, groupon, NASA) ?

Is it because is the most practical option? like, there are no fast runtimes for dynamically-typed(for fast iteration) languages that also have big ecosystems and is well sponsored?

Fast - rules out Python and Ruby.

Dynamic - rules out Java, Scala and Go?

Clojure - to awkward for most companies, small ecosystem but can call Java, JS.

Lua - to niche.

If you need to write a backend(frontend?) for a SPA with SSR(or no SSR) or WebApp why would chose something else besides nodejs (ignoring familiarity with other lang and hating on JS)?



There's probably a pot of contributing factors, but I want to point out two, as an old-fashioned c/c++ turned Java developer who moved to node and typescript.

Typescript is fun. Java's type system is super unfun, with its interface-based approach to nominative typing. Of course, it has gotten better (I remember before generics, all the data structures had to have ridiculous cast statements to get stuff out). Type inference and structural are rad.

Also, the javascript runtime basically has cooperative parallelism, which makes concurrency way easier to reason about. I love this fact. I think golang is going to eventually beat out node (or node will make a seismic shift in a multithreaded direction) for just this reason. Goroutines are a really good parallelism story. I don't have as much fun in go (I admit, this is a personal and ineffable metric) but it does seem to perform really well in a web socket sort of situation.


  Dynamically-typed(for fast iteration)
Such a popular mis-association. Once you get familiar with a good type system, you will be more productive. People are fooled by Java-- type inference cuts over half the pain.

NodeJS rose to popularity because it was a gateway into non-PHP backends for your typical frontend dev.


"Dynamically-typed" often leads to "hard to refactor", which in turn slows down your iterations at a certain (surprisingly low) amount of code. This may still be less annoying than Java (especially before 1.8), but:

Have you ever refactored code in OCaml? (or SML, or Haskell, for that matter) This is a breeze! It's mostly the ecosystem that drives me to Python and/or JavaScript.


Haskell with Aeson and Lens starts to approach convenience when dealing with deep JSON structures, but it's still kind of messy and arcane compared to JavaScript—in my opinion as a Haskell coder since 2004 who went to Chalmers, studied advanced functional programming, learned Agda, and works with Haskell full time.

After years of learning I'm quite proficient with Haskell, and of course I recognize its enormous benefits, but I still totally understand the choice to use Node rather than Haskell, just like I also understand the choice to use bash for a lot of things!

I think Haskell is a transition language that will be replaced soon enough, because its warts and deficiencies significantly hinder learning and adoption.

TypeScript is probably a way more pragmatic choice for most people who want the majority of the benefits of a static type system.


> I think Haskell is a transition language that will be replaced soon enough

What do you have in mind when you say that?

One of the existing contenders? (SML, OCaml, Rust, Elm)

Or something completely different?


SML 2.0 is the best candidate IMO.

Rust isn't a competitor as it's too close to metal and too verbose (great for those kinds of things, but not for everything).

Elm has nice libraries (though not even all the the standardized web APIs are supported yet). It also gets rid of Haskell's lazy evaluation, so reasoning is easier. It doesn't have type classes though (and misses many advanced features). The side effect question isn't great either IMO (I believe side effects are necessary for real-world code).

SML would benefit from a little more syntax (borrow a couple good ideas from Ocaml), but is very simple to learn and despite the simplicity, has an amazingly powerful type system. While it could gain some benefit from type classes, at least it isn't lazy, allows side effects, and is immutable by default (but allows mutation if you need).

It doesn't have classes like Ocaml or F#, but I don't consider that to be a loss. It has sane operator rules (and overloading which is important for native-feeling APIs). SML is very fast (thank you mlton) and unlike Ocaml, doesn't have to lose all its performance when you need 32 or 64-bit integers for something. Unlike Ocaml, there are actually working multi-threading implementations like poly-ml (mlton has an experimental one like Ocaml). It's worth noting that because there is a standard, you don't have one implementation/company that defines the spec.

The big flaws of SML are adoption, libraries, and the need for some extra syntax (there is work on this that is ongoing). In the grand scheme of things, it's in a very good position for a language that isn't that popular.


Okay, that's premature speculation because I don't have anything concrete in mind!

It's just a premonition I have of Haskell getting more complex while still tied to backwards compatibility and suddenly there's a new kid in town.

Maybe it will be something like Elixir is to Erlang or Reason to O'Caml, like, reusing the GHC runtime and GHC Core but with a new syntax and standard library.


If you intentionally code JS with referential transparency in mind, then this type of refactoring is just as esay, if not easier.


Would you mind to elaborate? How does "having referential transparency in mind" protect against typical refactoring errors, such as an unexpected "undefined" value due to a typo in a field name?

(Of course you could argue that you don't need OCaml for that, as TypeScript or Flow can prevent this, too. But then the argument of using "dynamic" JavaScript instead of static types is moot.)


I am gladly switching back from a 'good type system' for web development. Why? For fast development and interactions.

Native types like int/string/float/etc in Java/C# help little, but are a lot more write. With dynamically typed languages one doesn't have to babysit such redundant things, and often there is therefore no need to refactor function declarations, etc. And with a proper IDE refactoring works great and is as easy as with a stactically typed language.


Nodejs is incredibly fast to prototype in... Performs well under load and scales well.

The simple fact is you can try new ideas out quickly and very easily in Nodejs and then even take the raw prototype into production with a simple re-factor.


I highly doubt people programming in other languages make more on avg. than same level eng. in Netflix or Linkedin programming in JS/Node.


Cheaper developers, anyone doing webpages can be hired for doing server stuff and easily replaceable, the dream of most enterprise shops.


I see. Web pages are easy. Programming is hard, but we can fix that simply by putting programs in web pages. Then we take that same syntax out of the web page and put it elsewhere, so that all programming is easy.

I don't think it works that way.


I understand your point. I started out as an embedded systems C developer. There are actually huge parallels between embedded work and nodejs.

One of the reasons is you can forget about all that nasty race condition stuff you get with threading in most high level languages. There are also no pointers or direct memory manipulation. Nodejs is pretty much asynchronous by design.

I think it really is harder to “shoot yourself in the foot” than using the oldguard method of developing backend systems.

Maybe this partly explains why it is at least plausible.


Moot point tbf, Java developers are a dime a dozen too, it's something they learn in school. JS wasn't taught yet back in my day.

The JS ecosystem does seem a lot more approachable though, you can just click through an installer and run a copy / past example, instead of a custom Java installer, IDE, configuration, Maven, all that stuff.


- Lightweight

- Portable

- Cross-platform

- “Fast enough” out-of-the-box

- Massive ecosystem

- No need for an application container

- Actively developed and maintained

- Supports procedural, object-oriented, and functional styles equally

- Non-proprietary programming language


Really hard to understate the "Massive ecosystem" aspect for Node.

It's the reason why Node was at the forefront for this new wave of client-centric graph query systems (GraphQL, Falcor) that is well on its path to displacing REST as the go-to model for client-server communication.


It's nice to have people able to work on both backend and front-end. I think that's really the reason Node exists. Being able to fix anything within the stack makes you more agile than waiting for X team to do it for you. So it saves you time and possibly money as well(i.e expertise is easier to build). Now Node comes with all the JS issues so that's the tradeoff.


I think that the development speed was a huge factor, it was probably easier to get a good-enough node system up in 3 months than a similar system in java.


I don't know of any mainstream language where 3 months is too short to do something fairly large.

I do agree with your point, but I'd say "1 day" instead of 3 months. After enough time elapses, JS quirks and lack of typing become a net time loss, compared to (for example) C#.


Really any developer that really wants to work on the backend should be able to pick up another language.

End of the day it's just syntax, framework weirdness (js devs should be used to crazy language contortions), and data structures for ~80% of day to day work.

Node just made the transition easier.


According to google trends [1]. Golang seems more popular than nodejs.

1: https://trends.google.com/trends/explore?date=all&q=Node.js,...


Different search terms give different trends: https://trends.google.com/trends/explore?date=all&q=node%20j...


I only search for 'node' not 'node.js'



I asked this question to a CEO who pushed hard for nodejs. His answer was that the growth curve of the quantity of modules on npm was steep.


I'm not an expert but finding good javascript developers is easier than other languages. Since javascript has lot of hypes lately, people started to move javascript.

And, in my opinion nodejs is really good for quick & lightweight solutions.


Is it really? I thought that there were many more experienced java and c# devs and not that many with node experience.


IMHO, one of the biggest barriers right now for developers is getting "pigeonholed" in the hiring process by hiring managers and recruiters into thinking that programming skills in one language don't translate to others. The automated filtering of resumes/applications only makes the issue worse.

I think my reply to your comment would have to be something like:

  * it depends what type of project experience is required (desktop app, mobile app, web server, embedded device, etc)
  * it depends where the job is
  * it depends what sector you are talking about (governments tend to choose Microsoft languages more than startups)
  * it depends what age range of applicants is expected (I'd wager Java has is a decent bias towards older programmers who probably wouldn't get hired at most companies I've interviewed at)


How many new businesses are built around Java or C#?


People thought that frontend skills transfer to the backend if you only use the same language (And sadly they did).


Elixir?




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: