1) O documento discute as vantagens e desvantagens da arquitetura MEAN (MongoDB, Express, AngularJS e Node.js).
2) Um dos principais pontos é a menor "impedância" entre as camadas quando se usa essa stack, já que todos compartilham a linguagem JavaScript.
3) No entanto, também levanta problemas como a ausência de um scaffold consolidado e o "callback hell" na programação assíncrona com callbacks.
11. Língua Franca
É aquela que um grupo multilíngue de
pessoas intencionalmente adota ou
desenvolve para que todos consigam
sistematicamente comunicar-se uns com
os outros.
12. Língua franca ou torre de babel?
ESTRUTURA TABULAR E RELACIONAL, SQL
POJO (PLAIN OLD JAVA OBJECTS)
JSON (JAVASCRIPT OBJECT
NOTATION)
13.
14. "Não são as respostas que
movem o mundo, são
as perguntas”
— Albert Einstein
15. Testes de unidade
Testes de integraçãoOne commit deploy
Integração contínua
(Travis)
Grunt
(Automação)
Bootstrap
Karma
(Jasmine)
Protractor
(Selenium)
AngularJS
26. a) Popularidade meteórica
b) Pioneiro na injeção de dependências
c) Solução própria para criação de módulos
d) Sistema próprio de rotas
e) Two-way data binding
f) Ferramentas para testes
46. Vantagens constatadas durante o
Hackathon
SPA desde o início
Menor impedância
API REST
Isomorphic JavaScript*
* não era para você conseguir ler isso!
47. SPA desde o início
ngRoute
(default)
ui-router
(extensão)
48. SPA desde o início
<!— index.html —>
<html ng-app="minhaApp">
<head>
(…)
</head>
<body>
<ng-view>
</ng-view>
</body>
</html>
<!-- partials/cadastro.html -->
<h1>Cadastro de fotos</h1>
<form>
(...)
</form>
<!-- partials/listagem.html -->
<h1>Listagem de fotos</h1>
49. SPA desde o início
angular.module('minhaApp', ['ngRoute'])
.config(function($routeProvider) {
$routeProvider.when('/fotos', {
templateUrl: 'partials/listagem.html',
controller: 'FotosController'
});
$routeProvider.when('/fotos/new', {
templateUrl: 'partials/cadastro.html',
controller: 'FotoController'
});
});
50. Menor impedância
ESTRUTURA TABULAR E RELACIONAL
Autor autor = new Autor();
autor.setNome(…);
{
"_id": "1"
"nome": "Flávio Almeida"
}
OUTROS
Navegador
(JSON)
Banco
(SQL)
Servidor
(Object)
75. Synchronous Heaven
try {
var contato = dao.porNome('Flávio Almeida');
var dependente = dao.depententeDoContato(contato);
console.log(dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
Mas eu ainda quero o paraíso!
78. Q.async(function*() {
try {
var contato = yield dao.porNome('Flávio Almeida');
var dependente = yield dao.depententeDoContato(contato);
console.log(yield dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
}).done();
É quase um paraíso
79. Synchronous Heaven
try {
var contato = dao.porNome('Flávio Almeida');
var dependente = dao.depententeDoContato(contato);
console.log(dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
80. Permite suspender a execução no meio de uma
função para mais tarde retomá-la
Generator
81. Generator
function * meuGerador() {
var num1 = 1;
var num2 = 2;
var num3 = 3;
yield num1;
yield num2;
yield num3;
}
var gerador = meuGerador();
console.log(gerador.next().value); // 1
console.log(gerador.next().value) // 2
console.log(gerador.next().value) // 3
console.log(gerador.next().value) // undefined
82. Generators e Promises
Q.async(function*() {
try {
var contato = yield dao.porNome('Flávio Almeida');
var dependente = yield dao.depententeDoContato(contato);
console.log(yield dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
}).done();
83. Synchronous Heaven
try {
var contato = dao.porNome('Flávio Almeida');
var dependente = dao.depententeDoContato(contato);
console.log(dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
Mas eu ainda quero o paraíso!
84.
85.
86.
87. Synchronous Heaven
try {
var contato = dao.porNome('Flávio Almeida');
var dependente = dao.depententeDoContato(contato);
console.log(dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
88. try {
var contato = yield dao.porNome('Flávio Almeida');
var dependente = yield dao.depententeDoContato(contato);
console.log(yield dao.adicionaBeneficio(dependente));
} catch(erro) {
console.log(erro);
}
Generators e Promises
Flávio Almeida sou dev e instrutor Caelum, se você dar uma Googlada vocês chegam até meu repo, facebook twitter e grupos que eu participo.
Quero começar um uma pequena história, pequena mesmo…
Flávio Almeida sou dev e instrutor Caelum, se você dar uma Googlada vocês chegam até meu repo, facebook twitter e grupos que eu participo.
Quero começar um uma pequena história, pequena mesmo…
Flávio Almeida sou dev e instrutor Caelum, se você dar uma Googlada vocês chegam até meu repo, facebook twitter e grupos que eu participo.
Quero começar um uma pequena história, pequena mesmo…
Quem sabe o que é impedância em desenvolvimento de software?
Qual banco vocês usam? MySQL, POSTGRES, SQLSERVER, ORACLE
A estrutura de dados é diferente no banco, na memória do servidor e na memória do navegador. Java ORM, etc.
Tornei-me um andarilho à procura da menor impedância, porque isso era importante para mim.
Até que um dia eu ouvi falar de Isomorphic Java, opa! Isomorphic JavaScript
Torre de babel. Por mais que eu uso ferramentas que tentam minimizar a impedância no meu Back-end, a estrutura de dados do banco e a que roda no navegador são diferentes. No back-end temos controle, mas no navegador? É terra de ninguém, ninguém não, é terra do JavaScript.
Não tenho controller do browser, mas tenho controller do meu backend.
Será que consigo criar aplicações profissionais com testes de unidade, aceitação, integração contínua, gerenciamento de dependências e automação de tarefas como numa aplicação profissional Java?
Minhas perguntas me levaram a uma gestão, o livro MEAN. Uma aventura em busca do Isomorphic JavaScript. Esta palestra mostrar o contexto histórico da Stack, algo que não falo no livro, um overview e um posfácio dos problemas e soluções que encontrei.
Do zero ao deploy
Depois do lançamento do Livro, novos desafios e achados.
Nenhum dev quer um sistema com essas qualidades, certo?
há sempre uma motivação ou um zeitgeist (espírito do tempo) que a influencia. Eric Hobsbawn é um historiador famoso. Ele tem vários livros com o título "A era do capital”, “ Era dos impérios”, “Era dos extremos”. No meu livro eu não entro em detalhes no contexto histórico do MEAN, isso é um complemento.
E se no lugar de apenas partes da app usar ajax, toda ela, inclusive a troca de páginas utilizasse essa tecnologia?(spa)
Foi daí que Steven Yen cunhou o termo SPA. Na verdade, um heavy use de Ajax. Porém, JavaScript e programação assíncronas não são triviais.
Cada um procurando sua solução SPA.
A proliferação de SPA foi tão grande que também aumentou o code base do client. Para ajudar no SPA e também na organização do código foram criados frameworks MVC.
Novos livros de renome começaram a ser lançados…
Novos livros de renome começaram a ser lançados…
Novos livros de renome começaram a ser lançados…
Novos livros de renome começaram a ser lançados…
Sim, da mesma forma que a evolução de SPA foi ocorrendo, outra revolução também foi sendo empreendida.
O que é não ter esquemas? Não há coluna Tabela tem colunas e possui registros. Tabelas são documentos que possui propriedades. Documentos são agregados em coleções. Documentos dentro de uma coleção podem ter estruturas diferentes! Isso é bom, isso é ruim? Tudo depende, veremos mais à frente.
É sua aplicação que deve criar esquemas e garantir dados.
Plataforma JavaScript criada por Bryan Dahl. Usa a V8 (máquina virtual do Chrome) que processa o JavaScript. Considerada uma das máquinas virtuais mais sofisticadas. O mais curioso é que a NETSCAPE já havia tentando consolidar o javascript no lado do servidor com o NETSCAPE SERVER, mas naquela época havia problema de performance, inclusive o preconceito contra a linguagem, considerada “inferior”.
Será que a plataforma Node.js é digna para o desenvolvimento de aplicações mais complexas? Pergunte a eles:
Netscape em 1999/2000 tentou JS no lado do servidor, mais não rolou (debugar era complicado, era multithread, era compilada.
MS windows 10 ARM
É sua aplicação que deve criar esquemas e garantir dados.
É sua aplicação que deve criar esquemas e garantir dados. falar importância de esquema
Pode parecer que usar 4 tecnologias para desenvolvimento pode ser algo trabalhoso, mas provou o contrário numa competição de hackathron. São curtas competições de programação.
Pode parecer que usar 4 tecnologias para desenvolvimento pode ser algo trabalhoso, mas provou o contrário numa competição de hackathron. São curtas competições de programação.
Ascot Project: ferramenta para marcação de produtos em fotos.
Bookalokal: aplicação web para encontrar lugares para jantar perto de você
Uma ferramenta de ORM pode ser usada, para quando for depurar a aplicação a estrutura de dados é diferente nas três camadas.
Estrutura de dados semelhante ou quase, depurar nas três camadas acaba se tornando algo mais fácil (obs: depurar JavaScript não é tão trivial).
Single thread, como roda em paralelo?
fala da promessa, se cumprir, se não cumprir
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Só node 0.11 com —harmony. Browser suportará também. O Q.ASYNC é um açúcar para chamar o generator.
Imagine que o MongoDB seja indicado para a aplicação, como gerar relatório? E as ferramentas que tenho? E meu cliente que usa alguma ferramenta já paga para consultar SQL, gerar CUBO, etc?
Leverage your existing SQL skillsets and BI tools including Tableau, Qlikview, MicroStrategy, Spotfire, Excel and more
Qual o custo disso? Aumento da impedância. A boa notifica é que o driver retorna um JSON, porém você ainda terá que montar suas queries em SQL.
Agora sim, a forma anterior é usado mais para protótipos. O problema dessa solução é que você precisará sempre fazer isso para evitar maiores problemas.
Agora sim, a forma anterior é usado mais para protótipos. O problema dessa solução é que você precisará sempre fazer isso para evitar maiores problemas.
Agora sim, a forma anterior é usado mais para protótipos. O problema dessa solução é que você precisará sempre fazer isso para evitar maiores problemas.