Top Banner
@FGRibreau DEVELOPMENT PRINCIPLES & PHILOSOPHY
135
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Development Principles & Philosophy

FGRibreau

DEVELOPMENT PRINCIPLES

amp PHILOSOPHY

Franccedilois-Guillaume

RIBREAUFGRibreau

Bringr

BringrPerformance oriented

Social Media Management

BringrLeader europeacuteen de

lengagement client en temps reacuteel

(click2chat click2call click2video community )

sold

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 2: Development Principles & Philosophy

Franccedilois-Guillaume

RIBREAUFGRibreau

Bringr

BringrPerformance oriented

Social Media Management

BringrLeader europeacuteen de

lengagement client en temps reacuteel

(click2chat click2call click2video community )

sold

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 3: Development Principles & Philosophy

Bringr

BringrPerformance oriented

Social Media Management

BringrLeader europeacuteen de

lengagement client en temps reacuteel

(click2chat click2call click2video community )

sold

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 4: Development Principles & Philosophy

BringrPerformance oriented

Social Media Management

BringrLeader europeacuteen de

lengagement client en temps reacuteel

(click2chat click2call click2video community )

sold

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 5: Development Principles & Philosophy

BringrLeader europeacuteen de

lengagement client en temps reacuteel

(click2chat click2call click2video community )

sold

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 6: Development Principles & Philosophy

Bringr

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 7: Development Principles & Philosophy

Developer oriented real-time monitoring and

administration service for Redis

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 8: Development Principles & Philosophy

FGRibreau

COMPUTER SCIENCE IS ABOUT TRADEOFFS

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 9: Development Principles & Philosophy

FGRibreau

VSWHEN YOU FIGHT TO SURVIVE

BETTER CHOOSE THE RIGHT PATH

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 10: Development Principles & Philosophy

FGRibreau

How can I make the right choice

while coding

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 11: Development Principles & Philosophy

FGRibreau

EASY

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 12: Development Principles & Philosophy

FGRibreau

FOLLOW AND DISCOVER

PRINCIPLES

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 13: Development Principles & Philosophy

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 14: Development Principles & Philosophy

SEPARATION OF CONCERNS

FGRibreau

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 15: Development Principles & Philosophy

SEPARATION OF CONCERNS

FGRibreau

AKA THINK ABOUT ____ROLES

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 16: Development Principles & Philosophy

FGRibreau

MONOLITH(S)

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 17: Development Principles & Philosophy

FGRibreau

Bringr

monolith

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 18: Development Principles & Philosophy

Use the Separation of Concerns Luke

Morpheus (not sure about this one)

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 19: Development Principles & Philosophy

FGRibreau

Bringr

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 20: Development Principles & Philosophy

FGRibreau

Bringr Strategy

BringrImpact

Bringr

BringrSourcing

Bringr

BringrAlerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 21: Development Principles & Philosophy

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 22: Development Principles & Philosophy

FGRibreau

Bringr Strategy Bringr Impact

Bringr Backend

Bringr Sourcing Bringr Account

Bringr Alerts

Filtering

Statistics

Rules EnginePublishing

Statistics Updater

UIUIUI

Indexing

G+

Vimeo

Facebook

Youtube

Wordpress

Twitter

Notifications

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 23: Development Principles & Philosophy

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 24: Development Principles & Philosophy

FGRibreau

MICROSERVICE TYPE DEFINITION

ACTIVE ACT ON SOMETHING

PASSIVE REACT TO SOMETHING

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 25: Development Principles & Philosophy

FGRibreau

MICROSERVICE TYPE eg IN THE ASYNC WORLD

ACTIVE PUBLISHER

PASSIVE CONSUMER

AMQP RabbitMQ

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 26: Development Principles & Philosophy

FGRibreau

THE LESS ACTIVE ONES THE BETTER

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 27: Development Principles & Philosophy

FGRibreau

THE LESS ACTIVE ONES THE BETTER

THE MORE PASSIVE ONES THE BETTER

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 28: Development Principles & Philosophy

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES MICROSERVICES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 29: Development Principles & Philosophy

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGICINSIDE MICROSERVICES COMPONENTS

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 30: Development Principles & Philosophy

FGRibreau

My Worker My Worker My Worker

State Repository

atomic

concurrency resilient scaleOut

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 31: Development Principles & Philosophy

FGRibreau

State Repository

parallelism resilient scaleOut

State Repository

My Worker A My Worker B

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 32: Development Principles & Philosophy

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 33: Development Principles & Philosophy

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 34: Development Principles & Philosophy

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 35: Development Principles & Philosophy

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

clear contracts

easierscaling

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 36: Development Principles & Philosophy

FGRibreau

EACH MICROSERVICE SHOULDHAVE ITS OWN RESPONSIBILITY

limit bug domain

improvedvelocity

clear contracts

easierscaling

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 37: Development Principles & Philosophy

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 38: Development Principles & Philosophy

rdquoFGRibreau

ldquoFAIL FAST FAIL OFTEN

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 39: Development Principles & Philosophy

FGRibreau

crash process as soon as possible

log errors

restart process

alert developer

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 40: Development Principles & Philosophy

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 41: Development Principles & Philosophy

FGRibreau

(NodeJS) process

ramcpu IO

OS

fail fast fail often

CPU RAM and IO are limitedNodeJS process canrsquot always monitor himself

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 42: Development Principles & Philosophy

FGRibreau

WE DO WANTCONSTRAINTS

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 43: Development Principles & Philosophy

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 44: Development Principles & Philosophy

FGRibreau

WE DO WANTCONSTRAINTSNo more than 90 CPU during X mins

No more than 512Mo of RAM during X mins

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 45: Development Principles & Philosophy

LETrsquoS ADD ANOTHER PRINCIPLE

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 46: Development Principles & Philosophy

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 47: Development Principles & Philosophy

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 48: Development Principles & Philosophy

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 49: Development Principles & Philosophy

FGRibreau

NodeJS process

ramcpu IO

OS

fail fast fail often

Supervisor

limited in space amp time

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 50: Development Principles & Philosophy

FGRibreau

NodeJS process

dev staging prod

CONFIGURATION MANAGEMENT

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 51: Development Principles & Philosophy

FGRibreau

13 configjsmoduleexports13 =13 function()13 13 13 13 switch(processenvNODE_ENV)13 13 13 13 13 13 13 13 case13 development13 13 13 13 13 13 13 13 13 13 13 13 return13 dev13 setting

13 13 13 13 13 13 13 13 case13 production13 13 13 13 13 13 13 13 13 13 13 13 return13 prod13 settings

13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 return13 error13 or13 other13 settings13 13 13 13

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 52: Development Principles & Philosophy

FGRibreau

appconfigure(development13 function()13 13 appset(configPath13 confLocal)13 13 13 ldquoconfLocalrdquo13 is13 a13 constant)

appconfigure(production13 function()13 13 appset(configPath13 confProduction)13 13 ldquoconfProductionrdquo13 is13 a13 constant)

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 53: Development Principles & Philosophy

FGRibreau

NodeJS process

dev staging prod

SHOULD MY PROCESS KNOW ITS OWN CONFIGURATION

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 54: Development Principles & Philosophy

NOPE

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 55: Development Principles & Philosophy

FGRibreau

constants files environmentvariables distributed

CONFIGURATION

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 56: Development Principles & Philosophy

FGRibreau

constants files environmentvariables distributed

Simplicity Genericity

Knowing every running environments

One configuration to rule them all

CONFIGURATION

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 57: Development Principles & Philosophy

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 58: Development Principles & Philosophy

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 59: Development Principles & Philosophy

FGRibreau

var env = require(common-env)(logger)var config = envgetOrElseAll( amqp login guest password guest host localhost port 5672 reconnect false )

var conn = require(amqp)createConnection(configamqp)

AMQP_LOGIN=user AMQP_PASSWORD=azerty node serverjs

npm install common-env

httpsgithubcomFGRibreaucommon-env

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 60: Development Principles & Philosophy

FGRibreau

NodeJS processLauncher

SoC FTW

env vars

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 61: Development Principles & Philosophy

FGRibreau

But my cloud provider uses AMQP_ADDON_LOGIN

what should I do

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 62: Development Principles & Philosophy

FGRibreau

var config = envgetOrElseAll( amqp addon login guest password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqpaddon)

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 63: Development Principles & Philosophy

FGRibreau

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 64: Development Principles & Philosophy

NOPE

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 65: Development Principles & Philosophy

FGRibreau

NodeJS processLauncher

SoC

env vars

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 66: Development Principles & Philosophy

FGRibreau

NodeJS processLauncher

SoC

env vars

Internal code is dependent from

external naming convention

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 67: Development Principles & Philosophy

FGRibreau

var config = envgetOrElseAll( amqp login $default guest $aliases [AMQP_ADDON_LOGIN] password guest host localhost port 5672 reconnect false )

var conn = amqpcreateConnection(configamqp)

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 68: Development Principles & Philosophy

configjsvar logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

appjsvar config = require(config)

srcmyownmodulejsvar config = require(config)

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 69: Development Principles & Philosophy

FGRibreau

Does it respect

SoC

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 70: Development Principles & Philosophy

NOPE

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 71: Development Principles & Philosophy

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 72: Development Principles & Philosophy

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 73: Development Principles & Philosophy

var logger = require(my-logger)createLogger()var env = require(common-env)(logger)moduleexports = envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 74: Development Principles & Philosophy

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 75: Development Principles & Philosophy

config now asks for loggermoduleexports = function (logger) var env = require(common-env)(logger) return envgetOrElseAll( amqp login guest )

configjs

caller must specify logger to use config appjsvar logger = require(my-logger)createLogger()var config = require(config)(logger)

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 76: Development Principles & Philosophy

HUM I THINK I KNOW THIS PRINCIPLE

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 77: Development Principles & Philosophy

FGRibreau

DEPENDENCY INVERSION

This is the D from SOLID

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 78: Development Principles & Philosophy

FGRibreau

AGAIN

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 79: Development Principles & Philosophy

appjsvar config = require(config)(logger)

srcmyownmodulejsvar config = require(config)(logger)

DI DRY

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 80: Development Principles & Philosophy

appjsvar config = require(config)(logger)

srcmyownmodulejsmoduleexports = function (config)

DI DRY

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 81: Development Principles & Philosophy

HUM LET CREATE USA REMINDER

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 82: Development Principles & Philosophy

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 83: Development Principles & Philosophy

FGRibreau

LETrsquoS TALK ABOUT CRON

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 84: Development Principles & Philosophy

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 85: Development Principles & Philosophy

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 86: Development Principles & Philosophy

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 87: Development Principles & Philosophy

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 88: Development Principles & Philosophy

YOU

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 89: Development Principles & Philosophy

FGRibreau

CRON

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 90: Development Principles & Philosophy

FGRibreau

CRON

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 91: Development Principles & Philosophy

USERS

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 92: Development Principles & Philosophy

CRON IS NOT WORKING ANYMORE

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 93: Development Principles & Philosophy

YOU

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 94: Development Principles & Philosophy

FGRibreau

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 95: Development Principles & Philosophy

FGRibreau

Process (eg cron)

ramcpu IO

OS

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 96: Development Principles & Philosophy

FGRibreau

server

Process (eg cron)

ramcpu IO

OS

Supervisor

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 97: Development Principles & Philosophy

FGRibreau

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 98: Development Principles & Philosophy

FGRibreau

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 99: Development Principles & Philosophy

FGRibreau

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 100: Development Principles & Philosophy

FGRibreau

ITrsquoS ALL ABOUT TRADEOFFS

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 101: Development Principles & Philosophy

LETrsquoS INVENT

A NEW PRINCIPLE

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 102: Development Principles & Philosophy

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 103: Development Principles & Philosophy

FGRibreau

NOTIFICATIONS

ALERTS=

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 104: Development Principles & Philosophy

FGRibreau

OKLETrsquoS RECAP

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 105: Development Principles & Philosophy

rdquoFGRibreau

ldquoDIVIDE MICROSERVICES BETWEEN ACTIVE AND

PASSIVE ONES

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 106: Development Principles & Philosophy

rdquoFGRibreau

ldquoDIVIDE STATE AND LOGIC

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 107: Development Principles & Philosophy

rdquoFGRibreau

ldquoEVERYTHING SHOULD BE LIMITED IN BOTH

SPACE amp TIME

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 108: Development Principles & Philosophy

rdquoFGRibreau

ldquoEVERY CONSTANT NUMBER BOOLEAN OR STRING

SHOULD BE CONFIGURABLE

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 109: Development Principles & Philosophy

rdquoFGRibreau

ldquordquoldquo IS A CODE SMELL

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 110: Development Principles & Philosophy

rdquoFGRibreau

ldquoI SHOULD ALWAYS BE PROACTIVELY ALERTED

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 111: Development Principles & Philosophy

rdquoFGRibreau

ldquo[add your own]

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 112: Development Principles & Philosophy

FGRibreau

THE MOST IMPORTANT PRINCIPLE BEING

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 113: Development Principles & Philosophy

FGRibreau

SEPARATION of

CONCERNS

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 114: Development Principles & Philosophy

FGRibreau

LETrsquoS GO FURTHER

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 115: Development Principles & Philosophy

FGRibreau

PRINCIPLECode dependencies should

always be up-to-date

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 116: Development Principles & Philosophy

FGRibreau

AUTOMATIONBuild should break if code dependencies are

not up-to-date

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 117: Development Principles & Philosophy

FGRibreau

PRINCIPLECode style should

always be consistent

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 118: Development Principles & Philosophy

FGRibreau

AUTOMATIONRun a style-checker at each build

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 119: Development Principles & Philosophy

FGRibreau

PRINCIPLEEvery developers should follow DRY

(Donrsquot Repeat Yourself)

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 120: Development Principles & Philosophy

FGRibreau

AUTOMATIONRun a structural code similarities tool

at each build

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 121: Development Principles & Philosophy

FGRibreau

HERE IS WHAT

WE DID

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 122: Development Principles & Philosophy

FGRibreauhttpsgithubcomFGRibreaucheck-build

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 123: Development Principles & Philosophy

ONE LAST THING

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 124: Development Principles & Philosophy

rdquoFGRibreau

ldquoDONrsquoT CREATE CONVENTIONS YOU CANrsquoTENFORCE

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 125: Development Principles & Philosophy

FGRibreau

PRINCIPLES

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 126: Development Principles & Philosophy

FGRibreau

PRINCIPLESCONSTRAINTS

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 127: Development Principles & Philosophy

FGRibreau

PRINCIPLES

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 128: Development Principles & Philosophy

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 129: Development Principles & Philosophy

FGRibreau

PRINCIPLES

CONVENTIONS

AUTOMATION

CONSTRAINTS

CODE

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you

Page 130: Development Principles & Philosophy

Follow me FGRibreau

QuestionsJoin us iAdvize

Thank you