<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquitetura de Software &#8211; BossaBox</title>
	<atom:link href="https://blog.bossabox.com/category/arquitetura-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.bossabox.com</link>
	<description></description>
	<lastBuildDate>Mon, 11 Nov 2024 15:49:33 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.5</generator>

<image>
	<url>https://blog.bossabox.com/wp-content/uploads/2023/09/cropped-android-chrome-256x256-1-32x32.png</url>
	<title>Arquitetura de Software &#8211; BossaBox</title>
	<link>https://blog.bossabox.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DX (Developer Experience) &#8211; Maximizando a produtividade do desenvolvedor</title>
		<link>https://blog.bossabox.com/dx-developer-experience-maximizando-produtividade-do-desenvolvedor/</link>
					<comments>https://blog.bossabox.com/dx-developer-experience-maximizando-produtividade-do-desenvolvedor/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[blogadmin]]></dc:creator>
		<pubDate>Thu, 21 Sep 2023 18:29:16 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Cultura de Produto]]></category>
		<category><![CDATA[Desenvolvimento e Tecnologia]]></category>
		<guid isPermaLink="false">https://blog.bossabox.com/?p=3255</guid>

					<description><![CDATA[<p>O que é experiência do desenvolvedor (DX)? DX ou DevEx é sobre analisar todos os componentes do ecossistema da pessoa desenvolvedora — do ambiente aos fluxos de trabalho e ferramentas — e busca entender como eles estão contribuindo para a produtividade, a satisfação e o impacto operacional dos desenvolvedores. Com o DevEx, todos os aspectos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/dx-developer-experience-maximizando-produtividade-do-desenvolvedor/">DX (Developer Experience) &#8211; Maximizando a produtividade do desenvolvedor</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><b>O que é experiência do desenvolvedor (DX)?</b></p>
<p><span style="font-weight: 400;">DX ou DevEx é sobre analisar todos os componentes do ecossistema da pessoa desenvolvedora — do ambiente aos fluxos de trabalho e ferramentas — e busca entender como eles estão contribuindo para a produtividade, a satisfação e o impacto operacional dos desenvolvedores.</span></p>
<p><span style="font-weight: 400;">Com o DevEx, todos os aspectos da jornada de um desenvolvedor são questionados.</span></p>
<p><span style="font-weight: 400;"><a href="https://bossabox-blog-uploads.s3.sa-east-1.amazonaws.com/blog/wp-content/uploads/2023/09/21145541/image2-1.webp"><img decoding="async" fetchpriority="high" class="wp-image-3256 aligncenter" src="https://blog.bossabox.com/wp-content/uploads/2023/09/image2-1.webp" alt="" width="902" height="312" srcset="https://blog.bossabox.com/wp-content/uploads/2023/09/image2-1.webp 700w, https://blog.bossabox.com/wp-content/uploads/2023/09/image2-1-300x104.webp 300w" sizes="(max-width: 902px) 100vw, 902px" /></a></span></p>
<p><strong>C = Colaboração, o multiplicador em todo o DevEx.</strong><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">A fórmula DevEx do GitHub leva em consideração:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Produtividade:</strong> com que rapidez e simplicidade uma alteração pode ser feita em uma base de código</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Impacto:</strong> quão fácil é passar da ideia à produção</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Satisfação:</strong> como o ambiente, os fluxos de trabalho e as ferramentas afetam a felicidade do desenvolvedor</span></li>
</ul>
<p><span style="font-weight: 400;"><strong>Otimizar o DevEx</strong> significa criar um ambiente colaborativo que permita aos <strong>desenvolvedores aumentarem sua produtividade</strong>, <strong>impacto</strong> e <strong>satisfação</strong>.</span></p>
<h2 data-sourcepos="3:1-3:51"><strong>Impacto na minha experiência como desenvolvedor</strong></h2>
<p data-sourcepos="5:1-5:184">Há 18 anos, iniciei minha trajetória como desenvolvedor e, fazendo um<strong> recap </strong>da minha atuação hoje, tenho consciência de como <strong>DX</strong> impactou diretamente na minha <strong>produtividade:</strong></p>
<ul data-sourcepos="7:1-8:0">
<li data-sourcepos="7:1-8:0"><strong>Eficiência, tempo de foco:</strong></li>
</ul>
<p data-sourcepos="9:1-9:421">Trabalhei em empresas onde meu trabalho normal era interrompido regularmente, e me sentia muito improdutivo. Não conseguia entrar no tal do &#8220;flow&#8221; do desenvolvedor. Basicamente, o time de tech tinha muita cobrança das outras áreas (a pergunta recorrente era &#8220;quando isso vai ser entregue&#8221;), com pouco tempo de foco, porque grande parte do tempo era desperdiçada com reuniões desnecessárias ou pouco objetivas.</p>
<ul data-sourcepos="11:1-12:0">
<li data-sourcepos="11:1-12:0"><strong>Produção, monitoramento:</strong></li>
</ul>
<p data-sourcepos="13:1-13:283">Em outra experiência, tínhamos um produto com muitos usuários em produção. Existia uma cobrança exagerada para ter um tempo de resposta rápido, considerando o <strong><a href="https://kodus.io/o-que-e-mean-time-to-recover-dora-metrics/">MTTR (Mean Time To Recover) do DORA</a></strong>, mas, na prática, por mais que me esforçasse, não conseguia atingir as expectativas.</p>
<p data-sourcepos="15:1-15:262">Quando existia um incidente, não tinha confiança de que conseguiríamos resolvê-lo rapidamente. Não tínhamos um bom sistema de logs e o que tínhamos estava espalhado em múltiplas ferramentas e não nos dizia realmente qual era a causa raiz do problema.</p>
<p data-sourcepos="15:1-15:262"><strong>VEJA TAMBÉM:</strong> <a href="https://bit.ly/3s5PcXR">Checklist &#8211; sinais de uma squad de alta performance</a></p>
<ul data-sourcepos="7:1-8:0">
<li data-sourcepos="7:1-8:0"><strong>Implantações e versionamento:</strong></li>
</ul>
<p data-sourcepos="9:1-9:242">Esse é outro problema que gerava fricção. A cobertura de testes era algo essencial, mas a eficácia dos mesmos era muito baixa. Basicamente, o time fazia os testes para passarem de qualquer forma e deixar o indicador sempre alto.</p>
<p data-sourcepos="11:1-11:261">Tínhamos também um problema em fazer deploy. Era sempre uma demora excessiva para passar todas as etapas da nossa pipeline (tinha que esperar 20 minutos) em cada deploy. Imagina em um time de quase 100 desenvolvedores, o quanto isso é improdutivo.</p>
<ul data-sourcepos="7:1-8:0">
<li data-sourcepos="7:1-8:0"><strong>Colaboração e conhecimento:</strong></li>
</ul>
<p data-sourcepos="9:1-9:242">Nosso time passava pouco tempo aprendendo com nossos erros e falando sobre esses problemas que geravam fricção.</p>
<p>Exemplos:  &#8220;Nosso processo de revisão de código nos ajuda a fazer uma release de código melhor?&#8221;<br />
ou &#8220;Nossa documentação realmente ajuda no onboarding dos novos desenvolvedores?&#8221;</p>
<ul>
<li><strong>Codebase:</strong></li>
</ul>
<p><span style="font-weight: 400;">Era muito difícil encontrar a causa raiz dos incidentes porque nossa codebase tinha uma baixa qualidade. Muita coisa precisava ser refatorada, mas tarefas de refatoração nunca eram consideradas prioridade.</span></p>
<ul>
<li><span style="font-weight: 400;"><strong>Planejamento do projeto, processos de equipe</strong>:</span></li>
</ul>
<p><span style="font-weight: 400;">Em outra experiência, o time de tecnologia tinha a fama de &#8220;sempre atrasar&#8221; porque nunca conseguíamos dar vazão às tarefas planejadas.</span></p>
<p><span style="font-weight: 400;">O que ninguém via é que as tarefas eram mal escritas, o que nos levava a gastar muito tempo tirando dúvidas e os objetivos nunca eram realmente claros. Não era perceptível que nosso trabalho gerava valor para o negócio.</span></p>
<ul>
<li><strong>Produtividade percebida:</strong></li>
</ul>
<p><span style="font-weight: 400;">Levantando todos os pontos acima, o que fica claro na minha experiência é que havia muita cobrança sobre &#8220;ser produtivo&#8221; e pouca reflexão sobre &#8220;o quão produtivo eu me sentia&#8221; e sobre &#8220;o que reduziria o atrito no meu trabalho diário&#8221;.</span></p>
<p><span style="font-weight: 400;">Isso é sobre DX. Antes de olhar apenas para métricas, pergunte para o seu time qual o ponto de vista deles sobre produtividade. Os desenvolvedores não tem motivos para mentir sobre o que vai tornar o dia a dia deles mais produtivo e você pode trabalhar em direção a isso (ao menos reservar um tempo para isso). </span></p>
<h2 data-sourcepos="11:1-11:261"><b>Pesquisas</b></h2>
<p><a href="https://humanitec.com/blog/key-findings-from-forrester-opportunity-snapshot"><span style="font-weight: 400;">De acordo com um levantamento de oportunidades da Forrester</span></a><span style="font-weight: 400;"> , as equipes podem reduzir o tempo de lançamento no mercado e aumentar a receita criando uma maneira mais fácil para os desenvolvedores escreverem códigos, criarem software e enviarem atualizações aos clientes. Como resultado da melhoria do DevEx:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">74% dos entrevistados disseram que podem aumentar a produtividade do desenvolvedor</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">77% podem reduzir o tempo de lançamento no mercado</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">85% podem impactar o crescimento da receita</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">75% conseguem atrair e reter mais clientes</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">82% podem aumentar a satisfação do cliente</span></li>
</ul>
<p><a href="https://github.com/gmondello"><span style="font-weight: 400;">Greg Mondello</span></a><span style="font-weight: 400;">, do GitHub, diz que não é surpresa que a DevEx tenha visto um aumento significativo no investimento nos últimos cinco anos.</span></p>
<p><span style="font-weight: 400;">“Na maioria dos contextos, a<strong> capacidade de desenvolvimento de software é o fator limitante da inovação</strong>”, afirma. “Portanto, melhorias na eficácia do desenvolvimento de software são inerentemente valiosas.”</span></p>
<p><span style="font-weight: 400;">Além disso, o desenvolvimento está cada vez mais complexo. A construção de software hoje envolve muitas ferramentas, tecnologias e serviços de diferentes fornecedores, o que exige que os desenvolvedores gerenciem ambientes muito mais complexos.</span></p>
<p><span style="font-weight: 400;">Na melhor das hipóteses, um DevEx bem concebido fornece maior consistência entre ambientes, processos e fluxos de trabalho, ao mesmo tempo que automatiza os processos mais tediosos e manuais.</span></p>
<p><span style="font-weight: 400;">“Isso permite que empresas com melhor DevEx superem seus concorrentes, independentemente da vertical”, diz Mondello.</span></p>
<h2><b>O que constitui uma boa experiência para o desenvolvedor?</b></h2>
<p><span style="font-weight: 400;"><strong>Um bom DevEx</strong> é onde os <strong>desenvolvedores têm as informações de que precisam e podem alternar entre o foco e a colaboração</strong>.</span></p>
<p><span style="font-weight: 400;">Os desenvolvedores enfrentam muitos tipos de atrito durante seu fluxo de trabalho de ponta a ponta, especialmente se estiverem usando várias ferramentas. De reuniões a solicitações e muitos outros tipos de interrupções, os desenvolvedores muitas vezes precisam reunir o contexto de fontes fragmentadas e desatualizadas, o que prejudica sua capacidade de serem produtivos e escreverem códigos de alta qualidade.</span></p>
<p><span style="font-weight: 400;">Embora descrever os componentes exatos possa ser complicado, os especialistas concordam que um DevEx forte abrange o seguinte:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Colaboração</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Velocidade</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ciclos curtos de feedback</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Altos graus de automação e integração</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Baixos níveis de atrito ou trabalho</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Processos transparentes e bem documentados</span></li>
</ul>
<h2><b>Quais são as principais métricas de experiência do desenvolvedor?</b></h2>
<p><span style="font-weight: 400;">Não existem métricas padronizadas do setor para medir o DevEx. No entanto, tem uma correlação direta com </span><a href="https://github.com/dora-team/fourkeys"><span style="font-weight: 400;">DevOps Research and Assessment (DORA)</span></a><span style="font-weight: 400;">, que olha as boas práticas da cultura DevOps.</span></p>
<p><span style="font-weight: 400;">Dentro do estudo de <a href="https://blog.bossabox.com/como-avaliar-performance-de-equipes-de-engenharia-de-software-com-metricas-chave-conheca-as-dora-metrics/">DORA metrics</a>, você tem as boas práticas de tech capabilities que são preditivas da performance da entrega de software (Lead time for change, Deploy Frequency, Failure Rate e Time to Restore Service).</span></p>
<p><a href="https://bossabox-blog-uploads.s3.sa-east-1.amazonaws.com/blog/wp-content/uploads/2023/09/21152229/Captura-de-Tela-2023-09-21-as-15.22.23.png"><img decoding="async" class="alignleft wp-image-3257" src="https://blog.bossabox.com/wp-content/uploads/2023/09/Captura-de-Tela-2023-09-21-as-15.22.23.png" alt="" width="778" height="441" srcset="https://blog.bossabox.com/wp-content/uploads/2023/09/Captura-de-Tela-2023-09-21-as-15.22.23.png 1204w, https://blog.bossabox.com/wp-content/uploads/2023/09/Captura-de-Tela-2023-09-21-as-15.22.23-300x170.png 300w, https://blog.bossabox.com/wp-content/uploads/2023/09/Captura-de-Tela-2023-09-21-as-15.22.23-1024x580.png 1024w, https://blog.bossabox.com/wp-content/uploads/2023/09/Captura-de-Tela-2023-09-21-as-15.22.23-768x435.png 768w" sizes="(max-width: 778px) 100vw, 778px" /></a></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Ao enviar pesquisas com foco em DX, você vai conseguir olhar para dados subjetivos que ajudam a identificar o que vai ser priorizado de Tech Capabilities (preditivo de DORA).</span></p>
<p><strong>Exemplos: </strong></p>
<p><span style="font-weight: 400;">&#8220;Meu MTTR (Mean Time To Recovery) está baixo. O DX pode nos ajudar com informações como &#8220;Os desenvolvedores têm dificuldade de encontrar logs das nossas aplicações. Precisamos priorizar nossa tech capabilities &#8220;Monitoring and Observability&#8221; . </span></p>
<p><span style="font-weight: 400;">&#8220;Lead time for change está longo. O DX pode nos ajudar com informações como &#8220;A baixa qualidade da codebase aumenta o tempo de desenvolvimento.&#8221; Precisamos priorizar nossa tech capabilities &#8220;Code maintainability&#8221; . </span></p>
<h2><b>Conclusão</b></h2>
<p><span style="font-weight: 400;"><strong>Escute seus Desenvolvedores</strong>: Antes de olhar apenas para métricas, pergunte para o seu time sobre o ponto de vista deles sobre produtividade.</span></p>
<p><span style="font-weight: 400;"><strong>Priorize</strong>: Use métricas objetivas, como DORA, para cruzar dados de pesquisa e entender o que deve ser priorizado.</span></p>
<p><span style="font-weight: 400;"><strong>Reduza o Atrito</strong>: Identifique e elimine obstáculos que diminuam a produtividade ou satisfação do time.</span></p>
<p><span style="font-weight: 400;">Quando você cruza dados qualitativos de DX, com métricas quantitativas como DORA, as chances de você identificar as falhas do seu processo são muito maiores, e uma vez identificadas, o DORA Core Model, e a própria pesquisa de DX, te darão o caminho para solucioná-las, com isso seu time estará a um passo da máxima produtividade.</span></p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/dx-developer-experience-maximizando-produtividade-do-desenvolvedor/">DX (Developer Experience) &#8211; Maximizando a produtividade do desenvolvedor</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.bossabox.com/dx-developer-experience-maximizando-produtividade-do-desenvolvedor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Construindo pontes entre visão estratégica e arquitetura: minimizando equívocos no ciclo de desenvolvimento</title>
		<link>https://blog.bossabox.com/construindo-pontes-entre-visao-estrategica-e-arquitetura-minimizando-equivocos-no-ciclo-de-desenvolvimento/</link>
					<comments>https://blog.bossabox.com/construindo-pontes-entre-visao-estrategica-e-arquitetura-minimizando-equivocos-no-ciclo-de-desenvolvimento/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[blogadmin]]></dc:creator>
		<pubDate>Mon, 04 Sep 2023 13:05:16 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Colunistas convidados]]></category>
		<guid isPermaLink="false">https://blog.bossabox.com/?p=3177</guid>

					<description><![CDATA[<p>Iniciar este artigo destacando a importância do alinhamento visão estratégica e arquitetura pode ser a abordagem mais conveniente, não é verdade? Ou então, examinar os impactos de não alcançar esse alinhamento. No entanto, permita-me retroceder um pouco e chamar a atenção para uma armadilha significativa ao tratar desse tema: a comunicação. De fato, a comunicação desempenha [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/construindo-pontes-entre-visao-estrategica-e-arquitetura-minimizando-equivocos-no-ciclo-de-desenvolvimento/">Construindo pontes entre visão estratégica e arquitetura: minimizando equívocos no ciclo de desenvolvimento</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p data-sourcepos="5:1-5:330">Iniciar este artigo destacando a importância do alinhamento visão estratégica e arquitetura pode ser a abordagem mais conveniente, não é verdade? Ou então, examinar os impactos de não alcançar esse alinhamento. No entanto, permita-me retroceder um pouco e chamar a atenção para uma armadilha significativa ao tratar desse tema: a comunicação.</p>
<p>De fato, a <strong>comunicação desempenha um papel fundamental como ponto de partida</strong> para o estabelecimento desse alinhamento<strong>.</strong> As perguntas centrais são:</p>
<ul>
<li data-sourcepos="7:1-7:527">Qual é o desenho ou fluxo de comunicação adequado para estabelecer essa sintonia?</li>
<li data-sourcepos="7:1-7:527">Será um esquema detalhado ou um plano geral (isso ajuda a definir qual é nível de detalhe que trabalhamos)?</li>
<li data-sourcepos="7:1-7:527">Os OKRs se transformarão em um documento textual e cada área se torna responsável pelas suas iniciativas?</li>
<li data-sourcepos="7:1-7:527">Será um documento elaborado colaborativamente entre as diversas áreas?</li>
</ul>
<p data-sourcepos="9:1-9:676"><strong>Esse primeiro passo desempenha um papel crucial ao definir as expectativas em relação à qualidade do alinhamento.</strong> Afinal, em teoria, todos têm acesso ao documento de alinhamento mais macro/global.</p>
<p data-sourcepos="9:1-9:676">A partir desse ponto, com a efetiva gestão da comunicação, podemos abordar o <strong>segundo desafio:</strong> como a área de produtos (ou requisitos) irá externalizar os desejos funcionais e não funcionais dos stakeholders? Isso será subentendido ou explicitamente delineado em uma seção dedicada?</p>
<p>A partir dessa clareza, a equipe de arquitetura pode compreender o panorama e <strong>elaborar uma arquitetura que atenda às necessidades</strong>, sem ser excessivamente simplista ou superdimensionada.</p>
<p data-sourcepos="9:1-9:676"><strong>LEIA TAMBÉM:</strong> <a href="https://www.linkedin.com/pulse/tamanho-do-time-x-desempenho-como-o-n%2525C3%2525BAmero-de-membros-da-equipe%3FtrackingId=TNRA5dXivEDCYca2L5iSFg%253D%253D/?trackingId=TNRA5dXivEDCYca2L5iSFg%3D%3D">Tamanho do time X desempenho: Como o número de membros da equipe pode afetar as entregas?</a></p>
<p data-sourcepos="11:1-11:707">Com esses elementos devidamente alinhados, a equipe de arquitetura pode, com base na stack de tecnologia disponível, determinar a melhor tecnologia a ser empregada na solução do problema em questão. É imperativo compreender o papel da arquitetura neste ciclo. <strong>A arquitetura não é responsável pela implementação direta, mas sim por definir o que/como será utilizado.</strong></p>
<p data-sourcepos="11:1-11:707">Nesse sentido, a<strong> integração eficaz da arquitetura</strong> no processo de desenvolvimento <strong>aumenta significativamente a produtividade</strong>. Isso evita que problemas ou não conformidades com os requisitos sejam identificados tardiamente, durante os testes de qualidade (QA), quando poderiam ter sido abordados no início do ciclo de planejamento.</p>
<p data-sourcepos="13:1-13:770">Após mais de uma década e meia de experiência no contexto ágil, percebo que ainda são cometidos erros básicos, como atropelar a sequência de ações<strong>.</strong> Lembro-me de uma frase que certa vez ouvi, que dizia algo como &#8220;<strong>o ágil permitiu que as empresas oficializassem a desorganização</strong>&#8220;. Apesar de ter testemunhado essa realidade, é lamentável, pois nada poderia estar mais distante do verdadeiro conceito ágil do que a desorganização.</p>
<p data-sourcepos="13:1-13:770"><strong>Isso ressalta a importância de enfocar a comunicação e os processos como elementos cruciais para encurtar o caminho em direção ao sucesso.</strong> Caso contrário, estaríamos apenas improvisando. Portanto, é fundamental ter consciência e planejamento para integrar esses componentes no processo, garantindo uma abordagem mais eficiente e eficaz.</p>
<p data-sourcepos="15:1-15:237">Em resumo, o alinhamento eficaz, ancorado na comunicação sólida e na compreensão precisa dos requisitos, é a bússola que guia as organizações em direção ao sucesso. Não há lugar para improvisos, apenas para estratégia e planejamento.</p>
<p data-sourcepos="15:1-15:237"><a href="https://bit.ly/488D60O"><img decoding="async" class="alignleft size-full wp-image-3191" src="https://blog.bossabox.com/wp-content/uploads/2023/09/BANNER-COLUNISTA-DANILO.png" alt="" width="1462" height="449" srcset="https://blog.bossabox.com/wp-content/uploads/2023/09/BANNER-COLUNISTA-DANILO.png 1462w, https://blog.bossabox.com/wp-content/uploads/2023/09/BANNER-COLUNISTA-DANILO-300x92.png 300w, https://blog.bossabox.com/wp-content/uploads/2023/09/BANNER-COLUNISTA-DANILO-768x236.png 768w, https://blog.bossabox.com/wp-content/uploads/2023/09/BANNER-COLUNISTA-DANILO-1024x314.png 1024w" sizes="(max-width: 1462px) 100vw, 1462px" /></a></p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/construindo-pontes-entre-visao-estrategica-e-arquitetura-minimizando-equivocos-no-ciclo-de-desenvolvimento/">Construindo pontes entre visão estratégica e arquitetura: minimizando equívocos no ciclo de desenvolvimento</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.bossabox.com/construindo-pontes-entre-visao-estrategica-e-arquitetura-minimizando-equivocos-no-ciclo-de-desenvolvimento/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como saber se minha equipe de tecnologia é de alta performance?</title>
		<link>https://blog.bossabox.com/como-saber-se-minha-equipe-e-de-alta-performance/</link>
					<comments>https://blog.bossabox.com/como-saber-se-minha-equipe-e-de-alta-performance/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[blogadmin]]></dc:creator>
		<pubDate>Thu, 18 May 2023 01:02:26 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Desenvolvimento e Tecnologia]]></category>
		<category><![CDATA[Times de Tecnologia]]></category>
		<guid isPermaLink="false">https://blog.bossabox.com/?p=3087</guid>

					<description><![CDATA[<p>Alta performance em Tecnologia: muitos líderes têm dificuldades para contratar bons profissionais e medir o desempenho das equipes. Veja o que influencia nisso e como você pode resolver esse desafio. Não é novidade que empresas enfrentam dificuldades em encontrar e manter profissionais altamente qualificados em seus times de tecnologia. Neste artigo, abordaremos o porquê desse [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/como-saber-se-minha-equipe-e-de-alta-performance/">Como saber se minha equipe de tecnologia é de alta performance?</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Alta performance em Tecnologia: muitos líderes têm dificuldades para contratar bons profissionais e medir o desempenho das equipes. Veja o que influencia nisso e como você pode resolver esse desafio.</em></p>
<p>Não é novidade que empresas enfrentam dificuldades em encontrar e manter profissionais altamente qualificados em seus times de tecnologia. Neste artigo, abordaremos o porquê desse cenário difícil de contratar profissionais de tecnologia certos para seu desafio e como medir e potencializar o desempenho da sua equipe de Produto e Tecnologia.</p>
<h2><strong><span class="discussion-id-0067dba7-578d-493d-8312-a900b128c700 notion-enable-hover" data-token-index="0">Por que é tão difícil contratar profissionais de tecnologia de alta performance?</span></strong></h2>
<p>Há várias razões pelas quais é difícil contratar profissionais de tecnologia de alta performance. Uma delas é a falta de profissionais qualificados no mercado. Segundo dados da Associação das Empresas de Tecnologia da Informação e Comunicação e de Tecnologias Digitais, a projeção é, até 2025, um <a href="https://brasscom.org.br/estudo-da-brasscom-aponta-demanda-de-797-mil-profissionais-de-tecnologia-ate-2025/">déficit de mão de obra no mercado de tecnologia que pode chegar a 797 mil</a>.</p>
<p>Além disso, as habilidades específicas necessárias para trabalhar com tecnologia estão em constante evolução, o que significa que muitos profissionais podem não ter a experiência necessária com o seu segmento de mercado. A senioridade é um fator importante para alguns desafios específicos.</p>
<p>Outro desafio é o alto turnover em tecnologia. Profissionais de tecnologia buscam novos desafios e oportunidades com frequência, estão sempre em movimento, querem acelerar seu desenvolvimento e acompanhar as novidades do setor. A TI Inside divulgou uma pesquisa mostrando que <a href="https://tiinside.com.br/10/02/2022/mais-da-metade-dos-profissionais-de-ti-mudaria-para-o-exterior/">55% dos profissionais de tecnologia trabalhariam no exterior</a>.</p>
<p>O mercado de tecnologia é super competitivo. Por conta desse fator, muitas empresas oferecem salários altos e benefícios para atrair os melhores talentos, o que aumenta a competição.</p>
<p>Você deve saber como é difícil encontrar a pessoa certa, com as habilidades necessárias, e garantir que ela esteja com todo o contexto necessário e performando em seu potencial máximo, certo?</p>
<h2><strong><span class="discussion-id-0840fab6-4968-4c21-912b-8e7ed53563b2 notion-enable-hover" data-token-index="0">E como saber se minha equipe de tecnologia é de alta performance?</span></strong></h2>
<p>As equipes de engenharia buscam incessantemente formas de aumentar a eficiência na entrega de produtos digitais de qualidade e úteis para os usuários. Entretanto, como determinar se uma equipe de engenharia é verdadeiramente produtiva e eficiente?</p>
<p>A pesquisa <a href="https://dora.dev/">DevOps Research and Assessment (DORA)</a> analisa o desempenho da equipe em quatro áreas: entrega, tempo de espera, frequência de implantação e tempo de recuperação. Essas métricas são usadas para avaliar a eficiência da equipe de tecnologia e melhorar a entrega de software.</p>
<p>Aqui está uma explicação detalhada das DORA Metrics:</p>
<ol>
<li><strong>Deploy Frequency</strong>: frequência com que um time realiza implantações de código em produção. O <a href="https://kodus.io/medir-deployment-frequency/">objetivo desta métrica é medir a <strong>agilidade</strong></a> e capacidade da equipe em entregar valor aos usuários através de atualizações e melhorias no software. Uma maior frequência de implantação geralmente indica que a equipe é capaz de iterar e evoluir o software rapidamente, enquanto uma frequência menor pode indicar problemas no processo de entrega.</li>
<li><strong>Lead Time for Changes:</strong> tempo que leva desde o momento em que uma mudança no código é feita (por exemplo, um commit) até sua implantação bem-sucedida em produção. O objetivo dessa métrica é avaliar a <strong>velocidade</strong> com que uma equipe consegue entregar valor aos usuários, incorporando novas funcionalidades ou corrigindo problemas. Um menor lead time geralmente indica um processo de entrega mais eficiente e ágil.</li>
<li><strong>Change Failure Rate:</strong> proporção de implantações que resultam em falhas, como incidentes em produção ou a necessidade de reversão das mudanças. O objetivo dessa métrica é entender como as equipes de DevOps <strong>gerenciam riscos e mantêm a estabilidade e a qualidade do software</strong> durante a implantação de novas funcionalidades e correções. Uma taxa de falha menor indica um processo de entrega mais confiável e eficiente.</li>
<li><strong>Mean Time to Restore:</strong> tempo médio que leva para restaurar o serviço após uma falha, como incidentes em produção ou interrupções do sistema. O objetivo dessa métrica é entender como as equipes de DevOps lidam com <strong>problemas e incidentes no ambiente de produção</strong> e o quão eficientes são em restaurar o serviço normal. Um MTTR menor indica que a equipe é capaz de identificar, diagnosticar e solucionar problemas mais rapidamente, minimizando o impacto sobre os usuários.</li>
</ol>
<p>Ao medir essas métricas regularmente, você pode entender como a equipe de tecnologia está funcionando e onde há oportunidades para melhorias. As DORA Metrics podem ser usadas para identificar gargalos no processo de desenvolvimento e melhorar a eficiência da equipe. Temos um <a class="notion-link-token notion-focusable-token notion-enable-hover" tabindex="0" href="https://blog.bossabox.com/como-avaliar-performance-de-equipes-de-engenharia-de-software-com-metricas-chave-conheca-as-dora-metrics/" rel="noopener noreferrer" data-token-index="1"><span class="link-annotation-unknown-block-id--808618384">artigo bem detalhado</span></a> sobre <span class="discussion-id-68647bd0-7f8b-400f-9557-952debfeb1b6 notion-enable-hover" data-token-index="3">a aplicação das métricas DORA no dia a dia de times de Engenharia</span> que pode te ajudar com mais contexto.</p>
<h2><strong><span class="notion-enable-hover" data-token-index="0">A performance da equipe de Engenharia e o sucesso do Produto</span></strong></h2>
<p><span style="font-weight: 400;">A abordagem da DORA (dados objetivos), juntamente com a experiência da pessoa desenvolvedora (dados subjetivos) oferecem uma visão mais holística e equilibrada da produtividade e eficiência das equipes de engenharia. Ou seja, a conclusão é de que a eficiência e produtividade no desenvolvimento de software não podem ser medidas apenas por métricas isoladas, como quantidade de linhas de código, horas-homem ou story points. </span></p>
<p>Se quiser receber mais conteúdos sobre contratação de profissionais de tecnologia e gestão de times de alta performance, inscreva-se na nossa <span class="discussion-level-1 discussion-id-a3fbf34f-fd43-4703-ad2f-588ae09e5134 notion-enable-hover" data-token-index="1">newsletter</span> ou <a class="notion-link-token notion-focusable-token notion-enable-hover" tabindex="0" href="https://bossabox.com/" rel="noopener noreferrer" data-token-index="3"><span class="link-annotation-unknown-block-id--2009707210">acesse nosso site</span></a>.</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/como-saber-se-minha-equipe-e-de-alta-performance/">Como saber se minha equipe de tecnologia é de alta performance?</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.bossabox.com/como-saber-se-minha-equipe-e-de-alta-performance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Métricas e melhoria contínua, conheça as estratégias das squads da BossaBox</title>
		<link>https://blog.bossabox.com/metricas-e-melhoria-continua-conheca-as-estrategias-das-squads-da-bossabox/</link>
					<comments>https://blog.bossabox.com/metricas-e-melhoria-continua-conheca-as-estrategias-das-squads-da-bossabox/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[blogadmin]]></dc:creator>
		<pubDate>Tue, 18 Oct 2022 19:02:15 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Desenvolvimento e Tecnologia]]></category>
		<category><![CDATA[Times de Tecnologia]]></category>
		<guid isPermaLink="false">https://blog.bossabox.com/?p=2968</guid>

					<description><![CDATA[<p>Neste texto vamos contar um pouquinho como o time da BossaBox criou uma squad para garantir a melhoria contínua dos códigos. A squad de foundation ganhou esse nome pois é através dela que o time da BossaBox criou uma base de referência, ou seja uma fundação, para promover melhorias contínuas nos códigos. A criação dessa [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/metricas-e-melhoria-continua-conheca-as-estrategias-das-squads-da-bossabox/">Métricas e melhoria contínua, conheça as estratégias das squads da BossaBox</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><i><span style="font-weight: 400;">Neste texto vamos contar um pouquinho como o time da BossaBox criou uma squad para garantir a melhoria contínua dos códigos.</span></i></p>
<p><span style="font-weight: 400;">A squad de foundation ganhou esse nome pois é através dela que o time da BossaBox criou uma base de referência, ou seja uma fundação, para promover melhorias contínuas nos códigos. A criação dessa fundação também possibilitou que as squads de produto, em especial as(os) desenvolvedoras(es), trabalhassem com mais qualidade e eficiência.</span></p>
<p>&nbsp;</p>
<h2><b>Como ficam as métricas das squad?</b></h2>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Com o crescimento, tanto do time interno da BossaBox quanto do número de squads formadas por prolancers, detectou-se o surgimento de um </span><i><span style="font-weight: 400;">gap</span></i><span style="font-weight: 400;"> na qualidade das métricas utilizadas. </span></p>
<p><span style="font-weight: 400;">Sabendo que essa avaliação da qualidade não deveria ser feita por linha de código, ou por tempo de desenvolvimento, usou-se um estudo sobre </span><i><span style="font-weight: 400;">DORA Metrics </span></i><span style="font-weight: 400;">como fonte para essa transformação. Assim o time pode identificar exatamente qual era o problema e qual o caminho para corrigi-lo. </span></p>
<p><span style="font-weight: 400;">Primeiramente foi considerado o impacto cognitivo no código desenvolvido, em comparação com o tamanho do código versus a quantidade de locais que foram alterados, ou tecnicamente falando, o tempo do primeiro </span><i><span style="font-weight: 400;">Commit</span></i><span style="font-weight: 400;"> até o </span><i><span style="font-weight: 400;">Deploy</span></i><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">Além dessa métrica principal, outras são adicionadas para que a análise possa ser mais completa, levando em consideração as diferentes variáveis existentes na produção de um código. Isso garante que a probabilidade de se entregar valor para o cliente aumente.</span></p>
<p>&nbsp;</p>
<h2><b>Quais foram os benefícios na prática?</b></h2>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Além de aumentar o valor e qualidade final da entrega, essa alternância para uma validação </span><i><span style="font-weight: 400;">data driven</span></i><span style="font-weight: 400;"> garantiu melhorias no dia a dia de trabalho do time. Não há mais necessidade de reuniões diárias, ou de se passar horas seguidas “codando”. </span></p>
<p><span style="font-weight: 400;">Isso aconteceu pois, além de melhorias na fundação do código, houveram alterações na maneira como se é feito o refinamento técnico no time. A principal delas foi pensar que para cada entrega desenvolvida, precisa ter um entregável, por menor que seja.    </span></p>
<p><span style="font-weight: 400;">Com isso garantiu-se que as squads tenham um maior impacto cognitivo, em um menor tempo, aumentando a eficiência. Toda essa melhoria estruturada é compartilhada com os times para que a base de código esteja sempre sendo atualizada, sendo melhorada, e validada através das métricas. </span></p>
<p><span style="font-weight: 400;">Foram essas métricas e melhorias contínuas que geraram um crescimento de valor da entrega de mais de 200%, isso equivale a mais de três meses de trabalho. É agilidade, eficiência e qualidade trabalhando juntas para se obter os melhores códigos. </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Quer saber mais como a Squad Foundation funciona e como aplicamos métricas no dia-a-dia, assista esse vídeo!</span></p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/1PNdDf2E3Xg" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/metricas-e-melhoria-continua-conheca-as-estrategias-das-squads-da-bossabox/">Métricas e melhoria contínua, conheça as estratégias das squads da BossaBox</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.bossabox.com/metricas-e-melhoria-continua-conheca-as-estrategias-das-squads-da-bossabox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arquitetura de projeto node.js à prova de balas</title>
		<link>https://blog.bossabox.com/arquitetura-de-projeto-node-js-prova-de-balas/</link>
					<comments>https://blog.bossabox.com/arquitetura-de-projeto-node-js-prova-de-balas/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[blogadmin]]></dc:creator>
		<pubDate>Thu, 10 Feb 2022 14:43:07 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[Express.js]]></category>
		<category><![CDATA[JacaScrit]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[PubSub]]></category>
		<guid isPermaLink="false">https://blog.bossabox.com/?p=2823</guid>

					<description><![CDATA[<p>Arquitetura de projeto node.js à prova de balas é um artigo feito a partir de uma tradução do material que foi escrito por Sam Quinn e está disponível na página do softwareontheroad.com no seguinte link. Introdução O Express.js é um ótimo framework para criar APIs REST com node.js, mas não nos dá nenhuma pista sobre [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/arquitetura-de-projeto-node-js-prova-de-balas/">Arquitetura de projeto node.js à prova de balas</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Arquitetura de projeto node.js à prova de balas é um artigo feito a partir de uma tradução do material que foi escrito por Sam Quinn e está disponível na página do softwareontheroad.com no seguinte <a class="notion-link-token notion-enable-hover" href="https://softwareontheroad.com/ideal-nodejs-project-structure/?utm_source=reddit&amp;utm_medium=subreddit" target="_blank" rel="noopener noreferrer" data-token-index="1" data-reactroot=""><span class="link-annotation-unknown-block-id-1751348259">link</span></a>.</p>
<h2><span class="notion-enable-hover" data-token-index="0" data-reactroot="">Introdução</span></h2>
<p>O Express.js é um ótimo framework para criar APIs REST com node.js, mas não nos dá nenhuma pista sobre como organizar nossa Arquitetura de projeto.</p>
<p>Embora possa parecer simples, este é um problema real.</p>
<p>Organizar a estrutura de um projeto em node.js irá evitar a duplicação de código, irá melhorar a estabilidade e, potencialmente, ajudará você a dimensionar seus serviços se for feito da forma certa.</p>
<p><strong>LEIA TAMBÉM: </strong><a href="https://blog.bossabox.com/devs-e-ia-o-que-as-liderancas-de-tecnologia-e-produto-precisam-saber/">Impacto da IA: como os desenvolvedores estão utilizando e enxergando essa tecnologia?</a></p>
<p>Este artigo é uma extensa pesquisa dos meus anos de experiência lidando com projetos node.js mal estruturados, padrões ruins e incontáveis horas reescrevendo códigos e ajustando coisas.</p>
<h2>A Estrutura de Pastas <span class="notion-enable-hover" data-token-index="1" data-reactroot=""><span role="image" aria-label="&#x1f3e2;">&#x1f3e2;</span></span></h2>
<p>Aqui está a arquitetura do projeto node.js da qual estou falando.</p>
<p>Eu uso isso em todos os serviços de node.js REST API que crio, vamos ver em detalhes o que cada componente faz.<br />
<code>src<br />
│ app.js # App entry point<br />
└───api # Express route controllers for all the endpoints of the app<br />
└───config # Environment variables and configuration related stuff<br />
└───jobs # Jobs definitions for agenda.js<br />
└───loaders # Split the startup process into modules<br />
└───models # Database models<br />
└───services # All the business logic is here<br />
└───subscribers # Event handlers for async task<br />
└───types # Type declaration files (d.ts) for Typescript</code></p>
<p>É mais do que apenas uma maneira de ordenar arquivos javascript…</p>
<h2>Arquitetura de 3 camadas <span role="image" aria-label="&#x1f96a;">&#x1f96a;</span></h2>
<p>A ideia é usar o princípio da separação de interesses para afastar a lógica de negócios das rotas da API.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-large wp-image-2826" src="https://blog.bossabox.com/wp-content/uploads/2022/02/Untitled-19-1024x488.png" alt="Node.js Arquitetura de 3 camadas" width="1024" height="488" srcset="https://blog.bossabox.com/wp-content/uploads/2022/02/Untitled-19-1024x488.png 1024w, https://blog.bossabox.com/wp-content/uploads/2022/02/Untitled-19-300x143.png 300w, https://blog.bossabox.com/wp-content/uploads/2022/02/Untitled-19-768x366.png 768w, https://blog.bossabox.com/wp-content/uploads/2022/02/Untitled-19.png 1680w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>Porque algum dia, você vai querer usar sua lógica de negócios em uma ferramenta CLI, ou até mesmo algo mais próximo, como uma tarefa recorrente.</p>
<p>E fazer uma conexão da API do servidor node.js para ela mesmo, não é uma boa ideia…</p>
<h2><span class="notion-enable-hover" data-token-index="0" data-reactroot=""><span role="image" aria-label="&#x2620;&#xfe0f;">&#x2620;&#xfe0f;</span> Não coloque sua lógica de negócios dentro dos controllers!!<span role="image" aria-label="&#x2620;&#xfe0f;">&#x2620;&#xfe0f;</span></span></h2>
<p>Você pode ficar tentado usar os controllers para armazenar a lógica de <a href="https://blog.bossabox.com/por-que-os-projetos-de-transformacao-digital-falham-entenda-os-motivos/">negócios do seu aplicativo</a>, mas isso rapidamente se torna um código sem estrutura e difícil de compreender, no momento em que precisar fazer testes de unidade, você acabará lidando com simulações complexas para objetos express.js como req ou res.</p>
<p>É complicado distinguir quando uma resposta deve ser enviada e quando continuar o processamento em ‘background’, digamos depois que a resposta é enviada ao cliente.</p>
<p>Aqui está um exemplo do que não fazer.</p>
<p><code>route.post('/', async (req, res, next) =&gt; {</code></p>
<p><code><br />
// This should be a middleware or should be handled by a library like Joi.<br />
const userDTO = req.body;<br />
const isUserValid = validators.user(userDTO)<br />
if(!isUserValid) {<br />
return res.status(400).end();</code><code><br />
}</code></p>
<p><code><br />
// Lot of business logic here...<br />
const userRecord = await UserModel.create(userDTO);<br />
delete userRecord.password;<br />
delete userRecord.salt;<br />
const companyRecord = await CompanyModel.create(userRecord);<br />
const companyDashboard = await CompanyDashboard.create(userRecord, companyRecord);</code></p>
<p><code><br />
...whatever...</code></p>
<p><code><br />
// And here is the 'optimization' that mess up everything.<br />
// The response is sent to client...<br />
res.json({ user: userRecord, company: companyRecord });</code></p>
<p><code>// But code execution continues :(<br />
const salaryRecord = await SalaryModel.create(userRecord, companyRecord);<br />
eventTracker.track('user_signup',userRecord,companyRecord,salaryRecord);<br />
intercom.createUser(userRecord);<br />
gaAnalytics.event('user_signup',userRecord);<br />
await EmailService.startSignupSequence(userRecord)</code><code><br />
});</code></p>
<h2>Use uma camada de serviço para sua lógica de negócios <span role="image" aria-label="&#x1f4bc;">&#x1f4bc;</span></h2>
<p>Essa camada é onde sua lógica de negócios deve residir.</p>
<p>É apenas uma coleção de classes com propósitos claros, seguindo os princípios do <strong>SOLID</strong> aplicados ao node.js.</p>
<p><em>Nesta camada não deve existir nenhuma forma de &#8216;SQL Querry&#8217;, use a camada de acesso a dados para isso.</em></p>
<ul>
<li>Mova seu código para longe do express.js router</li>
<li>Não passe o objeto req ou res para a camada de serviço</li>
<li>Não retorne nada relacionado à camada de transporte HTTP, como um status code ou headers da camada de serviço.</li>
</ul>
<p>Exemplo:</p>
<p><code>route.post('/',<br />
validators.userSignup, // this middleware take care of validation<br />
async (req, res, next) =&gt; {<br />
// The actual responsability of the route layer.<br />
const userDTO = req.body;</code></p>
<p><code>// Call to service layer.<br />
// Abstraction on how to access the data layer and the business logic.<br />
const { user, company } = await UserService.Signup(userDTO);</code></p>
<p><code>// Return a response to client.<br />
return res.json({ user, company });<br />
});</code></p>
<p>Aqui está como seu serviço funcionará por de trás dos panos.</p>
<p><code>import UserModel from '../models/user';<br />
import CompanyModel from '../models/company';</code></p>
<p><code>export default class UserService() {</code></p>
<p><code>async Signup(user) {<br />
const userRecord = await UserModel.create(user);<br />
const companyRecord = await CompanyModel.create(userRecord); // needs userRecord to have the database id<br />
const salaryRecord = await SalaryModel.create(userRecord, companyRecord); // depends on user and company to be created</code></p>
<p><code>...whatever</code></p>
<p><code>await EmailService.startSignupSequence(userRecord)</code></p>
<p><code>...do more stuff</code></p>
<p><code>return { user: userRecord, company: companyRecord };<br />
}<br />
}</code></p>
<p><a class="notion-link-token notion-enable-hover" href="https://github.com/santiq/bulletproof-nodejs" target="_blank" rel="noopener noreferrer" data-token-index="0" data-reactroot=""><span class="link-annotation-unknown-block-id--232263393">Visit the example repository</span></a></p>
<h2>Use uma camada Pub/Sub também <span role="image" aria-label="&#x1f399;&#xfe0f;">&#x1f399;&#xfe0f;</span></h2>
<p>O padrão pub/sub vai além da <a href="https://blog.bossabox.com/serverless-beneficios-arquitetura/">arquitetura</a> clássica de 3 camadas proposta aqui, e é extremamente útil.</p>
<p>O endpoint simples da API node.js, que cria um usuário instantaneamente, pode querer chamar serviços de terceiros, talvez para um serviço de análise ou então iniciar uma sequência de e-mail.</p>
<p>Mais cedo ou mais tarde, essa simples operação de “criar” fará várias coisas e você terminará com 1.000 linhas de código, tudo em uma única função.</p>
<p>Isso viola o princípio da responsabilidade única.</p>
<p>Portanto, é melhor separar as responsabilidades desde o início, para que seu código permaneça sustentável.</p>
<p><code>import UserModel from '../models/user';<br />
import CompanyModel from '../models/company';<br />
import SalaryModel from '../models/salary';</code></p>
<p><code>export default class UserService() {</code></p>
<p><code>async Signup(user) {<br />
const userRecord = await this.userModel.create(user);<br />
const companyRecord = await this.companyModel.create(user);<br />
this.eventEmitter.emit('user_signup', { user: userRecord, company: companyRecord })<br />
return userRecord<br />
}</code></p>
<p><code>}</code></p>
<p><strong>Uma chamada obrigatória para um serviço dependente não é a melhor maneira de fazer isso.</strong></p>
<p>Uma abordagem melhor é emitir um evento, ou seja, &#8216;um usuário se inscreveu com este e-mail&#8217;.</p>
<p>E pronto, agora é responsabilidade dos listeners fazerem seu trabalho.</p>
<p><code>import UserModel from '../models/user';<br />
import CompanyModel from '../models/company';<br />
import SalaryModel from '../models/salary';</code></p>
<p><code>export default class UserService() {</code></p>
<p><code>async Signup(user) {<br />
const userRecord = await this.userModel.create(user);<br />
const companyRecord = await this.companyModel.create(user);<br />
this.eventEmitter.emit('user_signup', { user: userRecord, company: companyRecord })<br />
return userRecord<br />
}</code></p>
<p><code>}</code></p>
<p>Agora você pode dividir os eventos de handlers/listeners em vários arquivos.</p>
<p><code>eventEmitter.on('user_signup', ({ user, company }) =&gt; {</code></p>
<p><code>eventTracker.track(<br />
'user_signup',<br />
user,<br />
company,<br />
);</code></p>
<p><code>intercom.createUser(<br />
user<br />
);</code></p>
<p><code>gaAnalytics.event(<br />
'user_signup',<br />
user<br />
);<br />
})</code></p>
<p><code>eventEmitter.on('user_signup', async ({ user, company }) =&gt; {<br />
const salaryRecord = await SalaryModel.create(user, company);<br />
})</code></p>
<p><code><br />
<code>eventEmitter.on('user_signup', async ({ user, company }) =&gt; {<br />
await EmailService.startSignupSequence(user)<br />
})</code></code></p>
<p>Você pode agrupar as instruções await em um bloco try-catch ou [você pode simplesmente deixá-lo falhar e lidar com o <a class="notion-link-token notion-enable-hover" href="https://softwareontheroad.com/nodejs-crash-exception-handler" target="_blank" rel="noopener noreferrer" data-token-index="1" data-reactroot=""><span class="link-annotation-unknown-block-id-256353284">‘unhandledPromise’ </span></a><a class="notion-link-token notion-enable-hover" href="https://softwareontheroad.com/nodejs-crash-exception-handler" target="_blank" rel="noopener noreferrer" data-token-index="2" data-reactroot=""><span class="link-annotation-unknown-block-id-256353284">process.on(‘unhandledRejection’,cb)</span></a></p>
<p><code></code></p>
<h2>Injeção de Dependência <span role="image" aria-label="&#x1f489;">&#x1f489;</span></h2>
<p>Injeção de Dependência (ID) ou inversão de controle (IoC) é um padrão comum que ajudará na organização do seu código, &#8220;injetando&#8221; ou passando pelo construtor as <em>dependências</em> de sua classe ou função.</p>
<p>Ao fazer isso, você terá a flexibilidade de injetar uma <em>&#8216;dependência compatível&#8217;</em> quando, por exemplo, escrever os testes de unidade para o serviço ou quando o serviço for usado em outro contexto.</p>
<p>Código sem ID</p>
<p><code>import UserModel from '../models/user';<br />
import CompanyModel from '../models/company';<br />
import SalaryModel from '../models/salary';<br />
class UserService {<br />
constructor(){}<br />
Sigup(){<br />
// Calling UserModel, CompanyModel, etc<br />
...<br />
}<br />
}</code></p>
<p>Código com injeção manual de dependência</p>
<p><code>export default class UserService {<br />
constructor(userModel, companyModel, salaryModel){<br />
this.userModel = userModel;<br />
this.companyModel = companyModel;<br />
this.salaryModel = salaryModel;<br />
}<br />
getMyUser(userId){<br />
// models available throug 'this'<br />
const user = this.userModel.findById(userId);<br />
return user;<br />
}<br />
}</code></p>
<p><span style="color: #0000ff;"><span style="color: #003300;">Agora você pode injetar dependências personalizadas.<br />
</span></span></p>
<p><code>import UserService from '../services/user';<br />
import UserModel from '../models/user';<br />
import CompanyModel from '../models/company';<br />
const salaryModelMock = {<br />
calculateNetSalary(){<br />
return 42;<br />
}<br />
}<br />
const userServiceInstance = new UserService(userModel, companyModel, salaryModelMock);<br />
const user = await userServiceInstance.getMyUser('12346');</code></p>
<p>A quantidade de dependências que um serviço pode ter é infinita, e refatorar cada instanciação dele quando você adiciona um novo é uma tarefa chata e que abre espaços para erros.</p>
<p>É por isso que os frameworks de injeção de dependência foram criados.</p>
<p>A ideia é você declarar suas dependências na classe, e quando precisar de uma instância dessa classe, basta chamar o ‘Service Locator’.</p>
<p>Vamos ver um exemplo usando <a href="https://www.npmjs.com/package/typedi">typedi</a> uma biblioteca npm que traz ID para node.js</p>
<p><a href="https://www.github.com/typestack/typedi">Você pode ler mais sobre como usar o typedi na documentação oficial</a></p>
<p><em>AVISO exemplo de typescript</em></p>
<p><code>import { Service } from 'typedi';<br />
@Service()<br />
export default class UserService {<br />
constructor(<br />
private userModel,<br />
private companyModel,<br />
private salaryModel<br />
){}</code></p>
<p><code>getMyUser(userId){<br />
const user = this.userModel.findById(userId);<br />
return user;<br />
}<br />
}</code></p>
<p>s<em>ervices/user.ts</em></p>
<p>Agora, o typedi irá resolver qualquer dependência exigida pelo UserService.</p>
<p><code>import { Container } from 'typedi';<br />
import UserService from '../services/user';<br />
const userServiceInstance = Container.get(UserService);<br />
const user = await userServiceInstance.getMyUser('12346');</code></p>
<h3><em>Usando injeção de dependência com Express.js em Node.js</em></h3>
<p>Usando Injeção de Dependencias. em express.js é a peça final do quebra-cabeça para esta arquitetura de projeto node.js.</p>
<p>Camada de roteamento</p>
<p><code>route.post('/',<br />
async (req, res, next) =&gt; {<br />
const userDTO = req.body;</code></p>
<p><code>const userServiceInstance = Container.get(UserService) // Service locator</code></p>
<p><code>const { user, company } = userServiceInstance.Signup(userDTO);</code></p>
<p><code>return res.json({ user, company });<br />
});</code></p>
<p><span style="color: #000000;">Incrível, o projeto está ficando ótimo! É tão organizado que me faz querer codar agora mesmo.</span></p>
<h2>Um exemplo de teste unitário <span role="image" aria-label="&#x1f575;&#x1f3fb;">&#x1f575;&#x1f3fb;</span></h2>
<p><span style="color: #000000;">Ao usar a injeção de dependência e esses padrões de organização, o teste unitário se torna realmente simples.</span></p>
<p><span style="color: #000000;">Você não precisa simular objetos req/res ou require(…) calls.</span></p>
<p><span style="color: #000000;">tests/unit/services/user.js</span></p>
<p><code>import UserService from '../../../src/services/user';</code></p>
<p><code>describe('User service unit tests', () =&gt; {<br />
describe('Signup', () =&gt; {<br />
test('Should create user record and emit user_signup event', async () =&gt; {<br />
const eventEmitterService = {<br />
emit: jest.fn(),<br />
};</code></p>
<p><code>const userModel = {<br />
create: (user) =&gt; {<br />
return {<br />
...user,<br />
_id: 'mock-user-id'<br />
}<br />
},<br />
};</code></p>
<p><code>const companyModel = {<br />
create: (user) =&gt; {<br />
return {<br />
owner: user._id,<br />
companyTaxId: '12345',<br />
}<br />
},<br />
};</code></p>
<p><code>const userInput= {<br />
fullname: 'User Unit Test',<br />
email: 'test@example.com',<br />
};</code></p>
<p><code>const userService = new UserService(userModel, companyModel, eventEmitterService);<br />
const userRecord = await userService.SignUp(teamId.toHexString(), userInput);</code></p>
<p><code>expect(userRecord).toBeDefined();<br />
expect(userRecord._id).toBeDefined();<br />
expect(eventEmitterService.emit).toBeCalled();<br />
});<br />
})<br />
})</code></p>
<h2><span style="color: #000000;"><span class="notion-enable-hover" data-token-index="0" data-reactroot="">Cron Jobs and recurring task <span role="image" aria-label="&#x26a1;">&#x26a1;</span></span></span></h2>
<p>Com isso, agora que a lógica de negócios está encapsulada na camada de serviço, é mais fácil usá-la a partir de um Cron Job.</p>
<p>Você nunca deve confiar em node.js <code>setTimeout</code> ou outra forma antiga de atrasar a execução do código, mas em uma arquitetura de projeto que mantenha seus jobs e a execução deles em um banco de dados.</p>
<p>Dessa forma, você terá controle sobre os jobs que falharam e feedback daqueles que obtiveram sucesso. Eu já escrevi sobre boas práticas para isso, <a href="https://softwareontheroad.com/nodejs-scalability-issues">confira meu guia sobre como usar agenda.js, o melhor gerenciador de tarefas para node.js</a>.</p>
<h2>Configurações e segredos <span role="image" aria-label="&#x1f92b;">&#x1f92b;</span></h2>
<p>Seguindo os conceitos amplamente testados do <a href="https://12factor.net/">Twelve-Factor App</a> para node.js, a melhor abordagem para armazenar chaves de API e conexões de string de banco de dados, é usar o <strong>dotenv</strong>.</p>
<p>Coloque um arquivo <code>.env</code> , que nunca deve ser commitado <em>(mas tem que existir com valores default em seu repositório)</em> então, o pacote npm <code>dotenv</code> carrega o arquivo .env e insere os vars no processo <code>. env</code> de node.js.</p>
<p>Isso pode ser suficiente, mas eu gosto de adicionar um passo extra. Ter um arquivo <code>config/index.ts</code> onde o pacote <code>dotenv</code> npm carrega o arquivo .env e então eu uso um objeto para armazenar as variáveis, assim temos uma estrutura de código que se autocomplementa.</p>
<p><span class="notion-enable-hover" data-token-index="0" data-reactroot="">config/index.js<br />
</span></p>
<p><code>const dotenv = require('dotenv');<br />
// config() will read your .env file, parse the contents, assign it to process.env.<br />
dotenv.config();</code></p>
<p><code>export default {<br />
port: process.env.PORT,<br />
databaseURL: process.env.DATABASE_URI,<br />
paypal: {<br />
publicKey: process.env.PAYPAL_PUBLIC_KEY,<br />
secretKey: process.env.PAYPAL_SECRET_KEY,<br />
},<br />
paypal: {<br />
publicKey: process.env.PAYPAL_PUBLIC_KEY,<br />
secretKey: process.env.PAYPAL_SECRET_KEY,<br />
},<br />
mailchimp: {<br />
apiKey: process.env.MAILCHIMP_API_KEY,<br />
sender: process.env.MAILCHIMP_SENDER,<br />
}<br />
}</code></p>
<p>Dessa forma, você evita floodar seu código com instruções process.env.MY_RANDOM_VAR, usando o preenchimento automático, você não precisa saber como nomear o env var.</p>
<h2>Loaders<span class="notion-enable-hover" data-token-index="1" data-reactroot=""><span role="image" aria-label="&#x1f3d7;&#xfe0f;">&#x1f3d7;&#xfe0f;</span></span></h2>
<p>Peguei esse padrão de <a href="https://www.npmjs.com/package/microframework-w3tec">W3Tech microframework</a> mas sem depender de seu package.</p>
<p>A ideia é que você divida o processo de inicialização do seu serviço node.js em módulos testáveis.</p>
<p>Vamos ver uma inicialização clássica do aplicativo express.js</p>
<p><code>const mongoose = require('mongoose');<br />
const express = require('express');<br />
const bodyParser = require('body-parser');<br />
const session = require('express-session');<br />
const cors = require('cors');<br />
const errorhandler = require('errorhandler');<br />
const app = express();</code></p>
<p><code>app.get('/status', (req, res) =&gt; { res.status(200).end(); });<br />
app.head('/status', (req, res) =&gt; { res.status(200).end(); });<br />
app.use(cors());<br />
app.use(require('morgan')('dev'));<br />
app.use(bodyParser.urlencoded({ extended: false }));<br />
app.use(bodyParser.json(setupForStripeWebhooks));<br />
app.use(require('method-override')());<br />
app.use(express.static(__dirname + '/public'));<br />
app.use(session({ secret: process.env.SECRET, cookie: { maxAge: 60000 }, resave: false, saveUninitialized: false }));<br />
mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true });</code></p>
<p><code>require('./config/passport');<br />
require('./models/user');<br />
require('./models/company');<br />
app.use(require('./routes'));<br />
app.use((req, res, next) =&gt; {<br />
var err = new Error('Not Found');<br />
err.status = 404;<br />
next(err);<br />
});<br />
app.use((err, req, res) =&gt; {<br />
res.status(err.status || 500);<br />
res.json({'errors': {<br />
message: err.message,<br />
error: {}<br />
}});<br />
});</code></p>
<p><code>... more stuff</code></p>
<p><code>... maybe start up Redis</code></p>
<p><code>... maybe add more middlewares</code></p>
<p><code>async function startServer() {<br />
app.listen(process.env.PORT, err =&gt; {<br />
if (err) {<br />
console.log(err);<br />
return;<br />
}<br />
console.log(`Your server is ready !`);<br />
});<br />
}</code></p>
<p><code>// Run the async function to start our server<br />
startServer();</code></p>
<p>Como você pode ver, esta parte do seu aplicativo pode ser uma verdadeira bagunça.</p>
<p>Essa é uma forma eficiente de resolve-la</p>
<p><code>const loaders = require('./loaders');<br />
const express = require('express');</code></p>
<p><code>async function startServer() {</code></p>
<p><code>const app = express();</code></p>
<p><code>await loaders.init({ expressApp: app });</code></p>
<p><code>app.listen(process.env.PORT, err =&gt; {<br />
if (err) {<br />
console.log(err);<br />
return;<br />
}<br />
console.log(`Your server is ready !`);<br />
});<br />
}</code></p>
<p><code>startServer();</code></p>
<p>Agora os Loaders são apenas pequenos arquivos com um propósito conciso</p>
<p><em>loaders/index.js</em></p>
<p><code>import expressLoader from './express';<br />
import mongooseLoader from './mongoose';</code></p>
<p><code>export default async ({ expressApp }) =&gt; {<br />
const mongoConnection = await mongooseLoader();<br />
console.log('MongoDB Initialized');<br />
await expressLoader({ app: expressApp });<br />
console.log('Express Initialized');</code></p>
<p><code>// ... more loaders can be here</code></p>
<p><code>// ... Initialize agenda<br />
// ... or Redis, or whatever you want<br />
}</code></p>
<p>O express loader</p>
<p><code>import * as express from 'express';<br />
import * as bodyParser from 'body-parser';<br />
import * as cors from 'cors';</code></p>
<p><code>export default async ({ app }: { app: express.Application }) =&gt; {</code></p>
<p><code>app.get('/status', (req, res) =&gt; { res.status(200).end(); });<br />
app.head('/status', (req, res) =&gt; { res.status(200).end(); });<br />
app.enable('trust proxy');</code></p>
<p><code>app.use(cors());<br />
app.use(require('morgan')('dev'));<br />
app.use(bodyParser.urlencoded({ extended: false }));</code></p>
<p><code>// ...More middlewares</code></p>
<p><code>// Return the express app<br />
return app;<br />
})</code></p>
<p>O mongo Loader</p>
<p><code>import * as mongoose from 'mongoose'<br />
export default async (): Promise&lt;any&gt; =&gt; {<br />
const connection = await mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true });<br />
return connection.connection.db;<br />
}</code></p>
<h2>Conclusão</h2>
<p>Nós nos aprofundamos em uma arquitetura de projeto node.js testada em produção, aqui estão algumas dicas resumidas:</p>
<ul>
<li>Use uma arquitetura de 3 camadas.</li>
<li>Não coloque sua lógica de negócios nos controladores express.js.</li>
<li>Use o padrão PubSub e libera eventos para tarefas em background.</li>
<li>Tenha injeção de dependência para acalmar sua alma.</li>
<li>Nunca vaze suas senhas, segredos e chaves de API, use um gerenciador de configuração.</li>
<li>Divida as configurações do seu servidor node.js em pequenos módulos que podem ser carregados independentemente.</li>
</ul>
<p>The post <a rel="nofollow" href="https://blog.bossabox.com/arquitetura-de-projeto-node-js-prova-de-balas/">Arquitetura de projeto node.js à prova de balas</a> appeared first on <a rel="nofollow" href="https://blog.bossabox.com">BossaBox</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.bossabox.com/arquitetura-de-projeto-node-js-prova-de-balas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
