📌
Sportip開発ガイドラインの紹介
はじめに
はじめまして。Sportipのテックリード、砂原です。
Zennで技術ブログを開始するにあたり、第一回では、開発規約のうち言語やフレームワークに依存しない部分に焦点を当ててご紹介いたします。
プルリクエスト(PR)
プルリクエスト運用の基本方針は、以下の内容となります。
1. 差分・コミット管理
-
差分の最小化
PRの変更差分が極力小さくなるよう努める。 -
細かいPRの作成
- 可能な限り小さな単位でPRを作成する。
- 1つのPRに複数のコミットが含まれる場合、分割の可能性を検討する。
-
コミット単位のテスト
各コミットが個別にテストをパスし、正しく動作する状態であることを確認する。 -
コミット整理
レビュー依頼前に履歴を整理し、CI用フォーマッターによる自動変更など、本質的でない変更はsquashする。
2. ブランチ運用とPR管理
-
リファクタリングと機能追加/修正の分離
リファクタリング専用ブランチを作成し、そのブランチから派生したブランチで機能追加や修正を行い、別々のPRとして提出する。 -
Draft PRの活用
レビュー可能な状態になるまでDraft PRとして作成する。 -
ユニットテストの追加
変更には必ず適切なユニットテストを付与する。 -
rebaseの実施
master/mainとの差分が大きい場合は、mergeではなくrebaseを実施する。 -
マージ方法
PRのマージは原則としてSquash Mergingを採用する。 -
PR説明のテンプレート
基本のテンプレートを利用し、必要に応じて各リポジトリごとにカスタマイズ可能とする。 -
不要なPRのクローズ
スケジュール変更などにより、即時マージの予定がなくなったPRは適宜closeする。
3. 積極的なレビュー
- 他のメンバーのPRにも目を通し、積極的にレビューを実施する。
コードレビュー
コードレビューは、以下の基本原則および各関係者の役割に基づいて行う。
1. 基本原則
-
レビュー対象の選定
コードフォーマットは自動ツールに任せ、レビュー対象から除外する。 -
コミュニケーション
丁寧な言葉遣いと建設的な議論を心がけ、必要に応じてミーティング等で同期的な議論を行う。
2. レビュー観点
品質
- 仕様が正しく満たされているか。
- コーディングルールが遵守されているか。
- データ構造やアルゴリズムの選定が適切か。
- 環境依存になっていないか。
- 既存コードとの一貫性があるか。
セキュリティ
- 秘密情報が混入していないか。
- 入力の検証やサニタイズが適切に行われているか。
- ベストプラクティスに沿った実装(例:パスワードのハッシュ化)がなされているか。
パフォーマンス
- 計算量(時間・空間)が合理的か。
- スケーラビリティが確保されているか。
3. レビュアーの役割
- 依頼があれば迅速にコメントする。
- 成果物のみを対象とし、個人の人格や態度に関する批判は行わない。
- 大きな変更がある場合は、レビュイーに分割を依頼する。
- 指摘の重要度(must、nit、fyiなど)を明確にする。
- 問題点に対する改善策や対応案を提示する。
- PRクローズに向けた道筋を示し、良い点についても積極的にコメントする。
- コード改善の提案があれば、完璧でなくても承認する。
- 参考文献(例:『リーダブルコード』)があれば、明記する。
4. レビュイーの役割
- PRルールを遵守し、完成前にレビュアーとコミュニケーションを取る。
- 実装前に、実装方針(修正内容、影響範囲など)を相談する。
- 期限がある場合は、事前にレビューを依頼する旨伝えて時間を確保できるようにする。
- レビュー依頼前に「コードレビュー事例集」を参照し、セルフチェックを実施する。
- 必要な情報(設計背景、検討過程、重点箇所など)を記載する。
- 修正完了後は随時、再レビューを依頼する。
- 不明点があれば積極的に質問し、フィードバックを受け取る。
5. CodeRabbit
- PRの状態は、以下の3パターンに分類する:
- [WIP]付きDraft: coderabbitおよび人間双方のレビュー対象外。
- [WIP]なしDraft: coderabbitはレビューを実施し、人間は対象外。
- Ready for review: 人間がレビュー対象となる。
- [WIP]を外した直後は自動実行されないため、
@coderabbitai full review
とコメントして手動実行する。 - rate limitに達した場合は、待機後に自動再実行されるので、そのままで問題ない。
- CodeRabbitのレビューが不適切な場合は、適切に反論し、人間のレビュアーへの参考情報として提示する。
- 必要に応じ、最初から[WIP]なしのPRとして作成してもよい。
コーディングルール
言語やフレームワークに依存しない共通のコーディングルールは、以下の通りとする。
1. 共通原則
- DRY: Don’t Repeat Yourself
- KISS: Keep It Simple, Stupid
- YAGNI: You Ain’t Gonna Need It
- Premature Optimization is the Root of All Evil
- Don't guess, measure
2. フォーマット
- GitHub Actionsを活用し、共通ルールの自動チェックを実施する。
- インデントはスペース2つを採用する。
3. コメント
- コメントは必要最小限に留め、説明的な変数名や関数名を使用する。
- コード内のコメントは英語で記述する。
- コメントには以下の内容を含める:
- 設計背景および採用理由
- アルゴリズムのリファレンス
- 入力前提条件および例外時の挙動
- ルール違反の合理的な理由(該当する場合)
- スコープは最小限に、mutableよりimmutableな設計を選択する。
- インターフェースの命名や引数の切り分けは、初見で誤解が生じないよう工夫する。
- プラットフォーム固有のAPIは直接使用せず、安全な抽象レイヤー(例:Linuxのpthreadの代わりに、C++のstd::threadやPythonのthreading)を利用する。
- OSSはライセンスに則り適切に利用し、パッケージマネージャ等でライセンス記載が求められる場合は、オープンソースライセンスを記載せず、クローズドソースであることを明示する。
テスト
テストに関する基本方針は、以下の通りとする。
1. ブラックボックステスト
- 外部仕様のみを対象にテストを実施する。
2. ホワイトボックステスト
- 以下の場合に限り実施する:
- 将来変更される可能性が低い普遍的な実装。
- 重要なアルゴリズムの中心部分。
3. ユニットテスト
- 外部リソース(例:AWS)に依存せず、単独でテスト可能な設計を行う。
- ユニットテスト、結合テスト、E2Eテストを適宜使い分け、テストカバレッジに一律の基準は設けない.
まとめ
Sportipの開発チームは、合理的な開発を実現するために日々改善を行っています。
また、当チームでは採用の拡大も目指しているので、内容にご興味をお持ちいただけましたら、ぜひお気軽に下記の採用フォームよりご連絡ください。
Discussion