287
Nathaniel T. Schutta @ntschutta Bulletproof JavaScript

Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Nathaniel T. Schutta@ntschutta

Bulletproof  JavaScript

Page 2: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

It all started so quietly...

Page 3: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

No avoiding it now...

Page 4: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript is a first class citizen.

Page 5: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

What does that mean?

Page 6: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

How do we create modern web applications?

Page 7: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Applications are changing.

Page 8: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

How do we embrace that?

Page 9: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

It isn’t the 90s anymore.

Page 10: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Remember alerts?

Page 11: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

They aren’t a best practice anymore.

Page 12: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

One could argue they are considered harmful.

Page 13: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Today we have tools!

Page 14: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

IDEs can do more than syntax highlighting...

Page 15: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 16: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 17: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But it doesn’t end there.

Page 18: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Think of what you use in Java, C#, etc.

Page 19: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Testing, code coverage, build tools, code analysis...

Page 20: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Very rich toolset.

Page 21: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

What about JavaScript?

Page 22: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript equivalents in nearly every case today.

Page 23: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

In some cases, paradox of choice.

Page 24: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We’ll try and clear some of that up today.

Page 25: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We’re going to dig into testing and metrics today.

Page 26: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Goal is to whet your appetite.

Page 27: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Show you what can be done today.

Page 28: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Give you some ideas.

Page 29: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JSHint.

Page 30: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Certain mistakes can be caught automatically.

Page 31: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Static code analysis.

Page 32: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Akin to JSLint.

http://www.jslint.com

Page 33: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

More configurable.

Page 34: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Finds common mistakes and defects.

Page 35: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Very few programs pass ;)

Page 36: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Highly configurable.

Page 37: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can configure inline, via file or in package.json.

Page 38: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Configuration is JSON.

Page 39: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Tune via ‘enforcing’ and ‘relaxing’ options.

Page 40: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Enforcing makes JSHint more strict...

Page 41: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Relaxing does the opposite.

Page 42: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Dozens and dozens of configuration options.

http://www.jshint.com/docs/options/

Page 43: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also hide individual warnings if needed.

Page 44: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Defaults are pretty good.

Page 45: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But may want to turn a few more things on.

Page 46: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Curly braces are optional on single line blocks.

Page 47: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But that’s a great way inject sneaky bugs.

Page 48: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

curly: true

Page 49: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript has two sets of equality operators.

Page 50: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

==, != ===, !==

Page 51: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

The first set coerce values.

Page 52: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can give some odd results.

Page 53: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

eqeqeq: true

Page 54: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Empty blocks aren’t harmful…

Page 55: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But probably indicate some cruft in the code.

Page 56: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

noempty: true

Page 57: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Quote marks should be consistent in your code…

Page 58: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But it is easy to mix single and double quotes.

Page 59: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We have a couple of options to choose from.

Page 60: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

quotmark: true

Page 61: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Enforces consistency.

Page 62: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But you can force a specific style if you prefer.

Page 63: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

quotmark: “single” quotmark: “double”

Page 64: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Undeclared variables are easy in JavaScript.

Page 65: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Probably a typo. Or worse.

Page 66: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

undef: true

Page 67: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Sometimes undefined vars comes from other file.

Page 68: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We can tell JSHint that.

Page 69: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

predef: ["foo", "bar"]

Page 70: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Sometimes we declare things we don’t use.

Page 71: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Not generally harmful…

Page 72: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But indicates some cruft.

Page 73: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

unused: true

Page 74: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript is very forgiving.

Page 75: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Maybe too forgiving.

Page 76: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Many developers leverage “strict mode”.

Page 77: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Throws certain errors, prohibits some syntax.

Page 78: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Invoking it is simple, but it is easy to forget.

Page 79: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

strict: true

Page 80: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But that’s not it!

Page 81: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Act now…

Page 82: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Bitwise operators are rare in JavaScript…

Page 83: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can flag them.

Page 84: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

bitwise: true

Page 85: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript lets you augment native objects.

Page 86: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Array missing something? You can add it!

Page 87: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Helpful…but at a cost.

Page 88: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can block it.

Page 89: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

freeze: true

Page 90: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Have a preferred indent level? There’s a flag for that.

Page 91: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

indent: 4

Page 92: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript appears to have block scope…but it doesn’t.

Page 93: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Global or function. That’s it.

Page 94: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

latedef: true

Page 95: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also set various max lengths.

Page 96: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can set the maximum number of:

Page 97: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Parameters, nesting depth, function length…

Page 98: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Even line length.

Page 99: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

maxparams, maxdepth, maxstatements, maxlen

Page 100: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also set a maximum cyclomatic complexity.

Page 101: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Number of paths through a code base.

Page 102: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Smaller is better!

Page 103: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

maxcomplexity: 2

Page 104: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can ask JSHint to ignore a chunk of code.

Page 105: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

/* jshint ignore:start */ /* jshint ignore:end */

Page 106: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Be careful with that…

Page 107: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can also relax a number of rules.

Page 108: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Use with caution.

Page 109: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also tell JSHint about certain environments…

Page 110: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Browser, Node, etc.

Page 111: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

This will define certain global variables.

Page 112: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Think console.

Page 113: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Installed via npm.

Page 114: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JSLint License...MIT with one addition:

Page 115: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

“This Software shall be used for Good, not Evil.”

Page 116: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 117: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

http://www.jshint.com

Page 118: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Configuration options.

Page 119: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

There are a lot of options.

Page 120: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Which ones should you turn on? Relax?

Page 121: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

It depends!

Page 122: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Is this an existing project?

Page 123: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Or greenfield?

Page 124: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Tempting to crank all the knobs up to 11.

Page 125: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 126: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Existing projects probably have some cruft.

Page 127: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Don’t overwhelm the team with warnings!

Page 128: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Easy to get discouraged.

Page 129: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 130: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

“We have so many warnings…”

Page 131: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Fixing 10 or 20 hardly makes a dent.

Page 132: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Easy to miss when you add another one…

Page 133: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Start small.

Page 134: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Expect some…discussion around which rules to use.

Page 135: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Pick one or two.

Page 136: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Turn them on.

Page 137: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Should result in a manageable set of warnings.

Page 138: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Fix them!

Page 139: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

An iteration or two later, add another rule or two.

Page 140: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Rinse, repeat.

Page 141: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

“Ratchet up.”

Page 142: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Over time, you’ll have a very complete set.

Page 143: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

And a clean code base.

Page 144: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

With a new code base, it is easier to start big.

Page 145: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Start clean, stay clean.

Page 146: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Don’t be afraid to tweak!

Page 147: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

The warnings are there to help, not hurt.

Page 148: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Plato.

Page 149: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Static analysis tool.

Page 150: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Source code visualizer, complexity analyzer.

Page 151: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Leverages JSHint and complexityReport.js.

Page 152: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Cyclomatic complexity, line count, param count...

Page 153: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Halstead metrics, maintainability index.

Page 154: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 155: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Includes detailed view.

Page 156: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 157: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can execute from the command line.

Page 158: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Or via Grunt.

Page 159: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

plato -r -d report js

Page 160: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can also run it against your test code…

Page 161: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can tweak the rules.

Page 162: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You can point to a JSHint option file.

Page 163: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Or you can turn off JSHint.

Page 164: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Still has that new software smell.

Page 165: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Installed via npm.

Page 166: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

MIT License.

Page 167: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 168: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

https://github.com/es-analysis/plato

Page 169: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Jasmine.

Page 170: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We must test our code.

Page 171: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

BDD JavaScript testing framework.

Page 172: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

More readable?

Page 173: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Doesn’t require the DOM or other libraries.

Page 174: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Suites with specs.

Page 175: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Set of matchers.

Page 176: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can create custom matchers.

Page 177: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Group related specs with ‘describe’.

Page 178: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Describe blocks can be nested.

Page 179: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Includes beforeEach and afterEach for setup/teardown.

Page 180: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Specs and blocks can be disabled...

Page 181: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Don’t forget to turn them back on!

Page 182: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Includes spies aka test doubles.

Page 183: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can mock out the JavaScript clock.

Page 184: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Includes a waitFor to test asynchronous cases.

Page 185: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Runs in any JavaScript environment.

Page 186: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Include Jasmine file, page is now a runner.

Page 187: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Results read like a specification.

Page 188: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 189: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

At least that’s the idea ;)

Page 190: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Download the library.

Page 191: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

MIT License.

Page 192: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 193: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

http://jasmine.github.io

Page 194: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Karma.

Page 195: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Tests need to be executed.

Page 196: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript test runner.

Page 197: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Created by AngularJS team.

Page 198: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Originated as MS thesis.

https://github.com/karma-runner/karma/raw/master/thesis.pdf

Page 199: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Quick feedback.

Page 200: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Works with several testing frameworks.

Page 201: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Works with continuous integration servers.

Page 202: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Change a file, Karma runs the tests.

Page 203: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Spawns a web server.

Page 204: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Results displayed at the command line.

Page 205: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also point a browser at the Karma web server.

Page 206: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Allows for mobile browser results.

Page 207: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Ships with Chrome and PhantomJS.

Page 208: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Plugins for all major browsers.

Page 209: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also point to custom browsers if needed.

Page 210: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can launch from the command line.

Page 211: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

karma start karma.conf.js

Page 212: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Or from Grunt.

Page 213: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Requires a bit of work…

Page 214: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Install grunt-karma.

Page 215: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

And anything your Karma configuration needs.

Page 216: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Like karma-jasmine.

Page 217: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

And whatever browser(s) you use.

Page 218: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

One other options.

Page 219: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

npm scripts

Page 220: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

In package.json file, add a scripts element.

Page 221: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Several options.

Page 222: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

"test": "karma start config/karma.conf.js"

Page 223: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Still has that new software smell.

Page 224: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Installed via npm.

Page 225: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

MIT License.

Page 226: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 227: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

http://karma-runner.github.io/0.10/index.html

Page 228: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Phantom.

Page 229: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Browser testing can be slow and tedious.

Page 230: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Headless WebKit.

Page 231: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Headless testing in a CI environment.

Page 232: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Full DOM, CSS selector, JSON, Canvas and SVG.

Page 233: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Not itself a test runner...

Page 234: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Works with Jasmine, Mocha, QUnit, etc.

Page 235: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Several built in, most others have a 3rd party runner.

Page 236: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can also capture screen shots.

Page 237: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Supports PNG, JPEG, GIF and PDF.

Page 238: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can be used for network monitoring.

Page 239: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Page automation - can even use jQuery.

Page 240: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Open a page, click a button...

Page 241: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Tell Karma to use Phantom rather than Chrome.

Page 242: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Of course we can run all of this from Grunt too.

Page 243: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Grunt plugins are your friend!

Page 244: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

grunt-contrib-jasmine

Page 245: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Runs Jasmine tests heedlessly via PhantomJS.

Page 246: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Load the task, add the template, configure…

Page 247: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Various platform dependent installs.

Page 248: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

BSD License.

Page 249: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 250: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

http://phantomjs.org

Page 251: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Istanbul.

Page 252: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We need to know what we’ve tested...

Page 253: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

And what we haven’t.

Page 254: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Code coverage tool.

Page 255: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Bugs tend to lurk where there are no tests.

Page 256: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

All JavaScript.

Page 257: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Tracks statement, branch and function.

Page 258: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Instrument on the fly.

Page 259: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can run at the command line or as part of build.

Page 260: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

HTML and LCOV reports.

Page 261: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 262: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Still has that new software smell.

Page 263: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Installed via npm.

Page 264: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

BSD License.

Page 265: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis
Page 266: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

http://gotwarlost.github.io/istanbul/

Page 267: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Is that all of them?

Page 268: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Nope.

Page 269: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Nearly every tool we looked at has alternatives.

Page 270: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Don’t like some of these?

Page 271: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Great, use what works for your team!

Page 272: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Perform a time boxed eval.

Page 273: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

But use something!

Page 274: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Many of these tools are very new.

Page 275: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Expect some volatility.

Page 276: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Can’t treat JavaScript as a toy language today.

Page 277: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

You don’t need to adopt every one of these today.

Page 278: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Pick your pain point.

Page 279: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Introduce one or two tools.

Page 280: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Ratchet up.

Page 281: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

After a few weeks or months, add another.

Page 282: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Rinse repeat.

Page 283: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We’ve come a long way!

Page 284: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

JavaScript is a first class citizen.

Page 285: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

We have the tools to prove it.

Page 286: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

No excuses.

Page 287: Bulletproof*JavaScriptsddconf.com/brands/sdd/library/Bulletproof_JavaScript.pdf · Originated as MS thesis

Nathaniel  T.  Schutta@ntschutta

Thanks!