SlideShare a Scribd company logo
Managing and Visualizing

JavaScript Complexity
Jarrod Overson
Consultant @ Gossamer.io
jarrodoverson.com
Yes, we’ll talk about

“Code Complexity”
and

“Code Quality”
Check your bias at the door
We’ll deal with it later
1. Why is this important now
2. Static Analysis & Linting
3. Visualizing Complexity
The obvious…
JavaScript is Dynamic
all the obvious pitfalls compounded by
Immature tooling and IDEs
Wildly variable module styles
Best practices vary as language evolves
Server & Client similar yet so different
The Talent Pool is ridic
Web Platform
Engineers

jQuery experts
Closures?
The less obvious…
Progress is staggering
It’s hard to keep up
The next tech might not be usable yet
When it is, you want to actually
be able to use it
Refactoring isn’t easy
Callback hell is more than
just deep nesting
!

IDEs can’t help much, yet
!

But flexibility is more important
on the web than anywhere else
And the hard to admit…
The Web is hard
Web Applications are not solved
Even the giants pivot and backtrack
So many solutions still don’t exist
So why are we here?
Why bother?
JS coasted to the lead
on neutral
And this isn’t even

its final form
We can see where it’s headed
and we’re betting on JS
1. Why is this important now
2. Static Analysis & Linting
3. Visualizing Complexity
Respect your JavaScript
and codify that respect.
All code should look the same.
Style
Naming
Punctuation
Indentation
Comments
Case
Get everyone together
1. Agree
2. Document
3. Enforce
https://github.com/rwaldron/idiomatic.js/
https://github.com/Seravo/js-winning-style
https://github.com/airbnb/javascript
Coding conventions based on
Github analysis
1. >90% use last comma
2. >80% use space indents
3. >55% use single quotes
http://sideeffect.kr/popularconvention/#javascript
Lax enforcement begets violations.

Warnings need to fail builds.
These is as important as failed tests.
Know your options
JSLint
	 	

Crockford-style linter, low configuration

Closure Linter
	 	

Google-style linter, low configuration

JSHint ✔
	 	

Community driven JSLint fork, moderately configurable

ESLint ✔
	 	

Pluggable styles, highly configurable
Know your options’ options
{

}

"maxerr"
"bitwise"
"camelcase"
"curly"
"eqeqeq"
"forin"
"immed"
"indent"
"latedef"
"newcap"
"noarg"
"noempty"
"nonew"
"plusplus"
"quotmark"
//...

:
:
:
:
:
:
:
:
:
:
:
:
:
:
:

50,
true,
false,
true,
true,
true,
false,
4,
false,
false,
true,
true,
false,
false,
false
Be aggressive.
Default to overly strict.
Smart deviation is
OK and expected.
!
!

function fn(param) {
/*jshint eqeqeq:false*/
!

if (param == 42) return;
!

}
Set complexity limits
"maxparams"
"maxdepth"
"maxstatements"
"maxcomplexity"
"maxlen"

:
:
:
:
:

4,
4,
20,
7,
100
What is

Cyclomatic Complexity
a.k.a.

Conditional Complexity
?
Cyclomatic Complexity
is not
magic
nerd hokum
something you should ignore
Cyclomatic Complexity
is
the number of paths
through a block of code
(technically)
Cyclomatic Complexity
is
how hard your code
is to test.
(practically)
Complexity : 1
!

function main(a) {
!

}
Complexity : 2
function main(a) {
if (a > 5) {
}
}
Complexity : ? still 2
function main(a) {
if (a > 5) {
!

} else {
!

}
}
Complexity : ? now 3
function main(a) {
if (a > 10) {
!

} else if(a > 5) {
!

}
}
Complexity : ? still 3
function main(a) {
if (a > 10) {
!

} else if(a > 5) {
!

} else {
!

}

}
Complexity : ? also 3
function main(a) {
if (a > 5) {
if (a > 10) {
!

}
}
}
Complexity : 7
function main(a) {
if (a) {
} else if (a) {
}
!

if (other) { }
!

}

for (var i = 0; i < a; i++) {
if (i % 2) {
} else if (i % 3) {
}
}
Don’t get hung up on numbers
!

function main() {
/*jshint maxcomplexity:12*/
!

}

//...

!

* note : jshint calculates complexity differently than
complexity-report (plato, grunt-complexity)
Cyclomatic Complexity
is an early warning but isn’t everything.
OMG! I’m going to
make the best .jshintrc
Managing JavaScript Complexity
It’s ok.
Have an ideal set of options,
and a current set that passes now.

Visualize your goal.
1. Why is this important now
2. Static Analysis & Linting
3. Visualizing Complexity
Plato.
One cool guy.

github.com/es-analysis/plato
Managing JavaScript Complexity
Visualize your progress.
Target hot spots and track progress.

Promote files when ready.
When a file clears, promote it
to your ideal jshintrc.
Files passing “ideal” settings
Files to target next
Someday…
Challenge Accepted.

You
But wait! There’s MORE!
Managing JavaScript Complexity
Code is a liability.
Your job is to provide value with
as little code as possible.
How many lines of code does
your main project have right now?
If you don’t know, within 10%,
then you’re ignoring it.
Treat SLOC like credit card debt.

Don’t add to it without knowing the balance.
Managing JavaScript Complexity
Maintainability Index?

Awesome,
JavaScript is a real
platform now!

You’re
drunk

You’re both right.
Maintainability : 100

// empty file

Well we can buy that.
Maintainability : 95
var foo = 42;

Seems harsh, but ok.
Maintainability : 83
var foo = 42;
!

var bar = Math.log(foo++);

Holy crap, we’re dropping fast…
Maintainability : 92
var foo = 42;
!

function calc(x) {
return Math.log(x++);
}
!

var bar = calc(foo);
Ok, that does seem better…
Toolable via grunt-complexity

https://github.com/vigetlabs/grunt-complexity
What are we really working with here?
var vocabulary = unqOperators + unqOperands;
var length = totOperators + totOperands;
var difficulty = (unqOperators / 2) *
(totOperands / unqOperands);
var volume = length * Math.log2(vocabulary);
var effort = difficulty * volume;
!

But don’t look at

var maintainabilityIndex = Math.max(
0,
(
171 +
-3.42 * Math.log(aveEffort) +
!
-0.23 * (aveComplexity) +
-16.2 * Math.log(aveLOC)
Smarter people are responsible
) * 100 / 171
);

me for questions
1976 Thomas McCabe - Cyclomatic Complexity
1977 Maurice Halstead - Halstead Metrics
1991 Oman/Hagemeister - Maintainability Index

Phil Booth
JavaScript Implementation

Ariya Hidayat
Source Analysis (Esprima)
Managing JavaScript Complexity
Managing JavaScript Complexity
Oh, come on.
These numbers are for
introspection and exploration
These calculations have been praised and
criticised, promoted and shot down.
(and Halstead died before
being able to defend them)
The point is
“ The unexamined code
is not worth releasing ”
- Socrates
Code
is not just logic
Code
is the api between
imagination
and reality
Inconsistent, complex

Code
is an inconsistent, complex

API
Tool
how you code
Hack
how you code
Visualize
how you code
Visualize
Everything
Jarrod Overson
@jsoverson
jarrod@jsoverson.com
jsoverson.com
jsoverson.com/google+
jsoverson.com/linkedin
jsoverson.com/github
jsoverson.com/twitter

More Related Content

PPT
Sindromul de umplere alveolara
PDF
Medicina Legală
PPTX
Pengantar anatomi
PPT
Glosar de termeni in imagistica toracelui
PPT
9. BASIC LIFE SUPPORT PMI.ppt
PPT
Aspecte radiologice in sarcoidoza mediastino pulmonara
PPTX
Anatomia topografica a plaminului 1
PDF
Vai trò siêu âm tim trong phẫu thuật tim
Sindromul de umplere alveolara
Medicina Legală
Pengantar anatomi
Glosar de termeni in imagistica toracelui
9. BASIC LIFE SUPPORT PMI.ppt
Aspecte radiologice in sarcoidoza mediastino pulmonara
Anatomia topografica a plaminului 1
Vai trò siêu âm tim trong phẫu thuật tim

What's hot (20)

PDF
Infarctul miocardic acut
PPTX
Penatalaksanaan pasien trauma ns
PDF
Ventilasi Mekanik (Mechanical Ventilator) Eri Yanuar
DOC
Bahan kentang goreng tepung
PDF
Laporan praktikum membran biologi
DOC
Leaflet pneumotoraks
PPT
Linii kerley
DOCX
Anafilaktik (2)
PPT
Semne in radiologia toracică
PPT
Chisturi pulmonare
PPT
Personal Brilliance An Introduction Slide Show
PDF
Hoạt động phân phối và quảng bá sản phẩm thông tin thư viện tại thư viện họ...
PPTX
Axul hipotalamo-hipofizar
PPTX
RINGKASAN KOMPONEN BHD BERKUALITAS.pptx
PPT
Sistem Muskuloskeletal
PDF
44851220 morfologia-dintilor
PDF
Diploma - NEOMA Business School
PPTX
Sistem kardiovaskuler
PPTX
Sistem syaraf
Infarctul miocardic acut
Penatalaksanaan pasien trauma ns
Ventilasi Mekanik (Mechanical Ventilator) Eri Yanuar
Bahan kentang goreng tepung
Laporan praktikum membran biologi
Leaflet pneumotoraks
Linii kerley
Anafilaktik (2)
Semne in radiologia toracică
Chisturi pulmonare
Personal Brilliance An Introduction Slide Show
Hoạt động phân phối và quảng bá sản phẩm thông tin thư viện tại thư viện họ...
Axul hipotalamo-hipofizar
RINGKASAN KOMPONEN BHD BERKUALITAS.pptx
Sistem Muskuloskeletal
44851220 morfologia-dintilor
Diploma - NEOMA Business School
Sistem kardiovaskuler
Sistem syaraf
Ad

Viewers also liked (7)

PDF
React, Redux and es6/7
PDF
React Redux React Native
PDF
Understanding, measuring and improving code quality in JavaScript
PDF
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
PDF
Software Metrics
PDF
Github 으로 학교 팀 프로젝트 하기
PDF
5 Presentation design trends 2017
React, Redux and es6/7
React Redux React Native
Understanding, measuring and improving code quality in JavaScript
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
Software Metrics
Github 으로 학교 팀 프로젝트 하기
5 Presentation design trends 2017
Ad

Similar to Managing JavaScript Complexity (20)

PPTX
All of Javascript
PPTX
Search for Vulnerabilities Using Static Code Analysis
PPTX
Real World Single Page App - A Knockout Case Study
PDF
Polyglot and Poly-paradigm Programming for Better Agility
PDF
writing self-modifying code and utilizing advanced assembly techniques
PDF
Huge web apps web expo 2013
PPTX
Browsers
PDF
NodeJS: the good parts? A skeptic’s view (jmaghreb, jmaghreb2013)
PDF
Managing JavaScript Complexity in Teams - Fluent
PDF
Robots in Swift
PPTX
All of javascript
PDF
10 Groovy Little JavaScript Tips
PPTX
Test driven development for infrastructure as-a-code, the future trend_Gianfr...
PDF
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
PPT
Planning JavaScript and Ajax for larger teams
PPT
Douglas Crockford Presentation Goodparts
PDF
Developer Job in Practice
PDF
SFScon 21 - Davide Montesin - Typescript vs. Java
PDF
Intro to JavaScript
PDF
Thinking In Swift
All of Javascript
Search for Vulnerabilities Using Static Code Analysis
Real World Single Page App - A Knockout Case Study
Polyglot and Poly-paradigm Programming for Better Agility
writing self-modifying code and utilizing advanced assembly techniques
Huge web apps web expo 2013
Browsers
NodeJS: the good parts? A skeptic’s view (jmaghreb, jmaghreb2013)
Managing JavaScript Complexity in Teams - Fluent
Robots in Swift
All of javascript
10 Groovy Little JavaScript Tips
Test driven development for infrastructure as-a-code, the future trend_Gianfr...
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
Planning JavaScript and Ajax for larger teams
Douglas Crockford Presentation Goodparts
Developer Job in Practice
SFScon 21 - Davide Montesin - Typescript vs. Java
Intro to JavaScript
Thinking In Swift

More from Jarrod Overson (20)

PDF
Practical WebAssembly with Apex, wasmRS, and nanobus
PDF
AppSecCali - How Credential Stuffing is Evolving
PDF
How Credential Stuffing is Evolving - PasswordsCon 2019
PDF
JSconf JP - Analysis of an exploited npm package. Event-stream's role in a su...
PDF
Analysis of an OSS supply chain attack - How did 8 millions developers downlo...
PDF
Deepfakes - How they work and what it means for the future
PDF
The State of Credential Stuffing and the Future of Account Takeovers.
PDF
How to Reverse Engineer Web Applications
PDF
The life of breached data and the attack lifecycle
PDF
The Life of Breached Data & The Dark Side of Security
PDF
Shape Security @ WaffleJS October 16
PDF
Graphics Programming for Web Developers
PDF
The Dark Side of Security
PDF
JavaScript and the AST
PDF
ES2015 workflows
PDF
Maintainability SFJS Sept 4 2014
PDF
Idiot proofing your code
PDF
Riot on the web - Kenote @ QCon Sao Paulo 2014
PDF
Real World Web components
PDF
Continuous Delivery for the Web Platform
Practical WebAssembly with Apex, wasmRS, and nanobus
AppSecCali - How Credential Stuffing is Evolving
How Credential Stuffing is Evolving - PasswordsCon 2019
JSconf JP - Analysis of an exploited npm package. Event-stream's role in a su...
Analysis of an OSS supply chain attack - How did 8 millions developers downlo...
Deepfakes - How they work and what it means for the future
The State of Credential Stuffing and the Future of Account Takeovers.
How to Reverse Engineer Web Applications
The life of breached data and the attack lifecycle
The Life of Breached Data & The Dark Side of Security
Shape Security @ WaffleJS October 16
Graphics Programming for Web Developers
The Dark Side of Security
JavaScript and the AST
ES2015 workflows
Maintainability SFJS Sept 4 2014
Idiot proofing your code
Riot on the web - Kenote @ QCon Sao Paulo 2014
Real World Web components
Continuous Delivery for the Web Platform

Recently uploaded (20)

PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Mushroom cultivation and it's methods.pdf
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Machine learning based COVID-19 study performance prediction
PPTX
TLE Review Electricity (Electricity).pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Approach and Philosophy of On baking technology
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
1. Introduction to Computer Programming.pptx
PDF
Encapsulation theory and applications.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
A Presentation on Artificial Intelligence
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Heart disease approach using modified random forest and particle swarm optimi...
MIND Revenue Release Quarter 2 2025 Press Release
Mushroom cultivation and it's methods.pdf
A comparative study of natural language inference in Swahili using monolingua...
Machine learning based COVID-19 study performance prediction
TLE Review Electricity (Electricity).pptx
Advanced methodologies resolving dimensionality complications for autism neur...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Spectral efficient network and resource selection model in 5G networks
Approach and Philosophy of On baking technology
Group 1 Presentation -Planning and Decision Making .pptx
1. Introduction to Computer Programming.pptx
Encapsulation theory and applications.pdf
Network Security Unit 5.pdf for BCA BBA.
A Presentation on Artificial Intelligence

Managing JavaScript Complexity