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
2
120
Cognitive Complexity でコードの複雑さを定量的に計測しよう
s2terminal
June 09, 2019
Tweet
Share
More Decks by s2terminal
See All by s2terminal
AIをWebアプリに実装するための便利なPythonライブラリ
s2terminal
0
500
NiceGUI is Nice
s2terminal
0
510
段階的なシステムリプレースを実現するデータ同期技術
s2terminal
0
110
1年でモダンなフロントエンドに追いついた話 2019-08-22 Mix Leap Joint #26
s2terminal
0
37
20190706 BCU30 事業を変えるシステムリプレース
s2terminal
0
29
MySQLオンラインマイグレーションツールgh-ostで深夜メンテナンスを無くした話
s2terminal
0
32
Microsoft Azureで 女子力を生成する
s2terminal
0
50
かんたん機械学習はじめの1歩AzureMachineLearningでTweetをレコメンド
s2terminal
0
30
Other Decks in Technology
See All in Technology
バックエンドエンジニアによるフロントエンドテスト拡充の具体的手法
kinosuke01
1
400
30代エンジニアが考える、エンジニア生存戦略~~セキュリティを添えて~~
masakiokuda
4
1.9k
Redefine_Possible
upsider_tech
0
130
ランチの間に GitHub Copilot Agent が仕事を終わらせてくれた話
bicstone
5
680
[CATS]Amazon Bedrock GenUハンズオン座学資料 #2 GenU環境でRAGを体験してみよう
tsukuboshi
0
110
AI の活用における課題と現状、今後の期待
asei
4
360
初めてのPostgreSQLメジャーバージョンアップ
kkato1
0
150
DIってなんだか難しい? 依存という概念を「使う・使われる」 という言葉で整理しよう
akinoriakatsuka
1
720
Keynote - KCD Brazil - Platform Engineering on K8s (portuguese)
salaboy
0
110
組織に持ち込む脅威モデリング
nikinusu
3
710
Javaの新しめの機能を知ったかぶれるようになる話 #kanjava
irof
3
4.6k
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
160
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
The Language of Interfaces
destraynor
156
24k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
What's in a price? How to price your products and services
michaelherold
244
12k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Documentation Writing (for coders)
carmenintech
69
4.7k
The Cult of Friendly URLs
andyhume
78
6.3k
The Pragmatic Product Professional
lauravandoore
33
6.5k
A Tale of Four Properties
chriscoyier
158
23k
Testing 201, or: Great Expectations
jmmastey
42
7.3k
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