Node.js Anti-Patterns and bad practices

99
Node.js Anti-Patterns and bad practices

Transcript of Node.js Anti-Patterns and bad practices

Page 1: Node.js Anti-Patterns and bad practices

Node.js Anti-Patterns

and bad practices

Page 2: Node.js Anti-Patterns and bad practices

Why?

Page 3: Node.js Anti-Patterns and bad practices

Adoption of Node.js by enterprises keep growing

Page 4: Node.js Anti-Patterns and bad practices

Walmart, eBay, PayPal, Intuit, Netflix, LinkedIn, Uber, Yahoo ...

Page 5: Node.js Anti-Patterns and bad practices

Java → Node.js .NET → Node.js ... → Node.js

Page 6: Node.js Anti-Patterns and bad practices

The clash of paradigms leads to anti-patterns

Page 7: Node.js Anti-Patterns and bad practices

IgorPrincipal Engineer @ YLD

Page 8: Node.js Anti-Patterns and bad practices

YLD does Node.js consulting for large

enterprises

Page 9: Node.js Anti-Patterns and bad practices

How?

Page 10: Node.js Anti-Patterns and bad practices

Meet Jane

Page 11: Node.js Anti-Patterns and bad practices

Jane

• Experienced Java developer in a big enterprise

• Limited experience with JavaScript

Page 12: Node.js Anti-Patterns and bad practices

Jane’s quest

“create a Node.js-based prototype of an API service for a new mobile app”

Page 13: Node.js Anti-Patterns and bad practices

Ok, let’s try this Javascript on the server

thing…

Page 14: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 15: Node.js Anti-Patterns and bad practices
Page 16: Node.js Anti-Patterns and bad practices

Callback hell

Page 17: Node.js Anti-Patterns and bad practices
Page 18: Node.js Anti-Patterns and bad practices
Page 19: Node.js Anti-Patterns and bad practices
Page 20: Node.js Anti-Patterns and bad practices
Page 21: Node.js Anti-Patterns and bad practices
Page 22: Node.js Anti-Patterns and bad practices
Page 23: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 24: Node.js Anti-Patterns and bad practices

Using a long list of arguments

Page 25: Node.js Anti-Patterns and bad practices
Page 26: Node.js Anti-Patterns and bad practices

Abusing variable arguments

Page 27: Node.js Anti-Patterns and bad practices
Page 28: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 29: Node.js Anti-Patterns and bad practices

Poor use of modularity

Page 30: Node.js Anti-Patterns and bad practices

• Files with > 200 LoC

• Lots of scattered functions

• Low cohesion

• No reuse

• Testing is hard

Page 31: Node.js Anti-Patterns and bad practices

• All the handlers for a given resource inside the same module

• Modules that have loosely related functions inside it because it's the only place these functions are being used.

Page 32: Node.js Anti-Patterns and bad practices

• modules are cheap

• expose a documented interface

• try to keep modules under 200 LoC

Page 33: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 34: Node.js Anti-Patterns and bad practices

Overuse of classes for modelling

Page 35: Node.js Anti-Patterns and bad practices

vs

Page 36: Node.js Anti-Patterns and bad practices

Page 37: Node.js Anti-Patterns and bad practices

I think I got this Node.js thing now…

Page 38: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 39: Node.js Anti-Patterns and bad practices

Ignoring callback errors

Page 40: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 41: Node.js Anti-Patterns and bad practices

The Kitchen Sink module

Page 42: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 43: Node.js Anti-Patterns and bad practices

Synchronous execution after initialisation

Page 44: Node.js Anti-Patterns and bad practices

• fs.readFileSync

• fs.accessSync

• fs.changeModSync

• fs.chownSync

• fs.closeSync

• fs.existsSync

• ...

Page 45: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 46: Node.js Anti-Patterns and bad practices

The dangling source stream

Page 47: Node.js Anti-Patterns and bad practices

When a stream throws an error or closes while piping, streams are

not properly disposed and resources leak.

Page 48: Node.js Anti-Patterns and bad practices
Page 49: Node.js Anti-Patterns and bad practices
Page 50: Node.js Anti-Patterns and bad practices
Page 51: Node.js Anti-Patterns and bad practices
Page 52: Node.js Anti-Patterns and bad practices
Page 53: Node.js Anti-Patterns and bad practices

• listen for error and close events on every stream and cleanup

• or use the pump package instead of the native stream.pipe()

Page 54: Node.js Anti-Patterns and bad practices
Page 55: Node.js Anti-Patterns and bad practices
Page 56: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 57: Node.js Anti-Patterns and bad practices

Changing the way require()

works

Page 58: Node.js Anti-Patterns and bad practices

• Setting NODE_PATH

• Using a module that requires in a different way. e.g.

• 'rootpath'

• 'require-root'

• 'app-root-path'

• 'root-require'

Page 59: Node.js Anti-Patterns and bad practices
Page 60: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 61: Node.js Anti-Patterns and bad practices

The monolith

Page 62: Node.js Anti-Patterns and bad practices
Page 63: Node.js Anti-Patterns and bad practices
Page 64: Node.js Anti-Patterns and bad practices
Page 65: Node.js Anti-Patterns and bad practices
Page 66: Node.js Anti-Patterns and bad practices
Page 67: Node.js Anti-Patterns and bad practices
Page 68: Node.js Anti-Patterns and bad practices
Page 69: Node.js Anti-Patterns and bad practices
Page 70: Node.js Anti-Patterns and bad practices
Page 71: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 72: Node.js Anti-Patterns and bad practices

Testing at the wrong level

Page 73: Node.js Anti-Patterns and bad practices

Test at the interface levelAll that the tests/* should require is

Page 74: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 75: Node.js Anti-Patterns and bad practices

Depending on globally installed modules on package.son scripts

Page 76: Node.js Anti-Patterns and bad practices
Page 77: Node.js Anti-Patterns and bad practices
Page 78: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 79: Node.js Anti-Patterns and bad practices

Not measuring code coverage

Page 80: Node.js Anti-Patterns and bad practices

Istanbul

Page 81: Node.js Anti-Patterns and bad practices
Page 82: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 83: Node.js Anti-Patterns and bad practices

Poor use of public modules

Page 84: Node.js Anti-Patterns and bad practices

• NPM is the biggest and fastest growing open source package repo

• Make good use of existing open-source

Page 85: Node.js Anti-Patterns and bad practices

• Ignorance of existing modules

• NIH syndrome

• Reluctance with dependency management

• "My needs are unique"

Page 86: Node.js Anti-Patterns and bad practices

“I need a testing framework that computes code coverage and sends coverage stats to coveralls.io"

¯\_( )_/¯

Page 87: Node.js Anti-Patterns and bad practices

“I need a testing framework” tap, mocha, lab

“I need to compute code coverage”

istanbul

“I need to send coverage stats to coveralls.io"coveralls

Page 88: Node.js Anti-Patterns and bad practices

• License

• Release frequency

• Last updated

• Open issues

• Test coverage

• Documentation quality

Page 89: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 90: Node.js Anti-Patterns and bad practices

Performance is hard

Page 91: Node.js Anti-Patterns and bad practices

CPU heavy operations

Page 92: Node.js Anti-Patterns and bad practices

• Parsing (response from the database, response from external service)

• Computation-heavy work (like Natural Language Processing, Classification, Learning, etc.)

• Processing big sequences of data

• Mapping or a big dataset

• Aggregating a big dataset

• Calculating an HMAC for a big document

Page 93: Node.js Anti-Patterns and bad practices

—  anti-pattern — …

Page 94: Node.js Anti-Patterns and bad practices

Unlimited asynchronous operations

Page 95: Node.js Anti-Patterns and bad practices
Page 96: Node.js Anti-Patterns and bad practices
Page 97: Node.js Anti-Patterns and bad practices

—  process.exit() —

Page 98: Node.js Anti-Patterns and bad practices

Main take-aways

• Node is fundamentally different from the other technologies frequently used in big teams.

• Adopting Node also means adopting its newer practices.

Page 99: Node.js Anti-Patterns and bad practices

THANK YOU!

@[email protected]