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
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Search
s2terminal
June 09, 2019
Technology
190
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cognitive Complexity でコードの複雑さを定量的に計測しよう
s2terminal
June 09, 2019
More Decks by s2terminal
See All by s2terminal
TypeScriptでJupyter
s2terminal
0
130
AIをWebアプリに実装するための便利なPythonライブラリ
s2terminal
0
650
NiceGUI is Nice
s2terminal
0
850
段階的なシステムリプレースを実現するデータ同期技術
s2terminal
0
180
1年でモダンなフロントエンドに追いついた話 2019-08-22 Mix Leap Joint #26
s2terminal
0
50
20190706 BCU30 事業を変えるシステムリプレース
s2terminal
0
70
MySQLオンラインマイグレーションツールgh-ostで深夜メンテナンスを無くした話
s2terminal
0
75
Microsoft Azureで 女子力を生成する
s2terminal
0
70
かんたん機械学習はじめの1歩AzureMachineLearningでTweetをレコメンド
s2terminal
0
61
Other Decks in Technology
See All in Technology
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
200
2026 AI Memory Architecture
nagatsu
0
580
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
160
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
140
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
280
“詰む”前に仕組みを作れ 〜技術の波に溺れないためのキャッチアップ術〜
takasyou
7
4.3k
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
210
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.1k
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
150
千葉での単身赴任からAWSをやり続け、千葉に戻ってきた話
yama3133
1
120
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
170
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
120
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
We Are The Robots
honzajavorek
0
260
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Done Done
chrislema
186
16k
A Tale of Four Properties
chriscoyier
163
24k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
140
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Navigating Weather and Climate Data
rabernat
0
250
Transcript
20190610 kansai.ts #1 s2terminal / suzuki.sh Twitter@suzukiterminal GitHub@s2terminal Qiita@suzuki_sh Cognitive
Complexity で コードの複雑さを定量的に計測しよう
Self Introduction $ man s2terminal NAME: s2terminal or suzuki.sh JOB:
Web Application Engineer REGION: Nagoya (5 years), Osaka (2 years) SKILL: PHP, Ruby, Azure, AWS, and TypeScript LOVE: Etrian Odyssey, Ninja Slayer, Puella Magi Madoka Magica (Miki Sayaka), THE IDOLM@STER SHINY COLORS (Kuwayama Chiyuki)
を 使ってみた
Code Climate とは? • GitHub リポジトリと連携することで、 品質(Quality)や生産性(Velocity)を測定できるサービス • OSSなら、Quality機能は無料で利用可能 •
JavaScriptはもちろんTypeScriptにも標準対応
使ってみた結果 https://codeclimate.com/github/s2terminal/i-read-u/issues 拙作のOSS「I Read U」 TypeScript 製 CLIツール $ npm
install --global i-read-u 詳しくは: https://s2terminal.github.io/i-read-u/
使ってみた結果 “toCommandSections() メソッドが 29行もあるから、25行以下にしろよ” “1時間あれば直せるだろ” わかる お前誰?
使ってみた結果 “read()メソッドのCognitive Complexityが 8あるから、5以下にしろよ” “45分あれば直せるだろ” わからない お前誰?
Cognitive Complexity とは ? Photo by Shahadat Shemul on Unsplash
Cognitive Complexity is 何? Cognitive Complexity (コグニティブ・コンプレクシティー) 訳してみれば「認知的 複雑度」 コードの複雑さを測る指標のひとつ
2016年 SonarSource社が提唱
「Cyclomatic Complexity」と「Cognitive Complexity」 似たものに Cyclomatic Complexity(循環的複雑度) がある • 線形的に独立した経路の数 •
分岐網羅に必要なテストケースの数 約40年前に考案された Cyclomatic Complexity の 問題点を解決するための指標として、 あらたに Cognitive Complexity が考え出された、とのこと
Cyclomatic Complexity Cognitive Complexity サイクロマティック コンプレクシティー コグニティブ コンプレクシティー 循環的 複雑度
認知的 複雑度 1976 年 Thomas McCabe氏が考案 2016 年 SonarSource社が考案 機械的なテストの難しさを測る 人間にとっての理解の難しさを測る
どちらのコードが ”複雑” だと思いますか?
4 Cyclomatic Complexity 4 1 Cognitive Complexity 7
「Cyclomatic Complexity」と「Cognitive Complexity」 • Cyclomatic Complexity は、単純な switch 文で「4」 •
switch 文の分岐網羅のためにテストケースが 4 必要になるため • テストケースが増えるので複雑である、という考え方 • Cognitive Complexity は、単純な switch 文では「1」 • switch 文がひとつなので、+1 • 人間が読むには複雑ではない、という考え方 Cognitive Complexity を使うことで、ソースコードの 人間にとっての理解しやすさを定量的に計測できる
Cognitive Complexity の 具体例 Photo by Immo Wegmann on Unsplash
Code is considered more complex for each "break in the
linear flow of the code“ 「コードの線形的な流れを乱す」とき、より複雑とみなす
線形的な流れを乱すとき、複雑とみなす Cognitive Complexity: 0 Cognitive Complexity: 1 Cognitive Complexity: 1
線形的な流れを乱すとき、複雑とみなす +1 +1 +1 +1 Cognitive Complexity: 2 Cognitive Complexity:
2
Code is considered more complex when "flow breaking structures are
nested" 「線形的な流れを乱すコードが、ネストされている」ようなときは 一層複雑であるとみなす
流れを乱すネストが深いほど、複雑とみなす +1 +2 ( if 1 + nest 1 )
Cognitive Complexity: 3
流れを乱すネストが深いほど、複雑とみなす +1 +2 ( if 1 + nest 1 )
+3 ( if 1 + nest 2 ) Cognitive Complexity: 6
Code is not considered more complex when it uses shorthand
that the language provides for collapsing multiple statements into one 言語仕様によって提供されているショートハンドで 複数の式をひとつにまとめたようなときは、複雑であるとはみなされない
ショートハンドが使われていれば、複雑とみなさない Cognitive Complexity: 2 Cognitive Complexity: 1
冒頭の指摘の実例 (Cognitive Complexity 8) +1 +2 ( if 1 +
nest 1) +1 +1 +3 ( if 1 + nest 2 )
Cognitive Complexity の 使い方 Photo by: https://pixabay.com/images/id-1463929/
Cognitive Complexity を測るには? • Code Climate を使うことで、Cognitive Complexity など さまざまな指標を測定できる
• OSSなら、Quality機能は無料で利用可能
Cognitive Complexity の計測を手軽に試せる環境を作った https://github.com/s2terminal/cognitive-complexity-example git clone して、index.ts 等を適当に編集したのち docker-compose run
--rm analyze コマンドを打つと Cognitive Complexity を算出してくれる (※Windows非対応) やっていることは、CodeClimate CLI 版の Docker イメージ持ってきて Cognitive Complexity だけ 許容値-1(ゼロ以上でアラート)で動かしているだけ。
まとめ • Cognitive Complexity の低い、読みやすいコードを書こう • 分岐を減らす • ネストを減らす •
ショートハンドを使う • Code Climate で Cognitive Complexity を測定できる • OSSなら無料 • TypeScript にも標準対応 • CLI版もあり、Dockerで動作する
おまけ: NGな使い方 • 「お前のコード Cognitive Complexity 高すぎない?」と 新人にコードレビューしてはいけません • 新人が死にます
• 「俺なら45分で直せる」と 新人にコードレビューしてはいけません • 新人が死にます
参考 • Cognitive Complexity - Code Climate • https://docs.codeclimate.com/docs/cognitive-complexity •
COGNITIVE COMPLEXITY - A new way of measuring understandability - G. Ann Campbell • https://www.sonarsource.com/docs/CognitiveComplexity.pdf • Cognitive Complexity で、コードの読みやすさを定量的に計測しよう • https://qiita.com/suzuki_sh/items/824c36b8d53dd2f1efcb • 新人プログラマをレビューで殺さない方法 • https://qiita.com/hiraike32/items/32840b11536fa1b78621 • Code Climate • https://codeclimate.com/ • 画像の出典 • https://unsplash.com/photos/qnrJoo2_4EQ • https://unsplash.com/photos/O2MdroNurVw • https://pixabay.com/photos/pasta-spaghetti-food-italian-1463929/#content
Thank you! follow me https://twitter.com/suzukiterminal