by shigemk2

当面は技術的なことしか書かない

Node.js vs Play #ScalaMatsuri

LinkedIn Yevgeniy Brikman

Node.jsもヘビーに使っていた

express

Node.js vs Play 比較

Node.js

学習
  • Node.jsの学習は簡単
  • 6行書くだけでスタートできる
  • express.jsは8行
  • nodeを実行するだけでサーバが起動
  • 本もいっぱいある
  • APIのドキュメントも整備されている
  • Stack Overflowもおすすめ
  • Node.jsの学習曲線は緩やか
開発
  • URLパラメータやパースパラメータを抽出出来る
  • プラグインがある
  • ただ、XML処理などはライブラリを自分で探す必要がある
  • キャッシュに関しては内部でやるのでおすすめしない
  • socket.ioは強い
  • プラグインを揃えて使う
テスト
  • テストは満点
セキュリティ
  • CSRFはデフォじゃない
  • Node.jsにはevalがあるが、evalとかsettimeoutには致命的な脆弱性がある
ビルド
  • npm(コミュニティが大きい)
  • 複雑なビルドの場合はGruntとかを使う
  • 学習曲線は緩やか
デプロイ
  • ホスティングサービスはすごい充実してる
  • let it crash気味なので再起動は必須
  • monitで死活監視したりする
  • デプロイは一応全部Node.js内で出来る
  • nginxなどのサポート
デバッグ
  • 満点
  • IDEでデバッグ可能
スケーリング
  • ベンチマークは早い
  • 複数のデータアクセスの場合はNode.jsのほうが早い
  • non-blocking
  • ひとつでもblockingな呼び出しがあれば死ぬかもしれない
メンテナンス
  • JSはいたるところにあるので、情報やコードが入手しやすい
  • JSも関数型書けるよ!
  • ロボットでもJSをかけるよ
  • ソースの共有も可能
  • コアは安定している
  • 型がはっきりしないのは地味にエグい
  • メンテナンスは苦痛
  • スコープのルールが壊れているし、block scopeなんてないからメンテ性ない
  • コールバック地獄
  • コアは安定していてもライブラリは不安定
  • thisにいろんな意味があるのは悪夢
コミュニティ
  • Node.jsのほうがStackOverflowの質問数は多いけど、それはNode.jsがわかりにくいため、かつユーザー数が多いため
  • 雇用数は多い

Play

学習
  • いきなり35行のファイルやらフォルダやら
  • とにかくファイルがいっぱい
  • サノバビッチ
  • sbtがjarをいろいろとダウンロード
  • Activatorテンプレートはサンプルコードも含む
  • 学習曲線はNode.jsに劣る
  • 本は少なめ
開発
  • 静的型づけ
  • Scalaにコンパイル
  • SQLだとPlayに軍配が上がる
  • DB系ライブラリの出来は良い(NoSQLだと同じ感じ)
  • フルスタック
  • クライアントサイドは自分で書かないといけない
テスト
  • テストは満点
セキュリティ
  • CSRFはデフォじゃない
  • evalな脆弱性は少ない
ビルド
  • sbt(インタラクティブなビルドツール)
  • 学習曲線は厳しい
  • Ivyで依存性を管理。でもIvyは遅い
  • Rhinoはとても遅い
デプロイ
  • ホスティングサービスは多くない
  • (nginxをかます必要があるかも)
デバッグ
  • ブラウザ上に表示
  • ツールも豊富
スケーリング
  • ベンチマークは早い
  • non-blocking
  • JDBCでブロック
メンテナンス
  • 学習曲線は厳しいが高い生産性を維持できる
  • 型システムはありがたい
  • 表現がいい
  • 20年選手JVMで動いている
  • 同期か非同期か自分で選べる
  • コンパイル遅い
  • コールバックヘルもない
  • sbtでインクリメンタルコンパイルができる
  • Scalaは複雑
  • Playは安定しているけど後方互換性がない
  • 成熟しているとはいえない
  • Playのバージョンアップはライブラリ群のバージョンアップを伴う
コミュニティ
  • 第20位の言語(比較的マイナー)
  • TypeSafeの運用サポート
  • Javaのライブラリが使える

ただし、web frameworkの評価は総合的に行う必要がある