<?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: Yuri Sales</title>
    <description>The latest articles on DEV Community by Yuri Sales (@yurisales).</description>
    <link>https://dev.to/yurisales</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%2F12053%2Fac72f8de-f5c3-46ec-94ed-695d91222fe0.jpg</url>
      <title>DEV Community: Yuri Sales</title>
      <link>https://dev.to/yurisales</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yurisales"/>
    <language>en</language>
    <item>
      <title>Utilizando o módulo Motor Fan L9110 com Arduino</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Wed, 27 Aug 2025 04:15:10 +0000</pubDate>
      <link>https://dev.to/yurisales/utilizando-o-modulo-motor-fan-l9110-com-arduino-498p</link>
      <guid>https://dev.to/yurisales/utilizando-o-modulo-motor-fan-l9110-com-arduino-498p</guid>
      <description>&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Motor Fan L9110&lt;/strong&gt; é um módulo pequeno e de baixo custo muito utilizado em projetos de robótica diy, especialmente em projetos "bombeiros" visando conter pequenos incêndios.&lt;/p&gt;

&lt;p&gt;Ele atua como um intermediário entre um microcontrolador (no nosso caso, o arduino) e o motor do ventilador, permitindo que você controle tanto a velocidade de rotação da hélice quanto a direção. E isso se dá por causa do circuito &lt;strong&gt;L9110&lt;/strong&gt; que ele possui, constituído de duas &lt;strong&gt;pontes h&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ao aplicar uma tensão em um motor de qualquer uma das duas direções,o usuário é capaz de direcionar a rotação da hélice. Tudo isso graças ao circuito eletrônico da &lt;strong&gt;ponte H&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzyjemr02alotkhu6scf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzyjemr02alotkhu6scf.png" alt="Imagem do módulo" width="618" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver que o módulo possui 4 pinos de conexão:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VCC&lt;/strong&gt;: conectamos este pino na tensão de alimentação do Arduino. No caso deste módulo, 5v.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GND&lt;/strong&gt;: terra. Conectamos ao GND no Arduino.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 NB&lt;/strong&gt; e &lt;strong&gt;1 NA&lt;/strong&gt;: são os pinos de controle. Cada um é conectado em uma saída digital no Arduino. É neles que fazemos o controle de direção. Se definimos a saída de um deles como &lt;strong&gt;HIGH&lt;/strong&gt; e o outro como &lt;strong&gt;LOW&lt;/strong&gt; o motor rotacionará para um lado e vice-versa. Se ambos possuírem o mesmo valor, a hélice ficará parada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mão na massa
&lt;/h2&gt;

&lt;p&gt;Vamos criar um circuito em que controlamos o funcionamento do nosso mini-ventilador com um&lt;br&gt;
potenciômetro. Quanto mais eu girar o pino do potenciômetro em sentido horário, maior será a velocidade de rotação do motor.&lt;/p&gt;

&lt;p&gt;Para criar este projeto, você precisará de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 Arduino Uno&lt;/li&gt;
&lt;li&gt;1 Potenciômetro&lt;/li&gt;
&lt;li&gt;1 Protoboard&lt;/li&gt;
&lt;li&gt;1 Motor Fan L9110&lt;/li&gt;
&lt;li&gt;Alguns Jumpers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos primeiro conectar nossa fonte de tensão (5V) e o terra (GND) na nossa protoboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8tnx6cbl8638ki11bwi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8tnx6cbl8638ki11bwi.png" alt="Circuito com arduino" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conectemos o pino central do potenciômetro na saída analógica A0 do Arduino. E, respectivamente, o GND e o VCC na protoboard.&lt;/p&gt;

&lt;p&gt;O pino A0 da placa é uma entrada analógica, ou seja, é uma entrada que entende sinais analógicos e produz uma tensão variável a partir do valor enviado.&lt;/p&gt;

&lt;p&gt;O potenciômetro é um resistor variável. Conforme giramos o seu eixo, a resistência é alterada, consequentemente, alterando a tensão de saída que ele envia para a placa, variando entre 0V e 5V.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5iss2duuo58bbjbe3n5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5iss2duuo58bbjbe3n5v.png" alt="Circuito com potenciômetro" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E, para finalizar o nosso circuito, vamos adicionar o nosso &lt;strong&gt;Motor Fan L9110&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O pino 1 NB será conectado na saída digital 9. O pino 1 NA no ground, já que queremos movimentar nossa hélice apenas em uma direção, e os outros no ground e no VCC.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhaxszeisl1xbsi84c605.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhaxszeisl1xbsi84c605.png" alt="Circuito completo" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora adicionar este código na sua IDE do Arduino e executar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffih50fc3p4crgd9h63rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffih50fc3p4crgd9h63rh.png" alt="Código para execução do projeto" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um adendo quanto à definição do &lt;code&gt;targetSpeed&lt;/code&gt;: o potenciômetro lê valores entre 0 e 1023. Entretanto, a função &lt;code&gt;analogWrite()&lt;/code&gt; só aceita valores entre 0 e 255. Portanto, é necessário que um mapeamento seja feito para a escala suportada pela função.&lt;/p&gt;

&lt;p&gt;O delay é apenas um enfeite para termos uma transição mais suave durante as mudanças de velocidade.&lt;/p&gt;

&lt;p&gt;Fim! Obrigado pela leitura!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Uncovering Generative Artificial Intelligence and LLMs: A Brief Introduction</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sat, 02 Mar 2024 23:00:20 +0000</pubDate>
      <link>https://dev.to/yurisales/uncovering-generative-artificial-intelligence-and-llms-a-brief-introduction-4ge2</link>
      <guid>https://dev.to/yurisales/uncovering-generative-artificial-intelligence-and-llms-a-brief-introduction-4ge2</guid>
      <description>&lt;p&gt;With the popularization of tools such as ChatGPT, Google Bard (currently Gemini), and other similar applications, which generate responses based on what the user asks, the machinery behind these innovations also came to light.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk64kxi2js5wex2u0ri7f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk64kxi2js5wex2u0ri7f.jpg" alt="A machine turning into a human being with data and books behind it" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We call the set of these technologies &lt;strong&gt;Generative Artificial Intelligence&lt;/strong&gt;. Generative AI is, under the hood, algorithms that generate content based on patterns recognized in previously learned data.&lt;/p&gt;

&lt;p&gt;Different from other categories of Machine Learning, Generative AIs work by &lt;strong&gt;synthesizing new data instead of just predicting and making decisions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With the evolution of statistical models and analysis of linguistic patterns since the 80s, with the advancement of Machine Learning algorithms, along with the exponential growth of data and information from the internet, combined with the increase of the storage capacity with technical improvements and cheaper hardware, Generative AI has become more feasible.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;LLMs (Large Language Models)&lt;/strong&gt; emerged from this reality of abundant data. They are Machine Learning models focused on working with Natural Language Processing, that is, &lt;strong&gt;processing, understanding, interpreting, and generating human language&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With a vast amount of data learned, the LLMs can detect existing patterns and relationships between the words in a given sentence. &lt;br&gt;
From there, they are able to make predictions of the possible next words, generating more meaningful answers.&lt;/p&gt;

&lt;p&gt;The applications of LLMs are diverse, from developing dialogues to generating text, code, images, audio, video, and much more. You can also use video, audio, and image as data input.&lt;/p&gt;

&lt;p&gt;Today, it's possible to utilize LLMs to create chatbots and virtual assistants, code generators and correctors, sentiment analysis, text classification and grouping, translation, summarization, you name it.&lt;/p&gt;

&lt;p&gt;The future of Generative AI promises even more improvements and possibilities, evolving how we interact and utilize the technology in our daily lives.&lt;/p&gt;

&lt;p&gt;Please share this post with your friends.&lt;/p&gt;

&lt;h4&gt;
  
  
  References:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Large Language Models (LLM) - Databricks&lt;/li&gt;
&lt;li&gt;Generative AI with LangChain - Ben Auffart&lt;/li&gt;
&lt;li&gt;Desenvolvendo aplicativos com GPT-4 e ChatGPT - Olivier Caelen e Maria-Alice Blete&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gpt4</category>
      <category>generativeai</category>
      <category>llm</category>
      <category>largelanguagemodels</category>
    </item>
    <item>
      <title>#14 Mentoring, Apprenticeship, and Craftsmanship - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 11 Oct 2020 12:55:43 +0000</pubDate>
      <link>https://dev.to/yurisales/14-mentoring-apprenticeship-and-craftsmanship-tips-from-the-clean-coder-2c8h</link>
      <guid>https://dev.to/yurisales/14-mentoring-apprenticeship-and-craftsmanship-tips-from-the-clean-coder-2c8h</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the last article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the last chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;I have been consistently disappointed by the quality of CS graduates. It's not that the graduates aren't bright or talented, it's just that they haven't been taught what programming is really all about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Degrees of failure
&lt;/h3&gt;

&lt;p&gt;Not all CS graduates are disappointing - far from it! However, I've noticed that those who aren't something in common: Nearly all of them &lt;em&gt;taught themselves to program&lt;/em&gt; before they entered university and continued to teach themselves despite university.&lt;/p&gt;

&lt;p&gt;Now don't get me wrong. I think it's possible to get excellent graduation at a university. It's just that I also think it's possible to wiggle yourself through the system and come out with a diploma, and not much else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4t1vnhbh34xfmkb1ike.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4t1vnhbh34xfmkb1ike.gif" alt="diploma" width="480" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there's another problem. Event the best CS degree programs do not typically prepare the young graduate for what the will find in the industry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mentoring
&lt;/h3&gt;

&lt;p&gt;There are several ways to learn things. You can learn by reading manuals written by other developers (you can include here documentation, tutorials, articles, you name it). You also can learn by observing people doing their job, and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4ydrymsmyc72ycgp5m2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4ydrymsmyc72ycgp5m2.gif" alt="mentor" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would have been far better if I'd had a mentor, someone to teach me the in's and out's. Someone I could have observed while I helped him with small tasks, and who would review and guide my early work. Someone to act as a role model and teach me appropriate values and reflexes. A sensei. A master. A mentor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprenticeship
&lt;/h3&gt;

&lt;p&gt;What do doctors do? DO you think hospitals hire medical graduates and throw them into operating rooms to do heart surgery on their first day on the job? Of course not.&lt;/p&gt;

&lt;p&gt;Somehow the software development industry has gotten the idea that programmers are programmers, and that once you graduate you can code. Indeed, it's not at all uncommon for companies to hire kids right out of school, form them into "teams", and ask them to build the most critical system. It's insane.&lt;/p&gt;

&lt;p&gt;Let's do not kid ourselves that this doesn't matter. There's a lot at stake. Our civilization runs on software. It is software that moves and manipulates the information that pervades our daily life.&lt;/p&gt;

&lt;p&gt;Given that we entrust software developers with all aspects of our lives, from the minutia to the momentous, I suggest that a reasonable period of training and supervised practice is not inappropriate.&lt;/p&gt;

&lt;h4&gt;
  
  
  Software apprenticeship
&lt;/h4&gt;

&lt;p&gt;So how &lt;em&gt;should&lt;/em&gt; the software profession induct young graduates into the ranks of professionalism? What steps should they follow? What challenges should they meet? What goals should they achieve? Let's work it backwards.&lt;/p&gt;

&lt;h5&gt;
  
  
  Masters
&lt;/h5&gt;

&lt;p&gt;These are programmers who have taken the lead on more than one significant project. Typically they'll have 10+ years of experience and will have worked on several different kinds of systems, languages, and operating systems. They maintain that technical role by reading, studying, practicing, doing, and &lt;em&gt;teaching&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof1lkc3fpul304bdwbkf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof1lkc3fpul304bdwbkf.gif" alt="shion" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Journeymen
&lt;/h5&gt;

&lt;p&gt;These are programmers who are trained, competent, and energetic. During this period of their career, they will learn to work well in a team and to become team leaders. They tend to learn one language, one system, one platform; but they're learning more. As they gain experience, autonomy grows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt82zvoan118h0xo7o6t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt82zvoan118h0xo7o6t.gif" alt="mu" width="500" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Apprentices/Interns
&lt;/h5&gt;

&lt;p&gt;Apprentices have no autonomy. They're very closely supervised by journeymen. At the first they take no tasks at all, they simply provide assistance to the journeyman. This should be a time of a very intensive pair-programming. This is when disciplines are learned and reinforced. This is when the foundation of value is created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlg4id6qgib9dtc9tudz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlg4id6qgib9dtc9tudz.gif" alt="kiki" width="500" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The reality
&lt;/h4&gt;

&lt;p&gt;All of this is idealized and hypothetical. However, if you change the names and squint ate the words, you'll realize that it's not all that different from the way we &lt;em&gt;expect&lt;/em&gt; things to work now. Graduates are supervised by young team leads, who are supervised by project-leads, and so on.&lt;/p&gt;

&lt;p&gt;The problem is that, in most cases, this supervision &lt;em&gt;is not technical!&lt;/em&gt; In most companies there is no technical supervision at all. Programmers get raises and eventual promotion because, well, that's just what you do with programmers.&lt;/p&gt;

&lt;p&gt;The difference between what we do today and my idealized program of apprenticeship is the focus on technical teaching, training, supervision, and review. What's missing from our current sterile approach is the responsibility of the elders to teach the young.&lt;/p&gt;

&lt;h3&gt;
  
  
  Craftsmanship
&lt;/h3&gt;

&lt;p&gt;To understand, let's look at the word &lt;em&gt;craftsman&lt;/em&gt;. This word brings to mind skill and quality. It evokes experience and competence. A craftsman is someone who works quickly, but without rushing, who provides reasonable estimates and meets commitments. A craftsman knows when to say no, but tries hard to say yes. A craftsman is a professional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F780pn06fi1wtn3rjl1j4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F780pn06fi1wtn3rjl1j4.gif" alt="craftsman" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Craftsmanship is the &lt;em&gt;mindset&lt;/em&gt; held by craftsman. Craftsmanship is a meme that contains values, disciplines, techniques, attitudes, and answers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Convincing people
&lt;/h4&gt;

&lt;p&gt;How do you get people to adopt the craftsmanship meme? Remember that a meme is contagious, but only if it can be observed. So you make the meme &lt;em&gt;observable&lt;/em&gt;. You act as a role model. You become a craftsman first, and let your craftsmanship show. Then just let the meme do the rest of the work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;School an teach the theory of computer programming. But school does not, and cannot teach the discipline, practice, and skill of being a craftsman. Those things are acquired through years of personal tutelage and mentoring.&lt;/p&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/12-collaboration-tips-from-the-clean-coder-b6g"&gt;#12 Collaboration&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#13 Teams and Projects - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 04 Oct 2020 20:01:58 +0000</pubDate>
      <link>https://dev.to/yurisales/13-teams-and-projects-tips-from-the-clean-coder-5blm</link>
      <guid>https://dev.to/yurisales/13-teams-and-projects-tips-from-the-clean-coder-5blm</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the thirteenth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the thirteenth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;What if you have lots of little projects to get done? How should you allocate those projects to the programmers? What if you have one really huge project to get done?&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it blend?
&lt;/h3&gt;

&lt;p&gt;It makes no sense to tell a programmer to devote half of their time to project A and the rest of their time to project B, especially when the two projects have two different managers, different business analysts, different programmers, and different testers. How in Hell's kitchen can you call a monstrosity like that a team? That's not a team, that's something that came out of a Waring blender.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t08uobex2bnupnmnm37.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t08uobex2bnupnmnm37.gif" alt="blend" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Gelled Team
&lt;/h4&gt;

&lt;p&gt;It takes time for a team to form. The team members start to form relationships. They learn how to collaborate with each other. They learn each other's quirks, strengths, and weaknesses. Eventually, the team begins to &lt;em&gt;gel&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There's something truly magical about a gelled team. They can work miracles. They anticipate each other, cover for each other, support each other, and demand the best from each other. They make things happen. The team should be composed of programmers, testers, and analysts. And it should have a project manager.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmifz0s4chkvbx4imkkr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmifz0s4chkvbx4imkkr.gif" alt="gelled" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fermentation
&lt;/h4&gt;

&lt;p&gt;It takes time for a team like this to work out their differences, come to terms with each other, and really gel. A gelled team will plan together, solve problems together, face issues together, and &lt;em&gt;get things done&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Once this happens, it is ludicrous to break it apart just because a project comes to an end. It's best to keep that team together and just keep feeding it projects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Which came first, the team or the project?
&lt;/h4&gt;

&lt;p&gt;Banks and insurance companies tried to form teams around projects. This is a foolish approach. The teams simply cannot gel. The individuals are only on the project for a short time, and only for a percentage of their time, and therefore never learn how to deal with each other.&lt;/p&gt;

&lt;p&gt;Professional development organizations allocate projects to existing gelled teams, they don't form teams around projects. A gelled team can accept many projects simultaneously and will divvy up the work according to their own opinions, skills, and abilities. The gelled team will get the projects done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fduohu965y7q3m9zxgjep.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fduohu965y7q3m9zxgjep.gif" alt="team" width="540" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  But how to manage that?
&lt;/h4&gt;

&lt;p&gt;Teams have velocities. Velocity is the amount of work it can get done in a fixed period of time. Some teams measure their velocity in points per week, where points are a unit of complexity. They break down the features of each project they are working on and estimate them in points. Then they measure how many points they get done per week.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc89i3nlicuhw3q124bii.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc89i3nlicuhw3q124bii.gif" alt="manager" width="350" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Velocity is a statistical measure. Over time this will average out. Management can set targets for each project given to a team. Aside from having a gelled team working on your projects, the advantage of the scheme is that in an emergency the business can say, "Project B is in crisis; put 100% of your effort on that project for the next three months".&lt;/p&gt;

&lt;h4&gt;
  
  
  The Project Owner dilemma
&lt;/h4&gt;

&lt;p&gt;One of the objections to the approach I'm advocating is that the project owners lose some security and power. If projects are given to gelled teams, and if those teams take on several projects at the same time, then the business is free to change priorities on a whim. This can make the project owner insecure about the future. The resources that project owner is depending on might be suddenly removed from him.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Teams are harder to build than projects. Therefore, it is better to form persistent teams that move together from one project to the next and can take on more than one project at a time. The goal in forming a team is to give that team enough time to gel and then keep it together as an engine for getting many projects done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgkthuuvc3aitu4evq6h.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgkthuuvc3aitu4evq6h.gif" alt="teams2" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/14-mentoring-apprenticeship-and-craftsmanship-tips-from-the-clean-coder-2c8h"&gt;#14 Mentoring, Apprenticeship and Craftsmanship&lt;/a&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/12-collaboration-tips-from-the-clean-coder-b6g"&gt;#12 Collaboration&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#12 Collaboration - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 27 Sep 2020 14:39:32 +0000</pubDate>
      <link>https://dev.to/yurisales/12-collaboration-tips-from-the-clean-coder-b6g</link>
      <guid>https://dev.to/yurisales/12-collaboration-tips-from-the-clean-coder-b6g</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the twelfth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the twelfth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Most software is created by teams. Teams are most effective when the team members collaborate professionally. It's unprofessional to be a loner or a recluse on a team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Programmers versus people
&lt;/h3&gt;

&lt;p&gt;In general, we, programmers, enjoy the mild sensory deprivation and cocoon-like immersion of &lt;em&gt;focus&lt;/em&gt;. We are happiest when we are alone in a room for hours deeply focussing on some really interesting problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykophxv15uezyv2ahjrt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykophxv15uezyv2ahjrt.gif" alt="human sucks" width="540" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Programmers versus employers
&lt;/h4&gt;

&lt;p&gt;It's good to be passionate about what we do. But it's also good to keep your eye on the goals of the people who pay you.&lt;/p&gt;

&lt;p&gt;The first responsibility of the professional programmer is to meet the needs of his or her employer. That means collaborating with your managers, business analysts, testers, and other team members to &lt;em&gt;deeply understand&lt;/em&gt; the business goals. This doesn't mean you have to become a business work. It &lt;em&gt;does&lt;/em&gt; mean that you need to understand why you are writing the code you are writing, and how the business that employs you will benefit from it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv3uuleflzsg1ypey52g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv3uuleflzsg1ypey52g.gif" alt="employer" width="350" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The worst thing a professional programmer can do is to blissfully bury himself in a tomb of technology while the business crashes and burns around him. Your job is to keep the business afloat!&lt;/p&gt;

&lt;p&gt;So, professional programmers take the time to understand the business. They talk to users about the software they're using. They talk to sales and marketing people about the problems and issues they have. They talk to their managers to understand the short-and long-term goals of the team.&lt;/p&gt;

&lt;h4&gt;
  
  
  Programmers versus programmers
&lt;/h4&gt;

&lt;p&gt;Programmers often have difficulty working closely with other programmers. This leads to some really terrible problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy9gfhm933il0r6yg4lw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy9gfhm933il0r6yg4lw.gif" alt="programmers x programmers" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Owned code
&lt;/h4&gt;

&lt;p&gt;One of the worst symptoms of a dysfunctional team is when each programmer builds a wall around his code and refuses to let other programmers touch it. This is a recipe for disaster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqts7dxltx4vcphvshr1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqts7dxltx4vcphvshr1.jpg" alt="gilfoyle" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Collective ownership
&lt;/h4&gt;

&lt;p&gt;I prefer teams in which any team member can check out any module and make any changes they think are appropriate. I want the team to own the code, not the individuals.&lt;/p&gt;

&lt;p&gt;Professional developers don't prevent others from working in the code. Rather, they work with each other on as much of the system as they can. They learn from each other by working with each other on other parts of the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pairing
&lt;/h4&gt;

&lt;p&gt;Many programmers dislike the idea of pair-programming. I find this odd since most programmers &lt;em&gt;will&lt;/em&gt; pair in emergencies. Why? Because it is clearly the most efficient way to solve the problem.&lt;/p&gt;

&lt;p&gt;Professionals also pair because it is the best way to share knowledge with each other. Professionals don't create knowledge silos. Rather, they learn the different parts of the system and business by pairing with each other.&lt;/p&gt;

&lt;p&gt;Professionals pair because it is the best way to review code. No system should consist of code that hasn't been reviewed by other programmers.&lt;/p&gt;

&lt;p&gt;Professionals work &lt;em&gt;together&lt;/em&gt;. You can't work together while you are sitting in corners wearing headphones. So I want you sitting around tables &lt;em&gt;facing&lt;/em&gt; each other. I want you to be able to smell each other's fear. I want you to be able to overhear someone's frustrated mutterings. I want serendipitous communication, both verbal and body language. I want you communicating as a unit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4es93jpq213mznz1chs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4es93jpq213mznz1chs.gif" alt="pair" width="540" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are times when working alone is the right thing to do. There are times when you simply need to think long and hard about a problem. There are times when the task is so trivial that it would be a waste to have another person working with you. But, in general, it is best to collaborate closely with others and to pair with them a large fraction of the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Perhaps we didn't get into programming to work with people. Tough luck for us. Programming is &lt;em&gt;all about working with people&lt;/em&gt;. We need to work with our business, and we need to work with each other.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/13-teams-and-projects-tips-from-the-clean-coder-5blm"&gt;#13 Teams and Projects&lt;/a&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/11-pressure-tips-from-the-clean-coder-40i1"&gt;#11 Estimation&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#11 Pressure - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 20 Sep 2020 12:38:13 +0000</pubDate>
      <link>https://dev.to/yurisales/11-pressure-tips-from-the-clean-coder-40i1</link>
      <guid>https://dev.to/yurisales/11-pressure-tips-from-the-clean-coder-40i1</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the eleventh article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the eleventh chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Imagine that you're having an out-of-body experience, observing yourself on an operating table while a surgeon performs open-heart surgery on you. That surgeon is trying to save your life, but time is limited so he is operating under a deadline - a &lt;em&gt;literal&lt;/em&gt; deadline.&lt;/p&gt;

&lt;p&gt;How do you want that doctor to behave? Do you want him to appear calm and collected? Do you want him issuing clear and precise orders to his support staff? Do you want him following his training and adhering to his disciplines?&lt;/p&gt;

&lt;p&gt;Or do you want him sweating and swearing? Do you want him blaming management for unrealistic expectations and continuously complaining about the time? Do you want him behaving like a professional or like a typical developer?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT5LMUMQjFPHO10g6Y/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT5LMUMQjFPHO10g6Y/giphy.gif" alt="doctor" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The professional developer is calm and decisive under pressure. As the pressure grows he adheres to his training and disciplines, knowing that they are the best way to meet the deadlines and commitments that are pressing on him.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoiding pressure
&lt;/h3&gt;

&lt;p&gt;The best way to stay calm under pressure is to avoid the situations that cause pressure. That avoidance may not eliminate the pressure completely, but it can go a long way towards minimizing and shortening the high-pressure periods.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48yqcdff188ynipf6a2l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48yqcdff188ynipf6a2l.gif" alt="anxiety" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Commitments
&lt;/h4&gt;

&lt;p&gt;We must make sure that risk is quantified and presented to the business so that they can manage it appropriately. Accepting unrealistic commitments thwarts this goal and does a disservice to both the business and to ourselves.&lt;/p&gt;

&lt;p&gt;Professionals will always help the business find a way to achieve their goals. But professionals do not necessarily accept commitments made for them by the business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7eqqnmxud9rgdwsu4tl8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7eqqnmxud9rgdwsu4tl8.gif" alt="commitment" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is easy to say. But when your business is failing, and your paycheck is delayed because of missed commitments, it's hard not to feel the pressure. But if you have behaved professionally, at least you can hold your head high as you hunt for a new job.&lt;/p&gt;

&lt;h4&gt;
  
  
  Staying clean
&lt;/h4&gt;

&lt;p&gt;We can avoid pressure by keeping our system, our code, and our design as clean as possible. This does not mean that we spend endless hours polishing code. It simply means that we don't tolerate messes. Professionals realize that "quick and dirty" is an oxymoron. &lt;strong&gt;Dirty always means slow!&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Crisis discipline
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;You know what you believe by observing yourself in a crisis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you follow the discipline of TDD in non-crisis time but abandon it during a crisis, then you don't really trust that TDD is helpful. If you keep your code clean during normal times but make messes in a crisis, then you don't really believe that messes slow you down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pe2a5z7gfmujerqkr4k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pe2a5z7gfmujerqkr4k.gif" alt="discipline" width="424" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose disciplines that you feel comfortable following in a crisis. &lt;em&gt;Then follow them all the time&lt;/em&gt;. Following these disciplines is the best way to avoid getting into a crisis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling pressure
&lt;/h3&gt;

&lt;p&gt;Forestalling, mitigating, and eliminating pressure is all well and good, but sometimes the pressure comes despite all your best intentions and preventions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Don't panic
&lt;/h4&gt;

&lt;p&gt;Manage your stress. Sleepless nights won't help you get done any faster. Sitting and fretting won't help either. Rushing will only drive you deeper into the hole.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7wsg986malt57ntgnhj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7wsg986malt57ntgnhj.gif" alt="panic" width="439" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead, slow down. Plot a course to the best possible outcome, and then drive towards that outcome at a reasonable and steady pace.&lt;/p&gt;

&lt;h4&gt;
  
  
  Communicate
&lt;/h4&gt;

&lt;p&gt;Let your team and your superiors know that you are in trouble. Ask them for their input and guidance. Avoid creating surprises. Nothing makes people angrier and less rational than surprises. Surprises multiply the pressure by ten.&lt;/p&gt;

&lt;h4&gt;
  
  
  Get help
&lt;/h4&gt;

&lt;p&gt;Pair! When the heat is on, find an associate who is willing to pair program with you. You'll get done faster, with fewer defects. Your partner will spot things that you miss, will have helpful ideas, and will pick up the slack when you lose focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhq29e68rf2d46gr2ppo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhq29e68rf2d46gr2ppo.gif" alt="help" width="400" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the same token, when you see someone else who's under pressure, offer to pair with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The trick to handling pressure is to avoid it when you can, and weather it when you can't. You avoid it by managing commitments, following your disciplines, and keeping clean. You weather it by staying calm, communicating, following your disciplines, and getting help.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/12-collaboration-tips-from-the-clean-coder-b6g"&gt;#12 Collaboration&lt;/a&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/10-estimation-tips-from-the-clean-coder-59kp"&gt;#10 Estimation&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#10 Estimation - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 13 Sep 2020 15:04:37 +0000</pubDate>
      <link>https://dev.to/yurisales/10-estimation-tips-from-the-clean-coder-59kp</link>
      <guid>https://dev.to/yurisales/10-estimation-tips-from-the-clean-coder-59kp</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the tenth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the tenth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Estimation is one of the simplest, yet most frightening activities that software developers face. So many business values depend on it. It's the primary wedge that has been driven between business people and developers. It's the source of nearly all the distrust that rules that relationship.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is an estimate?
&lt;/h3&gt;

&lt;p&gt;Business likes to view it as commitments. Developers like to view as guesses. The difference is profound.&lt;/p&gt;

&lt;h4&gt;
  
  
  A commitment
&lt;/h4&gt;

&lt;p&gt;A commitment is something you must achieve. If you commit to getting something done by a certain date, then you simply &lt;strong&gt;have&lt;/strong&gt; to get it done by that date.&lt;/p&gt;

&lt;p&gt;Professionals don't make commitments unless they &lt;strong&gt;know&lt;/strong&gt; they can achieve them. It's really as simple as that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj75uyz22v4pvwhriaby.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj75uyz22v4pvwhriaby.gif" alt="commitment" width="371" height="209"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/yurishenrique/11-pressure-tips-from-the-clean-coder-40i1"&gt;https://dev.to/yurishenrique/11-pressure-tips-from-the-clean-coder-40i1&lt;/a&gt;&lt;br&gt;
Commitment is about &lt;strong&gt;certainty&lt;/strong&gt;. Other people are going to accept your commitments and make plans based upon them. The cost of missing those commitments, to them, and your reputation, is enormous. Missing them is an act of dishonesty only slightly less onerous than an overt lie.&lt;/p&gt;

&lt;h4&gt;
  
  
  An estimate
&lt;/h4&gt;

&lt;p&gt;An estimate is a guess. No commitment is implied. Missing an estimate is not in any way dishonorable. The reason we make estimates is because &lt;em&gt;we don't know&lt;/em&gt; how long something will take.&lt;/p&gt;

&lt;p&gt;Unfortunately, most software developers are terrible estimators, mainly because we don't understand the true nature of an estimate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8qyjikt9oxi4gyf5w8a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8qyjikt9oxi4gyf5w8a.gif" alt="estimate" width="480" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An estimate is not a number, but a &lt;strong&gt;distribution&lt;/strong&gt; - a probability distribution.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implied commitments
&lt;/h4&gt;

&lt;p&gt;Professionals draw a clear distinction between estimates and commitments. They do not commit unless they know for certain they will succeed. They are careful no to make any &lt;em&gt;implied&lt;/em&gt; commitments. They communicate the probability distribution of their estimates as clearly as possible so that managers can make appropriate plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  PERT
&lt;/h3&gt;

&lt;p&gt;in 1957, the Program Evaluation and Review Technique (PERT) was created to support the U.S. Navy Polaris submarine project. One of the elements of PERT is a scheme that provides a very simple and effective way to convert estimates into probability distributions suitable for managers.&lt;/p&gt;

&lt;p&gt;When you estimate a task, you provide three numbers. This is called &lt;strong&gt;trivariate analysis&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O: Optimistic Estimate. This number is &lt;em&gt;wildly&lt;/em&gt; optimistic. You could only get the task done this quickly if everything went right. In order for the math to work, this number should have much less than a 1% chance of occurrence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;N: Nominal Estimate: This is the estimate with the greatest chance of success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;P: Pessimistic Estimate. This is &lt;em&gt;wildly&lt;/em&gt; pessimistic. You should include everything except hurricanes, nuclear war, and other catastrophes. It also has much less than a 1% chance of success.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given these 3 numbers, we can describe the probability solution as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgsil9lpxoi3mxcjns1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgsil9lpxoi3mxcjns1v.png" alt="u" width="103" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;μ is the expected duration of the task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zsbgawl9eilq65bowpm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zsbgawl9eilq65bowpm.png" alt="o" width="81" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;δ is the standard variation of the probability distribution for the task. It's a measure of how uncertain the task is. When this number is large, the uncertainty is large too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1ejq9ipacvxkn9j8j1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1ejq9ipacvxkn9j8j1z.png" alt="tasks" width="476" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine that you have these 3 tasks to do. It looks like the "beta" task has something that could possibly go wrong that would derail you significantly. But how long should you and your manager plan to complete all the 3 tasks?&lt;/p&gt;

&lt;p&gt;You can combine all of them and come up with a probability distribution for the entire set of tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0ambwqa4q2dgm6lovcm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0ambwqa4q2dgm6lovcm.png" alt="sum" width="105" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The expected duration of that sequence is the sum of all expected durations. You will likely be done in about 14 days:&lt;br&gt;
4.2 + 2.5 + 6.5.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff75r9pe2lvwmeigad7nq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff75r9pe2lvwmeigad7nq.png" alt="standard deviation of sequence" width="120" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The standard deviation of the sequence is the square root of the sum of the squares of the standard deviation of the tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhgdrmha5pob5i1cpq6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhgdrmha5pob5i1cpq6p.png" alt="standard deviation result" width="156" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tells your manager that your tasks will likely take 14 days, but could very well take 17 days (1δ) and could possibly even take 20 days (2δ). It could even take longer, but that's pretty unlikely.&lt;/p&gt;

&lt;p&gt;The simple PERT scheme just shown is one reasonable way to help prevent setting optimistic expectations. Professionals are very careful to set reasonable expectations despite the pressure to try and to go fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimating tasks
&lt;/h3&gt;

&lt;p&gt;The most important estimation resource you have is the people around you. They can see things that you don't. They can help you estimate your tasks more accurately than you can on your own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim2xpdwmhap9lwki4xp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim2xpdwmhap9lwki4xp.gif" alt="estimating" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Wideband Delphi
&lt;/h4&gt;

&lt;p&gt;In the '70s, Barry Boehm introduced us to this technique. There have been many variations over the year, but they all have one thing in common: &lt;strong&gt;consensus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A team of people assemble, discuss a task, estimate the task, and iterate the discussion and estimation until they reach an agreement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Sr2LGR7URJj9L2RHVa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Sr2LGR7URJj9L2RHVa/giphy.gif" alt="consensus" width="478" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original approach involved several meetings and documents. I prefer simple low-overhead approaches such as the following.&lt;/p&gt;

&lt;h5&gt;
  
  
  Flying Fingers
&lt;/h5&gt;

&lt;p&gt;Everybody sits around a table and starts a discussion about each task and what it involves, what might confound or complicate it, and how it might be implemented. Then the participants put their hands below the table and raise 0 to 5 fingers based on how long they estimate the task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwahsmvz4cww4em4thwo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwahsmvz4cww4em4thwo.gif" alt="fingers" width="380" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everyone agrees, then they go on to the next task. Otherwise, they continue the discussion to determine why they disagree and repeat the process until they agree.&lt;/p&gt;

&lt;p&gt;The scale of the estimated is decided on at the beginning of the meeting. It might be the number of days for a task or some more interesting scale such as "fingers times 3" ou "fingers squared".&lt;/p&gt;

&lt;h5&gt;
  
  
  Planning Poker
&lt;/h5&gt;

&lt;p&gt;For each member, deal a hand of card with different numbers on them (0 through 5 work fine, Fibonacci series can also be used).&lt;/p&gt;

&lt;p&gt;Pick a task and discuss it. At some point, the moderator asks everyone to pick a card. The members pull out a card that matches their estimate and hold it up with the back facing outward so that no one else can see. Then the moderator tells everyone to show their cards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzkmqzzsto3u5mpdyz93.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzkmqzzsto3u5mpdyz93.gif" alt="poker" width="500" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest is just like flying fingers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Affinity Estimation
&lt;/h4&gt;

&lt;p&gt;All the tasks are written onto cards, without any estimates showing. The team spread out the cards randomly on the table. They don't talk, they simply start sorting the cards relative to one another. Smaller tasks move to the left and the ones which take longer to the right.&lt;/p&gt;

&lt;p&gt;Any team member can move any card at any time. Any card moved more than η times is set aside for discussion. Eventually, the silent peters out, and discussion can begin. Disagreements about the wondering are explored.&lt;/p&gt;

&lt;p&gt;The next step is to draw lines between the cards that represent bucket sizes. These buckets might be days, weeks, or points. The Fibonacci sequence is traditional.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Law of Large Numbers
&lt;/h3&gt;

&lt;p&gt;Estimates are fraught with error. That's why they are called estimates. One way of managing errors is to take advantage of the &lt;em&gt;Law of Large Numbers&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;An implication of this law is that if you break up a large task into many smaller ones and estimate them independently, the sum of the estimates of the small tasks will be more accurate than a single estimate of the larger task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Professionals know how to provide the business with practical estimates that the business can use for planning purposes. They don't make promises and commitments they cannot accomplish. They provide probabilistic estimates that describe the expected completion time and the likely variance.&lt;/p&gt;

&lt;p&gt;They also work together with the other team members to achieve a consensus on the estimates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8x5cutxa5644xypui2a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8x5cutxa5644xypui2a.gif" alt="teamwork" width="400" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/11-pressure-tips-from-the-clean-coder-40i1"&gt;#11 Pressure&lt;/a&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/9-time-management-part-2-tips-from-the-clean-coder-1jem"&gt;#9 Time Management (part 2)&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#9 Time Management (part 2) - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Wed, 09 Sep 2020 23:39:38 +0000</pubDate>
      <link>https://dev.to/yurisales/9-time-management-part-2-tips-from-the-clean-coder-1jem</link>
      <guid>https://dev.to/yurisales/9-time-management-part-2-tips-from-the-clean-coder-1jem</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the second part of the ninth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the ninth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;h3&gt;
  
  
  Focus-Manna
&lt;/h3&gt;

&lt;p&gt;Focus is a scarce resource, rather like manna. After you have expended your focus-manna, you have to recharge by doing unfocused activities for an hour or more.&lt;/p&gt;

&lt;p&gt;Professional developers learn to manage their time to take advantage of their focus-manna is high; and we do other, less productive things when it's not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o85xFoAVAGY9KmiYw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o85xFoAVAGY9KmiYw/giphy.gif" alt="manna" width="375" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Focus-manna is also a decaying resource. If you don't use it when it's there, you are likely to lose it. That's one of the reasons that meetings can be so devastating. If you spend all your focus-manna in a meeting you won't have any left for coding.&lt;/p&gt;

&lt;p&gt;Worry and distractions also consume focus-manna.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sleep
&lt;/h4&gt;

&lt;p&gt;Professional developers manage their sleep schedule to ensure that they have topped up their focus-manna by the time they get to work in the morning.&lt;/p&gt;

&lt;h4&gt;
  
  
  Caffeine
&lt;/h4&gt;

&lt;p&gt;There's no doubt that some of us can make more efficient use of our focus-manna by consuming moderate amounts of caffeine. But take care. Caffeine also puts a strange "jitter" on your focus. Too much of it can send your focus off in very strange directions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpt08s43y6ghupk85zirw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpt08s43y6ghupk85zirw.gif" alt="caffeine" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Recharging
&lt;/h4&gt;

&lt;p&gt;Focus-manna can be partially recharged by de-focusing. A good long walk, a conversation with friends, a time of just looking out a window can all help to pump the focus-manna back up.&lt;/p&gt;

&lt;p&gt;I have found once the manna is gone, you can't force the focus. You can still write code, but you'll almost certainly have to rewrite it the next day or live with a rotting mss for weeks or months.&lt;/p&gt;

&lt;h4&gt;
  
  
  Muscle focus
&lt;/h4&gt;

&lt;p&gt;There's something peculiar about doing physical disciplines such as martial arts, tai-chi, or yoga. Even though these activities require significant focus, it is a different kind of focus from coding. It's not intellectual, it's muscle. And somehow muscle focus helps to recharge mental focus. It's more than a simple recharge though.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvnzhspeqmgme6o90xba.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvnzhspeqmgme6o90xba.gif" alt="muscle" width="245" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Input versus output
&lt;/h4&gt;

&lt;p&gt;Another thing I find essential for focus is to balance my output with appropriate input. Writing software is a creative exercise. I find that I am most creative when I am exposed to other people's creativity. So I read lots of science fiction.&lt;/p&gt;

&lt;h3&gt;
  
  
  The boxing and tomatoes
&lt;/h3&gt;

&lt;p&gt;One very effective way I've used to manage my time and focus is to use the well-known Pomodoro Technique, otherwise knows as &lt;em&gt;tomatoes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-content.duckduckgo.com%2Fiu%2F%3Fu%3Dhttps%253A%252F%252Falifeofproductivity.com%252Fwp-content%252Fuploads%252F2013%252F04%252F6969282632_bc5249a9a6_b.jpg%26f%3D1%26nofb%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-content.duckduckgo.com%2Fiu%2F%3Fu%3Dhttps%253A%252F%252Falifeofproductivity.com%252Fwp-content%252Fuploads%252F2013%252F04%252F6969282632_bc5249a9a6_b.jpg%26f%3D1%26nofb%3D1" alt="Pomodoro" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You set a standard kitchen timer for 25 minutes. While that timer is running, you let &lt;em&gt;nothing&lt;/em&gt; interfere with what you are doing. If the phone rings you answer and politely ask if you can call back within 25 minutes. If someone stops in to ask you a question you politely ask if you can get back to them within 25 minutes.&lt;/p&gt;

&lt;p&gt;When the tomato timer dings, you stop what you are doing &lt;em&gt;immediately&lt;/em&gt;. You deal with any interruptions that occurred during the tomato. Then you take a break of 5 minutes or so. Then you set the timer for another 25 minutes and start the next tomato. Every fourth tomato you take a longer break of 30 minutes or so.&lt;/p&gt;

&lt;p&gt;On a good day, you might get 12 or even 14 tomatoes done. On a bad day, you might only get 2 or 3 done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoidance
&lt;/h3&gt;

&lt;p&gt;Sometimes your heart just isn't in your work. It may be that the thing that needs doing is scary or uncomfortable or boring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaqxmutn70qq62up0a3m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaqxmutn70qq62up0a3m.gif" alt="avoidance" width="480" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Priority inversion
&lt;/h4&gt;

&lt;p&gt;Whatever the reason, you find ways to avoid doing the real work. You convince yourself that something else is more urgent, and you do that instead. This is called &lt;em&gt;priority inversion&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They are a little lie we tell ourselves. We can't face what needs to be done, so we convince ourselves that another task is more important.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1syy8x365ucava8i8rv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1syy8x365ucava8i8rv.gif" alt="priority inversion" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Actually we aren't lying to ourselves. We are building a defense to protect us from the judgment of others.&lt;/p&gt;

&lt;p&gt;Clearly this is unprofessional behavior. Professionals evaluate the priority of each task, disregarding their personal fears and desires, and execute those tasks in priority order.&lt;/p&gt;

&lt;h4&gt;
  
  
  Blind alleys
&lt;/h4&gt;

&lt;p&gt;Sometimes you will make a decision and wander down a technical pathway that leads to nowhere. The most vested you are in your decision, the longer you'll wander in the wilderness. If you've staked your professional reputation, you'll wander forever.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawu4ejfu641nm5m6mmuo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawu4ejfu641nm5m6mmuo.gif" alt="blind alley" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prudence and experience will help you avoid certain blind alleys, but you'll never avoid them. So the real skill you need is to quickly realize when you are in one and have the courage to back out. This is sometimes called &lt;em&gt;The Rule of Holes&lt;/em&gt;: When you are in one, stop digging.&lt;/p&gt;

&lt;h1&gt;
  
  
  Marshes, bogs, swamps, and other messes
&lt;/h1&gt;

&lt;p&gt;Messes slow you down, but don't stop you. They are worse than blind alleys because you can always see the way forward, and it always looks shorter than the way back (but it isn't).&lt;/p&gt;

&lt;p&gt;Nothing has a more profound or long-lasting negative effect on the productivity of a software team than a mess. Nothing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8eoxt0r1j6zyboy9bxt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8eoxt0r1j6zyboy9bxt.gif" alt="bog" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Experience and prudence can help you to avoid them, but eventually, you will make a decision that leads to a mess. Going back looks expensive because you'll have to rework the existing code, but going back will &lt;em&gt;never&lt;/em&gt; be easier than it is now.&lt;/p&gt;

&lt;p&gt;Moving forward through a swamp, when you know it's a swamp, is the worst kind of priority inversion. By moving forward you are lying to yourself, to your team, to your company, and to your company.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Software professionals are diligent in the management of their time and their focus. They understand the temptations of priority inversion and fight it as a matter of honor. And they are always on the lookout for growing messes, and they clean them as soon as they are recognized.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66n8y3x1usunip347svj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66n8y3x1usunip347svj.gif" alt="time" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Next article: &lt;em&gt;soon...&lt;/em&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/9-time-management-part-1-tips-from-the-clean-coder-3l2j"&gt;#9 Time Management (part 1)&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#9 Time Management (part 1) - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 06 Sep 2020 13:52:14 +0000</pubDate>
      <link>https://dev.to/yurisales/9-time-management-part-1-tips-from-the-clean-coder-3l2j</link>
      <guid>https://dev.to/yurisales/9-time-management-part-1-tips-from-the-clean-coder-3l2j</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the first part of the ninth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the ninth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Eight hours is a remarkably short period of time. As a professional, you expect that you will use this precious time as efficiently and effectively as possible. What strategy can you use to ensure that you don't waste the little time you have? How can you effectively manage your time?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglbov3ouwbq02idfwz7q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglbov3ouwbq02idfwz7q.gif" alt="time" width="350" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Meetings
&lt;/h3&gt;

&lt;p&gt;The next time you are in a meeting, calculate the costs per hour, considering salaries, benefits, facilities costs, and so forth. You may be amazed.&lt;/p&gt;

&lt;p&gt;There are two truths about meeting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Meetings are necessary.&lt;/li&gt;
&lt;li&gt;Meetings are huge time wasters.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs58a7df29fyof183kyyt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs58a7df29fyof183kyyt.gif" alt="meetings" width="480" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Professionals are aware of the high cost of meetings. They are also aware that their own time is precious, they have code to write and schedules to meet. Therefore, they actively resist attending meetings that don't have an immediate and significant benefit.&lt;/p&gt;

&lt;h4&gt;
  
  
  Declining
&lt;/h4&gt;

&lt;p&gt;You don't have to attend every meeting to which you are invited. You need to use your time wisely. So be very careful about which meetings you attend and which you politely refuse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv72k50kmqnv2wqv576i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv72k50kmqnv2wqv576i.gif" alt="declining" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The person inviting you to a meeting is not responsible for managing your time. Only you can do that. So when you receive a meeting invitation, don't accept unless it is a meeting for which your participation is immediately and significantly necessary to the job you are doing now.&lt;/p&gt;

&lt;h4&gt;
  
  
  Leaving
&lt;/h4&gt;

&lt;p&gt;Meetings don't always go as planned. When the meeting gets boring, leave.&lt;/p&gt;

&lt;p&gt;Clearly you should not storm out of a meeting exclaiming "This is boring!". There's no need to be rude. You can simply ask, at an opportune moment, if your presence is still necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhzhz78mispbow2n4iu1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhzhz78mispbow2n4iu1.gif" alt="bye" width="245" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important thing to realize is that remaining in a meeting that has become a waste of time for you, and to which you can no longer significantly contribute, is unprofessional. You have an obligation to wisely spend your employer's time and money, so it is not unprofessional to choose an appropriate moment to negotiate your exit.&lt;/p&gt;

&lt;h4&gt;
  
  
  Have an agenda and a goal
&lt;/h4&gt;

&lt;p&gt;To use the participants' time wisely, the meeting should have a clear agenda, with time for each topic and stated goal.&lt;/p&gt;

&lt;p&gt;Make sure you know what discussions are on the table, how much time is allowed for them, and what goal is to be achieved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fza1n0pardwydtqyu6hla.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fza1n0pardwydtqyu6hla.gif" alt="agenda" width="345" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find that the agenda has been high-jacked or abandoned, you should request that the new topic be tabled and the agenda be followed. If this doesn't happen, you should politely leave when possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Stand-up meetings
&lt;/h4&gt;

&lt;p&gt;These meetings are part of the Agile canon. Each participant takes a turn to answer three questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;What did I do yesterday?&lt;/li&gt;
&lt;li&gt;Whats am I going to do today?&lt;/li&gt;
&lt;li&gt;What's in my way?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each question should require &lt;em&gt;no more than&lt;/em&gt; twenty seconds, so each participant should require no more than one minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagazhsf50nta0ad6ecak.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagazhsf50nta0ad6ecak.gif" alt="hours" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Iteration planning meetings
&lt;/h4&gt;

&lt;p&gt;These are the most difficult meetings in the Agile canon to do well. Done poorly, they take far too much time.&lt;/p&gt;

&lt;p&gt;They are meant to select the backlog items that will be executed in the next iteration. Estimates should already be done for the candidate items. Assessment of business value should already be done. In really good organizations the acceptance/component tests will already be written, or at least sketched out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv99ke1p2xff92iyki9h.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv99ke1p2xff92iyki9h.gif" alt="meeting2" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The meeting should proceed quickly with each candidate backlog item being briefly discussed and then either selected or rejected. No more than five or ten minutes should be spent on any given item. If a longer discussion is needed. It should be scheduled for another time with a subset of the team.&lt;/p&gt;

&lt;p&gt;My rule of thumb is that the meeting should take no more than 5% of the total time in the iterations. So for a one-week iteration (forty hours), the meeting should be over within two hours.&lt;/p&gt;

&lt;h4&gt;
  
  
  Iteration retrospective and demo
&lt;/h4&gt;

&lt;p&gt;These meetings are conducted at the end of each iteration. Team members discuss what went right and what end wrong. Stakeholders see a demo of the newly working features. These meetings can be badly abused and can soak up a lot of time, so schedule them 45 minutes before quitting time on the last day of the iteration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xnCNp2jGUmHx6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xnCNp2jGUmHx6/giphy.gif" alt="pay attention" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Allocate no more than 20 minutes for retrospective and 25 minutes for the demo. Remember, it's only been a week or two so there shouldn't be all that much to talk about.&lt;/p&gt;

&lt;h4&gt;
  
  
  Arguments/disagreements
&lt;/h4&gt;

&lt;p&gt;Technical disagreements tend to go off into the stratosphere. Each party has all kinds of justifications for their position but seldom any data. Without data, any argument that doesn't forge agreement within a few minutes (somewhere between five and thirty) simply won't ever forge an agreement. The only thing to do is to go get some data.&lt;/p&gt;

&lt;p&gt;How do you get the data you need to settle a disagreement? Sometimes you can run experiments, or do some simulation or modeling. But sometimes the best alternative is to simply flip a coin to choose one of the two paths in question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o6ZtaPtcZ5prp8OY0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o6ZtaPtcZ5prp8OY0/giphy.gif" alt="disagreement" width="480" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beware of meetings that are really just a venue to vent a disagreement and to gather support for one side or the other. And avoid those where only one of the argues is presenting.&lt;/p&gt;

&lt;p&gt;If an argument must truly be settled, then ask each of the arguers to present their case to the team in five minutes or less. Then have the team vote.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8w9w5ow639iykmf4zt3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8w9w5ow639iykmf4zt3.gif" alt="email" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/9-time-management-part-2-tips-from-the-clean-coder-1jem"&gt;#9 Time Management (part 2)&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/8-testing-strategies-tips-from-the-clean-coder-2mi8"&gt;#8 Testing Strategies&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#8 Testing Strategies - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Sun, 30 Aug 2020 13:45:40 +0000</pubDate>
      <link>https://dev.to/yurisales/8-testing-strategies-tips-from-the-clean-coder-2mi8</link>
      <guid>https://dev.to/yurisales/8-testing-strategies-tips-from-the-clean-coder-2mi8</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the eighth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the eighth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Professional developers test their code. But testing is not simply a matter of writing a few unit tests or a few acceptance tests. Writing these tests is a good thing, but it is far from sufficient. What every professional development team needs is a good &lt;em&gt;testing strategy&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  QA should find nothing
&lt;/h3&gt;

&lt;p&gt;I've said this before, and I'll say it again. Despite the fact that your company may have a separate QA group to test the software, it should be the goal of the development group that QA finds nothing wrong.&lt;/p&gt;

&lt;p&gt;Of course, it's not likely that this goal will be constantly achieved. Still, every time QA finds something the development team should react in horror. They should ask themselves how it happened and take steps to prevent it in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g306owz44t02ay0a6ux.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g306owz44t02ay0a6ux.gif" alt="QA" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  QA is part of the team
&lt;/h4&gt;

&lt;p&gt;The previous section might have made it seem that QA and Development are at odds with each other, that their relationship is adversarial. This is not the intent. Rather, QA and Development should be working together to ensure the quality of the system. The best role for the QA part of the team is to act as specifiers and characterizers.&lt;/p&gt;

&lt;h4&gt;
  
  
  QA as specifiers
&lt;/h4&gt;

&lt;p&gt;It should be QA's role to work with business to create the automated acceptance tests that become the true specification and requirements document for the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  QA as characterizers
&lt;/h4&gt;

&lt;p&gt;The other role for QA is to use the discipline of exploratory testing to characterize the true behavior of the running system and report that behavior back to development and business.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Test Automation Pyramid
&lt;/h3&gt;

&lt;p&gt;As good as it is to have a suite of unit and acceptance tests, we also need higher-level tests to ensure that QA finds nothing. The figure below shows the Test Automation Pyramid, a graphical depiction of the kinds of tests that a professional development organization needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq241r1jjqk53ctsnylp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq241r1jjqk53ctsnylp8.png" alt="Test Automation Pyramid" width="567" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Unit tests
&lt;/h4&gt;

&lt;p&gt;These tests are written by programmers, for programmers, in the programming language(s) of the system. The intent is to specify the system at the lowest level. They're written before the production code as a way to specify what they are about to write.&lt;/p&gt;

&lt;p&gt;They provide as close to 100% coverage as is practical. Generally, this number should be somewhere in the 90s. And it should be true coverage as opposed to false tests that execute code without asserting its behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  Compoment tests
&lt;/h4&gt;

&lt;p&gt;Generally, they are written against individual components of the system. These components encapsulated the business rules, so the tests for those components are the acceptance tests for those business rules.&lt;/p&gt;

&lt;p&gt;A component test wraps a component. It passes input data into the component and gathers output data from it. It tests that the output matches the input. Any other components are decoupled from the test using appropriate mocking and test-doubling techniques.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F266owr2t26gnxabwuyjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F266owr2t26gnxabwuyjy.png" alt="Component test" width="264" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Component tests are written by QA and Business with assistance from Development. They are directed more towards happy-path situations and very obvious corner, boundary, and alternate-path cases. The vast majority of unhappy-path cases are covered by unit tests and are meaningless at the level of component tests.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integration tests
&lt;/h4&gt;

&lt;p&gt;These tests only have meaning for larger systems that have many components. These tests assemble groups of components and test how they communicate with each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pkmhx1j9c78conwj7jt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pkmhx1j9c78conwj7jt.png" alt="Integration test" width="259" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Integration tests are typically written by the system architects, or lead designers, of the system. The tests ensure that the architectural structure of the system is sound.&lt;/p&gt;

&lt;p&gt;They are typically not executed as part of the CI suite, because they often have longer runtimes. Instead, these tests are run periodically (nightly, weekly, etc.) as deemed necessary by their authors.&lt;/p&gt;

&lt;h4&gt;
  
  
  System tests
&lt;/h4&gt;

&lt;p&gt;These are automated tests that execute against the entire integrated system. They are the ultimate integration tests. They do not test business rules directly. Rather, they test that the system has been wired together correctly and its parts interoperate according to plan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbq3g8q2f8pm5ogzyw2u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbq3g8q2f8pm5ogzyw2u.jpg" alt="System testing" width="756" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They're written by the system architects and technical leads. We'd expect to see throughput and performance tests in this suite.&lt;/p&gt;

&lt;p&gt;Their intent is not to ensure correct system behavior, but correct system &lt;em&gt;construction&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Manual exploration tests
&lt;/h4&gt;

&lt;p&gt;This is where humans put their hands on the keyboard and their eyes on the screens. These tests are not automated, &lt;em&gt;nor are they scripted&lt;/em&gt;. The intent of these tests is to explore the system for unexpected behavior while confirming the expected ones.&lt;/p&gt;

&lt;p&gt;Toward that end we need human brains, with human creativity, working to investigate and explore the system. Creating a written test plan for this kind of testing defeats the purpose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8i4lcgqvg66ehp9hf0q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8i4lcgqvg66ehp9hf0q.gif" alt="Manual tests" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some teams will have specialists do this work. Other teams will simply declare a day or two of "bug hunting" in which as many people as possible. The goal is to ensure that the system behaves well under human operation and to creatively find as many "peculiarities" as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;TDD is a powerful discipline, and Acceptance Tests are valuable ways to express and enforce requirements. But they are only part of a total testing strategy.&lt;/p&gt;

&lt;p&gt;Development teams need to work hand in hand with QA to create a hierarchy of unit, component, integration, system, and exploratory tests. These tests should be run as frequently as possible to provide maximum feedback and to ensure that the system remains continuously clean.&lt;/p&gt;

&lt;h5&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/9-time-management-part-1-tips-from-the-clean-coder-3l2j"&gt;#9 Time Management (part 1)&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/7-acceptance-testing-tips-from-the-clean-coder-2j8g"&gt;#7 Acceptance Testing&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#7 Acceptance Testing - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Mon, 24 Aug 2020 00:16:29 +0000</pubDate>
      <link>https://dev.to/yurisales/7-acceptance-testing-tips-from-the-clean-coder-2j8g</link>
      <guid>https://dev.to/yurisales/7-acceptance-testing-tips-from-the-clean-coder-2j8g</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the seventh article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the seventh chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;The role of the professional developer is a communications role as well as a development role. Remember that garbage-in/garbage-out applies to programmers too, so professional programmers are careful to make sure that their communication with other members of the team, and the business, are accurate and healthy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Communicating requirements
&lt;/h3&gt;

&lt;p&gt;One of the most common communication issues between programmers and business is the &lt;strong&gt;requirements&lt;/strong&gt;. The business people state what they believe they need, and then the programmers build what they believe the business described. At least that's how it's supposed to work. &lt;strong&gt;In reality, the communication of requirements is extremely different, and the process is fraught with error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/jroWriIlKYSP2tpu20/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/jroWriIlKYSP2tpu20/giphy.gif" alt="communication" width="300" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Premature precision
&lt;/h4&gt;

&lt;p&gt;Both business and programmers are tempted to fall into the trap of premature precision. Business people want to know exactly what they are going to get before they authorize a project. Developers want to know exactly what they are supposed to deliver before they estimate the project. Both sides want a precision that simply cannot be achieved, and are often willing to waste a fortune trying to attain it.&lt;/p&gt;

&lt;h4&gt;
  
  
  The uncertainty principle
&lt;/h4&gt;

&lt;p&gt;The problem is that things appear different on paper than they do in a working system. When the business actually sees what they specified running in a system, they realize that it wasn't what they wanted at all. Once they see the requirement actually running, they have a better idea of what they really want - &lt;strong&gt;and it's usually not what they are seeing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ZFhhpKngh5QfcmhIDF/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZFhhpKngh5QfcmhIDF/giphy.gif" alt="morty" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Estimation anxiety
&lt;/h4&gt;

&lt;p&gt;First, even with the perfect information, your estimates will have a huge variance.&lt;br&gt;
Second, the uncertainty principle makes hash out of early precision. The requirements &lt;em&gt;will&lt;/em&gt; change-making that precision moot.&lt;/p&gt;

&lt;p&gt;Professional developers understand that estimates can, and should, be made based on low precision requirements, and recognize that those estimates &lt;em&gt;are estimates&lt;/em&gt;; To reinforce this, professional developers always include error bars with their estimates so that be business understands the uncertainty.&lt;/p&gt;

&lt;h4&gt;
  
  
  Late ambiguity
&lt;/h4&gt;

&lt;p&gt;the solution to premature precision is to defer precision as long as possible. Professional developers don't flesh out a requirement until they are just about to develop it. However, that can lead to another malady: late ambiguity.&lt;/p&gt;

&lt;p&gt;Often stakeholders disagree. When they do, they may find it easier to &lt;em&gt;wordsmith&lt;/em&gt; their way around the disagreement rather than solve it. They will find some way of phrasing the requirement that they can all agree with, without actually resolving the dispute. I once heard Tom DeMarco say, "An ambiguity in a requirements document represents an argument amongst the stakeholders."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SVloT9vgtUCcjQMHeD/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SVloT9vgtUCcjQMHeD/giphy.gif" alt="ambiguity" width="318" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is the responsibility of professional developers (and stakeholders) to make sure that all ambiguity is removed from the requirements. &lt;/p&gt;

&lt;p&gt;This is &lt;em&gt;hard&lt;/em&gt;, and there's only one way I know how to do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acceptance tests
&lt;/h3&gt;

&lt;p&gt;The term &lt;em&gt;acceptance test&lt;/em&gt; is overloaded and overused. We will define it as tests written by a collaboration of the stakeholders and the programmers &lt;em&gt;in order to define when a requirement is done&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The definition of "Done"
&lt;/h4&gt;

&lt;p&gt;Professional developers have a single definition of done: Done means &lt;em&gt;done&lt;/em&gt;. Done means all code written, all tests pass, QA and the stakeholders have accepted. Done.&lt;/p&gt;

&lt;p&gt;But how can you get this level of done-ness and still make quick progress from iteration to iteration? You create a set of automated tests that, when they pass, meet all of the above criteria! When the acceptance tests for your feature pass, you are &lt;em&gt;done&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0Iyl55kTeh71nTXy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0Iyl55kTeh71nTXy/giphy.gif" alt="done" width="480" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Communication
&lt;/h4&gt;

&lt;p&gt;The purpose of acceptance tests is communication, clarity, and precision. By agreeing to them, the developers, stakeholders, and testers all understand what the plan for the system behavior is. Achieving this kind of clarity is the responsibility of all parties. Professional developers make it their responsibility to work with stakeholders and testers to ensure that all parties know what is about to be built.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/j3cIiYP90ci1QgyWAk/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/j3cIiYP90ci1QgyWAk/giphy.gif" alt="communication key" width="498" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Automation
&lt;/h4&gt;

&lt;p&gt;Acceptance tests should &lt;strong&gt;ALWAYS&lt;/strong&gt; be automated. There is a place for manual testing elsewhere in the software lifecycle, but &lt;em&gt;these&lt;/em&gt; kinds of tests should never be manual. The reason is simple: cost.&lt;/p&gt;

&lt;p&gt;The cost of automating acceptance tests is so small in comparison to the cost of executing manual test plans that it makes no economic sense to write scripts for humans to execute. Professional developers take responsibility for their part in ensuring that acceptance tests are automated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/CmFMWpEa4IFtS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/CmFMWpEa4IFtS/giphy.gif" alt="automation" width="500" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Extra work
&lt;/h4&gt;

&lt;p&gt;Don't look to these tests as extra work. Look at them as massive time and money savers. These tests will prevent you from implementing the wrong system and will allow you to &lt;em&gt;know&lt;/em&gt; when you are done.&lt;/p&gt;

&lt;h4&gt;
  
  
  Who writes acceptance tests, and when?
&lt;/h4&gt;

&lt;p&gt;In an ideal world, the stakeholders and QA would collaborate to write these tests, and developers would review them for consistency. In the real world, stakeholders seldom have the time or inclination to dive into the required level of detail. So they often delegate the responsibility to business analysts, QA, or even developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/NT6iyBndcmOeA/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/NT6iyBndcmOeA/giphy.gif" alt="tests" width="249" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typically business analysts write the "happy path" versions of the tests because those tests describe the features that have business value. QA typically writes the "unhappy path" tests, the boundary conditions, exceptions, and corner cases. This is because QA's job is to help think about what can go wrong.&lt;/p&gt;

&lt;h4&gt;
  
  
  The developer's role
&lt;/h4&gt;

&lt;p&gt;Implementation work on a feature begins when the acceptance tests for that feature are ready. The developers execute the acceptance tests for the new feature and see how they fail. Then they work to connect the acceptance test to the system, and then start making the test pass by implementing the desired feature.&lt;/p&gt;

&lt;h4&gt;
  
  
  Test negotiation and passive aggression
&lt;/h4&gt;

&lt;p&gt;Test authors are human and make mistakes. Sometimes the tests as written don't make a lot of sense once you start implementing them. They might be too complicated. They might be awkward. They might contain silly assumptions. Or they might just be wrong.&lt;/p&gt;

&lt;p&gt;As a professional developer, it's your job to negotiate with the test author for a better test. What you should &lt;em&gt;never&lt;/em&gt; do is take the passive-aggressive option and say to yourself, "Well, that's what the test says, so that's what I'm going to do."&lt;/p&gt;

&lt;p&gt;Remember, as a professional it's your job to help your team to create the best software they can.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26FfjkXLCHGEL0Yxy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26FfjkXLCHGEL0Yxy/giphy.gif" alt="angry" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Acceptance tests and Unit tests
&lt;/h4&gt;

&lt;p&gt;Acceptance tests are not unit tests. Unit tests are written by programmers for programmers. They are formal design documents that describe the lowest level structure and behavior of the code.&lt;/p&gt;

&lt;p&gt;Acceptance tests are written by the business for the business (even when you, the developer, end up writing them). They are formal requirements documents that specify how the system should behave from the business point of view. The audience is the business and the programmers.&lt;/p&gt;

&lt;p&gt;Although it is true that unit and acceptance tests often test the same things, they are not redundant at all. They may test the same things but through different mechanisms and pathways. Unit tests dig into the guts of the system making calls to methods in particular classes. Acceptance tests invoke the system much farther out, at the API, or sometimes even UI level. So the execution pathways that these tests are very different.&lt;/p&gt;

&lt;p&gt;But the real reason these tests aren't redundant is that their primary function is not testing. The fact that they are tests is incidental. Their primary purpose is to formally document the design, structure, and behavior of the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  GUIs and other complications
&lt;/h4&gt;

&lt;p&gt;It's hard to specify GUIs upfront. It can be done but is seldom done well. The reason is that aesthetics are subjective and therefore volatile. People want to fiddle with GUIs. They want to massage and manipulate them.&lt;/p&gt;

&lt;p&gt;This makes it challenging to write acceptance tests for GUIs. The trick is to design the system so that you can treat the GUI as a though it were an API rather than a set of buttons, sliders, grids, and menus. This may sound strange, but it's really just good design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/yYSSBtDgbbRzq/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/yYSSBtDgbbRzq/giphy.gif" alt="css" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some acceptance tests specify the behavior of the GUI itself. However, these tests do no test business rules and therefore don't require the business rules to be connected to the GUI. Therefore, it's a good idea to decouple the GUI and the business rules and replace the business rules with stubs.&lt;/p&gt;

&lt;p&gt;Keep the GUI tests to a minimum. They're fragile.&lt;/p&gt;

&lt;h4&gt;
  
  
  Continuous Integration
&lt;/h4&gt;

&lt;p&gt;Make sure that all your unit and acceptance tests are run several times per day in a &lt;em&gt;continuous integration&lt;/em&gt; system. This system should be triggered by your source code control system. Every time someone commits a module, the CI system should kick off a build, and then run all the tests in the system. The results of that run should be emailed to everyone on the team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Communication about details is hard. It's too easy for each party to wave their hands and &lt;em&gt;assume&lt;/em&gt; that the other party understands. All too often they agree that they understand and leave with &lt;strong&gt;completely different ideas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SAAMcPRfQpgyI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SAAMcPRfQpgyI/giphy.gif" alt="understanding" width="408" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only way I know to effectively eliminate communication errors between the parties is to write acceptance tests. They are the perfect requirements document.&lt;/p&gt;

&lt;h5&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/8-testing-strategies-tips-from-the-clean-coder-2mi8"&gt;#8 Testing Strategies&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/6-practicing-tips-from-the-clean-coder-18cf"&gt;#6 Practicing&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>#6 Practicing - Tips from The Clean Coder</title>
      <dc:creator>Yuri Sales</dc:creator>
      <pubDate>Mon, 17 Aug 2020 00:24:09 +0000</pubDate>
      <link>https://dev.to/yurisales/6-practicing-tips-from-the-clean-coder-18cf</link>
      <guid>https://dev.to/yurisales/6-practicing-tips-from-the-clean-coder-18cf</guid>
      <description>&lt;h5&gt;
  
  
  &lt;em&gt;This is the sixth article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the sixth chapter.&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;All professionals practice their art by engaging in skill-sharpening exercises. Musicians rehearse scales. Football players run through tires. Doctors practice sutures and surgical techniques. Lawyers practice arguments. Soldiers rehearse missions. When performance matters, professionals practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8AfVHQbGG8dxGCC7ES/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8AfVHQbGG8dxGCC7ES/giphy.gif" alt="practice" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Some background on practicing
&lt;/h3&gt;

&lt;p&gt;Practicing is not a new concept in software development, but we didn't recognize it as a practice until just after the turn of the millennium. Perhaps the first formal instance of a practice program is the "hello world".&lt;/p&gt;

&lt;p&gt;We use it as a way to prove a new environment or a new language. Writing and executing that program is proof that we can write and execute &lt;em&gt;any&lt;/em&gt; program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/VDB85YZsrqMXx3c7DE/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/VDB85YZsrqMXx3c7DE/giphy.gif" alt="old" width="480" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Things have changed since the early days of programming. Some things have changed a lot. Other things haven't changed much at all.&lt;/p&gt;

&lt;p&gt;We've got better tools to write those classic statements (&lt;em&gt;if&lt;/em&gt; statements, &lt;em&gt;while&lt;/em&gt; loops and &lt;em&gt;assignments&lt;/em&gt;) with. But the nature of the statements hasn't changed in all that time. Code in 2010 would be recognizable to a programmer from the 1960s. The clay that we manipulate has not changed much in those four decades.&lt;/p&gt;

&lt;h4&gt;
  
  
  Turnaround time
&lt;/h4&gt;

&lt;p&gt;But the way we work has changed dramatically. In the '60s I could wait a day or two to see the results of a compile. In the late '70s, a 50,000-line program might take 45 minutes to compile. Even in the '90s, long build times were the norm.&lt;/p&gt;

&lt;p&gt;Programmers today don't wait for compiles. They have such immense power under theirs fingers that they can spin around the red-green-refactor loop in seconds.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv20qui2zc5or9jyd6nck.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv20qui2zc5or9jyd6nck.gif" alt="fast" width="360" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not always wise to go that fast. Often is better to slow down and just think. But there are other times when spinning around that loop as fast as possible is &lt;em&gt;highly&lt;/em&gt; productive.&lt;/p&gt;

&lt;p&gt;Doing anything quickly requires practice. Spinning around the code/test loop quickly requires you to make very quick decisions. Making decisions quickly means being able to recognize a vast number of situations and problems and simply know what to do to address them.&lt;/p&gt;

&lt;p&gt;Consider two martial artists in combat. Each must recognize what the other is attempting and respond appropriately within milliseconds. In combat, you don't have the luxury of freezing time, studying the positions, and deliberating on the appropriate response. You simply have to &lt;em&gt;react&lt;/em&gt;. Indeed, it's your &lt;em&gt;body&lt;/em&gt; that reacts while your mind is working on a higher-level strategy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26BGIqWh2R1fi6JDa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26BGIqWh2R1fi6JDa/giphy.gif" alt="key" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you're spinning around the code/test loop several times per minute, it is your &lt;em&gt;body&lt;/em&gt; that knows what keys to hit. A primal part of your mind recognizes the situation and reacts within milliseconds with the appropriate solution while your mind is free to focus on the higher-level program.&lt;/p&gt;

&lt;p&gt;In both the martial arts case and the programming case, speed depends on &lt;em&gt;practice&lt;/em&gt;. And in both cases the practice is similar. We choose a repertoire of problem/solution pairs and execute them over and over again until we know them cold.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kata
&lt;/h3&gt;

&lt;p&gt;In martial arts, a &lt;em&gt;kata&lt;/em&gt; is a precise set of choreographed movements that simulates one side of a combat. The goal, which is asymptotically approached, is perfection.&lt;/p&gt;

&lt;p&gt;The purpose of learning a kata is not to perform it on stage but to train your mind and body how to react in a particular combat situation, doing the perfected movements automatic and instinctive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT0BKGdOtPSQe5TL5S/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT0BKGdOtPSQe5TL5S/giphy.gif" alt="kata" width="350" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A programming kata is a precise set of choreographed keystrokes and mouse movements that simulates the solving of some programming problem. You aren't actually solving the problem because you already know the solution. Rather, you're practicing the movements and decisions involved in solving the problem.&lt;/p&gt;

&lt;p&gt;Practicing a suite of katas is a food way to learn hotkeys and navigation idioms. It is also a good way to learn disciplines such as TDD and CI. But most importantly, it is a good way to drive common problem/solution pairs into your subconscious, so that you simply know how to solve them when facing them in real programming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wasa
&lt;/h3&gt;

&lt;p&gt;When I studied jujitsu, much of our time in the dojo was spent in pairs practicing our &lt;em&gt;wasa&lt;/em&gt;. Wasa is very much like a two-man kata. The routines are precisely memorized and played back. One partner plays the role of the aggressor, and the other partner is the defender. The motions are repeated over and over again as the practitioners swap roles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/B3u6LIYUA4A1i/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/B3u6LIYUA4A1i/giphy.gif" alt="was" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programmers can practice in a similar fashion using a game known as &lt;em&gt;ping-pong&lt;/em&gt;. Both partners choose a kata, or a simple problem. One programmer writes a unit test, and then the other must make it pass. Then they reverse roles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Randori
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Randori&lt;/em&gt; is a free-form of combat. In our jujitsu dojo, we would set up a variety of combat scenarios and then enact them. But simulated combat does not map well to programming. however, there is a game that is played in many coding dojo called randori. It's very much like two-man wasa, but it's played with many people and the rules have a twist.&lt;/p&gt;

&lt;p&gt;With the screen projected on the wall, one person writes a test and then sits down. The next person makes the test pass and then writes the next test and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l2Je5K36gfVjK1MBi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l2Je5K36gfVjK1MBi/giphy.gif" alt="randori" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can gain an immense insight into the way other people solve problems. These insights can only serve to broaden your own approach and improve your skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  Broadening your experience
&lt;/h3&gt;

&lt;p&gt;Professional programmers ofter suffer from a lack of diversity in the kind of problems they solve. Employers often enforce a single language, platform, and domain. Without a broadening influence, this can lead you to a very unhealthy narrowing of your resume and your mindset.&lt;/p&gt;

&lt;h4&gt;
  
  
  Open-source
&lt;/h4&gt;

&lt;p&gt;One way to stay ahead of the curse is to take on some pro-bono work by contributing to an open-source project. There is no probably better way to improve your repertoire of skills than work on something that someone else cares about.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/cnhpl4IeYgU7MCBdV2/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/cnhpl4IeYgU7MCBdV2/giphy.gif" alt="open-source" width="272" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Practice ethics
&lt;/h4&gt;

&lt;p&gt;Professional programmers practice on their own time. Employers don't have to pay you for your practice time. Since your practice time is your own time, you don't have to use the same languages and platforms that you use at work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In one way or another, &lt;em&gt;all&lt;/em&gt; professionals practice. They do this because they care about doing the best job they possibly can. The practice in their own time because they realize it is their responsibility to keep their skill sharp. Practicing is what you do when you aren't getting paid. You do it so that you will be &lt;em&gt;paid&lt;/em&gt;, and paid &lt;em&gt;well&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8vkEKXvnXkyCZx8w6b/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8vkEKXvnXkyCZx8w6b/giphy.gif" alt="practice" width="480" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Next article: &lt;a href="https://dev.to/yurishenrique/7-acceptance-testing-tips-from-the-clean-coder-2j8g"&gt;#7 Acceptance Testing&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  Previous article: &lt;a href="https://dev.to/yurishenrique/5-test-driven-development-tips-from-the-clean-coder-35mn"&gt;#5 Test-Driven Development&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>tips</category>
      <category>habits</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
