読者です 読者をやめる 読者になる 読者になる

io.jsについて知っていること

node.js io.js

f:id:yosuke_furukawa:20141225101839p:plain

今、Node.jsに起きてることを語る上で、io.jsは避けて通れない話題でしょう。

今回のNode.js アドベントカレンダー 2014の締めを飾るために、このio.jsについて僕が知っている限りの事をまとめて書くことにします。

io.jsを知り、今後"Node"がどうなっていくのかを皆で一緒に考えていきましょう。

またこの一連のio.jsのfork騒動はOSSという特殊なプロジェクトをどう進めていくのがハッピーなのかを知る一つの教材だと思います。
OSSに関わっている皆さん、今回も長いですが、最後まで読んでもらえると幸いです。

io.js とは何か

Node.jsのForkです。次のNode.jsの安定版になる、v0.12をForkしています。「アイ・オー ジェイエス」と読みます。名前の由来は木星にある四番目に大きな衛星の名前から取られました。*1

Nodeを使っている人のことをnodersと呼びますが、io.jsを使っている人のことはionians(アイオニアンズ)と呼ぶそうです。

Node.jsと何が違うの?

一番大きな違いはプロジェクトの取り組み方ですね。io.jsでは、オープンガバナンスモデルを採用しています。

オープンガバナンスモデルというのは、コアチームがどうやってissueやfeatureを進めるのかをオープンにして、周りから見えるようにして実現していくやり方です。一週間に一度程度のペースでミーティングが開催され、その会議の様子はyoutubeで配信されます。もちろん、コアチームは世界各国に散っているのでFace2Faceでの会議ではなく、Google Hangoutを使ったリモート会議です。基本的には合議制ですが、意見が割れた時はVoteして決めます。60%以上の賛成が得られれば採用されます。

さらに、毎回の議事録はio.jsのリポジトリと一緒に文面で保管されます。

これを追っていけば、今io.jsで何が起きててどんなことが議論されているのかが分かるわけです。

io.jsの目的は何なの?

安定したリリーススケジュールを提供することと、オープンガバナンスによる透明性を確保することにより、他の開発者からコントリビュートをしやすくするのが目的です。後述しますが、今のNode.jsの一番の問題点は安定したリリーススケジュールが確保できていないことにあります。これを解決する道を模索した結果が今のio.jsなわけです。

他にも目標としては

  • Semantic Version準拠のバージョニング
  • 企業のコントロールから外れたコントリビュータシップ
  • 週単位でのリリース
  • V8のバージョンを着実にサポートする
  • 予測可能なロードマップを立てる
  • コミュニティからの支持を得た機能拡張

といった目標があります。

Node.jsとの互換性はあるの?

Node.jsとの互換性はありますし、今後も保たれる予定です。というのも、io.js側がNode.jsに取り込まれたbugfixやfeature等を先ほどのミーティングで検討にかけてio.js側にも積極的に取り込んでいくからです。

ただし、Node.js から io.js への互換性は保証すると明言されていますが、io.js から Node.js への互換性は保証される予定はないでしょう。

現時点でのNode.jsとio.jsの機能差は?

細かいバグ修正は置いておくと、現時点の最新のNode.jsとは以下の部分が異なります。

  • gcをフックしてheapの統計が取得できる v8 API が追加されてる
  • v8のバージョンが 3.30 になってる

v8 APIは Node v0.12でギリギリまで議論された末に削除されたtracing APIの機能の一部ですね。

v8は3.30になることで、ES6方面ではgeneratorの機能がデフォルトで使えるようになったり、String.prototype.repeatがデフォルトで使えるようになったりします。

他にもclassとかtoStringとかが、harmonyオプション付きで使えるようになります。

現時点ではよっぽど最新の機能を使わない限りはnode.jsとio.jsの互換を保ったライブラリやアプリを作るのは難しくないでしょう。

また、大津さんにも修正差異をまとめて頂きました。今現在での機能差は以下のリンクに張られている通りです。

2014/12/24時点での iojs/io.js が joyent/node と違っている部分

実行ファイル名はnodeのままなの?

実行ファイル名はiojsになります、ただし、互換性を残すためにnodeのsymlinkが張られる予定です。

これには商標権の問題があげられています。
Joyentが持っている商標はNode.js以外にもNODEとか色々持っています。暫定的にnodeのコマンドも残すけど、Joyent側からnodeのコマンドを商標権侵害なので認めないなどの抗議を受け取った場合にはコマンドはiojsだけ提供される可能性はあります。ただし今のところそういう抗議めいた話はまだ無いです。杞憂に終わってくれることを望みます。

なんでNodeをForkしてio.js作ったの??

当然の疑問ですね。ここはかなり色々あります。

InfoWorldが実際にこのio.jsのモデレータをやっているMikeal Rogersにインタビューした記事があるのでそこから引用しましょう。

InfoWorld: forkしたnodeの責任者はmikealなのかな?


Rogers: ぜんぜん違うよ。Fedor Indutnyがforkとオーガナイザーを始めようとしてたんだよね。でもフォークしたnodeはオープンガバナンスモデルを採用して、technical committee(以下TC)を作る事にしたんだ。今週初めてTCのミートアップがあってそこでは:

  • Indutny (Node.js code team メンバー)
  • Trevor Norris (Node.js core team メンバー)
  • Isaac Schlueter (Node.js core team の前リーダー)
  • Ben Noordhuis (Node.js core team の元メンバー)
  • Bert Belder (Node.js の 元maintainer)

といった人たちを参加者として呼ぶ事にしたんだ。

Rod Vagg (Node.js サポーター) もまたビルドシステムを作成し管理する人として呼んだ。
僕はただTCミーティングをモデレートして議事録をとってたのと、アジェンダを作成する助けをしてただけなんだ。


InfoWorld: じゃあなんでFedorはforkをしようとしたのかな?


Rogers: 実はJoyentには7月位から働きかけ始めていたんだ、コントリビュータとコミュニティがNodeが直面している問題を効果的に解決していくためにはアクティブじゃなくて、新しいコントリビュータがいなくて、リリースが滞っているNodeプロジェクトの現体制を動かそうって試みていたんだよ。


コアチームのFedorがその交渉に待ちきれなくなってforkの準備を始めたんだ。でも彼はそれのプロモーションをしてなかった。だけど、僕らもそれをずっと見てきたし、Fedorの活動に乗っかることにしたんだ。


そうして、Nodeのコア関連のメンバーを全て移動してNode Forwardプロジェクトとして仕切りなおしたんだ。しばらくNode Forwardとして行っていた活動だったけど、"Node.js"っていう商標権はJoyentが持っていて、そこの問題がクリアになるまで新しいNode.jsはリリースできないから、名前を"io.js"に変えることにしたんだ。

という訳です。Node.jsは現時点でリリーススケジュールがちゃんとworkしていません。issueが登録されてもそれがさばかれずに放置されたり、pull-reqが滞ることが多く、この一年くらいそういう感じになってしまっていました。io.jsはこの体制を変えようという活動です。

Node.jsとio.jsの和解の道は?

JoyentはJoyentでAdvisory Boardという形でオープンガバナンスモデルのプロジェクト推進をしようとし始めています。このAdvisory BoardにはIsaacやBertといったio.js側のメンバーも参加しています。彼らが言うには、io.jsのミーティングもAdvisory Boardのミーティングも両方共出るし、敵対する事無く、コンセンサスを取って進めていく予定だと書かれています。

ちょうど、12/4で行われたAdvisory Boardでio.jsに関してどういう形で対応するべきかの議論が載っているので簡単に翻訳しておきます。

io.js Fork (Scott Hammond Joyent CEO)

Scott Hammond (Joyent CEO 以下 SH): io.jsに関して、Node.jsとの関連や哲学、フォークした意図が知りたい。


Isaac Schlueter (元Node.jsリーダー、io.jsにも所属 以下 IS): io.jsはFedorがnode-forward/nodeをprivateリポジトリのままにしておくことにフラストレーションを感じで行ったことだ、商標権の問題なので名前とリポジトリが変わったんだ。コミュニティはそれに集まっただけで、問題の発見と解決というイテレーションを行いたいというnode-forwardとしての意思は変わらない究極的にはjoyent/nodeにも貢献されるはずだ。Advisory Board (以下AB)、ワーキンググループにも何の敵対心も持っていないし、io.jsの成功はそれらの進捗とともに歩んでいかなければありえないと思っている。joyent/nodeをio.js/io.jsにフォークしたのはisaacs/nodeにフォークしているのと何ら変わりない意図だ。


Issac Roth (StrongLoop CEO 以下 IR): オブラートに包んでるよね。node-forwardは利他主義だったけど、io.jsは転覆しようという感じにもとれる。ABにいる人はnode-forwardにいる人を含んでいるけどio.jsへの衝撃はあんまりないよね。


IS: そんなことはないよ。node-forwardは厳密には技術的な発展じゃなくて組織的な発展のつもりだったんだ。


IR: node-forwardはconsensus-seekingモデルを作られているけど、io.jsは一方的にforkしたんじゃないのか(コンセンサスは取ったのか)。


IS: 僕もBertも書いたし、Issac Rothも感じていると思うけど、io.jsのコミュニティはそんな風に敵対的に見ているわけじゃないよ。同じ方向、同じ目標を向いてると思っているよ。そんな風に敵対している体でストーリーを語っているジャーナリストばかりじゃないし、io.jsのメンバーの中で敵対している人もいないよ。8月にJoyentとNode Forward間で対話が始まってから、12月になって展開(forkした事実)があっただけだよ。


SH: 僕がもっとコミュニティから信頼してもらう必要があったのかな。


IS: NodeコミュニティはScott Hammondが来る前のJoyentにも信頼してなかったよ。Joyentの立場はずっと"Nodeを変えない"だった。Scott Hammondのせいではないよ。


SH: 我慢してくれたことは理解してるよ。


IR: もちろん、外から見た認識が大きく変化していない事は知ってる。io.jsで語られてるような事(Node.jsの進捗が悪いこと)は指摘されてるし、io.jsはio.js自身のやり方があるんだろう。


IS: Fedorがforkしてからコミュニティ側が彼に対して助言を与えたんだよ。


Dan Shaw (NodeUp podcaster 以下 DS): ABのメンバーはNodeのビジネスとしての価値を守るためにここにいる、だけどio.jsのリリースはコントリビュートしたい人達の鬱憤が溜まってリリースされるんだ。ABにいるメンバーは目を覚ますべきだよ、io.jsの流れを受け入れてさらに高速化した方がいい。


IS: ABでの約束(リリース高速化)を果たすためにみんなのケツには火がつけられたんだと思っていい。ただ、この時点でio.jsのために変化する必要があるとか思っててはいけないと思うな。Technical Committeeはio.js側のメッセージの意図を理解して、シェアする必要があるし、その上でJoyentのためにより良いフィードバックにする方がいい。io.jsへの意見を何も持たずにただ反対するべきじゃない。こういう分岐は最適な方法ではないだろうけど。


Todd Moore (Joyentアドバイザー TM): ただ分岐してしまったら全員にとって良くないだろう、私達は集中して行くべきだよ。


Chris Saint-Amant (Netflix マネージャ CS): Isaacが描いている内部の意見とは認識が違うな。io.jsサイドからはどんな譲歩も見えない。io.jsからはJoyentの期待を込めて和解へのはっきりとした道を示すべきだよ。真意と野望があるなら和解への道をはっきり見せて欲しい。中間成果としてそれをはっきりさせることはできないのかな。


IS: 和解のための方法がいくつかある: 1) io.jsのコアに code/binaryを移して欲しい。つまりio.jsをnodeにラップさせるんだ。 2) io.jsからのパッチを受け取って欲しい。なんの敵対心も何の競争心もない。io.js側に一時的な方法を言ってコミットしてもらうのはちょっと早計だ。


TM: 私達は良い方向に進んでいるんだ。もう一回一緒にフォークを戻すっていう可能性はあるんじゃないか


CS: 長い間不一致があったって言われてたらABとの和解は難しいんじゃないかな。根本から解決されるべき問題は何なのだろう。もし問題が和解されないなら、フォークするしか解決策がないのか、もっと問題をはっきりとする必要があるんじゃないのか。


IS: わかりやすいメッセージは準備している。いくつか意見もある、だけど誰もNodeの名前を変えよう(Node.jsと取ってかわろう)とは思っていない。ここにいる皆は"Node"って言ってるし、Node以外のサーバーサイドJSをNodeと呼ぶつもりはないし、Node.jsとio.jsが競合した所でお互いに損害があるだけだろう。結論を出すのは早過ぎるけど、共に生きる道を見つけて行ったほうが良さそうだ。もし問題が解決される可能性があるのであれば、io.jsが存在し続ける理由は何もない


CS: よく聞かれるので、Nodeコミュニティへの簡潔で明瞭な説明をしたいところだ。


IS: はっきりさせておきたいんだけど、Fedorがこれを一方的に行ったことには少し困惑している。io.jsが最適な方法ではないという呼びかけを継続して行うのは賛成だ。フォークの発行に伴ってアナウンスするのが理想的だと思う。


DS: Isaac はio.jsのメッセージの多くを語らないけど、ABにとっての反応を返す必要があるよね。


DC: ABからの統一見解は必要だと思う。


DS: ABのメッセージは絶対あったほうがいいだろう、issueの解決に向かって作業を進めているんだっていう事を見せた方がいい。


CS: 統一に向けてABとio.jsは一緒にメッセージを出せるかな?


SH: ABの背景にある理由はこういう問題に正面から取り組むことだ。私達がNodeをどうしたいのかを周りに見えるように並べていく必要があるんだ。コミュニティやエコシステム、それぞれをどうしたいのかを含めてどうしたいのか示す。このグループ内ではっきりさせた上で、明らかな主張を形作っていきたい。解決や進捗が素早いだけでは十分じゃない。これらの問題を解消する事に関心があるのか、フォークするのを妨げるような行為が正しいのか、コミュニティの分割はどうなるのか、私達はある一定のポイントまで信頼を構築していく必要があると感じているし、信頼関係を構築していくには、ここでもっとやりとりする必要があると認識しているio.jsの真のメッセージがあるなら見せて欲しい。


IS: 僕はたまたま両方のグループの中にいるとても独特な立場にいる。io.jsも一緒にメッセージを出していく必要があるし、継続的に発信していく必要がある。ただ共同声明を出すのは良いアイデアとは言えない。io.jsがABと関連が強いように見えてしまうだろう。io.jsにとってのモチベーションの一部はコミュニティ駆動で決めるっていうことであって、Joyentによって支配されているように見えたら意味が無い。もしこの関係が見えてしまったらJoyentを信頼していない人たちのいるコミュニティはさらに混乱してしまう。「Joyentと一緒に働いているコアコントリビュータは問題の解消に努めている」し、「io.js側もJoyentともう一度統一するゴールに向けて作業を始めている」と別々に言うべきだろう。


TM: ABはio.jsと同じ方向を向いてゴールを目指していると約束して、働きかけているというべきだろうね、io.js側のメンバーとももう一度作業したいと思っていると発信していこう。


SH: Fedorに理解してもらうように連絡してみるよ。聞く耳持たれなくても、彼と会話するようにしたい。私が代表だという自覚だけじゃなく、コミュニティと一緒にうまくやるためには一貫したメッセージを持っておく必要がある。彼と連絡することがプロジェクトの方向を正しく、ベストな方向に導く事になるだろう。

現時点ではまだScott Hammondからはio.jsに関する見解は発表されていませんが、なるべく統一に向けて意思を出していくこと、今後issueが放置されたりはしないようにNode.js側も改善に努める事を議論しています。それを受けて、Isaacもio.js側からもメッセージを出すことにするという方向になっています。和解がない訳でありません

現時点ではまだ議論中なのです。

なんでNode.jsのリリーススケジュールは滞ってしまったの?

ここですね。ここまで深堀りしている記事は無いので、ここからは僕の調査が始まった所です。
本当にいくつもの理由があると思われます。僕が調べきれているわけじゃないので、新しく明らかになった事実があれば随時アップデートしていきます。

また、わからない所は想像などで補完しているので事実とは異なる所もあるかと思います。

コアメンテナが抜けたこと

一番大きいのは Ben Noordhuis がメンテナから抜けたことじゃないでしょうか。彼は技術力もさることながら、リーダーシップを取りながらissueを捌くことに長けていました。githubの中の事だけじゃなく、MLへの精力的な解答など非常にコミュニティに尽くしてくれる人物でした。2013年末ですね。

時を同じくして2014年初めにIsaac SchlueterがJoyentから去って、npmの会社を設立します。ここからTJ Fontaineが新しいリーダーになります。

この二名がコアメンテナから抜ける事はNode.jsにとっては非常に大きな痛手でした。TJ Fontaineが悪役っぽくなっている記事を見かけますが、実際TJだけが悪いわけではありません。

2013年から2014年はNode.jsにとって大きな戦力ダウンで誰がリーダーになっても辛かったと思います。

もちろんJoyentも何もしなかった訳じゃなく、CLA(Contributors License Agreement)を書かなくてもコントリビュートできるように調整したりと色々策を講じますが、立て直しきれていません。

TJ Fontaine の役割が多い

TJ Fontaineは何もやっていない訳じゃありません。彼はコアメンテナであり、Node.jsのエヴァンジェリストでもあります。エヴァンジェリストとしての彼の活動は世界中にいるNode.jsの開発者への布教活動です。

Node on the roadと呼ばれるNode.jsを世界中のエンジニアに展開する活動が2014年の2月から行われていますが、そこに彼はひっきりなしに呼ばれています。

つまり世界中を飛び回っているわけです。それでIRCに呼びかけても捕まらないし、移動中であることが多くて活動が滞りがちです。手が止まってしまうことが多いのにはこういう背景もあるのです。

実際僕がnodeconf.euに行った時にTJ Fontaineと会って、ちょっとだけ話をしたんですが、

Q. Node学園祭に来れないのって何か理由あるの??

A. いやとにかく今スケジュールが全然読めないんだ、この前のnodeconfの時もアムステルダムに行って途中からしか参加できなかったんだ。とにかく移動時間ばかりでちゃんとした時間が確保できていないんだ。明らかになったらちゃんと連絡するから。

っていう感じでした。

プロジェクト体制の変化

元々JoyentがNode.jsを作ったわけじゃなくて、Ryan DahlがNode.jsを作り、それをJoyentがメンテナンス母体を作ろうという形で出資したのが始まりです。結果としてRyan DahlやIsaacsを含めた数名がJoyentの社員になり、Node.jsはJoyentの下で開発が進むことになります。

JoyentのビジネスはAWSGoogle Cloud Platform、Azureとかと同様のIaaS、PaaSを提供している所謂クラウドサービスです。別の言い方をすればAmazonGoogleMicrosoftの競合なわけです。

そんなJoyentがビッグカンパニー達と戦っていくのに取った戦略が、Node.jsを自分達の傘下に収めることだったのです。つまり、Node.jsのコンサルをしながらPaaSとしてNode.jsを主体としたサービスを提供することで、言語・OSレベルでサポートできる環境を作るという計画です。

実際に、JoyentはNode.jsのコアメンバーを自社に入れる時、"no.de"と呼ばれるPaaSを計画している事を明かしています

ただ実際はこの"no.de"は2012年末にクローズします。同じ時期に出たNodejitsuの方が人気が出てしまったので、そちらに移行する方向でクローズしました。

こういうプロジェクト体制が変わったことも少なからずチーム体制に影響を与えていると思っています。もしも"no.de"がうまく行っていれば、社内にもう一つNode.jsの運用チームができて、そこでNodeコアチームから知識を継承できる、良い細胞循環できるようなチーム作りができてたのでは、と思っています。

結局Node.jsが滞ってしまっている要因は?

  • コアメンテナの中でも強大な二人が抜けていること
  • TJ Fontaineの役割が多いこと
  • no.deの頓挫とそれに繋がるJoyent内のNode.jsメンテナのリソース不足

の3点位が挙げられるんじゃないかと思います。

結局どうすればいいの?

今回の騒動を受けて、Joyent側もAdvisory Boardを設置し、オープンガバナンスによる透明性確保に努めています。

Node.js側も着実に良い方向に進んでいると思っています。ただし、io.jsの方が今のところ、どうしても速度が早いし、新しい方が好きな人にとっては受け入れられやすい可能性があります。

逆にNode.jsのほうが安定しているのでエンタープライズ向きではあります。Strong LoopというNode.jsコンサルを行っている会社もNode.jsは継続的にサポートをするけど、io.jsの方はtoo early なので今すぐにはサポートしない、という形で静観を決めています。

どちらを選ぶかはその目的によって決めて下さい。安定したプロダクトで使うなら、今はまだNode.jsで良いと思います。そうじゃなくて新しい機能を積極的に使っていくなら、io.jsを使ってみるのも良いのではないでしょうか。

ただ、先ほどのミーティングでもあったように、将来的に和解して、また取り込まれる可能性もあります。個人的にはまだ静観する姿勢でいいかなと思っています。

io.jsのリリースは 1/13 のFedor Indutnyの誕生日に行われる予定です。その時にはまたもう少し動きがあると思います。

もしもio.jsが主流になったら東京Node学園って名前どうするの?

Node.jsもio.jsもどちらも実行ファイルがnodeである以上は東京Node学園のまま行きます!
次回の東京Node学園は2月開催予定です。その時にはもっと状況は変化してそうですね。

まとめ

  • io.jsの概要とio.jsの目的
  • io.jsとNode.jsの違い
  • io.jsに関するJoyentの現時点でのスタンス(和解の道へ)
  • Node.jsのコミットが滞った理由

これら今皆さんが抱いているであろう疑問に回答しました。

2014年のNode.jsは本当激動ですが、2015年もこの激動は変わらないでしょう。ただひとつ言えるのは、ここまで大きくなったnodeがコミュニティが分裂して終わりになるみたいな事は誰一人として望んでいないし、良い方向に進んでいけるといいなと思います。

何か意見があればissueで聞いてみてください。英語が得意じゃなければ僕に意見を下さい。日本からもNode ForwardAdvisory Boardに意見が言えるようにしていきたいと思っています。

*1:木星にある衛星はギリシャ語ではイオですが、英語読みでアイ・オーらしいです。コミュニティのメンバーがアイ・オーと呼んでたのでアイ・オージェイ・エスで間違っていないと思います。