<?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: Miyuki Tuisku</title>
    <description>The latest articles on DEV Community by Miyuki Tuisku (@myktsk).</description>
    <link>https://dev.to/myktsk</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%2F367221%2Fc7d9b170-0318-4105-b28b-24ea9cf42564.jpg</url>
      <title>DEV Community: Miyuki Tuisku</title>
      <link>https://dev.to/myktsk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/myktsk"/>
    <language>en</language>
    <item>
      <title>Setting Up a Front-end Using Vite + React + Firebase Hosting</title>
      <dc:creator>Miyuki Tuisku</dc:creator>
      <pubDate>Mon, 18 Sep 2023 05:57:39 +0000</pubDate>
      <link>https://dev.to/myktsk/heres-how-i-set-up-a-front-end-within-10mins-using-vite-react-firebase-hosting-4e10</link>
      <guid>https://dev.to/myktsk/heres-how-i-set-up-a-front-end-within-10mins-using-vite-react-firebase-hosting-4e10</guid>
      <description>&lt;p&gt;Setting up an environment.&lt;/p&gt;

&lt;p&gt;Something that can manage to make you feel excited yet demoralizing at the same time. It resembles the feeling when you get a new apartment knowing you have 50+ boxes to unpack.&lt;/p&gt;

&lt;p&gt;But luckily, thanks to the new services and technology, it is easier than ever for us to set up and get our apps up and running on the web.&lt;br&gt;
I've learned the easier way his over time, often by not finishing one project before jumping into another.&lt;/p&gt;

&lt;p&gt;⚠️ Please do not expect this to be suitable for massive projects. It is intended for use with small to mid-sized projects or for prototyping.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need to install &lt;a href="https://nodejs.org/en"&gt;node&lt;/a&gt; globally on your computer. Currently &lt;code&gt;v18+&lt;/code&gt; is a safer choice (My environment uses &lt;code&gt;v18.16.0&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  1 Set Up a Code Base
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1.1. Scaffolding a Vite Project
&lt;/h2&gt;

&lt;p&gt;Starting by running the &lt;a href="https://vitejs.dev/guide/"&gt;Vite&lt;/a&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm create vite@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then follow the prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name your project with whatever name you prefer.&lt;/li&gt;
&lt;li&gt;Select a framework: &lt;code&gt;React&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select a variant: › &lt;code&gt;TypeScript + SWC&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the project directory and run &lt;code&gt;npm install&lt;/code&gt; and &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1.2. (Optional) Enable Absolute Import Path
&lt;/h2&gt;

&lt;p&gt;This is an optional choice, but I personally dislike importing with relative paths, and it is always easier to configure it at the beginning..&lt;/p&gt;

&lt;p&gt;Add this line into your &lt;code&gt;tsconfig.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then let the Vite project know about your alias with adding these lines to &lt;code&gt;vite.config.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you are able to import components like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/components/Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1.3. Set up a Formatter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run: &lt;code&gt;npm install --save-dev prettier eslint-config-prettier&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a config file: &lt;code&gt;touch .prettierrc.yml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;printWidth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;semi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1.4 Set up Tailwind CSS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install: &lt;code&gt;npm install --save-dev tailwindcss postcss autoprefixer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configure the template path at &lt;code&gt;tailwind.config.js&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('tailwindcss').Config} */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.{js,ts,jsx,tsx}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add the Tailwind directives to the master CSS &lt;code&gt;index.css&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You only need the above to use Tailwind, but I love working with &lt;a href="https://tailwindui.com/"&gt;Tailwind UI&lt;/a&gt;, which requires some extra libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save @headlessui/react @heroicons/react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @tailwindcss/forms&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okay, now you're done with setting up the working frontend.&lt;br&gt;
Let's deploy it and publish them on the web!&lt;/p&gt;
&lt;h1&gt;
  
  
  2. Set Up Firebase Hosting
&lt;/h1&gt;
&lt;h2&gt;
  
  
  2.1 Create Your Project in Firebase
&lt;/h2&gt;

&lt;p&gt;You first need to go to Firebase Console and create a project.&lt;br&gt;
Here's an official documentation for that.&lt;br&gt;
&lt;a href="https://firebase.google.com/docs/web/setup"&gt;https://firebase.google.com/docs/web/setup&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.2 Initialize Your Application
&lt;/h2&gt;

&lt;p&gt;First you need to install firebase-tools globally:&lt;br&gt;
&lt;code&gt;npm install -g firebase-tools&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then run this:&lt;br&gt;
&lt;code&gt;firebase login&lt;/code&gt;&lt;br&gt;
This will launch a pop up to ask you to sign in. &lt;/p&gt;

&lt;p&gt;Then you hit this command in the directory you created with the earlier step: &lt;code&gt;firebase init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then follow the prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;Hosting and (optionally) set up GitHub Action deploys&lt;/code&gt; as a feature&lt;/li&gt;
&lt;li&gt;Select the project you just made&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;dist&lt;/code&gt; as your public directory (WARNING: &lt;code&gt;public&lt;/code&gt; is the default for firebase hosting, but it's easier to use &lt;code&gt;dist&lt;/code&gt; if you're using Vite as that's the default output directory for Vite.)&lt;/li&gt;
&lt;li&gt;Answer &lt;code&gt;yes&lt;/code&gt; when you're asked if you want to configure as a single-page app&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2.3 Deploy
&lt;/h2&gt;

&lt;p&gt;You need to use firebase sdk to deploy with a script:&lt;br&gt;
&lt;code&gt;npm install --save firebase&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then copy and paste config information. Your config info can be obtained on the &lt;a href="https://support.google.com/firebase/answer/7015592?hl=en#zippy=%2Cin-this-article"&gt;console&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HOSTING_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;authDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;storageBucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messagingSenderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;appId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;XXX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then initialize the firebase app using that config.&lt;br&gt;
This can be done with any file, but I would recommend putting somewhere close to root like &lt;code&gt;App.tsx&lt;/code&gt; or &lt;code&gt;index.ts&lt;/code&gt; because that has to be processed first before you use any firebase feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;initializeApp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;firebase/app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HOSTING_CONFIG&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;env/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="nx"&gt;initializeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HOSTING_CONFIG&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, add a script in your &lt;code&gt;package.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deploy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc &amp;amp;&amp;amp; vite build &amp;amp;&amp;amp; firebase deploy --only hosting"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it! 🎉&lt;/p&gt;

&lt;p&gt;Once you hit &lt;code&gt;npm run deploy&lt;/code&gt; in your terminal, you'll be able to see the default screen for Vite project. &lt;/p&gt;

&lt;p&gt;Now all you have to do is finish your project...&lt;/p&gt;

&lt;p&gt;Thanks for reading! Happy coding!🙌&lt;/p&gt;

</description>
      <category>react</category>
      <category>tutorial</category>
      <category>firebase</category>
      <category>vite</category>
    </item>
    <item>
      <title>Human-Friendly Programming</title>
      <dc:creator>Miyuki Tuisku</dc:creator>
      <pubDate>Sun, 13 Nov 2022 06:25:53 +0000</pubDate>
      <link>https://dev.to/myktsk/human-friendly-programming-ial</link>
      <guid>https://dev.to/myktsk/human-friendly-programming-ial</guid>
      <description>&lt;p&gt;Some believe that we programmers decided to do what we’re doing, because we don’t have to interact with other humans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fupeoewxcjizhfp973dbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fupeoewxcjizhfp973dbe.png" alt="meme about being a programmer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But is it so?&lt;/p&gt;

&lt;p&gt;I believe not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;As a developer of a SaaS product, I have been thinking about why reviewing some of the Pull Requests (PRs) has been more difficult or demoralizing than others and this is the conclusion I've come to. &lt;/p&gt;

&lt;p&gt;I would like to call the concept &lt;code&gt;Human-friendly programming&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is nothing new, super flashy nor shiny. But hopefully more powerful than you think.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Human-friendly Programming?
&lt;/h2&gt;

&lt;p&gt;The basic idea is really simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your programs are FOR HUMANS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A darker and cynical version of that would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your colleagues ain't your therapists.
They ain't bothered figuring out what you think.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your codes will be read, reviewed, and maintained by people (including you). Duh.🙄&lt;/p&gt;

&lt;p&gt;“The Art of Readable Code”, one of the go-to programming books of all time suggests:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The code should be easy to understand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s another quote from Martin Fowler.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any fool can write code that a computer can understand. Good programmers write code that humans can understand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah, yeah. We already know that, right?&lt;/p&gt;

&lt;p&gt;But yet, I’ve seen many fairly experienced programmers work like they aren’t bothered by that.😢&lt;/p&gt;

&lt;p&gt;So what exactly are we supposed to do?&lt;br&gt;
I’ve come up with some suggestions, and I’ll explain them in the next chapter.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are the Practices of Human-friendly Programming?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All of the code examples are written in Javascript and React. But I believe the essential concept would be universal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following is a list of some of the fundamental key rules I would like to present to make your PRs human-friendly. I’ll explain each with an example.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Name It Like You Mean It
&lt;/h3&gt;

&lt;p&gt;🥶 &lt;strong&gt;Non-Human-Friendly Way&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;clickCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hooray&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s say your colleague asked you to review their PR, and you find these lines of code.&lt;br&gt;
Do you get what happens when you click the button?&lt;/p&gt;

&lt;p&gt;😶‍🌫️ &lt;strong&gt;What I See&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;whatever&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;youFigureItOut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;whatever&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hooray&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I see codes like that, what I see in my head is this.  (I know I’m being cynical here. But I’m just trying to make my point.)&lt;/p&gt;

&lt;p&gt;😍 &lt;strong&gt;The Human-friendly Way&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blankTodoData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateBlankTodoData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;setTodoInServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blankTodoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;createTodo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hooray&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks MUCH BETTER to me. I can clearly see what happens when you click the button, and the setTodoInServer is trying to set blank data in the server. You can tell if the code is not behaving that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use Comments to Explain What the Code Can’t
&lt;/h2&gt;

&lt;p&gt;Ultimately, self-explanatory and understandable code without any comments are the best, so people should work on them first.&lt;/p&gt;

&lt;p&gt;But sometimes you have to make some completely random implementations in completely random places.&lt;br&gt;
And the chances are, your future self let alone your colleagues will have no clue why you had made such exceptions. &lt;/p&gt;

&lt;p&gt;Except for, if there’re comments about it.&lt;/p&gt;

&lt;p&gt;🥶 &lt;strong&gt;Non-Human-Friendly Way&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveInServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//NOTE: set saved todo data in local &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;😶‍🌫️ &lt;strong&gt;What I See&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveInServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//It's a complete mystery why it is setting the local state again&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Problems&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It does not give any information&lt;br&gt;
The comment exists for no reason.  I’d know what the code is doing by the name of the function by looking at the code. We want to know why you did it. It makes the code confusing and difficult to understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Makes the code more vulnerable to be broken in the future&lt;br&gt;
If people don’t understand why the code is doing what it’s doing, there is a chance that they will modify the code and break it. Trust me, it happens. I’ve actually done it myself and learned a lesson (that time actually there were no comments, so it’s even worse).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Codebase gets messy&lt;br&gt;
Not only it is useless, but it is violating the cleanliness of the code. Codes should be simple and clean.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;😍 &lt;strong&gt;The Human-friendly Way&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveInServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setInLocalState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//NOTE: setting id generated in server, which is required for updating&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I don’t know if there is a case like this realistically, but at least you know why setInLocalState is called twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Write Git Commit Message for Documenting
&lt;/h2&gt;

&lt;p&gt;Bad commit messages.&lt;br&gt;
This is one of the things I run into the most. And I have to admit, I find it very difficult to get it right myself.&lt;/p&gt;

&lt;p&gt;🥶 &lt;strong&gt;Non-Human-Friendly Way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;quick fix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add button&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fixed because of review comment&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;😶‍🌫️ &lt;strong&gt;What I See&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;something was wrong&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;what the button is for, is for you to figure out&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;someone pointed out there is something wrong with my code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problems&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It does not give any information&lt;br&gt;
Like the useless comments, the message does not explain why you’ve made the change. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Makes the code more vulnerable to be broken in the future&lt;br&gt;
Again, like the bad comments.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;😍 &lt;strong&gt;The Human-friendly Way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;🐛  hide deleted todos from todo list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;✨  enable creating todos from todo list page&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;♻️  use common utility function to create blank todo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One tip I read in &lt;a href="https://qiita.com/magicant/items/882b5142c4d5064933bc" rel="noopener noreferrer"&gt;this article(Japanese)&lt;/a&gt; is that commit messages should explain what the program does instead of what the programmer did. So instead of &lt;strong&gt;(the programmer)&lt;/strong&gt; added button , write **(the program) **enabled creating todos from todo list page .&lt;/p&gt;

&lt;p&gt;Having your own rule for prefixes to categorize the commit type is handy. Emoji prefix helps you understand what the commit is about at a glance. For example, if you see ♻️ then you know that the behavior should not have been changed. Our team is highly inspired by &lt;a href="https://gitmoji.dev/" rel="noopener noreferrer"&gt;gitmoji&lt;/a&gt;, but you can have your own rules. &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Conventional commit&lt;/a&gt;s is also a powerful way to make your commits sorted automatically and make it readable for humans.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Make Pull Requests With Care
&lt;/h2&gt;

&lt;p&gt;This one is also one of the most common and most difficult ones.&lt;/p&gt;

&lt;p&gt;🥶 &lt;strong&gt;Non-Human-Friendly Way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hundreds of lines of code in a single pull request&lt;/li&gt;
&lt;li&gt;The pull request is doing too much shit (e.g. creating, listing, and deleting todos)&lt;/li&gt;
&lt;li&gt;This is what the pull request cover looks like:
&lt;img src="https://media.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%2Fssemo7qmhyj33qz1845s.png" alt="Image of pull request cover"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ugh. There is nothing more demoralizing than getting this kind of review request.&lt;/p&gt;

&lt;p&gt;😶‍🌫️ &lt;strong&gt;What I See&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t care about how difficult and time-consuming it is for others to go through the entire codes&lt;/li&gt;
&lt;li&gt;You are not even bothered to explain how this PR’s supposed to affect the program&lt;/li&gt;
&lt;li&gt;No specification about how it’s supposed to work whatsoever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problems&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;More risks for overlooking mistakes&lt;br&gt;
The more codes you have to check, the more likely the reviewer will miss mistakes in the code. Moreover, it doesn’t help if you don’t give them any information on how it’s supposed to work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Takes more time&lt;br&gt;
Some think combining pull requests and having them reviewed once will save time. I really doubt that. Because firstly, it takes time to go through, so the feedback cycle takes a longer time. Secondly, you’ll have more chances to get more comments, so it takes longer to modify the code. Commenting on multiple topics (in this case about creating, listing and deleting) at the same time makes the communication super cumbersome. You should always stick with smaller feedback cycles.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;😍 &lt;strong&gt;The Human-friendly Way&lt;/strong&gt;&lt;br&gt;
Luckily, we can make a template with GitHub and many other git management services.&lt;br&gt;
Here are some part of the template we use in the team.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Why
- Some users want to see only todos that aren't completed and some wants to see all of the todos including completed ones

# Summary
- Create a toggle button to switch between "show allevery todos including completed" and "hide completed todos"
- Set default as "hide completed todos"
- Exclude completed todos when "hide completed todos" was chosen

# Test 
(Ideally this should be automated...)
- Completed todos DO NOT appear on the list when "hide completed todos" is chosen
- Completed todos DO appear on the list when "show alevery todos including completed" is chosen

# Related Links
- Link to the UI design file
- Link to the conversation about the specification

# Screeenshot
(Screenshot to show a grasp of what has changed) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;These practices are just a few examples. I believe there are loads of ways to make your code more human-friendly.&lt;/p&gt;

&lt;p&gt;But the main point is again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your programs are FOR HUMANS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whatever you do, if you answer these questions with a “Yes”, then that is the human-friendly way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Would you understand your code a year later?&lt;/li&gt;
&lt;li&gt;Did you explain what the code does in your commit messages?&lt;/li&gt;
&lt;li&gt;Would you understand what the PR is about without context?&lt;/li&gt;
&lt;li&gt;Can the reviewer finish reviewing within 10-20 mins?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
