Como usar NodeJS + MySQL

Hoje vou ensinar como que você pode usar Node.js com MySQL. Apesar de MongoDB e demais bases não relacionais serem a escolha mais comum com Node, muitos programadores, geralmente de background PHP, conhecem e usam MySQL e não querer abrir mão de seu conhecimento a respeito.

Além disso, como pessoal da Rising Stack afirma, com bons índices e planejamento adequado, o MySQL pode ser excelente para tarefas onde ACID seja uma prioridade, algo geralmente relegado a segundo plano em bancos não-relacionais. Sendo assim, acredito que este post ajudará quem estiver migrando de plataforma, mas não quer migrar de banco.

Existem diversas maneiras de usar MySQL com Node. Uma vez que é um banco de dados muito popular, logo, é possível que você encontre muita informação diferente na Internet à respeito. Entenda que te mostrarei UMA das INÚMERAS opções de como conectar no MySQL com Node.js.

Veremos neste artigo (pule seções à vontade):

  1. Criando o banco de dados
  2. Criando e populando a tabela
  3. Criando a API
  4. Criando a listagem de clientes
  5. Criando a pesquisa de um cliente
  6. Excluindo um cliente
  7. Adicionando um cliente
  8. Atualizando um cliente
  9. Bônus 1: ORM
  10. Bônus 2: Boas práticas

Então vamos lá!

Parte 1: Criando o banco de dados

Se você já possui um banco de dados MySQL, ok, use ele e pule para a próxima parte.

Se você não possui um banco MySQL, você tem duas opções:

  1. baixar e instalar o MySQL (gratuito) na sua máquina;
  2. contratar um banco MySQL na nuvem (gratuito, vou te ensinar abaixo);

A primeira opção é um pouco mais trabalhosa, porém te dá mais liberdade. Baixe, instale e crie um novo banco de dados para uso nesse tutorial. Durante a instalação, você irá precisar definir uma senha para o usuário ‘root’, não esqueça dela.

A segunda opção é bem simples também, mais vai exigir que você tenha conexão com a Internet enquanto estiver programando pois seu banco vai estar na nuvem. Na Umbler, empresa em que trabalho como evangelista tecnológico, você pode criar bancos MySQL gratuitos de até 1GB, para testes e estudos. Para isso, basta você criar um site que custa R$6/mês, mas não se preocupe com o valor, você ganha créditos de graça para usar livremente conforme vai cumprindo algumas etapas dentro do painel e mais tarde, se não quiser mais mantê-lo, basta excluir ele (ou parar o site para reduzir os custos). Crie um site com um domínio qualquer (mesmo que não tenha registrado) e depois vá na parte de banco de dados para criar um do tipo MySQL e escolha a opção Grátis (1GB) e habilite o acesso externo, como na imagem abaixo. Durante a criação do seu banco, você vai definir o nome dele, o usuário e a senha, anote tudo, bem como o endereço do servidor que a Umbler vai te fornecer.

MySQL na Umbler
MySQL na Umbler

Parte 2: Criando e populando a tabela

Agora que você já tem o banco pronto, vamos criar uma tabela nele e colocar alguns dados de exemplo. Não pule esta etapa pois vamos fazer tudo isso usando Node.js!

Crie uma pasta para guardar os arquivos do seu projeto Node.js, você pode fazer isso pelo console se quiser, usaremos ele algumas vezes nesse tutorial. No exemplo abaixo, criei a pasta e depois entrei dentro dela.

Agora execute no console o comando “npm init” que o próprio NPM (gerenciador de pacotes do Node) vai te guiar para a construção do arquivo packages.json, que é o arquivo de configuração do projeto. Se ficar em dúvida ou com preguiça, segue o meu package.json abaixo:

Com o arquivo de configurações criado, vá no console novamente, na pasta do projeto e digite o seguinte comando para instalar a extensão mysql, que permite usar Node com MySQL:

A flag “-S”diz que é pra salvar essa dependência no arquivo packages.json. Se você abrir o arquivo vai ver que tem coisa nova por lá.

Agora, crie um arquivo create-table.js dentro dessa pasta, que será o arquivo que vai criar e popular nossa tabela que usaremos neste exercícios. Também usaremos ele para entender o básico de comandos SQL, conexão com o banco, etc. Vamos começar nosso create-table.js definindo uma constante para a String de conexão com o banco e uma constante para o objeto que vai carregar a extensão mysql (e que mais tarde usaremos para conectar, executar SQL, etc). O código abaixo é auto explicativo:

Agora, usaremos esse objeto connection para fazer uma conexão e, em caso de sucesso, imprimir uma mensagem de sucesso. Caso contrário, se der erro, uma mensagem de falha:

Se esse código lhe parece muito bizarro, calma, é fácil de entender. O objeto connection permite que façamos coisas no banco de dados, uma delas é a conexão (connect). No entanto, o Node.js trabalha de maneira assíncrona, o que quer dizer que ele não espera pela conexão ser estabelecida. Quando ele terminar de estabelecer a conexão, ele vai executar a função de callback passada por parâmetro, contendo ou não um objeto de erro.

Para executar esse arquivo, abra o console (se estiver usando VS Code, apenas aperta F5 com este arquivo aberto no editor) e na pasta do projeto digite:

Agora que sabemos como conectar no MySQL através de Node.js, é hora de executarmos o comando que vai criar a tabela e popular ela, ao invés de simplesmente imprimir “conectou”. Sendo assim, vamos criar uma função JS nesse arquivo pra fazer a criação da tabela:

Coloque a chamada desta função no callback após a conexão no banco, passando o objeto conn por parâmetro, como abaixo:

Mande rodar esse arquivo novamente e verá que ele criará a sua tabela com sucesso. Para adicionar algumas linhas de exemplo, vamos criar outra função que vai fazer um bulk insert no MySQL via Node.js (inserção de várias linhas de uma vez):

Essa função deve ser chamada dentro do callback da query que criou a tabela, logo abaixo de onde diz “console.log(‘criou a tabela!’);”. Se não quiser fazer isso dessa maneira, você pode fazer pela sua ferramenta de gerenciamento do MySQL (como o MySQL Workbench) ou pelo Visual Studio, se estiver usando ele para programar Node.js.

Parte 3: Criando a API

Agora que já temos nosso banco de dados MySQL pronto, com dados de exemplo e aprendemos como fazer a conexão nele, vamos criar uma API básica usando Express para conseguir criar um CRUD com Node.js + MySQL no próximo passo. Se já sabe como montar uma API básica com Node + Express, pule esta parte.

Vamos começar adicionando a dependência do Express (framework web) e do Body-Parser (parser para os POSTs futuros) no projeto via linha de comando na pasta do mesmo:

Na sequência, vamos criar um arquivo index.js na pasta do projeto onde vamos criar o nosso servidor da API para tratar as requisições que chegarão em breve. Vamos começar bem simples, apenas definindo as constantes locais que serão usadas mais pra frente:

Agora, logo abaixo, vamos configurar nossa aplicação (app) Express para usar o body parser que carregamos da biblioteca body-parser, permitindo que recebamos mais tarde POSTs nos formatos URLEncoded e JSON:

Na sequência, vamos criar um roteador e dentro dele definir uma regra inicial que apenas exibe uma mensagem de sucesso quando o usuário requisitar um GET na raiz da API (/) para ver se está funcionando.

Note que na última linha eu digo que requisições que chegarem na raiz devem ser mandadas para o router. Por fim, adicionamos as linhas abaixo no final do arquivo que dão o start no servidor da API:

Teste sua API executando via console o seu index.js com o comando ‘node index.js’. Você deve ver a mensagem de ‘API funcionando!’ no console, e se acessar no navegador localhost:3000 deve ver o JSON default que deixamos na rota raiz!

API Funcionando
API Funcionando

Parte 4: Criando a listagem de clientes

Agora que temos uma API funcionando, vamos adicionar uma rota /clientes que listará todos os clientes do banco de dados. Para fazer isso, primeiro vamos criar uma função que executará consultas SQL no banco usando uma conexão que será criada a cada uso (existem técnicas mais avançadas para maior performance, mas por ora, isso resolve satisfatoriamente), como abaixo:

Esta função pode ficar no final do seu arquivo index.js e nós a usaremos para fazer todas as operações de banco de dados da nossa API, começando com consultar todos os clientes. Para isso, começaremos criando a rota /clientes logo abaixo da rota / (raiz):

Agora, ao executarmos novamente nosso projeto e ao acessarmos a URL localhost:3000/clientes, veremos todos os clientes cadastrados no banco de dados (no passo 2, lembra?):

Todos clientes
Todos clientes

E com isso finalizamos a listagem de todos clientes na nossa API!

Parte 5: Criando a pesquisa de um cliente

Agora, se o usuário quiser ver apenas um cliente, ele deverá passar o ID do mesmo na URL, logo após o /clientes. Para fazer isso, vamos modificar nossa rota criada no passo anterior, /clientes, para aceitar um parâmetro opcional ID. Além disso, dentro do processamento da rota, se vier o ID, devemos fazer uma consulta diferente da anterior, como mostra o código abaixo, com os ajustes na mesma rota do passo anterior:

O parseInt que coloquei é apenas uma proteção contra SQL Injection uma vez que neste caso o ID deve ser um inteiro válido. Não é a melhor forma de resolver isso, mas vai nos atender por enquanto sem ter de entrar em conceitos mais avançados. Manda rodar e teste no navegador, verá que está funcionando perfeitamente!

Apenas um
Apenas um

E com isso terminamos a pesquisa por cliente.

Parte 6: Excluindo um cliente

Para excluir um cliente vamos fazer um processo parecido com o de pesquisar um cliente, no entanto, mudaremos o verbo HTTP de GET para DELETE, como manda o protocolo. Adicione a nova rota logo após as demais:

Note que desta vez o parâmetro id na URL não é opcional (não usei ? após :id). E dentro do processamento da requisição delete do router eu mando um SQL de DELETE passando o ID numérico.

Para testar essa rota você tem duas alternativas, ou usa o POSTMAN para forjar um DELETE, como abaixo:

DELETE com POSTMAN
DELETE com POSTMAN

Ou fazer via console usando cURL (se tiver ele instalado na sua máquina):

Em ambos os casos você deve obter uma resposta 200 OK (caso não tenha dado erro) e se mandar listar todos clientes novamente, verá que o número 1 sumiu.

Parte 7: Adicionando um cliente

Agora vamos adicionar um novo cliente com um POST na rota /clientes. Adicione esta nova rota logo abaixo das anteriores.

Nela, eu pego as variáveis que devem vir junto ao POST, faço algumas validações de tamanho e tipo de dado e depois junto elas a um comando de INSERT que vai ser executado no banco de dados.

Para testar esse POST, você usar o POSTMAN, como mostrado anteriormente:

POST no Postman
POST no Postman

Se quiser fazer via cURL:

Também podemos permitir outras maneiras de passar os dados com a requisição POST, como através de JSON ou através da URL, mas isso foge do escopo deste artigo que deve focar mais no CRUD com MySQL + Node.

Se testar agora vai ver que é possível inserir novos registros no banco de dados através de requisições POST.

Parte 8: Atualizando um cliente

E para finalizar o CRUD, vamos ver como podemos atualizar um cliente no banco de dados SQL Server através da nossa API Node.js. Para fazer updates podemos usar os verbos PUT ou PATCH. O protocolo diz que devemos usar PUT se pretendemos passar todos os parâmetros da entidade que está sendo atualizada, mas não vamos alterar jamais o ID, então usaremos PATCH nesta API.

Crie uma rota PATCH em /clientes esperando o ID do cliente a ser alterado.

No código acima, pegamos o ID que veio na URL e as demais informações que vieram no corpo da requisição, fazendo as mesmas validações que já havia feito antes (podemos melhorar a segurança aqui). Depois monto o UPDATE com as variáveis locais e mando para nossa função de executar SQL.

Para testar uma requisição PATCH, você pode usar o POSTMAN:

PATCH no POSTMAN
PATCH no POSTMAN

Ou o cURL:

O resultado é o mesmo: o cliente cujo ID=4 vai ter o seu nome alterado para ‘fernando’. Note que se ele não existir, ocasionará um erro que será apresentado no corpo da resposta.

E com isso finalizamos o CRUD da nossa API Node.js que usa MySQL como persistência de dados.

Bônus 1: ORM

Se você não curte muito a ideia de ficar usando SQL no meio dos seus códigos JS, experimente usar alguma biblioteca ORM (Object-Relational Mapping) como o Sequelize. Nunca usei, mas muita gente recomenda por possuir suporte a MySQL, SQL Server, PostgreSQL e SQLite.

Bônus 2: Boas práticas

Não quis deixar o tutorial muito extenso e por isso deixei de passar algumas boas práticas. Como foi levantada esta questão no grupo do Facebook de Node.js pelo usuário Ícaro Tavares, achei válido trazer as sugestões para cá. Se você está lendo esse bônus é porque se interessa em saber mais do que o básico e isso é ótimo, então lá vai.

SQL Injection

O código que forneci nos exemplos concatenando strings para formar uma query SQL deixa uma brecha potencialmente nociva no código da sua API chamada SQL Injection. Para evitar isso, você pode usar ‘?’ no lugar das variáveis que devem ser substituídas e passar um array de variáveis para substituição como segundo parâmetro da função query.

Como assim?

Para um dado comando SQL como:

note que coloquei o ‘?’ no lugar do valor do id, e poderia fazer isso para quantos filtros minha consulta tiver. Agora, quando chamar a função query do módulo mysql, farei da seguinte forma, passando um array de variáveis/valores para preencher esses ‘?’, na mesma ordem que foram descritos na consulta:

Dessa forma, meu código não fica mais suscetível à SQL Injection!

Conexões auto-gerenciadas

No código que forneci, nós temos total controle sobre a abertura e fechamento de conexões. Como boa prática, você pode deixar para a própria função query se encarregar de abrir e fechar essas conexões, se livrando desse “microgerenciamento”.

Em meus testes pessoais notei que isso pode ser melhor ou pior que o exemplo que mostrei no tutorial, considerando peculiaridades da sua infraestrutura de MySQL. Na dúvida, o meu código não tem a melhor performance, mas a garantia de funcionamento mesmo em hospedagens compartilhadas, onde não temos tanto controle das configurações do MySQL.

SELECT *

A menos que você sempre vá usar todas as informações da sua tabela, jamais use SELECT *, mas sim a versão extensão da consulta SQL em que você passa todas as colunas da tabela que deseja retornar. Pense em um SELECT como sendo um download do seu banco de dados, quanto menos colunas você incluir no SELECT, mais rápido será esse download pois menos bytes serão retornados.

Até a próxima!

Conheça os Frameworks de Desenvolvimento Mobile

Frameworks Mobile
Frameworks Mobile

O post de hoje é meramente informativo. Devido ao fato de eu ser um entusiasta do desenvolvimento móvel, incluindo games, acabo estudando por hobby uma infinidade de linguagens e frameworks. Geralmente meus amigos e alunos vem até mim questionando sobre qual a melhor plataforma para desenvolvimento, qual a mais produtiva, qual a melhor para games ou para apps, etc. Na verdade não existe uma resposta definitiva pois esse mercado é muito ágil e as grandes plataformas de hoje podem não ser mais as melhores amanhã e por aí vai.

A escolha de um framework ou plataforma também depende muito de suas habilidades e de seus objetivos com a aplicação.

Com base nisso vou centralizar neste post todos os frameworks mobile que conheço, com breves explicações sobre cada um. Aqui vai a lista completa:

Nativos

Games

Multi-plataforma

Outros

Android SDK
Android SDK

Android SDK

De longe meu SDK nativo favorito, o Android SDK é perfeito para seu propósito principal: desenvolvimento de aplicações pra a plataforma Android. Esqueça o desenvolvimento de jogos nele, que é extremamente complexo de ser feito sem um framework mais alto nível (como Corona SDK). Ele é gratuito, roda em Windows, Mac e Linux e utiliza várias IDEs para desenvolvimento, como Android StudioEclipse e NetBeans com a linguagem Java ou C++. Já escrevi muito sobre ele aqui no blog.

Mais informações no site oficial e no livro Criando apps para empresas com Android.
iOS SDK

iOS SDK

O SDK oficial da Apple para desenvolvimento de aplicações móveis. De longe a melhor opção para desenvolvimento de apps para iPhone, iPod e iPad. Isso porque os usuários destas plataformas possuem um mindset muito definido quanto a usabilidade e aparência, e a biblioteca CocoaTouch que vem no iOS SDK te proporciona recursos para o desenvolvimento de apps com as mesmas características das apps da Apple. Ele roda somente em computadores Mac e utiliza o Xcode como IDE, que é gratuito, com a linguagem Objective-C ou Swift.

Mais informações no site oficial e como recomendação, o melhor livro sobre o assunto é o Use a Cabeça: iPhone.

Windows Phone SDK
Windows Phone SDK

Windows Phone SDK

Com desenvolvimento sobre a plataforma .NET e usando o Visual Studio (incluindo versão Community, gratuita), ainda possui um market share pequeno, mas carente, o que pode ser uma oportunidade. Algo interessante nessa plataforma é a facilidade de desenvolver jogos usando o framework XNA, da mesma empresa. Mais informações no site oficial e o livro mais recomendado é o Desenvolvimento de Aplicativos para Windows Phone.

Estes três formam a tríade dos frameworks nativos mais usados atualmente. Agora vamos aos frameworks multi-plataforma mais aceitos no mercado:

Corona SDK
Corona SDK

Corona SDK

Desenvolvido pela empresa californiana CoronaLabs (antiga Ansca Mobile), baseia-se na linguagem Lua e em frameworks consolidados de desenvolvimento como OpenGL ES, OpenAL, Box2D e por aí vai. Provê centenas de APIs para desenvolvimento multiplataforma (iOS, Android, Kindle Fire e Nook Color) e roda sobre Windows e Mac, já escrevi muito sobre ele aqui no blog.

Muito bom para desenvolvimento de jogos 2D (não tem suporte a 3D), peca um pouco quando o assunto são apps com o look-and-feel nativo dos frameworks tradicionais. Possui uma versão free ilimitado e apenas reserva algumas features mais avançadas para quem quer pagar licença. Mais informações no site oficial e no livro Criando aplicações móveis com Corona.

Unity
Unity

Unity

Unity, também conhecido como Unity 3D, é um motor de jogo 3D proprietário e uma IDE criado pela Unity Technologies. Unity é uma ferramenta bem visual para desenvolvimento de jogos e suporta diversas plataformas, hoje permitindo desenvolvimento para as principais plataformas de jogos do mercado, incluindo Android e iOS.

O Unity possui duas versões principais: a Unity Pro, paga, e a versão gratuita, simplesmente chamada Unity, que pode ser usada tanto para fins educacionais, quanto para fins comerciais. O Unity na grande maioria das vezes é usado na criação jogos de browser, (Jogos que rodam em navegador de internet), mas o motor é capaz de criar grandes jogos.

Mais informações no site oficial e no livro Desenvolvendo games com Unity 3D.

Com isso fechamos as recomendações de frameworks mobile para jogos. Agora vamos aos frameworks multi-plataforma, que promete vai programar apenas uma vez e fazer deploy para no mínimo as duas principais plataformas do mercado: Android e iOS.

Xamarin
Xamarin

Xamarin

Empresa que foi adquirida pela Microsoft e que no passado tocava projetos de portabilidade do .NET para outras plataformas como Linux e Mac OS X. Hoje Xamarin desponta como uma das principais escolhas multi-plataforma, permitindo desenvolvimento em diversos ambientes usando C# e gerando apps nativos para diversas plataformas.

Mais informações no site oficial e no livro Desenvolvimento de aplicativos móveis com Xamarin.

Phonegap
Phonegap

PhoneGap

A ideia do PhoneGap (atualmente da Adobe) é simples: todo desenvolvedor web sabe HTML e Javascript. Por que não trazê-los para o mundo mobile usando estes mesmos conhecimentos? Open-source e gratuito, o PhoneGap provê um container web no qual você constrói suas aplicações multiplataforma (iOS, Android, etc) usando apenas o básico da web: HTML+CSS+JS. Ele provê APIs JavaScript para que você tenha acesso aos recursos de hardware do smartphone e exige apenas que os dispositivos tenham browsers que suportem esses recursos web básicos.

Já desenvolvi vários projetos com ele e tem duas ferramentas muito úteis na plataforma: uma delas é o build na nuvem, que permite facilmente gerar apps para todas plataformas a partir de um zip com o site que você desenvolveu e a outra é um app de teste que você instala no seu smartphone e testa suas alterações em realtime, muito facilmente, sem ter de ficar instalando e desinstalando.

Mais informações no site oficial. Também escrevi alguns posts sobre ele aqui e aqui e tem o livro mais recomendado que é o Aplicações mobile híbridas com Cordova e Phonegap.

Ionic
Ionic

Ionic

Esse é um framework que vem crescendo bastante nos últimos anos e que, assim como o Phonegap, trabalha juntamente com o projeto Apache Cordova para fornecer facilidades de programação para quem já sabe HTML+CSS+JS.

Mais informações no site oficial.

React Native
React Native

React Native

Projeto do Facebook que permite criar apps multi-plataforma usando apenas JavaScript e a já conhecida e popular framework de front-end ReactJS. Fala-se muito bem dela por aí, mas nunca utilizei.

Mais informações no site oficial.

E por fim, vamos aos ditos frameworks indies, menos usados mas que podem ser interessantes para algum projeto seu:

Titanium SDK

Bem conhecido entre os estúdios menores de desenvolvimento, o Titanium usa Javascript para desenvolvimento de suas aplicações para iOS, Android e dispositivos que suportem HTML5 em geral. Seus criadores da Appcelerator desenvolveram mais de 5000 APIs para acesso aos recursos de hardware das plataformas e prometem 70% a mais de produtividade sobre desenvolvimento Java e Objective-C. Mais informações no site oficial.

Moai SDK

Criado pela empresa Zipline Games, é um framework open-source extensível que permite desenvolvimento de games em Lua e C++ para iOS, Android, Chrome, PC e Mac (em breve Linux). Com alguns poucos (mas premiados) títulos no currículo mas com alguns excelentes títulos sendo prometidos, não cobra um centavo pelo framework, sendo o foco da empresa a venda de serviços de dados, armazenamento em nuvem, suporte, desenvolvimento personalizado de funcionalidades, etc. Mais informações no site oficial.

GameSalad

O GameSalad promete usar HTML5 e JavaScript para desenvolvimento de jogos para iOS, Android e HTML5 em geral usando ferramentas fáceis para várias plataformas como Mac e Windows. Não possui muitos títulos no currículo mas promete ser bem fácil de usar. Mais informações no site oficial.

Delta Engine

Ainda em sua versão beta (há 5 anos), este framework para games é o que mais promete na minha opinião, para os grandes estúdios. O foco da empresa desenvolvedora, MobileBits, é desenvolvimento multiplataforma (Windows, Mac, Linux, Android, Windows Phone e iOS) de games pesados (3D) usando a plataforma .NET e Visual Studio. O projeto é open-source e conta com alguns títulos de peso sendo desenvolvidos com a plataforma, vale a pena dar uma olhada no site oficial.

Conhece algum framework que não foi listado aqui? Tem alguma opinião diferente das mencionadas? Comente abaixo para contribuir e criarmos a melhor lista de frameworks da Internet.

Padrões de Arquitetura de Aplicações Corporativas – Resenha

Quem me conhece sabe que eu não leio muitos livros de programação. Isso é curioso para alguém que trabalha há 11 anos com programação, mas sim, eu não costumo ler livros de programação. Isso não quer dizer que eu não leia nada à respeito, é claro. Eu leio muito em diversas fontes, atualmente muito no Medium, aliás. Como estou sempre envolvido com um projeto ou outro, acabo aprendendo conforme a demanda surge, fazendo algo parecido com a Dieta Pobre de Informação que o Tim Ferriss sugere no livro dele.

No entanto, existem alguns livros que considero leituras altamente recomendadas e que me ajudaram muito enquanto programador. Além disso, existem alguns autores que eu realmente recomendo pois são profissionais incríveis que contribuíram e ainda contribuem para a evolução da forma como desenvolvemos software. Um desses livros é o Padrões de Arquitetura de Aplicações Corporativas. Um desses autores é Martin Fowler, o autor desse livro aliás.

O Livro

O PEAA (da sigla em Inglês Patterns of Enterprise Application Architecture) não é o livro mais clássico sobre o assunto e também não é o mais famoso. Esse título pertence ao Padrões de Projetos da Gang of Four. No entanto, nesta década de experiência que tive desenvolvendo os mais inúmeros sistemas, nas mais diversas plataformas, o PEAA sempre me foi mais útil que o Padrões de Projeto, por isso que estou recomendando ele hoje.

É um livro imenso, com quase 500 páginas, que cobre aproximadamente 40 padrões de arquitetura de software recorrentes em diversos cenários. Mas ele não é apenas um listão de padrões, ele é extremamente bem organizado em seções de acordo com o contexto do problema que está querendo resolver (domain logic, data source, web presentation, etc).

E o autor não fica apenas nos conceitos mas mostra exemplos de código bem como diagramas UML para facilitar o entendimento de cada padrão. Além disso, ao contrário da sua contraparte mais antiga, é possível ver mais claramente a aplicação de cada padrão em cenários existentes nos projetos atuais. Não que isso diminua o Padrões de Projeto da GoF, mas sim que os padrões do catálogo PEAA são mais recorrentes, e até mesmo possui alguns em comum.

Esse não é o tipo de livro que você pega e lê da primeira página à última. Tenho um exemplar há uns 4 anos e certamente não li ele inteiro ainda. É o tipo de livro no qual você busca apoio quando tem algum problema arquitetural difícil de solucionar. Você até pode correr por suas 492 páginas dando uma “olhada geral” nos padrões e entendendo os principais em um nível mais alto, mas dificilmente vai gostar da leitura se lê-lo do jeito tradicional.

Enfim, é um excelente livro, o melhor que já li sobre arquitetura de software.

O Autor

Eu sou suspeito para falar de Martin Fowler. Durante a minha ascensão enquanto programador, de estagiário à gerente de projetos, eu consumi muito conteúdo desse autor, especialmente de seu blog o martinfowler.com. Esse engenheiro é simplesmente genial, estando à frente de projetos na ToughtWorks há décadas e mais de uma vez já pensei em aceitar propostas de emprego na TW só para ter a oportunidade de trabalhar com ele em algum projeto.

Ele não é apenas um programador genial, que muito me espelhei durante os anos iniciais aprendendo programação, mas ele também é um exímio gerente de projeto, estando entre os signatários originais do Manifesto Ágil, que oficializou o uso destas práticas pouco ortodoxas de desenvolvimento de software ao redor do mundo com frameworks como Scrum e XP.

Fowler é ainda autor de grandes citações sendo a minha favorita: “Bons programadores escrevem programas que máquinas entendem. Programadores excelentes escrevem programas que humanos entendem.“. Essa frase balizou muitas decisões de projeto em toda minha carreira, para dizer o mínimo. Recentemente estava lendo alguns excelentes artigos em seu site e me senti novamente um aprendiz de programação frente ao seu nível de conhecimento.

Poucos profissionais nesse mundo são capazes de me impressionar assim, sou do tipo difícil de agradar, mas esse autor com certeza é o meu favorito quando o assunto é programação. Espero um dia lançar um livro que ajude tanto os programadores quanto ele faz.

Espero que vocês gostem da recomendação também.