High-level abstractions are one of the driving forces of technological and computing progress. Abstractions have allowed us to be productive and innovative by ignoring low level details. Overall, their advantage is indisputable. But there is a cost to abstracting. In mathematics, abstractions work by removing dependencies so a concept can be more widely applied. In programming, abstractions are often achieved by automating away low-level annoyances so we can focus on high-level solutions. Automation poses a few problems: loss of control, overreliance, and a disconnect between the user’s and system’s model (more on this in a bit).
Not many people would argue that jQuery is a bad thing (unless you’re David Mark), and I’m not going to either. For all the good jQuery does, there are very few disadvantages. Looking at the problem of automation, loss of control isn’t an issue thanks to its prototypal nature. The same can’t be said for overreliance. How many times have you seen a site that loads up 25kb of jQuery just to handle 1 click event? Or using jQuery to set CSS instead of just doing class manipulation? More importantly, overreliance leads to a dangerous problem: a disconnect between the user’s and system’s model.
Be careful about making abstractions. You might have to use them.
Ryan’s philosophy is to “present the low-level interface and allow people to build on top of that”. Despite being low-level, node.js is still an abstraction (pretty much everything in programming is), but its advantage is how the two models (node.js and evented I/O) are conceptually compatible. If your goal is to write a high-performance, efficient, and concurrent network program, using a low-level layer written in a language that’s asynchronous and non-blocking by nature just makes sense.
Some common feelings about node.js are that it’s fun to use and just feels right. People usually get it or they don’t. I believe this is due to the convergence of mental models much more so than it is to a technical reason like syntax or features. node.js is special because it exposes the underlying essence of its system model rather than hiding it, or even worse, misrepresenting it.