下記動画の内容のメモと所感
英語とElixirの学習用メモなため、解釈に誤りがある可能性があります。
この内容は参考程度に押さえて基本的に動画を参照してください。
現状のElixir/Phoenixのアーキテクチャに対しての下記の発表となる。
問題提議
その解決方法の提案
解決方法は下記の通りの提案となる
知っての通りElixir/PhoenixはErlangとRailsを元に作成されている。
ただ、いくつかの良くないところも継承してしまっているのが現状だ。
Applicationという名称だが、Erlangからこの名称は持ってきたが失敗だ。
様々な意味を包括していて結局は何を指しているかがわかりにくい

コンフィグを他のApplicationにも持たせなければならない。

上記の例で述べるとPaymentMakerのコンフィグをAppOne/AppTwoに持たせないとならない。
もちろん行いたいのはPaymentMakerにのみコンフィグを持つことだ。
GenServerの実装は1つのModuleに3つの内容を含んでいる
APIServerImplementationわかりにくい。俗に言うdog food、つまりゴチャ混ぜなコードだ。

14:36

左がRailsで右がPhoenixだ。
ほぼ同じ構成になっている。ただ、なんでlib?
wooble.exなんて大抵のprojectではhello worldが書いてあるだけなんじゃないか?
無駄が多すぎる。

Component structureでは下記のように提議していきたい。
Library … stateを持つようなprocess がないComponent … stateを持つようなprocessがあるAssembly … configuration であり、Library / Componentを束ねた可搬的なひとまとめ
22:23

23:01
上の規則に従うと Phoenix Applicationではなくて、Phoenix Componentとなる。
また、Phoenixにビジネスロジックが何個あるかべきか?0個だ。
Phoenixは純粋なView Layerであるべきだ。
なぜなら PhoenixはInterfaceであり、InterfaceにBusiness Logicは書かないだろ?
ビジネスロジックである実装は更にバックエンドに記述するべきだ。PhoenixはWebServerなんだ。

例として1つのGenServerがある。

Componentを使えばこれだけで済む。

内部的にはGenServerをジェネレートしているわけだが、コード量は劇的に減少するだろう。
そして、Componentを使って簡略化しても元のコードからは何も情報は失われていない。
以前としてGenServerであるが、すべてを書く必要がなくなるわけだ。

なんでフォーマット用configファイルである.formatter.exsがtop levelにあって、実装したいメインプログラムであるstack.exsがtop levelにないんだ?おかしくないか?

これで十分だろう。ただ、もしstack.exが複雑になってきたらどうするかって?

そのときになったらサブディレクトリを足してpopper.exやpusher.exのように機能別にファイルを作っていく?違う。私は1つのstack.exに収めたいんだ。
もし、stack.exが複雑になってきたら?componentレベルで分割するんだ。
つまり、数多の小さなcomponentを組み合わせていくわけだ。
これによって、再利用性とメンテナンス性があがるはずだ

現状では、componentで良いデプロイ方法はElixir には存在しない。
紹介しよう!Noddyだ!デプロイメントにはNoddy(NODe Dynamic management)を使う。
(ここでいうNodeはServer上で稼働しているErlangVM上のNodeで、Serverと考える)
Node毎にどのComponentをデプロイするかを定義できるElixirでの開発課題をより簡単にしていきたい。
最終的には誰もが3分でComponentを作成してデプロイでき、そして他の開発者もそのComponentを再利用できる。そんな未来が来るだろう。
GenServerを書いたり読んだりするが、1つのファイルに対してどうしても手続き的なコード量が多くなってしまう問題は以前から感じていただけに、Componentが実用化されればGenServerのコード量という問題点はかなり解決できるのではないか、と感じられた。
Component Structureが導入されるためには、現状Noddyも作成中な上、既存のPhoenixの構造から大幅な変更が発生するため、導入障壁と所要時間のハードルが高そうに感じる。