スロッックロークド・フォー・ゼロ(scc)——最も注目を集めるファイルを特定する

2026/08/24 15:35

スロッックロークド・フォー・ゼロ(scc)——最も注目を集めるファイルを特定する

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

最新版 v4.0.0 の scc は、バージョン 3.7.0 から大きなアップグレードを遂げ、開発者およびマネージャーがコードベースをよりよく理解できるよう設計された強力な新機能を導入しています。最も重要な追加は、「ホットスポット」を特定する機能であり、これはデフォルトで最後の 1000コミットに基づいて計算され、複雑さが高いかつ頻繁に変更されるファイルを表します。単純な複雑度や変更度(churn)の指標とは異なり、ホットスポットはこの両方の要因を組み合わせ、「ハードな開発作業」と潜在的なマージ競合が起きる領域を特定します。このメトリックは HEAD だけのコミット数をカウントし、削除されたファイルは除外されます。

本リリースでは、2 つタイプの結合解析(coupling analysis)も導入されています:基本的な変更結合(コミットでの共出現に基づく依存関係の特定)と重み付き結合(論理が低いファイルからのノイズを減らすために複雑度の重みを適用)。その他の新機能には、空白/インデントを使用した大まかな認知複雑度の計算、グローバル設定ファイルへの対応、言語書き換えを追跡するための git ベースのタイムライン可視化、バズファクター解析用の著者メトリクス、プレゼンテーション向けの HTML インフォグラフィックレポートが含まれます。組み込みの Model Context Protocol (MCP) サポートにより、ローカルの大規模言語モデルとの統合が可能になります。これらの拡張機能は、チームがコードの安定性を評価し、バズファクターを管理し、リーダーシップへ明確なインサイトを提供できるように支援し、長期的なソフトウェアの保守性を大幅に改善します。

本文

scc v4.0.0 リリース:Hotspots と Git メトリクスでコード品質を可視化

本日、scc(および

cloc
code AKA scc
)のバージョン 4.0.0 がリリースされました。当初はマイナーバージョンアップを検討しておりましたが、導入された新機能の規模感から主要バージョンへの昇格が有意義だと判断いたしました。今回はその中でも特に注目すべき新機能について詳しくご紹介します。

ホットスポット (Hotspots) の実装

過去に Google がバグ予測機能として「ホットスポット」を検出しようとした試みはありますが、開発者が実用性とみなしませんでした。 scc v4.0.0 では、複雑性推定値を用いてノイズを除去したアプローチを採用しました。

複雑なコードこそが最も注意を必要とする! (参照:Adam Tornhill 氏の『Your Code as a Crime Scene』より)

仕組みと出力内容

Hotspots は、

0〜100
の正規化された「複雑性 × コミット回数」で計算されます。これにより、単純な集計では見落とされる以下のリスクを特定できます。

  • 複雑だが変更が少ないコード: 保守性が低い箇所。
  • 単純だが頻繁に変更されるコード: セットアップやテンプレートなどのノイズ。
$ scc --hotspots
───────────────────────────────────────────────────────────────────────────────
Hotspots · last 1000 commits · 2019-07-21 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
File                            Lang   Cmplx  Commits   Lines±  Authrs  Hotspot
───────────────────────────────────────────────────────────────────────────────
processor/processor.go            Go     156      156    1,651      13    100.0
processor/workers.go              Go     244       92    3,617      15     92.2
test-all.sh                    Shell      56      181    3,287      15     41.7
...
  • processor/processor.go
    processor/workers.go
    は、複雑性が高いかつ変更頻度が高いため、バグや論理問題が発生しやすい「ホットスポット」として正しく特定されています。
  • これらの情報は、コードベースのオンボーディングや、どこに技術的負債が潜んでいるかを知る上で極めて有用です。

実行深度 (--depth) の指定

Git コミットの遡る深さを変更することで、ホットスポットのシフトを検証できます(例:過去 50 コミット分など)。

$ scc --hotspots --depth 50
───────────────────────────────────────────────────────────────────────────────
Hotspots · last 50 commits · 2026-04-13 → 2026-06-26
...
processor/processor.go            Go     156       14      415       4    100.0
main_test.go                      Go     261        8      295       4     95.6
...

注意: この指標は「バグがある」ことを示すのではなく、「扱いにくい箇所(分割すべき箇所)」を示すインジケーターです。また、Git のインストールは不要で、

github.com/go-git/go-git
を内部で利用し単一バイナリとして動作します。

パフォーマンスへの影響

Hotspots 機能を実行するには Git 履歴の分析が必要となるため、通常の

scc
実行よりも時間がかかります。

$ hyperfine 'scc' 'scc --hotspots'
Benchmark 1: scc
  Time (mean ± σ):      11.2 ms ±   0.4 ms    [User: 15.2 ms, System: 7.6 ms]
  Range (min … max):    10.6 ms …  13.5 ms    194 runs

Benchmark 2: scc --hotspots
  Time (mean ± σ):      4.739 s ±  0.068 s    [User: 3.341 s, System: 1.611 s]
  Range (min … max):    4.707 s …  4.930 s    10 runs

Summary
  scc ran
  421.57 ± 14.52 times faster than scc --hotspots
  • MacBook Air (M1) を使用した計測結果。
  • 通常の動作(約 12ms)に対しては約 4000 倍の遅延が発生します。
  • これは計算負荷が増えるためのものであり、致命的な遅さではありません。

変更結合性 (Change Coupling)

特定のファイルの変更が、他のどのファイルにもたらす影響(ブラスト半径)を把握する機能です。コンパイラチェックを行わないコードやランダムなファイルに対する依存関係の可視化に有効です。

$ scc --coupling
───────────────────────────────────────────────────────────────────────────────
Change Coupling · last 1000 commits · 2019-07-25 → 2026-07-20
───────────────────────────────────────────────────────────────────────────────
File A                      File B                      Shared Commits Coupling
───────────────────────────────────────────────────────────────────────────────
languages.json              processor/constants.go                 198    67.8%
LANGUAGES.md                languages.json                         167    61.2%
...

個別ファイルの結合性 (--coupling-for)

特定のファイルを指定して、関連する変更を伴う他のファイルを探すことができます。

$ scc --coupling-for ./processor/detector.go
───────────────────────────────────────────────────────────────────────────────
Related File                                          Shared Commits   Coupling
───────────────────────────────────────────────────────────────────────────────
processor/detector_test.go                                        26      49.1%
processor/workers.go                                              15      12.1%
...
  • detector_test.go
    が高結合性であることを示すため、検出器を変更する際はテストコードも合わせて更新する必要があることを警告します。

重み付けオプション (--coupling-weighted)

複雑性の低いファイル(定義のみなど)のランクが上がるのを防ぐために、複雑性でスコアを調整できます。

$ scc --coupling-weighted --coupling-for ./processor/detector.go
───────────────────────────────────────────────────────────────────────────────
Related File                                          Shared Commits      Score
───────────────────────────────────────────────────────────────────────────────
processor/detector_test.go                                        26      100.0
processor/workers.go                                              15       57.7
processor/processor.go                                            13       50.0
...

Git メトリクスとインフォグラフィック

scc は内部に Git サポートを組み込んでおり、以下のメトリクスを計算できます。

タイムライン分析 (--timeline)

時間の経過とともに言語ごとのトレンドやコード量の推移を確認できます。JS から TS への書き換え監視などにも役立ちます。

$ scc --timeline
───────────────────────────────────────────────────────────────────────────────
Languages · last 1000 commits · 2019-07-21 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
Language             Trend                             Code    Share     Change
───────────────────────────────────────────────────────────────────────────────
Go                   ▂▂▂▂▂▂▂▂▂▃▃▃▃▃▃▃▃▃▃▃▃▄▆▆▆▇      37,868    65.2%    +33,595
JSON                 ▄▄▄▄▄▄▄▄▄▄▅▅▅▅▅▅▅▅▆▆▆▆▆▆▆▇      12,944    22.3%     +6,236
...

著者分析 (--by-author)

コミットごとの貢献度や、後任の計画(Bus Factor)を計算できます。重複したメールアドレスを持つ著者の統合には

.mailmap
の設定が推奨されます。

$ scc --by-author
───────────────────────────────────────────────────────────────────────────────
Authors · last 1000 commits · 2019-07-24 → 2026-07-08
───────────────────────────────────────────────────────────────────────────────
Author                               Code     Cmplx   Files     Owns  Last seen
───────────────────────────────────────────────────────────────────────────────
Ben Boyter (github.com)            18,901     1,839      59    37.9% 2026-07-06
apocelipes                         16,740       299      11    33.6% 2026-06-26
...
Bus factor 2 · Ben Boyter (github.com) + apocelipes

統合レポート (--report)

全ての指標(新機能含む)を可視化した HTML レポートを生成できます。管理職向けの報告書作成などに適しています。

$ scc --report
Report written to scc-report.html

認知複雑性 (Cognitive Complexity)

従来の循環的複雑性に加え、**コードの形状(インデント数)**も考慮した近似計算を導入しました。

  • 理由: 循環的複雑性はコンパイルエラーがない場合でも限界があり、scc はすでに安価な近似値を使用しているため。
  • 手法: インデント数をネスト度の指標として利用し、分岐条件で乗算係数を適用します(LLM のコード分析の慣習に基づく)。
  • メリット: 複雑性カウントが劇的に増加する「扱いにくい」ファイルを特定できます。
    $ scc --cognitive main.go
    # Go: Complexity → 103 (従来の 40 に比較)
    

パフォーマンス: CPU 使用量は約 1% のコストしかかからないため、実質的に無料の近似値として推奨されます。デフォルトはオフですが、Config ファイルで有効化可能です。

設定ファイル/Dotfile サポート (v4.0.0 新機能)

.sccconfig
ファイルを追加することで、CLI 引数なしでのグローバルなオーバーライドが可能になりました。

  • 場所: プロジェクトルートディレクトリまたは環境変数
    SCC_CONFIG_PATH
    で指定したパス。
  • 内容例:
# count the way I like it
--no-cocomo
--exclude-dir node_modules
--format wide
  • このファイルには CLI 引数を記述するだけであり、悪意のあるスクリプトへの書き込みは防がれています。
  • 例:広範囲な表示や
    node_modules
    の除外、COCOMO 計算の無効化などが設定できます。

その他新機能と改善点

  • MCP サポート: 内蔵の Model Context Protocol (MCP) を備え、ローカル LLM と連携してコードベースの複雑性を発見・トークンを削減する用途に利用可能です(searchcode 等との相性も良好)。
  • LOCOMO: LLM を通じてコードベースの再構築コストを予測する独自の指標を提供。
  • 言語検出機能: Linguist 由来の機能を強化し、C++/ObjectiveC/C のヘッダー判定などがより精密化しました。
  • JSON パーセント表示:
    jq
    を利用した処理への対応。
  • 外部無視ファイル:
    --ignore-file
    オプションに対応(例:
    ~/.config/git/ignore
    )。
  • パフォーマンス調整: 多数の微小なバグ修正と性能チューニングが施されています。

まとめ

10 年前、Google は「ホットスポット」の概念を提唱しましたが、実装方法の問題で見送られました。scc v4.0.0 では、ノイズを除去したアプローチにより、オンボーディングや技術的負債の特定に極めて有効なツールとして蘇りました。

GitHub から最新バージョンを取得し、未経験のコードベースに対して

--hotspots
コマンドを実行してみてください。正しくリスクのある箇所が示されるかご確認ください。

同じ日のほかのニュース

一覧に戻る →

2026/08/29 0:17

GUI は完全にキーボードで操作可能であるべきです

## 日本語訳: 本文は、グラフィカルユーザーインターフェース(GUI)においてソフトウェア開発者が端末ベースの設計に回帰するのではなく、すべての機能がショートカットキーでアクセス可能な直感的かつ完全なキーボード駆動型の体験を最優先すべきであると主張しています。重要な点は、優れたユーザーエクスペリエンスはマウスなしで全てのアクションを行えるようにすることで実現されることであることです。この視点は、高度なキーボード制御がコマンドラインツールのみに属するという一般的な誤解に挑戦しています;その代わりに、著者の新しいアプリ「Klisi」などの現代の GUI は、すべての機能に対して包括的なアクセシビリティを成功裏に実証しています。GNOME ヒューマンインターフェースガイドラインのような業界標準は、アプリケーションがポインティングデバイスとキーボードの両方でシームレスに動作することを明確に要求しています。したがって、完全なキーボードナビゲーションの構築は技術的な課題としてではなく、すべてのユーザーの効率を大幅に向上させることを意図した設計上の選択として捉えるべきです。キーボードサポートをオプションの追加機能ではなくコア要件として扱うことで、企業は全体的な製品品質を向上させ、直感的で迅速なインタラクションを求める外部入力デバイスに依存しないユーザーをよりよくサービスできます。

2026/08/28 22:28

Htmx 4.0

## 日本語訳: htmx 4.0.0 では、XMLHttpRequest など従来の手法をフェッチ(fetch)インタフェースなどの現代のブラウザ API に置き換えるという大きな内部変更が導入されました。この更新により、`hx:xhr:*` のような古来のイベント属性は標準化された名前(例:`htmx:before:request`)へと置き換えられ、`hx-disable` といった非推奨要素は `hx-ignore` に置換されます。移行を支援するため、テンプレートにおけるエラー(付与不足や削除された属性の使用など)をスキャンするコマンドラインツール(`$ npx htmx.org@4.0.0 upgrade-check`)がリリースされています。重要なアーキテクチャ変更として、以前の自動継承からの変更となり、子要素への適用を望む場合、親属性に対して明示的に `:inherited` サフィックスを追加する必要があります。本リリースには、「morph swaps」(`<hx-partial>` タグを通じて)、`hx-live` という名前のスクリプトリングティングソリューション、そして `hx-preload` やストリーミングサポートなどを含むいくつかの新しい拡張機能が含まれています。履歴管理については、デフォルトで localStorage が使用され不再;代わりに、ステアジングが必要なチームのために、`hx-history-cache` 拡張機能を通じて sessionStorage を介したキャッシングが可能になります。移行には、バージョン 2.x がバージョン指定なしの CDN で 2027 年初頭まで引き続き利用可能である一方、バージョン 4.0.0 は特定の CDN URL(`https://unpkg.com/htmx.org@4.0.0/dist/htmx.min.js`)でアクセス可能です。アップグレードを行う企業は、非推奨要素を置換し、履歴キャッシングロジックをこれらの標準化された振る舞いと整合させる必要があります。

2026/08/29 0:58

今は、バグという噂だけで exploits を見つけるのに十分なものです。

## 日本語訳: 人工知能エージェントは、現在、人間チームが修正できる速度よりもはるかに速く脆弱性を発見し悪用するため、ソフトウェアセキュリティに対して即座の脅威を呈しています。この拡大するギャップにより、自動化された攻撃は、通常のパッチが公開される数日前、あるいは場合によっては数時間前に発生することがあり、セキュリティ環境そのものが根本的に変化しました。重要な例として、DeepSeek V4 Pro は OCaml 言語の cohttp ライブラリにおけるクリティカルなパス正規化エラーを特定しましたが、Claude Fable などの伝統的な AI モデルは、オープンソースのメンテナンを除外するセーフティフィルターによってこれらの問題を検出できないことがあります。一方、高度なシステムはこうした保護策を完全に回避します。脆弱性の発見からパッチが公開されるまでの間に、エージェント型 AI システムが新たなエクスプロイトを見つけ出すのに十分であるという噂が存在するだけでも、実稼働中の Web サーバーの脆弱性を特定してから 1 分以内にエクスプロイトを作成・テストした事例などがあり、その他には marimo の CVE-2026-39987 が 9 時間以内、Langflow の CVE-2026-33017 が 20 時間以内に悪用された例もあります。その結果、脆弱性の発見から悪用されるまでの平均期間は、近年の歴史において約 63 日であったものが、2026 年にはわずか 7 日にまで崩壊しました(一部のケースでは開示に対して相対的にマイナスの値となっています)。このレポートは Jane Street を経由した Slack で非公開で届けられ、Claude Fable 由来であり、Glasswing セキュリティブロックを有さないためパス正規化に関する関連問題を特定したのは DeepSeek V4 Pro でした。Project Glasswing は西側モデルのセキュリティガードにより通常のオープンソースメンテナンを除外するものの、15 ヵ国にわたる 150 の組織に拡大しています。「Bugonomics」とは、防御側の修復処理能力が LLM で生成されたエクスプロイトに後れを取るというボトルネックを指し、GitHub のプライベートフォークでは CI 統合が制限されマージは単一の PR に限定されるため、複雑なクロスリポジトリの修正には不向きです。この「antibotty」脅威の現実に耐えるために、業界は標準的な防御を超えて進まなければなりません。将来のセキュリティは、Linux カーネルのような継続的なリリース、プロトコルレベルの仮想パッチング、AI 駆動の攻撃生成の絶え間ないスピードに匹敵できる新たな防御ネットワークによるものとなるでしょう。迅速に適応できない場合、防御側は重要なインフラを保護するには単に遅すぎることになります。cohttp の修正には Sapphire Livingstone、Michael Dales、Török Edwin、Patrick Ferris、Hannes Mehnert、Thomas Gazagnaire によって行われたチームワークが関わっています。