I don't really have a dog in this fight, but I see node.js as being "disruptive":
* It's "not as good" as languages/environments like Erlang.
* But it's good enough, and significantly simpler, as an approach to tackle a certain class of problems. This, combined with widespread knowledge of Javascript, will probably make it fairly widely used.
I was waiting for the disruptive argument in this thread.
The fact of the matter is that Javascript is currently (and for the forseeable future) client side language that runs without a plugin. If you want your entire stack to run on Javascript, then server side programming is the only way.
Projects like CoffeeScript are the earmarks of disruptive technology - getting something that doesn't fit most peoples needs to grow up quickly, fit everyone's needs, and destroy its competition before the competition even realized it was there.
The disruption is not about whether the paradigm is old or new. The fact is - today if you are building a small app and need some form of real-time features, your best bet is Node.js. Right from etherpad lite to socket.io you have the tools you need to be up and running and to support a few thousand concurrent users out of the box.
Of course, scaling it past that will be a problem with Node being single threaded and so on - but I believe that these are problems that Node.js will eventually address.
Sure - Tcl has had an event loop since sometime in the 90ies, and you could always do stuff in C.
However, Node is written from head to toe to take advantage of that style of coding, whereas Tcl never had the assumption that everything had to be async, so many calls block. Same thing with Python and Ruby, except that they're relative latecomers to the embedded
"select loop" game (sure, modern systems have moved on from select, but it still conveys the idea).
Erlang has been around for a while, and does async beautifully, but for every person who knows Erlang there are 10,000 who know Javascript.
Node looks great for insanely high connection count / non blocking messaging apps but for nearly everything else it looks like a square peg in a round hole.
All the points that OP mentioned, whether they are correct or not, are irrelavent.
The only factor that drives technology success is the people, aka the community. There are a lot of people on board of nodejs. This just creates more gravity and pulls more people toward it. Together, the community will carry the momentum that drives its success. If v8 is not server technology like OP said, there are enough open source developers to make its on fork.
It seems to me like the author overly cares about languages, when the power of Node is the community and its simplicity of use - there's very little boilerplate even for complex things like network programming.
Who cares about the language. Use JS if you want, or use Scala. At the end of the day is the maintainability of the product you're developing that matters.
I feel, for example, that NPM is much easier and simpler to use than something like Maven. If it makes my life easier, I'll stick with it.
Amen - I quickly learnt node.js to build http handler for the callback element of a tool I am building using authority labs - for what we need its the dogs nuts.
Yeah; maybe if you're using it to build a Big Fancy Webapp it's actually a stupid idea, like if you use a Swiss Army Knife to do carpentry and build a home, you're probably doing it wrong.
I'm using node for a small tool to analyze network traffic. The author of this drivel can cope. :P
Approaches that become popular and highly publicized definitely impact everyone else's work in that field. Teams decide to migrate to those approaches, discarding others, based on perceived popularity, shallow impressions, small amounts of experimentation. Often, this is all we have to go on. But team members who have an intuition that the approach may have more problems than are first visible now have a choice, to either silently go along with the new decision, or to document their reservations. The anger is an issue though. It's a product of when you perceive a waterfall of hype crashing over your own perception of better judgment (please note: perception. subjective viewpoint). It's worth it to try adjusting those perceptions since anger doesn't really get you anywhere.
We're all aware of the Internet Hype Machine. We've all been duped by it before. Heck, my big project today consists of frantic backpedaling from an overly hasty decision, prompted by the IHM, to use SQLite in a project that had no business being based on SQLite. We should all be open to hearing criticism about choices to use X or Y technology.
-But- if you start by saying, "You're so stupid," then the person you're talking to will start by thinking, "You're such a jerk." And nobody really pays much attention to the opinions of people they think are jerks.
Good point. I think a lot of people who build commercial software have rather limited choice in which tools they use. They can choose how to use those tools and what to advocate publicly. If the hype about something forces me to use deficient tools, I will be angry it and vocal about it, because I care.
People need to understand that decisions should be made based on the team's current skill set. If your team is comprised of Java developers, time shouldn't be wasted on researching node.js; rather they should focus on how to leverage their Java knowledge with Scala. It frustrates me to hear people falling for the hype machine and falling hard when they could have easily avoided by asking themselves two questions: what's the path of least resistance to shipping our product out the door, and what's the opportunity costs relative to alternative paths?
It's not limited in scope to someone else's work. I have done a decent review of a number historical computer science papers, I can confidently point to a number of things that have been pointlessly reinvented over the years at least once, if not 2-3 times.
It's like, why are people using these really bad technologies (node for instance)? There are are solid and advanced technologies that have done all these things, been tested, used, and developed over a long period of time, without the limitations of this newness and lack of features/testing/experience.
As a stupid example, a tracing simulator describing variable usage and coverage were commercially available for Fortran in the late 60s. I haven't heard of similar systems for C or C++ in my casual reading on C and C++. Perl has spent years working towards something that is starting to look a good deal like Lisp in Perl 6.
For node.js and golang and other asynchronous & message-based languages/platforms, see occam.
Why can't we look into the 70s and build new technologies instead of reinventing the same ones over and over again? That's why I get a bit miffed about new stuff that is the same as the old stuff, except Now For Modern Computers/The Web/Mobile/blah.
>>Perl has spent years working towards something that is starting to look a good deal like Lisp in Perl 6.
Good example of your point, this is one of the things frustrating me in life.
Most of the scripting languages have long been working on becoming larger subsets of Lisp. They still mostly haven't gotten close in e.g. efficient compilation.
But sure, it would be cool if the Perl 6 e.g. really implemented a good macro system without sexpr functionality. Something to look forward to.
I really don't understand how the Lisp people failed taking over the world. (Sigh, I should have helped instead of being sidetracked after univ. :-( Maybe I should start looking into Perl 6 development.)
I have to agree with the rest of the commenters here. You make a blanket statement about something you've obviously never used. You're leveraging hearsay and third party complaints against a framework and language that you don't appear to be overly familiar with.
From the article:
"The hype around Node.js on this issue makes me want to punch faces."
"But the kind of misunderstanding going on in this video clip seems to pervade the Node.js hype and gives me rageface."
This seems like a really over-the-top response to people that have a differing opinion. I can't take the rest of his post seriously after reading these parts. This certainly isn't the sort of thing you read in an informed opinion piece.
That's also what I took away from it. Aggressive writing, insults, and condescending tone isn't a way to win friends and influence people--except, possibly, those who already agree (judging by the HN comments).
He seems to have some valid criticism, but I can't say it's anything I've heard before. If anything, the article itself is flamebait and at least partly intended to troll.
After browsing through the comments here on HN, I think he succeeded. But then, everyone likes a good flame war once in a while...
The Ruby and Python communities are just now, many years after the hype has faded, learning that stuff like dependency injection and proper modularization are actually good things that help you maintain code over time.
This remark is off the mark. Dependency injection, as in injection by parameters and injection by constructors are so obvious people do it sub-consciously. A fluff word isn't needed for it. As far as IoC containers are concerned, I don't see Ruby/Python communities using it, mainly because half of it is fighting static typing.
And people are learning proper modularization now? Seriously? Python/Ruby has proper namespaces(ruby doesn't have it), modules, classes et al. Like any other languages, Python/Ruby has it's share of programmers who write spaghetti code, and programmers who don't.
Again, if he writes AbstractConnectionDepenencyInjectioManagerAbstractFactory and calls it proper modularization, I am happy Python/Ruby isn't picking it up.
Agreed entirely - I find that this is an old debate between people who "love Java" and those who don't.
I posted some commentary on the same topic last time Nick Kallen's infamous "I love everything you hate about Java" blog got posted : http://news.ycombinator.com/item?id=3287777 .
What it boils down to is that Java likes invoking the names of design patterns with all sorts of pomp and ceremony (look, ma, it's an AbstractFactoryFactory!) while many more modern languages make similar design patterns natural.
Whether or not to like the ritual is up to the programmer, but I entirely agree that claiming that Ruby and Python are "just starting" or "don't" support patterns like dependency injection is absolutely baseless.
Node.js isn't picking up a new paradigm. The issue is very present in JavaScript, and it's easy to write spaghetti code since the language by itself doesn't offer much structure. It's possible to write very clean JavaScript / Node.js code, but it takes a different approach over how you design / develop apps versus a class-based language.
> JavaScript has very little support for any of those nice things: it doesn't even have namespaces, for chrissakes. Why would I want to repeat these same mistakes over and over again in a new language?
Javascript doesn't have this (by itself) but node has a very nice require() system that is really excellent for long-term maintainability. When you bump a dependency in a node project that change will only affect the code near it because of how node_modules are resolved to the most local copy. You can bump dependencies without worrying how this will affect other packages.
Plus, require() just returns an object. It doesn't puke a bunch of objects into the current scope. This is massively useful for readability. I've sunk a lot of time on other systems tracking down unqualified exports to figure out which package's documentation to consult.
I've got nothing against scala and am sure it's a useful language but I wonder if the author has even used node.
I guess it depends on what I how I want to do my life. If I want to live my life by learning new ideas and using those ideas for something tangible, Node's a pretty good choice. If I want to live my life as a person with a particular language/architectual ideology, then anything that is not in that world view is wrong.
I like node for system level scripting. I find bash annoying and non portable to windows. I really don't want to have to learn batch scripting for dos on windows. But I can use JavaScript with node to script in both environments.
On the server I think that node might be helpful for certain network level tasks. But I haven't used it for much. But honestly what type of person would I be if I don't even consider it? The OP seems to be making an emotional decision rather than a technical one. Interestingly he's using Scala. There are many similar posts about Scala being the wrong way to do life. I just can't agree with any of those views.
Finally I wonder what the value is for these rage posts. They just seem to further divide people. I do see the value in the posts about I've used node for X months, here's my thoughts or here's why I'm going back to X paradigm. But just a rant where faces should be punched seems out of place for HN.
If you like Node for system level scripting, you're gonna love this: http://www.jsdb.org/
Don't let the name fool you, it's not only for databases. I would say that it's probably more suitable for general purpose scripts than Node, though some of the APIs are a bit clumsy.
It's not open source, but it's free and cross platform and actually pretty good for a lot of general purpose scripting. Seems that it is developed by a single guy. I found out about it a few years ago and used it to get some things quickly done.
Non-blocking evented IO is mostly attractive from a usability point of view: it's much easier to write programs that aren't multi-threaded. It can also use much less memory than a threaded model in certain situations.
Non-blocking, evented systems tend to be single-threaded. Single-threaded systems don't automatically scale across multiple cores. To scale, you spawn a separate process for each core (for example, this is the suggested practice for node). You must then find some way for the different processes to communicate with each other, which is usually through a database (or some crazy pub-sub thing).
Node can scale just fine if you design your program to do so. It just scales in a different way.
Personally I love it, but some programmers find non-blocking evented "async" IO completely counter-intuitive. So it's debatable on the usability.
Async IO is an absolute win from the scalability perspective because it allows you to service a great many clients with many fewer threads. OS thread context switches are relatively expensive. Ideally you would have exactly one OS thread per physical core and they would never need to block on exclusive access to any shared resources.
Now that we have a system where the user code inside the async handler doesn't need to manage exclusive access to anything, from the usability perspective it can has some of the simplicity of code that is fully single-threaded. But that's subtly different from saying ASIO makes it easy.
My guess is that many of the same programmers who aren't comfortable writing multithreaded code aren't going to find it completely intuitive to rethread their stack around an ASIO model.
Essentially the first one is most right. Non-blocking IO can get a lot of work done as it is never hindered by doing nothing while waiting around for slow IO. It never blocks so it can always do work.
However, if a non-blocking system has too much work to do it can still max out a CPU. At this point you, ideally, need as many worker threads as you have CPUs.
However, a threaded system that doesn't use non-blocking IO runs the risk of having many blocked threads eating up a CPU & memory instead. This is largely dependent on the light-weight-ed-ess of the threads.
Both these systems are effected by how much work the server has to do to create a response, thus even non-blocking IO can become swamped if it uses a slow language, too much memory or the wrong algorithm, plus all IO must not block or else the non-blocking networking ends up waiting around for blocking files.
There are other complications too like the number of file handles a process can issue that can also impede a server and the number of clients it can simultaneously serve.
If you're working on a project where I/O blocking is your primary performance issue, Node has a lot to offer in the form of a framework that helps and encourages you to structure your code in a way that works well for such tasks. Javascript's performance and its being single-threaded will have minimal impact, because those concerns are absolutely dwarfed by I/O costs in the situations Node's designed for.
On the other hand, if you're worried about how many threads you can run at once, then you're working on a task where CPU performance matters. That's not what Node is designed for. If you use Node anyway, you've decided to try hammering screws into place - and you should absolutely expect that it won't work out very well for you.
It depends largely on what your scaling issues are. If you have requests that take a long time because of waiting for replies from web service calls, database calls, and the like, it will be a huge boon to scalability. If your CPU-limited, on the other hand, the non-blocking IO won't help you.
I think largely non-blocking I/O is a means to an end. Non-blocking I/O allows one to implement a single-threaded event loop, which allows one to skip all the overhead associated with multithreaded systems. It's not the non-blocking I/O which necessarily makes it more scalable, it's the fact that you avoid the heavy cost of context-switching and the memory and CPU complexity of thread creation.
I've got my doubts about Node.js, since it seems like rather a one-trick pony.
But it is a good trick. Node.js deserves credit for calling attention to an underappreciated design pattern that has a lot to offer in certain circumstances. (Personally I think the .NET team hit the nail more squarely on the head with TPL, a pony that can do that trick as well as many others. But .NET doesn't have the sex appeal it takes to be a spokesmodel so meh.)
Javascript isn't my favorite language, or the most performant one. But as a "Lisp with C syntax", on a semantic level it's much better suited to the higher-order programming techniques that the pattern requires than most other popular Web languages are. Ruby also has the right features, but it isn't exactly the poster child for high-performance computing either. Might as well flip a coin, because either way opinionated folks with blood pressure conditions will call you an idiot.
I'm really pretty anti-node, but this article isn't very good. The concerns here are mixed up and not very thorough. All these points need graphs, charts, something solid to anchor them to. This is the sort of article that polarizes, but doesn't add to the discussion.
It starts off strong talking about a high bug count, but never gets into specifics there.
As far as scaling across cores goes, it's disingenuous to suggest that node can't do this, there are a number of options here. Message passing, for instance, does indeed work.
As far as nested callbacks sucking, I totally agree. But a walk through why would add a lot more substance here as well.
I don't think it even starts off strong with the bug counts. That wasn't node, but using Chrome/v8 directly to parse web pages for their web crawler. I'm not the least bit surprised that parsing unfiltered HTML from the internet dominates their bug count.
I also won't be surprised if their rewritten scala HTML parser also dominates the bug counts.
I recently evaluated Node and Scala for a presence server for an iOS app. With my naive understanding of both platforms, it was way easier to do this with Node. It would be interesting to hear more detail about how Scala was used and why it was better.
I watched it last weekend, and from what I understood/remember from the talk the reason the node people picked javascript was not because they liked javascript. It was because they wanted to do async programming, and they found other languages had too much synchronous baggage. In javascript, node.js could start from a clean slate and build a pure async culture and environment.
I watched it last weekend, and from what I understood/remember from the talk the reason the node people picked javascript was not because they liked javascript. It was because they wanted to do async programming, and they found other languages had too much synchronous baggage. In javascript, node.js could start from a clean slate and build a pure async cultural and environment.
Node solves a problem I don't have in a so convoluted way that if I ever have that kind of problem I won't be using node for sure.
Is there a need for webstackers to go play at the server side? YES! but node is not THE solution, it is just ONE solution. I venture to say, as javascript evolves more towards a coffeescript flavor, then a coffeescript flavor on the server is what is needed.
99 comments
[ 3.2 ms ] story [ 159 ms ] thread* It's "not as good" as languages/environments like Erlang.
* But it's good enough, and significantly simpler, as an approach to tackle a certain class of problems. This, combined with widespread knowledge of Javascript, will probably make it fairly widely used.
The fact of the matter is that Javascript is currently (and for the forseeable future) client side language that runs without a plugin. If you want your entire stack to run on Javascript, then server side programming is the only way.
Projects like CoffeeScript are the earmarks of disruptive technology - getting something that doesn't fit most peoples needs to grow up quickly, fit everyone's needs, and destroy its competition before the competition even realized it was there.
At a very basic level, Node.js is a callback-based API that's based around some(probably select) notifier loop. That's not particularly new.
Of course, scaling it past that will be a problem with Node being single threaded and so on - but I believe that these are problems that Node.js will eventually address.
However, Node is written from head to toe to take advantage of that style of coding, whereas Tcl never had the assumption that everything had to be async, so many calls block. Same thing with Python and Ruby, except that they're relative latecomers to the embedded "select loop" game (sure, modern systems have moved on from select, but it still conveys the idea).
Erlang has been around for a while, and does async beautifully, but for every person who knows Erlang there are 10,000 who know Javascript.
Node looks great for insanely high connection count / non blocking messaging apps but for nearly everything else it looks like a square peg in a round hole.
Just use it and see if it works out for you.
The only factor that drives technology success is the people, aka the community. There are a lot of people on board of nodejs. This just creates more gravity and pulls more people toward it. Together, the community will carry the momentum that drives its success. If v8 is not server technology like OP said, there are enough open source developers to make its on fork.
Who cares about the language. Use JS if you want, or use Scala. At the end of the day is the maintainability of the product you're developing that matters.
I feel, for example, that NPM is much easier and simpler to use than something like Maven. If it makes my life easier, I'll stick with it.
I'm using node for a small tool to analyze network traffic. The author of this drivel can cope. :P
We're all aware of the Internet Hype Machine. We've all been duped by it before. Heck, my big project today consists of frantic backpedaling from an overly hasty decision, prompted by the IHM, to use SQLite in a project that had no business being based on SQLite. We should all be open to hearing criticism about choices to use X or Y technology.
-But- if you start by saying, "You're so stupid," then the person you're talking to will start by thinking, "You're such a jerk." And nobody really pays much attention to the opinions of people they think are jerks.
Socrates was smart. He was also executed for being irritating.
You know, much alike someone insulting Mongo, Rails or Node in certain communities... (or Java, CL etc in others).
Again, much like Mongo, Rails, and Node. :)
It's not limited in scope to someone else's work. I have done a decent review of a number historical computer science papers, I can confidently point to a number of things that have been pointlessly reinvented over the years at least once, if not 2-3 times.
It's like, why are people using these really bad technologies (node for instance)? There are are solid and advanced technologies that have done all these things, been tested, used, and developed over a long period of time, without the limitations of this newness and lack of features/testing/experience.
As a stupid example, a tracing simulator describing variable usage and coverage were commercially available for Fortran in the late 60s. I haven't heard of similar systems for C or C++ in my casual reading on C and C++. Perl has spent years working towards something that is starting to look a good deal like Lisp in Perl 6.
For node.js and golang and other asynchronous & message-based languages/platforms, see occam.
Why can't we look into the 70s and build new technologies instead of reinventing the same ones over and over again? That's why I get a bit miffed about new stuff that is the same as the old stuff, except Now For Modern Computers/The Web/Mobile/blah.
Good example of your point, this is one of the things frustrating me in life.
Most of the scripting languages have long been working on becoming larger subsets of Lisp. They still mostly haven't gotten close in e.g. efficient compilation.
But sure, it would be cool if the Perl 6 e.g. really implemented a good macro system without sexpr functionality. Something to look forward to.
I really don't understand how the Lisp people failed taking over the world. (Sigh, I should have helped instead of being sidetracked after univ. :-( Maybe I should start looking into Perl 6 development.)
"But the kind of misunderstanding going on in this video clip seems to pervade the Node.js hype and gives me rageface."
This seems like a really over-the-top response to people that have a differing opinion. I can't take the rest of his post seriously after reading these parts. This certainly isn't the sort of thing you read in an informed opinion piece.
He seems to have some valid criticism, but I can't say it's anything I've heard before. If anything, the article itself is flamebait and at least partly intended to troll.
After browsing through the comments here on HN, I think he succeeded. But then, everyone likes a good flame war once in a while...
This remark is off the mark. Dependency injection, as in injection by parameters and injection by constructors are so obvious people do it sub-consciously. A fluff word isn't needed for it. As far as IoC containers are concerned, I don't see Ruby/Python communities using it, mainly because half of it is fighting static typing.
And people are learning proper modularization now? Seriously? Python/Ruby has proper namespaces(ruby doesn't have it), modules, classes et al. Like any other languages, Python/Ruby has it's share of programmers who write spaghetti code, and programmers who don't.
Again, if he writes AbstractConnectionDepenencyInjectioManagerAbstractFactory and calls it proper modularization, I am happy Python/Ruby isn't picking it up.
I posted some commentary on the same topic last time Nick Kallen's infamous "I love everything you hate about Java" blog got posted : http://news.ycombinator.com/item?id=3287777 .
What it boils down to is that Java likes invoking the names of design patterns with all sorts of pomp and ceremony (look, ma, it's an AbstractFactoryFactory!) while many more modern languages make similar design patterns natural.
Whether or not to like the ritual is up to the programmer, but I entirely agree that claiming that Ruby and Python are "just starting" or "don't" support patterns like dependency injection is absolutely baseless.
http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-pro...
He's calling node style callbacks spaghetti code. Which it is, and it's a known problem, and there are several half-baked solutions for it.
Javascript doesn't have this (by itself) but node has a very nice require() system that is really excellent for long-term maintainability. When you bump a dependency in a node project that change will only affect the code near it because of how node_modules are resolved to the most local copy. You can bump dependencies without worrying how this will affect other packages.
Plus, require() just returns an object. It doesn't puke a bunch of objects into the current scope. This is massively useful for readability. I've sunk a lot of time on other systems tracking down unqualified exports to figure out which package's documentation to consult.
I've got nothing against scala and am sure it's a useful language but I wonder if the author has even used node.
I like node for system level scripting. I find bash annoying and non portable to windows. I really don't want to have to learn batch scripting for dos on windows. But I can use JavaScript with node to script in both environments.
On the server I think that node might be helpful for certain network level tasks. But I haven't used it for much. But honestly what type of person would I be if I don't even consider it? The OP seems to be making an emotional decision rather than a technical one. Interestingly he's using Scala. There are many similar posts about Scala being the wrong way to do life. I just can't agree with any of those views.
Finally I wonder what the value is for these rage posts. They just seem to further divide people. I do see the value in the posts about I've used node for X months, here's my thoughts or here's why I'm going back to X paradigm. But just a rant where faces should be punched seems out of place for HN.
Don't let the name fool you, it's not only for databases. I would say that it's probably more suitable for general purpose scripts than Node, though some of the APIs are a bit clumsy.
It's not open source, but it's free and cross platform and actually pretty good for a lot of general purpose scripting. Seems that it is developed by a single guy. I found out about it a few years ago and used it to get some things quickly done.
* It uses non-blocking evented IO so it can scale well.
* It is single threaded so it can't scale well.
Someone teach me: which of these statements is true?
Non-blocking evented IO is mostly attractive from a usability point of view: it's much easier to write programs that aren't multi-threaded. It can also use much less memory than a threaded model in certain situations.
Non-blocking, evented systems tend to be single-threaded. Single-threaded systems don't automatically scale across multiple cores. To scale, you spawn a separate process for each core (for example, this is the suggested practice for node). You must then find some way for the different processes to communicate with each other, which is usually through a database (or some crazy pub-sub thing).
Node can scale just fine if you design your program to do so. It just scales in a different way.
Async IO is an absolute win from the scalability perspective because it allows you to service a great many clients with many fewer threads. OS thread context switches are relatively expensive. Ideally you would have exactly one OS thread per physical core and they would never need to block on exclusive access to any shared resources.
Now that we have a system where the user code inside the async handler doesn't need to manage exclusive access to anything, from the usability perspective it can has some of the simplicity of code that is fully single-threaded. But that's subtly different from saying ASIO makes it easy.
My guess is that many of the same programmers who aren't comfortable writing multithreaded code aren't going to find it completely intuitive to rethread their stack around an ASIO model.
Essentially the first one is most right. Non-blocking IO can get a lot of work done as it is never hindered by doing nothing while waiting around for slow IO. It never blocks so it can always do work.
However, if a non-blocking system has too much work to do it can still max out a CPU. At this point you, ideally, need as many worker threads as you have CPUs.
However, a threaded system that doesn't use non-blocking IO runs the risk of having many blocked threads eating up a CPU & memory instead. This is largely dependent on the light-weight-ed-ess of the threads.
Both these systems are effected by how much work the server has to do to create a response, thus even non-blocking IO can become swamped if it uses a slow language, too much memory or the wrong algorithm, plus all IO must not block or else the non-blocking networking ends up waiting around for blocking files.
There are other complications too like the number of file handles a process can issue that can also impede a server and the number of clients it can simultaneously serve.
If you're working on a project where I/O blocking is your primary performance issue, Node has a lot to offer in the form of a framework that helps and encourages you to structure your code in a way that works well for such tasks. Javascript's performance and its being single-threaded will have minimal impact, because those concerns are absolutely dwarfed by I/O costs in the situations Node's designed for.
On the other hand, if you're worried about how many threads you can run at once, then you're working on a task where CPU performance matters. That's not what Node is designed for. If you use Node anyway, you've decided to try hammering screws into place - and you should absolutely expect that it won't work out very well for you.
But it is a good trick. Node.js deserves credit for calling attention to an underappreciated design pattern that has a lot to offer in certain circumstances. (Personally I think the .NET team hit the nail more squarely on the head with TPL, a pony that can do that trick as well as many others. But .NET doesn't have the sex appeal it takes to be a spokesmodel so meh.)
Javascript isn't my favorite language, or the most performant one. But as a "Lisp with C syntax", on a semantic level it's much better suited to the higher-order programming techniques that the pattern requires than most other popular Web languages are. Ruby also has the right features, but it isn't exactly the poster child for high-performance computing either. Might as well flip a coin, because either way opinionated folks with blood pressure conditions will call you an idiot.
It starts off strong talking about a high bug count, but never gets into specifics there.
As far as scaling across cores goes, it's disingenuous to suggest that node can't do this, there are a number of options here. Message passing, for instance, does indeed work.
As far as nested callbacks sucking, I totally agree. But a walk through why would add a lot more substance here as well.
Keeping it to node.js bashing, this guy takes the discussion to a slightly lower level: http://youtube.com/watch?v=1e1zzna-dNw
He tries to discredit node by taking apart the copy on the front page of nodejs.org.
It's all conjecture and ad hominem.
I also won't be surprised if their rewritten scala HTML parser also dominates the bug counts.
TameJS is a step in the right direction by adding a C#-style await.
* Before native support: https://github.com/learnboost/cluster
* Now, native: http://nodejs.org/docs/latest/api/cluster.html
This tech talk on node is pretty interesting
http://sna-projects.com/blog/2011/08/nodejs/
I watched it last weekend, and from what I understood/remember from the talk the reason the node people picked javascript was not because they liked javascript. It was because they wanted to do async programming, and they found other languages had too much synchronous baggage. In javascript, node.js could start from a clean slate and build a pure async culture and environment.
This tech talk on node is pretty interesting
http://sna-projects.com/blog/2011/08/nodejs/
I watched it last weekend, and from what I understood/remember from the talk the reason the node people picked javascript was not because they liked javascript. It was because they wanted to do async programming, and they found other languages had too much synchronous baggage. In javascript, node.js could start from a clean slate and build a pure async cultural and environment.
Is there a need for webstackers to go play at the server side? YES! but node is not THE solution, it is just ONE solution. I venture to say, as javascript evolves more towards a coffeescript flavor, then a coffeescript flavor on the server is what is needed.
And I'll support something along these lines.