Node.jsはオモチャ。

結構ツンデレな記事だったので、面白くなって翻訳してしまいました。
元記事:Bearstech Blog

思えば、昔Node.js is a cancer、を見た時も翻訳したなぁ。
Node.jsはソフトウェアの癌になる。 - from scratch

Node.js はおもちゃだ。

世界は非同期である。だから、プログラミングも非同期であるべきである。
実際にはムーアの法則には限界があり、これまで以上のリソース拡大は嘘になる可能性がある、これ以上のパワーを得るためには同期による待ち時間を減らすべきである。
しかし、非同期プログラミングは難しい、なぜなら非同期アクションに変換しながらテキストを書く必要があるからだ。非同期プログラミングは新しい世界であり、古いプログラミングは同期から非同期へと進化することはできない。

スレッドはアセンブリのようにラフなツールだ。多くの言語は非同期の仕組みを使うことが出来る、しかしプログラマーは本当はそれを使うべきではない。

Python gevent, Ruby Event-Machineなどは継ぎ接ぎされたキメラのようなものだ。純正の非同期処理系か純正の同期処理系を使用するほうが良い。
Erlang, scala, golang, nodejs は全てが純正の非同期システムであり、それらを試せば、違いが分かるだろう。

非同期プログラミングはあなたの新しい娯楽になるだろう


Nodejsは非同期プログラミングを学ぶ上で、世界で最も優れた言語である。javascriptを打ち負かせる言語は他にいない。

関数型言語であり、その文法は共通化されている。Javascriptの学習曲線はかなり平坦である、そして誰もがjavascriptを避ける事は出来ない、クライントサイドでも、サーバーサイドでも、データベースにおいても、どこにでも存在する。さらに言えば、javascriptを高速にすることの効果はかけがえがない。JVMでさえMozillaGoogleAppleやMicrosoftからそこまで愛されていない。

Javascriptは非同期をハンドリングするための2つのツールを使っている、イベントとコールバックだ。
Pythonは無名関数やら何やらがない世界の中で非難され続けてきた、同期と非同期のツールを混ぜることは出来ない。

Javascriptドキュメントはシンプルであり、不可思議なパーツは魅惑的なツールになるように記載されている。コールバックスパゲッティはあなたの脳を最適化するためのスポーツのようなものだと認識すれば良い。Nodejsの基盤は素晴らしい(libuv, V8)、バッテリー同梱(batteries included)を除いて、ユーザーはとても短い時間でこの素晴らしさを提供する事ができる。Nodejsは非同期のクライアント、サーバーのプロトタイプを構築する上でベストなツールである。

そう、単なるプロトタイプだ。
なぜならNode.jsはおもちゃだから。

他の人間にとっての地獄


常にNodejsはこれまでのAPIを壊してくる。Node v0.4、0.6、0.8にかけて悲劇を見てきた。コードは容易にアップグレードできる、しかしそのライブラリにあなたのコードが依存していなければ、の話だ。NPM(パッケージマネージャ)は不完全なライブラリである。時に怒ったデベロッパーがforkし、修正し、pull requestを放置されたライブラリに対して発行している。そのデベロッパーはマージされるまで何年も待たなくてはならない。

誰もその事にケアをしていない。全てはプロトタイプかおもちゃだからだ。しかし、Substack, Astro, VisionMedia, またはJoyentのプログラムを信頼することはできる。なぜなら彼らはNodejsで仕事をしているからだ、彼らのはプロトタイプではない。私はパッケージマネージャを信頼するだろう。msgPackで遊びたい時は、"npm install msgpack"とタイプするだけだ、正しくforkされたパッケージをググる必要はない。

Nodejsはまだ1.0にもなっていない、今後メジャーバージョンが来た時に自分のコードをアップグレードするのは大丈夫なのだろうか?
Python 2 から Python 3への悲劇はもう誰も見たくはない。あるAPIはそれがstableで一貫していると刻みこんである。早期にリリースされ、後に刻まれている。しかしもうnodeの古いバージョンで罠にハマりたくない、特定のバージョンで私のdebianのadmin設定をどうするべきかで悩みたくない。また、私はnodejsの安定したバージョンがどこなのかを第三者に尋ねられた時に嘘をつきたくない。

なので、この事を覚えていて欲しい、nodejsを仕事で試すのは辞めたほうが良い。娯楽かプロトタイプ以上のものを作り、現実の問題解決を望む場合、ErlangScalaGolangのような現実的な言語を使うべきである。この事は残念に思う。CrockfordやRyahもこれについて無念に思うだろう。

from scratch的感想


ツンデレな記事だなぁと思いました。Node.jsは素晴らしいといいつつも、APIの互換性が保たれていない事に異を唱え、それをなんとかCrockfordやRyahに伝えたいのかな、と思わせる感じ。

ニコニコ超会議でも @KOBA78 さんが一番Nodeに向くのは今はLTネタである、と言い切っていたので、通じるものがあるのかな、と思いました。

また、同期的、非同期的の話は前回のNode学園で出た
同期的関数は同期的でなければならない。非同期的関数は非同期でなければならない。
という話を思い出しました。いずれにせよ、Node.jsは今回の記事にも書いてある通り、非同期プログラミングを学ぶにはこれ以上ないツールです。
確かにAPIはよく変わるけど、1.0以降は互換性も意識される(はず)と言われています。


ちなみに余談ですが、 @jovi0608 さんから紹介された同期的コールバック、非同期的コールバックに関する記事も面白かったです。
Callbacks, synchronous and asynchronous : Havoc's Blog