<?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: Alex M.</title>
    <description>The latest articles on DEV Community by Alex M. (@alexmoreno).</description>
    <link>https://dev.to/alexmoreno</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%2F172824%2Fecea2374-b5bf-471c-a98b-f3b5bbf5259d.jpeg</url>
      <title>DEV Community: Alex M.</title>
      <link>https://dev.to/alexmoreno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexmoreno"/>
    <language>en</language>
    <item>
      <title>Aprendizados de 1 ano de projeto em vue.js com escopo ultra caótico</title>
      <dc:creator>Alex M.</dc:creator>
      <pubDate>Tue, 26 Jan 2021 17:47:17 +0000</pubDate>
      <link>https://dev.to/alexmoreno/aprendizados-de-1-ano-de-projeto-em-vue-js-com-escopo-ultra-caotico-d9g</link>
      <guid>https://dev.to/alexmoreno/aprendizados-de-1-ano-de-projeto-em-vue-js-com-escopo-ultra-caotico-d9g</guid>
      <description>&lt;p&gt;&lt;em&gt;tl;dr: Implemente Design System, componentize, faça componentes base, faça testes unitários / de integração, não ignore o log do terminal. O trabalho dos designers pode facilitar muito a vida do front.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Uma das coisas mais legais de trabalhar na Snowman Labs é que cada hora surge um pepino diferente pra gente resolver. E a gente gosta disso, faz parte da natureza do programador, eu diria. A gente já resolveu cada bucha que daria um artigo por si só. &lt;br&gt;
O último projeto que participei foi um desafio técnico e tanto, por uma série de fatores. Várias coisas foram reescritas várias vezes, e a gente tinha noção de que isso ia acontecer, então cada tomada de decisão em relação a arquitetura foi feita com bastante cautela, tentando prever o que poderia mudar e o que a gente poderia fazer pra minimizar a quantidade de problemas e a eficácia do reaproveitamento. &lt;/p&gt;

&lt;p&gt;Em determinado momento o sistema foi dividido em dois (repositórios diferentes) e depois mergeado de novo, o que colocou em teste nossas decisões. Felizmente, o merge foi muito menos doloroso do que poderia ter sido. &lt;/p&gt;

&lt;p&gt;Um pouco de estatística de nerd: Tivemos 185 componentes de features (inteligentes e burros) e 47 na pasta core, ou seja, componentes que não pertencem à nenhuma feature específicam, totalizando 232 arquivos .vue na versão que foi entregue ao cliente. Ouso dizer que pelo menos a mesma quantidade de arquivos foi deletado por conta do escopo caótico do projeto (e descansam em paz no nosso git). O que não é necessariamente um problema, Agile é feito justamente pra lidar com esse tipo de problema.&lt;br&gt;
Ao longo de alguns projetos de git que compuseram esse projeto, tivemos 2181 commits, distribuidos em 671 merge requests que foram de fato mergeados. Houve uma média de 2% de merge requests que foram fechados ao invés de serem mergeados na master.&lt;br&gt;
A versão final do projeto possuía pouco mais de 20372 linhas de código na sua pasta de features, e 3004 na pasta core, que, graças a elas, poupamos de escrever muita coisa redundante na pasta de feature.&lt;/p&gt;

&lt;p&gt;A componentização pesada ajudou bastante a gente a lidar com os problemas. &lt;br&gt;
Slots não foram tão usados (foram fundamentais em pontos específicos, como forms e elementos de UI com miolo dinâmico), felizmente a maior parte das vezes conseguimos resolver com parametrizações.&lt;/p&gt;

&lt;p&gt;Aqui vou deixar alguns pontos chave que aprendemos ou queremos reenforçar como aprendizado nesse projeto:&lt;/p&gt;

&lt;h1&gt;
  
  
  Pontos de valor
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Designers podem ajudar (e muito) no desenvolvimento
&lt;/h2&gt;

&lt;p&gt;O Design System ajuda a padronizar o tema e a componentização do sistema, facilitando a vida do dev front, auxiliando na tomada de decisão independente (fica muito mais fácil pro desenvolvedor). Felizmente, nesse projeto, tivemos designers competentes (vlw Rubens e Stoco) já deixando tudo preparado e sólido pra trabalhar. Às vezes o povo do front tem que colocar um botãozinho, ou um inputzinho. Com um Design System funcional e robusto, o front pode se aventurar em meter a mão na UI para coisas pequenas sem precisar encher o saco do designer pra alterar o protótipo praquela coisinhazinha ali. O que não é a melhor coisa pra se sair fazendo, mas sabe como é, o tempo urge e a sapucaí é grande.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uma boa componentização (misturado com Design System) pode transformar criar telas novas em lego&lt;/strong&gt;. Quando entrou um dev front na metade do caminho (fala, Puff!), com pouca experiência em vue (mas já em outros frameworks), fazer a parte de UI foi praticamente um drag and drop dos componentes que já existiam. A semântica e a simplicidade de usar os componentes (tanto os base quanto os da feature) permitiram que tudo fosse criado muito rápido, e sem ficar com cara de copicola em código que já tava funcionando. Com uma introdução bem rápida ao projeto, já dá pra tacar o pau. Se tiver tudo em &lt;a href="https://storybook.js.org/"&gt;storybook&lt;/a&gt;, melhor ainda! Não foi o caso desse projeto kkkkkkkk embora usamos em outro projeto anterior e gostamos bastante. Super recomendamos. &lt;/p&gt;

&lt;h2&gt;
  
  
  O front ama quando o designer faz as coisas já baseada num framework de UI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9odI0zGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1kygo80dz3xue2pfi93d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9odI0zGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1kygo80dz3xue2pfi93d.png" alt="Componentes base"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse projeto decidimos trabalhar com o &lt;a href="http://vuetifyjs.com/"&gt;vuetify&lt;/a&gt;, que é baseado em &lt;a href="https://material.io/design"&gt;material&lt;/a&gt;, e os designers montaram os componentes todos no vuetify . Sendo assim, quando a gente foi codar os componentes base, a gente praticamente só extendeu e customizou os componentes do framework. Isso poupou muito tempo e deu muito poder aos fronts, agilizando muito o desenvolvimento do look and feel geral do sistema, além de reduzir significantemente a quantidade de código escrito e repetido no sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vuetify + Componentes base para não precisar escrever CSS
&lt;/h2&gt;

&lt;p&gt;Isso é uma das coisas mais legais de desenhar sistemas com Design System e componentes base (e designers competentes, claro. Valeu Rubens e Stoquinho). 90% dos componentes de página (sem exagero) possuem 0 CSS escrito. Tudo está como parâmetro de componente, customização ou defaults do vuetify e classes helpers do vuetify&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature modules são uma ótima forma de organizar coisas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Jhk9kkp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cq45ikkug78616tcyr66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Jhk9kkp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cq45ikkug78616tcyr66.png" alt="Exemplo de feature module"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como um teste, decidi propositalmente não usar &lt;a href="https://ednsquare.com/story/3-tips-for-scaling-large-vue-js-application------5jFiEn"&gt;feature module&lt;/a&gt; (tip #1, não tem link direto, infelizmente) no sistema para ver em que momento a organização sai do controle. Descobrimos rapidinho que, com 5 ou 6 features no sistema, você já começa a ficar incomodado e quer uma separação melhor. Além de ajudar bastante na orgnanização, ainda torna o namespacing menos verboso por conta da localização dos arquivos no filesystem. &lt;/p&gt;

&lt;h2&gt;
  
  
  Mixins sao poderosos e perigosos
&lt;/h2&gt;

&lt;p&gt;Mixins são poderosos pois permitem lógicas de componentes serem reutilizadas e escritas em um lugar só, porém, nos frameworks de &lt;a href="https://css-tricks.com/how-the-vue-composition-api-replaces-vue-mixins/#mixins-are-considered-harmful"&gt;front&lt;/a&gt; &lt;a href="https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html"&gt;em&lt;/a&gt; &lt;a href="https://www.codamit.dev/vuejs-mixins-are-broken"&gt;geral&lt;/a&gt;, essa feature deixa alguns problemas de DX ao ser utilizada. Pra mim, o mais marcante deles é não ter um namespace claro. Quanto mais mixins você tiver utilizando, mais você não vai ter a menor idéia de onde aquele trecho de código vem. Além de outros, como colisão de nome (princípio parecido com o de não usarmos &lt;code&gt;prototype&lt;/code&gt; no js), etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxes alternativas para componentes e typescript
&lt;/h2&gt;

&lt;p&gt;Vue2 não é muito bom pra lidar com typescript de forma vanilla, então o próprio core team e a comunidade criaram soluções pra você ter sintaxes alternativas (nada muito diferente) que suportam os toolings mais modernos e que tiveram maior adoção no decorrer dos últimos anos, como o &lt;a href="https://class-component.vuejs.org/"&gt;vue-class-component&lt;/a&gt;, &lt;a href="https://github.com/kaorun343/vue-property-decorator"&gt;vue-property-decorator&lt;/a&gt; e o &lt;a href="https://github.com/ktsn/vuex-class"&gt;vuex-class&lt;/a&gt;. &lt;br&gt;
O caso mais notório de ferramenta que tira proveito disso, com certeza é o typescript. Com essas tecnologias, usar typescript é 100% possível, e usando essas sintaxes alternativas, diria até que o código fica mais enxuto e claro do que o vue sem nada (&lt;code&gt;@Action&lt;/code&gt; do &lt;code&gt;vuex-class&lt;/code&gt;, pra mim, tem uma sintaxe mais agradável que &lt;code&gt;mapActions&lt;/code&gt; do &lt;code&gt;vuex&lt;/code&gt; cru, por exemplo). &lt;br&gt;
Começamos o projeto sem, mas o Brunão começou a implementar usando isso e com uma curva bem pequena de aprendizado, aderimos felizes ao novo método de escrever componentes vue2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes se pagam rapidamente
&lt;/h2&gt;

&lt;p&gt;A comunidade de front só tem dado a devida atenção a testes de uns anos pra cá, sempre foi um inferno testar as coisas, e eu nem sempre fui a melhor pessoa para advogar o uso de testes kkkkkkkkk inclusive, até um tempo atrás, eu era explicitamente contra, com um tom de ironia mas um fundo de verdade. &lt;br&gt;
Muito dos meus receios em começar a aplicar eram baseados totalmente em ignorância do ferramentário e desgosto em encarar a curva de aprendizado e o tempo extra ao desenvolver as features. Porém, quanto mais eu decidi encarar, mais foi ficando claro que o tempo investido vale a pena, pois traz segurança e te poupa muito tempo em descobrir ONDE alguma coisa não tá mais funcionando. Ainda há muito a estudar e pegar fluidez, mas quanto mais testes você faz, mais rápido fica fazê-los.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jest first, depois cypress (eu acho)
&lt;/h2&gt;

&lt;p&gt;Eu comecei usando &lt;a href="https://www.cypress.io/"&gt;cypress&lt;/a&gt; pois achava bem mais simples testar se algo estava funcionando simplesmente usando o próprio browser, mas depois de me aventurar com &lt;a href="https://jestjs.io/"&gt;jest&lt;/a&gt; (usando &lt;a href="https://vue-test-utils.vuejs.org/"&gt;vue-test-utils&lt;/a&gt;, percebi que: ele é bem mais rápido, e os testes tem uma função razoavelmente diferente (o cypress não te diz onde algo tá quebrado a nível de código, e sim a nível de "tem alguém usando isso aqui e não tá funcionando"). &lt;br&gt;
Eu comecei escrevendo testes pro sistema em cypress, mas toda vez que eu ia mexer, era leeeeento. Inclusive tive que pedir pra colocarem mais ram no meu maczinho (imac de 2011, guerreiro) pois eu não tinha ram suficiente pra rodar o cypress e todo o resto do ferramentário (e olha que eu nem usava o VSCode ainda). &lt;br&gt;
Suspeito que dava pra ter feito tudo que eu fiz em cypress, usando jest, o que teria uma curva de dificuldade um pouco maior, mas o uso dos testes seria extremamente mais rápido e útil. Mas apenas suspeito. O próximo sistema vai ser feito "jest-first", vamos ver o que vem por aí, não dá pra saber ainda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Módulo core pra coisas gerais (mas usar com cuidado)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2xpm04NI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kv503yizm9pis5yt0mns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2xpm04NI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kv503yizm9pis5yt0mns.png" alt="Parte do módulo core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Devido a uma decisão de arquitetura que tomamos, o sistema todo é cru, e a gente injeta os feature modules num sistema que, em seu estado inicial, só possui a feature de login. Portanto, temos um "módulo core" onde colocamos tudo que não pertence especificamente a módulo nenhum. Isso agiliza muito as coisas, porém tem seus drawbacks. Há de se mexer nesses caras com bastante cuidado, pois não se sabe exatamente quais partes do sistema utilizam ele. Entretanto, o fato de estar em "core" já deixa isso meio implícito.  Há algfuma forma melhor de fazer isso? Não sei, não pensei direito ainda. A idéia de usar os core para extender em componentes de cada feature parece interessante, mas talvez desnecessariamente verbosa, mas é a primeira ideia que me passa em mente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance e bundle size são pontos relevantes
&lt;/h2&gt;

&lt;p&gt;Rapaz, a bundle final do sistema deu 13mb! Num sistema web! Lógico que isso não pode ficar assim. Imagina, ter que carregar 13mb só pra usar o sistema. Dito isso, fui atrás de &lt;a href="https://medium.com/shard-labs/how-to-drastically-reduce-your-bundle-size-and-load-time-in-vue-js-54370d513fdf"&gt;técnicas pra reduzir o bundle&lt;/a&gt; e diminui de 13mb pra 2mb. Ainda dá pra dar uma escovadinha aqui ou ali, porém já temos um excelente ganho. Um dos grandes culpados é o vuetify, que se colocado de qualquer jeito adiciona um tamanho bem significativo ao sistema, mas o próprio vuetify te ensina formas de usar a biblioteca da &lt;a href="https://vuetifyjs.com/en/features/treeshaking/#vuetify-loader"&gt;forma mais enxuta possível&lt;/a&gt;. A forma que o vue2 foi desenhado &lt;a href="https://github.com/vuejs/vue-cli/issues/1644#issuecomment-469308280"&gt;não permite&lt;/a&gt; usar alguns recursos de redução de bundle do webpack, o que é somewhat triste, mas reclamar disso é pedir demais pelo trabalho dos caras. Inclusive, alguns dos problemas que existem nesse quesito, se bem me recordo, vão ser adereçados no vue3, então os caras já estão cientes e trabalhando nisso. &lt;/p&gt;

&lt;h2&gt;
  
  
  Negligenciar os logs do terminal... nem dá nada, até ser tarde demais
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---12BTpKp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4qxsfbrh4sxrfslmw3ju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---12BTpKp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4qxsfbrh4sxrfslmw3ju.png" alt="Report do build"&gt;&lt;/a&gt;&lt;/p&gt;
O build é feito, mas não consigo ver o output por conta dos erros do log



&lt;p&gt;_&lt;/p&gt;

&lt;p&gt;Eu não sei em que momento do projeto a gente parou de dar bola pros linters. Tem toda uma treta encima do eslint e sua compatibilidade com typescript (tslint foi descontinuado e virou outra lib que, enquanto estávamos desenvolvendo ainda estava bem imatura se bem me lembro) e numa mistura de prettier, eslint, typescript, chegou uma hora que nos embananamos e não deu pra dar conta mais. Isso sem contar com o fato de eu usar o Sublime Text antes (saudades), que no meu ubuntuzinho, não tinha a melhor das integrações com linter (parte porque meu ubuntu sempre vive meio quebrado). Mas tava tudo funcionando, né.&lt;/p&gt;

&lt;p&gt;Daí chegou um ponto que começou a atrapalhar. Não conseguíamos ver o output do comando de build, não conseguíamos mais usar o logo como auxílio, regras de typescript quase não faziam sentido mais. Até tentei fazer uns refactors pra ir limpando essas coisas, mas a pressão do projeto me obrigava a avançar mais rápido do que meus refactors davam conta. Só fui sentir a dor de verdade quando fui otimizar a build final: tive que desativar o typescript e os linters pra fazer que o comando rodasse sem erro, e aí sim entendi alguns gargalos que não tinha noção antes (até tinha, mas não passava de "em ambiente de homolog leva muito tempo pra abrir o sistema", seguido por um "as otimizações necessárias ainda precisam ser feitas").&lt;br&gt;
Não deixem chegar a esse ponto, menines.&lt;/p&gt;

&lt;h1&gt;
  
  
  Coisas que senti necessidade / Looking forward to:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Styled components
&lt;/h2&gt;

&lt;p&gt;Tem várias strings gigantes de várias classes que foram repetidas em vários momentos. Com certeza dava pra agregar elas em unidades de classes semânticas (o que seria meio que dar um 360 no conceito de CSS funcional, mas há o debate de que CSS funcional é um 360 encima do style inline... enfim, discussão pra outro momento). O importante é que eu senti falta de aplicar isso no sistema a partir de um determinado momento. Tenho certeza que, com styled components, os templates ficariam significantemente mais enxutos e semânticos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Typescript
&lt;/h2&gt;

&lt;p&gt;Finalmente caiu a ficha sobre &lt;a href="https://www.typescriptlang.org/"&gt;typescript&lt;/a&gt;. Quanto maior o código, maior a chance de você não saber o que tem naquela variável. Além da tipagem, typescript também documenta as coisas, facilita a vida de quem for mexer naquele código depois e não tiver tudo na ponta da língua. Meu uso de typescript nesse projeto deixou a desejar, mas já foi o suficiente pra entender o real valor desse negócio que eu tive tanta resistencia em usar, afinal, "vai demorar mais pra escrever as coisas!"&lt;/p&gt;

&lt;h2&gt;
  
  
  Usar mais o vuex...? Talvez?
&lt;/h2&gt;

&lt;p&gt;Eu uso esse fluxograma que tem me servido bem como guia de tomada de decisão:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sgaldxg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--8FLfEUjr--/c_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880/https://raw.githubusercontent.com/maxpou/maxpou.fr/master/content/posts/2018-12-13-scaling-vue-app/vuex-or-not.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sgaldxg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--8FLfEUjr--/c_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880/https://raw.githubusercontent.com/maxpou/maxpou.fr/master/content/posts/2018-12-13-scaling-vue-app/vuex-or-not.png" alt=""&gt;&lt;/a&gt; &lt;br&gt;
 Porém, às vezes fico pensando se  talvez desse para passar mais lógica de processamento para o vuex. Esse projeto não teve cache de dados, nem uma hierarquia complexa de componentes. Claro, há bastante informação no store, mas quase sempre era nas camadas de estrutura do projeto, e não nas features em si. Sempre quando vou ver outros projetos grandes, eu vejo umas stores ultra boladas, e fico pensando: será que eles tão jogando as coisas no vuex onde não precisa? Será que meu projeto realmente não precisa de vuex? Ou será que eu tô fazendo algo errado? &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Espero que tenham tirado algum proveito. O Vue 2 dá pra fazer bastante coisa dahora, e consideravelmente mais simples, rápido e divertido que nos outros frameworks (sou enviesado pra falar por ser o framework que mais usei até agora? Imagiiiina...). &lt;br&gt;
Muitas necessidades foram surgindo no meio do caminho da timeline do desenvolvimento do framework, e foram sendo adereçadas pela comunidade enquanto a ideia de uma forma mais nativa para se resolver era matutada em background pela galera do desenvolvimento do Vue 3, que já saiu e provavelmente vai ser usado no próximo projeto aqui na Snowman Labs. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Agilidade e eficiência no git com oh-my-zsh</title>
      <dc:creator>Alex M.</dc:creator>
      <pubDate>Tue, 28 May 2019 20:17:37 +0000</pubDate>
      <link>https://dev.to/alexmoreno/agilidade-e-eficiencia-no-git-com-oh-my-zsh-39pj</link>
      <guid>https://dev.to/alexmoreno/agilidade-e-eficiencia-no-git-com-oh-my-zsh-39pj</guid>
      <description>&lt;p&gt;Já dizia o FBI, &lt;em&gt;Winners don't use GUI&lt;/em&gt;. Se você gosta daqueles negócio de git kraken, sublime merge, etc, tudo coloridinho e bonitinho, esse artigo não é pra você. Aqui só fica quem é hackudo com força, nerdão dos terminal, que quando garoto abria o cmd do windows e ficava digitando qualquer coisa na telinha preta até ter que formatar o windows pois apagou a system32 por acidente.&lt;/p&gt;

&lt;p&gt;Você tá cansado de digitar os comandinho do git tudo, amiguinho? Seu workflow é orientado a git mas você não aguenta mais abrir o terminal pra ficar criando branch, dando comitinho e pushzinho? É um saco, né, digitar um monte de tralha e apertar tab várias vezes até achar a branch que você quer. Eu te entendo, eu também sofria disso. Sofria, pois agora com os poderes cabulosos do oh-my-zsh, meus problemas acabaram! Os seus ainda não, mas vão acabar assim que você ler esse artigo.&lt;/p&gt;

&lt;p&gt;Primeiramente, instale o &lt;a href="https://github.com/robbyrussell/oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt; na sua máquina. Ele é lindo e você nunca mais vai querer trocar. Depois, leia com atenção os poderes que os plugins de &lt;a href="https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh"&gt;git&lt;/a&gt; e &lt;a href="https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git-flow"&gt;git-flow&lt;/a&gt; dele possuem:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gcd &amp;amp;&amp;amp; ggpull&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git checkout develop &amp;amp;&amp;amp; git checkout origin git_current_branch&lt;/code&gt;, ou seja, acabou uma feature? Publicou, foi lá e fez o PR? Foi aceito, mergeado? Ótimo. Manda esse comando que sua develop já vai refletir a &lt;code&gt;develop&lt;/code&gt; remota. Dependendo do seu fluxo essa pode ser a forma mais eficaz (caso você possa ir lá e aceitar o seu próprio PR por qualquer razão) ou não (precisa de um code review, precisa que alguém aceite o PR, etc.) antes de começar a trabalhar em outra feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gapa [&amp;amp;&amp;amp; gc]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git add --patch&lt;/code&gt; (ou simplesmente &lt;code&gt;-p&lt;/code&gt;). Olha, se você se sente confortável usando &lt;code&gt;git commit -a&lt;/code&gt;, beleza. Mas eu sugiro que você dê uma olhada em como funciona o &lt;code&gt;--patch&lt;/code&gt; ou &lt;code&gt;-p&lt;/code&gt;, porque ele te dá um nível de controle incrível do que vai pra stage ou não. Depois que eu me acostumei a usar as letrinhas do comando, só uso isso agora. Ou dou &lt;code&gt;gapa&lt;/code&gt; ou dou &lt;code&gt;gc -p&lt;/code&gt; (&lt;code&gt;git commit -p&lt;/code&gt;, infelizmente o plugin de git do ohmyzsh não tem plugin nativo para &lt;code&gt;git commit -p&lt;/code&gt;, e &lt;code&gt;gcp&lt;/code&gt; já se refere à &lt;code&gt;git cherry-pick&lt;/code&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gcb nome-da-branch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git checkout -b nome-da-branch&lt;/code&gt;. A agilidade que esse comando te dá é ótima. Nunca mais digitar &lt;code&gt;git checkout branch&lt;/code&gt; e perceber que esqueceu a flag, daí reescrever o comando ou apertar setinha pra cima, colocar o cursor no lugar certo, digitar -b e dar enter. Com esse comando, não tem erro. Curto, prático e eficaz.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gcam "mensagem do commit"&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git commit -am ""mensagem do commit"&lt;/code&gt;. OK, eu não aconselho você a usar esse comando, mas caso você viva la vida loka, full XGH, boladão sem freio, go fast break things, manda bala. Confesso que já usei muito, mas graças a Ancient Apparition me livrei desse mal que me afligia.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/ggpu(sh|ll)/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git push origin git_current_branch&lt;/code&gt; e &lt;code&gt;git pull origin git_current_branch&lt;/code&gt;, respectivamente. Esse, assim como o &lt;code&gt;gcb&lt;/code&gt;, foi um dos comandos que mais fiquei feliz de aprender. Nunca mais precisar digitar as 2 primeiras letras do nome da branch e ficar apertando tab até achá-las! Nunca mais se perder! Hooray, agilidade!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gcm&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Um dia eu fui um jovem plebeu que commitava coisas na master. Daí eu passei a criar branches a partir da master. Hoje o git frô me apresentou a solução e o caminho da luz para muitos problemas que me assolavam. Mas caso você ainda necessite ir até a &lt;code&gt;master&lt;/code&gt; frequentemente, &lt;code&gt;gcm&lt;/code&gt; é a forma mais ágil para isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ggu&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git pull --rebase origin git_current_branch&lt;/code&gt; Se você é do #TeamRebase, esse comando é seu novo amorzinho. &lt;code&gt;ggu&lt;/code&gt; e pronto. Tá na mão, garotchenho.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gl&lt;/code&gt; e &lt;code&gt;gp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalhos para &lt;code&gt;git pull&lt;/code&gt; e &lt;code&gt;git push&lt;/code&gt;. Versatilidade com rapidez. Depois de &lt;code&gt;gl&lt;/code&gt; e &lt;code&gt;gp&lt;/code&gt;, você pode argumentar à vontade com seu comando e ter o melhor dos dois mundos na ponta dos seus dedos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gdba&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d&lt;/code&gt; Rapaz, use esse comando com &lt;em&gt;cuidado&lt;/em&gt;. Ou não, como a gente bem, sabe, deu merda no git? cd ..... Esse comando joga fora toda a louça descartável que tá na pia, seu preguiçoso! Nem pra jogar os copinhos descartáveis fora, tsc tsc... Todas as branches que já foram mergeadas, exceto master, develop e dev (me corrigam se estiver errado), são apagadas, mas apenas em local. Ou seja, adeus pilha de branches velhas em local!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gc!&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git commit -v --amend&lt;/code&gt;. Um clássico. Digitei a mensagem errada e só percebi depois que saí? &lt;code&gt;gc!&lt;/code&gt;, corrige, salva e sai. Quanto mais disléxico, mais útil.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;glo&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git log --oneline --decorate&lt;/code&gt;. Ver todos os commits em oneline, com hash, merge e &lt;em&gt;corzinha&lt;/em&gt;.  Inclusive, eu sugiro que você teste e dê uma boa olhada em todos os possíveis atalhos para &lt;code&gt;git log&lt;/code&gt;. Definitivamente vale a pena o tempo investido.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gsta&lt;/code&gt; e &lt;code&gt;gstaa&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git stash push&lt;/code&gt; e &lt;code&gt;git stash apply&lt;/code&gt;. Respectivamente, coloca tudo na stash mais recente, e pega a stash mais recente e aplica de volta ao projeto. Muito útil quando você tem problemas pra trocar de branch &lt;em&gt;because you left some unstaged changes&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;gwch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Atalho para &lt;code&gt;git whatchanged -p --abbrev-commit --pretty=medium&lt;/code&gt;. &lt;code&gt;git whatchanged&lt;/code&gt; é bem parecido com ´git log´ mas vai mostrando os arquivos que foram alterados em cada commit. A flag &lt;code&gt;-p&lt;/code&gt; faz com que as alterações dentro do código sejam exibidas também. &lt;code&gt;--abbrev-commit&lt;/code&gt; mostra a hashzinha e &lt;code&gt;--pretty=medium&lt;/code&gt; é uma formatação de commit. Uso ele mais raramente, mas é bom saber que existe quando preciso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seus próprios aliases
&lt;/h3&gt;

&lt;p&gt;Eu absolutamente encorajo (e confesso que devia fazer mais também) seus próprios atalhos usando os comandos do zsh. Tem qualquer sequência de comandos que você digita frequentemente? Vai lá e faz um &lt;code&gt;alias&lt;/code&gt; pra eles juntos. Sabe aqueles &lt;code&gt;git log&lt;/code&gt; ou &lt;code&gt;git status&lt;/code&gt; customizados que você adora usar? &lt;code&gt;alias&lt;/code&gt; neles. Você pode fazer no arquivo do seu shell (&lt;code&gt;.zshrc&lt;/code&gt;) ou no seu git, usando &lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases"&gt;&lt;code&gt;git config&lt;/code&gt;&lt;/a&gt;. Eu prefiro deixar nos meus dotfiles, pois fica mais fácil de carregar pra lá e pra cá. Por exempl, eu gosto de &lt;code&gt;git log --oneline --decorate --no-merges&lt;/code&gt;, então deixo um &lt;code&gt;alias gl=comando&lt;/code&gt; lá no fim do meu ´.zshrc´&lt;br&gt;
Faça os seus também, cada keystroke a menos que você dá, é menos uma keystroke que leva para você se tornar um legítimo hack3rboy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ah, mas o git flow?
&lt;/h1&gt;

&lt;p&gt;Que bom que perguntou. A gente tem agilidade pro git flow também, que também é agilidade. Recursive agilidade. Caraca.&lt;/p&gt;

&lt;p&gt;Você precisa instalar o &lt;a href="https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git-flow"&gt;plugin do git flow&lt;/a&gt; no seu zsh.&lt;/p&gt;

&lt;p&gt;Olha, esse dá pra gravar todo na cabeça simplesmente entendendo como funciona o esquema de abreviação deles.&lt;br&gt;
Os comandos básicos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;g&lt;/code&gt; =&amp;gt; &lt;code&gt;git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fl&lt;/code&gt; =&amp;gt; &lt;code&gt;flow&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Os tipos de branch:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;f&lt;/code&gt; =&amp;gt; &lt;code&gt;feature&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;h&lt;/code&gt; =&amp;gt; &lt;code&gt;hotfix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;r&lt;/code&gt; =&amp;gt; &lt;code&gt;release&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Os comandos específicos do gitflow:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;s&lt;/code&gt; =&amp;gt; &lt;code&gt;start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;f&lt;/code&gt; =&amp;gt; &lt;code&gt;finish&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;p&lt;/code&gt; =&amp;gt; &lt;code&gt;publish&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Logo, se eu quiser dar um &lt;code&gt;git flow feature start nome-da-branch&lt;/code&gt;, é só eu dar &lt;code&gt;g&lt;/code&gt; + &lt;code&gt;fl&lt;/code&gt; + &lt;code&gt;f&lt;/code&gt; + &lt;code&gt;s&lt;/code&gt;, ou seja, &lt;code&gt;gflfs&lt;/code&gt;. Memela na pepela, meus camaradas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agilidade na prática
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git flow&lt;/code&gt; já deixa as coisas super simples para produzir algo na sua codebase. Olha só como, depois de ter os atalhos na ponta da língua, as coisas ficam ágeis para subir uma feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeiro, &lt;code&gt;gflfs nome-da-feature&lt;/code&gt; para iniciar a feature.&lt;/li&gt;
&lt;li&gt;Depois, codar.&lt;/li&gt;
&lt;li&gt;Terminou? &lt;code&gt;gapa &amp;amp;&amp;amp; gc&lt;/code&gt; (ou &lt;code&gt;gc -p&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Fez o commit? Tudo certo? &lt;code&gt;gflfp&lt;/code&gt; publica em remote automaticamente, tudo certinho.&lt;/li&gt;
&lt;li&gt;Sua branch remota foi aprovada e mergeada na develop remota? &lt;code&gt;gcd &amp;amp;&amp;amp; ggpull&lt;/code&gt;, e sua local já tá atualizada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pimba. Mais fácil que isso, só um clone seu fazendo isso por você.&lt;/p&gt;

&lt;p&gt;E aí, tem alguma coisa pra adicionar? Futucou o git.plugin.zsh e achou alguma coisa útil que você usa bastante mas não tá no artigo? Deixa nos comentários, que quem achar esse artigo depois, vai ler ele com &lt;code&gt;merge&lt;/code&gt; do seu conhecimento.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
