text: CREATE DATABASE  IF NOT EXISTS `startup` /*!40100 DEFAULT CHARACTER SET utf8 */;
  USE `startup`;
  -- MySQL dump 10.13  Distrib 5.7.31, for Win64 (x86_64)
  --
  -- Host: localhost    Database: startup
  -- ------------------------------------------------------
  -- Server version	5.7.31
  
  /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  /*!40101 SET NAMES utf8 */;
  /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
  /*!40103 SET TIME_ZONE='+00:00' */;
  /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  
  --
  -- Table structure for table `categoria`
  --
  
  DROP TABLE IF EXISTS `categoria`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `categoria` (
    `idCategoria` int(11) NOT NULL AUTO_INCREMENT,
    `descricao` varchar(45) NOT NULL,
    `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0: Inativo\\n1: Ativo\\n',
    `icone` varchar(30) NOT NULL,
    PRIMARY KEY (`idCategoria`)
  ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  /*!40101 SET character_set_client = @saved_cs_client */;
  
  --
  -- Dumping data for table `categoria`
  --
  
  LOCK TABLES `categoria` WRITE;
  /*!40000 ALTER TABLE `categoria` DISABLE KEYS */;
  INSERT INTO `categoria` VALUES (1,'Mobile',1,'fas fa-mobile-alt'),(2,'Web',1,'fas fa-desktop'),(3,'Desenvolvimento Ãgil',1,'fas fa-rocket');
  /*!40000 ALTER TABLE `categoria` ENABLE KEYS */;
  UNLOCK TABLES;
  
  --
  -- Table structure for table `post`
  --
  
  DROP TABLE IF EXISTS `post`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `post` (
    `idPost` int(11) NOT NULL AUTO_INCREMENT,
    `idUsuario` int(11) NOT NULL,
    `idCategoria` int(11) NOT NULL,
    `slug` varchar(255) NOT NULL,
    `titulo` varchar(255) NOT NULL,
    `img` varchar(255) NOT NULL,
    `corpo` text NOT NULL,
    `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0: Não publicado| 1: Publicado',
    `criadoEm` datetime NOT NULL,
    `alteradoEm` datetime DEFAULT NULL,
    PRIMARY KEY (`idPost`),
    UNIQUE KEY `slug_UNIQUE` (`slug`),
    KEY `idUsuario_idx` (`idUsuario`),
    KEY `idCategoria_idx` (`idCategoria`),
    CONSTRAINT `idCategoria_post` FOREIGN KEY (`idCategoria`) REFERENCES `categoria` (`idCategoria`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `idUsuario` FOREIGN KEY (`idUsuario`) REFERENCES `usuario` (`idUsuario`) ON DELETE CASCADE ON UPDATE CASCADE
  ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
  /*!40101 SET character_set_client = @saved_cs_client */;
  
  --
  -- Dumping data for table `post`
  --
  
  LOCK TABLES `post` WRITE;
  /*!40000 ALTER TABLE `post` DISABLE KEYS */;
  INSERT INTO `post` VALUES (5,1,2,'o-que-deploy-e-como-enviar-um-web-app-ou-site-para-produ-o','O que Ã© deploy e como enviar um Web App ou site para produÃ§Ã£o','blog-slide1.jpg','<p>Quando terminamos uma aplica&ccedil;&atilde;o, em que lugar podemos disponibilizar para outras pessoas acessarem? O que preciso para fazer para o app funcionar? Hoje vou falar sobre&nbsp;<strong>o que &eacute; deploy</strong>&nbsp;e dar um exemplo de como faz&ecirc;-lo corretamente.</p>\r\n\r\n<p>Em primeiro lugar, podemos considerar deploy como uma fase do ciclo de vida de um software.</p>\r\n\r\n<p>Basicamente, usamos este termo quando vamos disponibilizar o sistema em um ambiente de desenvolvimento, para testes ou em produ&ccedil;&atilde;o.</p>\r\n\r\n<p>O termo deploy pode ser usado para muitos casos, dependendo muito do ambiente e da tecnologia. Um desenvolvedor pode fazer o Deploy da sua aplica&ccedil;&atilde;o web no Tomcat localmente, ou em servi&ccedil;os como a AWS.&nbsp;</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2><strong>Automa&ccedil;&atilde;o de Deploy</strong></h2>\r\n\r\n<p>O Deploy da sua aplica&ccedil;&atilde;o pode ser feito de forma manual, parcialmente ou completamente automatizado.</p>\r\n\r\n<p>Um processo automatizado pode consistir em realizar&nbsp;<a href=\"https://blog.geekhunter.com.br/o-que-e-commit-e-como-usar-commits-semanticos/\">commit</a>&nbsp;do c&oacute;digo em um reposit&oacute;rio e esta a&ccedil;&atilde;o dispara automaticamente o processo de constru&ccedil;&atilde;o (build) do execut&aacute;vel da aplica&ccedil;&atilde;o e a sua disponibiliza&ccedil;&atilde;o no servidor.</p>\r\n\r\n<p>Nesse sentido, quando falamos da automatiza&ccedil;&atilde;o do Deploy, n&atilde;o significa que a aplica&ccedil;&atilde;o precise estar 100% automatizada. No caso, n&atilde;o necessariamente um commit vai acabar em produ&ccedil;&atilde;o, o que importa &eacute; que todos os passos trabalhosos estejam automatizados.</p>\r\n\r\n<p>Desenvolvedores e administradores DevOps, por exemplo, devem configurar este ambiente de forma mais adequada a cada projeto, diminuindo o retrabalho.</p>\r\n\r\n<p>Um bom exemplo &eacute; quando nem todo commit de c&oacute;digo faz sentido gerar uma vers&atilde;o para produ&ccedil;&atilde;o. Ent&atilde;o v&aacute;rios crit&eacute;rios podem ser adotados, a principal estrat&eacute;gia &eacute; o uso de branches para diferentes ramifica&ccedil;&otilde;es no desenvolvimento.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2><strong>Integra&ccedil;&atilde;o Cont&iacute;nua &ndash; CI &ndash; Continuous Integration</strong></h2>\r\n\r\n<p>Da mesma forma, essa automatiza&ccedil;&atilde;o n&atilde;o visa apenas evitar retrabalho mas tamb&eacute;m permite aos desenvolvedores alcan&ccedil;arem um n&iacute;vel superior de produtividade e entrega de qualidade.</p>\r\n\r\n<p>Para quem &eacute; desenvolvedor, encontrar uma aplica&ccedil;&atilde;o que os respons&aacute;veis disseram:&nbsp;<em>&ldquo;J&aacute; est&aacute; pronta, s&oacute; falta testar&rdquo;</em>, e depois descobrir que muita coisa precisava ser corrigida &eacute; uma situa&ccedil;&atilde;o comum.</p>\r\n\r\n<p>Postergar o teste do c&oacute;digo &eacute; uma situa&ccedil;&atilde;o recorrente. Pois sem testes e deploy automatizados, o desenvolvedor escreve muito c&oacute;digo antes de colocar o programa para executar, isto acaba levando a um retrabalho desnecess&aacute;rio.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2><strong>Como o deploy funciona</strong></h2>\r\n\r\n<p>Quando falamos de Deploy de uma aplica&ccedil;&atilde;o, geralmente existem duas op&ccedil;&otilde;es: VPS ou PaaS (Platform as a Service). Este artigo ir&aacute; te mostrar como fazer deploy da sua aplica&ccedil;&atilde;o para produ&ccedil;&atilde;o em um servi&ccedil;o PaaS como o&nbsp;<a href=\"https://blog.geekhunter.com.br/heroku/\">Heroku</a>.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3><strong>Passo 1</strong> &ndash; Crie seu projeto</h3>\r\n\r\n<p>Primeiramente, devemos criar uma estrutura simples com alguns arquivos b&aacute;sicos. Para este artigo eu irei criar uma aplica&ccedil;&atilde;o NodeJS.</p>\r\n\r\n<p>Em uma nova pasta voc&ecirc; pode abrir o seu terminal e rodar o comando&nbsp;<em>npm init -y</em>&nbsp;para criar um novo projeto. O servidor ser&aacute; feito com o Express, precisamos rodar o comando&nbsp;<em>npm install express&nbsp;</em>para instalar o m&oacute;dulo.</p>\r\n\r\n<p>Uma vez instalado, escolha seu editor de texto preferido e abra o projeto para criar um novo arquivo chamado app.js. Ent&atilde;o iremos deixar ele da seguinte forma:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>const app = require(&#39;express&#39;)();\r\n\r\nconst PORT = process.env.PORT || 3000;</code></pre>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p><code>app.get(&#39;&#39;, (req, res) =&gt; {<br />\r\n&nbsp; &nbsp; res.send(&ldquo;Hello World&rdquo;);<br />\r\n});</code></p>\r\n\r\n<p><code>app.listen(PORT, () =&gt; {<br />\r\n&nbsp; &nbsp; console.log(`Este app est&aacute; escutando na port ${PORT}`);<br />\r\n});</code></p>\r\n</blockquote>\r\n\r\n<p>N&oacute;s podemos iniciar a aplica&ccedil;&atilde;o localmente executando o comando&nbsp;<em>node app.js</em>&nbsp;no terminal. Depois disso abra seu navegador na URL&nbsp;<em>http://localhost:3000/</em>. Voc&ecirc; poder&aacute; ver a mensagem que voc&ecirc; programou anteriormente &ldquo;Hello World&rdquo; no seu browser.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3><strong>Passo 2</strong> &ndash; Sistema de controle de vers&atilde;o&nbsp;</h3>\r\n\r\n<p>A pr&oacute;xima etapa &eacute; escolher um sistema de controle de vers&atilde;o e colocar nosso c&oacute;digo em uma plataforma de desenvolvimento em um reposit&oacute;rio.</p>\r\n\r\n<p>O sistema de controle de vers&atilde;o mais popular &eacute; o Git junto com o Github como plataforma de desenvolvimento, ent&atilde;o &eacute; isso que usaremos neste tutorial para deploy.</p>\r\n\r\n<p>V&aacute; at&eacute; o GitHub e crie um novo reposit&oacute;rio para seu aplicativo, como este:</p>\r\n\r\n<p><img alt=\"\" src=\"https://lh6.googleusercontent.com/Y5YD0J9JyD1gWyFcjndk8e5-zKDqM_UPWe9LOoovLyBpYiyxm09Bltb8-3Wi1eqiHLxhKrFa4hJ7jIY0qaqniVzQEgA-9jQ5shnrN137mAvGSgzw_zSP57qtp9whGqFNg0zITKGtaH1pzpUPZw\" /></p>\r\n\r\n<p>Para carregar seu c&oacute;digo local em um reposit&oacute;rio, voc&ecirc; precisa executar os comandos listados no Github ap&oacute;s clicar no bot&atilde;o Criar reposit&oacute;rio:</p>\r\n\r\n<p><img alt=\"\" src=\"https://lh6.googleusercontent.com/IORs-O-Mv47MsPP1SwH8uerXd71h2Dw60ezHI4-yj7CZ8dT3fpMQYegjZmwmwZvxJ4FwzFSqUKl9uUwES87TzGFw4CvZdwE8q2cO0mvUNHGQoAyJX_5J74VwnWCaYB9jY2OMh4Wc04espKZa0w\" /></p>\r\n\r\n<p>Antes de fazermos isso, devemos ignorar alguns arquivos. Queremos enviar para o reposit&oacute;rio apenas o c&oacute;digo que escrevemos, sem as depend&ecirc;ncias (os m&oacute;dulos do node instalados).</p>\r\n\r\n<p>Para isso, precisamos criar um novo arquivo chamado&nbsp;<em>.gitignore</em>&nbsp;e dentro dele escrever o arquivo que queremos ignorar na hora de mandar o c&oacute;digo.</p>\r\n\r\n<p><img alt=\"\" src=\"https://lh5.googleusercontent.com/S_INwgqWyFTe67mHVS01CB8UqQpoSHc4Fmz9ylHT6vwhlE3dBJE2RKmzTMJWaO8wGMpnyVaeBsOZSu0Xc6WrkNJ7nSvdyxRW7hFvigYtXu4BxH9XMzcGYGzrm6X1WBUSwjBOZRXLIVM5lMVsjQ\" /></p>\r\n\r\n<p>Agora podemos executar os comandos do GitHub da imagem anterior.</p>\r\n\r\n<p>Se voc&ecirc; executou os comandos corretamente, voc&ecirc; ter&aacute; um novo reposit&oacute;rio com seu projeto. Se voc&ecirc; atualiz&aacute;-lo, dever&aacute; ver seus arquivos, exceto aquele que voc&ecirc; ignorou no passo anterior, ou seja,&nbsp;<em>node_modules</em>.</p>\r\n\r\n<p><img alt=\"\" src=\"https://lh6.googleusercontent.com/ECcTGemqGH_zybXBguvOo8-xE3T1rp0VQGpIOL5Dag3bG1_jDk8UJp_lrhazR_tTAnH4gBg6hBQo9Z4P1VJSGnhMnlwmBBz2WUsn27qJCv3Ya0ACyP9XPqmx3Jkn9JzUsKJO80eIGPKpyNCMYQ\" /></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3><strong>Passo 3</strong> &ndash; Linkar o reposit&oacute;rio com o Heroku</h3>\r\n\r\n<p>Aqui n&oacute;s iremos linkar nosso reposit&oacute;rio do GitHub para nosso Aplica&ccedil;&atilde;o no Heroku.</p>\r\n\r\n<p>Primeiramente crie uma aplica&ccedil;&atilde;o no Heroku e siga os passos da plataforma:</p>\r\n\r\n<p><img alt=\"linkar-repositorio-heroku\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/11/12115423/linkar-repositorio-heroku.png\" /></p>\r\n\r\n<p><img alt=\"criar-novo-app-heroku\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/11/12115415/criar-novo-app-heroku.png\" /></p>\r\n\r\n<p>Agora, se voc&ecirc; olhar a navega&ccedil;&atilde;o na parte superior, ver&aacute; Overview, Resources, Deploy, Metrics e assim por diante. Certifique-se de que Deploy est&aacute; selecionado. Em seguida,, clique no &iacute;cone GitHub e procure pelo reposit&oacute;rio que voc&ecirc; mandou seu c&oacute;digo.</p>\r\n\r\n<p><img alt=\"app-heroku-deploy\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/11/12115402/app-heroku-deploy-1024x535.png\" /></p>\r\n\r\n<p>Assim que o aplicativo no GitHub for conectado com sucesso &agrave; sua conta Heroku, voc&ecirc; pode clicar em Deploy Branch para fazer Deploy do seu aplicativo.</p>\r\n\r\n<p>Se desejar, voc&ecirc; tamb&eacute;m pode selecionar a op&ccedil;&atilde;o Enable Automatic Deploys, isso far&aacute; com que toda vez que voc&ecirc; realizar um push para o reposit&oacute;rio GitHub atualizar&aacute; no Heroku tamb&eacute;m.</p>\r\n\r\n<p><img alt=\"enable-automatic-deploys\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/11/12115355/enable-automatic-deploys-1024x469.png\" /></p>\r\n\r\n<h3>&nbsp;</h3>\r\n\r\n<h3><strong>Passo 4 &ndash;&nbsp;</strong>Configure o Heroku para executar o aplicativo corretamente</h3>\r\n\r\n<p>Se voc&ecirc; abriu sua a aplica&ccedil;&atilde;o, voc&ecirc; deve ter visto uma tela como esta:</p>\r\n\r\n<p><img alt=\"configure-heroku\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/11/12115428/configure-heroku.png\" /></p>\r\n\r\n<p>Isso acontece porque o Heroku n&atilde;o sabe como iniciar a aplica&ccedil;&atilde;o.</p>\r\n\r\n<p>Em alguns passos anteriores executamos o comando&nbsp;<em>node app.js&nbsp;</em>para iniciar a aplica&ccedil;&atilde;o localmente. A app Heroku n&atilde;o tem como saber que &eacute; necess&aacute;rio executar este comando para iniciar a aplica&ccedil;&atilde;o e por isso acontece o erro&nbsp;</p>\r\n\r\n<p>Para resolver este problema, devemos criar um novo arquivo denominado Procfile com o seguinte conte&uacute;do:&nbsp;<em>web: node ./app.js</em>.</p>\r\n\r\n<p>Dessa forma, para atualizar nosso aplicativo, tudo o que precisamos fazer &eacute; enviar um novo commit ao GitHub. Se habilitarmos a op&ccedil;&atilde;o Automatic Deploys, o c&oacute;digo far&aacute; automaticamente um novo push para o Heroku. Caso contr&aacute;rio, precisamos clicar em Deploy Branch novamente.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Concluindo o processo de deploy</h2>\r\n\r\n<p>O Heroku, assim como outros servi&ccedil;os similares, permite que os desenvolvedores fa&ccedil;am Deploy de forma r&aacute;pida e quase sem trabalho de um aplicativo em um servidor web.&nbsp;</p>\r\n\r\n<p>Ele tamb&eacute;m fornece plugins que voc&ecirc; pode integrar na sua aplica&ccedil;&atilde;o para facilitar a sua&nbsp; entrega do produto.</p>\r\n\r\n<p>Por fim, este tipo de solu&ccedil;&atilde;o PaaS sempre vai nos permitir ter menos trabalho do que configurar uma VPS onde teriamos que realizar a configura&ccedil;&atilde;o de um ambiente completo para o mesmo acontecer.</p>\r\n\r\n<p>E voc&ecirc;, j&aacute; conhecia o processo de deploy de uma aplica&ccedil;&atilde;o? Deixa um coment&aacute;rio falando sobre como voc&ecirc; executa essa fun&ccedil;&atilde;o no seu projeto!</p>\r\n\r\n<p>&nbsp;</p>\r\n',1,'2020-11-22 00:04:36','2020-11-22 00:10:06'),(6,1,2,'o-que-e-como-fazer-recurs-o-com-a-linguagem-elixir','O que Ã© e como fazer RecursÃ£o com a Linguagem Elixir','0_ahZBVx3Z1eJRXDv1.png','<p>Entenda de uma vez por todas sobre&nbsp;<strong>o que &eacute; Elixir</strong>&nbsp;e como fazer o processo de recurs&atilde;o por meio desta linguagem inventada por programadores brasileiros.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>O que &eacute; Recurs&atilde;o</h2>\r\n\r\n<p>Recurs&atilde;o &eacute; um m&eacute;todo de resolu&ccedil;&atilde;o de problemas capaz de quebrar um problema em problemas menores e menores at&eacute; virar pequeno o suficiente para que ele possa ser resolvido sem problemas.</p>\r\n\r\n<p>S&atilde;o exemplos de recurs&atilde;o um script que conta numericamente, um blog que lista not&iacute;cias por categoria, um programa que analisa cada linha de um arquivo CSV.</p>\r\n\r\n<p>Todos eles tem tarefas repetitivas para determinar o resultado final.&nbsp;<strong>A recurs&atilde;o &eacute; o principal princ&iacute;pio em repeti&ccedil;&otilde;es na programa&ccedil;&atilde;o funcional</strong>.</p>\r\n\r\n<p>Antes de continuar falando sobre recurs&atilde;o, caso n&atilde;o saiba, vamos dar uma breve passada sobre a linguagem Elixir.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>O que &eacute; a linguagem Elixir</h2>\r\n\r\n<p><strong>Elixir &eacute; uma linguagem multi-paradigma, e &eacute; considerada uma linguagem de programa&ccedil;&atilde;o funcional, distribu&iacute;da e orientada a processos.</strong></p>\r\n\r\n<p>Criada em 2012 pela Plataformatec, a linguagem Elixir teve sua primeira vers&atilde;o lan&ccedil;ada em 2014. A linguagem &eacute; de c&oacute;digo aberto e executada na M&aacute;quina Virtual Erlang (Erlang VM), cujo principal objetivo &eacute; oferecer uma programa&ccedil;&atilde;o produtiva para aplica&ccedil;&otilde;es distribu&iacute;das seguras e de f&aacute;cil manuten&ccedil;&atilde;o.</p>\r\n\r\n<p>Quanto ao desenvolvimento da linguagem Elixir, o principal incentivo para o projeto foi a&nbsp;<strong>necessidade de ferramentas produtivas que permitissem a solu&ccedil;&atilde;o de problemas de concorr&ecirc;ncia</strong>.</p>\r\n\r\n<p>O criador Jos&eacute; Valim atuava na elabora&ccedil;&atilde;o de melhorias de performance para Rails, e sua equipe trabalhava com sistemas multi-cores cada vez mais complexos. Por&eacute;m, a falta de ferramentas adequadas em Ruby para lidar com esse tipo de problema causou muita frustra&ccedil;&atilde;o &agrave; equipe.</p>\r\n\r\n<p>Eventualmente, a necessidade levou a equipe &agrave; utiliza&ccedil;&atilde;o da linguagem Erlang que apresenta ferramentas de suporte a aplica&ccedil;&otilde;es distribu&iacute;das.</p>\r\n\r\n<p>Entretanto, um dos problemas enfrentados por ele nesse novo cen&aacute;rio foi a falta de alguns recursos, que s&atilde;o encontrados em outras linguagens. Essa car&ecirc;ncia foi determinante para o in&iacute;cio do desenvolvimento da linguagem Elixir.</p>\r\n\r\n<h3>Como funciona a linguagem Elixir</h3>\r\n\r\n<p>A linguagem Elixir possui um terminal interativo chamado IEx (Elixir&rsquo;s Interactive Shell), que executa c&oacute;digos, comandos e fun&ccedil;&otilde;es em tempo real, facilitando a depura&ccedil;&atilde;o de c&oacute;digo e o aprendizado da linguagem.</p>\r\n\r\n<p>Um dos grandes pontos altos da linguagem Elixir &eacute; o Polimorfismo, que consiste na capacidade de assumir diferentes formas. Isso fez com que a linguagem se tornasse extens&iacute;vel, ou seja, &eacute; poss&iacute;vel adicionar novas funcionalidades sempre que necess&aacute;rio. Isso faz com que aumente a produtividade do desenvolvedor e a adaptabilidade &agrave; linguagem.</p>\r\n\r\n<p>A linguagem Elixir traz uma nova forma de lidar com solu&ccedil;&otilde;es de aplica&ccedil;&otilde;es distribu&iacute;das, apresentando ferramentas que colaboram tanto no desenvolvimento quanto na manuten&ccedil;&atilde;o dessas solu&ccedil;&otilde;es.</p>\r\n\r\n<h3>Principais frameworks da linguagem Elixir</h3>\r\n\r\n<p>A linguagem Elixir &eacute; adapt&aacute;vel, pode ser utilizada desde uma aplica&ccedil;&atilde;o web at&eacute; em um sistema embarcado. Tem um grande ecossistema e boas ferramentas para facilitar a vida dos desenvolvedores.</p>\r\n\r\n<p>Alguns dos principais frameworks da linguagem Elixir s&atilde;o:</p>\r\n\r\n<ul>\r\n	<li><strong>Phoenix:</strong>&nbsp;Permite criar aplicativos interativos na web rapidamente. Pode ser utilizado, portanto, para o desenvolvimento web, de APIs e aplicativos HTML5;</li>\r\n	<li><strong>Nerves:</strong>&nbsp;Trata-se da plataforma e infraestrutura de c&oacute;digo aberto que permite criar, implantar e gerenciar dispositivos IoT com total seguran&ccedil;a, velocidade e em escala. Tamb&eacute;m serve para Embedded;</li>\r\n	<li><strong>Plug:</strong>&nbsp;Destinado para aplica&ccedil;&otilde;es na web;</li>\r\n	<li><strong>Sugar:</strong>&nbsp;Muito utilizado para desenvolvimento web, garantindo rapidez, facilidade e efic&aacute;cia ao projeto.</li>\r\n</ul>\r\n\r\n<p>Com a linguagem Elixir foram criadas grandes plataformas, como:&nbsp;<strong>Whatsapp</strong>,&nbsp;<strong>Discord</strong>&nbsp;e&nbsp;<strong>Pinterest</strong>.</p>\r\n\r\n<p>Agora que voc&ecirc; j&aacute; sabe o que &eacute;, como funciona e principais plataformas que usam a linguagem Elixir, voltemos a falar das recurs&otilde;es.</p>\r\n\r\n<h2>Como fazer recurs&atilde;o com a linguagem Elixir</h2>\r\n\r\n<p>Em linguagens imperativas, a repeti&ccedil;&atilde;o &eacute; feita com estruturas de repeti&ccedil;&otilde;es como for e while, que dependem de estado mut&aacute;vel. Em programa&ccedil;&atilde;o funcional temos estado imut&aacute;vel ent&atilde;o &eacute; usado uma abordagem diferente. Aqui usamos fun&ccedil;&otilde;es recursivas.</p>\r\n\r\n<p>Uma fun&ccedil;&atilde;o recursiva &eacute; quando uma fun&ccedil;&atilde;o chama a si mesma, lidando com chamadas sucessivas da mesma fun&ccedil;&atilde;o. Vamos dar uma olhada em estrat&eacute;gias que funcionam com recurs&atilde;o em programa&ccedil;&atilde;o funcional, entender como evitar armadilhas comuns de desempenho e processamento infinito.</p>\r\n\r\n<h3>Bounded recursion</h3>\r\n\r\n<p>Bounded recursion &eacute; o tipo de fun&ccedil;&atilde;o recursiva no qual as chamadas sucessivas para si t&ecirc;m um fim. &Eacute; o tipo mais comum de fun&ccedil;&atilde;o recursiva.</p>\r\n\r\n<p>O n&uacute;mero de repeti&ccedil;&otilde;es de uma bounded recursion est&aacute; diretamente associado aos argumentos que ela recebe. Podemos ver como ele funciona criando um programa que soma todos os n&uacute;meros inteiros de 0 a um n&uacute;mero parametrizado.</p>\r\n\r\n<p>Por exemplo, se passarmos o n&uacute;mero&nbsp;<strong>3</strong>, o programa gerar&aacute; a soma&nbsp;<strong>3 + 2 + 1 + 0</strong>. Ele deve repetir a tarefa de adicionar o n&uacute;mero resultante e decrementar o n&uacute;mero fornecido por 1 at&eacute; que o n&uacute;mero especificado atinja&nbsp;<strong>0</strong>.</p>\r\n\r\n<p>Se passar um n&uacute;mero maior, o n&uacute;mero de repeti&ccedil;&otilde;es aumenta. Vamos criar isso com o m&oacute;dulo&nbsp;<strong>Sum</strong>:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defmodule Sum do\r\n  def up_to(0), do: 0\r\n  def up_to(n), do: n + up_to(n - 1)\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>E vamos execut&aacute;-lo usando o IEx:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>iex&gt; c(&quot;sum.ex&quot;)\r\niex&gt; Sum.up_to(10)\r\n55</code></pre>\r\n</blockquote>\r\n\r\n<p>Criamos duas cl&aacute;usulas de fun&ccedil;&atilde;o para a fun&ccedil;&atilde;o up_to/1. A primeira cl&aacute;usula &eacute; executada quando o argumento corresponde a 0 e o n&uacute;mero 0&eacute; retornado. Nada mais!</p>\r\n\r\n<p>&Eacute; nossa condi&ccedil;&atilde;o de parada e o valor retornado &eacute; o &uacute;ltimo passo de uma s&eacute;rie de repeti&ccedil;&otilde;es. A outra cl&aacute;usula &eacute; a express&atilde;o que ser&aacute; repetida. Vamos ver como isso funciona passo a passo:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>up_to(10)\r\n= 10 + up_to(9)\r\n= 10 + 9 + up_to(8)\r\n= 10 + 9 + 8 + up_to(7)\r\n= 10 + 9 + 8 + 7 + up_to(6)\r\n= 10 + 9 + 8 + 7 + 6 + up_to(5)\r\n= 10 + 9 + 8 + 7 + 6 + 5 + up_to(4)\r\n= 10 + 9 + 8 + 7 + 6 + 5 + 4 + up_to(3)\r\n= 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + up_to(2)\r\n= 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + up_to(1)\r\n= 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + up_to(0)\r\n= 55</code></pre>\r\n</blockquote>\r\n\r\n<p>Como voc&ecirc; pode ver, a recurs&atilde;o realiza muitas chamadas de fun&ccedil;&atilde;o e pode causar gargalos de desempenho.</p>\r\n\r\n<p>Na pr&oacute;xima se&ccedil;&atilde;o, voc&ecirc; aprender&aacute; como criar fun&ccedil;&otilde;es recursivas que usam os recursos da sua m&aacute;quina com prud&ecirc;ncia.</p>\r\n\r\n<h3>Tail-recursion</h3>\r\n\r\n<p>Toda vez que chamamos uma fun&ccedil;&atilde;o, ela consome mem&oacute;ria. Normalmente, n&atilde;o precisamos nos preocupar muito com isso &ndash; as m&aacute;quinas hoje t&ecirc;m muita mem&oacute;ria e a Erlang VM faz um &oacute;timo trabalho mantendo os custos de computa&ccedil;&atilde;o baixos para uma quantidade decente de dados.</p>\r\n\r\n<p>Mas quando alguma entrada faz com que nossa fun&ccedil;&atilde;o fa&ccedil;a milh&otilde;es de chamadas recursivas, isso consome mem&oacute;ria significativa. N&oacute;s podemos utilizar tail-recursion para ajudar em problemas como este.</p>\r\n\r\n<p>Tail-recursion &eacute; quando o compilador reduz fun&ccedil;&otilde;es na mem&oacute;ria sem alocar mais mem&oacute;ria. &Eacute; um recurso comum do compilador em linguagens de programa&ccedil;&atilde;o funcional. Para us&aacute;-lo, precisamos garantir que a &uacute;ltima express&atilde;o de nossa fun&ccedil;&atilde;o seja uma chamada de fun&ccedil;&atilde;o.</p>\r\n\r\n<p>Se a &uacute;ltima express&atilde;o for uma nova chamada de fun&ccedil;&atilde;o, o retorno da fun&ccedil;&atilde;o atual ser&aacute; o retorno da nova chamada de fun&ccedil;&atilde;o e ela n&atilde;o precisar&aacute; manter a fun&ccedil;&atilde;o atual na mem&oacute;ria. Considere este exemplo:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defmodule TRFactorial do\r\n  def of(n), do: factorial_of(n, 1)\r\n  defp factorial_of(0, acc), do: acc\r\n  defp factorial_of(n, acc) when n &gt; 0, do: factorial_of(n - 1, n * acc)\r\nend</code>\r\n</pre>\r\n</blockquote>\r\n\r\n<p>Criamos uma fun&ccedil;&atilde;o auxiliar&nbsp;<strong>fatorial_of&nbsp;</strong>que ter&aacute; um argumento extra para acumular as multiplica&ccedil;&otilde;es. O argumento&nbsp;<strong>acc&nbsp;</strong>tem o resultado da itera&ccedil;&atilde;o anterior. Quando fazemos a chamada recursiva, passamos o resultado com a express&atilde;o&nbsp;<strong>acc * n</strong>.</p>\r\n\r\n<p>A &uacute;ltima express&atilde;o &eacute; uma chamada recursiva, n&atilde;o uma chamada para o operador&nbsp;<strong>*</strong>. Podemos tentar usar na sess&atilde;o&nbsp;<strong>IEx&nbsp;</strong>e medir o consumo de mem&oacute;ria. Esteja pronto para interromper a execu&ccedil;&atilde;o, porque mesmo com a otimiza&ccedil;&atilde;o de mem&oacute;ria levar&aacute; muito tempo para concluir.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>iex&gt; c(&quot;tr_factorial.ex&quot;)\r\niex&gt; TRFactorial.of(10_000_000)</code></pre>\r\n</blockquote>\r\n\r\n<p>Para criarmos uma base s&oacute;lida sobre este assunto vamos fazer uma compara&ccedil;&atilde;o sobre<em>&nbsp;tail-recursion&nbsp;</em>e&nbsp;<em>body-recursion</em>&nbsp;com o mesmo tema, Fatorial.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defmodule Factorial do\r\n  def of(0), do: 1\r\n  def of(n) when n &gt; 0, do: n * of(n - 1)\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>Temos uma chamada recursiva na &uacute;ltima linha, mas a &uacute;ltima express&atilde;o &eacute; uma chamada para o operador&nbsp;<strong>*</strong>. O Elixir executar&aacute; a chamada de&nbsp;<strong>(n &ndash; 1)&nbsp;</strong>e usar&aacute; o resultado para calcular a express&atilde;o&nbsp;<strong>n *</strong>. Essa fun&ccedil;&atilde;o &eacute; uma<em>&nbsp;body-recursion&nbsp;</em>na qual a &uacute;ltima express&atilde;o n&atilde;o &eacute; uma chamada recursiva.</p>\r\n\r\n<h3>Unbounded recursion</h3>\r\n\r\n<p>Unbounded recursion &eacute; quando n&atilde;o podemos prever o n&uacute;mero de repeti&ccedil;&otilde;es para uma fun&ccedil;&atilde;o recursiva.</p>\r\n\r\n<p>Por exemplo, &eacute; dif&iacute;cil prever quantas itera&ccedil;&otilde;es um crawler, que navega e baixa p&aacute;ginas da Web ter&aacute;. Para cada p&aacute;gina que ele navega, ele encontra novos links para rastrear. Como n&atilde;o somos o dono das p&aacute;ginas, n&atilde;o podemos prever quantos links cada p&aacute;gina ter&aacute;.</p>\r\n\r\n<p>Vamos simplificar um&nbsp;<em>web crawler</em>&nbsp;que printa e navega em um determinado diret&oacute;rio:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defmodule Navigator\r\n  def navigate(dir) do\r\n    expanded_dir = Path.expand(dir)\r\n    go_through([expanded_dir])\r\n  end\r\n\r\n  defp go_through([]), do: nil\r\n  defp go_through([content | rest]) do\r\n    print_and_navigate(content, File.dir?(content)\r\n    go_through(rest)\r\n  end\r\n\r\n  defp print_and_navigate(_dir, false), do: nil\r\n  defp print_and_navigate(dir, true) do\r\n    IO.puts dir\r\n    children_dirs = File.ls!(dir)\r\n    go_through(expand_dirs(children_dirs, dir))\r\n  end\r\n\r\n  defp expand_dirs([], _relative_to), do: []\r\n  defp expand_dirs([dir | dirs], relative_to) do\r\n    expanded_dir = Path.expand(dir, relative_to)\r\n    [expanded_dir | expand_dirs(dirs, relative_to)\r\n  end\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>Podemos usar na sess&atilde;o<em>&nbsp;IEx</em>. Esteja pronto para interromper a execu&ccedil;&atilde;o caso esteja usando em um caminho relativo onde tenha muitos diret&oacute;rios pode levar muito tempo para concluir.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>iex&gt; c(&quot;navigator.ex&quot;) \r\niex&gt; Navigator.navigate(&quot;../..&quot;)</code></pre>\r\n</blockquote>\r\n\r\n<p>N&atilde;o sabemos aonde a recurs&atilde;o vai parar. Para criar fun&ccedil;&otilde;es mais previs&iacute;veis vamos criar um c&oacute;digo para reduzir o n&uacute;mero de itera&ccedil;&otilde;es.</p>\r\n\r\n<h3>Adicionando limites!</h3>\r\n\r\n<p>Adicionaremos uma restri&ccedil;&atilde;o de profundidade que sinalizar&aacute; quantos diret&oacute;rios filhos mais aprofundados queremos mergulhar no diret&oacute;rio especificado. Primeiro, precisamos armazenar um valor indicando o qu&atilde;o profundo podemos mergulhar.</p>\r\n\r\n<p>Vamos criar um&nbsp;<em>module attribute</em>&nbsp;para isso:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>@max_depth 10\r\n</code></pre>\r\n</blockquote>\r\n\r\n<p>Agora podemos iniciar nossa navega&ccedil;&atilde;o com um valor inicial na nossa fun&ccedil;&atilde;o&nbsp;<em>navigate.</em></p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>def navigate(dir) do\r\n  expanded_dir = Path.expand(dir)\r\n  go_through([expanded_dir], 0)\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>Agora precisamos mudar nossa fun&ccedil;&atilde;o&nbsp;<em>print_and_navigate</em>&nbsp;para aceitar um terceiro argumento.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defp print_and_navigate(_dir, false, _current_depth), do: nil\r\ndefp print_and_navigate(dir, true, current_depth) do\r\n  IO.puts dir\r\n  children_dirs = File.ls!(dir)\r\n  go_through(expand_dirs(children_dirs, dir), current_depth + 1)\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>Agora vem as codi&ccedil;&otilde;es.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>defp go_through([], _current_depth), do: nil\r\ndefp go_through(_dirs, current_depth) when current_depth &gt; @max_depth, do: nil\r\ndefp go_through([content | rest], current_depth) do\r\n  print_and_navigate(content, File.dir?(content), current_path)\r\n  go_through(rest, current_depth)\r\nend</code></pre>\r\n</blockquote>\r\n\r\n<p>E &eacute; isso a&iacute;! Adicionamos uma restri&ccedil;&atilde;o para controlar o n&uacute;mero de repeti&ccedil;&otilde;es para a fun&ccedil;&atilde;o recursiva.</p>\r\n\r\n<h3>Recurs&atilde;o com func&otilde;es an&ocirc;nimas</h3>\r\n\r\n<p>No mundo das fun&ccedil;&otilde;es an&ocirc;nimas a recurs&atilde;o n&atilde;o &eacute; t&atilde;o f&aacute;cil. Enfrentamos problemas na defini&ccedil;&atilde;o das fun&ccedil;&otilde;es an&ocirc;nimas. Vamos ver os problemas na pr&aacute;tica, criando o exemplo fatorial:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>iex&gt; factorial = fn\r\n0 -&gt; 1\r\nx when x &gt; 0 -&gt; x * factorial.(x - 1)\r\nend\r\n** (CompileError) iex:3: undefined function factorial/0</code></pre>\r\n</blockquote>\r\n\r\n<p>N&atilde;o podemos fazer uma chamada recursiva para a fun&ccedil;&atilde;o fatorial porque essa vari&aacute;vel ainda n&atilde;o foi criada. Para us&aacute;-lo, precisamos que ele tenha sido criado anteriormente.</p>\r\n\r\n<p>Podemos resolver esse problema envolvendo a fun&ccedil;&atilde;o em outra fun&ccedil;&atilde;o e atrasando a execu&ccedil;&atilde;o recursiva da chamada.</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>iex&gt; fact_gen = fn me -&gt;\r\nfn\r\n0 -&gt; 1\r\nx when x &gt; 0 -&gt; x * me.(me).(x - 1)\r\nend\r\nend\r\niex&gt; factorial = fact_gen.(fact_gen)\r\niex&gt; factorial.(5)\r\n120\r\niex&gt; factorial.(10)\r\n3628800</code></pre>\r\n</blockquote>\r\n\r\n<p>Funciona!</p>\r\n\r\n<p>E podemos usar&nbsp;<em>function capturing</em>&nbsp;para ter um c&oacute;digo mais declarativo. O problema aqui &eacute; que&nbsp;<em>me.(me)</em>&nbsp;n&atilde;o &eacute; expressivo. C&oacute;digo deve ser expressivo para ser de f&aacute;cil manuten&ccedil;&atilde;o. A recurs&atilde;o com fun&ccedil;&otilde;es an&ocirc;nimas n&atilde;o &eacute; simples, mas &eacute; poss&iacute;vel.</p>\r\n\r\n<p>Demos uma olhada nas fun&ccedil;&otilde;es recursivas, que &eacute; o principal princ&iacute;pio da repeti&ccedil;&atilde;o na programa&ccedil;&atilde;o funcional.&nbsp;<strong>A recurs&atilde;o &eacute; um importante assunto</strong>.</p>\r\n\r\n<p>Apesar de a recurs&atilde;o ser uma t&eacute;cnica poderosa, us&aacute;-la para todo o c&oacute;digo que precisa repetir tarefas requer muitas defini&ccedil;&otilde;es de fun&ccedil;&atilde;o. Com esse c&oacute;digo extra, &eacute; f&aacute;cil cometer um erro, como esquecer uma condi&ccedil;&atilde;o de parada, que pode resultar em um loop infinito.</p>\r\n\r\n<p>Podemos melhorar o c&oacute;digo recursivo usando abstra&ccedil;&otilde;es poderosas criadas com&nbsp;<em>high-order functions</em>. Este ser&aacute; o pr&oacute;ximo assunto que vou abordar. At&eacute; breve!</p>\r\n',1,'2020-11-22 00:14:07',NULL),(7,1,3,'desenvolvimento-gil-o-que-d-para-ser-criativo-durante-o-processo-','Desenvolvimento Ãgil: o que Ã©? DÃ¡ para ser criativo durante o processo?','nota-pegajosa-post-it-board-office_53876-60870.jpg','<p>As metodologias atualmente conhecidas como&nbsp;<a href=\"https://blog.geekhunter.com.br/tudo-que-voce-precisa-saber-sobre-agile-scrum-e-kanban/\" target=\"_blank\">Agile</a>&nbsp;surgiram em meados dos anos 2000, como um conjunto de melhores pr&aacute;ticas compilados em forma de manifesto, o famoso Manifesto &Aacute;gil, por participantes de equipes respons&aacute;veis por desenvolvimento de softwares.</p>\r\n\r\n<p>Saiba&nbsp;<a href=\"https://blog.geekhunter.com.br/manifesto-agil/\" target=\"_blank\">quando foi criado o Manifesto &Aacute;gil</a>&nbsp;e quais os 12 princ&iacute;pios do manifesto.</p>\r\n\r\n<p>Foi uma cr&iacute;tica ao formato de execu&ccedil;&atilde;o do desenvolvimento realizado com as metodologias mais disseminadas como&nbsp;<a href=\"https://blog.geekhunter.com.br/desenvolvimento-agil-bduf/\" target=\"_blank\">BDUF</a>, por exemplo, principalmente pelos fatores burocratiza&ccedil;&atilde;o de processos e tempo gasto.</p>\r\n\r\n<h2>O que &eacute; o Desenvolvimento &Aacute;gil de software?</h2>\r\n\r\n<p>O desenvolvimento &aacute;gil de software vai al&eacute;m de metodologias como Scrum, Extreme Programming ou Feature-Driven Development.</p>\r\n\r\n<p>O desenvolvimento &aacute;gil de software s&atilde;o pr&aacute;ticas de execu&ccedil;&atilde;o de projetos como programa&ccedil;&atilde;o em pares, desenvolvimento orientado a testes, sess&otilde;es de planejamento e sprints.</p>\r\n\r\n<p>Dessa forma, para alguns, especialmente os n&atilde;o desenvolvedores, desenvolvimento &aacute;gil &eacute; um termo gen&eacute;rico expressado n&atilde;o apenas por frameworks disseminados pelo Mercado.</p>\r\n\r\n<p>Podemos afirmar que seja uma pr&aacute;tica baseada nos valores e princ&iacute;pios expressos no j&aacute; citado manifesto para desenvolvimento &aacute;gil de software e nos 12 princ&iacute;pios por tr&aacute;s dele.</p>\r\n\r\n<h2>E o que &eacute; uma Metodologia &Aacute;gil?</h2>\r\n\r\n<p>&Eacute; uma disciplina que estuda um conjunto de comportamentos, processos, pr&aacute;ticas e ferramentas utilizados para a cria&ccedil;&atilde;o de produtos e sua disponibiliza&ccedil;&atilde;o para os usu&aacute;rios finais.</p>\r\n\r\n<p>Podemos afirmar que o desenvolvimento &aacute;gil vai de encontro &agrave; transi&ccedil;&atilde;o dos produtos digitais durante o s&eacute;c. XIX para o s&eacute;c. XX, onde a ergonomia &ndash; ou design centrado no usu&aacute;rio &ndash; passa a ser um fator integrante dos processos que englobam o desenvolvimento de sistemas.</p>\r\n\r\n<p>Assim, as mudan&ccedil;as estruturais de equipes podem impactar diretamente em maior n&uacute;mero de tarefas e portanto mais discuss&otilde;es.</p>\r\n\r\n<p>Por isso, quando integrantes atuantes em camadas diferentes do desenvolvimento n&atilde;o utilizam um processo de trabalho em comum, como uma metodologia, o impacto se reflete diretamente na qualidade da entrega.</p>\r\n\r\n<p>Dessa maneira, v&aacute;rias metodologias que vigoravam foram revistas surgindo o que chamamos de frameworks &aacute;geis, ou seja, sistemas de planejamento fechados.</p>\r\n\r\n<p>Estes s&atilde;o adotados e adaptados pelos praticantes dos times, onde as recomenda&ccedil;&otilde;es gerais podem ser ajustadas de acordo com o que s&atilde;o considerados os objetivos das entregas durante o projeto que entregam valor ao cliente.</p>\r\n\r\n<p>Confira&nbsp;<a href=\"https://blog.geekhunter.com.br/manifesto-agil/\" target=\"_blank\">quando surgiu a metodologia &aacute;gil</a>.</p>\r\n\r\n<h2>Qual o grande diferencial do Desenvolvimento &Aacute;gil?</h2>\r\n\r\n<p>Uma coisa que separa o Agile de outras abordagens para o desenvolvimento de software &eacute; o<strong>&nbsp;foco nas pessoas</strong>&nbsp;trabalhando de forma unida.</p>\r\n\r\n<p>As solu&ccedil;&otilde;es evoluem atrav&eacute;s da colabora&ccedil;&atilde;o entre equipes multidisciplinares com pap&eacute;is claros que as possibilitam utilizar determinadas pr&aacute;ticas e ferramentas no seu dia a dia.</p>\r\n\r\n<h2>Os Squads e a mudan&ccedil;a nas equipes</h2>\r\n\r\n<p>O conceito de frameworks e metodologias &aacute;geis ajuda a explicar sobre a mudan&ccedil;a estrutural das equipes de desenvolvimento, que passaram a ser mais enxutas, e cada vez mais diversas, englobando tarefas relacionados ao estudo do comportamento dos usu&aacute;rios.</p>\r\n\r\n<p>Assim, n&atilde;o desenvolvedores passam a ter pap&eacute;is e objetivos t&atilde;o importantes em formato de lideran&ccedil;as focadas por expertises como jornalistas, designers de intera&ccedil;&atilde;o, pesquisadores, entre outros.</p>\r\n\r\n<p>Com isso, emergem os l&iacute;deres que t&ecirc;m em comum uma habilidade t&eacute;cnica que os possibilita transitar entre os programadores e desenvolvedores, &aacute;s vezes liderando pequenos times multifuncionais, ou o que em algumas empresas s&atilde;o conhecidos por &ldquo;squads&rdquo;.</p>\r\n\r\n<h2>O atual cen&aacute;rio das equipes</h2>\r\n\r\n<p>Atualmente, o gerente de projetos, coordenador de planejamento ou scrum master, tamb&eacute;m se estabelecem nas figuras do L&iacute;der T&eacute;cnico, Lead Design e Product Owner.</p>\r\n\r\n<p>Cada um deles respons&aacute;vel por parte do planejamento estrat&eacute;gico concernente aos KPI&rsquo;s de neg&oacute;cio, que dever&atilde;o ser atingidos durante a entrega de cada etapa ou ciclo do desenvolvimento &aacute;gil.</p>\r\n\r\n<p>Nesse cen&aacute;rio, uma &aacute;rea ou diretoria pode adotar diversos &ldquo;frameworks&rdquo; ou &ldquo;metodologias &aacute;geis&rdquo; e entregar produtos de forma mais r&aacute;pida.</p>\r\n\r\n<p>Isso, alinhando o sistemas adotados entre as atividades nos n&iacute;veis de equipes, times, &aacute;reas de forma estruturada, onde existe uma atua&ccedil;&atilde;o em n&iacute;vel de &aacute;rea de conhecimento horizontalizada e em n&iacute;vel de projeto de forma verticalizada.</p>\r\n\r\n<p>&Eacute; o caso de muitas startups, empresas e consultorias de tecnologia que t&ecirc;m em comum a pr&aacute;tico dos valores do desenvolvimento &aacute;gil, onde se pode adotar em um mesmo ecossistema o Design Sprint, o Scrum, Lean, XP.</p>\r\n\r\n<p>Nesse contexto o ponto em comum entre os integrantes dos times s&atilde;o as entregas focadas ciclos predeterminados de tempo, onde a principal entrega de valor &eacute; a qualidade durante o processo pela constante intera&ccedil;&atilde;o entre pessoas em espa&ccedil;os curtos de tempo.</p>\r\n\r\n<h2>Quais s&atilde;o os pontos-chave do&nbsp;<a href=\"https://blog.geekhunter.com.br/manifesto-agil/\" target=\"_blank\">Manifesto &Aacute;gil</a>&nbsp;para o momento atual?</h2>\r\n\r\n<p>Os principais pontos para o atual momento, podemos considerar que s&atilde;o:</p>\r\n\r\n<ul>\r\n	<li>Indiv&iacute;duos e intera&ccedil;&otilde;es mais que processos e ferramenta;</li>\r\n	<li>Software em funcionamento mais que documenta&ccedil;&atilde;o abrangente;</li>\r\n	<li>Colabora&ccedil;&atilde;o com o cliente mais que negocia&ccedil;&atilde;o de contratos;</li>\r\n	<li>Responder a mudan&ccedil;as mais que seguir um plano.</li>\r\n</ul>\r\n\r\n<p>Assim, n&atilde;o apenas a forma de trabalho v&ecirc;m sendo alterada e conhecida pelo termo &Aacute;gil, mas algumas das compet&ecirc;ncias influenciam na montagem de equipes de trabalho.</p>\r\n\r\n<p>S&atilde;o fatores como flexibilidade para lidar com as constantes mudan&ccedil;as de cada ciclo de desenvolvimento, resili&ecirc;ncia para aceitar pontos que s&atilde;o premissas ou requisitos de neg&oacute;cio e t&eacute;cnicos, assim como capacidade de empatia, para melhor entender e se comunicar com os clientes e membros do seu time.</p>\r\n\r\n<h2>Existe espa&ccedil;o para a criatividade com o Desenvolvimento &Aacute;gil?</h2>\r\n\r\n<p>Um ponto que gostaria de comentar durante o fechamento do texto:<br />\r\n&ldquo;Existe espa&ccedil;o para exercer a criatividade em um ambiente &Aacute;gil?&rdquo;</p>\r\n\r\n<p>Talvez por isso, a experimenta&ccedil;&atilde;o e a experi&ecirc;ncia durante esses ambientes, sejam pontos que podem maximizar o sucesso na entrega final.</p>\r\n\r\n<p>Assim, o entendimento do escopo do projeto, ou seja, ou o &ldquo;norte do projeto&rdquo; &eacute; essencial a todos, pois apenas assim &eacute; clara a percpe&ccedil;&atilde;o do tamanho de cada a&ccedil;&atilde;o de forma do que deve ser mantido, o que pode ser mudado e o que talvez seja um ponto a ser flexibilizado ou de mudan&ccedil;a.</p>\r\n\r\n<p>Ent&atilde;o exercer a autonomia de forma criativa, passa a ser um desafio que s&oacute; pode ser atingido atrav&eacute;s da capacidade de contribui&ccedil;&atilde;o pela sua expertise aliada &agrave; execu&ccedil;&atilde;o t&eacute;cnica no n&iacute;vel da excel&ecirc;ncia.</p>\r\n\r\n<p>Isso, principalmente no desenvolvimento de servi&ccedil;os que s&atilde;o cada vez mais automatizados, onde a mudan&ccedil;a e inova&ccedil;&atilde;o disruptiva s&oacute; se d&aacute; pela objetividade, em termos de potencializa&ccedil;&atilde;o da assertividade em termos de valor aos usu&aacute;rios.</p>\r\n\r\n<p>Portanto, ser criativo requer mais equil&iacute;brio do que excel&ecirc;ncia t&eacute;cnica ou art&iacute;stica.</p>\r\n\r\n<p>Durante um cen&aacute;rio atual, de pandemia do COVID, poucas empresas em curto, m&eacute;dio e longo prazo ir&atilde;o dispender de recursos extras para verificar a aplicabilidade em termos de receita de determinada &ldquo;inova&ccedil;&atilde;o&rdquo;, por isso, talvez ambientes &aacute;geis se tornem cada vez mais uma premissa para que a inova&ccedil;&atilde;o aconte&ccedil;a.</p>\r\n',1,'2020-11-22 00:30:57','2020-11-22 00:33:00'),(8,1,3,'metodologia-scrum-o-b-sico-que-todo-dev-precisa-saber','Metodologia Scrum: o bÃ¡sico que todo DEV precisa saber','Base-imagem-destacada-blog-768x528.png','<p>A metodologia scrum foi criada por&nbsp;<a href=\"https://en.wikipedia.org/wiki/Jeff_Sutherland\" target=\"_blank\"><strong>Jeff Sutherland</strong></a>, piloto norte americano da aeron&aacute;utica. Para Jeff, jamais existir&aacute; uma f&oacute;rmula fixa para se fazer o que se faz, mesmo que a mesma coisa j&aacute; seja executada h&aacute; muitos anos.</p>\r\n\r\n<p>E isso &eacute; fato: todo projeto tem seus ajustes, mesmo que esse projeto seja algo extremamente simples, como a produ&ccedil;&atilde;o de um copo.</p>\r\n\r\n<p>Se a demanda por copos aumenta, algo precisa ser revisto em seu ciclo produtivo, e &eacute; justamente a&iacute; que o m&eacute;todo scrum entrada.</p>\r\n\r\n<p>Com o passar do tempo, o m&eacute;todo scrum foi incorporado com maior ader&ecirc;ncia em equipes de desenvolvimento de software, por conta da complexidade&nbsp;<em>versus</em>&nbsp;necessidade de rapidez nas entregas.</p>\r\n\r\n<p>Se voc&ecirc; trabalha em equipes de desenvolvimento, em algum momento da sua vida ir&aacute; se deparar com alguma empresa que usa o m&eacute;todo scrum, considerando que entender de scrum &eacute; uma exig&ecirc;ncia em v&aacute;rias corpora&ccedil;&otilde;es.</p>\r\n\r\n<p>Se voc&ecirc; busca uma leitura pr&aacute;tica, direta e completa sobre o que &eacute; e como executar o m&eacute;todo scrum, est&aacute; no lugar certo.</p>\r\n\r\n<p>Vamos l&aacute;?</p>\r\n\r\n<h2><strong>Metodologia Scrum: do que estamos falando?</strong></h2>\r\n\r\n<h2>&nbsp;</h2>\r\n\r\n<p><img alt=\"\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14160428/o-que-e-scrum.jpg\" style=\"height:960px; width:1280px\" /></p>\r\n\r\n<p>Afinal, o que &eacute; Scrum? De maneira pr&aacute;tica, n&oacute;s podemos dizer que o m&eacute;todo scrum propicia a cria&ccedil;&atilde;o de solu&ccedil;&otilde;es &ldquo;fora da caixa&rdquo; para problemas complexos. E claro, o objetivo final &eacute; sempre a agilidade na entrega de uma solu&ccedil;&atilde;o que deixe algu&eacute;m feliz.</p>\r\n\r\n<p><strong><em>A f&oacute;rmula &eacute;: agilidade + efici&ecirc;ncia.</em></strong></p>\r\n\r\n<p>Podemos, sim, dizer que o m&eacute;todo scrum &eacute; o uso da criatividade para o desenvolvimento de um projeto. No contexto de TI, para o desenvolvimento de solu&ccedil;&otilde;es. Na realidade o scrum &eacute; um m&eacute;todo, mas n&atilde;o a metodologia &aacute;gil em si, j&aacute; que existem v&aacute;rias, como Kanban e<strong><a href=\"https://blog.geekhunter.com.br/saiba-o-que-e-a-metodologia-lean-e-como-usa-la-na-sua-gestao/\" target=\"_blank\">&nbsp;Lean</a></strong></p>\r\n\r\n<p><strong>Isso quer dizer que Scrum, Kanban e Lean s&atilde;o frameworks por onde qualquer metodologia &aacute;gil flui.</strong></p>\r\n\r\n<p>Se um projeto &eacute; longo e complexo demais, ele precisa ser fragmentado e ao mesmo tempo ser acompanhado. Caso contr&aacute;rio vira bagun&ccedil;a, certo? E &eacute; a partir da&iacute; que voc&ecirc; come&ccedil;a a entender a import&acirc;ncia do scrum.</p>\r\n\r\n<p>Sim, podemos definir o scrum como uma esp&eacute;cie de rede de prioriza&ccedil;&atilde;o e acompanhamento, que gera efici&ecirc;ncia e reduz o gasto de tempo. &Eacute; a ess&ecirc;ncia da praticidade.</p>\r\n\r\n<p><strong>&gt;&gt;Leitura recomendada:</strong><br />\r\nSe quiser saber mais sobre outras&nbsp;<strong><a href=\"https://blog.geekhunter.com.br/tudo-que-voce-precisa-saber-sobre-agile-scrum-e-kanban/\" target=\"_blank\">metodologias &aacute;geis</a></strong>, confira este artigo aqui!</p>\r\n\r\n<h2><strong>O diferencial da metodologia scrum</strong></h2>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n			<td>\r\n			<h3><strong>M&eacute;todo Scrum</strong></h3>\r\n			</td>\r\n			<td>\r\n			<h3><strong>Outras formas de trabalho</strong></h3>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td><strong>Foco interativo</strong>, nas pessoas, conex&otilde;es e trocas de conhecimento.</td>\r\n			<td>&Ecirc;nfase maior em&nbsp;<strong>processos</strong>, ferramentas e menos intera&ccedil;&atilde;o entre equipes.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><strong>M&aacute;quina rodando</strong>. Produto ou servi&ccedil;os fluindo, funcionamento satisfat&oacute;rio.</td>\r\n			<td>Documenta&ccedil;&atilde;o excessiva,&nbsp;<strong>demora para execu&ccedil;&atilde;o e a&ccedil;&atilde;o,&nbsp;</strong>planejamento excessivo.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><strong>Intera&ccedil;&atilde;o com o cliente</strong>. Colabora&ccedil;&atilde;o com suas dores, absor&ccedil;&atilde;o de feedback e mais eficaz resolu&ccedil;&atilde;o dos seus problemas.</td>\r\n			<td><strong>Negocia&ccedil;&atilde;o de contratos</strong>, foco em pura receita, sem a real necessidade de resolu&ccedil;&atilde;o de problema.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><strong>Abra&ccedil;ar mudan&ccedil;as</strong>&nbsp;e ter flexibilidade para mudar o curso de um projeto.</td>\r\n			<td>Seguir&nbsp;<strong>um plano do come&ccedil;o ao fim</strong>. Com rigor e rigidez.</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<h2><strong>Por que DEVs precisam aprender Scrum?</strong></h2>\r\n\r\n<h3><strong>Ambiente adaptativo e criativo</strong></h3>\r\n\r\n<p>O que toma mais tempo de uma equipe, n&atilde;o s&oacute; de desenvolvimento, mas de qualquer &aacute;rea, &eacute; a inflexibilidade na hora de resolver um problema. Acreditar que s&oacute; existe uma ou duas maneiras de resolver um mesmo problema &eacute; assinar um atestado de n&atilde;o agilidade.</p>\r\n\r\n<p>Isto &eacute;, no velho de bom portugu&ecirc;s, de lentid&atilde;o mesmo. Se o&nbsp;<a href=\"https://blog.geekhunter.com.br/scrum-master-quem-e-e-o-que-faz/\" target=\"_blank\"><strong>Scrum Master</strong></a>&nbsp;&ndash;&nbsp;<em>falaremos mais adiante desse profissional&nbsp;</em>&ndash; levar a s&eacute;rio o m&eacute;todo scrum v&aacute;rias solu&ccedil;&otilde;es criativas surgir&atilde;o, criando um terreno f&eacute;rtil de ideias e ci&ecirc;ncia, onde v&aacute;rias hip&oacute;teses poder&atilde;o coexistir, ser testadas e as melhores implementadas.</p>\r\n\r\n<p>Isso &eacute; transformar problemas em oportunidades. E, sim, tamb&eacute;m &eacute; trocar o motor de um carro em movimento.&nbsp;Lembra aquele ditado &ldquo;<em>v&aacute;rias cabe&ccedil;as pensam melhor do que uma</em>&rdquo;? Ent&atilde;o, justamente disso que falamos.</p>\r\n\r\n<p><a href=\"https://www.geekhunter.com.br/criar-perfil-gratis?utm_source=Blog&amp;utm_medium=cta&amp;utm_campaign=cadastro-de-candidato\" target=\"_blank\"><img alt=\"cadastro na plataforma de empregos geekhunter\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14161336/CTA-Emprego-dos-sonhos.jpg\" /></a></p>\r\n\r\n<h3><strong>Transpar&ecirc;ncia no&nbsp;</strong><em><strong>workflow</strong></em></h3>\r\n\r\n<p>Al&eacute;m de desconstruir um escopo fixo e engessado de trabalho, no scrum todos do projeto acompanham o que j&aacute; foi feito, o que est&aacute; sendo feito, o que est&aacute; sendo testado, o que foi efetivamente aprovado e o que ainda ser&aacute; executado (<em>o nosso famoso backlog</em>).</p>\r\n\r\n<p>Isso porque, no scrum, as agendas s&atilde;o abertas e n&atilde;o existe necessariamente um &ldquo;dono&rdquo; para determinadas atividades em um time de desenvolvimento.</p>\r\n\r\n<p>&Eacute; claro que, usualmente, o Scrum Master, o Product Manager e alguns desenvolvedores (dependendo da estrutura da &aacute;rea), tem atividades bem delimitadas.</p>\r\n\r\n<p>A mensagem do scrum &eacute; basicamente: o que est&aacute; no sprint precisar&aacute; ser feito. E &eacute; perfeitamente cab&iacute;vel que o dono da atividade seja alterado.</p>\r\n\r\n<p><strong>&gt;&gt;Leitura Recomendada:</strong><br />\r\n<em>A jun&ccedil;&atilde;o do&nbsp;</em><a href=\"https://blog.geekhunter.com.br/a-juncao-do-behavior-driven-development-e-metodologia-agil/\" target=\"_blank\"><strong><em>Behavior Driven Development</em></strong></a><em>&nbsp;e metodologia &aacute;gil</em></p>\r\n\r\n<h3><strong>Trabalho &aacute;gil e colaborativo entre equipes</strong></h3>\r\n\r\n<p>Quando se conhece as prioridades e tamb&eacute;m o andamento da execu&ccedil;&atilde;o dos projetos, a entrega fica muito mais f&aacute;cil.</p>\r\n\r\n<p>At&eacute; porque o gestor do projeto conseguir&aacute; alocar a atividade para outra pessoa, se preciso for, como tamb&eacute;m poder&aacute; conversar com o atual executor, em casos de n&iacute;tidos atrasos. O trabalho colaborativo &eacute; forte no scrum.</p>\r\n\r\n<p>&Eacute; tamb&eacute;m com o m&eacute;todo scrum que as equipes entender&atilde;o melhor o papel de cada um, em cada etapa.</p>\r\n\r\n<p>&ldquo;<em>Vi no scrum que o respons&aacute;vel pela task &eacute; o Jo&atilde;o. Como meu trabalho &eacute; a continuidade do dele, pedirei para que fa&ccedil;a x, ao inv&eacute;s de y</em>&rdquo;.</p>\r\n\r\n<p>Com isso, a equipe pode interagir mais entre si, sem precisar necessariamente da ponte de um gestor direto.</p>\r\n\r\n<p><em><strong>&gt;&gt;Leitura Recomendada:</strong><br />\r\nDicas essenciais para&nbsp;</em><a href=\"https://blog.geekhunter.com.br/gerenciamento-de-projetos-em-ti/\" target=\"_blank\"><strong><em>Gest&atilde;o de Projetos em T.I</em></strong></a></p>\r\n\r\n<h3><strong>Autogerenciamento</strong></h3>\r\n\r\n<p>Quando o colaborador tem um representa&ccedil;&atilde;o gr&aacute;fica da sua produtividade e do urg&ecirc;ncia, j&aacute; sabe o ritmo que dever&aacute; ter em tais dias, semanas ou meses.</p>\r\n\r\n<p>O autogerenciamento &eacute; especialmente especial em times de desenvolvimento de software, j&aacute; que cada &ldquo;problema&rdquo; tem um impacto diferente no produto.</p>\r\n\r\n<p><strong>&gt;&gt;Leitura recomendada:&nbsp;</strong><br />\r\nQual &eacute; o seu papel na equipe de desenvolvimento? Veja o panorama de&nbsp;<strong><a href=\"https://blog.geekhunter.com.br/salario-de-programador-cargos-em-alta-2019/\" target=\"_blank\">sal&aacute;rio de programador</a></strong>&nbsp;em 2019!</p>\r\n\r\n<h2><strong>Conceitos do Scrum: por onde come&ccedil;ar?</strong></h2>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n			<td>\r\n			<h3><strong>Conceitos Scrum</strong></h3>\r\n			</td>\r\n			<td>\r\n			<h3><strong>Outras formas de trabalho</strong></h3>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Daily Scrum</strong>&nbsp;&nbsp;</p>\r\n			</td>\r\n			<td>A DS tamb&eacute;m &eacute; uma reuni&atilde;o, s&oacute; que di&aacute;ria e de acompanhamento. Se a execu&ccedil;&atilde;o est&aacute; tomando caminhos errados, a DS indica e a&iacute; o Gestor do Projeto, o Scrum Master, pode convocar uma reuni&atilde;o de revis&atilde;o do sprint e, em seguida, uma nova de planejamento. O intuito de todas as reuni&otilde;es de Scrum &eacute; agilidade.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Product Backlog</strong></p>\r\n			</td>\r\n			<td>Aqui constam os principais pontos a serem &ldquo;atacados&rdquo; em cada projeto. Se falarmos de um projeto de desenvolvimento, o backlog de Produto nada mais &eacute; do que as features que precisam ser produzidas. O esmiu&ccedil;ado das atividades ser&aacute; feito no Sprint Backlog.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Sprint Backlog</strong></p>\r\n			</td>\r\n			<td>O Sprint Backlog &eacute; o banco de atividades de cada sprint. &Eacute; diferente de Product Backlog, pois abrange apenas as atividades definidas em cada sprint.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Sprint Planning Meeting</strong></p>\r\n			</td>\r\n			<td>Os sprints s&atilde;o fases ou etapas do trabalho no scrum. Assim como as SRMs, as SPMs s&atilde;o reuni&otilde;es de sprint. No entanto, s&atilde;o reuni&otilde;es para planejar o sprint.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><br />\r\n			<strong>Sprint Retrospective</strong></td>\r\n			<td><br />\r\n			<br />\r\n			Ao final de um sprint, acontece uma outra reuni&atilde;o, chamada<br />\r\n			Sprint Retrospective. Essa reuni&atilde;o serve debater o que deu certo, oo que n&atilde;o, o que pode ser melhorado e o que &eacute; preciso fazer para<br />\r\n			melhorar. Essa reuni&atilde;o costuma ter alguns entreg&aacute;veis em n&iacute;vel de otimiza&ccedil;&atilde;o.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Sprint Review Meeting</strong></p>\r\n			</td>\r\n			<td>SRM &eacute; como chamam as reuni&otilde;es de revis&atilde;o do sprint, que podem ser feitas no&nbsp;<em>start</em>&nbsp;de cada um. &Eacute; feita para priorizar as atividades que constam no backlog de produto (product backlog). Correspondem &agrave; execu&ccedil;&atilde;o peri&oacute;dica. &nbsp;</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Release Burndown</strong></p>\r\n			</td>\r\n			<td>Ao final de cada sprint, h&aacute; atualiza&ccedil;&atilde;o do progresso (andamento do projeto). Essa atualiza&ccedil;&atilde;o chama-se Release Burndown. Tudo isso &eacute;apresentado, geralmente, por meio de um diagrama, onde o eixo<br />\r\n			horizontal representa os sprints, enquanto o vertical representa o<br />\r\n			que ainda falta ser feito.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Burnup chart</strong></p>\r\n			</td>\r\n			<td>O Burnup Chart &eacute; a representa&ccedil;&atilde;o gr&aacute;fica das entregas, relacionando com a entrega da vers&atilde;o final de uma solu&ccedil;&atilde;o. Aqui &eacute; mais macro, por isso n&atilde;o est&aacute; ligado ao sprint, mas ao Backlog de Produto, onde falamos de features.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Hist&oacute;rias</strong></p>\r\n			</td>\r\n			<td>As hist&oacute;rias s&atilde;o atividades do backlog de produto. Uma &uacute;nica hist&oacute;ria pode ser quebrada em v&aacute;rias atividades de um sprint. J&aacute; os Pontos de Hist&oacute;ria expressa a complexidade de cumprimento de uma hist&oacute;ria.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><strong>Impedimentos</strong></td>\r\n			<td>Impedimentos, como o pr&oacute;prio nome diz, s&atilde;o problemas que ocorrem no percurso. O problema pode ser tanto no sprint, como na entrega de uma hist&oacute;ria.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Timebox</strong></p>\r\n			</td>\r\n			<td>&Eacute; o tempo de execu&ccedil;&atilde;o&nbsp;de um sprint. Existem sprints que duram uma semana, e outros que duram um m&ecirc;s, dependendo da din&acirc;mica e disponibilidade.</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Estimativa</strong></p>\r\n			</td>\r\n			<td>A estimativa &eacute; um&nbsp;<em>scoring</em>&nbsp;da complexidade de realiza&ccedil;&atilde;o de uma hist&oacute;ria.</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<h2><strong>Quem faz parte do time Scrum?</strong></h2>\r\n\r\n<p><img alt=\"imagem de um time do scrum produzida pela geekhunter\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14155521/time-scrum.png\" /></p>\r\n\r\n<h3><strong>Product Manager</strong></h3>\r\n\r\n<p>O Product Manager &ndash;&nbsp;<em>que tamb&eacute;m &eacute; conhecimento como Product Owner</em>&nbsp;&ndash; nada mais &eacute; do que o respons&aacute;vel pelo backlog de produto. &Eacute; o respons&aacute;vel maior por melhorar o produto e est&aacute; diretamente conectado &agrave; neg&oacute;cios. O Product Manager cria e prioriza as hist&oacute;rias e tamb&eacute;m pode inferir nas atividades fragmentadas do sprint.</p>\r\n\r\n<p>Ele deve entender de comportamento consumidor, e mergulhar profundamente na persona. &Eacute; a pessoa que dir&aacute; quando uma feature deve ser criada, se transformar ou simplesmente deixar de existir. Isso porque ele tem o poder de mercado, o controle dos dados. Ele tamb&eacute;m deve entender de desenvolvimento, j&aacute; que por priorizar uma hist&oacute;ria, deve ter no&ccedil;&atilde;o de quanto tempo leva para ser implantada e da sua complexidade. &nbsp;</p>\r\n\r\n<h3><strong>Scrum Master</strong></h3>\r\n\r\n<p>O Scrum Master d&aacute; muito suporte ao trabalho do Product Manager e tamb&eacute;m est&aacute; lado a lado com a equipe de desenvolvimento. Tamb&eacute;m atua diretamente na gest&atilde;o do backlog de produto. &Eacute; o Scrum Master que ajuda a equipe de Desenvolvimento a &ldquo;vencer&rdquo; problemas de execu&ccedil;&atilde;o e atuando diretamente como gestor de opera&ccedil;&atilde;o. O Scrum Master tamb&eacute;m deve prezar pelas diretrizes do Scrum, utilizando de todos os artif&iacute;cios j&aacute; validados pela metodologia para melhorar o desempenho do time de DEV.</p>\r\n\r\n<p>&Eacute; a pessoa que motiva, &ldquo;defende&rdquo; e ajuda a equipe a produzir melhor.</p>\r\n\r\n<h3><strong>Desenvolvedores</strong></h3>\r\n\r\n<p>A equipe de desenvolvimento atua mais na opera&ccedil;&atilde;o e menos na estrat&eacute;gia. Se dentro do m&eacute;todo scrum, devem praticar autogest&atilde;o e s&atilde;o respons&aacute;veis diretos pela execu&ccedil;&atilde;o do sprint. Geralmente, em um &uacute;nico time scrum, estamos falando de no m&iacute;nimo 4 e no m&aacute;ximo 10 desenvolvedores. No contexto de desenvolvimento de software, podemos contemplar diversos profissionais:</p>\r\n\r\n<ul>\r\n	<li>Arquiteto de Software</li>\r\n	<li>Programador Back-end, Front-end e Full-stack</li>\r\n	<li>Testador</li>\r\n	<li>UX</li>\r\n	<li>Entre v&aacute;rios outros.</li>\r\n</ul>\r\n\r\n<p><strong>&gt;&gt;Leitura recomendada:</strong><br />\r\n<a href=\"https://blog.geekhunter.com.br/como-aplicar-scrum-em-um-projeto-de-teste-de-software/\" target=\"_blank\"><strong>QA Scrum</strong></a>: como a metodologia otimizar os testes &aacute;geis?</p>\r\n\r\n<h2><strong>Scrum na pr&aacute;tica: As etapas da metodologia &aacute;gil</strong></h2>\r\n\r\n<p><img alt=\"imagem do fluxo de trabalho scrum produzida pela Geekhunter\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14155726/workflow-scrum.png\" /></p>\r\n\r\n<h3><strong>Sprint</strong></h3>\r\n\r\n<p>Como j&aacute; falamos antes, o sprint &eacute; o per&iacute;odo de cumprimento das tasks das hist&oacute;rias, que s&atilde;o definidas na reuni&atilde;o de Planning.</p>\r\n\r\n<p>Na imagem acima, podemos ver que a reuni&atilde;o de Planning &eacute; dividida em duas etapas: a montagem do backlog de produto e das hist&oacute;rias e depois na fragmenta&ccedil;&atilde;o de hist&oacute;rias em tasks, para que o Scrum Master consiga efetivamente passar os pr&oacute;ximos passos para a equipe.</p>\r\n\r\n<p><strong>O que &eacute; importante lembrar sobre o Sprint:</strong></p>\r\n\r\n<p>O Sprint ser&aacute; sempre um resultado das hist&oacute;rias do backlog de produto. E, claro, ser&aacute; por meio do Sprint que ser&aacute; gerado o insumo para a montagem do scrum.</p>\r\n\r\n<h3><strong>Alinhamento peri&oacute;dico</strong></h3>\r\n\r\n<p>Dentro de alinhamentos peri&oacute;dicos, n&oacute;s temos v&aacute;rios &ldquo;encontros&rdquo;: o daily scrum, que &eacute; o acompanhamento di&aacute;rio, o Planning Meeting (que &eacute; o Sprint Meeting), o Review e o Retrospective Meeting, que podem ser realizados em uma mesma ocasi&atilde;o.</p>\r\n\r\n<p><strong>O que &eacute; importante lembrar sobre o Alinhamento peri&oacute;dico:</strong></p>\r\n\r\n<p>N&atilde;o existe um prazo fechado para as reuni&otilde;es. Elas podem ser convocadas sempre o que Product Manager sentir necessidade ou precisar passar algo sobre neg&oacute;cios e estrat&eacute;gia, ou sempre que algo tiver que ser priorizado ou acelerado, geralmente pelo Scrum Master.</p>\r\n\r\n<p><a href=\"https://bit.ly/2zU010n\" target=\"_blank\"><img alt=\"cadastro na plataforma de empregos geekhunter\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14161336/CTA-Emprego-dos-sonhos.jpg\" /></a></p>\r\n\r\n<h3><strong>Acompanhamento do Sprint</strong></h3>\r\n\r\n<p>O acompanhamento do sprint &eacute; feito pelo Scrum Master e &eacute; outra etapa bem importante do m&eacute;todo scrum. Como todas as atividades est&atilde;o dispostas para a visualiza&ccedil;&atilde;o de todos, o andamento do projeto &eacute; acompanhado por todos.</p>\r\n\r\n<p>No entanto, a cobran&ccedil;a, a acelera&ccedil;&atilde;o do projeto e a prioriza&ccedil;&atilde;o de tasks fica por conta do Scrum Master, que al&eacute;m de acompanhar graficamente o andamento, tamb&eacute;m o faz pelas reuni&otilde;es di&aacute;rias que voc&ecirc; j&aacute; ouviu falar: os Daily Scrums.</p>\r\n\r\n<p><strong>O que &eacute; importante lembrar sobre o Acompanhamento de Sprint:</strong></p>\r\n\r\n<p>Embora a gest&atilde;o do projeto fique oficialmente na m&atilde;o do Scrum Master, o acompanhamento do Scrum &eacute; responsabilidade de todos. Lembra que falamos sobre as atividades terem um dono, mas ao mesmo tempo n&atilde;o?</p>\r\n\r\n<p>Isso quer dizer que a execu&ccedil;&atilde;o de determinadas tarefas podem ser alocadas, transferidas para outras pessoas, de modo que o projeto flua bem e prazos n&atilde;o sejam estourados.</p>\r\n\r\n<h2>Como aplicar Scrum?</h2>\r\n\r\n<p>O framework scrum pode ser aplicado de maneiras diferentes entre times, ent&atilde;o &eacute; sempre importante frisar que as dicas que vamos dar s&atilde;o adapt&aacute;veis.<br />\r\n<br />\r\nAs fases b&aacute;sicas do scrum s&atilde;o planejamento, execu&ccedil;&atilde;o, revis&atilde;o e otimiza&ccedil;&atilde;o.<br />\r\n<br />\r\n<strong>O que a equipe da GeekHunter indica:</strong></p>\r\n\r\n<h3><strong>Estudos de Scrum</strong></h3>\r\n\r\n<p>Comece lendo o Guia Scrum por completo. N&atilde;o importa se voc&ecirc; Aqui est&aacute; o<a href=\"https://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-Portuguese-BR.pdf\" target=\"_blank\"><strong>&nbsp;Guia Scrum em Portugu&ecirc;s e em PDF</strong></a>, escrito pelos pr&oacute;prios criadores. Vale a pena!</p>\r\n\r\n<h3><strong>Product Backlog</strong></h3>\r\n\r\n<p>Essa &eacute; uma das partes mais importantes de um projeto Scrum. O que &eacute; necess&aacute;rio para come&ccedil;ar? Quais atividades o produto precisa para come&ccedil;ar a andar? &Eacute; importante frisar que as atividades precisam ser priorizadas, caso contr&aacute;rio o projeto n&atilde;o anda.<br />\r\n<br />\r\nO m&eacute;todo de prioriza&ccedil;&atilde;o&nbsp;<strong>ICE</strong>&nbsp;(<em>Impact, Confidence, Reach, Effort</em>), criado pelo&nbsp;<a href=\"https://en.wikipedia.org/wiki/Sean_Ellis_(entrepreneur)\" target=\"_blank\"><strong>Growth Hacker e empreendedor Sean Ellis</strong></a>, tende a fortalecer bastante o modelo scrum, embora n&atilde;o tenham nascido juntos.</p>\r\n\r\n<h3><strong>Time Scrum</strong></h3>\r\n\r\n<p>Quem far&aacute; o que? N&oacute;s sabemos que no time scrum n&atilde;o h&aacute; muito espa&ccedil;o para &ldquo;estrelas&rdquo;, ou pessoas com ego inflado que se recusam a abra&ccedil;ar responsabilidades.<br />\r\n<br />\r\nAs pessoas se ajudam, mas as lideran&ccedil;as precisam ser muito bem definidas. Isto &eacute;, &eacute; importante escolher dentre os DEVs &mdash; geralmente &mdash; algu&eacute;m com boa comunica&ccedil;&atilde;o e intelig&ecirc;ncia interpessoal, j&aacute; que essa pessoas ser&aacute; respons&aacute;vel por guiar o grupo. &ldquo;<em>Mas precisa necessariamente ser um DEV?</em>&rdquo;<br />\r\n<br />\r\nNem sempre, pode apenas ser um bom gestor de projeto com conhecimentos em TI. No entanto, se for algu&eacute;m que entende e se d&aacute; bem com o time, os resultados tendem a ser potencializados.</p>\r\n\r\n<h3><strong>Montando o Sprint</strong>&nbsp;</h3>\r\n\r\n<p>Agora que os pap&eacute;is principais j&aacute; foram definidos, as lideran&ccedil;as bem acertadas e o backlog calibrado, &eacute; hora de priorizar e escolher os respons&aacute;veis pelas tasks.<br />\r\n<br />\r\nA equipe scrum pode tanto utilizar o m&eacute;todo ICE para prioriza&ccedil;&atilde;o, ou tamb&eacute;m pode definir o que vir&aacute; primeiro junto ao PO e ao SM.<br />\r\n<br />\r\nAgora um ponto bem importante: geralmente os sprints ocupam per&iacute;odos semanais, embora alguns times optem por fazer mensal. Particularmente, na GeekHunter, achamos mais efetivo fazer semanalmente.</p>\r\n\r\n<h3>Execu&ccedil;&atilde;o e revis&atilde;o de sprint</h3>\r\n\r\n<p>Agora que j&aacute; temos respons&aacute;veis e prioriza&ccedil;&atilde;o &eacute; preciso entender, diariamente, como as tasks est&atilde;o andando. Nada de presta&ccedil;&atilde;o de contas ou press&atilde;o, essa reuni&atilde;o di&aacute;ria serve apenas para alinhamentos e poss&iacute;veis destravamentos de tasks. Esse papel &eacute; um dos principais do SM.</p>\r\n\r\n<p>Tudo isso &eacute; feito no que chamamos de Daily Scrum Meeting.</p>\r\n\r\n<p>Perguntas comuns do Daily Scrum Meeting:</p>\r\n\r\n<p>1. Voc&ecirc; vem trabalhando no qu&ecirc;?<br />\r\n2. Hoje, o que voc&ecirc; far&aacute;?<br />\r\n3. Est&aacute; seguindo a prioriza&ccedil;&atilde;o conforme combinado?<br />\r\n4. Voc&ecirc; precisa de ajuda? Existe algo que necessita destravar?<br />\r\n<br />\r\n<strong>Obs:.&nbsp;</strong>No modelo scrum, todos os membros praticam a autogest&atilde;o. Ent&atilde;o o Daily Scrum Meeting jamais deve ser considerado uma presta&ccedil;&atilde;o de contas, mas sim, uma pr&aacute;tica de alinhamento, comunica&ccedil;&atilde;o e intera&ccedil;&atilde;o entre o time.</p>\r\n\r\n<p>Os alinhamentos podem rolar diariamente, como no&nbsp;<em>Daily Scrum Meeting</em>, ou em reuni&otilde;es de retrospectiva, onde o foco sai do trabalho de cada um e vai para o cen&aacute;rio geral de desempenho da equipe.</p>\r\n\r\n<h2><strong>Ferramentas para usar a metodologia &aacute;gil Scrum</strong></h2>\r\n\r\n<p><img alt=\"computador com ferramenta trello scrum na tela\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2018/11/14161240/ferramenta-trello-scrum.jpg\" /></p>\r\n\r\n<h3><strong>Trello</strong></h3>\r\n\r\n<p>O Trello possui uma<em>&nbsp;interface</em>&nbsp;extremamente pr&aacute;tica. Aqui na Geek n&oacute;s utilizamos e temos um &oacute;timo ganho de tempo.</p>\r\n\r\n<p>Por meio de colunas &eacute; poss&iacute;vel segmentar grupos de tasks e mov&ecirc;-las com facilidade. Tamb&eacute;m &eacute; poss&iacute;vel, dentro da tarefa, especificar seu escopo, os respons&aacute;veis, o deadline e trabalhar com etiquetas (que segmentam ainda mais).</p>\r\n\r\n<p>Tamb&eacute;m &eacute; poss&iacute;vel comentar, fornecer feedbacks e fazer alinhamentos no ambiente. A grande vantagem do Trello &eacute; que, j&aacute; na vers&atilde;o gratuita, oferece muito mais funcionalidades do que qualquer outro framework.</p>\r\n\r\n<p><strong>Um exemplo de uso seria:</strong></p>\r\n\r\n<p>Criar colunas &ldquo;Product Backlog&rdquo;, &ldquo;Backlog Sprint&rdquo;, &ldquo;Doing&rdquo;, &ldquo;Done&rdquo;, pode ajudar no manejo de atividades. As etiquetas podem servir para prioriza&ccedil;&atilde;o, fornecendo pontos para hist&oacute;rias e tamb&eacute;m para tasks. E al&eacute;m disso, tamb&eacute;m &eacute; interessante marcar o Scrum Master nas tasks, para que receba d&uacute;vidas e consiga fazer alinhamentos no pr&oacute;prio ambiente.</p>\r\n\r\n<h3><strong>Asana</strong></h3>\r\n\r\n<p>Funcionalmente o Asana &eacute; bem parecido com Trello. O Asana, no entanto, possui algumas funcionalidades adicionais, como monitoramento de bugs, feedback e lan&ccedil;amento de produto, al&eacute;m de uma hierarquia de permiss&otilde;es, que &eacute; bem importante para agilidade do projeto. E o melhor: assim como o Trello tamb&eacute;m possui vers&atilde;o free.</p>\r\n\r\n<p>O Asana tamb&eacute;m apresenta relat&oacute;rios de desempenho por membro do projeto, bem como progresso para entrega do produto final.</p>\r\n\r\n<p>Todas essas features tornam o Asana uma ferramenta mais poderosa para equipes de TI mais maduras.</p>\r\n',1,'2020-11-22 00:32:35','2020-11-22 00:33:28'),(9,1,1,'firebase-o-que-e-quando-usar-no-desenvolvimento-mobile-','Firebase: o que Ã© e quando usar no desenvolvimento mobile?','blog-slide4.jpg','<p>O Firebase &eacute; a plataforma de desenvolvimento de aplicativos m&oacute;veis do Google que ajuda voc&ecirc; a criar, melhorar e expandir seu aplicativo.</p>\r\n\r\n<p>Digamos que existe uma variedade de tecnologias do lado do servidor (back-end) dispon&iacute;veis no mercado para desenvolvedores testarem novas possibilidades de uso e o Firebase &eacute; uma das que mais tem atra&iacute;do a aten&ccedil;&atilde;o no mundo mobile.</p>\r\n\r\n<p>Com ele, &eacute; poss&iacute;vel oferecer experi&ecirc;ncias de aplicativos mais ricas para o usu&aacute;rio, otimizando a performance e a experi&ecirc;ncia da plataforma.</p>\r\n\r\n<h2>O que &eacute; e o que faz o Firebase?</h2>\r\n\r\n<p>Se pudermos rotular o Firebase, diremos que ele &eacute; Backend-as-a-Service (Baas).</p>\r\n\r\n<p>Neste sentido de servidor, o&nbsp;<strong>Firebase</strong>&nbsp;<strong>fornece aos desenvolvedores uma variedade de ferramentas e servi&ccedil;os para ajud&aacute;-los a desenvolver aplicativos de qualidade, aumentar sua base de usu&aacute;rios e ser mais lucrativo.</strong></p>\r\n\r\n<p>Toda sua base &eacute; constru&iacute;da na infraestrutura do Google, sendo categorizado como um programa de banco de dados NoSQL, que armazena dados em documentos do tipo JSON.</p>\r\n\r\n<p>O Firebase conta um grande conjunto de ferramentas de desenvolvimento. Destas, o&nbsp;<strong>Realtime Database</strong>&nbsp;e o&nbsp;<strong>Cloud Firestore</strong>&nbsp;podem armazenar dados estruturados em documentos e sincronizar os aplicativos correspondentes em milissegundos sempre que ocorre uma transforma&ccedil;&atilde;o de dados.</p>\r\n\r\n<p>Isso quer dizer que tanto o aplicativo quanto seu banco de dados ouvem um ao outro, proporcionando ao usu&aacute;rio experi&ecirc;ncias integradas no aplicativo.</p>\r\n\r\n<p>E o&nbsp;<strong>Firebase Cloud Functions</strong>&nbsp;pode at&eacute; estender essa funcionalidade. Essas fun&ccedil;&otilde;es permitem que o desenvolvedor escreva c&oacute;digo de back-end para responder a eventos que acontecem na plataforma Firebase sem precisar diretamente de nenhum servidor.</p>\r\n\r\n<h2>Para quem &eacute; o Firebase</h2>\r\n\r\n<p>O Firebase foi projetado para se integrar muito bem com aplicativos da web e mobile com SDKs para uma imensa variedade de linguagens.</p>\r\n\r\n<p>&Eacute; uma suite de aplicativos feitas sob medida para qualquer desenvolvedor que precisa de ferramentas para construir apps melhores, mais robustos, com menos erros, mais otimizados para o usu&aacute;rio, escal&aacute;vel e ainda mais lucrativos.</p>\r\n\r\n<h2>Por que usar o Firebase</h2>\r\n\r\n<p>Com a plataforma voc&ecirc; n&atilde;o precisa se preocupar com diversos fatores que costumam gerar dores de cabe&ccedil;a numa aplica&ccedil;&atilde;o Web ou Mobile, como:</p>\r\n\r\n<ul>\r\n	<li>Seguran&ccedil;a na comunica&ccedil;&atilde;o e transfer&ecirc;ncia de dados;</li>\r\n	<li>Limita&ccedil;&otilde;es de infraestrutura;</li>\r\n	<li>Bugs de atualiza&ccedil;&otilde;es;</li>\r\n	<li>Compatibilidade com v&aacute;rios tipos de dispositivos diferentes;</li>\r\n	<li>Autentica&ccedil;&atilde;o;</li>\r\n	<li>Problemas que envolvem UI/UX.</li>\r\n</ul>\r\n\r\n<p>Todos essas situa&ccedil;&otilde;es s&atilde;o pass&iacute;veis de serem solucionadas por meio dos servi&ccedil;os oferecidos pelo Firebase.</p>\r\n\r\n<h2>Principais servi&ccedil;os do Firebase</h2>\r\n\r\n<p><img alt=\"funcionalidades do Firebase\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/09/06234215/firebase-funcoes.jpg\" /></p>\r\n\r\n<p>A suite de aplicativos do Firebase &eacute; enorme como voc&ecirc; pode conferir na imagem acima, portanto iremos focar nos principais servi&ccedil;os utilizados por desenvolvedores:</p>\r\n\r\n<h3>Realtime Database</h3>\r\n\r\n<p>De forma simples e objetiva, com o j&aacute; mencionado&nbsp;<strong>Realtime Database</strong>, os dados s&atilde;o sincronizados em todos os clientes em tempo real e permanecem dispon&iacute;veis mesmo quando um aplicativo sai do ar.</p>\r\n\r\n<h3>File Storage</h3>\r\n\r\n<p>O&nbsp;<strong>Firebase Storage</strong>&nbsp;oferece uma forma pr&aacute;tica de salvar arquivos, de imagens a arquivos, at&eacute; o Google Cloud Storage diretamente do cliente.</p>\r\n\r\n<p>O servi&ccedil;o tem seu pr&oacute;prio sistema de regras de seguran&ccedil;a para proteger seus arquivos, enquanto concede privil&eacute;gios de grava&ccedil;&atilde;o detalhados aos seus clientes autenticados.</p>\r\n\r\n<h3>Authentication</h3>\r\n\r\n<p>Suporta autentica&ccedil;&atilde;o usando senhas, n&uacute;meros de telefone, perfil do Google, Facebook, Twitter etc.</p>\r\n\r\n<p>O Firebase Authentication (SDK) pode ser usado para integrar manualmente um ou mais m&eacute;todos de login em um aplicativo.</p>\r\n\r\n<h3>Hosting</h3>\r\n\r\n<p>O&nbsp;<strong>Firebase Hosting</strong>&nbsp;fornece hospedagem r&aacute;pida e segura para um aplicativo da web.</p>\r\n\r\n<p>O conte&uacute;do fica armazenado em cache nas redes de distribui&ccedil;&atilde;o de conte&uacute;do em todo o mundo (CDNs).</p>\r\n\r\n<p>Exemplo com Gulp:</p>\r\n\r\n<blockquote>\r\n<p>var gulp = require(&#39;gulp&#39;);<br />\r\nvar superstatic = require(&#39;superstatic&#39;);<br />\r\nvar browserSync = require(&#39;browser-sync&#39;).create();</p>\r\n\r\n<p>gulp.task(&#39;serve&#39;, function() {<br />\r\n&nbsp; browserSync.init({<br />\r\n&nbsp; &nbsp; server: {<br />\r\n&nbsp; &nbsp; &nbsp; middleware: [superstatic({stack: &#39;strict&#39;})]<br />\r\n&nbsp; &nbsp; }<br />\r\n&nbsp; });<br />\r\n&nbsp; gulp.watch(&#39;public/*.html&#39;).on(&#39;change&#39;, browserSync.reload);<br />\r\n});</p>\r\n</blockquote>\r\n\r\n<p>Ajuda na monetiza&ccedil;&atilde;o do aplicativo permitindo inserir an&uacute;ncios que encaixem no layout sem prejudicar a experi&ecirc;ncia do usu&aacute;rio.</p>\r\n\r\n<h3>Performance Monitoring</h3>\r\n\r\n<p>Obtenha informa&ccedil;&otilde;es sobre os problemas diretamente relacionados ao desempenho do seu aplicativo.</p>\r\n\r\n<p>Para mais detalhes ou saber mais sobre outros servi&ccedil;os da plataforma (que s&atilde;o muuuuuitos) voc&ecirc; pode visitar o&nbsp;<a href=\"https://firebase.google.com/\" target=\"_blank\"><strong>site oficial do Firebase</strong></a>.</p>\r\n\r\n<h2>Quanto custa o Firebase?</h2>\r\n\r\n<p>Existem dois planos de uso do Firebase, s&atilde;o eles:</p>\r\n\r\n<ul>\r\n	<li><strong>Plano gratuito</strong>&nbsp;(Free): o Firebase est&aacute; dispon&iacute;vel para uso gratuitamente para qualquer desenvolvedor;</li>\r\n	<li><strong>Pague conforme o uso</strong>&nbsp;(Pay as you go): Assim que seu aplicativo for escalonado, voc&ecirc; precisar&aacute; migrar do plano gratuito para o plano pago conforme o uso. Com isso, voc&ecirc; s&oacute; precisa pagar pelos servi&ccedil;os que do Firebase que usar.</li>\r\n</ul>\r\n\r\n<h2>Vantagens do Firebase</h2>\r\n\r\n<p>O Firebase &eacute; &oacute;timo, confira algumas praticidades e benef&iacute;cios que a plataforma &eacute; capaz de proporcionar:</p>\r\n\r\n<ul>\r\n	<li>Dados em tempo real;</li>\r\n	<li>API pronta;</li>\r\n	<li>Autentica&ccedil;&atilde;o via e-mail, Google, Facebook e Github;</li>\r\n	<li>Seguran&ccedil;a;</li>\r\n	<li>Armazenamento de arquivos pelo Google Cloud Storage;</li>\r\n	<li>Hospedagem de arquivos est&aacute;ticos;</li>\r\n	<li>Aplicativos altamente escal&aacute;veis;</li>\r\n	<li>Sem preocupa&ccedil;&otilde;es quanto a infraestrutura.</li>\r\n</ul>\r\n\r\n<h2>Desvantagens do Firebase</h2>\r\n\r\n<p>Mas como nem tudo s&atilde;o flores, o Firebase ainda sofre com alguns pontos para melhoria, por exemplo:</p>\r\n\r\n<ul>\r\n	<li>Capacidade limitada de consultas devido ao modelo de fluxo de dados do Firebase;</li>\r\n	<li>Os modelos de dados relacionais tradicionais n&atilde;o s&atilde;o aplic&aacute;veis ao NoSQL, seus chops SQL n&atilde;o ser&atilde;o transferidos;</li>\r\n	<li>Sem instala&ccedil;&atilde;o local.</li>\r\n</ul>\r\n\r\n<h2>Como usar Firebase Android</h2>\r\n\r\n<p>Existem alguns pr&eacute;-requisitos para integrar o Firebase ao seu projeto Android:</p>\r\n\r\n<ul>\r\n	<li>Instalar ou atualizar o Android Studio para a vers&atilde;o mais recente;</li>\r\n	<li>Certificar de que seu projeto atenda a estes requisitos:\r\n	<ul>\r\n		<li>API de n&iacute;vel 16 (Jelly Bean) ou posterior;</li>\r\n		<li>Gradle 4.1 ou posterior;</li>\r\n		<li><a href=\"https://developer.android.com/jetpack/androidx/migrate\" target=\"_blank\">Jetpack (AndroidX)</a>&nbsp;com:\r\n		<ul>\r\n			<li><em>com.android.tools.build:gradle</em>&nbsp;v3.2.1 ou posterior</li>\r\n			<li><em>compileSdkVersion</em>&nbsp;28 ou posterior;</li>\r\n		</ul>\r\n		</li>\r\n	</ul>\r\n	</li>\r\n	<li>Configurar um dispositivo f&iacute;sico ou usar um emulador para rodar seu app. Os emuladores devem usar uma imagem de emulador com o Google Play;</li>\r\n	<li>Logar no Firebase usando sua conta do Google.</li>\r\n</ul>\r\n\r\n<h3>Tutorial Firebase: como conectar seu Android app</h3>\r\n\r\n<p>Adicionar o Firebase ao seu aplicativo envolve tarefas no console do Firebase e no projeto aberto do Android (por exemplo, voc&ecirc; baixa os arquivos de configura&ccedil;&atilde;o do Firebase do console e os transfere para o seu projeto do Android).</p>\r\n\r\n<p>Para registrar seu app com o Firebase voc&ecirc; precisa:</p>\r\n\r\n<ol>\r\n	<li>Acesse o&nbsp;<a href=\"https://console.firebase.google.com/u/0/?pli=1\" target=\"_blank\">console do Firebase</a>;</li>\r\n	<li>No centro da p&aacute;gina de vis&atilde;o geral do projeto, clique no &iacute;cone do Android para iniciar o fluxo de trabalho;</li>\r\n	<li>Digite o nome do pacote do seu aplicativo em<em>&nbsp;Android package name</em>.</li>\r\n	<li>Clique em&nbsp;<em>Register app</em>.</li>\r\n</ol>\r\n\r\n<h3>Como adicionar um arquivo de configura&ccedil;&atilde;o do Firebase</h3>\r\n\r\n<p>Para adicionar um arquivo de configura&ccedil;&atilde;o do Firebase, voc&ecirc; precisa:</p>\r\n\r\n<ol>\r\n	<li>Clicar em&nbsp;<em>Download google-services.json</em>&nbsp;para obter seu arquivo de configura&ccedil;&atilde;o do Firebase Android (google-services.json).</li>\r\n	<li>Mover seu arquivo de configura&ccedil;&atilde;o para o diret&oacute;rio do m&oacute;dulo do seu aplicativo.</li>\r\n</ol>\r\n\r\n<p>Para ativar as funcionalidades do Firebase em seu aplicativo, adicione o&nbsp;<em><a href=\"https://developers.google.com/android/guides/google-services-plugin\" target=\"_blank\">plugin google-services</a></em>&nbsp;aos seus arquivos&nbsp;<em>Gradle</em>.</p>\r\n\r\n<p>No seu arquivo Gradle de n&iacute;vel raiz (build.gradle), adicione regras para incluir o plug-in Gradle de servi&ccedil;os do Google. Verifique se voc&ecirc; tamb&eacute;m possui o reposit&oacute;rio Maven do Google.</p>\r\n\r\n<blockquote>\r\n<p>buildscript {</p>\r\n\r\n<p>&nbsp; repositories {<br />\r\n&nbsp; &nbsp; // Verifique se voc&ecirc; tem a seguinte linha (se n&atilde;o, adicione-a):<br />\r\n&nbsp; &nbsp; google() &nbsp;// reposit&oacute;rio Maven<br />\r\n&nbsp; }</p>\r\n\r\n<p>&nbsp; dependencies {<br />\r\n&nbsp; &nbsp; // ...</p>\r\n\r\n<p>&nbsp; &nbsp; // Adicionar:<br />\r\n&nbsp; &nbsp; classpath &#39;com.google.gms:google-services:4.3.3&#39; &nbsp;// Google Services plugin<br />\r\n&nbsp; }<br />\r\n}</p>\r\n\r\n<p>allprojects {<br />\r\n&nbsp; // ...</p>\r\n\r\n<p>&nbsp; repositories {<br />\r\n&nbsp; &nbsp; // Verifique se voc&ecirc; tem a seguinte linha (se n&atilde;o, adicione-a):<br />\r\n&nbsp; &nbsp; google() &nbsp;// reposit&oacute;rio Maven<br />\r\n&nbsp; &nbsp; // ...<br />\r\n&nbsp; }<br />\r\n}</p>\r\n</blockquote>\r\n\r\n<p>No seu arquivo Gradle do m&oacute;dulo (geralmente app / build.gradle), aplique o plug-in Gradle dos Servi&ccedil;os do Google:</p>\r\n\r\n<blockquote>\r\n<pre>\r\n<code>apply plugin: &#39;com.android.application&#39;\r\n// Adicionar:\r\napply plugin: &#39;com.google.gms.google-services&#39;  // plugin do Google Services\r\n\r\nandroid {\r\n  // ...\r\n}</code></pre>\r\n</blockquote>\r\n\r\n<p>Por fim, voc&ecirc; precisa&nbsp;<a href=\"https://firebase.google.com/docs/android/setup#java\" target=\"_blank\">adicionar SDKs do Firebase ao seu aplicativo</a>&nbsp;conforme utiliza&ccedil;&atilde;o do Java ou Kotlin.</p>\r\n\r\n<h2>Alternativas ao Firebase</h2>\r\n\r\n<p>Existem alternativas ao Firebase no mercado, listei as tr&ecirc;s principais para voc&ecirc; conhecer, confira:</p>\r\n\r\n<h3>Back4app</h3>\r\n\r\n<p>Back4app &eacute; uma das solu&ccedil;&otilde;es de BaaS mais f&aacute;ceis e simples de usar e gerenciar, que pode beneficiar desenvolvedores que procuram uma solu&ccedil;&atilde;o pr&aacute;tica e sem muita complexidade desnecess&aacute;ria para o dia a dia.</p>\r\n\r\n<h3>Backendless</h3>\r\n\r\n<p>Backendless &eacute; outra alternativa importante ao Firebase, que oferece uma infinidade de recursos do BaaS para serem usados por qualquer desenvolvedor.</p>\r\n\r\n<p>Se voc&ecirc; deseja modificar qualquer aplicativo existente ou deseja inici&aacute;-lo do zero, o Backendless deve ser considerado.</p>\r\n\r\n<h3>Parse</h3>\r\n\r\n<p>Parse tamb&eacute;m &eacute; um player bastante popular como BaaS.</p>\r\n\r\n<p>Possui uma enorme comunidade de desenvolvedores apoiando esta solu&ccedil;&atilde;o e conta com uma incr&iacute;vel variedade de servi&ccedil;os oferecidos com o objetivo de melhorar a funcionalidade de qualquer aplicativo.</p>\r\n\r\n<p>Gostou do artigo sobre Firebase? Ficou alguma d&uacute;vida? Deixe seu coment&aacute;rio e compartilhe o conte&uacute;do!</p>\r\n',1,'2020-11-22 00:39:09',NULL),(10,1,1,'desenvolvimento-para-mobile-ionic-react-native-ou-flutter-qual-usar-','Desenvolvimento para mobile: Ionic, React-Native ou Flutter, qual usar?','1_9tmBZ0TonJyJ26sj1bc_JA.png','<p>Qual a melhor Cross Platform quando o assunto &eacute; desenvolvimento para mobile?&nbsp;<strong>Ionic, React-Native ou Flutter?</strong></p>\r\n\r\n<p>Mas calma, antes de falarmos sobre estas tr&ecirc;s plataformas, vamos antes entender um pouco melhor do motivo em termos optado por elas.</p>\r\n\r\n<h2>Qual a melhor plataforma para desenvolvimento mobile?</h2>\r\n\r\n<p>Realmente estamos fazendo uma pergunta que nos &uacute;ltimos anos tem se colocado a frente de v&aacute;rias pessoas envolvidas em um projeto de App Mobile.</p>\r\n\r\n<p>Claro que tamb&eacute;m temos diversas outras solu&ccedil;&otilde;es de Cross Platform, como o Xamarim e Phonegap.</p>\r\n\r\n<p>Mas nessa altura, temos que concordar que as tr&ecirc;s tecnologias discutidas neste artigo encabe&ccedil;am as escolhas das maiorias das empresas e grupos que trabalham com apps multiplataforma.</p>\r\n\r\n<p>Podemos dizer ent&atilde;o que a melhor escolha deve estar entre as mais utilizadas na pr&aacute;tica, no dia a dia, certo?</p>\r\n\r\n<p>Ent&atilde;o vamos juntos tentarmos entender o que cada uma tem a nos oferecer e ver se encontramos algo pr&aacute;tico que justifique a sele&ccedil;&atilde;o.</p>\r\n\r\n<h2>No desenvolvimento para mobile tudo depende da ocasi&atilde;o</h2>\r\n\r\n<p>Realmente n&atilde;o queria come&ccedil;ar este artigo dessa forma, mas acho que seria desleal com voc&ecirc; leitor, que est&aacute; procurando justamente esta resposta.</p>\r\n\r\n<p>Mas agora vai uma frase clich&ecirc; que voc&ecirc; provavelmente j&aacute; ouviu por a&iacute; em alguma circunst&acirc;ncia onde o autor n&atilde;o gostaria de se comprometer:</p>\r\n\r\n<p><strong>N&atilde;o existe bala de prata no mundo da tecnologia.</strong></p>\r\n\r\n<p>E acho que infelizmente esta frase nunca serviu t&atilde;o bem quanto no universo em que estamos lidando.</p>\r\n\r\n<p>Ent&atilde;o o que podemos fazer aqui, &eacute; tentar ver como cada solu&ccedil;&atilde;o se comporta em alguns cen&aacute;rios espec&iacute;ficos e tentar te ajudar a encontrar o que melhor se enquadra, caso precise.</p>\r\n\r\n<p>Bom, n&atilde;o vou me estender muito na parte te&oacute;rica, pois isso voc&ecirc; encontra em diversos materiais na internet, e com certeza falando muito melhor do que eu, mas vamos tentar ao menos definir conceitos b&aacute;sicos de cada uma.</p>\r\n\r\n<h2><a href=\"https://blog.geekhunter.com.br/ionic-vs-react/\" target=\"_blank\">Ionic</a></h2>\r\n\r\n<p><img alt=\"\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/06/07230956/2.png\" /></p>\r\n\r\n<p>Como no pr&oacute;prio site oficial da Ionic se define &ldquo;Cross-platform apps. Built with the web&rdquo;, ou seja, fa&ccedil;a aplicativos como voc&ecirc; faz sistemas para Web.</p>\r\n\r\n<p>E n&atilde;o considero como simplesmente um &ldquo;Webview mais parrudo&rdquo; como j&aacute; vi muitos falarem.</p>\r\n\r\n<p>Em suas vers&otilde;es mais atuais, podemos dizer que ele consegue entregar os mesmos recursos de seus concorrentes, acessando fun&ccedil;&otilde;es nativas como a c&acirc;mera, e por ser web, integrando uma grande gama de framework&rsquo;s como o React, Angular e Vue.</p>\r\n\r\n<p>Ele tamb&eacute;m d&aacute; a possibilidade de entregar uma vers&atilde;o para Desktop e at&eacute; mesmo utilizar PWA&rsquo;s.</p>\r\n\r\n<p>E assim podemos pensar: &ldquo;Pronto! Achamos a solu&ccedil;&atilde;o perfeita! Afinal &eacute; tudo feito com web, diminuindo a curva de aprendizagem de uma grande parcela de programadores, integra as principais tecnologias Javascript&rsquo;s de SPA&rsquo;s e possibilita criar um App Desktop!&rdquo;.</p>\r\n\r\n<p>Realmente ele &eacute; bem vers&aacute;til, mas temos que lembrar que para fazer tudo isso, e ser uma solu&ccedil;&atilde;o t&atilde;o alto n&iacute;vel, ela tem que &ldquo;ficar longe&rdquo; do hardware do seu dispositivo, e realmente passar por um Webview e por uma &ldquo;ponte&rdquo; que &eacute; feita com a tecnologia do Cordova.</p>\r\n\r\n<p>Assim por mais vers&aacute;til que seja, temos que deixar em mente que performance n&atilde;o est&aacute; entre suas qualidade, e dependendo da regra de neg&oacute;cio que estamos observando, ele pode trazer uma certa dor de cabe&ccedil;a.</p>\r\n\r\n<h2><a href=\"https://blog.geekhunter.com.br/um-guia-completo-de-react-native/\" target=\"_blank\">React-Native</a></h2>\r\n\r\n<p><img alt=\"\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/06/07230951/1.png\" /></p>\r\n\r\n<p>Aqui temos, o que arrisco em dizer, ser o mais famoso dos 3, tendo como sua base, o pr&oacute;prio ReactJS, framework desenvolvido pelo Facebook para desenvolver plataformas SPA&rsquo;s que n&atilde;o apenas se tornou o principal concorrente do AngularJS, mas o deixou para tr&aacute;s pelo menos no desenvolvimento de aplica&ccedil;&otilde;es Web.</p>\r\n\r\n<p>O React-Native desenvolve apps utilizando Javascript e Typescript, e ao contr&aacute;rio do Ionic, sua Bridge com o dispositivo &eacute; muito mais perform&aacute;tica.</p>\r\n\r\n<p>E com o Javascript, ele consegue acessar as API&rsquo;s Nativas do aparelho que est&aacute; rodando de uma forma muito mais r&aacute;pida que as tecnologias h&iacute;bridas.</p>\r\n\r\n<p>Com esse acesso nativo ele consegue entregar os atributos caracter&iacute;sticos de cada dispositivo, como bot&otilde;es, input&rsquo;s, datePickers etc, assim, dando uma maior impress&atilde;o de estar usando um app de desenvolvimento nativo.</p>\r\n\r\n<p>Tirando o fato da sua grande comunidade, e com isso, j&aacute; existem bibliotecas que possibilitam us&aacute;-lo em ambiente web e desktop.</p>\r\n\r\n<p>Agora sim! Encontramos a solu&ccedil;&atilde;o ideal!? Calma&hellip;</p>\r\n\r\n<p>Temos que lembrar que para acessar os componentes nativos ele ainda precisa do JavaScript, pois n&atilde;o sabe &ldquo;conversar com a m&aacute;quina&rdquo; como um app nativo sabe, e &eacute; claro, a nossa curva de aprendizado estar&aacute; mais restrita, tendo que saber utilizar a tecnologia do React.</p>\r\n\r\n<h2><a href=\"https://blog.geekhunter.com.br/introducao-ao-flutter-o-framework-do-google/\" target=\"_blank\">Flutter</a></h2>\r\n\r\n<p><img alt=\"\" src=\"https://blog-geek-midia.s3.amazonaws.com/wp-content/uploads/2020/06/07231002/3.png\" /></p>\r\n\r\n<p>E por fim, temos o Flutter, a mais nova das 3 solu&ccedil;&otilde;es. Mantido pela Google, e trazendo um outro conceito de tecnologias Cross Platform.</p>\r\n\r\n<p>Ele tamb&eacute;m trabalha com o padr&atilde;o de SPA&rsquo;s utilizado no React-Native, mas no lugar de usar componentes, usa o que &eacute; chamado de Widgets e a estrutura de seus projetos s&atilde;o formados por uma &aacute;rvore de Widgets.</p>\r\n\r\n<p>E assim podemos pensar qual &eacute; sua diferen&ccedil;a com o React-Native, e est&aacute; justamente em dois pontos principais:</p>\r\n\r\n<ul>\r\n	<li>Sua linguagem, que &eacute; o Dart, uma tentativa do Google para substituir o JavaScript em 2011 (Mas que n&atilde;o deixa a desejar em nada);</li>\r\n	<li>A forma como ele se comunica com os dispositivos, usando al&eacute;m das API&rsquo;s nativas, uma biblioteca de interface gr&aacute;fica, chamada Skia que tamb&eacute;m pertence ao Google atualmente.</li>\r\n</ul>\r\n\r\n<p>Logo seu aplicativo n&atilde;o acessa fun&ccedil;&otilde;es nativas, mas sim, roda como um jogo no device, entregando experi&ecirc;ncias bem mais interativas e visuais que as outras op&ccedil;&otilde;es.</p>\r\n\r\n<p><strong>&gt;&gt;</strong>&nbsp;<strong>Crie um perfil na GeekHunter e receba propostas alinhadas ao seu perfil. S&atilde;o mais de 1000 vagas abertas, inclusive de&nbsp;<a href=\"https://www.geekhunter.com.br/vagas-flutter\" target=\"_blank\">Vagas Flutter</a>.</strong></p>\r\n\r\n<h2>Como definir qual &eacute; a melhor plataforma de desenvolvimento para mobile?</h2>\r\n\r\n<p>Como dito no in&iacute;cio, o conceito de &ldquo;melhor&rdquo; dever&aacute; ser aplicado em situa&ccedil;&otilde;es controladas, ent&atilde;o a maneira que decidi desenvolver este artigo foi expondo cen&aacute;rios espec&iacute;ficos e fazendo um exerc&iacute;cio mental sobre qual tecnologia se enquadra melhor.</p>\r\n\r\n<p>Se a sua situa&ccedil;&atilde;o n&atilde;o se aplica a nenhuma delas (o que provavelmente ser&aacute; a maioria) tente replicar a mesma l&oacute;gica de pensamento, talvez isso te ajude a chegar em uma decis&atilde;o final.</p>\r\n\r\n<p>&ldquo;Tenho um website sem muitas fun&ccedil;&otilde;es interativas com seus usu&aacute;rios, n&atilde;o tenho experi&ecirc;ncia com desenvolvimento para mobile, e j&aacute; trabalho com Web&rdquo;.</p>\r\n\r\n<p>Este &eacute; um t&iacute;pico caso que ocorre com v&aacute;rios desenvolvedores web, e na maioria das vezes o foco aqui, n&atilde;o ser&aacute; coisas como performance e complexidade de fun&ccedil;&otilde;es dentro do software, mas sim entregar um resultado controlado e se poss&iacute;vel em um prazo r&aacute;pido.</p>\r\n\r\n<p>Um bom exemplo disso &eacute; quando uma empresa possui CRM e pede ao seus Engenheiros de Softwares respons&aacute;veis para fazer um App que permita a seus clientes acompanharem o andamento da entrega de seus produtos.</p>\r\n\r\n<p>Veja que n&atilde;o estamos falando de nada muito &ldquo;complexo&rdquo; dentro da regra total do neg&oacute;cio, mas que precisa ser feito.</p>\r\n\r\n<p>Acho que pensar em uma ferramenta como o Ionic te ajude nessa situa&ccedil;&atilde;o, pois j&aacute; temos uma experi&ecirc;ncia pr&eacute;via em web e o foco atual da equipe n&atilde;o &eacute;, e n&atilde;o ser&aacute; no desenvolvimento para mobile, e j&aacute; existe uma solu&ccedil;&atilde;o pr&eacute;-existente.</p>\r\n\r\n<p>Assim podemos ver que quando pensamos em entrega de valor, de forma r&aacute;pida e sem grandes investimentos ou curva de aprendizagem, o Ionic se sai muito bem.</p>\r\n\r\n<p>Mas quer dizer que &eacute; o &uacute;nico? De maneira alguma! Mas preciso me dar essa licen&ccedil;a po&eacute;tica de escolher se quero que este texto fa&ccedil;a algum sentido para seu problema de escolha.</p>\r\n\r\n<p>&ldquo;Minha empresa j&aacute; possui solu&ccedil;&otilde;es em softwares, e agora quer levar estas mesmas solu&ccedil;&otilde;es para o desenvolvimento mobile&rdquo;.</p>\r\n\r\n<p>Aqui temos uma situa&ccedil;&atilde;o um pouco mais abrangente e provavelmente v&aacute;rias outras respostas, mas lembro que isso &eacute; um exerc&iacute;cio mental e voc&ecirc; tamb&eacute;m pode faz&ecirc;-lo dentro do seu universo de trabalho.</p>\r\n\r\n<p>Como experi&ecirc;ncia pr&oacute;pria eu mesmo passei por esta situa&ccedil;&atilde;o, onde j&aacute; existe um modelo de neg&oacute;cio validado e que buscava se expandir, nesse ponto, devemos colocar em pauta v&aacute;rios fatores como:</p>\r\n\r\n<ul>\r\n	<li>Quais as stacks de seus programadores?</li>\r\n	<li>Como foram desenvolvidas as solu&ccedil;&otilde;es atuais?</li>\r\n	<li>Ser&aacute; necess&aacute;rio contratar novos colegas de trabalho?</li>\r\n	<li>Investimento?</li>\r\n	<li>Tempo?</li>\r\n</ul>\r\n\r\n<p>E por a&iacute; vai&hellip;</p>\r\n\r\n<p>Mas aqui vou tomar todos esses pontos como cr&iacute;ticos e vou apontar para o React-Native, isso por que, estamos falando de uma solu&ccedil;&atilde;o que das 3, &eacute; a mais conceituada, trabalha com uma linguagem de programa&ccedil;&atilde;o muito disseminada em nossa &aacute;rea (Javascript) e assim, termos uma oferta de m&atilde;o de obra e comunidade muito grande a nossa disposi&ccedil;&atilde;o.</p>\r\n\r\n<p>Isso permite uma redu&ccedil;&atilde;o de riscos e proje&ccedil;&otilde;es mais coerentes para o futuro destes projetos.</p>\r\n\r\n<p>&ldquo;Tudo &eacute; novo, novo neg&oacute;cio, novo produto, novos conceitos&rdquo;.</p>\r\n\r\n<p>Agora vamos colocar a situa&ccedil;&atilde;o onde queremos iniciar com tudo neste cen&aacute;rio.</p>\r\n\r\n<p>Apresentar atualidade, modernidade e protagonismo &eacute; muito importante, principalmente falando de tecnologia.</p>\r\n\r\n<p>Vale lembrar que vou tirar o quesito &ldquo;investimento&rdquo; dessa equa&ccedil;&atilde;o, imaginando que estamos em um cen&aacute;rio perfeito.</p>\r\n\r\n<p>Neste caso, pensar no Flutter faz bastante sentido, pois n&atilde;o &eacute; precipitado dizer que das 3 solu&ccedil;&otilde;es aqui, &eacute; a que tem um crescimento maior de comunidade e ades&atilde;o, e est&aacute; muito ligada ao mundo de Startups.</p>\r\n\r\n<p>Neste ponto muito provavelmente teremos uma significativa curva de aprendizado da equipe, ou raras &ndash; e caras &ndash; contrata&ccedil;&otilde;es pontuais de profissionais bem capacitados.</p>\r\n\r\n<p>Mas a longo prazo, teremos uma solu&ccedil;&atilde;o moderna, mais perform&aacute;tica, e que pode ser a tend&ecirc;ncia futura do mercado.</p>\r\n\r\n<p>Agora voc&ecirc; pode pensar:</p>\r\n\r\n<p>&ldquo;Mas a minha situa&ccedil;&atilde;o? N&atilde;o se aplica a nenhum destes cen&aacute;rios de desenvolvimento para mobile e ainda tenho d&uacute;vida de qual escolher!&rdquo;.</p>\r\n\r\n<p>Bom, agora voc&ecirc; vai precisar estudar e conversar bastante, ver pontos cr&iacute;ticos do seu neg&oacute;cio, como tempo, investimento, risco, mercado, engajamento etc.</p>\r\n\r\n<p>E ainda sim pode ser poss&iacute;vel que voc&ecirc; encontre mais de uma solu&ccedil;&atilde;o poss&iacute;vel. Neste ponto, &ldquo;perder&rdquo; um tempo fazendo&nbsp;<em>Hello World</em>&nbsp;pode ser interessante e provavelmente vai ajudar na sua decis&atilde;o.</p>\r\n\r\n<h2>Pronto, j&aacute; escolhi, mas e se eu me arrepender?</h2>\r\n\r\n<p>Lembre-se sempre que estamos falando de tecnologia, e mais especificamente de programa&ccedil;&atilde;o, onde ferramentas oscilam o tempo todo em nosso universo.</p>\r\n\r\n<p>E se voc&ecirc; j&aacute; est&aacute; no universo Cross Platform, pode se sentir sortudo, pois mesmo que tenha que mudar de estrat&eacute;gia no meio do caminho, voc&ecirc; ainda pode precisar de um investimento final de esfor&ccedil;os menor que projetos feitos de forma nativa.</p>\r\n\r\n<p>E nem sempre tudo que voc&ecirc; j&aacute; fez est&aacute; perdido, pois v&aacute;rias decis&otilde;es sobre como o produto final deve funcionar j&aacute; foram tomadas, e agora &eacute; s&oacute; botar a m&atilde;o na massa!</p>\r\n\r\n<p>Espero que este artigo tenha sido mais uma ferramenta &uacute;til para ajudar na sua decis&atilde;o, e sempre lembrando que experimentar, testar e voltar atr&aacute;s, s&atilde;o rotinas deste mundo em que vivemos, e quanto mais experimentamos op&ccedil;&otilde;es, menos d&uacute;vidas temos de qual &eacute; a ideal para o nosso caso.</p>\r\n',1,'2020-11-22 00:41:03',NULL);
  /*!40000 ALTER TABLE `post` ENABLE KEYS */;
  UNLOCK TABLES;
  
  --
  -- Table structure for table `projeto`
  --
  
  DROP TABLE IF EXISTS `projeto`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `projeto` (
    `idProjeto` int(11) NOT NULL AUTO_INCREMENT,
    `idCategoria` int(11) NOT NULL,
    `nome` varchar(100) NOT NULL,
    `detalhes` text NOT NULL,
    `cliente` varchar(100) NOT NULL,
    `dataProjeto` date NOT NULL,
    `thumbnail` varchar(100) NOT NULL,
    PRIMARY KEY (`idProjeto`),
    KEY `idCategoria_idx` (`idCategoria`),
    CONSTRAINT `idCategoria_projeto` FOREIGN KEY (`idCategoria`) REFERENCES `categoria` (`idCategoria`) ON UPDATE CASCADE
  ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
  /*!40101 SET character_set_client = @saved_cs_client */;
  
  --
  -- Dumping data for table `projeto`
  --
  
  LOCK TABLES `projeto` WRITE;
  /*!40000 ALTER TABLE `projeto` DISABLE KEYS */;
  INSERT INTO `projeto` VALUES (1,2,'Website Good Plate','<p>Um empreendedor da &aacute;rea da gastronomia nos procurou para criar uma plataforma que conectasse seus chefs e clientes.&nbsp;Suas necessidades eram espec&iacute;ficas: aumentar as reservas e melhorar a comunica&ccedil;&atilde;o com seus clientes.&nbsp;</p>\r\n\r\n<p>As tecnologias escolhidas para o back-end foram <strong>PHP e&nbsp;MySQL</strong>, visto que era necess&aacute;ria uma constru&ccedil;&atilde;o r&aacute;pida e simples. J&aacute; o front-end foi escolhido o framework CSS mais popular:<strong> Bootstrap 4</strong>.</p>\r\n','Restaurante Good Plate','2020-11-27','FireShot Capture 003 - Good Plate - Home - restaurante.png'),(2,2,'Plataforma Gama Academy Experience','<p>Em 2016 a Gama Academy era uma startup em est&aacute;gio inicial, com a ideia de construir um programa que ajuda no desenvolvimento e aperfei&ccedil;oamento das habilidades mais requisitadas pelo Mercado Digital.</p>\r\n\r\n<p>Para o desenvolvimento do software, montamos um time com dedica&ccedil;&atilde;o total a Gama Academy. Utilizamos m&eacute;todo &aacute;gil de desenvolvimento, realizando sprints de duas semanas que contaram com a participa&ccedil;&atilde;o total dos fundadores da plataforma &ndash; nos refinamentos, plannings e reviews.</p>\r\n','Gama Academy','2020-11-20','FireShot Capture 015 - Gama Experience - Gama Academy - gama.academy.png'),(3,1,'Aplicativo fÃ©ria','<p>O F&Eacute;RIA &eacute; um aplicativo de monitoramento e controle que, por meio de sensores instalados em ve&iacute;culos, capta e transmite informa&ccedil;&otilde;es sobre corridas, atividades e faturamento. Ele &eacute; um produto da SOHA, startup fundada em 2014 que une software e hardware com o objetivo de aplicar IoT nos meios de transporte.&nbsp;</p>\r\n\r\n<p>Por meio da Consultoria em UX Design, realizamos a an&aacute;lise heur&iacute;stica e o levantamento e interpreta&ccedil;&atilde;o dos dados colhidos, mapeamos as novas jornadas e, juntamente com a SOHA, identificamos oportunidades de melhoria para o produto. Estabelecemos um novo Design System para a aplica&ccedil;&atilde;o e, com base nele, desenhamos as interfaces e seus respectivos comportamentos, com foco na experi&ecirc;ncia de uso adequada para as personas do app.</p>\r\n\r\n<p>Ap&oacute;s a Consultoria, evolu&iacute;mos para a etapa de Desenvolvimento de Software, pensando em performance e qualidade. Ao validar a ader&ecirc;ncia do seu p&uacute;blico, a SOHA optou pelo <strong>desenvolvimento nativo Android</strong>, e a linguagem escolhida foi <strong>Kotlin </strong>com componentes do Jetpack da Google.</p>\r\n','SOHA','2015-01-04','FERIA.PNG');
  /*!40000 ALTER TABLE `projeto` ENABLE KEYS */;
  UNLOCK TABLES;
  
  --
  -- Table structure for table `quemsomos`
  --
  
  DROP TABLE IF EXISTS `quemsomos`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `quemsomos` (
    `idQuemSomos` int(11) NOT NULL AUTO_INCREMENT,
    `bio` mediumtext NOT NULL,
    `link` varchar(255) NOT NULL,
    `subtitulo` varchar(100) NOT NULL,
    `principios` mediumtext NOT NULL,
    `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0: Inativo\\n1: Ativo',
    PRIMARY KEY (`idQuemSomos`)
  ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  /*!40101 SET character_set_client = @saved_cs_client */;
  
  --
  -- Dumping data for table `quemsomos`
  --
  
  LOCK TABLES `quemsomos` WRITE;
  /*!40000 ALTER TABLE `quemsomos` DISABLE KEYS */;
  INSERT INTO `quemsomos` VALUES (1,'<p>Atuamos na concep&ccedil;&atilde;o, desenvolvimento e consultoria de aplicativos, plataformas e sistemas. <strong>Design, agilidade e tecnologia</strong> nos permitem apoiar a inova&ccedil;&atilde;o, a transforma&ccedil;&atilde;o digital de empresas, e auxiliar startups e scale-ups na constru&ccedil;&atilde;o e sustenta&ccedil;&atilde;o de seus produtos e servi&ccedil;os digitais.</p>\r\n','https://www.youtube.com/embed/I3PPNigNULs','Entenda como integramos Design, Agilidade e Tecnologia no nosso processo.','<h2>Concep&ccedil;&atilde;o</h2>\r\n\r\n<p>Idea&ccedil;&atilde;o</p>\r\n\r\n<p>Voc&ecirc; nos conta a sua ideia e juntos aplicamos t&eacute;cnicas de Design Thinking para identificar as d&uacute;vidas e hip&oacute;teses sobre o produto ou servi&ccedil;o proposto.</p>\r\n\r\n<p>Pesquisa</p>\r\n\r\n<p>Considerando as hip&oacute;teses identificadas, ajudamos a planejar e conduzir pesquisas para que voc&ecirc; entenda melhor o universo da sua solu&ccedil;&atilde;o (usu&aacute;rios, concorrentes e mercado).</p>\r\n\r\n<p>Proposi&ccedil;&atilde;o de valor</p>\r\n\r\n<p>Com os dados em m&atilde;os, cocriaremos a Proposi&ccedil;&atilde;o de Valor e o Modelo de Neg&oacute;cio. Eles definem p&uacute;blico-alvo, diferenciais e estrat&eacute;gia de receita.</p>\r\n\r\n<p>Jornadas e prot&oacute;tipos</p>\r\n\r\n<p>Nesta etapa, detalhamos as personas e jornadas para criar prot&oacute;tipos de baixa fidelidade com objetivo de ilustrar a solu&ccedil;&atilde;o digital proposta e suas principais funcionalidades.</p>\r\n\r\n<p>Defini&ccedil;&atilde;o de tecnologia</p>\r\n\r\n<p>Chegou o momento de escolher tecnologias, plataformas e frameworks necess&aacute;rios &agrave; solu&ccedil;&atilde;o. Crit&eacute;rios como compatibilidade, performance e investimento s&atilde;o considerados.</p>\r\n\r\n<p>Planejamento do MVP</p>\r\n\r\n<p>Por fim, planejamos juntos a constru&ccedil;&atilde;o do M&iacute;nimo Produto Vi&aacute;vel, o MVP. Pensamos o desenvolvimento priorizando, de forma estrat&eacute;gica, a lista de funcionalidades.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Da ideia ao software</h2>\r\n\r\n<p>O resultado da Concep&ccedil;&atilde;o re&uacute;ne o conceito do servi&ccedil;o ou produto digital, a defini&ccedil;&atilde;o das suas funcionalidades, tecnologias e o planejamento do seu desenvolvimento. Ele &eacute; entregue a voc&ecirc; e a nossa equipe est&aacute; pronta para iniciar o Desenvolvimento de Software.</p>\r\n\r\n<p>O Desenvolvimento de Software &eacute; realizado em ciclos de tempo fixo, normalmente de duas semanas, chamados de Sprints. A cada Sprint, uma lista de itens &eacute; priorizada, constru&iacute;da e entregue.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Desenvolvimento de software</h2>\r\n\r\n<p>Refinamento</p>\r\n\r\n<p>A Sprint de Descoberta come&ccedil;a com o refinamento, no qual discutimos com voc&ecirc; os itens mais importantes do backlog, definindo os crit&eacute;rios de aceita&ccedil;&atilde;o.</p>\r\n\r\n<p>Design de intera&ccedil;&atilde;o</p>\r\n\r\n<p>Em seguida, aprofundamos jornadas e fluxos de uso para planejar e definir a intera&ccedil;&atilde;o do usu&aacute;rio com o produto ou servi&ccedil;o digital.</p>\r\n\r\n<p>Design de interface</p>\r\n\r\n<p>Nesta etapa, desenhamos os prot&oacute;tipos de alta fidelidade, considerando hierarquia visual, usabilidade, tipografia, cores e formas.</p>\r\n\r\n<p>Valida&ccedil;&atilde;o</p>\r\n\r\n<p>Para fechar a Sprint, validamos os itens descritos e as interfaces com voc&ecirc; e o time do projeto, a fim de criar uma lista de itens refinados para utilizar na Sprint de Entrega.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Sprint de Entrega</h2>\r\n\r\n<p>Sprint planning</p>\r\n\r\n<p>A Sprint de Entrega come&ccedil;a com uma reuni&atilde;o de planejamento, na qual definimos com voc&ecirc; a lista de itens que ser&atilde;o priorizados e desenvolvidos.</p>\r\n\r\n<p>Programa&ccedil;&atilde;o</p>\r\n\r\n<p>A seguir, escrevemos o c&oacute;digo aplicando os crit&eacute;rios de aceita&ccedil;&atilde;o com base nas interfaces j&aacute; definidas. O c&oacute;digo desenvolvido &eacute;, ent&atilde;o, revisado por outros programadores.</p>\r\n\r\n<p>Teste</p>\r\n\r\n<p>&Agrave; medida que os itens ficam prontos, eles s&atilde;o verificados por meio de testes funcionais. Esse processo garante o bom funcionamento e performance do software.</p>\r\n\r\n<p>Sprint review</p>\r\n\r\n<p>Depois de prontas, as funcionalidades desenvolvidas na Sprint s&atilde;o apresentadas a voc&ecirc;, que nos fornece feedback para o pr&oacute;ximo ciclo de Desenvolvimento de Software.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Sustenta&ccedil;&atilde;o e evolu&ccedil;&atilde;o</h2>\r\n\r\n<p>Ap&oacute;s alguns ciclos de Desenvolvimento, o MVP da solu&ccedil;&atilde;o digital &eacute; lan&ccedil;ado. Com o software no ar, trabalhamos na sustenta&ccedil;&atilde;o: suporte, apoio na resolu&ccedil;&atilde;o de problemas e manuten&ccedil;&atilde;o preventiva.<br />\r\nAl&eacute;m disso, a partir dos dados de uso do software, formulamos novas hip&oacute;teses e as validamos por meio de testes com usu&aacute;rios, promovendo assim a melhoria cont&iacute;nua do produto ou servi&ccedil;o. Seguimos realizando Sprints de evolu&ccedil;&atilde;o com o objetivo de publicar novas vers&otilde;es a cada duas semanas.</p>\r\n',1);
  /*!40000 ALTER TABLE `quemsomos` ENABLE KEYS */;
  UNLOCK TABLES;
  
  --
  -- Table structure for table `usuario`
  --
  
  DROP TABLE IF EXISTS `usuario`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `usuario` (
    `idUsuario` int(11) NOT NULL AUTO_INCREMENT,
    `nome` varchar(100) NOT NULL,
    `email` varchar(100) NOT NULL,
    `senha` varchar(255) NOT NULL,
    `login` varchar(50) NOT NULL,
    `tipo` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0: Administrador\\n1: Usuário comum (Criador de conteúdo)',
    `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0: Inativo\\n1: Ativo\\n2: Bloqueado\\n',
    `novaSenha` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`idUsuario`)
  ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  /*!40101 SET character_set_client = @saved_cs_client */;
  
  --
  -- Dumping data for table `usuario`
  --
  
  LOCK TABLES `usuario` WRITE;
  /*!40000 ALTER TABLE `usuario` DISABLE KEYS */;
  INSERT INTO `usuario` VALUES (1,'Administrador','admin@startup.com.br','$2y$10$Xj9xf2FqQ7oG6.moIw5/suBWwrddaSfouAVLqF6EvWmrigewblU8i','admin',1,1,'$2y$10$grvP9tpVBT.LiNFUXy0Xbe1YMckWCSiRcbSiBG4l01h2pQ8MuO5RK'),(2,'Esther Monique Barros Peixoto','estherpeixoto13@gmail.com','$2y$10$NBD1Y95Cr3N0gIy5P5nMTuC/bYpOtNGjbVYWT116heriJyv.C7p3.','estherpeixoto',2,1,NULL);
  /*!40000 ALTER TABLE `usuario` ENABLE KEYS */;
  UNLOCK TABLES;
  
  --
  -- Dumping events for database 'startup'
  --
  
  --
  -- Dumping routines for database 'startup'
  --
  /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
  
  /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
  
  -- Dump completed on 2020-11-22 18:28:44
  