SlideShare une entreprise Scribd logo
1  sur  65
Arquitetura Escalável da
Netflix
Bruno Tavares
@bt_bruno
Mas antes…
3 curiosidades sobre a
que você não sabia.
#1
roda em
de dispositivos
MILHARES
Também!
#2
Nós temos uma
super secreta
plataforma para TV.
Codinome
Gibbon
Netflix TV
Netflix TV Platform
2010100% HTML, CSS, JS
Empacotada para TV
Performance?
$30
600mhz single core
JavaScript Core
sem JIT
465x mais lento que
V8 no seu laptop.
Netflix TV Platform
Webkit
JavaScript Core
Netflix TV UI
(JS, HTML, CSS)
DOM
DOM Rendering
Device Interface
2012
Gibbon
JavaScript Core
Netflix TV UI
(JS only)
Widget Object Model
Widget Rendering
Device Interface
2013
Webkit
<div style=”
background-color:#2C425C;
width:200px;
height:200px;
color:#FFFFF">
Hello World
</div>
Hello
World
gibbon.createWidget({
backgroundColor: "#2C425C",
width: 200,
height: 200,
color: "#FFFFFF",
text: "Hello World"
});
Gibbon
Hello
World
#3
Nós lançamos
tudo com
Testes A/B
Testes A/B
Testes A/B
✓
Testes A/B
✓
Controle
Sem sinopse nem play
Sem sinopse
Sem play
Arquitetura altamente
escalável
Mais velocidade e volume
de testes A/B
Mais inovação e
vantagem competitiva
Arquitetura Anterior
View
Controller
Model
Quebrando MVC
View
Controller
Model
ViewViewView
ControllerControllerController
ModelModelModelModel
View
Será que entendemos
JavaScript errado?
Estado
mutável e
compartilhado
é a raiz de todos os males.
Objetos e Camadas
Componentes
Funcionais
JavaScript Funcional
λ
Código expresso de forma declarativa,
em pequenas funções, evitando
alteração de estado e dados mutáveis.
4 princípios da nossa
arquitetura
#1 Componentes Puros
Funções Puras
function formatTitle(title) {
return `<h1>${title}</h1>`;
}
Entrada
Saída
Para os mesmos parâmetros,
sempre o mesmo resultado
// ...
formatTitle('Narcos'); // <h1>Narcos</h1>
Componente
Dados
View
Componentes Puros
const Boxshot = React.createClass({
render() {
return <img src={this.props.src} />
}
});
Componentes Puros - React
const view = Boxshot({ src: '…' });
const Boxshot = React.createClass({
render() {
return <img src={this.props.src} />
}
});
Componentes Puros - React
const view = Boxshot({ src: '…' });
Entrada
const Boxshot = function(props) {
return <img src={props.src} />
}
const Boxshot = (props) => (
<img src={props.src} />
);
Saída
Previsíveis
Independente de Estado
Fácil de refatorar
Composição
#2 API Declarativa
// imperativo
Boxshot(data.movie); //<img … />
// declarativo
<Boxshot movie={data.movie} />
// imperativo
var panel = $('#panel');
if (isPanelVisible) {
panel.show();
}
else {
panel.hide();
}
// declarativo
<Panel visible={isPanelVisible} />
// declarativo
const app = (
<Gallery>
<Category category={netflixOriginals}>
<Boxshot movie={narcos} />
<Boxshot movie={strangerThings} />
<Boxshot movie={lukeCage} />
</Category>
</Gallery>
);
render(app);
Legibilidade
Melhor compreensão
Menos margem para bugs
#3 Composição
App
Componente
Componente Componente
Componente
Dados
View
Boxshot
Focusable
RemoteData
// boxshot component
const Boxshot = (props) => (
<img src={props.src} />
);
// inject focus capability
const BoxshotWithFocus = Focusable(Boxshot);
// inject remote data fetching
const BoxshotWithData =
RemoteData(BoxshotWithFocus);
Escalabilidade
Complexidade Controlada
API Estável
#4 Fluxo Unidirecional
Dados
{ … }
HTML
< … >
Componentes
Puros
HTML
< … >
Dados
{ … }
HTML
< … >
Componentes
Puros
Dados
{ … }
HTML
< … >
Dados
{ … }
Componentes
Puros
HTML
< … >
HTML
< … >
Bacana… e como eu executo
efeitos colaterais?
Dados
{ … }
HTML
< … >
AçãoRedutor
// state
{ selectedMovie: 80025313 }
// fire action
this.props.selectMovieAction({
movie: 20057281
});
// reducer changes state
newState = state.set(
'selectedMovie', action.movie
);
// state
{ selectedMovie: 80025313 }
// state
{ selectedMovie: 20057281}
Ação
Redutor
E se você pudesse criar toda
sua aplicação, só com
componentes puros?
{
categories: [{
title: 'Top Picks for You',
movies: [{
title: 'Narcos',
boxshot: 'http:.../narcos.jpg'
}, ... ]
}, ...]
}
const Boxshot = (props) => (
<img src={props.movie.boxshot} />
);
const Boxshot = (props) => (
<img src={props.movie.boxshot} />
);
const Category = (props) => (
<div>
<h2>{props.category.title}</h2>
</div>
);
{props.category.movies.map(movie, i) => (
<Boxshot movie={movie} />
))}
const Boxshot = (props) => (
<img src={props.movie.boxshot} />
);
const Category = (props) => (
<div>
<h2>{props.category.title}</h2>
</div>
);
const Gallery = (props) => (
<div>
</div>
);
{props.category.movies.map(movie, i) => (
<Boxshot movie={movie} />
))}
{props.categories.map(category => (
<Category category={category} />
))}
Previsível
Declarativa
Extensível
Unidirecional
Imutável
Arquitetura Escalável
app = (dados) => view
Obrigado!
Bruno Tavares
@bt_bruno

Contenu connexe

En vedette

TDC2016SP - Trilha Digital Transformation
TDC2016SP - Trilha Digital TransformationTDC2016SP - Trilha Digital Transformation
TDC2016SP - Trilha Digital Transformationtdc-globalcode
 
GUJavaSC - Criando Micro-serviços Reativos com Java
GUJavaSC - Criando Micro-serviços Reativos com JavaGUJavaSC - Criando Micro-serviços Reativos com Java
GUJavaSC - Criando Micro-serviços Reativos com JavaRodrigo Cândido da Silva
 
React - Biblioteca Javascript para criação de UI
React - Biblioteca Javascript para criação de UIReact - Biblioteca Javascript para criação de UI
React - Biblioteca Javascript para criação de UICleiton Francisco
 
Case Netflix - Atendimento Star Trek
Case Netflix - Atendimento Star TrekCase Netflix - Atendimento Star Trek
Case Netflix - Atendimento Star Trekmarinanascmto
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)Cezar Luiz
 
Estudos do consumo netflix
Estudos do consumo  netflixEstudos do consumo  netflix
Estudos do consumo netflixYuri Vellinho
 
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...Rodrigo Cândido da Silva
 
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?tdc-globalcode
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux IntroductionNikolaus Graf
 
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS autonomo
 
Netflix Business Model & Strategy
Netflix Business Model & StrategyNetflix Business Model & Strategy
Netflix Business Model & StrategyEvgenii Gvozdev
 
Hooked Workshop
Hooked WorkshopHooked Workshop
Hooked WorkshopNir Eyal
 

En vedette (15)

TDC2016SP - Trilha Digital Transformation
TDC2016SP - Trilha Digital TransformationTDC2016SP - Trilha Digital Transformation
TDC2016SP - Trilha Digital Transformation
 
GUJavaSC - Criando Micro-serviços Reativos com Java
GUJavaSC - Criando Micro-serviços Reativos com JavaGUJavaSC - Criando Micro-serviços Reativos com Java
GUJavaSC - Criando Micro-serviços Reativos com Java
 
React - Biblioteca Javascript para criação de UI
React - Biblioteca Javascript para criação de UIReact - Biblioteca Javascript para criação de UI
React - Biblioteca Javascript para criação de UI
 
Case Netflix - Atendimento Star Trek
Case Netflix - Atendimento Star TrekCase Netflix - Atendimento Star Trek
Case Netflix - Atendimento Star Trek
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)
 
Estudos do consumo netflix
Estudos do consumo  netflixEstudos do consumo  netflix
Estudos do consumo netflix
 
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
 
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?
TDC2016POA | Trilha JavaScript - Porque eu deveria usar TypeScript?
 
Netflix’s Success through Technology and Culture - Andicom 2014
Netflix’s Success through Technology and Culture - Andicom 2014Netflix’s Success through Technology and Culture - Andicom 2014
Netflix’s Success through Technology and Culture - Andicom 2014
 
Padrões de Arquitetura na Nuvem da AWS
Padrões de Arquitetura na Nuvem da AWSPadrões de Arquitetura na Nuvem da AWS
Padrões de Arquitetura na Nuvem da AWS
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
Netflix Case Study
Netflix Case StudyNetflix Case Study
Netflix Case Study
 
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS
SPRING 5.1.2 PASSO A PASSO: APLICAÇÕES PRÁTICAS
 
Netflix Business Model & Strategy
Netflix Business Model & StrategyNetflix Business Model & Strategy
Netflix Business Model & Strategy
 
Hooked Workshop
Hooked WorkshopHooked Workshop
Hooked Workshop
 

Similaire à Arquitetura JavaScript Escalável da Netflix

Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TVAécio Costa
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamJS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamiMasters
 
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5Willian Molinari
 
Introdução ao Titanium Mobile
Introdução ao Titanium MobileIntrodução ao Titanium Mobile
Introdução ao Titanium MobileEric Cavalcanti
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Desenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchDesenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchCampus Party Brasil
 
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaQConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaLoiane Groner
 
Robot Lego programado em Java
Robot Lego programado em JavaRobot Lego programado em Java
Robot Lego programado em JavaJoao Alves
 
SharePoint Deployment
SharePoint DeploymentSharePoint Deployment
SharePoint DeploymentAndré Vala
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerWellington Marinho
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Rodrigo Kono
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Evandro Klimpel Balmant
 
TDC2018FLN | Trilha Containers - CI/CD a base de containers com Drone
TDC2018FLN | Trilha Containers - CI/CD a base de containers com DroneTDC2018FLN | Trilha Containers - CI/CD a base de containers com Drone
TDC2018FLN | Trilha Containers - CI/CD a base de containers com Dronetdc-globalcode
 
HTML5 - Seu navegador não é mais o mesmo
HTML5 - Seu navegador não é mais o mesmoHTML5 - Seu navegador não é mais o mesmo
HTML5 - Seu navegador não é mais o mesmoCaio Gondim
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline AppsByclosure
 

Similaire à Arquitetura JavaScript Escalável da Netflix (20)

Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TV
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamJS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
 
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
 
Introdução ao Titanium Mobile
Introdução ao Titanium MobileIntrodução ao Titanium Mobile
Introdução ao Titanium Mobile
 
Caelum Day In Rio
Caelum Day In RioCaelum Day In Rio
Caelum Day In Rio
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Realidade Aumentada
Realidade AumentadaRealidade Aumentada
Realidade Aumentada
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Desenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchDesenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-Touch
 
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaQConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
 
Robot Lego programado em Java
Robot Lego programado em JavaRobot Lego programado em Java
Robot Lego programado em Java
 
SharePoint Deployment
SharePoint DeploymentSharePoint Deployment
SharePoint Deployment
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e Docker
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
 
TDC2018FLN | Trilha Containers - CI/CD a base de containers com Drone
TDC2018FLN | Trilha Containers - CI/CD a base de containers com DroneTDC2018FLN | Trilha Containers - CI/CD a base de containers com Drone
TDC2018FLN | Trilha Containers - CI/CD a base de containers com Drone
 
Python 08
Python 08Python 08
Python 08
 
HTML5 - Seu navegador não é mais o mesmo
HTML5 - Seu navegador não é mais o mesmoHTML5 - Seu navegador não é mais o mesmo
HTML5 - Seu navegador não é mais o mesmo
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline Apps
 

Arquitetura JavaScript Escalável da Netflix

Notes de l'éditeur

  1. O objetivo dessa apresentação é compartilhar como nós usamos programação funcional e componentes React para construir uma arquitetura escalável.
  2. Mas antes…
  3. 3 curiosidades sobre a Netflix que você não sabia!
  4. #1
  5. Nós amamos JavaScript!
  6. Netflix roda em milhares de dispositivos…
  7. …JavaScript também! Nós temos essa linguagem tão versátil que nos permite pular de plataforma para plataforma com o mínimo de fricção.
  8. #2
  9. Nós temos uma super secreta plataforma para TV.
  10. Ela se chama Gibbon, e é uma camada nativa controlada por código JavaScript.
  11. Nossa aplicação antiga era toda baseada em HTML, CSS e JS. Ela rodava até em navegadores Webkit, mas nós empacotávamos tudo para as televisões.
  12. Porém nós temos uns dispositivos um tanto quanto desafiadores. Esses streaming sticks, por exemplo, custam apenas $30, tem um processador single core de 600mhz, JavaScript Core sem just-in-time compilation, e é 465x mais lento que o V8 no meu laptop.
  13. Então nós paramos de usar webkit, e criamos uma plataforma própria que se assemelha muito, porém toda arquitetada para performance e que ainda suportasse uma UI em JavaScript.
  14. O código parece muito similar, porém o código HTML é totalmente declarativo, enquanto no Gibbon nós usamos chamadas imperativas no JavaScript.
  15. #3
  16. Nós lançamos tudo com testes A/B.
  17. Nós testamos experiências novas em uma parcela dos nossos usuários.
  18. Caso a nova experiência demonstre métricas positivas…
  19. …nós lançamos em produção para todos usuários.
  20. E nos fazemos isso tanto para mudanças grandes, como também para pequenas optimizações. Então imagine a quantidade de alterações que cada componente pode receber, e quantas permutações a nossa interface precisa suportar.
  21. As decisões que nossa equipe toma com relação à arquitetura estão diretamente relacionadas à velocidade e volume de testes A/B, que por sua vez impactam a nossa abilidade de inovar. Isso reforça o valor de ter uma boa arquitetura desde o começo, porque essa decisão afeta em muito o nosso produto.
  22. Entrando mais na parte técnica, a nossa arquitetura anterior funcionava com o bom e velho MVC. O controller recebe eventos da view, altera o model, que por sua vez dispara um evento, a view escuta e se atualiza, e tudo funciona muito bem.
  23. Porém 6 anos e centenas de testes A/B depois, a nossa arquitetura se parece mais com isso. A medida que a aplicação foi crescendo, muitos canais secundários foram criando-se e ficou muito difícil compreender o fluxo do código, das dependências, e mais importante, das mutações do estado da aplicação.
  24. Nesse ponto começamos a nos perguntar se estávamos entendedo JavaScript errado. Viemos do mundo dos servidores aonde a requisição começa, executa e termina. Uma nova requisição começa tudo do zero, e a probabilidade de entrar em um mal estado é muito menor. Porém no front-end o nosso usuário pode sentar no sofá na sexta e só parar a maratona de Narcos no domingo! Quem consegue prever o estado da aplicação 3 dias depois de inicializada?
  25. Então nós chegamos a conclusão que estado mutável e compartilhado é a raiz de todos os males. Com tantos canais secundários na nossa arquitetura MVC, era impossível acompanhar o fluxo de alterações. Partes da nossa aplicação tinha o ”expert” dedicado, que era a pessoa que entendia daquela área e estava melhor qualificada para realizar alterações, já que ela compreendia melhor os diferentes estados. Isso era altamente indesejável e engessava nossa abilidade de inovar.
  26. Então nós começamos experimentos, saindo de uma arquitetura onde tudo eram objetos e camadas, e começamos a construir nosso código como um fluxo de componentes funcionais.
  27. Nós começamos a utilizar mais conceitos de JavaScript Funcional ao invés de Orientação à Objetos.
  28. Em sua definição, o paradigma de programação funcional dita que o código seja expresso de forma declarativa, em pequenas funções, evitando alteração de estado e dados mutáveis. Só nessa pequena definição nós encontramos uma série de palavras-chave altamente desejáveis para nossa nova arquitetura.
  29. Então a partir dos nossos experimentos nós definimos 4 princípios para a nossa arquitetura.
  30. #1 Componentes Puros
  31. Funções puras são um dos alicerces da programação funcional. Elas são excelentes por serem previsíveis, idependende de qualquer estado exterior - e portanto imune à muitos erros introduzidos por estados compartilhados – e fáceis de refatorar, reorganizar, mover, e compôr.
  32. Se nós conseguissemos aplicar o mesmo para componentes, e criar componentes puros, nós poderíamos extrair as mesmas qualidades da função pura.
  33. Para isso nós usamos React. Ele é um framework que nos permite aplicar conceitos de programação funcional e construir interfaces inteiras somente com funções.Esse é um pequeno exemplo de um componente puro. Ele não tem estado nenhum, somente renderiza os valores passados por `props`. Para consumir, nós podemos invocar ele como qualquer outra função.
  34. Ele é tão mesmo uma função, que o React nos permite reescrevê-lo dessa forma. Se você analizar, é o mesmo conceito da função pura, aonde nós temos uma entrada, uma saída, e nenhum estado. Dessa forma nós conseguimos ter um componente puro, e usá-lo como alicerce da nossa arquitetura.
  35. Componentes puros garantem previsibilidade, já que para as mesmas entradas, sempre terão a mesma saída. Eles são independentes de estado, fáceis de refatorar e podem ser compostos em componentes cada vez mais complexos.
  36. #2 API Declarativa
  37. API Declarativas nos proporcionam código mais conciso, legível e de fácil compreensão.
  38. Ao invés de dizer exatamente como fazer, nós apenas expressamos o que queremos fazer.
  39. Definir hierarquias também é muito melhor na forma declarativa, do que um código imperativo que levaria dezenas de linhas de código.
  40. No final das contas, ela é uma forma mais legível, de fácil compreensão e com menos margem para bugs.
  41. #3 Composição
  42. Nosso objetivo não é só ficar em componentes pequenos, mas compôr eles de modo a criar a aplicação inteira de forma pura e funcional, onde dados entram no topo e a aplicação completa sai como retorno.
  43. Nós podemos também extender um componentes com mais funcionalidades usando composição ao invés de criar classes e extendê-las (herança).
  44. Composição nos proporciona escalabilidade. Também nos permite criar interfaces complexas de forma controlada. Alterações em um componente base não afetam àqueles que o extendem, já que eles usam composição e não herança.
  45. #4 Fluxo Unidirecional
  46. React nos permite voltar à maneira de trabalhar que usávamos nos velhos tempos de aplicações PHP.
  47. Quando os dados mudam…
  48. Nós jogamos tudo fora e renderizamos de novo.
  49. Bacana… e como eu executo efeitos colaterais?
  50. Nós usamos ações e redutores. Quando algum efeito colateral (uma troca de rota, uma requisição, um evento de teclado, etc…) acontece, uma ação é disparada para representar aquele efeito. O redutor então verifica se para aquela ação é preciso alterar o estado. Se for preciso, ele vai alterar o estado – que é imutável – e receberá o novo estado. O novo estado é então passado para os componentes puros que criar a nova interface.
  51. E se você pudesse criar toda sua aplicação, só com componentes puros?
  52. Essa é a galeria do Netflix. Nós temos o componente Gallery. Cada linha é um componente Category. Cada filme é um componente Boxshot.
  53. A nossa estrutura de dados parece-se com isso.
  54. Nosso primeiro componente puro Boxshot recebe as props e retorna a nova view.
  55. Nosso componente categoria faz o mesmo. Ele também mapeia todos os filmes para componentes Boxshot.
  56. E a galeria faz o mesmo, mapeando categorias para o componente Category.
  57. No fim nós temos nossa interface inteira, somente com componentes puros!
  58. E com isso nós finalizamos a base da arquitetura da Netflix. Ela é previsível, declarativa, extensível, unidirecional e imutável.
  59. Ela nos permite fazer essa expressão uma realidade, aonde o nosso aplicativo é um produto dos dados, passado à uma função que retorna toda a view.
  60. Obrigado! Bruno Tavares (@bt_bruno)