1. HOME
  2. ブログ
  3. 開発ユースケース紹介
  4. 自社仕様に合わせたカスタムLinter導入事例:コード統一で工数削減と品質向上を実現
BLOG

ブログ

開発ユースケース紹介

自社仕様に合わせたカスタムLinter導入事例:コード統一で工数削減と品質向上を実現

導入:なぜLinterだけでは足りないのか?

JavaScriptやPythonをはじめ、多くの開発言語では、ESLintやPylintなどのLinter(静的コード解析ツール)が標準的に利用されています。しかし、現場レベルでの運用では以下のような課題が頻出していました:

  • Linterの設定が放置されている
  • チームごとにルールがバラバラで、統一感がない
  • プロジェクト間で品質のムラが大きく、レビュー工数も増加傾向

特に受託開発においては、プロジェクトごとに参加メンバーが入れ替わることも多く、「属人化しない品質管理」が喫緊の課題でした。

この記事では、ある業務系Webシステム開発プロジェクトにおけるカスタムLinterの導入と、その設計思想、運用フローを詳細に解説します。単なるLintツールとしてではなく、継続的な改善プロセスを取り入れた「チーム文化としてのLinter運用」に焦点を当てていきます。

背景と課題:品質レビューが属人化していた開発現場

開発体制と技術スタック

対象プロジェクトの開発体制とスタックは以下の通りです:

  • フロントエンド:React + TypeScript
  • バックエンド:NestJS + PostgreSQL
  • チーム構成:5名(うち2名が新規メンバー)
  • 運用ツール:GitHub, GitHub Actions, Confluence, Notion

これにより、マイクロサービスアーキテクチャを前提としたコード分離と責務の明確化が求められる状況にありました。

表面化していた問題

  • 命名ルールが曖昧で、同一概念に対する表現が複数存在
  • 層ごとの責務が分離されておらず、Service層にDB操作や外部通信が混在
  • PRレビューのたびに同じ指摘が繰り返され、属人化が加速
  • ドキュメントの更新と実装が乖離し、実態と一致しないコード規約が蔓延
  • 新規メンバーが過去事例を参照しづらく、認識のブレが拡大

根本原因の分析

  • コーディング規約がツールに反映されていないため、形骸化
  • 複数案件を並行開発する中で、規約の適用が曖昧
  • Linterを「導入しているが、運用されていない」状態が継続
  • 属人知が多く、ドキュメントだけでは伝わらないナレッジが存在

解決方針:コーディング規約を”自動検出”に落とし込む

なぜカスタムLinterが必要だったのか?

ESLintやPylintといった一般的なLinterでは、標準的なコード品質は担保できますが、「自社の設計思想や命名ポリシー」といった抽象度の高いルールには対応が困難です。

特に以下のような方針の下で設計が行われました:

  • レビューの時間短縮と論点の明確化
  • 教育工数の削減(Linterエラーから学べる仕組み)
  • プロジェクトをまたいだ一貫性の維持
  • 暗黙知を形式知に変換する運用フローの確立

実装フェーズ:段階的なルール適用とチーム展開

フェーズ1:現状分析とルール設計

既存のコードベースに対し、Linterによる静的解析を実施。検出された問題から、エラー傾向や影響範囲を洗い出し、以下の観点でルール設計を行いました:

  • ファイル・クラス・関数の命名形式統一(PascalCase / camelCase)
  • propsやDTOの深さ制限による保守性向上
  • ディレクトリ構造の標準化(レイヤー設計 vs 機能別設計)
  • importの順序と絶対パス統一
  • Hook関数や型定義の命名規則(usePrefix / IType)
  • 構成要素の階層制限(例:Service層の外部呼び出し禁止)

フェーズ2:カスタムLinterルールの実装

ESLint Pluginの形式で自社ルールをコード化。特に重要視したのが「ルールが単純であること」と「誤検知が少ないこと」。実装例:

module.exports = {
  meta: { type: "problem" },
  create(context) {
    return {
      CallExpression(node) {
        const filePath = context.getFilename();
        if (filePath.includes("/services/") && node.callee.name === "fetch") {
          context.report({ node, message: "Service層でfetchは禁止です" });
        }
      }
    };
  }
};

このようなルールは具体的で即座に理解しやすいため、現場への定着率も高くなります。

フェーズ3:CI/CD統合とチーム展開

  • GitHub ActionsのPRジョブにLinterチェックを統合
  • ルール違反時はPRがfailし、早期修正を促進
  • 例外的な対応はdisableコメントとレビュー指摘を通じて対応
  • ConfluenceやNotion上にルール定義書を掲載し、Slack通知連携で変更共有

運用フェーズ:継続改善とチーム文化への昇華

継続的なLinterルールの更新フロー

  • 毎月1回、Linterルールのレビュー会を実施(Slack + Notion連携)
  • エラー発生件数が一定値を超えた場合、チケット化し議論
  • 非効率的・誤検出の多いルールは廃止・改善対象とする
  • チーム内で「レビューされなくてもよい設計」を議論・更新

新規メンバーへのオンボーディング効率化

  • プロジェクトセットアップにESLint初期設定を含める
  • ルールエラー時の詳細と修正例へのリンクをLinter出力に添付
  • 過去の修正PRや背景をNotionに蓄積し、検索性を確保
  • 新人向けに「Linterが出すエラーから学ぶトレーニング課題」も提供

結果と効果:レビュー工数削減と品質安定化

  • PRレビュー時間が平均40%以上削減
  • 命名揺れ・構造混在によるバグ発生が25%減少
  • 新人の実装速度が向上し、早期の戦力化が可能に
  • マルチプロジェクト環境においてもコード規約の統一性が維持
  • 属人化せずに「誰でも同じ品質で実装できる」状態を実現

まとめ:Linterは自動化による組織文化の翻訳装置

自社仕様のカスタムLinterは、「人による指摘」を「ツールによる即時検出」に変えることで、組織のナレッジをソースコードへ埋め込む仕組みとなります。

ルールの定義と改善をチーム文化に取り入れることで、品質・速度・コストの最適バランスが実現できます。開発組織において、「暗黙知」を「形式知」に変換する第一歩として、ぜひ自社独自のLinter運用を検討してみてください。

導入コスト以上に、運用による学習・改善サイクルが生む効果が大きいことが実証されつつあります。これからのソフトウェア開発において、Linterは単なるエラー検出ツールではなく、開発品質を守るための「文化の基盤」として活用していくべきです。

お問合せ

不明点やお見積りの依頼などお気軽にください。




問い合わせを行う

関連記事