2/16(日)に Object Oriented Conference 2020 に行ってきました。 募集は随分前でしたが、ずっと楽しみにしていたカンファレンスでした。
聴講セッション
聞きながらのメモ等はツイートに返信していく形で書いています。
タイムテーブルを見ても、どの発表も聞きたいものばかりで選ぶのが辛かったです。
keynote: Object-Oriented Diversity
つづいて、成瀬さんの基調講演「keynote: Object-Oriented Diversity」https://t.co/zLgL7g4tMC#ooc_2020 #ooc_a
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
つづいて「DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか 」を聴きます!https://t.co/AAzRZpBAH9#ooc_2020 #ooc_b
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
Chatworkのドメインをモデリングした
つづいて、ランチセッション1つめの「Chatworkのドメインをモデリングした」を聴きます!https://t.co/ZSqx1Llisn#ooc_2020 #ooc_a
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
VOYAGE GROUP流開発文化
つづいてのランチセッションは「VOYAGE GROUP流開発文化」!https://t.co/XfdkCEHPBi#ooc_2020 #ooc_a
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
READYFORにおける複雑なドメインとレガシーシステムとの戦い方
つづいてのランチセッションは「READYFORにおける複雑なドメインとレガシーシステムとの戦い方」!https://t.co/wGFF2J1S3U#ooc_2020 #ooc_a
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
数理的システム設計-ビジネスと技術制約を繋ぐ手法-
このまま引き続き、Hall A で「数理的システム設計-ビジネスと技術制約を繋ぐ手法-」を聴きます!https://t.co/cg9VK0IAl6#ooc_2020 #ooc_a
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
概念投影によるオブジェクト指向設計の考え方とその方法
つづいて「概念投影によるオブジェクト指向設計の考え方とその方法」を聴きます!https://t.co/zypDDdVPL8#ooc_2020 #ooc_b
— おかしょい@3/21 Laravel JP Conference 来てね (@okashoi) 2020年2月16日
「モジュールとしてのマイクロサービス」と「分割単位としてのドメイン」について考える
以下、携帯の充電が切れたためツイートが出来なかったので、ローカルでメモを取っていました。
- 割り勘のドメインエキスパートこと、かとじゅんさん
- マイクロサービスは何か?を突き詰めていくと、広義には部品のこと
- モジュールもオブジェクトの一種
- 50年来、ソフトウェア以外の領域でも「モジュール化」について取り組まれてきた
- マイクロサービスアーキテクチャとは、単一のアプリケーションを小さなサービス群を組み合わせて構成する設計手法
- Web APIなどの機構を介して相互通信する
- 関心事によって分割されていく
- 潤沢な計算機リソース、クラウドサービスの台頭によって、実現できるようになった
- 一枚岩のアーキテクチャでは変更の影響範囲を特定するのに時間がかかってしまう
- 「依存が飛び散ってしまっている」
- 結果、テストの範囲が広くなってしまいがち
- 分業形態による問題、コンウェイの法則だ
- バッチ処理にあわせて堅い言語を使いたい、のような要求にあわせた適切な技術選択が難しくなる。
- 「自己組織化出来ない」
- マイクロサービスアーキテクチャによって、コードやDBも共有しない独立したコンポーネントになった
- 問題として、横断的な処理・業務フローがあった場合に、ひとつのトランザクションに閉じられなくなってしまう
- マイクロサービスアーキテクチャの特徴
- サービスを通じたコンポーネント(古い言い方で「モジュール」)化
- モジュールの歴史
- ハードウェア、ソフトウェアを構成する個々の部品。
- モジュールの例
- 数の加算的グループの部分集合
- モジュールは入れ子構造を持つ
- 複雑性を軽減するために使ってきた手法である
- 数の加算的グループの部分集合
- モジュール間では独立している
- 関心が強いものは凝集、関心が弱いものは分離する
- PHPだと全てがpublicなので辛い。。。
- モジュール化できない
- 全てをpublicにするのはモジュールではない
- 「専門的な知識を持たずに、労力だけを得るのが目的」
- 明示的な情報≒インターフェース、プロトコル
- 事前に合意されていなければいけない
- 容易に変更できない
- これが守られていれば、内部の変更をいちいち隣にお伺いをたてる必要はない
- 明示的なデザイン・ルール
- 隠されたデザイン・パラメータ
- 「モジュール化されていないとベロシティが維持できない、アジャイルになれない、アジリティが担保できない」
- 「モジュールがアジャイルを支える基盤になる」という考え方、いいなあ
- WIKISPEED→ハードウェア領域でスクラムをやっている
- モジュール化のオペレータ=設計の手段
- 上位・下位を意識すること
- 置き換える際に、他のモジュールは変更を関知しない
- 包括的なデザインルールが担保しているため
- モジュール型製品の場合、横断的な問題(例:静かさを向上させようとする)に取り組む際には、異なるチームどうしで連携する必要がある
- モジュールPOどうしがメタスクラムをやることがある
- モジュールの中に閉じた設計改善は密にコミュニケーションをとっていく
- モジュール間で設計の改善(デザインルール自体の改善)をする際には疎なコミュニケーションにする
- 「ソフトウェア開発はドメインとを中心にしなくても可能だが、それではビジネス変化に適応できない」
- ドメインがモジュールの分割基準になるか?→必ずしもそうではない
- 問題の領域と解決の領域(境界づけられたコンテキスト)は異なる
- 「ソフトウェアは会話でできている」
- 分割はビジネスの変化に対応できるようになるが、システムは複雑になる
- 過剰な分割することで、変更に弱くなる、保守性が落ちることにつながる
- フィードバックを得ながらいい落とし所を探っていく
- モジュラー・モノリス、構造化されたモノリス
- 分け過ぎたら戻すのは大変、もどせない
- フロントエンド・モノリスが新たな課題
- その解法のひとつにマイクロフロントエンドがある
- Spotify, IKEAくらいしかやってない
- 「YAGNIを真面目にやりすぎると、大きなコストに直面する」
オブジェクト指向プログラミングの現在・過去・未来
- 増田さんがオブジェクト指向プログラミングに向き合った内容
- 増田さん、どんな言語も好き
- 「オブジェクト指向プログラミングとはなにか?」
- 「簡単なこと。これが難しくなってしまうような捉え方をしてしまうのが問題。」
- データの抽象化
- 抽象データ型が導くモジュール構造←手続き型プログラミングと分ける決定的な違い
- 厳密にはここまでは抽象データ型プログラミング
- OOPはそこにポリモーフィズムを導く部分型、動的ディスパッチが加わる
- 抽象データ型が導くモジュール構造←手続き型プログラミングと分ける決定的な違い
- 「型」と「モジュール」という考え方でOOPを捉える
- 「型」をプログラミングの単位にする
- 過去、現在、未来(2, 30年先)変わらない
- 公理型と定義型の考えにつながる気がする
- 型 = 値に対して何を実行できるのか + 有効な値の範囲
- 制約と振る舞いの話っぽい
- 型 = 値に対して何を実行できるのか + 有効な値の範囲
- 抽象化するから本質を抜き出さないといけない
- 型・データ抽象は思考の話であって、実装の話ではない
- クラスはその実装手段
- 型とクラスとモジュールが一致しているのがOOP
- OOPを乱暴に単純化すると「型というものを意識しながらプログラミングすること」
- 型は可能な範囲を制限するより、可能な操作を定義することが本質
char[]
→ 具体的なデータ表現string
→ 文字の配列への可能な操作
- プログラミングが楽で安全になる
- ただ、これをやりたいがために抽象データ型が提唱されたわけではない
- データ抽象(型)で何が嬉しいか?
- 型は問題領域を記述する「語彙」を提供する
- 型は計算のアイデアの表現である
- 型は問題領域の記述とプログラムの構造を直接的にマップする
- 型はソフトウェア仕様の記述手段である(自己文書化)
- 型で関心事を明示的に表現する
- OOから生まれたアジャイルの発想→型で仕様を記述せよ
- 意図の表現の手段が「型」
- 型を使った契約による設計は、ソフトウェアの信頼性を向上させる
- FORTRANの功績、ビット列を整数型と実数型に分類して扱えるようになった
- class構文を使った手続き的なモジュール構造が流行ってしまった
- ジェネリクスの登場等で2004年、Javaは真にオブジェクト言語になった
- OOADは型を見失ったために、普及しなかった
- オブジェクト指向プログラミング自体の進化
- IDEの恩恵があって使えるプログラミングスタイルである
感想など
テーマ自体が「オブジェクト指向」と抽象度の高いものなので、必然的にトーク内容も抽象度が高いものが揃っていました。 抽象度が高いということは、広いケースに適用できる(対象ドメインやプログラミング言語などに依存しない)一方で、理解も容易ではありません。
今回さまざまなセッションを聴講していて、私自身はまだまだ抽象概念を理解するための知識や思考の整理が足りていない、ということを痛感しました。 最近はずっとプラクティカルな議論・思考に終始してしまっており、フィロソフィカルな議論・思考をする足腰がすっかり弱まっているのを感じました。 これからしばらくは、インプット量を増やしつつ思考を深める、というプロセスを重んじたいと思います。
最後に、このような気づきを与えてくれたカンファレンスが開催されたことに感謝の気持ちを表明したいです。 これもスタッフの方々、ならびに協賛してくださったスポンサー各社様のおかげです。 本当に、ありがとうございました!