🐈

アーキテクチャを考える その1

2021/10/30に公開

要約すると...。

チームで一番スピードが出せる状態で、高凝集で疎結合であれば、
読み側、書く側の負担はそんなに高くないんじゃないかなーと思っている。

前提

  • 事業だと、予算だったり収益を生み出さないといけないので、
    予算と品質のトレードオフがありますが、
    設計と実装の工期のバランスが崩れるので、
    基本的な品質レベルの担保向きです。
    好きにやれるのであれば、やっていいと思います。

  • DDDやClean Architectureはあまり理解できていないので、
    自分は逆に教えて欲しいぐらいのレベルです。

アーキテクチャを考え直したきっかけ

自分で1度構成を考えてチーム内にレビューしてもらったものの、
作ってリリースしたのはいいものの、本当にこの構成って正しいんだっけ?
他の人が見たら、わかりにくいなーとかあるんじゃ?
という疑問が湧いてきたからです。

アーキテクチャが伝播するまで

いろんな参考記事だったり見ましたが、各会社でレイヤーの区分は一致していない印象でした。
まあ、結局、チーム内で共通認識を作る。ってことが大事なんだなあという印象ですね。

ただ、こうゆうことに興味がなくて機能ができればいいやーという人も中にはいるので、
そのスタンスの人がいる場合、ドキュメント作成のコストは高くなりますね。

何年かすると、最初にアーキテクチャを考えても、
退職や異動で作った人がいなくなり、構成は崩れていってしまうので、
ある程度縛れるようにしないといけないと思っているので、
難易度が高いアーキテクチャは採用しにくくなると思うんですよね。

(ここからは個人の主観です)
それと、アップデートの維持、拡張性だったりを考えると、
DDDライクな形にしておいて、ライトな形のパッケージ構成であれば
読み手、書き手の負担的には問題ないんじゃないかな?と思っています。

どこまで分割するべき?

普段はgo言語とphpを使っているので偏った意見にはなるのですが、

  • 構造体、インターフェース部分から読む人
  • ドメインの括りで読む人
    で分かれるのかなあと思っています。

僕はざっくり理解しているだけなので、ドメインで見てしまう感じです。
どちらが正解とかというわけではないとは思うんですけどね...。
ただ、どちらも許容できる状態であればいいのかなと思っていて、
凝集度の定義だったりは人によって異なるものだと思うので。

読む側、書く側の負担が高くなければっていうのと、
どんな書き方になっていれば慣れてもらえるか?だと思うので、

例 : ディレクトリ構成(参考程度に載せました)

├── application
│   ├── usecase
│   │   └── A_usecase.go
├── domain
│   ├── model
│   │   └── A_model.go
│   └── repository
│       └── A_repository.go
├── infrastructure
│   └── A_repository.go
├── interfaces
│   └── api
│       └── server
│             └── server.go
│       └── handler
│             └── A_handler.go
│	└── router
│	      └── route.go

まとめ

雑談っぽくなってしまいましたが、
どうゆう構成ならいいんだろう?というのはずっと悩んでいて、
正解が見えてないんですけど、
縛り過ぎて進まなくなってしまうことを避けたいなあと思って、

いろいろな方の意見を伺いたいなと思って、
現場でアーキテクチャを変えていった話とかあれば、ぜひ教えてください。

Discussion