フォトシンス エンジニアブログ

株式会社Photosynth のテックブログです

設計の決定理由を GitHub Discussions に残すようにした話

この記事は Akerun - Qiita Advent Calendar 2024 - Qiita の18日目の記事です。

こんにちは、Miwa Akerun Technologiesが運営する賃貸住宅管理システムの開発チームでエンジニアをしている ps-yu1129 - Qiita です。

私の所属するチームでは、設計や開発に関するドキュメントのうち、フロードキュメントを GitHub Discussions、ストックドキュメントを GitHubWiki にまとめています。この運用をチームで約1年間続けてきたため、振り返りたいと思います。

当初のドキュメントについての課題感

ドキュメントについての取り決めがない時は、設計資料や相談事項を Confluence に書いていましたが、下記のような課題がありました。

  • フロードキュメントなのか、ストックドキュメントがどれなのかの区別がつかない
  • 知りたい情報がまとまっておらず、情報にたどり着くのに時間がかかる
  • どのような議論があり、どういう意思決定があって今の設計になったのかが不明

そこで、フロードキュメントを GitHub Discussions に記載し、ストックドキュメントを GitHubWiki に記載することにしました。

GitHub Discussions および Wiki に集約することにした理由

GitHub のサービス上にドキュメントを集約することにした一つ目の理由は、ドキュメント管理サービスが変わっても使い続けられるという点です。Photosynth の開発部では、過去に別のドキュメント管理サービスを使用していましたが、現在は Confluence を使用しています。今後ドキュメント管理サービスの移行があるかはわかりませんが、少なくとも、GitHub から別のコード管理サービスに移行する可能性の方が低いと思います。

二つ目の理由は、開発者向けの情報を一つのサービスに集約できるためです。ドキュメントもソースコードGitHub 上で管理できるため、サービスの行き来をしなくて済みます。

GitHub Discussions の運用について

GitHub Discussions はリポジトリの設定から有効化できます。(詳しくは リポジトリの GitHub Discussions を有効化または無効化する - GitHub Docsを参照)有効化すると、いくつかデフォルトでカテゴリが用意されていますが、これに加えて設計用に ADR(Architecture Decision Record)というカテゴリを追加しています。

GitHub Discussions カテゴリ一覧

カテゴリを追加した理由は、スレッド作成者によって記載内容にバラツキがあることや、最終的に何が決定された内容なのかがわかりづらいという問題があったためです。カテゴリの作成は、リポジトリ/.github/DISCUSSION_TEMPLATE/ 配下に yaml ファイルを追加することでできます。(詳細は ディスカッション カテゴリ フォームの作成 - GitHub Docs を参照)

実際に使用しているテンプレートは下記の通りです。

title: "[ADR] "
body:
  - type: markdown
    attributes:
      value: |
        1. 下書き
            - コメント募集をする場合には、「代替案」を記載する
            - 提案をする場合には「決定」を記載する
        2. コメント募集(オプション)
        3. 提案
        4. 承認 or 却下 or 代替
        5. 決定
  - type: dropdown
    id: status
    attributes:
      label: ステータス
      options:
        - draft
        - rfc
        - proposed
        - accepted
        - rejected
        - deprecated
        - superseded
    validations:
      required: true
  - type: textarea
    id: context
    attributes:
      label: コンテキスト
      description: どのような状況でこの決定を迫られているのか?
      placeholder: |
        例えば、この決定をする前にどのような問題があったのか?
        また、この決定をする前にどのような選択肢があったのか?
    validations:
      required: true
  - type: textarea
    id: decision
    attributes:
      label: 決定
      description: 決定した内容と決定がなされた理由
      placeholder: |
        Bad: サービス間に用いるのは非同期メッセージが最善の選択肢だと思う
        Good: サービス間に非同期メッセージを使用する。なぜなら...
  - type: textarea
    id: alternative
    attributes:
      label: 代替案
      description: 決定したい内容について意見を募集したい場合に記載する
      placeholder: |
        - 案1)
        - 案2)
        - 案3)
  - type: textarea
    id: consequences
    attributes:
      label: 影響
      description: 「決定」の影響について記載する。
      placeholder: |
        - メリット1)
        - メリット2)
        - デメリット1)
        - デメリット2)
  - type: textarea
    id: compliance
    attributes:
      label: 順守
      description: 「決定」の評価・統制方法について
  - type: textarea
    id: notes
    attributes:
      label: 備考
      description: |
        - オリジナルの著者
        - 承認日
        - 承認者
        - 変更点
  - type: textarea
    id: review-points
    attributes:
      label: 設計レビュー観点
      description: |
        設計時のレビュー観点。
        レビュアーに参照してもらうため、中身は変更しないこと。
      value: |
        - リソースのライフサイクルが明確になっているか
        - etc...

「設計レビュー観点」の項目については、設計段階からバグを排除するための施策として追加したものになります。レビュアーだけでなく、設計者もレビュー観点に記載の項目が設計から漏れていないかのチェックができるため、重宝しています。

上記のテンプレートを用いて、例えば以下について議論しています。

  • 要件を実現するためにどこにどのような変更を加える必要があるかの検討
  • テーブル設計
  • ライブラリの選定

なお、Discussions がクローズした後に変更が必要になった場合であっても、クローズした Discussions の修正は行いません。修正が必要になった場合は、別途 Discussions を立てて議論を行います。

GitHub Wiki の運用について

GitHub Discussions で議論して決まったことや、設計や開発に関してストックドキュメントとして残したいものについては Wiki に記載しています。例えば、下記のようなものです。

  • 実装方針の説明
  • テーブル設計の規約
  • OpenAPI で管理している API ドキュメントの書き方

また、内容に変更があった場合には、その都度更新するようにしています。

運用してみての振り返り

約1年ほど運用してきましたが、GitHub Discussions や Wiki に情報が集約されているため、体感ですがドキュメントを探す時間が少なくなったように思います。

また、仕様や技術選定について、なぜその意思決定を行なったのかの理由が議論を含めてわかるため、変更を加える際に設計意図を確認でき、調査時間の短縮になっています。とはいえ、当初設計したものから変更を加える機会はまだ少ないため、ありがたみを感じる場面は今後増えてくるのかなと思います。

ドキュメントの管理に悩んでいる方は、GitHub Discussions や Wiki を検討してみてはいかがでしょうか。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp Akerunにご興味のある方はこちらから akerun.com