LLDiver で「それでもNode.jsをやる」というタイトルで発表してきた
発表資料
LLDiverで発表してきました。最近僕もgolangとか触ってるので色々と言われるんですが、「一時期Node.jsやってた人ってみんなGoに行っちゃったよね」って言われることすごく多くて、これについて色々と思うことがあるので話してきました。
ちょっとした補足とか
この前のRebuild.fmでのmicroserviceの話とかでもあったんですが、モノリシックな一枚岩のアーキテクチャではなく、"一つのことを上手くやる"複数のコンポーネントとしてのサービスを作りそれの集合体で全体のサービスを提供する構成が流行ってきています。
これ自体は今に始まった話じゃなくてTwitterがRuby on Railsで作られたサービスをscalaでSOA化した話はあまりにも有名ですし、大体どの企業でもモノリシックなサービスで未来永劫続けるのは大規模になると難しくなるので、正しい姿といえるでしょう。
ここからが言いたいことなんですが、「一つのプログラミング言語で全体最適なアーキテクチャを作る事って難しくなっているよね」って思うんです。もちろん個人で作っているようなサイトは別かもしれませんが、microserviceのようになると「一つのことをうまくやるコンポーネントの組み合わせ」で全体のシステムを実現するようになるのでしょうし、プログラミング言語ってどんどん多様化してきてて、目的にあった使い方をしていく必要があると思っています。
だから僕がgolangやってるのは別にNode.jsに未来を感じてない、とかそういう事ではないし、ましてやNode.jsをやりたくなくなったからでも無くて、golangとNode.jsに関わらず、全く別な思想を持つものを学んで全体最適なアーキテクチャを作れるようになりたいと思ったからです。
golangとNode.jsはその哲学からアーキテクチャから徹頭徹尾違います。
Golangの哲学についてはRob Pike氏が語っているので翻訳しておきます。
Goが最も適しているのは、「多くのデベロッパによって書かれた日々成長する大きなプログラムをサポートする」事だ。
Goを使えば、プログラマがソフトウェアを素早く開発し、メンテナンスし、成長に適応する事ができるようになるだろう。
Goは昔からあるコンパイル言語の実行時の効率と使いやすさ、スクリプト言語の表現豊かさを兼ね備えている言語なんだ。
それに対してNode.jsの哲学については Isaac Z. Schlueter氏が語っているのですが、長いので要約すると、
Node.jsの哲学は基本的にはUnix PhilosophyがNode.jsの哲学そのものだ。一つのことをうまくやるモジュールを書き、
データを Streams API で組み合せられるようにしよう。シンプルであることは何よりも良いことなのだから。
こんな感じですね。向き合っている課題とレイヤーが違う感じがあります。
アーキテクチャもスレッドを基本とするgolangとイベントループモデルでリソース効率化を基本とするNode.jsという感じで全く違います。
というわけであんまり一個の言語だけを突き詰めるのって昨今の事情に合わず、それぞれの特性を理解した上で全体最適を作れる方が楽しいと思っているので、これからもGoもNode.jsもやっていきます。
Node.jsやめると公言したvisionmediaもおそらく同じ考え方で最近の彼の活動を見るとどっちも突き詰めようとしています。彼自身はwebアプリならNode.js使い続けるという事ですし、それぞれの特性は知っておいて損ではないので僕も同じ考えで両方やっていきます。