<?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>Forem: Rickvian Aldi</title>
    <description>The latest articles on Forem by Rickvian Aldi (@rickvian).</description>
    <link>https://forem.com/rickvian</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%2F466870%2F56cf82b1-4ff2-4881-bceb-b988f111ae2a.png</url>
      <title>Forem: Rickvian Aldi</title>
      <link>https://forem.com/rickvian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rickvian"/>
    <language>en</language>
    <item>
      <title>Run Leetcode locally - Javascript test case for practices</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Fri, 10 Apr 2026 05:34:25 +0000</pubDate>
      <link>https://forem.com/rickvian/run-leetcode-locally-javascript-test-case-for-practices-1ffn</link>
      <guid>https://forem.com/rickvian/run-leetcode-locally-javascript-test-case-for-practices-1ffn</guid>
      <description>&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%2F25rpa1fduhuh4xe6vmpc.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%2F25rpa1fduhuh4xe6vmpc.jpg" alt=" " width="711" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leetcode debugging feature sits behind paywall.&lt;br&gt;
Stop paying for that!&lt;/p&gt;

&lt;p&gt;I once wish i could just use VScode&lt;br&gt;
and leverage some of the debugging feature&lt;br&gt;
you can do that easily, but how about the test cases? &lt;/p&gt;

&lt;p&gt;Thats why i collect build my own playground repo to practice solving Leetcode Javascript.&lt;br&gt;
I decided it has enough tests, so i open sourced it, check it out!&lt;/p&gt;

&lt;p&gt;Tip: use Jest/Vitest runner extension in VScode, clicking debug will attach debugger on the specific case&lt;/p&gt;

&lt;p&gt;I find debug mode is the most useful feature to figure out where i did mistake during practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lnkd.in/gW34BMp9" rel="noopener noreferrer"&gt;https://lnkd.in/gW34BMp9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So far i cover blind 75 list, will add top 150 later, and gradually covering 3K questions&lt;/p&gt;

&lt;p&gt;How to use this repo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clone this repo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run npm install&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this repo contains practice problem playground you can run under&lt;/p&gt;

&lt;p&gt;leetcode-playground/&lt;br&gt;
  └── /[problemsname].js&lt;br&gt;
open the .js file, you can start exercise of solving problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run test&lt;/strong&gt;&lt;br&gt;
every problem has respective test case you can run using `Vitest&lt;br&gt;
It contains test scenarios ready to battle test your solution (You can contribute test case!)&lt;br&gt;
Tests grouped under /tests folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips for debugging&lt;/strong&gt;&lt;br&gt;
To assist your learning, debugging mode is useful to understand why your code does not work,&lt;br&gt;
you can attach breakpoint, and run test in debug mode.&lt;br&gt;
I personally use VScode extension "Jest/ Vitest runner by firsttris". When you open the file, simply click 'debug' to run specific test or describe block. it will run your test in debug mode.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>leetcode</category>
      <category>productivity</category>
      <category>vscode</category>
    </item>
    <item>
      <title>start using Ralph with npx ralph-scaffold</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Wed, 21 Jan 2026 08:27:09 +0000</pubDate>
      <link>https://forem.com/rickvian/start-using-ralph-with-npx-ralph-scaffold-2167</link>
      <guid>https://forem.com/rickvian/start-using-ralph-with-npx-ralph-scaffold-2167</guid>
      <description>&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%2F1lhhhulssqalpwdrp551.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%2F1lhhhulssqalpwdrp551.jpg" alt=" " width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might have heard about RALPH, &lt;br&gt;
I published&lt;code&gt;ralph-scaffold&lt;/code&gt; npx script which can provide you with all files needed to start using ralph, simply run&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx ralph-scaffold&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and you are good to go.&lt;br&gt;
(I use setup from Ryan Carson)&lt;br&gt;
&lt;a href="https://x.com/ryancarson/status/2008548371712135632" rel="noopener noreferrer"&gt;https://x.com/ryancarson/status/2008548371712135632&lt;/a&gt;&lt;br&gt;
What is Ralph?&lt;/p&gt;

&lt;p&gt;its a workflow, simple idea, to loop the code agent over and over, until it reach the goal, each time it make mistake it will learn from it. each time it make progress it will take note.&lt;/p&gt;

&lt;p&gt;Every loop, will restart code agent starting with fresh context window, supply it with notes on things it learned so far, and progresses&lt;br&gt;
This eliminate the weakness of "Context Drift",&lt;/p&gt;

&lt;p&gt;However,&lt;br&gt;
this can dramatically increase token usage, and if it drifts, its gonna snowball through entire iterations, potentially wasting tokens.&lt;/p&gt;

&lt;p&gt;Ralph works well on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small Task Stories&lt;/li&gt;
&lt;li&gt;Good feedack on interations , like typecheck or linters,&lt;/li&gt;
&lt;li&gt;Explicit criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Matt Pocock explained this really well&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=_IK18goX4X8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=_IK18goX4X8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the token usages could potentially out of control, you may want to try it with claude premium plans, and avoid API based token (i tried it, the token usage is nuts)&lt;/p&gt;


&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;A bash loop that:&lt;br&gt;
Pipes a prompt into your AI agent&lt;br&gt;
Agent picks the next story from prd.json&lt;br&gt;
Agent implements it&lt;br&gt;
Agent runs typecheck + tests&lt;br&gt;
Agent commits if passing&lt;br&gt;
Agent marks story done&lt;br&gt;
Agent logs learnings&lt;br&gt;
Loop repeats until done&lt;/p&gt;
&lt;h3&gt;
  
  
  Memory persists only through:
&lt;/h3&gt;

&lt;p&gt;Git commits&lt;br&gt;
progress.txt (learnings)&lt;br&gt;
prd.json (task status)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scripts/ralph/
├── ralph.sh
├── prompt.md
├── prd.json
└── progress.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ralph.sh
&lt;/h2&gt;

&lt;p&gt;The loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nv"&gt;MAX_ITERATIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;SCRIPT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_SOURCE&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🚀 Starting Ralph"&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 &lt;span class="nv"&gt;$MAX_ITERATIONS&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"═══ Iteration &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; ═══"&lt;/span&gt;

  &lt;span class="nv"&gt;OUTPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_DIR&lt;/span&gt;&lt;span class="s2"&gt;/prompt.md"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | claude &lt;span class="nt"&gt;--dangerously-skip-permissions&lt;/span&gt; 2&amp;gt;&amp;amp;1 &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;tee&lt;/span&gt; /dev/stderr&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true

  &lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;promise&amp;gt;COMPLETE&amp;lt;/promise&amp;gt;"&lt;/span&gt;
  &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ Done!"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;0
  &lt;span class="k"&gt;fi

  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"⚠️ Max iterations reached"&lt;/span&gt;
&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/ralph/ralph.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  prompt.md
&lt;/h2&gt;

&lt;p&gt;Instructions for each iteration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Ralph Agent Instructions&lt;/span&gt;

&lt;span class="gu"&gt;## Your Task&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Read &lt;span class="sb"&gt;`scripts/ralph/prd.json`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Read &lt;span class="sb"&gt;`scripts/ralph/progress.txt`&lt;/span&gt;
   (check Codebase Patterns first)
&lt;span class="p"&gt;3.&lt;/span&gt; Check you're on the correct branch
&lt;span class="p"&gt;4.&lt;/span&gt; Pick highest priority story 
   where &lt;span class="sb"&gt;`passes: false`&lt;/span&gt;
&lt;span class="p"&gt;5.&lt;/span&gt; Implement that ONE story
&lt;span class="p"&gt;6.&lt;/span&gt; Run typecheck and tests
&lt;span class="p"&gt;7.&lt;/span&gt; Update AGENTS.md files with learnings
&lt;span class="p"&gt;8.&lt;/span&gt; Commit: &lt;span class="sb"&gt;`feat: [ID] - [Title]`&lt;/span&gt;
&lt;span class="p"&gt;9.&lt;/span&gt; Update prd.json: &lt;span class="sb"&gt;`passes: true`&lt;/span&gt;
&lt;span class="p"&gt;10.&lt;/span&gt; Append learnings to progress.txt

&lt;span class="gu"&gt;## Progress Format&lt;/span&gt;

APPEND to progress.txt:

&lt;span class="gu"&gt;## [Date] - [Story ID]&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; What was implemented
&lt;span class="p"&gt;-&lt;/span&gt; Files changed
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Learnings:**&lt;/span&gt;
&lt;span class="p"&gt;  -&lt;/span&gt; Patterns discovered
&lt;span class="gh"&gt;  - Gotchas encountered
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Codebase Patterns&lt;/span&gt;

Add reusable patterns to the TOP 
of progress.txt:

&lt;span class="gu"&gt;## Codebase Patterns&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Migrations: Use IF NOT EXISTS
&lt;span class="p"&gt;-&lt;/span&gt; React: useRef&lt;span class="nt"&gt;&amp;lt;Timeout&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="na"&gt;null&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(null)

&lt;span class="gu"&gt;## Stop Condition&lt;/span&gt;

If ALL stories pass, reply:
&lt;span class="nt"&gt;&amp;lt;promise&amp;gt;&lt;/span&gt;COMPLETE&lt;span class="nt"&gt;&amp;lt;/promise&amp;gt;&lt;/span&gt;

Otherwise end normally.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  prd.json
&lt;/h2&gt;

&lt;p&gt;Your task list:&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;"branchName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ralph/feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userStories"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add login form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptanceCriteria"&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="s2"&gt;"Email/password fields"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"Validates email format"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"typecheck passes"&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="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"passes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key fields:&lt;br&gt;
&lt;code&gt;branchName&lt;/code&gt; — branch to use&lt;br&gt;
&lt;code&gt;priority&lt;/code&gt; — lower = first&lt;br&gt;
&lt;code&gt;passes&lt;/code&gt; — set true when done&lt;/p&gt;
&lt;h2&gt;
  
  
  progress.txt
&lt;/h2&gt;

&lt;p&gt;Start with context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Ralph Progress Log&lt;/span&gt;
Started: 2024-01-15

&lt;span class="gu"&gt;## Codebase Patterns&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Migrations: IF NOT EXISTS
&lt;span class="p"&gt;-&lt;/span&gt; Types: Export from actions.ts

&lt;span class="gu"&gt;## Key Files&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; db/schema.ts
&lt;span class="gh"&gt;- app/auth/actions.ts
---
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ralph appends after each story.&lt;br&gt;
Patterns accumulate across iterations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running Ralph
&lt;/h2&gt;

&lt;p&gt;run the ralph script with 25 iterations&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/ralph/ralph.sh 25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ralph will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create the feature branch&lt;/li&gt;
&lt;li&gt;Complete stories one by one&lt;/li&gt;
&lt;li&gt;Commit after each&lt;/li&gt;
&lt;li&gt;Stop when all pass&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ralph</category>
    </item>
    <item>
      <title>Understanding TypeScript’s Comments: @ts-ignore, @ts-expect-error, and Friends</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Tue, 10 Jun 2025 02:00:05 +0000</pubDate>
      <link>https://forem.com/rickvian/understanding-typescripts-magic-comments-ts-ignore-ts-expect-error-and-friends-3pd4</link>
      <guid>https://forem.com/rickvian/understanding-typescripts-magic-comments-ts-ignore-ts-expect-error-and-friends-3pd4</guid>
      <description>&lt;p&gt;When working with TypeScript, you've probably seen some strange-looking comments like // @ts-ignore or // @ts-expect-error. These are TypeScript directives, often called “magic comments” — and they can change how the compiler behaves for specific lines or files.&lt;br&gt;
what exactly is it? what are the difference?&lt;/p&gt;

&lt;p&gt;Let's walk through the 4 most important directives you should know.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. // @ts-expect-error
&lt;/h2&gt;

&lt;p&gt;This directive tells TypeScript:&lt;/p&gt;

&lt;p&gt;“I expect the next line to throw a type error. If it doesn't, fail the build.”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @ts-expect-error
const name: number = "John"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the error is later fixed (intentionally or by accident), the compiler throws an error:&lt;/p&gt;

&lt;p&gt;Unused '@ts-expect-error' directive.&lt;/p&gt;

&lt;p&gt;✅ Why it's good:&lt;br&gt;
    • Enforces that you're suppressing an error on purpose.&lt;br&gt;
    • Helps with testing or gradually migrating code.&lt;/p&gt;

&lt;p&gt;🛠 Use when:&lt;br&gt;
    • You're writing a test that expects an error.&lt;br&gt;
    • You're temporarily keeping known type errors but want safety.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. // @ts-ignore
&lt;/h2&gt;

&lt;p&gt;This tells TypeScript:&lt;/p&gt;

&lt;p&gt;“Ignore all errors on the next line. I know what I'm doing.”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @ts-ignore
const user: string = 123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike @ts-expect-error, this will never alert you even if the error is gone later. It's silent and dangerous if overused.&lt;/p&gt;

&lt;p&gt;⚠️ Why it's risky:&lt;br&gt;
    • Suppresses all type checking on that line.&lt;br&gt;
    • Can hide bugs and technical debt.&lt;/p&gt;

&lt;p&gt;🛠 Use only when:&lt;br&gt;
    • There's no other option.&lt;br&gt;
    • You're integrating with legacy code, third-party libs, or non-typed APIs.&lt;/p&gt;

&lt;p&gt;I would avoid this at all cost.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. // @ts-check (for .js files)
&lt;/h2&gt;

&lt;p&gt;This enables TypeScript type-checking for plain JavaScript files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @ts-check

/**
 * @param {number} x
 * @returns {number}
 */
function square(x) {
  return x * x
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 Why it's useful:&lt;br&gt;
    • Allows you to catch type bugs in JS without migrating to .ts.&lt;br&gt;
    • You can annotate with JSDoc for full type checking.&lt;/p&gt;

&lt;p&gt;🛠 Use when:&lt;br&gt;
    • Gradually migrating a JS codebase to TS.&lt;br&gt;
    • You want lightweight type safety in JS.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. // @ts-nocheck
&lt;/h2&gt;

&lt;p&gt;Disables all TypeScript checking for a file even in .ts or .tsx.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @ts-nocheck

const user = getUser()
user.doSomethingThatDoesNotExist()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💀 Why it's dangerous:&lt;br&gt;
    • Completely disables the TypeScript compiler for that file.&lt;br&gt;
    • Silently ignores all type and syntax errors.&lt;/p&gt;

&lt;p&gt;🛠 Use only when:&lt;br&gt;
    • You're working with untyped legacy code.&lt;br&gt;
    • You're debugging or temporarily disabling TS during migration.&lt;/p&gt;



&lt;p&gt;Overall, my take:&lt;br&gt;
    • Prefer @ts-expect-error over @ts-ignore for long-term maintainability.&lt;br&gt;
    • Use ESLint rules like @typescript-eslint/ban-ts-comment to restrict or require justification for using these comments.&lt;br&gt;
    • In a real project, flag every @ts-ignore for later cleanup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Directive          | Scope       | Description                                      | Safe? |
|-------------------|-------------|--------------------------------------------------|--------|
| `@ts-expect-error` | One line    | Expect a type error. Fails if no error.         | ✅     |
| `@ts-ignore`       | One line    | Ignore any TS error on the next line.           | ⚠️     |
| `@ts-check`        | Whole file  | Enable TS checking in JS files.                 | ✅     |
| `@ts-nocheck`      | Whole file  | Disable all TS checking.                        | ❌     |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use them wisely to reduce friction, not to hide problems.&lt;/p&gt;

&lt;p&gt;This article is part of my personal note, as reminder of problems and learnings i encounter on my daily work. I did use AI to help build the article. &lt;br&gt;
If you interested, follow.&lt;/p&gt;

</description>
      <category>typescript</category>
    </item>
    <item>
      <title>Breaking Curse of Knowledge</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Fri, 25 Oct 2024 02:32:41 +0000</pubDate>
      <link>https://forem.com/rickvian/breaking-curse-of-knowledge-af4</link>
      <guid>https://forem.com/rickvian/breaking-curse-of-knowledge-af4</guid>
      <description>&lt;p&gt;At work, we spend years honing our technical skills, mastering fundamentals and frameworks, and optimizing our code. But there’s a common trap we can all fall intO&lt;/p&gt;

&lt;p&gt;curse of knowledge. &lt;/p&gt;

&lt;p&gt;This cognitive bias happens when you’ve worked on something for so long that you forget what it’s like not to know it, leads to poor communication.&lt;/p&gt;

&lt;p&gt;I shares a bit of my experience.&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%2Fj5e5uqhxh90im0xuks3u.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%2Fj5e5uqhxh90im0xuks3u.png" alt="Image description" width="562" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Breaking the Curse of Knowledge: Simple Tips&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check Understanding&lt;/strong&gt;&lt;br&gt;
Don’t assume everyone is on the same page. Check in to see if others have questions or need clarification. What seems obvious to you may not be for them.&lt;br&gt;
People can be in any quadrant:&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%2Fm2c5kb2t6i3yzb4e027g.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%2Fm2c5kb2t6i3yzb4e027g.png" alt="Image description" width="800" height="823"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explain the “Why” First&lt;/strong&gt;&lt;br&gt;
Before diving into a solution or technical detail, explain why it's important or why you're suggesting it. It helps others follow along and understand the broader context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplify Your Language&lt;/strong&gt;&lt;br&gt;
Avoid jargon or overly complex terms unless you’re sure your audience understands. If you need to use them, take a moment to explain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Patient&lt;/strong&gt;&lt;br&gt;
Give people the space to ask questions and admit when they don’t know something. Encourage a culture where it’s okay to say, “I don’t understand.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give Reference: When Understanding Isn’t Critical Right Now&lt;/strong&gt;&lt;br&gt;
Sometimes, the person you're explaining something to doesn’t need to grasp every detail in the moment. In such cases, it’s often better to provide them with a reference or resource they can review later, on their own time. This way, you can move forward with your discussion without overwhelming them.&lt;/p&gt;

&lt;p&gt;When to Give Reference:&lt;br&gt;
Low Urgency: If understanding the concept isn’t essential to the current task, providing a well-sourced reference for later is ideal, allow them to enggage you through other async communcation channel such as chat, PR comments, etc&lt;br&gt;
Complex or Technical Topics: Deep-dive topics often require more time to digest. A reference allows the person to absorb the information at their own pace.&lt;br&gt;
Self-Directed Learning: Some people learn better by doing their own research. By providing resources, you empower them to take control of their learning process.&lt;br&gt;
Example:&lt;br&gt;
In a frontend development meeting, you may introduce a new framework but don’t need everyone to immediately understand its internals. You can say, “Here’s a link to the documentation for further reading. We’ll move on, but feel free to go through it later.”&lt;/p&gt;

&lt;p&gt;Try Analogy: When You Need Immediate Understanding&lt;br&gt;
In situations where the other person must understand now, simplifying the concept with an analogy can be extremely effective. Analogies work because they relate the unknown concept to something the person already understands.&lt;/p&gt;

&lt;p&gt;When to Try Analogy:&lt;br&gt;
High Urgency: If they need to understand right away to make progress, using an analogy can simplify complex ideas.&lt;br&gt;
Breaking Down Complex Concepts: Analogies make difficult technical subjects more relatable by linking them to everyday experiences.&lt;br&gt;
Engaging the Listener: People are more likely to grasp a new concept if they can relate it to something familiar.&lt;br&gt;
Example:&lt;br&gt;
When explaining how React’s state management works to someone unfamiliar, you could say, “Think of React’s state like the memory of a calculator. It stores the numbers and operations, and when something changes, the display (your UI) updates automatically.” &lt;br&gt;
Though analogy is less accurate, I found this often worked better than giving definition.&lt;/p&gt;

&lt;p&gt;here are gist for you&lt;br&gt;
&lt;a href="https://gist.github.com/rickvian/54fd86a1439ea81bef1b1ca2ac55bf13" rel="noopener noreferrer"&gt;https://gist.github.com/rickvian/54fd86a1439ea81bef1b1ca2ac55bf13&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Don't ask me to review your huge PR</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Thu, 12 Sep 2024 08:10:48 +0000</pubDate>
      <link>https://forem.com/rickvian/dont-ask-me-to-review-your-huge-pr-5dgl</link>
      <guid>https://forem.com/rickvian/dont-ask-me-to-review-your-huge-pr-5dgl</guid>
      <description>&lt;p&gt;TL;DR Huge PRs are bad. Break it to smaller PR,&lt;br&gt;
 ”as small as possible, as big as 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%2F3r8lw749phh46e8edbmj.jpeg" 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%2F3r8lw749phh46e8edbmj.jpeg" alt="Image description" width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are lots of benefits on Smaller PR. I'm giving perspective of problem with huge PR provides better understanding of why it matters:&lt;/p&gt;

&lt;p&gt;Problems of Huge PRs:&lt;br&gt;
&lt;strong&gt;Complexity&lt;/strong&gt;:&lt;br&gt;
Difficult to understand the scope and impact of changes.&lt;br&gt;
Increased chance of missing bugs or issues during review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review Fatigue&lt;/strong&gt;&lt;br&gt;
Reviewers may experience fatigue, leading to less thorough reviews.&lt;br&gt;
Critical feedback may be overlooked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merge Conflicts&lt;/strong&gt;&lt;br&gt;
Higher likelihood of merge conflicts, especially in active codebases. Resolving conflicts can be time-consuming and error-prone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delayed Feedback&lt;/strong&gt;&lt;br&gt;
Engineers have other task to do, pushing them to review your huge PR soon will messed with their working schedule, this also means indirectly increase THEIR cycle time.&lt;br&gt;
Longer review times delay the feedback loop.&lt;br&gt;
Increases YOUR cycle time.&lt;br&gt;
Slower integration of features or bug fixes into the main codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Risks&lt;/strong&gt;&lt;br&gt;
Larger changes increase the risk of introducing significant issues.&lt;br&gt;
Harder to isolate the root cause of problems if they arise post-deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reduced Collaboration&lt;/strong&gt;&lt;br&gt;
Larger PRs can discourage collaborative review processes.&lt;br&gt;
Team members might find it challenging to stay informed about ongoing changes. Navigating history of Pull request will be painful&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disrespect to other engineer&lt;/strong&gt;&lt;br&gt;
unless you are inexperienced engineer, i will consider it disrespect to rise huge PR&lt;/p&gt;

&lt;p&gt;Category&lt;br&gt;
Estimated First-loop Review time needed (dedicating time)&lt;/p&gt;

&lt;p&gt;Small PR&lt;br&gt;
&amp;lt; 30 minutes&lt;/p&gt;

&lt;p&gt;Medium&lt;br&gt;
Up to 1 Hour&lt;/p&gt;

&lt;p&gt;Large&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 hour&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Subjective estimation and can change. Line and file changes may not be good proxy.&lt;/p&gt;

&lt;p&gt;Rules &amp;amp; Guidelines&lt;/p&gt;

&lt;p&gt;Non-urgent changes on app behaviour or refactor must include associated ticket to track history and reason why it done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Split Large PRs:&lt;/strong&gt; &lt;br&gt;
Split large PRs into smaller, more manageable chunks.&lt;br&gt;
in case you have bad commit management discipline, nothing stop you from creating multi PR in same ticket&lt;br&gt;
feature/TASK-1234-part-1-scenario-a&lt;br&gt;
feature/TASK-1234-part-2-scenario-b&lt;br&gt;
feature/TASK-1234-part-2-test-and-refactor&lt;/p&gt;

&lt;p&gt;But supposedly ticket shouldn’t be huge at first place. If i find i have huge PR, normally i will look at how i breakdown task in ticket and breakdown further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context and Documentation&lt;/strong&gt;: Normally small enough PR already self explanatory. You may provide detailed descriptions and context for the changes to facilitate easier reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collaborative Review&lt;/strong&gt;: if you must, for very large or complex PRs, consider collaborative reviews or pair programming sessions. This speed up feedback-loop process and allow everyone to understand further.&lt;/p&gt;

</description>
      <category>git</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
    </item>
    <item>
      <title>check existing SSH public key in Windows</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Tue, 14 Nov 2023 14:47:00 +0000</pubDate>
      <link>https://forem.com/rickvian/check-existing-ssh-public-key-in-windows-19jk</link>
      <guid>https://forem.com/rickvian/check-existing-ssh-public-key-in-windows-19jk</guid>
      <description>&lt;p&gt;To check your existing SSH public key in Windows, you can follow these steps:&lt;/p&gt;

&lt;p&gt;Check Existing SSH Public Key in Windows (PowerShell, for Bitbucket use)&lt;br&gt;
    1.Open PowerShell.&lt;br&gt;
    2.Navigate to your SSH key directory (replace YourUsername if needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd $env:USERPROFILE\.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3.Display your public key:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get-Content id_rsa.pub

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4.Note: If id_rsa.pub does not exist, generate a new key:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;ssh-keygen&lt;/p&gt;

</description>
    </item>
    <item>
      <title>parseInt vs _.toInteger vs _.toNumber</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Tue, 07 Nov 2023 03:20:01 +0000</pubDate>
      <link>https://forem.com/rickvian/parseint-vs-tointeger-vs-tonumber-102p</link>
      <guid>https://forem.com/rickvian/parseint-vs-tointeger-vs-tonumber-102p</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const _ = require('lodash')

const values = [
  null,
  undefined,
  '11text',
  'null',
  'NaN',
  'Infinity',
  '',
  '19.5',
]

values.forEach((value) =&amp;gt; {
  console.log(`_.toInteger(${JSON.stringify(value)}):`, _.toInteger(value))
  console.log(`_.toNumber(${JSON.stringify(value)}):`, _.toNumber(value))
  console.log(`parseInt(${JSON.stringify(value)}):`, parseInt(value))
  console.log(`\n`)
})

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_.toInteger(null): 0
_.toNumber(null): 0
parseInt(null): NaN


_.toInteger(undefined): 0
_.toNumber(undefined): NaN
parseInt(undefined): NaN


_.toInteger("11text"): 0
_.toNumber("11text"): NaN
parseInt("11text"): 11


_.toInteger("null"): 0
_.toNumber("null"): NaN
parseInt("null"): NaN


_.toInteger("NaN"): 0
_.toNumber("NaN"): NaN
parseInt("NaN"): NaN


_.toInteger("Infinity"): 1.7976931348623157e+308
_.toNumber("Infinity"): Infinity
parseInt("Infinity"): NaN


_.toInteger(""): 0
_.toNumber(""): 0
parseInt(""): NaN


_.toInteger("19.5"): 19
_.toNumber("19.5"): 19.5
parseInt("19.5"): 19

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Step by step to work on Front end feature request</title>
      <dc:creator>Rickvian Aldi</dc:creator>
      <pubDate>Wed, 26 Jul 2023 03:35:10 +0000</pubDate>
      <link>https://forem.com/rickvian/step-by-step-to-work-on-front-end-feature-request-4kkj</link>
      <guid>https://forem.com/rickvian/step-by-step-to-work-on-front-end-feature-request-4kkj</guid>
      <description>&lt;p&gt;Ever think about your approach of doing a feature request?&lt;br&gt;
I do, and sometimes i don't do it in consistent way, &lt;br&gt;
sometimes i read the requirement and straight to the code, and just missing out some edge cases / scenario and i had to re-work my state, component structure&lt;/p&gt;

&lt;p&gt;here are small notes from me, that i think an ideal step-by-step approach to complete a small feature request (consider it like a jira ticket if you use jira)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Define scenarios that you want to test as a unit test&lt;br&gt;
Read the Acceptance criteria in the ticket (the requirement).&lt;br&gt;
write blank test, without assertion first, but write the scenario and step by step to run it by using comment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if you use TDD approach, start writing the test after that&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if you don’t use TDD approach for some reason, skip and do the unit test after the code is completed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t code yet, do little white boarding, or pen/paper to design your state, code, containers, components compositions, etc.&lt;br&gt;
ensure your design can cover scenario 1 , 2, 3 of the unit test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Break your plan into subtasks, make a checklist from it. (todolist, comments, whatever you like, but ensure you keep on track on every small thing you need to do)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️this list will help you to focus.&lt;br&gt;
for example you doing task A, and you just realized you need to add B and C, instead of getting distracted you can add B and C to the list first, and complete A first without switching back and forth doing different things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Start code&lt;br&gt;
develop to cover scenario 1, then cover 2, then 3 then etc…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you haven't, Complete the unit test&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create commit, recommended to follow this approach &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;https://www.conventionalcommits.org/en/v1.0.0/&lt;/a&gt;&lt;br&gt;
then Raise a PR.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you can then continue to test the feature in your staging environment, and once passed, deploy to prod&lt;/p&gt;

</description>
      <category>jira</category>
      <category>ticket</category>
      <category>workflow</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
