Rebuild.fm #97 を聞き直したのだけど、学びが多かったのでその内容をメモする。

97: Minimum Viable Standard (omo)

💭 は筆者の補足メモ。

マイクロサービス問題

  • Martin Fowler氏いわく: Monolith First
    • Martin Fowler「ちょっと言ってみたかっただけ」
      • 「まずはモノリス、必要であれば分割、という順番がええんやで!」
    • モノリス思想のDHHは正しいという話
  • Don’t start with a monolith
    • マーチン・ファウラーじゃない人が書いている
      • 反対側の言い分の記事を載せている
      • 20年以上 分散システムやっている人
        • CORBA 好きとか言っている人って..
      • 分散システムでサイトを作った!って言っているけど作り直し(version.2)のプロジェクトだった
    • Martin Fowler「分散システム第一原則: 分散するな」
    • ソフトウェア開発というのは問題を理解するプロセス
      • でかいエンタープライズのシステムを作るときはよく考えなきゃいけない
    • モノリス(Rails)でもけっこう戦える
      • MVC でディレクトリをを切っている
        • Model-View-Controller の境界はファイルシステムからはっきりわかるが、機能の境界がわかりにくい
        • 💭(Railsの機能境界は namespace (module) を適切に切るのがGood Practice)

Rust

  • v1.0 が出たので遊んでいる
  • 何?
    • Mozilla が作っている静的型付け言語
    • コンパイルすると実行ファイルができるGoのような言語
  • Mozilla
    • C++ でブラウザを作っている
      • but C++ が辛いと思っている → なんとかしたい!
    • 様々なチャレンジをしてきた
      • メモリリークが多いので、C++にGCつける → 失敗
      • 戻り値でエラーをつけるのが厳しいので、例外を導入しよう → 失敗
    • 結論: 全部作り直すぞ! → Rust
  • Servo
    • Mozilla が作った実験目的のブラウザ
  • ブラウザの脆弱性
    • プログラムのミスによる脆弱性がほとんど
    • 安全に静的にかつ速く実行する言語がほしい
      • プログラム書くのは大変だけど、C++ほど辛くない人向け
  • Goよりも言語機能がすごく多い
    • Go は引き算の発想で言語機能少ないことがいいとされている
    • ジェネリクスがある
      • 💭(今現在はGoにもジェネリクスがある)
  • Go vs Rust
    • Go も Rust も C++ 書きたくない人向けの言語という意味では共通
      • ただ使うモチベーションが異なる
    • Goはサーバーを書きたくて作った
      • 分散システムを作りやすいような言語
      • C++ が嫌いな人向け
      • Goでブラウザを作るのは大変そう
    • Rust ブラウザを作るための言語
      • ブラウザを作りやすいような機能・ライブラリが豊富
      • C++ が好きな人が作っている印象
        • Rust作者はMozillaから転職してC++を書いている
      • 作った人は分散システムはあまりわかっていなさそう
        • このへんはコミュニティの人が頑張る必要がある
      • GCがないが、メモリリークはしにくい
        • Stop the world がない
        • マーク・アンド・スイープGCはないが、リファレンスカウントGCはライブラリとしてある
        • リファレンスカウントは大体しなくていいケースが多い
          • オブジェクトの持ち主は大体一人
          • オーナーシップを共有する
          • オーナーシップを明示できれば、リファレンスカウントは不要
  • Rust v1.0 が出た
    • 言語仕様は壊さないよという宣言
    • 実用的なものをサッとサクっと書けるかというとそうでもない…
      • みんながんばってライブラリとか作ってこうぜ!
  • 定期リリースがよい
    • 6ヶ月ごとのリリース
    • Chromeとかもそういうポリシー
    • 質 vs 量 vs 速度 のトレードオフがあったときに、品質と速度を取る
      • 機能が出来なかったときは入れない
    • 作り途中の機能はフラグで隠すことができる
      • 普段は使えない
      • 使いたい人はフラグをONで使える
      • 💭(現在ではだいぶ浸透した「フィーチャーフラグ」の概念だ…!)
  • Rubyからホットスポット部分のみをRustで書くのはアリかも…
    • LL利用ユーザーにはC++やCを書くのは辛いので、マッチするケースあるかもしれない
  • Servo は Rustで書かれている

Web Assembly

  • Asm.js → Wasm(WebAssembly) の系譜
    • asm.js の標準化
    • From ASM.JS to WebAssembly – Brendan Eich
    • 💭( asm.js = JavaScriptのサブセット(限定された構文)で書かれた、パフォーマンス最適化されたコード形式です。Mozillaが中心となって開発し、ネイティブコードに近い速度で実行されることを目指している
  • PNaCl
    • 💭(Googleが開発していたが後に廃止された
    • Google Native Client - Wikipedia
      • Google Native Client(ネイティブクライアント、食塩を意識してNaClと略される)は、ネイティブコードを安全に、しかし効率的に実行することを目標とした、サンドボックスを中心としたフレームワークである。

        現在はプロセッサアーキテクチャ非依存の Portable Native Client (PNaCl) もあり

        WebAssemblyの普及に伴いそちらにリソースを集中するため開発を終了し、2019年にChromeから削除されることを発表。2023年に削除された

  • Emscripten
  • Dart
    • JavaScript の代替が欲しいというモチベーション
    • Wasm はJS自体は否定はしていないが、遅いからもっと速くしたいというモチベーション
      • 「速いコードが書ける言語は大体ろくでもない言語」
  • WebAssembly を吐くクールな言語、Rust との立ち位置はある
    • Rust → LLVM 中間表現(IR: Intermediate Representation)→ Wasm
  • WebAssembly は DOMは触れない
    • 現時点では Message Passing のユースケースが良さそう
  • LLVM は超重要テクノロジーである
    • Swift も LLVM
  • 標準化といいつつ、MVPといっている
    • Lean Standard とも言うべき概念
    • 最初から完璧を目指さず とりあえず v1 を出してコミュニティの反応を待とう

Polymer

The Polymer library is in maintenance mode. For new development, we recommend Lit.

  • About Polymer 1.0 - Polymer Project
    • Google はフレームワークじゃないと言っているが、フレームワークみたいなもん
      • React.js もフレームワークを自称していないけど、一緒のようなもん
    • Web Components というweb標準を最大限活用しようぜ、というライブラリ
      • 💭 (GoogleのPolymerは、Web Componentsの仕様に基づいて、再利用可能なカスタムHTML要素を簡単に作成できるようにするためのJavaScriptライブラリ
      • 💭(現在、Polymerライブラリはメンテナンスモードにあり、新しい開発は推奨されていません。代わりに、より軽量で高速なライブラリであるLit(旧称LitElement)の使用が推奨されている)
  • Custom Element
    • 好きなタグを作れる
    • Facebook の web ページ設置型の like ボタンとかかなり無理している
      • 特定の文字列を iframe などのタグにJSで置換している
      • タグ単位の再利用性を高めたい
  • Shadow DOM
    • 平たく言うと iframe の軽いやつ
    • Input type=date とか type=color とか
      • DOMで出来ているが、JSからはそのDOMは視えない
    • 裏でこっそり複雑なDOMがありつつ、表からは視えなくする
    • HTML imports
      • 💭(これは廃止された
      • HTML Importsは、あるHTML文書から他の文書の内容を読み込んで使用するための機能です。一時期Google Chromeに実装されましたが、既に廃止

        一方で、<link rel="import">はそのようなモダンなデザインになっていなかったのです。インポートされた子文書がロードされ、その中の<script>が実行されるまで、親文書のロードが止まってしまいます。これは、deferが無い<script>と同様の挙動です。

        HTML Imports|Web仕様 廃墟探訪

  • Polymer は2つの性格を持っている
    • Web Components を推し進めるためのライブラリ
    • Material Design の reference implementation となった
    • polyfill の poly とは全く関係ないよ
      • shim という意味が近い
  • template というタグができた