2025-04-23 Rebuild: 97 のメモ
Rebuild.fm #97 を聞き直したのだけど、学びが多かったのでその内容をメモする。
Rustをある程度書いた後に、この森田さんのRust回を聞くといろいろと話が繋がって勉強になった(2015年の収録) » Rebuild: 97: Minimum Viable Standard (omo) https://t.co/aBek0PaXaZ
— toshimaru (@toshimaru_e) April 2, 2025
97: Minimum Viable Standard (omo)
💭 は筆者の補足メモ。
マイクロサービス問題
- Martin Fowler氏いわく: Monolith First
- Martin Fowler「ちょっと言ってみたかっただけ」
- 「まずはモノリス、必要であれば分割、という順番がええんやで!」
- モノリス思想のDHHは正しいという話
- Martin Fowler「ちょっと言ってみたかっただけ」
- Don’t start with a monolith
- マーチン・ファウラーじゃない人が書いている
- 反対側の言い分の記事を載せている
- 20年以上 分散システムやっている人
- CORBA 好きとか言っている人って..
- 分散システムでサイトを作った!って言っているけど作り直し(version.2)のプロジェクトだった
- Martin Fowler「分散システム第一原則: 分散するな」
- 💭(この記述ことと思われる
-
the First Law of Distributed Object Design: “don’t distribute your objects”. Microservices and the First Law of Distributed Objects
-
- 💭(この記述ことと思われる
- ソフトウェア開発というのは問題を理解するプロセス
- でかいエンタープライズのシステムを作るときはよく考えなきゃいけない
- モノリス(Rails)でもけっこう戦える
- MVC でディレクトリをを切っている
- Model-View-Controller の境界はファイルシステムからはっきりわかるが、機能の境界がわかりにくい
- 💭(Railsの機能境界は namespace (
module
) を適切に切るのがGood Practice)
- MVC でディレクトリをを切っている
- マーチン・ファウラーじゃない人が書いている
Rust
- v1.0 が出たので遊んでいる
- 何?
- Mozilla が作っている静的型付け言語
- コンパイルすると実行ファイルができるGoのような言語
- Mozilla
- C++ でブラウザを作っている
- but C++ が辛いと思っている → なんとかしたい!
- 様々なチャレンジをしてきた
- メモリリークが多いので、C++にGCつける → 失敗
- 戻り値でエラーをつけるのが厳しいので、例外を導入しよう → 失敗
- 結論: 全部作り直すぞ! → Rust
- C++ でブラウザを作っている
- 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はライブラリとしてある
- リファレンスカウントは大体しなくていいケースが多い
- オブジェクトの持ち主は大体一人
- オーナーシップを共有する
- オーナーシップを明示できれば、リファレンスカウントは不要
- Go も Rust も C++ 書きたくない人向けの言語という意味では共通
- 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
- Emscripten
- https://github.com/emscripten-core/emscripten
- Asm.js を吐くための C++ のツールチェイン
- 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)の使用が推奨されている)
- Google はフレームワークじゃないと言っているが、フレームワークみたいなもん
- 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>
と同様の挙動です。
- Polymer は2つの性格を持っている
- Web Components を推し進めるためのライブラリ
- Material Design の reference implementation となった
- polyfill の poly とは全く関係ないよ
- shim という意味が近い
template
というタグができた- <template>: The Content Template element - HTML: HyperText Markup Language | MDN
- template の中身は何も解釈されない
- 遅延評価
- 昔は
script
タグでハックしていた- script の中に script を置けない