Slide 1

Slide 1 text

20190610 kansai.ts #1 s2terminal / suzuki.sh Twitter@suzukiterminal GitHub@s2terminal Qiita@suzuki_sh Cognitive Complexity で コードの複雑さを定量的に計測しよう

Slide 2

Slide 2 text

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)

Slide 3

Slide 3 text

を 使ってみた

Slide 4

Slide 4 text

Code Climate とは? • GitHub リポジトリと連携することで、 品質(Quality)や生産性(Velocity)を測定できるサービス • OSSなら、Quality機能は無料で利用可能 • JavaScriptはもちろんTypeScriptにも標準対応

Slide 5

Slide 5 text

使ってみた結果 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/

Slide 6

Slide 6 text

使ってみた結果 “toCommandSections() メソッドが 29行もあるから、25行以下にしろよ” “1時間あれば直せるだろ” わかる お前誰?

Slide 7

Slide 7 text

使ってみた結果 “read()メソッドのCognitive Complexityが 8あるから、5以下にしろよ” “45分あれば直せるだろ” わからない お前誰?

Slide 8

Slide 8 text

Cognitive Complexity とは ? Photo by Shahadat Shemul on Unsplash

Slide 9

Slide 9 text

Cognitive Complexity is 何? Cognitive Complexity (コグニティブ・コンプレクシティー) 訳してみれば「認知的 複雑度」 コードの複雑さを測る指標のひとつ 2016年 SonarSource社が提唱

Slide 10

Slide 10 text

「Cyclomatic Complexity」と「Cognitive Complexity」 似たものに Cyclomatic Complexity(循環的複雑度) がある • 線形的に独立した経路の数 • 分岐網羅に必要なテストケースの数 約40年前に考案された Cyclomatic Complexity の 問題点を解決するための指標として、 あらたに Cognitive Complexity が考え出された、とのこと

Slide 11

Slide 11 text

Cyclomatic Complexity Cognitive Complexity サイクロマティック コンプレクシティー コグニティブ コンプレクシティー 循環的 複雑度 認知的 複雑度 1976 年 Thomas McCabe氏が考案 2016 年 SonarSource社が考案 機械的なテストの難しさを測る 人間にとっての理解の難しさを測る

Slide 12

Slide 12 text

どちらのコードが ”複雑” だと思いますか?

Slide 13

Slide 13 text

4 Cyclomatic Complexity 4 1 Cognitive Complexity 7

Slide 14

Slide 14 text

「Cyclomatic Complexity」と「Cognitive Complexity」 • Cyclomatic Complexity は、単純な switch 文で「4」 • switch 文の分岐網羅のためにテストケースが 4 必要になるため • テストケースが増えるので複雑である、という考え方 • Cognitive Complexity は、単純な switch 文では「1」 • switch 文がひとつなので、+1 • 人間が読むには複雑ではない、という考え方 Cognitive Complexity を使うことで、ソースコードの 人間にとっての理解しやすさを定量的に計測できる

Slide 15

Slide 15 text

Cognitive Complexity の 具体例 Photo by Immo Wegmann on Unsplash

Slide 16

Slide 16 text

Code is considered more complex for each "break in the linear flow of the code“ 「コードの線形的な流れを乱す」とき、より複雑とみなす

Slide 17

Slide 17 text

線形的な流れを乱すとき、複雑とみなす Cognitive Complexity: 0 Cognitive Complexity: 1 Cognitive Complexity: 1

Slide 18

Slide 18 text

線形的な流れを乱すとき、複雑とみなす +1 +1 +1 +1 Cognitive Complexity: 2 Cognitive Complexity: 2

Slide 19

Slide 19 text

Code is considered more complex when "flow breaking structures are nested" 「線形的な流れを乱すコードが、ネストされている」ようなときは 一層複雑であるとみなす

Slide 20

Slide 20 text

流れを乱すネストが深いほど、複雑とみなす +1 +2 ( if 1 + nest 1 ) Cognitive Complexity: 3

Slide 21

Slide 21 text

流れを乱すネストが深いほど、複雑とみなす +1 +2 ( if 1 + nest 1 ) +3 ( if 1 + nest 2 ) Cognitive Complexity: 6

Slide 22

Slide 22 text

Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one 言語仕様によって提供されているショートハンドで 複数の式をひとつにまとめたようなときは、複雑であるとはみなされない

Slide 23

Slide 23 text

ショートハンドが使われていれば、複雑とみなさない Cognitive Complexity: 2 Cognitive Complexity: 1

Slide 24

Slide 24 text

冒頭の指摘の実例 (Cognitive Complexity 8) +1 +2 ( if 1 + nest 1) +1 +1 +3 ( if 1 + nest 2 )

Slide 25

Slide 25 text

Cognitive Complexity の 使い方 Photo by: https://pixabay.com/images/id-1463929/

Slide 26

Slide 26 text

Cognitive Complexity を測るには? • Code Climate を使うことで、Cognitive Complexity など さまざまな指標を測定できる • OSSなら、Quality機能は無料で利用可能

Slide 27

Slide 27 text

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(ゼロ以上でアラート)で動かしているだけ。

Slide 28

Slide 28 text

まとめ • Cognitive Complexity の低い、読みやすいコードを書こう • 分岐を減らす • ネストを減らす • ショートハンドを使う • Code Climate で Cognitive Complexity を測定できる • OSSなら無料 • TypeScript にも標準対応 • CLI版もあり、Dockerで動作する

Slide 29

Slide 29 text

おまけ: NGな使い方 • 「お前のコード Cognitive Complexity 高すぎない?」と 新人にコードレビューしてはいけません • 新人が死にます • 「俺なら45分で直せる」と 新人にコードレビューしてはいけません • 新人が死にます

Slide 30

Slide 30 text

参考 • 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

Slide 31

Slide 31 text

Thank you! follow me https://twitter.com/suzukiterminal