Most developers would agree that, all other things being equal, a synchronous program is easier to work with than an asynchronous one. The logic for this is pretty clear: one flow of execution is easier for the human mind to simulate than n
concurrent flows.
After doing two small projects in node.js (one of which is here -- ready for the blinding flurry of criticism), there's one question that I can't shake: if asynchronicity is an optimization (that is, a complexity introduced for the sake of performance), why would people, a priori, turn to a framework that imposes it for everything? If asynchronous code is harder to reason about, why would we elect to live in a world where it is the default?
It could be argued pretty well that the browser is a domain that inherently lends itself to an async model, but I'd be very curious to hear a defense of "async-first" thinking for problems that are typically solved on the server-side. When working with node, I've noticed many regions of code where
- synchronicity wouldn't introduce a performance bottleneck, and
- what would otherwise be an easy problem is made very difficult by the fact that everything must be phrased for the event loop.
For an example of this, try writing a function call that requires information from two separate HTTP API responses; I basically need to draw a diagram of what happens with async.waterfall
for a task that, given synchronicity, would've been solved with a trivial three-liner.
Easy things should be easy. Optimizations should be closeted until they're needed. Maybe I'm missing something here, some mechanism in node that allows opt-in synchronicity... dear node.js, is there such a thing? If not, why do you want to make many things harder than they need to be?
If your point is "async patterns are sometimes useful but
async.waterfall
is a bummer", then I agree but I think you miss the point.Here's my take on the node.js story: A handful of Web technologies were combined to create a platform that was pretty good at solving Web programming problems. Turns out the platform appealed to TONS of people, and was useful in a lot of other areas as well. Then those tons of people created tons of value on the platform and gave it away (via Github, npm, etc.).
I turn to node.js because I mostly do Web stuff. The event loop is generally a good fit for my problems and I want to take advantage of all that community value. The async patterns and the JavaScript idiosyncrasies are at worst a minor annoyance. At best, they're exactly what I need.