Goとクリーンアーキテクチャ DMM.go#2

Goとクリーンアーキテクチャ DMM.go#2

「DMM.go」と題して、DMM GroupにおけるGoの勉強会を開催しています。
DMM.go #2の中でGoとクリーンアーキテクチャについて話したスライドになります。

A9ebd94d32f7e4abc9925234343ad774?s=128

Jyashin

May 15, 2020
Tweet

Transcript

  1. © 2020 EXNOA LLC とクリーンアーキテクチャ EXNOA プラットフォーム開発本部 PFシステム部 岡崎 翔悟

    2020.05.15
  2. © 2020 EXNOA LLC は に社名変更しました 2020年4月10日付で「合同会社DMM GAMES」から「合同会社EXNOA(エクスノア)」に社名変更しました。 一般のブランド名としてDMM GAMESは残っています

    一般作品 R18作品
  3. © 2020 EXNOA LLC • 岡崎 翔悟( ) 合同会社 プラットフォーム開発本部

    システム部 グループ バックエンドチーム • っぽい立ち回り • 新卒として入社( 年目) • その間分社化したり社名が変わったり • 愛称は邪神 自己紹介
  4. © 2020 EXNOA LLC 本日のアジェンダ でクリーンアーキテクチャの思想を活用している話をします • 技術選定 • クリーンアーキテクチャとは

    • とクリーンアーキテクチャ • での開発
  5. © 2020 EXNOA LLC 技術選定 でクリーンアーキテクチャを実践すると決める要因

  6. © 2020 EXNOA LLC 今回の対象 ゲームプラットフォームの システム • 一般的な サービス+ゲームデベロッパー向けの

    (課金とか会員等のプラットフォーム機能の提供) 特徴 • 高負荷 ◦ 最大で • システムから見た時にアクターが多い ◦ ユーザー、ゲームデベロッパー、運営
  7. © 2020 EXNOA LLC 現状抱えている問題 • 全体的なシステムの老朽化 • 画面手動なリポジトリ構成 ◦

    ドメイン駆動設計できてない • モノリシックな開発では限界 ◦ マイクロサービス化しないと成長できない段階 • フロントエンドとバックエンドが密結合 • さらにクラウド移行を進めたい
  8. © 2020 EXNOA LLC 解決手法 • コンテナ化 ◦ • コンテナオーケストレーションツールの利用

    ◦ • ドメイン駆動設計 ◦ 開発思想 ◦ 戦略的設計 ◦ 戦術的設計
  9. © 2020 EXNOA LLC クリーンアーキテクチャとは の話?もうちょっと待つんだ

  10. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか • 図はあくまで具体例の つ ◦ 関心を

    や 、 と 分離する ◦ レイヤーを図のように 分割する この図を守るということが クリーンアーキテクチャの本質ではない
  11. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか • 重要なのは関心の分離 • 分離を実現する各レイヤーの依存ルール ◦

    図で重要なのは矢印(ベクトル) 依存性は内側(上位レベルの方針)だけに向 かっていなければいけない 達人に学ぶソフトウェアの構造と設計 角 征典 高木 正弘
  12. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか • 具体的なアーキテクチャとの関係 ◦ レイヤード ◦

    ヘキサゴナル ◦ オニオン ◦ これらのアーキテクチャはどれも細部は異なるけれど も、とてもよく似ている。これらはいずれも同じ目的を持っ ている。関心の分離だ。 これらはいずれも、ソフトウェアをレイヤーに分けることに よって、関心の分離を達成する。 クリーンアーキテクチャ 翻訳
  13. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか アーキテクチャのルールはどれも同じである! 達人に学ぶソフトウェアの構造と設計 角 征典 高木

    正弘
  14. © 2020 EXNOA LLC 関心の分離によって得られるもの • フレームワーク独立 ◦ フルスタックなフレームワークを必要としないし、依存しない •

    テスト可能 ◦ 単に可能ではなく、外部要素に囚われずにテストができる • 独立 ◦ ビジネスルールの変更なしに を置き換えられる • データベース独立 ◦ データベースを容易に交換することができる • 外部機能独立 ◦ ビジネスルールは外側について何も知らなくていい クリーンアーキテクチャ 翻訳
  15. © 2020 EXNOA LLC 関心の分離によって得られるもの まさに邪神が求めていた力 わーい

  16. © 2020 EXNOA LLC とクリーンアーキテクチャ はクリーンアーキテクチャの思想を活かせるのか?

  17. © 2020 EXNOA LLC とクリーンアーキテクチャ • クリーンアーキテクチャは特定の技術に依らない ◦ 特定のプログラミング言語に依存することはない •

    フレームワークの選び方は気をつける必要がある ◦ フレームワーク独立の思想に反するので ◦ フルスタックのフレームワークとはあまり馴染まなそう • は基本的に標準パッケージで事足りるようにするという思想 ◦ フレームワークとして提供されるものも薄いものが多い ◦ クリーンアーキテクチャと親和性が高い (ちなみに を選択した理由はこれだけじゃないのですが話が散らかるので割愛)
  18. © 2020 EXNOA LLC ディレクトリ構成例 application/ ├── entities │ └──

    employee.go ├── infrastructure │ ├── config.go │ ├── router.go │ └── sqlhandler.go ├── interfaces │ ├── employee_controller.go │ ├── employee_controller_test.go │ ├── employee_output.go │ ├── employee_repository.go │ └── sqlhandler.go ├── main.go └── usecases ├── employee_interactor.go ├── employee_repository.go └── mocks └── EmployeeRepository.go • は 内 ◦ ◦ ◦ ◦ • リポジトリの中に複数の サブドメインがある場合 ◦ の下に つ階層を作る ◦ もしくはリポジトリを分ける
  19. © 2020 EXNOA LLC 依存ルールを守った境界のまたぎ方 依存関係逆転の原則 だとインターフェースを使う https://play.golang.org/p/lqekXnQNKut

  20. © 2020 EXNOA LLC 依存ルールを守った境界のまたぎ方 • こうではなく ↑ • こうする

    ↓ ↑ https://play.golang.org/p/lqekXnQNKut
  21. © 2020 EXNOA LLC を使った開発 感想とか

  22. © 2020 EXNOA LLC を使った開発 • 言語として提供されるフォーマット ◦ 複数人開発で、書き方での差分が出ないのでとても良い •

    言語として提供されるパッケージ管理 ◦ 便利 • 後方互換性の高さ ◦ ちゃんと互換性を持ったマイナーバージョンアップ • 学習コストの低さ ◦ 自体を覚えるのはそう難しくない(と思う) ◦ 難しいのは設計やアーキテクチャ、ドメイン分析
  23. © 2020 EXNOA LLC を使った開発 • 激動の時代 ◦ 多種多様なアーキテクチャから選定しないといけない場合が増えた ▪

    メリットを享受できないのにフルスタックなフレームワークを使うと困る ◦ 以外にもいろんな が使える時代 ▪ ◦ 分散システムが(つらいけど)手軽に利用できる時代 ▪ ◦ フロントエンドとバックエンドの分離 ▪ バックエンドは単に永続層からデータを取ってフロントにデータを渡すだけ 弊社のビジネスの性質上、 こういったものを利用しないといけない場合が増えてきた
  24. © 2020 EXNOA LLC を使った開発 • クリーンアーキテクチャとの相性 ◦ 個人的には結構良いと思う ◦

    薄いフレームワークを組み合わせるのに便利 ▪ 失敗しても変えやすいし • よくわかってなかったことが露呈した ◦ インターフェースをどう使うんだ???って最初はなっていた
  25. © 2020 EXNOA LLC まとめ

  26. © 2020 EXNOA LLC まとめ • クリーンアーキテクチャは関心の分離を求める思想 ◦ 具体的なアーキテクチャではないが、共通のルールとしての知恵 ▪

    人類って万能の答えを欲しがるけど、それに価値はない • クリーンアーキテクチャやったほうがいい? ◦ 多分この質問はおかしい ▪ 関心を一切分離しなくていいシステムってなんだろ • フルスタックなフレームワークはダメなの? ◦ そんなことはない ▪ のフルスタックなフレームワークで価値を出せる時と場合はある ▪ ぶっちゃけ便利だしね
  27. © 2020 EXNOA LLC まとめ • 激動の時代に生まれた ◦ クリーンアーキテクチャとの親和性 ◦

    クラウドネイティブな開発への親和性 • アーキテクチャや設計原則、デザインパターンは人類の英知 ◦ こうやるとやばかったからこうした こうするとうまくいった ▪ 必ず生まれた背景があるのでその把握がないと逆に操られる ◦ 書籍: にはエンジニアリングの歴史の話が出てきて、 そういった背景が知れるのでオススメです ▪ 逆に具体例をこの本に求めると悲しいことになります ◦ とオブジェクト指向についての知識の上に成り立っている感じはする 達人に学ぶソフトウェアの構造と設計 角 征典 高木 正弘
  28. © 2020 EXNOA LLC おわり 銀の鍵はあるけど銀の弾丸はない

  29. © 2020 EXNOA LLC 補足資料 勉強になった資料とか

  30. © 2020 EXNOA LLC 資料集 • ◦ そもそもの大本 ◦ クリーンアーキテクチャ

    翻訳 • 世界一わかりやすい ◦ 誤解されがな 点とおさえるべき 点 • ◦ 実装に挑戦してみたもの ▪ • クリーンアーキテクチャ完全に理解した ◦ に出てくる用語について、複数のソースから説明されている
  31. © 2020 EXNOA LLC の領域について • には3つの領域があるという話 ◦ 開発思想 ▪

    システムの複雑性に取り組むために、業務の専門家と技術の専門家で言語・モデルの認識を 合わせ、継続的に進化させていこう、という考え方 ◦ 戦略的設計 ▪ ドメインモデリングの前提を揃えるための、モデリング対象を定義する原則と手法 コアドメイン サブドメイン、境界付けられたコンテキスト、コンテキストマップ等 ◦ 戦術的設計 ▪ モデルを具体的に表現するためのパターン エンティティ、レポジトリ、レイヤードアーキテク チャ等 なぜDDD初心者はググり出してすぐに心がくじけてしまうのか
  32. © 2020 EXNOA LLC エンティティという言葉について( ) 以下、自分の考えです • のエンティティとクリーンアーキテクチャのエンティティ ◦

    完全に同じものではないのだが、全く違うものでもない • いろんな意見がある ◦ ドメイン駆動設計のエンティティとクリーンアーキテクチャのエンティティ │ ◦ ◦ の と の は同じものです
  33. © 2020 EXNOA LLC エンティティという言葉について( ) • クリーンアーキテクチャのエンティティ ◦ どのアーキテクチャにも言えるルールの話(抽象的な話)

    • のエンティティ ◦ 戦術的設計としてのもう少し具象な話 • ( ) ◦ クリーンアーキテクチャでは言及されていない(具象だから) ▪ だけど、 の はクリーンアーキテクチャのエンティティという アーキテクチャのルールを守っているはずである ▪ もちろん のエンティティもクリーンアーキテクチャのエンティティという アーキテクチャのルールを守っているはず
  34. © 2020 EXNOA LLC エンティティという言葉について( ) • 要するに ◦ 抽象概念のエンティティと具象のエンティティを同じか?と議論している

    ▪ 正確には違う ◦ クリーンアーキテクチャで実際に組まれたアーキテクチャのエンティティ(具象)を クリーンアーキテクチャのエンティティと呼んだ時 ▪ のエンティティを参考にしていたら同じといっていいかもしれない 同じってなんなんだろう
  35. © 2020 EXNOA LLC 補足資料おわり