- 大規模なコードベースで作業することは、ソフトウェアエンジニアにとって最も難しいことの1つ。個人プロジェクトやオープンソースプロジェクトでは、この種の経験を得るのは難しい
- 数百万行のコード、100〜1000人のエンジニアが同時に作業し、少なくとも10年以上経過したコードベース
- 複雑さと時間の積み重なりを理解する、別種の能力が求められる
最大の失敗は一貫性の欠如
- 最もよくあるミスは、既存のコードベースを無視して自分の機能を実装してしまうこと。これは一貫性を損ない、コードベースの混乱をさらに増大させる
- たいていは既存コードベースとの相互作用を最小限にして自分のきれいなコードを保ち、既存の「レガシー」コードを避けるために独立して実装する
- 一貫性はコードベースの複雑さを減らし、将来の改善作業を容易にする
- たとえばAPIエンドポイントを実装する際には、既存の認証方式に従うことが重要。これにより、コードベースの地雷原を安全に通り抜けられる
- 一貫したパターンがなければ、すべてのコードを手作業で更新しなければならず、これは次第に難しくなる
その他の重要な要素
- サービスが実際にどう使われているかを理解する
- 最も頻繁に使われる主要なAPIエンドポイントと重要な経路(hot path)を把握する
- 利用頻度の高いコードへの変更は慎重に扱う
- テストとモニタリングの重要性
- 大規模プロジェクトではあらゆる状態をテストできないため、主要な経路だけをテストする
- 防御的にコードを書き、段階的デプロイとモニタリングに依存する
- 依存関係の追加を控える
- 依存関係はセキュリティ問題や保守コストの増加を招く
- 本当に必要な場合は、信頼できる依存関係を選ぶ
- コード削除は慎重に、しかし積極的に行う
- 本番データを分析して安全に呼び出しを削除したうえでコードを消す
- 不要なコードを取り除くとコードベースの保守が容易になる
- これは大規模コードベースでもっとも価値の高い作業の1つ
- 小さなPRで進め、他チームのコードに影響する変更を先に処理するべき
- ドメインエキスパートが問題を見つけ、事故を防げるようにする
なぜ大規模コードベースが重要なのか?
- 大規模コードベースの価値
- ほとんどの技術企業は大規模コードベースから収益を生み出している
- 「レガシーコードベース」で働くことこそが会社の実際の業務を意味する
- コード分離の前に理解が必要
- 大規模コードベースを分離するには、まず全体の動作を十分に理解しなければならない
- 理解なしに大規模な再設計は不可能
要約
- 大規模コードベースは重要なビジネス価値を持つ
- 最も重要なのは 一貫性の維持
- 新機能を実装する前に既存コードを調べ、パターンに従うこと
- 既存パターンに従わないのであれば、非常に正当な理由が必要
- 本番環境でコードがどのように使われているかを理解すること
- すべてのケースをテストできないため、テストに過度に依存せず、モニタリングと段階的デプロイに依存する
- コード削除の機会は積極的に活用しつつ、慎重に進める
- ドメインエキスパートがレビューできるよう、小さなPR単位で作業する
8件のコメント
一貫性は重要ですが、だからといってコード改善を先延ばしにしたり、既存の誤ったパターンを繰り返したりするのも良いやり方ではなく……難しい問題ですね。一貫性を守るあまり、同じ技術的負債を積み上げていく形になることもあるので。
何よりもまず、コーディング規約は守るべきです。
特にインデントの規則は…。
自動で検出してくれるツール群を適用できないドメインにいらっしゃるんですか……?(泣)
そうですね....(涙)
泣いて差し上げます.. (泣)
プロジェクトの規模 != 成熟度
一貫性が非常に重要であることには同意しますが、それを口実にコードベース改善の優先順位を低く置くのは避けるべきだと思います。
プロジェクトは常に生きて呼吸し、成長していくものなので、適切なタイミングで改善できなければ、それを取り戻すにはさらに多くの時間と労力が必要になるはずです。
私も同意します。20年以上続いているプロジェクトを扱っていますが、今の基準から見ると本当に未熟な部分が多いです。
一貫性にはコードの理解しやすさを高められるという利点がありますが、構造上の限界は機能の限界を招き、サービスの発展を妨げてしまうため、ときには思い切った刷新も必要だと思います。
Hacker Newsの意見
既存コードベースに一貫性がないときは、新しいやり方を導入して文書化し、フィードバックを得ることが重要である。既存コードとの一貫性を保つよう努めるべきである。
既存コードベースのツールを使うべきだが、新しいコードベースを構築するほうがより楽しいこともある。
大きなコードベースを分割するには、まず理解が必要であり、経験のないチームがこれを試みると失敗する可能性が高い。
大きなコードベースでは、無作為に改善しようとする試みが多い。
コードベースの進化を維持するのは難しい。
コードベースが大きく人手が不足していると、新しい人が生産的になるまでに長い時間がかかる。
コードベースをきれいに保つとは、機能をリリースするために必要最小限の作業だけを行うことである。
一貫性が最も重要というわけではなく、コードベースの一部を改善するほうがよい。
「一貫性の欠如は致命的なミスだ」という言葉は100%正しい。
エンジニアとしての3つの格言: