Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

More Decks by Jyashin

Other Decks in Programming

Transcript

  1. © 2020 EXNOA LLC Goとクリーンアーキテクチャ DMM.go #2 EXNOA プラットフォーム開発本部 PFシステム部

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

    GAMESは残っています 一般作品 R18作品
  3. © 2020 EXNOA LLC • 岡崎 翔悟(Okazaki Shogo) • 合同会社

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

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

  6. © 2020 EXNOA LLC 今回の対象 ゲームプラットフォームのWebシステム • 一般的なWebサービス+ゲームデベロッパー向けのAPI (課金とか会員等のプラットフォーム機能の提供) 特徴

    • 高負荷 ◦ 最大で4,000 req/s • PFシステムから見た時にアクターが多い ◦ ユーザー、ゲームデベロッパー、運営 6
  7. © 2020 EXNOA LLC 現状抱えている問題 • 全体的なシステムの老朽化 • 画面主導なリポジトリ構成 ◦

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

    コンテナオーケストレーションツールの利用 ◦ Kubernetes • ドメイン駆動設計 ◦ 開発思想 ◦ 戦略的設計 ◦ 戦術的設計 8
  9. © 2020 EXNOA LLC クリーンアーキテクチャとは Goの話?もうちょっと待つんだ… 9

  10. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか(1/4) • 図はあくまで具体例の1つ ◦ 関心をControllerやUseCase、Entitiesと 分離する

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

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

    ヘキサゴナル ◦ オニオン ◦ etc. これらのアーキテクチャはどれも細部は異なるけれど も、とてもよく似ている。これらはいずれも同じ目的を持っ ている。関心の分離だ。 これらはいずれも、ソフトウェアをレイヤーに分けることに よって、関心の分離を達成する。 12 クリーンアーキテクチャ(The Clean Architecture翻訳)
  13. © 2020 EXNOA LLC クリーンアーキテクチャは何を示すのか(4/4) The architecture rules are the

    same! アーキテクチャのルールはどれも同じである! 13 Clean Architecture 達人に学ぶソフトウェアの構造と設計 (角 征典 高木 正弘 Robert C. Martin)
  14. © 2020 EXNOA LLC 関心の分離によって得られるもの(1/2) • フレームワーク独立 ◦ フルスタックなフレームワークを必要としないし、依存しない •

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

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

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

    フレームワークの選び方は気をつける必要がある ◦ フレームワーク独立の思想に反するので ◦ フルスタックのフレームワークとはあまり馴染まなそう • Goは基本的に標準パッケージで事足りるようにするという思想 ◦ フレームワークとして提供されるものも薄いものが多い ◦ クリーンアーキテクチャと親和性が高い (ちなみにGoを選択した理由はこれだけじゃないのですが話が散らかるので割愛) 17
  18. © 2020 EXNOA LLC ディレクトリ構成例 18 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 • GoはPackage内Private ◦ entities ◦ usecases ◦ interfaces ◦ infrastructure • 1リポジトリの中に複数の サブドメインがある場合 ◦ applicationの下に1つ階層を作る ◦ もしくはリポジトリを分ける
  19. © 2020 EXNOA LLC 依存ルールを守った境界のまたぎ方 依存関係逆転の原則 (Dependency Inversion Principle) Goだとインターフェースを使う

    19 https://play.golang.org/p/lqekXnQNKut
  20. © 2020 EXNOA LLC 依存ルールを守った境界のまたぎ方 • こうではなく SQLHandler ↑ EvilRepository

    • こうする SQLHandler ↓ SQLHandler Interface ↑ EvilRepository 20 https://play.golang.org/p/lqekXnQNKut
  21. © 2020 EXNOA LLC Goを使った開発 感想とか 21

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

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

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

    薄いフレームワークを組み合わせるのに便利 ▪ 失敗しても変えやすいし • DIPよくわかってなかったことが露呈した ◦ インターフェースをどう使うんだ???って最初はなっていた Go's purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers. 24 Go at Google: Language Design in the Service of Software Engineering
  25. © 2020 EXNOA LLC まとめ 25

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

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

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

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

  30. © 2020 EXNOA LLC 資料集 • The Clean Architecture ◦

    そもそもの大本 ◦ クリーンアーキテクチャ(The Clean Architecture翻訳) • 世界一わかりやすいClean Architecture ◦ 誤解されがな2点とおさえるべき2点 • Dive to clean architecture with golang ◦ 実装に挑戦してみたもの ▪ https://github.com/bmf-san/go-clean-architecture-web-application-boilerplate • クリーンアーキテクチャ完全に理解した ◦ Clean Architectureに出てくる用語について、複数のソースから説明されている 30
  31. © 2020 EXNOA LLC DDDの領域について 31 • DDDには3つの領域があるという話 ◦ 開発思想

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

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

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

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