<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adriano Kerber</title>
    <description>The latest articles on DEV Community by Adriano Kerber (@adrianokerber).</description>
    <link>https://dev.to/adrianokerber</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F379611%2F3ac989c6-b618-42e0-8319-2a19559aa95e.jpg</url>
      <title>DEV Community: Adriano Kerber</title>
      <link>https://dev.to/adrianokerber</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adrianokerber"/>
    <language>en</language>
    <item>
      <title>Gestão de Projetos com GIT</title>
      <dc:creator>Adriano Kerber</dc:creator>
      <pubDate>Tue, 26 Mar 2024 13:44:05 +0000</pubDate>
      <link>https://dev.to/adrianokerber/gestao-de-projetos-com-git-4fmi</link>
      <guid>https://dev.to/adrianokerber/gestao-de-projetos-com-git-4fmi</guid>
      <description>&lt;p&gt;Abaixo iremos descrever com detalhes dois casos de acompanhamento/gerenciamento de projeto de software em conjunto com &lt;em&gt;Git&lt;/em&gt; tentando trazer as práticas mais efetivas para essa gestão.&lt;/p&gt;

&lt;p&gt;Um destes casos utiliza uma política de rastreio de mudanças bem definida com foco em baixa carga cognitiva, já o outro é orientado ao caos, onde os &lt;em&gt;commits&lt;/em&gt; não representam muita coisa e o histórico mais atrapalha do que ajuda quando há algum &lt;em&gt;bug&lt;/em&gt; que precisa ser rastreado.&lt;/p&gt;

&lt;p&gt;Ambos os casos são baseados em experiências passadas vivenciadas no ambiente de trabalho, e de forma geral são divisores de águas entre um time mais iniciante e um time de alta performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. MAL EXEMPLO
&lt;/h2&gt;

&lt;p&gt;Exemplo RUIM de gestão de código no git.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Propósito
&lt;/h3&gt;

&lt;p&gt;Este projeto demonstra um caso de má gestão de commits, onde não se segue uma padrão para as mensagens de commit e todo merge de uma branch de feature com uma branch de longa duração resulta em um merge sem fast-forward (Ex: &lt;code&gt;git merge feature/xyz --no-ff&lt;/code&gt;).&lt;br&gt;
Resultando em uma árvore de commits caótica onde é quase impossível identificar o que foi alterado em caso de necessidade de reversão de alterações.&lt;/p&gt;

&lt;p&gt;De forma geral aqui usamos commits para pontos específicos de evolução porém sem relação clara com o quadro de tarefas.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 Problema
&lt;/h3&gt;

&lt;p&gt;Temos um quadro do time onde gerenciamos as atividades no fluxo de trabalho, priorizações, etc.&lt;br&gt;
Dado o quadro e histórico do git exibidos nas imagens abaixo o que você entende?&lt;/p&gt;

&lt;p&gt;Quadro do time:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwfi4st0l2l2kdn5qmhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwfi4st0l2l2kdn5qmhn.png" alt="Board do Time.png" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Histórico do Git:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbzp0ga8vkuvp925wjj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbzp0ga8vkuvp925wjj5.png" alt="Histórico GIT" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elaborando um pouco mais:&lt;/p&gt;

&lt;p&gt;Neste exemplo utilizamos parte da essencia do &lt;a href="https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow"&gt;Gitflow&lt;/a&gt;, onde temos duas branches de longa duração &lt;code&gt;main&lt;/code&gt; e &lt;code&gt;dev&lt;/code&gt;, sendo a &lt;em&gt;main&lt;/em&gt; a branch que representa o código em ambiente de produção.&lt;br&gt;
Também atrelado a &lt;em&gt;main&lt;/em&gt; temos &lt;code&gt;tags&lt;/code&gt; onde cada tag representa uma release publicada em produção.&lt;br&gt;
Também é importante destacar que como estratégia de unificação de branches utilizamos o &lt;code&gt;git merge &amp;lt;alvo&amp;gt; --no-ff&lt;/code&gt; para forçar a criação de commits de merge.&lt;/p&gt;

&lt;p&gt;Desta forma na imagem que exibe o histórico do git temos um emaranhado de commits com mensagens de pouco significado e branches bifurcando e se unindo novamente criando um histórico caótico.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡Importante: o exemplo acima nem de longe representa um caso extremo do uso desta prática, porém serve ao propósito da demonstração.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  1.3 Questionamentos
&lt;/h3&gt;

&lt;p&gt;Olhando novamente as imagens acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você conseguiria relacionar facilmente os 4 itens de trabalho do quadro com os commits do histórico?&lt;/li&gt;
&lt;li&gt;Se você se esforçar um pouco mais, consegue fazer a relação?&lt;/li&gt;
&lt;li&gt;Hiiii, deu problema em produção, como identificar qual feature deu problema olhando esse histórico? Para revertê-la poderíamos reverter só um commit?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A resposta é: "Com tempo infinito tudo é possível", porém sabemos que nosso tempo é finito, logo trabalhar com esse padrão caótico não é viável, pois requer uma carga cognitiva extrema.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.4 Conclusão
&lt;/h3&gt;

&lt;p&gt;Pode-se perceber que este tipo de estratégia de gerenciamento de commits não deixa clara a relação entre o quadro de gestão de tarefas, além de dificultar a reversão de alterações pois necessitamos de uma composição de commits para entregar uma funcionalidade e talvez seja necessário reverter vários em caso de problema.&lt;/p&gt;
&lt;h4&gt;
  
  
  1.4.1 Prós e contras
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;(-) Alta carga cognitiva&lt;/li&gt;
&lt;li&gt;(-) Baixo rastreio de demandas&lt;/li&gt;
&lt;li&gt;(-) Propósito de alterações ofuscado&lt;/li&gt;
&lt;li&gt;(+) Commit rápido, sem gastar tempo refinando a mensagem de commit&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2. BOM EXEMPLO
&lt;/h2&gt;

&lt;p&gt;Exemplo BOM de gestão de código no git&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1 Propósito
&lt;/h3&gt;

&lt;p&gt;Este projeto demonstra um caso de boa gestão de commits, onde se segue uma padrão claro para as mensagens de commit e todo merge de uma branch de feature com uma branch de longa duração resulta é aplicado através de &lt;code&gt;git rebase&lt;/code&gt; e utilizando squash para consolidar as features em estado final antes de jogar para as branches de longa duração.&lt;br&gt;
Resultando em uma árvore de commits clara onde fica fácil identificar o que foi alterado em caso de necessidade de reversão de alterações.&lt;/p&gt;

&lt;p&gt;De forma geral aqui usamos commits para pontos específicos de evolução com uma relação clara com o quadro de tarefas.&lt;br&gt;
PS: o quadro pode ser encontrado &lt;a href="https://github.com/users/adrianokerber/projects/4/views/1"&gt;aqui&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 Problema
&lt;/h3&gt;

&lt;p&gt;Temos um quadro do time onde gerenciamos as atividades no fluxo de trabalho, priorizações, etc.&lt;br&gt;
Dado o quadro e histórico do git exibidos nas imagens abaixo o que você entende?&lt;/p&gt;

&lt;p&gt;Quadro do time:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6df1a827l96ukbswmnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6df1a827l96ukbswmnn.png" alt="Board do Time.png" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Histórico do Git:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7cj0uhi4qkwvm2f837g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7cj0uhi4qkwvm2f837g.png" alt="Histórico GIT" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elaborando um pouco mais:&lt;/p&gt;

&lt;p&gt;Neste exemplo utilizamos parte da essencia do git-flow, onde temos duas branches de longa duração &lt;code&gt;main&lt;/code&gt; e &lt;code&gt;dev&lt;/code&gt;, sendo a &lt;em&gt;main&lt;/em&gt; a branch que representa o código em ambiente de produção.&lt;br&gt;
Também atrelado a &lt;em&gt;main&lt;/em&gt; temos &lt;code&gt;tags&lt;/code&gt; onde cada tag representa uma release publicada em produção.&lt;br&gt;
Além disso é importante destacar que como estratégia de unificação de branches utilizamos o &lt;code&gt;git rebase&lt;/code&gt; e aplicamos &lt;code&gt;squash&lt;/code&gt; para garantir uma boa visualização e centralização de alterações dependentes.&lt;/p&gt;

&lt;p&gt;Com isso o resultado é um histórico linear e coeso. Mas além da estratégia acima foi necessário aplicar um padrão de mensagens de commit para amarrar os commits ao quadro do time.&lt;/p&gt;
&lt;h4&gt;
  
  
  2.2.1 Padrão de Commits
&lt;/h4&gt;

&lt;p&gt;O padrão aplicado é simples, segue template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_gitmoji&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; [&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_featureId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] #&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_taskId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_mensagemDeAcao&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo:&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;exemploMensagemRenderizada&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"🧵 [US-1234] #TK-1248 - Adiciona multi-threads para fluxo de processamento do KafkaConsumer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡Importante: o segundo campo de identificação do padrão é opcional. Como podem ver na imagens acima, nosso board de exemplo possui apenas um nível de tarefas, não tendo tarefas filhas, desta forma o segundo campo do padrão &lt;code&gt;#taskId&lt;/code&gt; foi omitido por completo nas mensagens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conforme ilustrado acima o padrão é simples, composto por 4 partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Gitmoji&lt;/code&gt;: Inicia com um emoji que deve traduzir o propósito principal do commit cujo segue o padrão proposto pelo guia do &lt;a href="https://gitmoji.dev/"&gt;Gitmoji&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FeatureId&lt;/code&gt;: O identificador da feature que será entregue, esse identificador deve ser o mesmo do quadro de tarefas do time, para que permita o rastreio entre os commits e o quadro. OBS: este id normalmente representa uma User Story quando estamos falando de uma gerenciamento mais complexo de quadros de time.&lt;/li&gt;
&lt;li&gt;(Opcional) &lt;code&gt;TaskId&lt;/code&gt;: O identificador da tarefa que o dev está tocando quando a feature é grande e faz sentido entregar pequenas partes, seja para garantir um bom fluxo de revisão de &lt;strong&gt;Pull Requests&lt;/strong&gt; ou apenas paralelizar o trabalho entre mais devs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desta forma na imagem que exibe o histórico do git temos uma visão direcionada sobre o propósito de cada commit além de detalhes na mensagem para garantir o rastreio de cada commit de volta ao quadro do time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Questionamentos
&lt;/h3&gt;

&lt;p&gt;Olhando novamente as imagens acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você conseguiria relacionar facilmente os itens de trabalho do quadro com os commits do histórico?&lt;/li&gt;
&lt;li&gt;Hiiii, deu problema em produção, como identificar qual feature deu problema olhando esse histórico? Podemos revertê-la facilmente?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acreditamos que sim, com este padrão de commits e um uso controlado de &lt;code&gt;git rebase&lt;/code&gt; conseguimos construir um fluxo linear e coeso garantindo uma fácil gestão.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Conclusão
&lt;/h3&gt;

&lt;p&gt;Conforme já dito acima, com este padrão de commits e um uso controlado de &lt;code&gt;git rebase&lt;/code&gt; conseguimos construir um fluxo linear e coeso garantindo uma fácil gestão.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.4.1 Prós e contras
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;(+) Baixa carga cognitiva para rastreio de problemas&lt;/li&gt;
&lt;li&gt;(+) Rastreio de demandas claro&lt;/li&gt;
&lt;li&gt;(+) Propósito de alterações claro&lt;/li&gt;
&lt;li&gt;(-) Tempo na criação de mensagem de commit mais alto&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Considerações Finais
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;TR;&lt;/strong&gt;&lt;br&gt;
Foram comparados dois casos de gestão de repositório e rastreio de demandas onde se provou que um bom gerenciamento requer padronização estruturada utilizando técnicas de rastreio e resumo de histórico.&lt;/p&gt;

&lt;p&gt;Referência para os repositórios utilizados no exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/adrianokerber/git-management-demo-bad-case"&gt;Mal exemplo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adrianokerber/git-management-demo-good-case"&gt;Bom exemplo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Nota:&lt;br&gt;
Espero que o post tenha agregado na sua jornada de dev! Abraço&lt;/p&gt;

</description>
      <category>git</category>
    </item>
  </channel>
</rss>
