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

PDF
DockerとPodmanの比較
Akihiro Suda
 
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
 
PDF
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
NTT DATA Technology & Innovation
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
NTT DATA Technology & Innovation
 
PDF
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
PDF
マイクロサービス 4つの分割アプローチ
増田 亨
 
PDF
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
 
DockerとPodmanの比較
Akihiro Suda
 
Dockerからcontainerdへの移行
Kohei Tokunaga
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
NTT DATA Technology & Innovation
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
NTT DATA Technology & Innovation
 
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
マイクロサービス 4つの分割アプローチ
増田 亨
 
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
 

What's hot (20)

PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
PDF
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PDF
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
 
PDF
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
 
PDF
Infrastructure as Code (IaC) 談義 2022
Amazon Web Services Japan
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PPTX
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
NTT DATA Technology & Innovation
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PPTX
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
PDF
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
 
PDF
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
Junji Nishihara
 
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
 
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PDF
AWSではじめるMLOps
MariOhbuchi
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
分散システムについて語らせてくれ
Kumazaki Hiroki
 
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
 
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
 
Infrastructure as Code (IaC) 談義 2022
Amazon Web Services Japan
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
NTT DATA Technology & Innovation
 
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
 
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
Junji Nishihara
 
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
AWSではじめるMLOps
MariOhbuchi
 
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
マイクロにしすぎた結果がこれだよ!
mosa siru
 
Ad

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

PDF
Tackling Complexity
Yoshitaka Kawashima
 
PDF
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
Samir Hammoudi
 
PDF
Dockerで.NET Core 3.0 GUIアプリを動かす話
You&I
 
PDF
試して学べるクラウド技術! OpenShift
Etsuji Nakai
 
PDF
CouchDB JP & BigCouch
Yohei Sasaki
 
PPTX
Java 9 and Future #jjug
Yuji Kubota
 
PPTX
fluxflex meetup in Tokyo
Kyosuke Inoue
 
PDF
20130719 CDP Night LightningTalk "Internal Port Concentrator"
Kazuki Ueki
 
PDF
Ingress on GKE/GCE
shouta yoshikai
 
PDF
とある制作会社の目次索引作成技法
Kenshi Muto
 
PDF
数式 → コード,文書:OpenGL計算ライブラリ実装の経験から
Tokyo Tech (Tokyo Institute of Technology)
 
PDF
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
 
PPTX
Fluxflex meetup 2011 in Tokyo
Kyosuke Inoue
 
PPTX
Azure Object Anchors Recap
Takahiro Miyaura
 
PDF
RubyKaigi Lightning Talks TwYM episode2
Kuniaki Igarashi
 
PDF
LT#7 Hello coffeeしてきた
Shingo Inoue
 
PDF
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
Kubernetes 初心者の僕からの JKD 参加報告
Kentaro NOMURA
 
PDF
C++ REST SDKを使ってWebサービスを利用する
You&I
 
PDF
ゲームアプリの数学@GREE GameDevelopers' Meetup
Ryuichi Kubuki
 
Tackling Complexity
Yoshitaka Kawashima
 
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
Samir Hammoudi
 
Dockerで.NET Core 3.0 GUIアプリを動かす話
You&I
 
試して学べるクラウド技術! OpenShift
Etsuji Nakai
 
CouchDB JP & BigCouch
Yohei Sasaki
 
Java 9 and Future #jjug
Yuji Kubota
 
fluxflex meetup in Tokyo
Kyosuke Inoue
 
20130719 CDP Night LightningTalk "Internal Port Concentrator"
Kazuki Ueki
 
Ingress on GKE/GCE
shouta yoshikai
 
とある制作会社の目次索引作成技法
Kenshi Muto
 
数式 → コード,文書:OpenGL計算ライブラリ実装の経験から
Tokyo Tech (Tokyo Institute of Technology)
 
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
 
Fluxflex meetup 2011 in Tokyo
Kyosuke Inoue
 
Azure Object Anchors Recap
Takahiro Miyaura
 
RubyKaigi Lightning Talks TwYM episode2
Kuniaki Igarashi
 
LT#7 Hello coffeeしてきた
Shingo Inoue
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
 
Kubernetes 初心者の僕からの JKD 参加報告
Kentaro NOMURA
 
C++ REST SDKを使ってWebサービスを利用する
You&I
 
ゲームアプリの数学@GREE GameDevelopers' Meetup
Ryuichi Kubuki
 
Ad

More from Shuto Suzuki (7)

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

Recently uploaded (9)

PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 

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