# Design d'*architecture modulaire* à la BBC
28 octobre 2015 — [Blend Webmix](http://2015.blendwebmix.com/) {.footer}
## Bonjour,
I am **Thomas**
[thom4.net](https://thom4.net) – [@thom4parisot](https://twitter.com/thom4parisot) {.footer}
@@@
![Pardon my French](../../images/pardon-my-french.jpg)
@@@
## BBC R&D
[github.com/bbcrd](https://github.com/bbcrd)
[bbc.co.uk/rd](http://bbc.co.uk/rd)
@@@
![Full Stack JavaScript](../../images/javascript.png)
[thom4.net/node.js](https://thom4.net/node.js)
@@@
![Sud Web](../../images/sudweb.png)
[sudweb.fr](http://sudweb.fr)
@@@
~~~~
And photography.
# C'est quoi une **fonction** ?
@@@
## `fn(...args)`
@@@
## `let result = fn(...args)`
@@@
## `try { fn(...args) }`
## `catch (err) { ... }`
~~~~
L'erreur est un signal, ce n'est pas rien.
@@@
## `let emitter = fn(...args)`
## `emitter.on('success', ...)`
@@@
## `fn(...args).then(...)`
@@@
## Bref, une fonction c'est …
- à entrée identique, sortie **identique**
- le produit de la fonction n'est **pas persisté** par la fonction
- **reproductible** à l'infini*\**
*\** moyennant un environnement favorable {.footer}
~~~~
Matrices d'environnement : versions d'interpréteur, de navigateur etc.
## BBC R&D
C'est quoi ?
@@@
# Équipes **pluridisciplinaires**
Ingénieurs, UX, design, science etc.
@@@
# Prototypage
Itérations de 2 semaines, **analyse**, exploration.
@@@
# **Pivot**
Au-delà de l'idée : partenaires, directions politiques, résultats de recherche etc.
@@@
# Qualité & **flexibilité**
@@@
# Coder = **faciliter**
~~~~
Jeter le code n'est pas grave tant que c'est dans l'optique projet.
C'est un peu comme l'exemple d'agriculture pris auparavant.
# Example
@@@
@@@
# C'est quoi une **Web app** ?
@@@
Une Web app est un *rendu navigateur* de *code HTML* servi par un *serveur HTTP*
compilé ou *interprété* par un *programme* puis mis à disposition sur une *machine informatique*.
(Accessoirement, ces données transitent de manière intelligible *uniquement*
entre vous et le serveur sans captation par un tiers — même si vous lui confiez vos impôts)
# #1 **Navigateur**
@@@
![](images/browser.png)
@@@
## `open URL`
@@@
## `echo URL | open`
# #2 Élément **graphique**
@@@
![](images/tile.png)
@@@
![](images/card.png)
@@@
![](images/oneliner.png)
@@@
```javascript
import { Cover } from '@project/element'
React.render(Cover, { … })
```
@@@
## **Autonomie**
On *embarque* CSS, images et outillage.
@@@
```javascript
require('./cover.scss');
import { Component } from 'react';
exports default class Cover extends Component {
render (){
let className = this.state.active ? 'active' : '';
return (
{this.props.title}
);
}
}
```
@@@
## **browserify** all the way!
*transforms* isolés et chainables.
@@@
## `npm publish`
~~~~
`.npmrc` pour cibler le registre privé.
@@@
> C'est comme ça que j'aimerais travailler sur tous mes projets.
— Diego, UI designer
# #3 **Application**
@@@
![](images/webapp.png)
@@@
```bash
npm install --save @project/element
PORT=3000 npm start
# static -p ${PORT:-5000} --gzip dist/
```
@@@
## ENV = **portabilité**
(penser arguments de fonction)
@@@
## Problème
`npm install` marche pas à tous les coups.
~~~~
Package version can be deleted, semver madness, registry can be down.
@@@
## `npm pack`
Extraction solide
@@@
## **Transportabilité**
(rendu iframe, puis rails-react puis gulp)
# #4 **Container**
@@@
![](images/dockerfile.png)
@@@
```bash
docker run -ti \
-p 5000:5000 \
-e STREAM_API_URL=https://... \
bbcrd/webapp
```
@@@
## *Application* as a **function**
`docker run -d ...` * `n`
@@@
## Dépendances **système**
Application + dépendances {langage, système, ressources).
@@@
## **Intégration Continue**
`docker-compose -f ci.yml run npm test`
(mais on le cache derrière un `make test`)
@@@
## Le **CPU** compte
(x86, ARMv6 etc.)
@@@
## `docker push`
@@@
# **Demo sympa**
# #5 **Machine**
@@@
@@@
```bash
aws ec2 run-instances --image-id=... --user-data=...
aws ec2 create-tags --tags ... --resources i-...
```
@@@
## *Machine* as a **function**
@@@
## **OS** comme artéfact
`AWS_ACCESS_KEY_ID=... packer build search-app.json`
# #6 **Data**
@@@
```bash
curl -X POST -d '{ "uri": "...", "callback_url": "..." }' \
https://api.../analyse
```
@@@
## **Code** = *data*
@@@
@@@
## **Event loop distribuée**
@@@
## Arbre de dépendance
@@@
@@@
# **Récap**
@@@
Une Web app est un *rendu navigateur* de *code HTML* servi par un *serveur HTTP*
compilé ou *interprété* par un *programme* puis mis à disposition sur une *machine informatique*.
@@@
Une Web app est un ensemble de *composants visuels* organisés selon des *règles métiers* et servi
par un *processus encapsulé* et *orchestré* par une machine *pré-parée*.
@@@
@@@
# **Composition**
*Ajouter* et *combiner* — pas d'attente implicite.
@@@
# **State**
*Explicite* plutôt qu'implicite.
@@@
# **Fonctions**
Interfaces pures. État interne isolé. Reproductibles à souhait.
@@@
# **Artéfacts**
Persistance de nos *sorties*.
Transférable, étiquetables et reproductibles.
@@@
# **Découvrabilité**
Chaque niveau, par votre équipe et d'autres équipes.
**Fonction** > *Framework*
@@@
# **Données**
Liant entre nos *systèmes*. Leur *débit* impacte la santé des fonctions.
~~~~
Although we talked about programming, humans are also good at repetition. As human beings, we need variables and variability to maintain our sanity, and to sustain a good *state* of mind.
@@@
# Merci 👍