26 ポイント 投稿者 GN⁺ 2025-01-08 | 8件のコメント | WhatsAppで共有
  • 大規模なコードベースで作業することは、ソフトウェアエンジニアにとって最も難しいことの1つ。個人プロジェクトやオープンソースプロジェクトでは、この種の経験を得るのは難しい
    • 数百万行のコード、100〜1000人のエンジニアが同時に作業し、少なくとも10年以上経過したコードベース
    • 複雑さと時間の積み重なりを理解する、別種の能力が求められる

最大の失敗は一貫性の欠如

  • 最もよくあるミスは、既存のコードベースを無視して自分の機能を実装してしまうこと。これは一貫性を損ない、コードベースの混乱をさらに増大させる
    • たいていは既存コードベースとの相互作用を最小限にして自分のきれいなコードを保ち、既存の「レガシー」コードを避けるために独立して実装する
  • 一貫性はコードベースの複雑さを減らし、将来の改善作業を容易にする
  • たとえばAPIエンドポイントを実装する際には、既存の認証方式に従うことが重要。これにより、コードベースの地雷原を安全に通り抜けられる
  • 一貫したパターンがなければ、すべてのコードを手作業で更新しなければならず、これは次第に難しくなる

その他の重要な要素

  • サービスが実際にどう使われているかを理解する
    • 最も頻繁に使われる主要なAPIエンドポイントと重要な経路(hot path)を把握する
    • 利用頻度の高いコードへの変更は慎重に扱う
  • テストとモニタリングの重要性
    • 大規模プロジェクトではあらゆる状態をテストできないため、主要な経路だけをテストする
    • 防御的にコードを書き、段階的デプロイとモニタリングに依存する
  • 依存関係の追加を控える
    • 依存関係はセキュリティ問題や保守コストの増加を招く
    • 本当に必要な場合は、信頼できる依存関係を選ぶ
  • コード削除は慎重に、しかし積極的に行う
    • 本番データを分析して安全に呼び出しを削除したうえでコードを消す
    • 不要なコードを取り除くとコードベースの保守が容易になる
    • これは大規模コードベースでもっとも価値の高い作業の1つ
  • 小さなPRで進め、他チームのコードに影響する変更を先に処理するべき
    • ドメインエキスパートが問題を見つけ、事故を防げるようにする

なぜ大規模コードベースが重要なのか?

  • 大規模コードベースの価値
    • ほとんどの技術企業は大規模コードベースから収益を生み出している
    • 「レガシーコードベース」で働くことこそが会社の実際の業務を意味する
  • コード分離の前に理解が必要
    • 大規模コードベースを分離するには、まず全体の動作を十分に理解しなければならない
    • 理解なしに大規模な再設計は不可能

要約

  • 大規模コードベースは重要なビジネス価値を持つ
  • 最も重要なのは 一貫性の維持
  • 新機能を実装する前に既存コードを調べ、パターンに従うこと
  • 既存パターンに従わないのであれば、非常に正当な理由が必要
  • 本番環境でコードがどのように使われているかを理解すること
  • すべてのケースをテストできないため、テストに過度に依存せず、モニタリングと段階的デプロイに依存する
  • コード削除の機会は積極的に活用しつつ、慎重に進める
  • ドメインエキスパートがレビューできるよう、小さなPR単位で作業する

8件のコメント

 
kallare 2025-01-10

一貫性は重要ですが、だからといってコード改善を先延ばしにしたり、既存の誤ったパターンを繰り返したりするのも良いやり方ではなく……難しい問題ですね。一貫性を守るあまり、同じ技術的負債を積み上げていく形になることもあるので。

 
regentag 2025-01-09

何よりもまず、コーディング規約は守るべきです。
特にインデントの規則は…。

 
roxie 2025-01-10

自動で検出してくれるツール群を適用できないドメインにいらっしゃるんですか……?(泣)

 
regentag 2025-01-10

そうですね....(涙)

 
roxie 2025-01-10

泣いて差し上げます.. (泣)

 
bbulbum 2025-01-09

プロジェクトの規模 != 成熟度
一貫性が非常に重要であることには同意しますが、それを口実にコードベース改善の優先順位を低く置くのは避けるべきだと思います。
プロジェクトは常に生きて呼吸し、成長していくものなので、適切なタイミングで改善できなければ、それを取り戻すにはさらに多くの時間と労力が必要になるはずです。

 
beoks 2025-01-09

私も同意します。20年以上続いているプロジェクトを扱っていますが、今の基準から見ると本当に未熟な部分が多いです。
一貫性にはコードの理解しやすさを高められるという利点がありますが、構造上の限界は機能の限界を招き、サービスの発展を妨げてしまうため、ときには思い切った刷新も必要だと思います。

 
GN⁺ 2025-01-08
Hacker Newsの意見
  • 既存コードベースに一貫性がないときは、新しいやり方を導入して文書化し、フィードバックを得ることが重要である。既存コードとの一貫性を保つよう努めるべきである。

    • 既存コードが悪くても、周辺コードとの一貫性を保ちながら作業することが重要である。
    • チームメンバーが非協力的な場合は、既存コードの問題点を強調し、新しいアプローチが実験的であると説明することが役立つ。
  • 既存コードベースのツールを使うべきだが、新しいコードベースを構築するほうがより楽しいこともある。

    • コードベースの結合度が高いほど変更は難しくなり、テストカバレッジが不足していると問題が発生しうる。
  • 大きなコードベースを分割するには、まず理解が必要であり、経験のないチームがこれを試みると失敗する可能性が高い。

    • 新しいチームが既存システムを理解していなければ、プロジェクトは失敗する可能性がある。
  • 大きなコードベースでは、無作為に改善しようとする試みが多い。

    • 改善すべき箇所を見つけ、実際に前向きな影響を与える部分かどうかを見極めることが重要である。
    • 改善すべき箇所を理解し、いつ止めるべきかを知ることが重要である。
  • コードベースの進化を維持するのは難しい。

    • 絶対的な一貫性は実験を許さず、実験がなければ成功もない。
  • コードベースが大きく人手が不足していると、新しい人が生産的になるまでに長い時間がかかる。

    • このような環境で働くことは、キャリアにとって良くない可能性がある。
  • コードベースをきれいに保つとは、機能をリリースするために必要最小限の作業だけを行うことである。

    • これは、機能リリースを目標にした戦術的な選択を行う、政治的に抜け目のないエンジニアによるものかもしれない。
  • 一貫性が最も重要というわけではなく、コードベースの一部を改善するほうがよい。

    • 「溶岩層アンチパターン」は、一貫性を維持しようとする試みよりも良いシステムを生み出せる。
  • 「一貫性の欠如は致命的なミスだ」という言葉は100%正しい。

    • 「郷に入っては郷に従え」という哲学に従う。
  • エンジニアとしての3つの格言:

    • 明確さ、一貫性、簡潔さ
    • 痛みを正しい場所に置くこと
    • エントロピーと戦うこと