Node.js Anti-Patterns and bad practices

Post on 18-Jan-2017

1.143 views 0 download

Transcript of Node.js Anti-Patterns and bad practices

Node.js Anti-Patterns

and bad practices

Why?

Adoption of Node.js by enterprises keep growing

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

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

The clash of paradigms leads to anti-patterns

IgorPrincipal Engineer @ YLD

YLD does Node.js consulting for large

enterprises

How?

Meet Jane

Jane

• Experienced Java developer in a big enterprise

• Limited experience with JavaScript

Jane’s quest

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

Ok, let’s try this Javascript on the server

thing…

—  anti-pattern — …

Callback hell

—  anti-pattern — …

Using a long list of arguments

Abusing variable arguments

—  anti-pattern — …

Poor use of modularity

• Files with > 200 LoC

• Lots of scattered functions

• Low cohesion

• No reuse

• Testing is hard

• 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.

• modules are cheap

• expose a documented interface

• try to keep modules under 200 LoC

—  anti-pattern — …

Overuse of classes for modelling

vs

I think I got this Node.js thing now…

—  anti-pattern — …

Ignoring callback errors

—  anti-pattern — …

The Kitchen Sink module

—  anti-pattern — …

Synchronous execution after initialisation

• fs.readFileSync

• fs.accessSync

• fs.changeModSync

• fs.chownSync

• fs.closeSync

• fs.existsSync

• ...

—  anti-pattern — …

The dangling source stream

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

not properly disposed and resources leak.

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

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

—  anti-pattern — …

Changing the way require()

works

• Setting NODE_PATH

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

• 'rootpath'

• 'require-root'

• 'app-root-path'

• 'root-require'

—  anti-pattern — …

The monolith

—  anti-pattern — …

Testing at the wrong level

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

—  anti-pattern — …

Depending on globally installed modules on package.son scripts

—  anti-pattern — …

Not measuring code coverage

Istanbul

—  anti-pattern — …

Poor use of public modules

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

• Make good use of existing open-source

• Ignorance of existing modules

• NIH syndrome

• Reluctance with dependency management

• "My needs are unique"

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

¯\_( )_/¯

“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

• License

• Release frequency

• Last updated

• Open issues

• Test coverage

• Documentation quality

—  anti-pattern — …

Performance is hard

CPU heavy operations

• 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

—  anti-pattern — …

Unlimited asynchronous operations

—  process.exit() —

Main take-aways

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

• Adopting Node also means adopting its newer practices.

THANK YOU!

@igorsoarezigor@yld.io