SlideShare a Scribd company logo
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

More Related Content

PPTX
本当は恐ろしい分散システムの話
PPTX
世界一わかりやすいClean Architecture
PDF
BuildKitの概要と最近の機能
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
PDF
ドメイン駆動設計 基本を理解する
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PPTX
ぱぱっと理解するSpring Cloudの基本
PPTX
比較サイトの検索改善(SPA から SSR に変換)
本当は恐ろしい分散システムの話
世界一わかりやすいClean Architecture
BuildKitの概要と最近の機能
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
ドメイン駆動設計 基本を理解する
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
ぱぱっと理解するSpring Cloudの基本
比較サイトの検索改善(SPA から SSR に変換)

What's hot (20)

PDF
Dockerからcontainerdへの移行
PPTX
クラウドでも非機能要求グレードは必要だよね
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
PPTX
Dockerからcontainerdへの移行
PDF
マイクロサービス 4つの分割アプローチ
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
PDF
オンラインゲームの仕組みと工夫
PDF
Akkaとは。アクターモデル とは。
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
PPTX
Azure API Management 俺的マニュアル
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
Javaのログ出力: 道具と考え方
PDF
シリコンバレーの「何が」凄いのか
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
PDF
テスト文字列に「うんこ」と入れるな
PDF
ドメイン駆動設計の正しい歩き方
PDF
GoによるWebアプリ開発のキホン
Dockerからcontainerdへの移行
クラウドでも非機能要求グレードは必要だよね
Python におけるドメイン駆動設計(戦術面)の勘どころ
Dockerからcontainerdへの移行
マイクロサービス 4つの分割アプローチ
SPAセキュリティ入門~PHP Conference Japan 2021
Python 3.9からの新定番zoneinfoを使いこなそう
オンラインゲームの仕組みと工夫
Akkaとは。アクターモデル とは。
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Azure API Management 俺的マニュアル
ドメイン駆動設計サンプルコードの徹底解説
Javaのログ出力: 道具と考え方
シリコンバレーの「何が」凄いのか
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
テスト文字列に「うんこ」と入れるな
ドメイン駆動設計の正しい歩き方
GoによるWebアプリ開発のキホン
Ad

Similar to Cognitive Complexity でコードの複雑さを定量的に計測しよう (10)

PDF
ソースコードの品質向上のための効果的で効率的なコードレビュー
PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
PDF
Source monitorと複雑度のはなし
PPTX
QuizNow yapcasia
PDF
アジャイルなテストの見積もりと計画作り
PDF
JAWS DAYS 2019
PDF
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
PDF
minneで学ぶクラウド脳
PDF
XPと環境の微妙な関係夜LT版
PDF
「コンテキストの理解による技法、事例の分析」森崎 修司
ソースコードの品質向上のための効果的で効率的なコードレビュー
テストとリファクタリングに関する深い方法論 #wewlc_jp
Source monitorと複雑度のはなし
QuizNow yapcasia
アジャイルなテストの見積もりと計画作り
JAWS DAYS 2019
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
minneで学ぶクラウド脳
XPと環境の微妙な関係夜LT版
「コンテキストの理解による技法、事例の分析」森崎 修司
Ad

More from Shuto Suzuki (7)

PDF
段階的なシステムリプレースを実現するデータ同期技術
PPTX
TypeScriptでCLIアプリケーション開発
PDF
1年でモダンなフロントエンドに追いついた話 2019-08-22 Mix Leap Joint #26
PDF
20190706 BCU30 事業を変えるシステムリプレース
PDF
MySQLオンラインマイグレーションツールgh-ostで深夜メンテナンスを無くした話
PPTX
Monaco Editor on Cloud
PDF
Microsoft Azureで 女子力を生成する
段階的なシステムリプレースを実現するデータ同期技術
TypeScriptでCLIアプリケーション開発
1年でモダンなフロントエンドに追いついた話 2019-08-22 Mix Leap Joint #26
20190706 BCU30 事業を変えるシステムリプレース
MySQLオンラインマイグレーションツールgh-ostで深夜メンテナンスを無くした話
Monaco Editor on Cloud
Microsoft Azureで 女子力を生成する

Cognitive Complexity でコードの複雑さを定量的に計測しよう