Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コードの複雑さを定量的に評価してみた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
bqnq
October 09, 2025
Technology
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コードの複雑さを定量的に評価してみた
bqnq
October 09, 2025
More Decks by bqnq
See All by bqnq
AIオーケストレーションを活用した 開発ワークフローの設計と実践
bqnq
0
110
メタプログラミングと モンキーパッチの話
bqnq
0
16
35歳までの若手エンジニア限定LT大会
bqnq
0
33
Other Decks in Technology
See All in Technology
When Does a Local Qwen Start to Break
morshoto
0
190
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.6k
AI時代におけるプロダクト横断勉強会の設計
zozotech
PRO
0
170
Azure Cost Management の FOCUS コストデータを迷わず読むための“3つの軸”
tetsuyaooooo
0
160
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
230
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
110
ペアプロの価値はコードを書くことだけじゃない
codmoninc
PRO
0
140
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
110
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
280
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
1.2k
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
130
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
2
380
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
4.8M
A Tale of Four Properties
chriscoyier
163
24k
Mobile First: as difficult as doing things right
swwweet
225
10k
Designing Experiences People Love
moore
143
24k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.7k
Technical Leadership for Architectural Decision Making
baasie
3
560
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Being A Developer After 40
akosma
91
590k
Producing Creativity
orderedlist
PRO
348
41k
Transcript
1 コードの複雑さを 定量的に評価してみた @bqnq d2i-25 2025/10/08 GMO ペパボ株式会社 EC事業部
2 ⾃⼰紹介 EC事業部 プロダクトチーム 2025年 新卒⼊社 bqnq(ばな) Kikuchi Shinji 普段はRailsとMySQLと向き合っています。 •
今⽇給料⽇だと浮かれていたら明⽇でした 💴 • チェーンソーマン レゼ編を⾒ました 💣🌺 • Twitter : @_bqnq
突然ですが 3
AIが書いたコードを読むの つらくないですか? 4
AIが書いたコードに機能を追加する のが⼤変だったので評価してみました 5
なぜLTでこの話をしようと思ったのか? 6 • 研修の⼀環で成果物を⾃分たちで考えてアウトプット • 期間は2週間でゼロから実装、⾔語はGoを選択 • AI Agentを使う前提で、開発を進めた •
新しく機能を追加するのに時間がかかってしまった きっかけ: 機能追加に時間がかかった
AIが書いたコードが複雑だった 7 • ファイル処理の機能を追加 .csv形式に加えて.xlsx形式にも対応したい • 簡単そうに⾒えて⼤変だった 処理の中に、外部からファイルを取得、.csv形式 のみに対応したエンコード処理が含まれていた ⼤変だったこと
コードリーディングが下⼿? or 実装が複雑になっている? 8
複雑性を評価指標で評価してみる 9
循環的複雑度 10 • Thomas J. McCabeによって提案された指標 • M = E
- N + 2P E: エッジ数, N:ノード数, P:連結成分 循環的複雑度 (Cyclomatic Complexity: CC ) https://www.mccabe.com/pdf/mccabe-nist235r.pdf if (n == 0) { x += 1; } else if n >= 1 { x += 2; } else { x = 0; } else if if start x+=1 x+=2 x=0 end E = 8 N = 7 P = 1 M = 2
循環的複雑度の数値と実装の対応 11 循環的複雑度が⾼い実装と低い実装 条件分岐が複雑化するほど循環的複雑度も⾼くなる price = input() if price >
10000: if price > 50000: tax = price * 0.2 else: tax = price * 0.15 else: if price > 5000: tax = price * 0.1 else: if price > 1000: tax = price * 0.05 price = input() rate = 0.0 if price > 50000: rate = 0.2 elif price > 10000: rate = 0.15 elif price > 5000: rate = 0.1 elif price > 1000: rate = 0.05 tax = price * rate if price % 2 == 0: tax += 50 print(price + tax)
循環的複雑度 12 • 循環的複雑度の値についてMathWorksが意味付け • 10以下が望ましく、30以上でリファクタ対象 循環的複雑度の値の意味 https://jp.mathworks.com/discovery/cyclomatic-complexity.html
循環的複雑度 CC を計算してみる 13 • プロジェクトのコードはGoで実装 • gocyclo: Go向けの循環的複雑度を計算するコマンド 実際に調査してみた
https://github.com/fzipp/gocyclo
調査結果 14 調査結果: 循環的複雑度が⾼いファイルが存在 ファイル処理を⾏っている実装箇所のCCが29と⾼い値に 循環的複雑度が20を超える実装が4つ
最初からCCが⾼かった? or 機能追加によって⾼くなった? 15
調査結果 16 commitを遡り循環的複雑度の推移を計算 commit毎に循環的複雑度は増加 ある時点から急激に増加している commit、古いほど左 循環的複雑度の総和
調査結果 17 commitを遡り循環的複雑度の推移を計算 commit、古いほど右 循環的複雑度の総和 Excel処理、計算処理、検証ロジック追加 基本的なCSV処理 データ抽出機能追加
調査結果 18 循環的複雑度が10以上の関数の数の推移 循環的複雑度が10以上の関数の数 commit、古いほど右 グラフが右肩上がり コミットが増えるたび関数が複雑化
調査結果の分析 19 1. 要件変更に伴い1つの関数への責任が増加 情報抽出 + エラーハンドリング + データ計算, ⽣成
2. 条件分岐の複雑化 if → switch、多重if 3. 関数のネストの深さが増加。2層から6層へ CCが⾼くなった要因
まとめ 20 • コード品質を評価する指標に循環的複雑度がある • 機能追加により、循環的複雑度が急に増加する可能性 • 複雑度が増加する要因には、機能追加の際に 関数の責務が増えてしまうことが挙げられる •
CIで循環的複雑度を計算して、対策できそう まとめ
コードを定量評価してみると 発⾒があって⾯⽩いかもしれません! 21