<?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: Jayant Bhawal</title>
    <description>The latest articles on Forem by Jayant Bhawal (@jayantbh).</description>
    <link>https://forem.com/jayantbh</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%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png</url>
      <title>Forem: Jayant Bhawal</title>
      <link>https://forem.com/jayantbh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jayantbh"/>
    <language>en</language>
    <item>
      <title>Git Gud: Learning Git to survive your first month 🚀</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Mon, 09 Sep 2024 09:38:41 +0000</pubDate>
      <link>https://forem.com/jayantbh/git-gud-learning-git-to-survive-your-first-month-jbl</link>
      <guid>https://forem.com/jayantbh/git-gud-learning-git-to-survive-your-first-month-jbl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Getting started with Git?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's pretty easy, tbh.&lt;br&gt;
It's literally as simple as &lt;code&gt;git clone&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, &lt;code&gt;git push&lt;/code&gt;...&lt;br&gt;
Wait, I need to pull before I push?&lt;br&gt;
Google says I should rebase or something.&lt;br&gt;
Wait, where did my changes go?&lt;br&gt;
Oh god I was supposed to ship this today!&lt;br&gt;
OH SH*T WHAT IS HAPPENING?!?!?&lt;/p&gt;

&lt;p&gt;I got your back.&lt;/p&gt;

&lt;p&gt;This post covers the basics, and some 🍑 saving measires.&lt;/p&gt;


&lt;h3&gt;
  
  
  Basic Workflow: &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s get these out of the way fast. These are the bread and butter of Git. You’ll use them in almost every project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/strong&gt;: Start version control in a new project.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git clone&lt;/code&gt;&lt;/strong&gt;: Copy an existing project to your machine.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/strong&gt;: See what’s changed in your working directory.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/strong&gt;: Stage changes to be committed.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/strong&gt;: Save those changes with a helpful message 📝.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/strong&gt;: Send your changes to the remote repo (like GitHub) 🚀.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/strong&gt;: Fetch and merge updates from the remote repo into your local one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is your life for the next few weeks. Add a meme here of a person looking at their terminal, overwhelmed by all the commands 😅. Now, let’s kick things up a notch.&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%2Fak11eg0ulpzmkccxol24.jpeg" 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%2Fak11eg0ulpzmkccxol24.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/not-heres-how-to-write-actually-good-commit-messages-hint-its-not-just-adding-commit-lint-j2i" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Not 💩, here's how to write actually good commit messages (hint: It's not just adding commit-lint)&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 6&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#git&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#codereview&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  Going Deeper: &lt;code&gt;log&lt;/code&gt;, &lt;code&gt;reflog&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;rebase&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt;, &lt;code&gt;cherry-pick&lt;/code&gt;, &lt;code&gt;aliases&lt;/code&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;code&gt;git log&lt;/code&gt;: Looking Back in Time
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git log&lt;/code&gt; is more than just a history view—it's a window into the soul of your code 👀. Want to narrow things down?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Find by author&lt;/strong&gt;: 
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git log --author="Your Name"&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **Check only specific files**: 
  ```bash


  git log -- file.js


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check changes within a time frame&lt;/strong&gt;:
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git log --since="2 weeks ago"&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **Combine it all** for targeted queries:
  ```bash


  git log --author="Your Name" --since="2 weeks ago" --oneline --graph


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

&lt;/div&gt;

&lt;p&gt;For complex histories, the &lt;code&gt;--graph&lt;/code&gt; option is the best thing since sliced bread 🍞—it shows how branches and merges evolved. Insert a meme of a messy Git graph here for a laugh!&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;code&gt;git reflog&lt;/code&gt;: Recover from the Unrecoverable
&lt;/h4&gt;

&lt;p&gt;If Git were a video game, &lt;code&gt;git reflog&lt;/code&gt; would be your “undo” cheat code 🎮. It tracks &lt;strong&gt;every&lt;/strong&gt; change you make, even when &lt;code&gt;git log&lt;/code&gt; can't help. Accidentally wiped out a commit with &lt;code&gt;reset --hard&lt;/code&gt;? No worries.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git reflog
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD@&lt;span class="o"&gt;{&lt;/span&gt;2&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Go back to the state of the repo before the mistake&lt;/span&gt;


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

&lt;/div&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%2F7c99ba32i4bl6bnr7xch.gif" 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%2F7c99ba32i4bl6bnr7xch.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  3. &lt;code&gt;git merge&lt;/code&gt; &amp;amp; &lt;code&gt;git rebase&lt;/code&gt;: Navigating the Big Leagues
&lt;/h4&gt;

&lt;p&gt;These are the strategies for bringing together different branches. Both are super powerful, but they serve different purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git merge&lt;/code&gt;&lt;/strong&gt;: Combines two branches and creates a merge commit. If you want to keep the full history intact and visible, merge is your friend.
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git merge feature-branch&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
  Use `--no-ff` if you want to always create a merge commit, even when Git could fast-forward:
  ```bash


  git merge --no-ff feature-branch


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git rebase&lt;/code&gt;&lt;/strong&gt;: Moves your branch on top of another, making the history cleaner.
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git rebase main&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Want to polish your commits before merging? Try an **interactive** rebase:
  ```bash


  git rebase -i HEAD~3


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

&lt;/div&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%2Fx42k8p3i8qd2g8ogm6x1.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%2Fx42k8p3i8qd2g8ogm6x1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the unaware, the internet feels pretty... strongly about merges and rebases. In case you didn't know, you will, soon. :D&lt;/p&gt;

&lt;p&gt;Do share what's your preference in the comments. 👇&lt;/p&gt;




&lt;h4&gt;
  
  
  4. &lt;code&gt;git fetch&lt;/code&gt;: See Without Touching
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git fetch&lt;/code&gt; is like peeking into the fridge to see what's inside before deciding what to eat 🍕. It updates your local copy with changes from the remote, but doesn’t mess with your working branch yet.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git fetch origin


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

&lt;/div&gt;

&lt;p&gt;Use it with &lt;code&gt;git diff&lt;/code&gt; to see how your local branch compares:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git diff origin/main


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

&lt;/div&gt;




&lt;h4&gt;
  
  
  5. &lt;code&gt;git push&lt;/code&gt;: Beyond the Basics
&lt;/h4&gt;

&lt;p&gt;While &lt;code&gt;git push origin main&lt;/code&gt; is the standard, here’s how you can take it further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push specific branches&lt;/strong&gt;: 
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git push origin feature-branch&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **Push and set upstream** (perfect for new branches):
  ```bash


  git push -u origin feature-branch


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Force pushing&lt;/strong&gt; when you absolutely need to:
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git push --force&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **Push specific tags**:
  ```bash


  git push origin v1.0.0


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

&lt;/div&gt;

&lt;p&gt;Need to &lt;strong&gt;delete&lt;/strong&gt; a branch from the remote? Easy:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git push origin &lt;span class="nt"&gt;--delete&lt;/span&gt; feature-branch


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

&lt;/div&gt;




&lt;h4&gt;
  
  
  6. &lt;code&gt;git reset&lt;/code&gt;: Correcting Mistakes
&lt;/h4&gt;

&lt;p&gt;Time to fix those “oops” moments! &lt;code&gt;git reset&lt;/code&gt; lets you move backward in time—without a time machine. Here are the different flavors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft reset&lt;/strong&gt; keeps your changes but removes the commit:
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git reset --soft HEAD~1&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **Mixed reset** uncommits and unstages the changes:
  ```bash


  git reset HEAD~1


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard reset&lt;/strong&gt; wipes out everything—gone, poof 💥:
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git reset --hard HEAD~1&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Pro tip: Run `git reflog` if you accidentally reset something important.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bfwepz8mm29pz79es7wt.png)


---

#### 7. `git cherry-pick`: Selective Commit Application

Need just *one* commit from another branch? `git cherry-pick` is your secret weapon 🍒. Grab the exact commit you need without merging the whole branch.

```bash


git cherry-pick &amp;lt;commit-hash&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;This is especially handy when you need a quick bug fix from another branch without bringing in all the extra work.&lt;/p&gt;




&lt;h4&gt;
  
  
  8. Git Aliases: Work Smarter, Not Harder
&lt;/h4&gt;

&lt;p&gt;Why type out long commands when you can use aliases? Here's how to cut down your keystrokes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;gwip&lt;/code&gt;&lt;/strong&gt;: Stash all changes with a "Work in Progress" commit:
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git config --global alias.gwip "!git add -A &amp;amp;&amp;amp; git commit -m 'WIP'"&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- **`gunwip`**: Undo your last WIP commit and restore your working state:
  ```bash


  git config --global alias.gunwip "reset HEAD~1 --soft"


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

&lt;/div&gt;

&lt;p&gt;And the classics:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.st status
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.co checkout
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.br branch
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.cm commit
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.lg &lt;span class="s2"&gt;"log --oneline --graph --all"&lt;/span&gt;


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

&lt;/div&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%2F3uvza0h12hvwlp8on24r.gif" 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%2F3uvza0h12hvwlp8on24r.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You, when you realized you didn't need to type those long-damn commands a thousand times repeatedly.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Git isn’t scary once you get the hang of it, and these advanced commands will help you control your projects like a boss 💪. Whether you’re rewinding time with &lt;code&gt;reflog&lt;/code&gt;, surgically applying commits with &lt;code&gt;cherry-pick&lt;/code&gt;, or streamlining your workflow with aliases, you’ve got the tools to not just survive, but &lt;em&gt;master&lt;/em&gt; Git.&lt;/p&gt;

&lt;p&gt;Happy coding! 😎&lt;/p&gt;




&lt;p&gt;Hope this helps you &lt;em&gt;Git Gud&lt;/em&gt; faster—and don’t forget to share your favorite Git memes along the way!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>git</category>
    </item>
    <item>
      <title>Frontend Dev + Data Structures &amp; Algorithms: How DSA Can Power Your React App ⚡</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Sun, 08 Sep 2024 09:01:48 +0000</pubDate>
      <link>https://forem.com/jayantbh/frontend-dev-data-structures-algorithms-how-dsa-can-power-your-react-app-491a</link>
      <guid>https://forem.com/jayantbh/frontend-dev-data-structures-algorithms-how-dsa-can-power-your-react-app-491a</guid>
      <description>&lt;p&gt;Frontend focused interviews often don’t care about DSA at all.&lt;/p&gt;

&lt;p&gt;And for those of us that remember studying DSA at school/college, all the examples felt purely algorithmic (for good reason), but there were hardly any examples or guidance on how the products we use every day leverage this concept.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Will I ever need this?”&lt;/em&gt;&lt;br&gt;
You’ve asked this a lot, haven’t you? 👀&lt;/p&gt;

&lt;p&gt;Here are a few data structures that you can leverage in your React app today! 👇&lt;/p&gt;
&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Arrays: Your Go-to in State Management&lt;/li&gt;
&lt;li&gt;Objects and Hash Maps: Normalized Data Store for Efficiency&lt;/li&gt;
&lt;li&gt;Doubly Linked Lists: Navigation with Context&lt;/li&gt;
&lt;li&gt;Stacks: Undo/Redo Functionality with Immutable Behavior&lt;/li&gt;
&lt;li&gt;Queues: Managing Sequential API Calls&lt;/li&gt;
&lt;li&gt;Trees: Rendering Recursive Components&lt;/li&gt;
&lt;li&gt;Graphs: Building Complex Data Relationships and Navigation&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Related reading:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#promotion&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  1. Arrays 🧩: Your Go-to in State Management
&lt;/h3&gt;

&lt;p&gt;Arrays are everywhere in React. If you need help understanding how &lt;code&gt;.map()&lt;/code&gt; or &lt;code&gt;.filter()&lt;/code&gt; work, you’re probably seeing this post a little too soon! But don’t worry—once you get comfortable with these array methods, you’ll see how essential they are for rendering lists, managing component states, and transforming data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Objects and Hash Maps 🗺️: Normalized Data Store for Efficiency
&lt;/h3&gt;

&lt;p&gt;In a React app, when you deal with a large collection of entities like users or posts, normalizing your data into objects (hash maps) can make reading and updating much more efficient. Instead of working with a deeply nested structure, you map entities by their IDs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;strong&gt;Reading from a normalized store with IDs&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postsById&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;First Post&lt;/span&gt;&lt;span class="dl"&gt;'&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content of first post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Second Post&lt;/span&gt;&lt;span class="dl"&gt;'&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content of second post&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postIds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PostList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &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;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;postIds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;Post&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;postsById&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &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;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;This pattern allows for efficient data access, especially with large datasets where updates or reads need to happen quickly without re-rendering the entire collection.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Doubly Linked Lists 🔗: Navigation with Context
&lt;/h3&gt;

&lt;p&gt;Doubly linked lists are useful when you need &lt;strong&gt;context&lt;/strong&gt; from both the previous and next elements—think of navigating a &lt;strong&gt;photo gallery&lt;/strong&gt; where each image displays its neighboring images for reference. Instead of using an index, we'll store the current node directly in the component state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;strong&gt;Doubly linked list for navigation between elements with context&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DoublyLinkedList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&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;newNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newNode&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imageList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DoublyLinkedList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;imageList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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;image1.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;First Image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;imageList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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;image2.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Second Image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;imageList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&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;image3.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Third Image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Gallery&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCurrentNode&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &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;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prev-image&lt;/span&gt;&lt;span class="dl"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main-image&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-image&lt;/span&gt;&lt;span class="dl"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCurrentNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prev&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;Previous&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;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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCurrentNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;currentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&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;Next&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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;In this React component:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;current node&lt;/strong&gt; is stored in the state, and the UI updates based on whether there’s a previous or next node.&lt;/li&gt;
&lt;li&gt;The buttons enable users to navigate the list both forwards and backwards, and disable if there’s no more nodes to move to.&lt;/li&gt;
&lt;li&gt;This structure simulates &lt;strong&gt;real-time navigation&lt;/strong&gt; with context from the surrounding elements, commonly used in UI components like carousels, media galleries, or playlists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Stacks 🚀: Undo/Redo Functionality with Immutable Behavior
&lt;/h3&gt;

&lt;p&gt;Stacks allow you to manage &lt;strong&gt;undo/redo&lt;/strong&gt; operations efficiently using &lt;strong&gt;Last In, First Out&lt;/strong&gt; (LIFO) logic. By using immutable operations (&lt;code&gt;concat&lt;/code&gt;, &lt;code&gt;slice&lt;/code&gt;), we can ensure state remains unmutated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;strong&gt;Undo/Redo with immutable &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pop&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;undoStack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUndoStack&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;redoStack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setRedoStack&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFormState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&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;updateForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newState&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;setUndoStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// Immutable push&lt;/span&gt;
  &lt;span class="nf"&gt;setRedoStack&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;  &lt;span class="c1"&gt;// Clear redo stack&lt;/span&gt;
  &lt;span class="nf"&gt;setFormState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newState&lt;/span&gt;&lt;span class="p"&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;undo&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;undoStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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;lastState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;undoStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setUndoStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// Immutable pop&lt;/span&gt;
    &lt;span class="nf"&gt;setRedoStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// Move current state to redo&lt;/span&gt;
    &lt;span class="nf"&gt;setFormState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastState&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redo&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;redoStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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;lastRedo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;redoStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setRedoStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// Immutable pop&lt;/span&gt;
    &lt;span class="nf"&gt;setUndoStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// Push current state to undo&lt;/span&gt;
    &lt;span class="nf"&gt;setFormState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastRedo&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;h3&gt;
  
  
  5. Queues 📬: Managing Sequential API Calls
&lt;/h3&gt;

&lt;p&gt;Queues operate in a &lt;strong&gt;First In, First Out&lt;/strong&gt; (FIFO) manner and are great for ensuring that tasks like API calls or notifications are processed in the correct order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;strong&gt;Queueing API calls&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;apiQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setApiQueue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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;enqueueApiCall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiCall&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;setApiQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevQueue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prevQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;apiCall&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// Immutable push&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;processQueue&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nextCall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;restQueue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apiQueue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;nextCall&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setApiQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;restQueue&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// Immutable pop&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;h3&gt;
  
  
  6. Trees 🌳: Rendering Recursive Components
&lt;/h3&gt;

&lt;p&gt;Trees are commonly used in React when dealing with nested components like &lt;strong&gt;comment threads&lt;/strong&gt;, &lt;strong&gt;folder structures&lt;/strong&gt;, or &lt;strong&gt;menus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;strong&gt;Rendering a comment tree recursively&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;commentTree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;First comment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;children&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Reply to first comment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;children&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;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Another reply&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nested reply&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;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;comment&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &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;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;paddingLeft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Comment&lt;/span&gt; &lt;span class="nx"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Another popular post that might be relevant to you:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F1231577%2F5d98fa80-dea8-473d-8d9b-bc4980494bbe.jpeg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/write-less-fix-never-the-art-of-highly-reliable-code-5a0i" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Write Less, Fix Never: The Art of Highly Reliable Code&lt;/h2&gt;
      &lt;h3&gt;Dhruv Agarwal for Middleware ・ Jun 17&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#developer&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Graphs 🎯: Building Complex Data Relationships and Navigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt;: &lt;strong&gt;Routing between multiple views&lt;/strong&gt;&lt;br&gt;
You can represent routes between pages as a graph, ensuring flexible navigation paths in an SPA.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routesGraph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;home&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="s1"&gt;about&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="s1"&gt;contact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;about&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="s1"&gt;home&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="s1"&gt;team&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;contact&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="s1"&gt;home&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentRoute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetRoute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;routesGraph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentRoute&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetRoute&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Navigating from &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currentRoute&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;targetRoute&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Invalid route from &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currentRoute&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;targetRoute&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;&lt;strong&gt;Example 2&lt;/strong&gt;: &lt;strong&gt;User relationship modeling&lt;/strong&gt;&lt;br&gt;
Graphs are perfect for modeling &lt;strong&gt;social connections&lt;/strong&gt; or any kind of relationship where multiple entities are interconnected.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersGraph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;user1&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="s1"&gt;user2&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="s1"&gt;user3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;user2&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="s1"&gt;user1&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="s1"&gt;user4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;user3&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="s1"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;user4&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="s1"&gt;user2&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;findConnections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;usersGraph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;findConnections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// Outputs: ['user2', 'user3']&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Note: We use graphs to show &lt;a href="https://demo.middlewarehq.com/collaborate/team" rel="noopener noreferrer"&gt;reviewer dependencies in Middleware&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR — Those School Lessons Pay Off
&lt;/h3&gt;

&lt;p&gt;Those DSA classes might have felt abstract back in the day, but data structures are powering the world around you in React.&lt;/p&gt;

&lt;p&gt;Objects, stacks, queues, linked lists, trees, and graphs are more than just theory — they’re the backbone of the clean, efficient, and scalable apps you build every day.&lt;/p&gt;

&lt;p&gt;So the next time you manage state in a queue or handle complex UI logic, remember: you’ve been training for this since school. 💪&lt;/p&gt;

&lt;p&gt;Let me know which data structures you’ve been using the most!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>react</category>
    </item>
    <item>
      <title>Is CSP Actually Helping with Your Security? 🤔</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Thu, 29 Aug 2024 17:45:44 +0000</pubDate>
      <link>https://forem.com/middleware/is-csp-actually-helping-with-your-security-4gbm</link>
      <guid>https://forem.com/middleware/is-csp-actually-helping-with-your-security-4gbm</guid>
      <description>&lt;p&gt;Content Security Policy (CSP) – sounds fancy, right? Like the shiny new toy in the web security playground. It’s supposed to protect your web app from all sorts of bad stuff, but is it really the superhero you think it is? Or is it more like that overhyped gadget that promises a lot but delivers… well, let’s just say it could use some work. Let’s dive in and see what’s what!&lt;/p&gt;




&lt;h3&gt;
  
  
  What is CSP Anyway?
&lt;/h3&gt;

&lt;p&gt;For those of you who haven’t dived into CSP land yet, here’s a quick rundown: CSP is a security feature that helps prevent a range of attacks, such as Cross-Site Scripting (XSS) and data injection. It does this by telling the browser what content it’s allowed to load and from where. Think of it like a bouncer at the club of your web app – only the cool, verified sources get in.&lt;/p&gt;

&lt;p&gt;Sounds great, right? But like most things in tech, the devil is in the details.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Reality Check 🔍
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSP Is Only as Good as Its Configuration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Let’s be honest: a poorly configured CSP is like a half-baked pizza – not satisfying and probably going to give you trouble later. If you’re just slapping &lt;code&gt;'unsafe-inline'&lt;/code&gt; or a broad &lt;code&gt;'self'&lt;/code&gt; directive in there, you’re not really getting the full benefit. It’s like putting a Band-Aid on a bullet wound – not gonna cut it. The key is to be precise and intentional with your policy. If you’re just guessing, you might as well not bother.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq63oea163n8l5gekret1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq63oea163n8l5gekret1.gif" alt="Image description" width="380" height="280"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It’s Not a Silver Bullet&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Here’s a reality check: CSP isn’t going to save your bacon if you’re ignoring other security practices. It’s just one piece of the puzzle. You still need to do the basics: input validation, proper session management, regular security audits, etc. Relying on CSP alone is like using a bicycle lock to protect your car – it’s just not enough. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv0yn6xzk0x54d33equy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv0yn6xzk0x54d33equy.gif" alt="Image description" width="498" height="256"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-World Impact and Limitations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Here’s the kicker: not all browsers fully support CSP, and even when they do, there’s a lot of variation in how they handle it. If your users are on older browsers (why though?), CSP isn’t going to do much for them. Plus, CSP can break legitimate functionality if you’re not careful. Ever set up a CSP and then spent hours debugging why your slick new feature isn’t working? Yeah, it can be a bit of a headache.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Dev Workload&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Setting up CSP correctly isn’t a one-time thing; it’s an ongoing process. You have to keep an eye on what scripts are being loaded from where and ensure they’re not doing anything sketchy. It’s like having a part-time job as a security guard for your own app. If you’re a small team or flying solo, it might be more hassle than it’s worth – unless you enjoy living on the edge.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  So, Should You Bother with CSP?
&lt;/h3&gt;

&lt;p&gt;In short, &lt;strong&gt;yes&lt;/strong&gt; – but don’t expect it to solve all your problems. CSP can be a great tool to have in your security arsenal, especially for reducing the risk of XSS attacks on modern browsers. However, it should be just one part of a comprehensive security strategy. Think of it like a sidekick in your crime-fighting squad – helpful, but not the main hero.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fre8711te7xim8rvwwgak.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fre8711te7xim8rvwwgak.gif" alt="Image description" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s my 2 cents: use CSP, but don’t rely on it exclusively. Make sure it’s properly configured, keep it updated, and use it as part of a layered security approach. Security isn’t a one-and-done deal – it’s a continuous process. Just like keeping up with all the memes, you’ve got to stay on top of it. 😉&lt;/p&gt;

&lt;p&gt;Learn about what a CSP looks like, at the best source possible:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--UHjFdr30--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP" rel="noopener noreferrer" class="c-link"&gt;
          Content Security Policy (CSP) - HTTP | MDN
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks,
  including Cross-Site Scripting (XSS) and data injection attacks.
  These attacks are used for everything from data theft, to site defacement, to malware distribution.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_bI64N_S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer.mozilla.org/favicon-48x48.cbbd161b.png" width="48" height="48"&gt;
        developer.mozilla.org
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  Personal anecdotes with CSP
&lt;/h3&gt;

&lt;p&gt;I’m okay with saying that I didn’t always know everything. 😛&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Time CSP Broke My App (because I didn’t understand CSP)&lt;/strong&gt;&lt;br&gt;
I thought I had our app running smoothly, and then we decided to use the Clearbit API to load company logos. Right after deploying, the logos weren’t loading, and errors were popping up everywhere. I immediately blamed adblockers, assuming they were causing the issue.&lt;/p&gt;

&lt;p&gt;After some time tweaking things and going in circles, I realized the problem wasn’t adblockers at all. It was our existing CSP. We had a strict CSP that didn’t account for Clearbit, and I hadn’t updated it to allow requests to their domain.&lt;/p&gt;

&lt;p&gt;It was a classic mistake, thinking everything would just work without understanding how our CSP needed to be adjusted for new features. It taught me to always check security settings whenever making changes to avoid breaking functionality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayajbu6tqehuu8lbv5yq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayajbu6tqehuu8lbv5yq.gif" alt="Image description" width="480" height="329"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Me trying to build software (used to be) like 👆&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I thought React was magic&lt;/strong&gt;&lt;br&gt;
Earlier in my career, when I was still new to React, and React was still new to the world (JSX had literally just come out), I made a pretty careless mistake that left our app wide open to XSS attacks.&lt;/p&gt;

&lt;p&gt;I was rushing through a feature and didn’t bother sanitizing some user input. I mean, it was sanitized against DB attacks, but… I thought ‘It’s React; what’s the worst that could happen?’ Well, a lot, as it turns out. I was using dangerouslySetInnerHTML to render some rich-text user-generated content without realizing the potential risks. Our QA team managed to inject malicious scripts through a form input, and I learnt (kind of) the hard way how React wasn’t as magic as I thought.&lt;/p&gt;

&lt;p&gt;It was a tough lesson on why you should never cut corners with security and always respect those “dangerously” warnings, no matter how fancy the framework."&lt;/p&gt;



&lt;p&gt;What’s your take on CSP? Love it, hate it, or somewhere in between? Drop a comment below and let’s chat!&lt;/p&gt;

&lt;p&gt;If you liked this, check out this post I wrote a while ago.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware" width="256" height="256"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/6-ways-to-turn-your-browser-into-super-debug-hero-ft-nodejs-nextjs-36c3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;6 ways to turn your browser into super-debug-hero (ft. node.js + next.js!)&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jul 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;And maybe check out some other work I'm involved with?&lt;br&gt;
&lt;a href="https://github.com/middlewarehq/middleware" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Open Source Dora Metrics ⚡️&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>security</category>
      <category>browser</category>
    </item>
    <item>
      <title>Why You’re Getting Blamed for Delays (And How Open-Source Dora Metrics Can Help)</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Thu, 08 Aug 2024 15:30:36 +0000</pubDate>
      <link>https://forem.com/middleware/why-youre-getting-blamed-for-delays-and-how-open-source-dora-metrics-can-help-1mm3</link>
      <guid>https://forem.com/middleware/why-youre-getting-blamed-for-delays-and-how-open-source-dora-metrics-can-help-1mm3</guid>
      <description>&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%2F2goeo8v7ox4uw1puficf.gif" 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%2F2goeo8v7ox4uw1puficf.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello there! 👋&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📖 Story time! 📖&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s Friday.&lt;br&gt;
The feature was due yesterday.&lt;br&gt;
The code review took longer than expected.&lt;br&gt;
A couple of days ago, you submitted the PR for review.&lt;/p&gt;

&lt;p&gt;Some change was requested, you update it and submit for another review.&lt;br&gt;
Another small change was requested. You update and re-submit.&lt;br&gt;
Wait, another change request? Why aren’t they reviewing thoroughly in one go?&lt;br&gt;
Oh, they seem to be pretty darn busy too? I mean, what could you do eh?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wind whooshes around you…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And suddenly, a tap on your shoulder.&lt;br&gt;
You turn around, and it’s…&lt;br&gt;
&lt;strong&gt;YOUR MANAGER! 😱&lt;/strong&gt;&lt;br&gt;
And you’re asked the dreaded question…&lt;br&gt;
&lt;em&gt;“Where’s the feature? You said it’ll be ready to go yesterday, yet here I am. 🤷”&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Ever been in those shoes?&lt;br&gt;
You're not alone.&lt;/p&gt;

&lt;p&gt;Management often doesn’t want to hear about the blockers; they just want to know why the release didn’t go out as planned. You try to explain, but it feels like you’re just making excuses. It’s frustrating, especially when you know these delays aren’t your fault. Yet, you’re not sure what you can do to convince them otherwise.&lt;/p&gt;
&lt;h3&gt;
  
  
  You Can’t Fix What You Don’t Measure
&lt;/h3&gt;

&lt;p&gt;Here’s the thing: It’s impossible to fix problems if you don’t know what they are. And it’s even harder to explain those problems if you don’t have the data to back you up. When your team’s performance is being judged solely on outcomes without considering the roadblocks, you’re set up to fail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“You can’t fix what you don’t measure,”&lt;/em&gt; couldn’t be more relevant here. Without accurate metrics, you’re flying blind. But it’s not just about measuring; it’s about measuring the &lt;em&gt;right&lt;/em&gt; things.&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%2Fcyb0tenqg6o98uji2yah.gif" 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%2Fcyb0tenqg6o98uji2yah.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  “But how do I know what to measure?”
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Google Search: Did you mean, “What are Dora metrics?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where Dora metrics come into play. Dora metrics were developed by the team behind the Accelerate book (if you haven’t read it, it’s worth your time) to provide a data-driven approach to understanding and improving software delivery performance.&lt;/p&gt;

&lt;p&gt;(It used to be related to DevOps, but Google is changing that up now to be more generally applicable)&lt;/p&gt;

&lt;p&gt;Dora focuses on four key metrics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: How often you’re deploying code to production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes from code committed to code successfully running in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in a failure in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time to Restore Service&lt;/strong&gt;: How long it takes to recover from a failure in production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These metrics are powerful because they don’t just focus on speed—they balance it with quality and reliability. It’s not just about pushing code out quickly; it’s about pushing code that doesn’t break things and can be quickly fixed when it does.&lt;/p&gt;
&lt;h3&gt;
  
  
  Resilience Against Goodhart’s Law
&lt;/h3&gt;

&lt;p&gt;Goodhart’s Law says that when a measure becomes a target, it ceases to be a good measure. The beauty of Dora metrics is that they’re designed to avoid this trap. Because these metrics are interconnected, focusing on one to the detriment of others won’t help you game the system. For instance, increasing deployment frequency at the cost of a higher change failure rate isn’t going to make you look good. These metrics work together to give a comprehensive view of your team’s performance—balancing speed with stability.&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%2Fxsa7fbnyf8lhkzjzgbwh.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%2Fxsa7fbnyf8lhkzjzgbwh.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Credits: AWS&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How Open-Source Dora Metrics Can Help
&lt;/h3&gt;

&lt;p&gt;This is where &lt;strong&gt;&lt;a href="https://middlewarehq.com" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;&lt;/strong&gt; comes into play. Middleware is designed to give you the full picture, not just the highlights that management wants to see. By tracking Dora metrics, Middleware provides actionable insights into both your successes and the challenges that slow you down.&lt;/p&gt;

&lt;p&gt;But here’s what makes Middleware truly stand out: it’s fully open-source and self-hostable.&lt;br&gt;
You can run it locally using &lt;code&gt;docker&lt;/code&gt; right now, and have your insights live in 5 minutes!&lt;/p&gt;
&lt;h4&gt;
  
  
  The Benefits of Open Source
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transparency and Trust&lt;/strong&gt;: With open-source software, you can look under the hood. There’s no mystery about how your data is being handled because you can inspect the code yourself. No hidden telemetry, no data being siphoned off to some third-party service. What you see is what you get.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Total Ownership of Your Data&lt;/strong&gt;: Since Middleware is self-hostable, your data stays exactly where you want it—on your own infrastructure. This means zero external telemetry, so your team’s performance data isn’t being sent off to someone else’s servers. You’re in full control of your data, from start to finish.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility, and Community Support&lt;/strong&gt;: Being open-source means you can tailor Middleware to fit your exact needs. Whether it’s tweaking the dashboards, adding new integrations, or modifying how metrics are calculated, you’ve got the freedom to make it your own, and the community is there to help you out instead of waiting for an arbitrary roadmap.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" 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%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How Middleware Helps You Measure What Matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capturing Blockers&lt;/strong&gt;: Middleware doesn’t just track how fast you’re delivering; it captures the &lt;em&gt;why&lt;/em&gt; behind any delays. Whether it’s a review blockage, deployment issues, or a critical bug that held things up, Middleware makes sure those blockers are visible and accounted for.&lt;br&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%2Fvez4n5bz9a7zr83jt22h.gif" 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%2Fvez4n5bz9a7zr83jt22h.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoiding the Goodhart’s Law Trap&lt;/strong&gt;: By providing a balanced view of your performance, Middleware helps prevent management from zeroing in on a single metric. Instead, they see the full story, which leads to more informed decisions and fairer evaluations of your team’s work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turning Data into Action&lt;/strong&gt;: Once you have the right metrics, you can start fixing the real issues. Middleware’s insights help you identify bottlenecks and inefficiencies, so you can focus on improving the process, not just chasing numbers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fqsyrh20hiyvfa6noocc9.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%2Fqsyrh20hiyvfa6noocc9.png" alt="Image description"&gt;&lt;/a&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%2Fqugxe8j9q0nwssq7jzxz.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%2Fqugxe8j9q0nwssq7jzxz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;&lt;em&gt;Middleware Open-Source&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Middleware: The Tool That Helps You Fix What You Measure
&lt;/h3&gt;

&lt;p&gt;At the end of the day, you’re doing everything you can to deliver great software. But when things go wrong, it’s essential to have the data to show why—and to make sure you’re measuring what truly matters, not just what looks good on a report.&lt;/p&gt;

&lt;p&gt;Middleware empowers you to do just that. By providing clear, actionable insights into your team’s performance and the challenges you face, Middleware helps you move from justifying delays to fixing the root causes. And because it’s open-source and self-hostable, you can do all of this with total control over your data. Your answers are literally a &lt;code&gt;docker pull&lt;/code&gt; away!&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%2Fy7iwks2aksz4bsmt7j2r.gif" 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%2Fy7iwks2aksz4bsmt7j2r.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware on Github&lt;/a&gt; today and start measuring what matters, while keeping your data exactly where it belongs—with you.&lt;/p&gt;

&lt;p&gt;We’re early in our journey right now, and we’ll love to have the support of devs like you to present insights in a way that DEVS would love. 🤝&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/middlewarehq/middleware" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Maybe, leave us a star? 🌟&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>softwaredevelopment</category>
      <category>career</category>
    </item>
    <item>
      <title>🙅 Why Hating TypeScript in 2024 Doesn't Make Sense</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Sun, 04 Aug 2024 17:32:32 +0000</pubDate>
      <link>https://forem.com/middleware/why-hating-typescript-in-2024-doesnt-make-sense-44e</link>
      <guid>https://forem.com/middleware/why-hating-typescript-in-2024-doesnt-make-sense-44e</guid>
      <description>&lt;p&gt;I've been seeing this trend lately: more and more developers bashing TypeScript. The gripes range from it being "too complex" to "slowing down development."&lt;/p&gt;

&lt;p&gt;While not all concerns are unfounded, &lt;strong&gt;hating on TypeScript in 2024 just doesn't add up&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break it down. 🔍&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;TypeScript Isn’t Your Enemy, It’s Your Safety Net&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I get it—JavaScript is flexible, dynamic, and lets you ship code fast. But that same flexibility is also what leads to bugs that are hard to catch until it’s too late. TypeScript's strictness isn’t there to slow you down; it’s there to save you from spending &lt;strong&gt;hours debugging issues&lt;/strong&gt; that could have been caught early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s an example:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;getUserByID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;In theory, &lt;code&gt;id&lt;/code&gt; can be a number, a UUID, a random string, or a structured string. But depending on what type it is, you might get an error if you try to increment it or pass it to an API that expects it to have a specific structure and type.&lt;/p&gt;

&lt;p&gt;And you can figure out what type it is by looking at how it’s used. But you know what makes this a &lt;strong&gt;non-issue&lt;/strong&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;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserByID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="c1"&gt;// and that's the most basic thing you could do&lt;/span&gt;
&lt;span class="nf"&gt;getUserByID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// boink, error!&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;When you add TypeScript to your project, you're adding a layer of security. It’s like putting on a seatbelt. Sure, you can drive without it, but why risk it when a simple precaution could save you from a crash? 🚗💥 In a time where software quality is more critical than ever, TypeScript’s type-checking is a safeguard that just makes sense.&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%2Fgemu1tom1l6apupxa5gg.gif" 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%2Fgemu1tom1l6apupxa5gg.gif" alt="Michael Scott Safety"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;It’s Not as Complicated as You Think&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Another complaint I hear often is that TypeScript is "too complicated." But let’s be real—JavaScript can be a mess. Function signatures that accept any input, objects that morph shape, and code that’s one typo away from breaking in production. TypeScript isn’t adding complexity; it’s formalizing or standardizing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think about it this way:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’re working on the frontend side of a feature, and someone else might have some work overlapping with you. There’s also going to be backend APIs you need to incorporate, but those aren’t ready yet. You’ve been asked to begin the UI work anyway.&lt;/p&gt;

&lt;p&gt;How do you ensure that the code you write right now is consistent with the data you’ll get from the APIs? And that if something does change on the APIs, there’s a source of truth that all parties need to adhere to?&lt;/p&gt;

&lt;p&gt;That’s right.&lt;br&gt;
&lt;strong&gt;By defining types.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With types defined before implementation begins, there should be no confusion about what data contracts are shared between the UI and APIs, and if something indeed is different, then all that needs to be done is to go and stick to the contracts defined earlier.&lt;/p&gt;

&lt;p&gt;If you can learn React, wrangle with Webpack, or deal with async/await, then you can learn TypeScript. And here’s the kicker—it’s a skill that &lt;strong&gt;pays dividends&lt;/strong&gt;. The learning curve is worth it because it forces you to think more critically about your code. Instead of hacking together a quick fix, you’re thinking about architecture, types, and long-term maintainability. 🛠️&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%2Fv51wf410pcd3zn0idr1d.gif" 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%2Fv51wf410pcd3zn0idr1d.gif" alt="Not hard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Faster Development, Not Slower&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There’s this myth that TypeScript slows down development. But in reality, the opposite is often true. By catching errors during compile time instead of at runtime, TypeScript helps you move faster in the long run. You’re not spending your days in the browser console, chasing down undefined variables or weird type coercions. 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript’s tooling is also top-notch.&lt;/strong&gt;&lt;br&gt;
Features like autocompletion, refactoring tools, and inline documentation make the development experience smoother. You’re not just writing code—you’re navigating a well-lit, well-marked road instead of stumbling around in the dark. 🌟&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%2F6qyp25qbaz8irc66dllm.gif" 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%2F6qyp25qbaz8irc66dllm.gif" alt="Jim Halpert typing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a &lt;strong&gt;personal anecdote&lt;/strong&gt;.&lt;br&gt;
Before I fully embraced TypeScript, I often found myself in the weeds of codebase archaeology. I’d encounter a function and have no idea what arguments it was supposed to take. Was it a string? An object? What params were needed in this object? Which ones were optional? Was something that was made to look optional actually required somewhere in the callstack?&lt;/p&gt;

&lt;p&gt;Because &lt;strong&gt;devs aren’t perfect&lt;/strong&gt;, poor variable names, inconsistent naming conventions, and coding preferences get in the way all the time…&lt;/p&gt;

&lt;p&gt;So, I’d do the dance: scrolling back to the function’s declaration, digging through implementations, trying to piece together what was supposed to go where. And if autocomplete was supposed to save me? Forget it. It was useless. The code editor was just as clueless as I was. 😅&lt;/p&gt;

&lt;p&gt;Sure, you could &lt;strong&gt;argue that JSDoc comments might help&lt;/strong&gt;. But if you’re going through all that effort to manually document types and function signatures, then why are you doing that to yourself? You’re basically doing TypeScript’s job, but without any of the actual benefits. TypeScript eliminates all that guesswork, letting you code with confidence and speed.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;TypeScript Is the Future (And the Present)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;TypeScript is on its 5th version. It’s basically at &lt;strong&gt;100k stars&lt;/strong&gt; on &lt;a href="https://github.com/microsoft/TypeScript" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. It has &lt;strong&gt;55 Million+ downloads&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/typescript" rel="noopener noreferrer"&gt;PER WEEK on NPM&lt;/a&gt;. More and more major &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;projects&lt;/a&gt; and &lt;a href="https://www.middlewarehq.com/" rel="noopener noreferrer"&gt;companies&lt;/a&gt; are adopting it. There’s a reason for that: TypeScript brings stability, scalability, and confidence to codebases. It’s not just about today’s project, but about building something that can grow and evolve without collapsing under its own weight. It’s about not having to write documentation and tests separately all the time (it doesn’t entirely replace them, of course).&lt;/p&gt;

&lt;p&gt;So, let’s cut through the noise. The hate TypeScript gets in 2024 is largely misplaced. Sure, it’s not perfect — no tool is. But the benefits far outweigh the drawbacks. It’s time to stop viewing TypeScript as an obstacle and start seeing it as the essential tool it is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embrace it, learn it, and you’ll find yourself writing better code, faster.&lt;/strong&gt; 💪&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%2Fq8o2fbpg0c9ebxg3wdt4.gif" 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%2Fq8o2fbpg0c9ebxg3wdt4.gif" alt="what to do"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;TypeScript Isn’t Perfect, but don’t let perfect be the enemy of good!&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Of course, TypeScript isn't without its flaws. One legitimate gripe is the overhead of setting it up in a project that wasn’t built with it in mind. Converting a legacy codebase to TypeScript can be a time-consuming process, and it’s not always feasible for teams that are under tight deadlines. ⏳&lt;/p&gt;

&lt;p&gt;Additionally, sometimes TypeScript’s strict type system can feel like it’s fighting you rather than helping you, especially when you're dealing with complex types or third-party libraries that haven’t been properly typed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript is only as good as the dev configuring it&lt;/strong&gt;.&lt;br&gt;
I’ve worked on multiple TS projects, some of which had relatively lax configurations that would allow people to use &lt;code&gt;any&lt;/code&gt; types or avoid strict or &lt;code&gt;null&lt;/code&gt; checks. You mix untyped or loosely typed code into a typed codebase, and the situation could end up being bad enough.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Where do we go from here?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;That said, these are short-term pains for long-term gains. Yes, it might slow you down initially, but the stability and maintainability you gain more than make up for it.&lt;/p&gt;

&lt;p&gt;And these issues used to be a lot more severe a few years ago, but it’s arguably a lot better now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In my opinion, put in the effort to learn TS.&lt;/strong&gt; TS enables you to partially introduce it to an existing codebase—try that. Or perhaps create smaller pet projects that leverage TypeScript.&lt;/p&gt;

&lt;p&gt;Plus, TS devs make a bit more money than JS devs based on the most recent &lt;a href="https://survey.stackoverflow.co/2024/work#salary-comp-total-years-code-pro-language" rel="noopener noreferrer"&gt;StackOverflow survey&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;And speaking of better code...&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're curious about how TypeScript can level up a real-world project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/middlewarehq/middleware" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⚡️ Check out the Middleware repo ⚡️&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;It's a great example of TypeScript in action, and who knows—you might just pick up a few ideas for your own projects! 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Even better, tell us how our code IS NOT the best!&lt;/strong&gt;&lt;br&gt;
If you have some solid suggestions, I'll amend the post to include them as examples!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Leaving Uber in 2022 was the best thing I did for myself 🚶💼</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Thu, 18 Jul 2024 07:01:52 +0000</pubDate>
      <link>https://forem.com/middleware/leaving-uber-in-2022-was-the-best-thing-i-did-for-myself-4kf9</link>
      <guid>https://forem.com/middleware/leaving-uber-in-2022-was-the-best-thing-i-did-for-myself-4kf9</guid>
      <description>&lt;h2&gt;
  
  
  tl;dr 📖
&lt;/h2&gt;

&lt;p&gt;I had a cushy job at Uber—decent work, great people. But the red tape was overwhelming. Too many approvals and permissions made it &lt;strong&gt;hard to get things done&lt;/strong&gt;. I wanted to build and deliver great stuff, not wait for basic approvals from a dozen people every time something needed to get done. And Uber’s dev productivity measures at the time didn't make sense either. &lt;/p&gt;

&lt;p&gt;When talking to managers didn't help and I couldn't make an impact soon enough, I decided to leave and &lt;strong&gt;tackle it from the outside&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;“Free of the shackles!” They say…&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%2Fkiodsr2rqf8bkatlcfb2.gif" 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%2Fkiodsr2rqf8bkatlcfb2.gif" alt="free at last"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, the longer version…&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comfort of Uber 🛌
&lt;/h2&gt;

&lt;p&gt;Once upon a time… as a tech lead, I had everything: Good income, interesting work, and recognition. But something was missing. The work, while important, wasn't fulfilling enough. It often took too long to deliver most things. And the metrics used to measure developer productivity felt gameable and inadequate, and didn't always reflect true impact.&lt;/p&gt;

&lt;p&gt;Leaving that cushy, high-paying job at Uber was one of the toughest decisions I've ever made (I took months to decide).&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;strong&gt;Uber&lt;/strong&gt; Office S01E01 🏢
&lt;/h3&gt;

&lt;p&gt;My first project at Uber was kickass, and all my managers at Uber were great. In fact, in my personal experience I &lt;strong&gt;loved all the people that I got to work with&lt;/strong&gt;. Friendly. Skilled. Considerate.&lt;/p&gt;

&lt;p&gt;And the project was something that I had to build with my small team almost from scratch. It had a great focus on accessibility, a lot of design effort behind it, just the kind of project I &lt;strong&gt;would love to be a part of&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And because it was something being built from scratch, there wasn’t a lot of past baggage to carry along. Not many “approvals” were needed from outside the core team. The planning, design, execution was contained within the “inner circle”. That meant collaboration was super fast, and so was the execution.&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%2Fk3wvexokcois1a3x92dr.gif" 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%2Fk3wvexokcois1a3x92dr.gif" alt="parkour"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But it wasn’t meant to last.&lt;/p&gt;

&lt;h3&gt;
  
  
  And then the honeymoon period ended…
&lt;/h3&gt;

&lt;p&gt;Not everyone’s experience was similar, and my subsequent projects were not that interesting either. For most people it was minor features or maintenance work. Even if they were mid-sized features, I was one among thousands of other devs and the initial awe wore off pretty quickly. It felt like if I was missing for a couple of says, or on leave for a week nothing would really be affected significantly. &lt;strong&gt;I didn’t like that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not like I was underperforming either. I must be performing great because it reflected uniformly in my feedback cycles, appraisals, and the fact that I was given an “impact award”.&lt;br&gt;
It just felt like despite all that, I wasn’t doing the kind of thing I wanted to do.&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%2Feoanrri1fqmdp3sa9cqa.gif" 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%2Feoanrri1fqmdp3sa9cqa.gif" alt="jim dead"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Red Tape 🔴
&lt;/h3&gt;

&lt;p&gt;A large company is like a large heavy ship. It’ll go where it needs to but it’ll take time, and it’ll definitely change course super slowly.&lt;/p&gt;

&lt;p&gt;At Uber, they had THOUSANDS of codebases. Over time the internal “reviewer” configuration would be updated to add new reviewers to the list, often without removing the older ones or those that aren’t relevant or involved in that codebase anymore only being handled on a case-by-case basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uber also has the amazing concept of ERDs&lt;/strong&gt; (not unique to them of course). Which are basically PRDs but very engineering and implementation specific. But this idea too was slowed down by the bureaucratic processes and the number of people that needed to be involved eventually.&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%2Ffdihcjnezctjjnkef2c9.gif" 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%2Ffdihcjnezctjjnkef2c9.gif" alt="late"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things would spend WEEKS in this phase!&lt;/strong&gt; Sure, this allowed for some very solid and thought through implementations, and a company like Uber could suffer the delay for a more robust implementation. Except…&lt;/p&gt;

&lt;p&gt;There was no one to verify if the implementation actually matched the documentation.&lt;br&gt;
Good intention, but not well adhered to.&lt;/p&gt;

&lt;p&gt;“One day, I want to be the kind of dev who goes through 5 steps of red-tape before delivering code!” — Said no one ever.&lt;/p&gt;
&lt;h3&gt;
  
  
  Everything changed when the Metrics Nation attacked 🔥
&lt;/h3&gt;

&lt;p&gt;In the first half of my time there, annual reviews took a while to happen. Managers and other team leads would form a panel and manually try to gather data to evaluate devs by the numbers.&lt;br&gt;
I did not know at this point what the metrics were, or how much they were weighted. What I know is that there wasn’t much in the way of automations involved, it was a fairly manual process (this changed later).&lt;/p&gt;

&lt;p&gt;Interpersonal feedback and direct evaluation by the manager held a significant weight, and the whole process in general felt fairly transparent. I was okay with that. But then, efforts were made to automate this process…&lt;/p&gt;

&lt;p&gt;Dashboards were created to track the stats of individuals across various teams.&lt;/p&gt;

&lt;p&gt;And… One of the things being measured was &lt;strong&gt;line count and number of PRs per month&lt;/strong&gt;. 😱&lt;br&gt;
Yeah… it’ll take you 0.01234 microseconds to realize how this is a bad idea. Within days devs were artificially inflating PR count, splitting PRs when they didn’t need to be to inflate this count.&lt;/p&gt;

&lt;p&gt;I don’t blame them. 🤷&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%2Fejwgnm7oay1mdswu0jr8.gif" 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%2Fejwgnm7oay1mdswu0jr8.gif" alt="dead inside"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  So, I tried to sort it out 💪
&lt;/h2&gt;

&lt;p&gt;I’ve always liked solving problems. I do puzzles in my free time, often play strategy games on my PC (when I’m not shooting Nazis in Wolfenstein, or save my cabbage patch in Stardew Valley).&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%2Fxs2j2ro17jphg0q7clic.gif" 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%2Fxs2j2ro17jphg0q7clic.gif" alt="cod"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I often solved problems that affected me or my team in terms or developer experience, productivity, documentation, etc. usually by going out of my way. I found it fun. 🤷&lt;/p&gt;

&lt;p&gt;And I’ve always been a pretty passionate dev. I care about what I build, and I care about my fellow devs. Naturally that extended into caring about the evaluation process.&lt;/p&gt;

&lt;p&gt;When automated dashboards came into play for evaluating us devs, naturally we started talking about it, increasingly frequently over time because the metrics used for that matter felt so flawed. And talking to leadership about it changed nothing in the time I remained at Uber.&lt;/p&gt;
&lt;h3&gt;
  
  
  Gameable Metrics
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🗓️ At this point, we’re in the 2nd half of 2021 🗓️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The metrics used to measure developer productivity often felt more like a game than a true reflection of work quality. Promotions were sometimes based on these flawed indicators, leading to frustration. I felt super tempted to make smaller related changes in separate PRs when normally I may have not. &lt;strong&gt;It felt fake.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some specific things measured were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Number of PRs per month

&lt;ul&gt;
&lt;li&gt;Devs started making smaller than needed or more frivolous PRs&lt;/li&gt;
&lt;li&gt;Devs started making PRs for older low priority things if their PR count was running low&lt;/li&gt;
&lt;li&gt;Some PRs started to be approved by friendly devs in the same team to inflate PR count&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Line count per PR

&lt;ul&gt;
&lt;li&gt;Devs started writing more verbose code&lt;/li&gt;
&lt;li&gt;Extra newlines&lt;/li&gt;
&lt;li&gt;Unnecessary refactors&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Ffe9ocm0m5tg9jdso75ve.gif" 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%2Ffe9ocm0m5tg9jdso75ve.gif" alt="saw that coming"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, not all devs were okay with doing this. But some were, especially those that had low numbers on these stats. Often the numbers might be low because they are working on something that involves more planning, design, or documentation involvement. But that wasn’t captured on these dashboards.&lt;/p&gt;

&lt;p&gt;We talked to leadership about it, specifically about how this is possibly more harmful and the previous way of doing things seemed better and while it seemed like they agreed, nothing really changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And this was a time when I was already increasingly dissatisfied with my time at Uber…&lt;/strong&gt;&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%2Fi7fs7647okbw0b9r9bwp.gif" 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%2Fi7fs7647okbw0b9r9bwp.gif" alt="no future"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  That brings us to 2022 🗓️
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The Idea of &lt;a href="https://mhq.link/oss" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Around this time, Dhruv pitched me the idea for &lt;a href="https://mhq.link/oss" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;. The concept was intriguing: a platform designed to &lt;strong&gt;enable developers to ACTUALLY do their work&lt;/strong&gt;, highlight what prevents them from doing what they love, bottlenecks, process blockers, etc.&lt;/p&gt;

&lt;p&gt;The first thing that jumped to my mind was…&lt;br&gt;
“If I had something like this to show insights to my manager, it would be so much more helpful than whatever they are doing right now.”&lt;/p&gt;

&lt;p&gt;After several months of discussions and consideration, in &lt;strong&gt;August 2022&lt;/strong&gt; I finally decided decided to take the leap and join the man on this journey. The decision wasn't easy, but it felt right. 🚀&lt;br&gt;
This was just 2 days after my birthday too! 🎂&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%2Fuyzr7uy8hxo5ik59rdze.gif" 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%2Fuyzr7uy8hxo5ik59rdze.gif" alt="The Office Meme: Jim Halpert looking at the camera with a knowing smile"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Startup Hustle
&lt;/h3&gt;

&lt;p&gt;Building a product from scratch is tough. We had to sift through tons of data and present it clearly. We understood that not every metric matters; only show what's useful and actionable. &lt;/p&gt;

&lt;p&gt;Our goal was straight-forward?&lt;br&gt;
&lt;strong&gt;Build something our past engineer-selves would find sensible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building the right team was crucial, and a continuous effort. Big lessons in leadership, team dynamics, and company culture were learnt. Turns out, NERF was the answer to almost everything. 😂 jk, jk.&lt;br&gt;
Growing a company meant dealing with finances, marketing, compliances, and of course customers. It was a huge learning curve beyond my Uber days.&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%2Fihpndqm36x7j4v8le95z.gif" 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%2Fihpndqm36x7j4v8le95z.gif" alt="The Office Meme: Pam Beesly saying 'Not a bad day'"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reflecting on this journey, I can confidently say it was tough but gratifying. Building something meaningful outweighs the comfort I left at Uber, yet it would have been a LOT MORE DIFFICULT without the support from my wife, Mehak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And yes, I'd do it &lt;a href="https://mhq.link/oss" rel="noopener noreferrer"&gt;again&lt;/a&gt; in a heartbeat. 💗&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Psst.&lt;br&gt;
If you want to check out what we've been building, here you go. It'll mean a LOT to me if you could leave a star on the repo. 😄&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>productivity</category>
      <category>learning</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>6 ways to turn your browser into super-debug-hero (ft. node.js + next.js!)</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Wed, 03 Jul 2024 16:10:36 +0000</pubDate>
      <link>https://forem.com/middleware/6-ways-to-turn-your-browser-into-super-debug-hero-ft-nodejs-nextjs-36c3</link>
      <guid>https://forem.com/middleware/6-ways-to-turn-your-browser-into-super-debug-hero-ft-nodejs-nextjs-36c3</guid>
      <description>&lt;p&gt;Unlike some of my &lt;a href="https://dev.to/jayantbh"&gt;other posts&lt;/a&gt;, this one is going to be straight-forward.&lt;/p&gt;

&lt;p&gt;I'll cover some of the less-frequently-used browser devtools features that I've used over my career.&lt;/p&gt;

&lt;p&gt;Some basic things are excluded, so as to not completely waste your time.&lt;br&gt;
Things such as using “console.log”, editing CSS in the styles panel, editing HTML in the Elements tab, $0 element reference, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of contents:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Breakpoints&lt;/li&gt;
&lt;li&gt;Performance Profiling&lt;/li&gt;
&lt;li&gt;Responsive Mode&lt;/li&gt;
&lt;li&gt;Lighthouse&lt;/li&gt;
&lt;li&gt;Layers&lt;/li&gt;
&lt;li&gt;Console.notJustLog&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bonuses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Node.js debugging + typescript&lt;/li&gt;
&lt;li&gt;Next.js server side debugging&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Let’s go!&lt;/strong&gt; 🚀🚀🚀&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%2Fdo673mnuj7ytf3pne5ak.gif" 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%2Fdo673mnuj7ytf3pne5ak.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Breakpoints! [🔝]
&lt;/h2&gt;

&lt;p&gt;My goodness this was the first debugging thing that blew my mind about why debuggers are actually useful.&lt;/p&gt;

&lt;p&gt;The idea is simple. Code, is written line-by-line.&lt;br&gt;
When you’re trying to spot bugs, you’re following the flow of execution line by line.&lt;br&gt;
Variables are assigned values, functions are called, loops run, etc. which all reads or writes data from places.&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%2Fqirogg5ft3yo25c9bch7.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%2Fqirogg5ft3yo25c9bch7.png" alt="img1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You’ll find this thing in the &lt;strong&gt;SOURCES&lt;/strong&gt; tab in DevTools.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And by placing breakpoints you can see the state of your code, and the &lt;strong&gt;data contained within&lt;/strong&gt; to understand how your code is actually running.&lt;br&gt;
Makes it a lot easier to find bugs! It’s a &lt;strong&gt;LOT faster than placing a million &lt;code&gt;console.log&lt;/code&gt;s&lt;/strong&gt; everywhere. You can even modify the values in memory at your breakpoint!&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%2Fgaye3v1nt54siq0mbev7.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%2Fgaye3v1nt54siq0mbev7.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
It’s literally as simple as double-clicking a value to change it! (in most cases)&lt;/p&gt;

&lt;p&gt;For further reading: &lt;a href="https://developer.chrome.com/docs/devtools/javascript/breakpoints" rel="noopener noreferrer"&gt;Pause your code with breakpoints  |  Chrome DevTools  |  Chrome for Developers&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Performance Profiling [🔝]
&lt;/h2&gt;

&lt;p&gt;“Why does this action take longer than it should? It’s not like I’m making any API calls here.”&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%2Fn6p5a8kauivfj22dqehz.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%2Fn6p5a8kauivfj22dqehz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code (sometimes) works in mysterious ways.&lt;br&gt;
Obviously it shouldn’t, but often you’ll find yourself in legacy codebases, or just repos that became a bit of a mess over time. Features or actions that should seem super straight-forward in how they work, somehow end up causing a lag on the UI, trigger re-renders, multiple API calls, or what not.&lt;/p&gt;

&lt;p&gt;When you run into situations where &lt;strong&gt;user interactions (not async stuff) aren’t happening “near-instantly” on the UI&lt;/strong&gt;, you’re probably putting the CPU under too much load.&lt;/p&gt;

&lt;p&gt;Examples when this could happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modifying a large list of items&lt;/li&gt;
&lt;li&gt;Calculating some stats from a dataset, on the browser&lt;/li&gt;
&lt;li&gt;Complex map/filter/reduce usages&lt;/li&gt;
&lt;li&gt;Browser-side search over a dataset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One option is to understand where that “blocked time” is being spent.&lt;br&gt;
Presenting, the “Performance Profiler”! Present in the “Performance” tab in your devtools! (who could have guessed?)&lt;/p&gt;

&lt;p&gt;You’ve already seen the screenshot above, but did you know you could also set up limits on how fast your CPU should be, and how many cores can it used at the same time?&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%2Fj8r99rc4hwsj4sk0brw4.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%2Fj8r99rc4hwsj4sk0brw4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also &lt;strong&gt;open the "Sources" panel&lt;/strong&gt; to literally look at the source files to understand exactly which lines all this time is being spent.&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%2Fb7prg3sc9plczynqegm1.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%2Fb7prg3sc9plczynqegm1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, if you have an intermediate build step, like &lt;strong&gt;webpack, rollup&lt;/strong&gt;, etc. this feature might not be that directly useful, since your JS code would be “compiled” (or “transpiled” if you prefer calling it that) into something that looks pretty different.&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%2F3dkqsgebm3ibpzt6k57v.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%2F3dkqsgebm3ibpzt6k57v.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Look at it! I clearly have some recursive call issues combined with some CPU heavy logic going on. And because of the “Sources” panel above, I can see it’s happening because I created a pretty large for loop just for the sake of this example. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Responsive Mode (aka. Device Mode) [🔝]
&lt;/h2&gt;

&lt;p&gt;There’s a 99.8765% chance you know what this is.&lt;br&gt;
Most of the internet traffic comes from Mobile devices now. There’s no way you haven’t resized your browser window a million times to see how it looks on different devices.&lt;/p&gt;

&lt;p&gt;But responsive mode is a lot more configurable than most people are aware of.&lt;br&gt;
&lt;strong&gt;Generally people stick to the device presets.&lt;/strong&gt; It’s a dropdown that looks kinda like this:&lt;br&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%2Fnxhga063khojolfksums.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%2Fnxhga063khojolfksums.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, it often feels insufficient to tell you how to actually see how comprehensive your media-query handling is, what breakpoints your web-app uses, and just leaves it kinda complicated to understand how your app will work on all kinds of devices…&lt;br&gt;
Again, I’m talking about what happens &lt;strong&gt;if you stick to only the presets&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unlocking the full potential of “Responsive Mode”
&lt;/h3&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%2Fx1vcllcdjhdq5egq8mze.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%2Fx1vcllcdjhdq5egq8mze.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the small 3-dot menu at the top when you enable “Responsive Mode”?&lt;br&gt;
Once you open that menu, just “show” all kinds of things that it lets you enable.&lt;br&gt;
And finally, set the &lt;strong&gt;Dimensions&lt;/strong&gt; dropdown value to &lt;strong&gt;Responsive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is what you can do now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Media Queries&lt;/strong&gt;&lt;br&gt;
It’ll show you what media queries are used in your web-app. Clicking on them will resize the viewport to the selected width. I’m unsure if there’s a way to do this with height as well, but if you know, please leave a comment. 😃&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rulers&lt;/strong&gt;&lt;br&gt;
No guessing what your current viewport width is. A nice ruler along both axes tells you… well… exactly what you expect it to tell you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device Pixel Ratio&lt;/strong&gt;&lt;br&gt;
This is something that wouldn’t really bother you in your day-to-day, because the browser kinda automatically handles it.&lt;br&gt;
But what this option is, is how many hardware pixels are needed to render a single software pixel.&lt;br&gt;
Sorry, I won’t go too deep into that topic in this post, but MDN has you covered:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio" rel="noopener noreferrer"&gt;Window: devicePixelRatio property - Web APIs | MDN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This property particularly becomes relevant when you’re using the HTML Canvas for something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device Type&lt;/strong&gt;&lt;br&gt;
This is more of a useragent type thing. Changing this value tells the target server/website what kind of a device is the page being accessed from, and whether that device &lt;strong&gt;supports touch&lt;/strong&gt; or not.&lt;br&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%2Fbc4y8isgga8fdaiamyse.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%2Fbc4y8isgga8fdaiamyse.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Various sites handle UIs for web and mobile very differently.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can even &lt;strong&gt;resize it very conveniently&lt;/strong&gt; without having to resize the whole window, by dragging the corner at the bottom-right.&lt;br&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%2Fz5l4z9fv6mq1w9ifgu3u.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%2Fz5l4z9fv6mq1w9ifgu3u.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Lighthouse (and Core Web Vitals) [🔝]
&lt;/h2&gt;

&lt;p&gt;In case you missed it, &lt;a href="https://developer.chrome.com/docs/lighthouse/overview" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; is a tool to inform you about the overall “quality” of your webpage. You could NEVER guess what tab you’ll find this under. (Hint: It rhymes with Bright-house)&lt;/p&gt;

&lt;p&gt;What’s covered under quality?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page loading performance and experience&lt;/li&gt;
&lt;li&gt;Accessibility of the page for people with certain restrictions&lt;/li&gt;
&lt;li&gt;SEO (aka. how well it might show up in search results)&lt;/li&gt;
&lt;li&gt;And other “best practices” stuff&lt;/li&gt;
&lt;/ul&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%2Fv2i39g9xgd9f02nlf8jw.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%2Fv2i39g9xgd9f02nlf8jw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The general idea is, the higher your lighthouse score is, the better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The experience of your users will be&lt;/li&gt;
&lt;li&gt;The visibility on search results will be&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better visibility + More users == Money (usually)&lt;br&gt;
So, it might be important to you.&lt;/p&gt;

&lt;p&gt;Lighthouse an give you pretty comprehensive data on how you can improve your page even further!&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%2F2kq5xsaccxot5pqumu2o.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%2F2kq5xsaccxot5pqumu2o.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&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%2Fq2s7x5nmkv89s9dbop4v.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%2Fq2s7x5nmkv89s9dbop4v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Layers Inspector [🔝]
&lt;/h2&gt;

&lt;p&gt;“Why does my modal show up on top of this tooltip?”&lt;br&gt;
“Why does this button show up on top of this overlay?”&lt;br&gt;
Layers Inspector is one of the coolest looking features in your browser, that allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the stacking context of your elements&lt;/li&gt;
&lt;li&gt;Understand if there are elements unintentionally rendered under or over other elements&lt;/li&gt;
&lt;li&gt;Identify performance issues in certain layers&lt;/li&gt;
&lt;li&gt;View elements that may be getting partly or wholly rendered off-screen&lt;/li&gt;
&lt;li&gt;And most importantly… &lt;em&gt;Feel super cool about your work&lt;/em&gt;. I mean… look at this thing!
&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%2Ftc2dzpe53zvy37x87xgl.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;P.S.: Edge calls it 3D View, but it’s a slightly differently functioning feature as well that still achieves many of the same things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Story-time:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most recently we realized that our &lt;a href="https://www.middlewarehq.com/" rel="noopener noreferrer"&gt;product landing page&lt;/a&gt; had a bug where each individual image and the menu item was rendered twice, exactly stacked on top of each other in a way that visually you couldn't tell anything was wrong.&lt;/p&gt;

&lt;p&gt;I was investigating something in the menu that looked off as a result because I was introducing some transparency styling which made the menu look weird.&lt;/p&gt;

&lt;p&gt;Decided to &lt;code&gt;Cmd+Shift+C&lt;/code&gt; and check the element styles. Nothing particularly off. But I noticed that there were two instances of that element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now I decided to check the Layers Inspector&lt;/strong&gt;, and wouldn't you look at that! Our static site builder caused there to be duplicate instances of a lot of other images too! Thanks layers!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. Console.notJustLog [🔝]
&lt;/h2&gt;

&lt;p&gt;Did you know…&lt;br&gt;
&lt;code&gt;console.log&lt;/code&gt; is such a 2015 way of debugging at this point?&lt;/p&gt;

&lt;p&gt;There are a LOT of things that the &lt;code&gt;console&lt;/code&gt; object allows you to do.&lt;br&gt;
Here’s a screenshot of all the things included within it!&lt;br&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%2Fch4pg7njxhq4a6k9e9ol.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%2Fch4pg7njxhq4a6k9e9ol.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tl;dr: Go read this: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/console" rel="noopener noreferrer"&gt;console - Web APIs | MDN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m going to cover my top 5 features under &lt;code&gt;console&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;console.table&lt;/code&gt; is nuts!&lt;/strong&gt;&lt;br&gt;
This is hands down one of the nicest ways to visualize most kinds of basic objects. It kinda doesn’t work too well when it comes to deeply nested objects, but, you know, for most objects it works fine enough!&lt;br&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%2Fxikpos47ikiodjim0o3j.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%2Fxikpos47ikiodjim0o3j.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;console.group&lt;/code&gt; helps with limiting logging overload for your eyes&lt;/strong&gt;&lt;br&gt;
Okay, no one is getting rid of &lt;code&gt;console.log&lt;/code&gt;. But there are times when you might need to log a few too many things, and then the actually useful information starts to get lost in a sea of other not-so-useful logs.&lt;br&gt;
&lt;code&gt;console.group&lt;/code&gt; allows you to nest your logs within groups that may be multiple levels deep!&lt;br&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%2Fl783xiw6mrrlhyp8qayp.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%2Fl783xiw6mrrlhyp8qayp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S.: There’s also &lt;code&gt;console.groupCollapsed&lt;/code&gt; if you don’t want your groups to be open by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;console.assert&lt;/code&gt; for conditional logging&lt;/strong&gt;&lt;br&gt;
If you’ve ever done something like:&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mycondition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Log stuff&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;p&gt;You could make use of &lt;code&gt;console.assert&lt;/code&gt; instead.&lt;br&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%2F2uf59qke2g7dg846la48.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%2F2uf59qke2g7dg846la48.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It only logs when the first argument is &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;code&gt;console.count&lt;/code&gt; for “incremental” logging&lt;/strong&gt;&lt;br&gt;
Ever felt the need to check how many times a certain function got invoked, or just some logic ran, maybe understand how often a certain &lt;code&gt;useEffect&lt;/code&gt; got triggered?&lt;br&gt;
Here you go.&lt;br&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%2Fnz0nu4oz2en87fl5ydec.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%2Fnz0nu4oz2en87fl5ydec.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don’t have to pass it a static string like &lt;code&gt;count label&lt;/code&gt; either.&lt;br&gt;
Pass it something like &lt;code&gt;user.id&lt;/code&gt; or whatever is stored in your objects or variables, and you’ll see how many times your logic runs with those specific values.&lt;/p&gt;

&lt;p&gt;For example, how many times did my &lt;code&gt;useEffect&lt;/code&gt; get triggered while the user ID was &lt;code&gt;1001-1234&lt;/code&gt;? That’s something you can answer with &lt;code&gt;console.count(user.id)&lt;/code&gt; instead!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. &lt;code&gt;console.trace&lt;/code&gt; to understand how your functions get called&lt;/strong&gt;&lt;br&gt;
Functions. They can get called anywhere, and everywhere.&lt;br&gt;
Sometimes it can be confusing to understand how a specific function actually gets called. Where it gets called from. This is going to be helpful for that.&lt;br&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%2Fr3tk7uc3zat9yl3m52gc.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%2Fr3tk7uc3zat9yl3m52gc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BONUS: &lt;code&gt;console.log&lt;/code&gt;. With *flair!&lt;/strong&gt;*&lt;br&gt;
Sometimes the plain-old plain-text just isn’t enough for your needs… for those times, you have this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%cRed Text&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="s1"&gt;color: red;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%cGreen Text&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="s1"&gt;color: green;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%cBlue Text with Larger Font&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="s1"&gt;color: blue; font-size: 18px;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%cStyled Text&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="s1"&gt;color: white; background-color: black; padding: 2px;&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;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%2Fch9wi9nmlcah1wolea7a.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%2Fch9wi9nmlcah1wolea7a.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  [BONUS] 7. Node.js Debugging, in Chrome?! [🔝]
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You can do it for both Javascript AND Typescript files!&lt;/strong&gt;&lt;br&gt;
“What? Really? I had no idea!! But how is that even possible?!?”&lt;br&gt;
Okay, too much, I know.&lt;br&gt;
If this is already familiar with you, I would love to hear how YOU use node.js debugging in your browser, and if there’s an awesome new idea that I didn’t know about, I’ll add it to the post! (attributed to you of-course)&lt;/p&gt;

&lt;p&gt;But for a lot of folks that don’t know that this is possible, here you go…&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start your node server using the &lt;code&gt;--inspect&lt;/code&gt; flag. &lt;code&gt;node --inspect index.js&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;If you’re using &lt;a href="//npmjs.com/package/tsx"&gt;&lt;strong&gt;&lt;code&gt;tsx&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; by any chance, it works in the same way. &lt;code&gt;tsx --inspect index.tsx&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Go to chrome://inspect/#devices. If you’re on a chromium based browser (edge, brave, arc), this URL should work.

&lt;ol&gt;
&lt;li&gt;You should see something like this.&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%2Fwqsflrdf7pbcepzeol99.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;inspect&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You should see a new window open that looks something like this: &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%2Fsqdvo7w00xr8h5h08rwm.png" alt="Image description"&gt;

&lt;ul&gt;
&lt;li&gt;You’ll notice that I was able to print the value of &lt;code&gt;process&lt;/code&gt; object.&lt;/li&gt;
&lt;li&gt;That’s because this instance of devtools is running in the context of node.js &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%2Fb2t8dgl8zbadayzn9b5j.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;That’s it!&lt;/strong&gt;&lt;br&gt;
Just like how you can debug browser side code, you an also debug server side code with this.&lt;br&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%2Fia1p8esefgrcl3u9rzuw.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%2Fia1p8esefgrcl3u9rzuw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look at me placing a debugger and all!&lt;br&gt;
Note: See the &lt;em&gt;two&lt;/em&gt; xmas.ts and utils.ts files? One of each of those is a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/SourceMap" rel="noopener noreferrer"&gt;“sourcemap”&lt;/a&gt; file.&lt;br&gt;
Curious about what THAT project is? Check it out!&lt;br&gt;
&lt;a href="https://github.com/jayantbh/xmas-cli" rel="noopener noreferrer"&gt;jayantbh/xmas-cli: Christmas tree generator&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  [BONUS/2!] 8. Next.js Server Side debugging?! [🔝]
&lt;/h2&gt;

&lt;p&gt;Oh yeah! You can use all the capabilities of your Chrome Devtools to debug your Next.js applications server side logic. And it’s as simple as 1, 2, 3!&lt;/p&gt;

&lt;p&gt;Pre-requisites: You have a nextjs app set up locally and all packages installed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;NODE_OPTIONS='--inspect' yarn dev&lt;/code&gt; or &lt;code&gt;NODE_OPTIONS='--inspect' npm run dev&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Wait till the logs say something like:
&lt;code&gt;Debugger

listening on ws://127.0.0.1:9230/3473fa37-03ec-4dc9-9769-3fd97998f0b7
For help, see: https://nodejs.org/en/docs/inspector

&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go to chrome://inspect/#devices and &lt;code&gt;inspect&lt;/code&gt; the target that represents your app

&lt;ul&gt;
&lt;li&gt;You might see something like this: &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%2Fdzlps7k3pi727t4zphho.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;In this case, the one with &lt;code&gt;next/dist/server/lib/start-server.js&lt;/code&gt; is the one I need to &lt;code&gt;inspect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;An instance of DevTools will open.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Load your app! Go to localhost:3000 or whatever you app is supposed to load on. That’s it!

&lt;ul&gt;
&lt;li&gt;At the start you might not see any files related to your app in the sources panel, but as you load parts of your app, it’ll begin to show up in devtools.&lt;/li&gt;
&lt;li&gt;Once it does, you can place breakpoints, see in-memory values, change things, etc!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fgktgighjhg4294ymo03g.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%2Fgktgighjhg4294ymo03g.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Hope you found this useful. 🎉&lt;br&gt;
I would love to hear other awesome ways you use your browser as the worlds greatest debugger, client-side or server side, in the comments! 😃&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>testing</category>
      <category>frontend</category>
    </item>
    <item>
      <title>🙅 Why I don't use AI as my copilot 🤖</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Fri, 14 Jun 2024 20:08:54 +0000</pubDate>
      <link>https://forem.com/middleware/why-i-dont-use-ai-as-my-copilot-47k3</link>
      <guid>https://forem.com/middleware/why-i-dont-use-ai-as-my-copilot-47k3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Jesus, take the wheel. 🚗&lt;br&gt;
And Github Copilot, take the IDE. 💻&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.blog/2023-06-13-survey-reveals-ais-impact-on-the-developer-experience/" rel="noopener noreferrer"&gt;Github says&lt;/a&gt;&lt;/strong&gt;, 92% of US devs are using Copilot.&lt;br&gt;
What. Seriously?!&lt;br&gt;
When did you hear 92% of any demographic using a singular thing?&lt;/p&gt;

&lt;p&gt;Unless of course... you say &lt;strong&gt;100%&lt;/strong&gt; of all people who ever existed, consumed di-hydrogen monoxide.&lt;br&gt;
&lt;em&gt;(There's exactly one way this line gets dark. Don't go there. 👀)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Join me on a quick journey as I talk about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What my fears actually are.&lt;/li&gt;
&lt;li&gt;How other experienced devs feel about this.&lt;/li&gt;
&lt;li&gt;Maybe I'm worried about nothing?&lt;/li&gt;
&lt;li&gt;And how WE are responsible for how we use LLMs!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔥 When the machines took over the world in 2024
&lt;/h3&gt;

&lt;p&gt;After a quick Google search, it seems like most devs are using AI assistance in writing code. &lt;strong&gt;I’d be lying&lt;/strong&gt; if I said I haven’t used AI to write code at all. Of course, I have. I don’t live under a rock.&lt;/p&gt;

&lt;p&gt;I've seen devs get oddly comfortable with the idea of sharing their code related data with third party cloud services, which are often not SOC2 (or something similar) certified, and make vague unprovable claims of privacy at best.&lt;/p&gt;

&lt;p&gt;Things like Github Copilot (and Copilot chat), Bito.ai, and several other AI code extensions on the VS Code marketplace have more than 30 million installs. Crazy! 🤯&lt;/p&gt;

&lt;p&gt;And then there's me. &lt;strong&gt;I’ve not made AI assistance&lt;/strong&gt; a part of my regular code workflow. A couple of times I’ve taken help from GPT to get some boilerplate written, sure. But those times are an exception. Things like Github Copilot, or any kind of code review, code generation tool, PR creation, or commit-assistance, isn’t a part of my IDE or CLI flow.&lt;/p&gt;

&lt;p&gt;Maybe it’ll change with time. We’ll see.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  “But… why?”
&lt;/h2&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%2Fbpc1fc4t5a10j0i5r3wj.gif" 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%2Fbpc1fc4t5a10j0i5r3wj.gif" alt="but why"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  😟 What I'm ACTUALLY worried about
&lt;/h3&gt;

&lt;p&gt;The answer is simple. 👇&lt;/p&gt;
&lt;h4&gt;
  
  
  1. I fear my programming skills will get rusty
&lt;/h4&gt;

&lt;p&gt;I am concerned that the way I write and read code will suffer if I get too used to AI assistance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’m concerned I’ll begin to &lt;strong&gt;overlook&lt;/strong&gt; flaws in code that I can catch otherwise.&lt;/li&gt;
&lt;li&gt;That I’ll start to take AI generated code for &lt;strong&gt;granted&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;And looking up APIs, built-in methods, or other documentation will start to feel like a &lt;strong&gt;chore&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I fear… that I’ll start slipping.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. I'm not comfortable enough with sharing all of my code with a third party service
&lt;/h4&gt;

&lt;p&gt;Companies can be damn smart about inferring things from the data you provide. Sometimes they'll know about things that &lt;a href="https://www.forbes.com/sites/kashmirhill/2012/02/16/how-target-figured-out-a-teen-girl-was-pregnant-before-her-father-did/" rel="noopener noreferrer"&gt;your family won't know about&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea that sensitive business logic may get leaked to a third party service, which may eventually be used to make inferences I'm not comfortable with or just... straight-up leak? I mean, software gets hacked all the time.&lt;/p&gt;

&lt;p&gt;I think I'm being very reasonable thinking that I don't want to expose something as sensitive as code in an unrestricted manner to a third party company. Even if that company is Microsoft, &lt;a href="https://www.wired.com/story/total-recall-windows-recall-ai/" rel="noopener noreferrer"&gt;because even they f*ck up&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  👀 From the Experienced Devs' point of view
&lt;/h3&gt;

&lt;p&gt;This isn’t a take that is unique to me either!&lt;/p&gt;
&lt;h4&gt;
  
  
  1. More-experienced devs tend to &lt;strong&gt;not want to lean&lt;/strong&gt; on “crutches” to write their code.
&lt;/h4&gt;

&lt;p&gt;I’ve even had the pleasure to work with senior devs who didn’t want to use colored themes on their IDEs because they thought it’ll hurt their ability to scan, read, or debug code! (that was a bit much for me too)&lt;/p&gt;

&lt;p&gt;After all, “programming skills” is a lot &lt;strong&gt;more than just writing code&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Older devs have seen all kinds of &lt;strong&gt;software get hacked&lt;/strong&gt;, data leaked, etc.
&lt;/h4&gt;

&lt;p&gt;I mean, when &lt;a href="https://haveibeenpwned.com/" rel="noopener noreferrer"&gt;haveibeenpwned.com&lt;/a&gt; sends you emails about your credentials, emails, and other data leaks every year for over 10 years... MANY TIMES from &lt;a href="https://en.wikipedia.org/wiki/2017_Equifax_data_breach" rel="noopener noreferrer"&gt;billion&lt;/a&gt; &lt;a href="https://www.news18.com/india/indias-biggest-data-leak-so-far-covid-19-test-info-of-81-5cr-citizens-with-icmr-up-for-sale-exclusive-8637743.html" rel="noopener noreferrer"&gt;dollar&lt;/a&gt; &lt;a href="https://www.nytimes.com/2017/10/03/technology/yahoo-hack-3-billion-users.html" rel="noopener noreferrer"&gt;corporations&lt;/a&gt;...&lt;br&gt;
When you hear &lt;strong&gt;"When you're not paying for the product, you are the product"&lt;/strong&gt; for the bazillionth time, which is then backed by yet another company selling that data to some third party...&lt;/p&gt;

&lt;p&gt;Yeah... it gets tiring.&lt;br&gt;
And it gets real easy to just disconnect as many wires as you can and go back to stone age.&lt;/p&gt;

&lt;blockquote&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%2F03pmbpqix6e199ewey5t.gif" 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%2F03pmbpqix6e199ewey5t.gif" alt="old matt damon"&gt;&lt;/a&gt;&lt;br&gt;
“Older devs”? Am I… Am I getting old?&lt;br&gt;
Nah, I’m still 22 and this is 2016 or something… right? Right??&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Btw, the answer to the question in the title is 👆 this.&lt;/strong&gt; Congrats! The post is over! Over to the next one…&lt;/p&gt;

&lt;p&gt;Buuuuut… if you want to continue reading…&lt;br&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%2Fjk0ywd7yjqukeokd0t2d.gif" 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%2Fjk0ywd7yjqukeokd0t2d.gif" alt="joey theres more"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🚶 Let's take a step back for a moment...
&lt;/h3&gt;
&lt;h4&gt;
  
  
  I think my fears may be exaggerated.
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Let's keep the whole data privacy angle aside for now, because that's a whole other topic on it's own that I feel about rather passionately.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I personally don’t have enough data to empirically say that using AI assistance will bring about the doom I fear… That it’ll downgrade me from what I am today, to an &lt;a href="https://dev.to/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld"&gt;SDE1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But I’ve seen patterns.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’ve seen AI-generated sub-par quality code go through code reviews and end up on the &lt;code&gt;main&lt;/code&gt; branch.&lt;/li&gt;
&lt;li&gt;I’ve seen library functions being used without properly understanding what, or what alternatives exist just because an LLM generated that.&lt;/li&gt;
&lt;li&gt;I’ve even seen code generated to solve a problem, for which a utility function already existed in the codebase but wasn’t used because knowing this utility existed was a lot more work than asking GPT to generate it for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  💎 &lt;del&gt;Diamonds are&lt;/del&gt; Bad code is forever
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;“Wait a damn minute… I’ve seen this movie before!”&lt;/strong&gt;&lt;br&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%2Ffvun4635neb2dflv5yto.gif" 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%2Ffvun4635neb2dflv5yto.gif" alt="dejavu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLMs are a pretty new thing… but 💩 code has been &lt;strong&gt;eternal!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Every. Single. Dev. Ever. Has used library functions without fully &lt;strong&gt;understanding&lt;/strong&gt; it or looking at alternatives. You, and me, are both guilty of that. (What? You thought &lt;code&gt;Array.prototype.sort&lt;/code&gt; was the best way to sort anything? It’s just sufficient in most cases!)&lt;/li&gt;
&lt;li&gt;A piece of logic gets reinvented (re-copy-pasted) all the damn time! Just that before it used to be from &lt;strong&gt;StackOverflow&lt;/strong&gt;, now it’s from ChatGPT.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🤷 So, what’s the big fuss about?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Will using ChatGPT make me a bad programmer?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think, no.&lt;/p&gt;

&lt;p&gt;The takeaway is that you just need to care about what you build.&lt;br&gt;
Take &lt;strong&gt;pride&lt;/strong&gt; in what you &lt;strong&gt;build&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  🤖 Where the heck does LLM/AI fit in?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LLMs are not inherently evil.&lt;/strong&gt;&lt;br&gt;
In fact, they can be pretty damn useful if used responsibly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality Code:&lt;/strong&gt; An LLM might handle edge-cases that a less diligent developer wouldn’t consider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Tests:&lt;/strong&gt; LLMs might write tests that are more comprehensive than what some devs would produce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Types:&lt;/strong&gt; It might even write types more "completely" than an average dev might write on their own, or might have the skill to write.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, the responsibility lies with the developer to ensure that the code output is guarded and well-monitored. Someone who doesn’t care would have done a shoddy job at any point in history. The presence of LLMs doesn’t change that.&lt;/p&gt;
&lt;h3&gt;
  
  
  😎 The art of actually giving a f*ck
&lt;/h3&gt;

&lt;p&gt;There's a lot of devs out there who don't care.&lt;br&gt;
But you’re no such dev. &lt;strong&gt;You DO care.&lt;/strong&gt;&lt;br&gt;
Else you wouldn’t be here on dev.to learning from people’s experiences.&lt;/p&gt;

&lt;p&gt;I recently wrote about what new devs should care about to grow in their career. It’s a LOT MORE than just code.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#promotion&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Maybe I’ll introduce some AI in my VSCode.&lt;/strong&gt;&lt;br&gt;
I think it’s a matter of when, instead of &lt;strong&gt;if&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What’s more important is… as long as I care about making sure my programming output is &lt;strong&gt;readable, performant, high quality, and easily reviewable&lt;/strong&gt;, I think I’ll be fine, and so will you.&lt;/p&gt;


&lt;h3&gt;
  
  
  👇 P.S.
&lt;/h3&gt;

&lt;p&gt;If you want an example of something I care deeply about, and has both great code 💪 and… less than excellent code 🤣, take a look at our &lt;strong&gt;open-source&lt;/strong&gt; repo!&lt;/p&gt;

&lt;p&gt;It’s something that lets you spot how long it takes for you to deliver your code, how many times PRs get stuck in a review loop, and just generally how great your team ships code.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>You can't grow in your career without feedback. 🗣️ Here's 5 ways for you to find some 📝</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Wed, 12 Jun 2024 17:36:55 +0000</pubDate>
      <link>https://forem.com/middleware/you-cant-grow-in-your-career-without-feedback-heres-5-ways-for-you-find-some-171p</link>
      <guid>https://forem.com/middleware/you-cant-grow-in-your-career-without-feedback-heres-5-ways-for-you-find-some-171p</guid>
      <description>&lt;p&gt;&lt;strong&gt;"This guy has 10 years of experience, but he works like a 4YOE one?"&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;"How do I talk to my manager about how I'm doing?"&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;"I don't know if I'm growing sufficiently in my career!"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ever said or wondered these things? Then you're in the right place.&lt;/p&gt;



&lt;p&gt;There are tons of people out there who have worked since so long... Yet somehow there's not much of a difference between how they work and what they ship, compared to someone with much lower years of experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's because it's not the number of years you've worked that shows how far you've come. But the distance you've covered.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Ooh that's deep."&lt;br&gt;
Yes, I know. Thanks. 😂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Devs find it easy to write code. To zone into a problem and focus on fixing that to the &lt;em&gt;best of their ability&lt;/em&gt;.&lt;br&gt;
Best of &lt;em&gt;their ability&lt;/em&gt;.&lt;br&gt;
&lt;strong&gt;THEIR ABILITY.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Where does "their ability" even come from?&lt;/p&gt;

&lt;p&gt;It comes from the &lt;strong&gt;learnings and growth they've acquired&lt;/strong&gt; over the years. It comes from working with others to see what they do better, or do differently and why. &lt;strong&gt;It comes from receiving feedback&lt;/strong&gt; on the work they do themselves, learning what they did well, what they could do better, why, and how.&lt;/p&gt;

&lt;p&gt;You could totally work in a silo, but unless you're an exception genius of some sort (or even if you are), you'll benefit a lot from obtaining feedback from those you work with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  "Ah. I see. I'm ready for some feedback. But... how?"
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, that's why you're here, aren't you?&lt;br&gt;
Let's go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql3t4l7yvuuvbdrc80r8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql3t4l7yvuuvbdrc80r8.gif" alt="ryan feedback" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Not all feedback is useful feedback.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Funny how before I'm sharing how to get feedback, I'm sharing how NOT to get feedback. Or more like, how to ensure you have good feedback.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Everyone loves &lt;strong&gt;sharing their experiences and opinions as solid fact&lt;/strong&gt;. They love to act like their way is the best way, and sometimes the only way of doing things.&lt;br&gt;
If you ask around, you'll find people passionately defending their stance on whether a Pull Request should be merged via Merge Commits, Squashing, or Rebasing or something else. But these opinions are often not backed by sufficient or sound reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some examples of such feedback might be:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't use this library, write a util function instead.&lt;/li&gt;
&lt;li&gt;All your changes must have tests.&lt;/li&gt;
&lt;li&gt;Don't use list-comprehension. Use lambda functions instead.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/middleware/not-heres-how-to-write-actually-good-commit-messages-hint-its-not-just-adding-commit-lint-j2i"&gt;Write your commits in this following structure.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not saying this is BAD feedback. Maybe it isn't. But without elaborating further you wouldn't know. And it is common for especially new devs or introverts to NOT ask further questions.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynkk5ca1eah5t31g0yup.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynkk5ca1eah5t31g0yup.gif" alt="pointless feedback" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you request or are provided with feedback, whether it is on your &lt;a href="https://dev.to/middleware/the-senior-engineers-guide-to-the-code-reviews-1p3b"&gt;code reviews&lt;/a&gt;, task completion, planning, collaboration, etc. Always ask, "why?" (in an appropriate tone and politely of course).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For each of the above pieces of feedback, here are some questions you might ask:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What risks do we face by using this library? It's open source, actively maintained, has a lot of stars. All good signs right?&lt;/li&gt;
&lt;li&gt;ALL my changes need to have tests? Why? That feels overkill and might cause my tasks to be delayed.&lt;/li&gt;
&lt;li&gt;But list-comprehension feels like a perfectly understandable way to write this code. I feel it's not really compromising readability either. Could you explain why I should be using lambda functions instead?&lt;/li&gt;
&lt;li&gt;Could you help me understand why I need to write my commits in this specific way? What problems might we face if I do XYZ instead?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When offered with some feedback, you absolutely need to understand why that feedback is valuable and applicable to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Either convince, or get convinced.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Don't wait for it. Ask for it.
&lt;/h2&gt;

&lt;p&gt;Everyone has their own jobs to do, and sharing feedback often feels like something you have to go out of your way to do.&lt;/p&gt;

&lt;p&gt;Well, you can't wait for it forever. Every month that passes by without feedback, you might be &lt;strong&gt;ingraining the "bad practices"&lt;/strong&gt; harder. Doing things in a worse way without knowing. Not doing something that might benefit you significantly for low effort.&lt;/p&gt;

&lt;p&gt;You'll figure most of it out eventually, often the hard way. But that's also a slower growth path.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oyas709z27twt13q4fn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oyas709z27twt13q4fn.gif" alt="ready for review" width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask your managers and some of your peers for feedback&lt;/strong&gt;, between once a month and once a quarter. Learn how they feel about working with you. What can you do better as a teammate? As a dev? As an employee of the org?&lt;/p&gt;

&lt;p&gt;If your org already does regular review cycles, then you might not need to do this manually. But in most orgs, the review cycles are either insufficient, or non-existent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1:1s are a great way&lt;/strong&gt; to get some regular feedback from your managers, and they are more commonly done between 1-2 times a month. But again, 1:1s aren't done very constructively in way too many places. If you've ever felt like skipping a 1:1, then you're a victim of poorly structured 1:1s. &lt;em&gt;Maybe I'll write about that too soon.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Know where you want to go.
&lt;/h2&gt;

&lt;p&gt;Most people have ambition. They want to be someone big, build big things, make big money, etc. And that's cool, obviously there's nothing wrong with that.&lt;/p&gt;

&lt;p&gt;But whatever your goals are, have some level of clarity about them.&lt;br&gt;
You don't need to have your whole life planned down to the moment. But &lt;strong&gt;you should know who you want to be&lt;/strong&gt; and what you want to be doing in 5 years, and then 10.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0f97i26lbfc1999wt30.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0f97i26lbfc1999wt30.gif" alt="no idea" width="600" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this important?&lt;/strong&gt;&lt;br&gt;
Because you'll receive all kinds of feedback, and people share feedback based on the things that are &lt;strong&gt;important to THEM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Someone who intends to be a staff engineer someday might be highly focused on code/architecture/performance related feedback of your work. But if you intend to be a manager 5 years down the line, &lt;strong&gt;the more relevant feedback&lt;/strong&gt; for you would be related to planning, collaboration, and high level design to some degree.&lt;/p&gt;

&lt;p&gt;My last blog post might be relevant for SDE1/2's looking to grow in their careers:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware" width="256" height="256"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#promotion&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  4. If you can't act on feedback, you might as well never have received it.
&lt;/h2&gt;

&lt;p&gt;This means two things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There's simply nothing you can or want to do about the feedback you received.&lt;/li&gt;
&lt;li&gt;It isn't obvious, or you don't know how to can act on the feedback.&lt;/li&gt;
&lt;li&gt;You straight-up forgot past feedback, or didn't make a plan of action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;If any of this is true, you need to do something about it.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Let's start with feedback that is clear to you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you know where you need to go, you know which feedback is going to be relevant, and if you don't actively act on such feedback then you're not really going to go anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track the feedback somewhere.&lt;/strong&gt;&lt;br&gt;
It can be a spreadsheet, a document, some To-do app, or just a notes app. Log it down.&lt;/p&gt;

&lt;p&gt;For each feedback item that you choose to track, you want to log the the following along with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When was this &lt;strong&gt;shared&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;What personal &lt;strong&gt;goal&lt;/strong&gt; does it relate to&lt;/li&gt;
&lt;li&gt;When do you want to see the &lt;strong&gt;results&lt;/strong&gt; of this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if someone shared feedback with me stating that I should be more involved in the planning phase of new features, then I might log it down like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feedback item&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Shared&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Done&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Actively participate in one feature planing phase&lt;/td&gt;
&lt;td&gt;Being an EM&lt;/td&gt;
&lt;td&gt;10 May&lt;/td&gt;
&lt;td&gt;31 Jul&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actively participate in 3 feature planning phases&lt;/td&gt;
&lt;td&gt;Being an EM&lt;/td&gt;
&lt;td&gt;10 May&lt;/td&gt;
&lt;td&gt;30 Sep&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Coming to feedback that isn't obvious to you, either in terms of how you can act on it, or what the feedback actually means.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwen5ji77o2bqmbhn0cc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwen5ji77o2bqmbhn0cc.gif" alt="dont get it" width="500" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, your only course of action here is to &lt;strong&gt;ask&lt;/strong&gt;.&lt;br&gt;
Ask for clarification on that feedback.&lt;br&gt;
Ask for help with how you can work on it.&lt;/p&gt;

&lt;p&gt;I understand depending on your work environment and culture, asking questions isn't always easy.&lt;br&gt;
It's cool that you can often ask Google, or GPT about these things now, to some degree of success.&lt;/p&gt;

&lt;p&gt;But... this highlights the last part, and a hard decision to make when it comes to feedback (or your career generally).&lt;/p&gt;
&lt;h2&gt;
  
  
  5. My work environment is straight-up not conducive for feedback.
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend the whole world is utopian. There are places where your peers suck, your bosses suck, and everyone is too occupied in their own lives to care about you. After all, for someone to share meaningful feedback with you, they have to care about you in at least a professional capacity.&lt;/p&gt;

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

&lt;p&gt;In such a scenario, maybe an option is to just... &lt;strong&gt;leave?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should be at a job if you're getting at least 1 of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Growth (personal/professional)&lt;/li&gt;
&lt;li&gt;Money&lt;/li&gt;
&lt;li&gt;Recognition&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There isn't a "right answer" here. The right answer is &lt;strong&gt;whatever you deem to be right&lt;/strong&gt;.&lt;br&gt;
Feedback can play a crucial role in any, or even all of these, if acted upon properly.&lt;/p&gt;

&lt;p&gt;But if there's no feedback, and you see no other reasonably fast path to any of this, then &lt;strong&gt;don't remain stuck&lt;/strong&gt;. Keep moving. Keep growing. This post was basically about growing in your career. &lt;strong&gt;Feedback is one of the most useful tools as your disposal.&lt;/strong&gt;&lt;br&gt;
Seek it out. Use it.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;⛳️ Some background on this post:&lt;/strong&gt;&lt;br&gt;
At this point I've worked at all kinds of places that have dealt with feedback in their own ways. Some made feedback a structured and regular thing, some others made it a more ad-hoc and casual thing, and sometimes there was hardly any feedback till it's been late.&lt;/p&gt;

&lt;p&gt;Having deeply learnt the importance of feedback for myself and my peers the hard way, I decided to make sure there was a process and cadence to this chaos. I wouldn't say I practice this perfectly, else my team will have something to say about that. 🤣 But I'm sure they'll agree that we do a bunch of things right when it comes to feedback, and making sure they have a direction in which they can act in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We at &lt;a href="https://www.middlewarehq.com/"&gt;Middleware&lt;/a&gt;&lt;/strong&gt; leverage feedback culture heavily! Make sure we have clearly set expectations from our roles, and are actively communicating differences and feedback clearly.&lt;/p&gt;

&lt;p&gt;If this was interesting to you, you could check this post out, which was also linked above:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware" width="256" height="256"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#promotion&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>career</category>
      <category>beginners</category>
      <category>learning</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Mon, 10 Jun 2024 11:10:21 +0000</pubDate>
      <link>https://forem.com/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld</link>
      <guid>https://forem.com/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;"I'm good at writing code. Just this month I shipped 11 PRs! I even updated most of my tickets on time. Didn't take that many leaves either! And I worked so many more hours than Sam, too! Why didn't I get promoted but they did?"&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;-- Some unfortunate person who didn't get the promo this time.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Does that sound relatable by any chance?&lt;/p&gt;

&lt;p&gt;I've seen this before.&lt;br&gt;&lt;br&gt;
A LOT.&lt;/p&gt;

&lt;p&gt;Sometimes the reason is office politics. 🤬&lt;br&gt;&lt;br&gt;
Sometimes it's simply expectations not being communicated well. That can suck. 🥲&lt;br&gt;&lt;br&gt;
Sometimes it's a &lt;strong&gt;mismatch&lt;/strong&gt; between how you stood up to the defined expectations, and where the bar actually was. 🤔&lt;/p&gt;

&lt;p&gt;You may not be able to control or change what your office environment is like. But you're certainly in control to ensure there's nothing on your end that prevents you from &lt;strong&gt;rising up the career ladder&lt;/strong&gt;.&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%2F6htoz012vjxxtc5po2hk.gif" 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%2F6htoz012vjxxtc5po2hk.gif" alt="you got it schrute the office"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Cool! Could you speed-run me through what I need to do?
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first thing is to know what your responsibilities are as a software developer. I don't mean your responsibilities in your current org, I mean it as a holistic and individual dev.&lt;/p&gt;
&lt;h4&gt;
  
  
  Table of contents
&lt;/h4&gt;

&lt;p&gt;I see there's &lt;strong&gt;5 broad areas&lt;/strong&gt; that a dev should aim to cover.&lt;br&gt;
&lt;em&gt;Click on the links to jump to that section.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
Technical (code quality, lang. proficiency, testing, perf.)&lt;/li&gt;
&lt;li&gt;
Productivity (reliability &amp;amp; efficiency)&lt;/li&gt;
&lt;li&gt;
Collaboration (communications &amp;amp; reviews)&lt;/li&gt;
&lt;li&gt;
Ownership (responsibility &amp;amp; initiative)&lt;/li&gt;
&lt;li&gt;
Impact (system/product improvements &amp;amp; innovation)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;"With that, we're halfway to making a D&amp;amp;D character sheet. Roll Nat 20! 🤣"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm going to only cover things that ARE in YOUR CONTROL.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I'm specifically mentioning this because one thing I've seen many orgs get wrong is, various areas of evaluation end up including things that you may not have control over.&lt;br&gt;&lt;br&gt;
Such as, you may not have control over how impactful your work was to the company. In most cases, you'll only get to work on the things you've been directly asked to do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Alright! Let's go! I'm ready to get promoted!💰💰
&lt;/h3&gt;
&lt;/blockquote&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%2F2q5npkuc8euhcnb2pvtm.gif" 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%2F2q5npkuc8euhcnb2pvtm.gif" alt="one million dollahs the office"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 5 areas I mentioned above aren't specific to SDE1's. It's something every dev needs to be on top of. But the bar and expectations from each of those areas change.&lt;/p&gt;

&lt;p&gt;Let's talk about what the baseline expectation is from each area, and what you need to do to get to the next level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hold your horses. &lt;u&gt;This is going to be long.&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;But remember, there's only 5 sections below... 👇&lt;/strong&gt;&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%2Fqaj5r04sxuc1fsfsaqtv.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%2Fqaj5r04sxuc1fsfsaqtv.png" alt="this will take a while"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Technical Skills [🔝]
&lt;/h3&gt;

&lt;p&gt;At SDE1, no one expects you to make a major splash, change the world, save billions!&lt;br&gt;
They expect you to do your job in a way that needs minimal, or at-best occasional hand-holding, and for your delivered work to not need revisiting or fixes (as far as reasonable).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;br&gt;
Write decent code that others can read, and doesn't break every 2 seconds.&lt;/p&gt;

&lt;p&gt;There's a few ways to do that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write dumb code. Not "smart" code.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might be the wizard of Leetcode, Hackerrank, or something similar. But unfortunately these sites encourage juniors to pursue performance so hard that it often comes at a &lt;strong&gt;cost of readability&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It's NOT a bad idea to use a nested loop, if you know both loops run only for small values of &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It's NOT a bad idea to NOT use a map/dict instead of an array if that array is guaranteed to only have a few items at max.&lt;/li&gt;
&lt;/ul&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%2Famla8isarsp66etjd99v.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%2Famla8isarsp66etjd99v.png" alt="writing vs reading code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn about all the tools the language offers you.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might be used to using for-loops for everything, but arrow/lambda functions could make your code a lot more readable.&lt;/li&gt;
&lt;li&gt;[JS example] you might be used to storing things in an object &lt;code&gt;{}&lt;/code&gt; for O(1) lookup every time, but &lt;code&gt;set.has(thing)&lt;/code&gt; is a lot easier to read than &lt;code&gt;!!obj[thing]&lt;/code&gt; (or even &lt;code&gt;Boolean(obj[thing])&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Understand why tests are valuable, and THEN write tests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too often people just write tests because it's a "best practice".&lt;/li&gt;
&lt;li&gt;Without understanding the WHY behind it, you may write ineffective or pointless tests.&lt;/li&gt;
&lt;li&gt;The idea is, &lt;strong&gt;do whatever you need to, to increase confidence in the stability of your code&lt;/strong&gt;. You need to use types? Sure. You need to hire a QA person? A bit inefficient, but cool. &lt;strong&gt;Maybe you need to write... TESTS?&lt;/strong&gt; Okay, but... what do I aim for?&lt;/li&gt;
&lt;li&gt;This can be a separate blog on its own. &lt;strong&gt;But here's a quick brief...&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't matter whether you need to write Unit tests, Integration tests, Acceptance tests, whatever you call them. People can get "religious" about it. But none of it matters as long as your test does the one fundamental thing... improves your confidence that your code will not break.&lt;/li&gt;
&lt;li&gt;Sometimes you may need to refactor your code so it's more testable, but once you do it a few times you'll begin thinking about code from a testability point of view.&lt;/li&gt;
&lt;li&gt;It's also a great idea to write the tests for your expected implementation before you've implemented anything at all! Resulting in a testing suite that completely fails at the start, and as you've implemented things it gradually keeps passing! This is basically what Test Driven Development (TDD) is btw.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Care about performance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No one's expecting you to run everything at 60 FPS all the time or sub 100ms latency for everything.&lt;/li&gt;
&lt;li&gt;But be mindful of when your code may cause too many requests to the DB, or loads too much data. Don't let your component render 5 times because you couldn't figure out how to use &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;useState&lt;/code&gt; right. Ask for help where you need to, but care enough to not let this stuff reach production.&lt;/li&gt;
&lt;/ul&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%2F57g9q3qria2u6k6s3of5.gif" 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%2F57g9q3qria2u6k6s3of5.gif" alt="latency paper plane"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏫ To get to SDE2:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dive deeper into the internals of the languages and frameworks you use. 🧠 Know how React actually renders things. Understand how a browser handles multiple requests from the browser to a server. Learn how Postgres chooses to optimize a query or doesn't. Get into how your applications deployment pipeline is configured. &lt;/li&gt;
&lt;li&gt;Ask questions about how the project, components, APIs, etc. were architected the way they were. Learn what these design patterns are called, and what their pros and cons are. Start contributing to architectural discussions and suggest improvements. Who knows? You might have ideas that more experienced people didn't consider.&lt;/li&gt;
&lt;li&gt;Mentor others on best coding practices. You will often have people junior than you on the team. Review their code. Get your code reviewed by them and share what they should focus on. Like Yoda, your wisdom you should share. 🧠&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Productivity [🔝]
&lt;/h3&gt;

&lt;p&gt;As an SDE1, your productivity is measured by your ability to reliably complete tasks on time, manage your workload efficiently, and maintain consistent progress on your projects. You should also be able to handle minor disruptions and dependencies without losing focus or needing constant guidance.&lt;/p&gt;

&lt;p&gt;You may often need to rely on tools or apps or scripts to do certain things more effectively. Sometimes you may need to MAKE these tools yourself.&lt;/p&gt;

&lt;p&gt;It's okay if this feels like too much. It won't always be perfect. Even far more senior devs don't always nail this down.&lt;br&gt;
You'll get there. The important part is, if you're not able to live upto your commitments, then communicate as early as you can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;br&gt;
Aim to get your tasks done well and on time. When you feel that you can't, let people know asap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know when do to what, and when to say NO 🙅&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn to distinguish between what's urgent and what's important. Use tools like Eisenhower Matrix to prioritize effectively.&lt;/li&gt;
&lt;li&gt;Focus on high-impact tasks, but don't ignore the small ones that keep the wheels turning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LEARN TO SAY NO.&lt;/strong&gt; Oh goodness this is a BIG one. This is so important that this could be a blog on its own. I got stories.

&lt;ul&gt;
&lt;li&gt;You'll occasionally find yourself being overloaded with work if you're not good at saying no. People will often find it acceptable if you can simply and clearly explain what you're occupied with, and instead when you'll be able to pick up the next thing.&lt;/li&gt;
&lt;li&gt;If you find yourself pressured into a corner, you NEED to rely on your manager to prioritize things for you. Just ask them what's most important according to them.
&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%2F46j4r2r8b9oho91fduvw.gif" alt="no god please no"&gt;
&lt;em&gt;You saw this one coming, didn't you?&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Manage your time, and don't burn yourself out&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use techniques like Pomodoro to maintain productivity without burning out. I've had many friends that use some kind of a digital or physical Pomodoro timer to manage their workday.&lt;/li&gt;
&lt;li&gt;Track your time on different tasks to understand where you might be spending too much or too little time.
&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%2Fktom06mrbpkg10u0vslo.png" alt="pomodoro timer"&gt;
&lt;em&gt;A common pomodoro timer used by my friends back in the day&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Automate boring work, by making your own tools if you must&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate repetitive tasks to save time. Scripts and tools can handle a lot of the mundane stuff. I've created a whole bunch of scripts, Slack commands for internal debugging, etc. that has saved me and the team countless hours already at &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Familiarize yourself with IDE shortcuts, plugins, and other tools that can speed up your development process. If a majority of your team uses VSCode for dev, you can even agree on a common IDE config, and share that for that codebase by committing the .vscode directory to the repo!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⏫ To get to SDE2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start managing your projects more independently. Create realistic timelines and meet them. An SDE1 might miss timelines every now and then. An SDE2, less so. The higher you go, the more likely it should be that you finish your projects before time even!&lt;/li&gt;
&lt;li&gt;Proactively identify and address bottlenecks in your workflow. Suggest process improvements to the team. Often you may not get the time or support to implement such improvements. A solid SDE2+ move is to just do it yourself in the bits and pieces of time you find between other work, and suddenly one day the team has some key workflow pain-points magically resolved! All because of you.&lt;/li&gt;
&lt;li&gt;Balance multiple projects and tasks without losing track of deadlines, and understand that you don't always just meet deadlines by working 28 hours a day, you figure out ways to do the same thing more efficiently. As such, show that you can handle increased responsibility with the same level of productivity. Level up your multitasking game like Tony Stark managing his suit tech! 🦾&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Collaboration [🔝]
&lt;/h3&gt;

&lt;p&gt;At SDE1, you need to communicate clearly, share your progress, and be a helpful team member. Your ability to collaborate effectively with others is crucial to the team's success.&lt;/p&gt;

&lt;p&gt;There are a lot of people relying on you to deliver things on time. They are your engineering manager, product manager, perhaps other managers they report to, and also your peers who are waiting for your piece of the project to be done.&lt;/p&gt;

&lt;p&gt;People may often be understanding of something running a little late, especially if it's informed as early as possible. But what really causes issues is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not telling you'll be late till the last minute.&lt;/li&gt;
&lt;li&gt;Not being clear or being VERY inaccurate about your estimates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still mess up on some of this. But overall things do get better. 👌&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;br&gt;
Be a good teammate and communicate well.&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%2F385iu3jjbits6zfgq6zz.gif" 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%2F385iu3jjbits6zfgq6zz.gif" alt="teamwork"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speak early, speak often, but most importantly - listen&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep your team updated on your progress. Regular updates in stand-ups and via project management tools like Jira or Trello help everyone stay on the same page. (I know, Jira sucks, but you have to understand that it's a pretty decent tool for your managers and higher ups to keep track of how things are running.)&lt;/li&gt;
&lt;li&gt;Listen actively during meetings and discussions. Understand what others are saying before you respond.&lt;/li&gt;
&lt;li&gt;Being a good listener will also get you a girlfriend/boyfriend sooner 🤣. If you don't, let's hope you pass Rule 1 &amp;amp; 2. 👀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Guard your production, review the code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Participate actively in code reviews. Provide constructive feedback and be open to receiving it. Care deeply about not letting poorly readable, or potentially risky (perf., UX, or security-wise) code from ending up in prod.&lt;/li&gt;
&lt;li&gt;Learn from the feedback you receive and apply it to your future work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need any convincing about why code reviews are critical, and how to do it right, maybe this will help:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/the-senior-engineers-guide-to-the-code-reviews-1p3b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Senior Engineer's Guide to Code Reviews&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#codereview&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Keep your team up-to-date with your learnings&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share what you learn with your team. Whether it's a new tool, a coding trick, or an interesting article, keeping your team informed helps everyone grow. If you're on Slack, a #engineering channel is a great place for something like this. So is #memes. 😄&lt;/li&gt;
&lt;li&gt;Write documentation and create guides for complex parts of the codebase or processes. This helps others understand and use your work more effectively. It's SUPER IMPORTANT to remember that this documentation needs to be searchable. Documentation that can't be searched for, doesn't exist. &lt;a href="https://www.glean.com" rel="noopener noreferrer"&gt;Glean&lt;/a&gt; could be a great tool to help with that, but it's a paid (and expensive) thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⏫ To get to SDE2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take on a mentoring role. Help junior developers navigate their tasks and challenges. Help them plan, estimate, document, etc. Help them write their first ERDs (Engineering Requirements Document)!&lt;/li&gt;
&lt;li&gt;Lead small projects or initiatives. Show that you can coordinate efforts and bring a team together to achieve common goals.&lt;/li&gt;
&lt;li&gt;Facilitate communication within the team. Help resolve conflicts and ensure that everyone is heard. Every team has introverts, and it's usually them that have the hardest time communicating, help them as you can. Be the Captain America of your team, uniting and leading by example! 🛡️&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Ownership [🔝]
&lt;/h3&gt;

&lt;p&gt;Taking ownership means being responsible for your work and its impact. As an SDE1, this means you should ensure your code works as expected, handle your tasks diligently, and follow through on your commitments.&lt;/p&gt;

&lt;p&gt;Just as a founder, or CEO must do whatever it takes to ensure the company survives, thrives, and is profitable, you must do whatever you gotta do to ensure that your work meets the timelines set upon in, and is delivered in a way that not just meets, but exceeds the bar.&lt;/p&gt;

&lt;p&gt;Understandably, there may be times when the set timelines or expectations are simply unrealistic. That's where your communication skill needs to shine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;br&gt;
Own your work, and its quality. Finish what you start.&lt;br&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%2Fhc5yu0726kgkxrws7xmy.gif" 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%2Fhc5yu0726kgkxrws7xmy.gif" alt="dwight overrides"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Maybe not like... THAT.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn to commit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you commit to a task, see it through to completion. If you encounter obstacles, communicate them early.&lt;/li&gt;
&lt;li&gt;Don’t pass the buck. If there's an issue with your code or task, work to fix it rather than blame others.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Be proactive: See something, do something&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t wait for problems to be assigned to you. If you see something that needs fixing, take the initiative to address it. Of course you'll need to prioritize appropriately. Not everything that needs fixing requires you to park whatever you're working on and fix it first either.&lt;/li&gt;
&lt;li&gt;Think ahead. Anticipate potential issues and address them before they become problems. For technical or engineering related work, ERDs (Engineering Requirements Document) can help tremendously with your work planning.&lt;/li&gt;
&lt;li&gt;Your managers may be keeping an eye on your teams productivity from their point of view, but as a proactive dev you can do the same. After all, YOU are the one who truly understands what makes YOU productive. If you can come up with a way your productivity analysis to your managers, show them that your team is actually doing well, or is blocked on things that need their attention, that gets you some serious points.
DORA metrics is a fairly popular way to measure team productivity among dev teams. If you're not sure how to start measuring something like this, maybe this blog would help: &lt;a href="https://www.middlewarehq.com/blog/what-are-dora-metrics-how-they-can-help-your-software-delivery-process" rel="noopener noreferrer"&gt;What are DORA metrics?&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Everyday, be better than you were the day before&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reflect on your work. What went well? What could have been better? Use this reflection to improve continuously. This would be a more personal version of the Sprint Retrospective your manager would (or should) do.&lt;/li&gt;
&lt;li&gt;Seek feedback actively and apply it. Strive to be better with every project you undertake. Sharing feedback is also a lot of work for the one providing the feedback. It might be a good idea to block some time quarterly, monthly, etc. if your org doesn't have a process defined for this.&lt;/li&gt;
&lt;li&gt;Try and follow the Boy Scouts rule, which basically states that you should leave a codebase better than you found it. &lt;a href="https://deviq.com/principles/boy-scout-rule" rel="noopener noreferrer"&gt;Read more here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⏫ To get to SDE2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drive projects from start to finish. Take on tasks that require you to plan, execute, and deliver with minimal supervision. If you prove yourself to be self-capable enough, your manager might let you supervise a couple more devs to execute the project. Now THAT is some Senior Dev stuff. 💪&lt;/li&gt;
&lt;li&gt;Identify and implement improvements in processes, tools, or codebases. It's been mentioned before too, but here the focus is slightly different. Show that you’re looking out for the bigger picture and contributing to long-term success of the org.&lt;/li&gt;
&lt;li&gt;Advocate for best practices and ensure they are followed. Be the Batman of your projects—reliable, vigilant, and always delivering excellence. 🦇&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5. Impact [🔝]
&lt;/h3&gt;

&lt;p&gt;As an SDE1, your impact might be limited to the tasks and projects assigned to you. However, demonstrating a broader understanding and contributing beyond your immediate responsibilities can set you apart. Impact is not just about what you do, but how your work influences and benefits your team, your project, and the organization as a whole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;br&gt;
Make a difference. Don’t just do, but improve.&lt;br&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%2Fikxg6wmu8bnj72alus4c.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%2Fikxg6wmu8bnj72alus4c.png" alt="thinking ahead"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't be limited to "your job"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn about the business and the industry you’re working in. Understand how your work fits into the larger goals of the company.&lt;/li&gt;
&lt;li&gt;Identify opportunities for improvement or innovation. Suggest enhancements that could benefit the team or product.&lt;/li&gt;
&lt;li&gt;Pay attention to the end-users of your product. Understanding their needs and pain points can guide you in making more impactful contributions. Don't just build whatever you're asked, but also analyze how successful your efforts have been for the users, and the org.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contribute to the Community&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Participate in internal and external developer communities. Attend meetups, contribute to open-source projects, or write technical blogs.&lt;/li&gt;
&lt;li&gt;Share your knowledge and expertise to help others grow and learn. Organize or speak at tech talks, webinars, or coding bootcamps.&lt;/li&gt;
&lt;li&gt;Engage with other teams within your organization. Offer help and collaborate on cross-functional projects to broaden your impact.&lt;/li&gt;
&lt;/ul&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%2Fzh2nexhrfd6azq4cz6qm.gif" 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%2Fzh2nexhrfd6azq4cz6qm.gif" alt="ryan community service"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;You may not be "asked" to help your community at your job 🤣&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Proactive in Problem-Solving&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look beyond the immediate requirements of your tasks. Think about how your solutions can benefit other projects or future work.&lt;/li&gt;
&lt;li&gt;Develop a habit of thinking critically about the tools and processes you use. Propose and implement improvements that can save time, reduce errors, or enhance performance.&lt;/li&gt;
&lt;li&gt;Don’t wait for someone to assign you impactful work. Seek out opportunities to contribute meaningfully, even if it means stepping out of your comfort zone.
Sometimes you may have to rely on third party tools to identify problems in your processes. Tools like &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt; would let you spot issues in your software delivery. Now THAT is a senior dev move.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;strong&gt;Innovate and Improve&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stay updated with the latest trends and technologies in your field. Experiment with new tools and approaches that could benefit your projects.&lt;/li&gt;
&lt;li&gt;Think about scalability and maintainability in your work. Design systems and write code that can grow and evolve with the needs of the business.&lt;/li&gt;
&lt;li&gt;Encourage a culture of innovation within your team. Promote brainstorming sessions and hackathons to generate new ideas and solutions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⏫ To get to SDE2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start thinking strategically. Identify ways to make a significant impact on your team’s goals and the company's success. Look for patterns in your work and the work of your team, and suggest improvements that could benefit everyone. Most people aren't too good at this, so if you can pull this off it'll absolutely set you apart.&lt;/li&gt;
&lt;li&gt;Lead initiatives that drive innovation and improvement. Show that you can think creatively and come up with effective solutions. This might involve proposing new features, optimizing existing systems, or improving development processes.&lt;/li&gt;
&lt;li&gt;Champion new technologies or methodologies that can enhance productivity or quality. 🚀 Take the lead in integrating these technologies into your projects and mentoring others on their use.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Remember, levelling up from SDE1 to SDE2 and beyond is a journey. Focus on what you can control, seek feedback, and keep improving. Your growth as a developer is a combination of technical skills, productivity, collaboration, ownership, and impact. With dedication and effort, you'll not only level up but also enjoy the process of becoming a better engineer and a valuable team member. Game on! 🎮&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.: Senior engineers are good at identifying all kinds of problems that prevent their teams from delivering on time, without compromising on their output quality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some of them use tools like &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>career</category>
      <category>promotion</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Not 💩, here's how to write actually good commit messages (hint: It's not just adding commit-lint)</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Thu, 06 Jun 2024 10:01:04 +0000</pubDate>
      <link>https://forem.com/middleware/not-heres-how-to-write-actually-good-commit-messages-hint-its-not-just-adding-commit-lint-j2i</link>
      <guid>https://forem.com/middleware/not-heres-how-to-write-actually-good-commit-messages-hint-its-not-just-adding-commit-lint-j2i</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update build file&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixes dependency array&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix tests&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The most famous:&lt;/em&gt; &lt;strong&gt;Update README.md&lt;/strong&gt; (Thanks Github 🤦)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are... some spectacularly amazing commit messages that I've actually seen in the last month. 👀&lt;br&gt;
And... some of these are in our codebases too.&lt;br&gt;
A bit embarrassing. I know. 😅&lt;/p&gt;

&lt;p&gt;But this is not okay 🙅, and ideally I would want to rid the world of these.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  "Sure, whatever. I don't think anything will change even after reading this blog."
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;For anything to change, I need to &lt;strong&gt;convince&lt;/strong&gt; you that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This makes a real difference that YOU can feel or measure&lt;/li&gt;
&lt;li&gt;This makes a difference to someone else (which might be attributed to you later)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  "Okay, get on with it. What do I do, and what do I get from it?"
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well written commit messages have some obvious benefits:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. 🧑‍💻 Easier debugging&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git blame&lt;/code&gt; makes it super easy to understand why a change was introduced, and makes it easier to ask the author relevant questions about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git blame&lt;/code&gt;&lt;/strong&gt; isn't the first tool that's used during debugging, but for &lt;strong&gt;complex issues&lt;/strong&gt; related to business logic, it's a &lt;strong&gt;tool that comes into play&lt;/strong&gt; especially in medium to large sized companies. Some code simply evokes the question "Why was it written the way it was?" or "What purpose was this originally solving?". The answers to some questions don't lie in engineering, but in product decisions. And the author who wrote that has the best chance of knowing what decisions were involved.&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%2Fw3q6uby1ilrqoiixsds5.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%2Fw3q6uby1ilrqoiixsds5.png" alt="Context-less debugging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, &lt;code&gt;git blame&lt;/code&gt; will tell you the author of a commit even without the need for fancy messages. So why is this part of this blog post?&lt;/p&gt;

&lt;p&gt;Because how often do YOU as an author remember &lt;strong&gt;what a commit that you write 6 months ago was doing&lt;/strong&gt;? Especially when it has a commit message like "Refactor"? &lt;strong&gt;Tough luck right?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've seen more experienced devs write exceptionally helpful commit messages. I think some of them overdid it a little, but here's a rough example:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fix crash on login screen due to null pointer exception.

- Checks for null values before accessing user profile data
- Adds unit test to cover this scenario
- Issue linked: BUG-5678


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

&lt;/div&gt;
&lt;p&gt;Maybe it's a bit too much, but damn if it isn't obvious AF.&lt;br&gt;
Now when I need to debug an issue in this area, being able to &lt;code&gt;git blame&lt;/code&gt; for the author and context can be a lifesaver.&lt;br&gt;
&lt;em&gt;I say this with confidence because I used to be both on the giving and receiving side of this at Uber.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This has a serious added benefit which you might overestimate as you read this blog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saves time for you and your team, and reduces frustration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Debugging in the absence of context is PAIN.&lt;/strong&gt; It's not even the kind where you can say "What doesn't kill you, makes you stronger." Because it just frustrates you.&lt;/p&gt;

&lt;p&gt;You know it. Your team knows it. And that's why you try to understand who introduced "that bug" anyway and talk to them, only to find out they left the company 2 years ago. Good luck. 🤝&lt;/p&gt;

&lt;p&gt;With this, you're leaving behind a legacy that would &lt;strong&gt;make people remember you fondly&lt;/strong&gt; and wish they could work with you again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What if I use merge or squash commits?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Some people have strong opinions for or against them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All I'll say is, merge commits help to contain the context of a PR contained within a commit to a degree, but the individual commits themselves may not have much context associated with them if they are not well written.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And because a PR might involve a variety of dissimilar changes that work together to ship a feature, and the constituent changes might have their own context for being written that way, squashing them might effectively muddle all that context making it difficult to draw inference from the commit history.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;But perfectly functional software is written either way.&lt;/strong&gt; As long as you and your team agree that your way of merging PRs works for you with minimal issues, who I am I interfere?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. 🔍 Easier code reviews&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If your org doesn't care too much about making code reviews be painless and not make it feel like a chore, &lt;strong&gt;you need to share this with your people&lt;/strong&gt;:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/the-senior-engineers-guide-to-the-code-reviews-1p3b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Senior Engineer's Guide to Code Reviews&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#codereview&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Now, how do better commit messages help with code reviews?&lt;/p&gt;

&lt;p&gt;From &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware's&lt;/a&gt; analyzed data, an average PR in a mature codebase (active repo, past its setup phase) can be &lt;strong&gt;around 300 lines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's a lot of lines. And most of these changes are not happening in the same file. Neither should they. &lt;strong&gt;300 lines is on the upper end of a file being readable&lt;/strong&gt; (it's not a rule set in stone though).&lt;br&gt;
It's a near-guarantee that different kinds of changes are being shipped in these PRs that NEED to go together for the desired functionality to be shipped.&lt;/p&gt;

&lt;p&gt;If you can't make a smaller PR for any reason, &lt;strong&gt;you can make smaller commits&lt;/strong&gt; in the same PR. Make each commit contain the smallest piece of logically isolated change, such that the commit message can sufficiently explain what it contains. Because you don't want to write a commit message that's a paragraph long either, you'll need to  create a commit that's small enough that roughly 50-60 characters can explain what it's about.&lt;/p&gt;

&lt;p&gt;Now, the reviewer can &lt;strong&gt;review your PR commit by commit&lt;/strong&gt; without having to follow up with you for everything or wondering why something was written the way it was (if they do, they'll have to ask you [the author], you know? Do you really have much time for that?).&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%2Fmhchgf489srffox2x8nd.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%2Fmhchgf489srffox2x8nd.png" alt="Meaningful commit messages"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3. 🚀 Better release notes!&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Or if you're not generating "release notes" exactly, then it's still &lt;strong&gt;better documentation&lt;/strong&gt; of the history of your project!&lt;/p&gt;

&lt;p&gt;Github, specifically, also allows you to &lt;strong&gt;generate release notes&lt;/strong&gt; for your project automatically &lt;strong&gt;from your commits&lt;/strong&gt;. And release notes are seen by a LOT of people to get an idea of what fixes or features new releases contain.&lt;/p&gt;

&lt;p&gt;See the releases section of the &lt;a href="https://github.com/facebook/react/releases" rel="noopener noreferrer"&gt;React codebase&lt;/a&gt;, and see how many reactions each release note has!&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%2Fbbsdve9uyj84h3ajwevw.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%2Fbbsdve9uyj84h3ajwevw.png" alt="React release notes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clearly &lt;strong&gt;release notes matter to people&lt;/strong&gt;. And by writing well written commits, you're saving yourself effort from writing release notes.&lt;/p&gt;

&lt;p&gt;And finally...&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. 👥 Encourages better practices across the team&lt;/strong&gt;
&lt;/h3&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%2F5y102iefuj5xzm2pdu2s.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%2F5y102iefuj5xzm2pdu2s.png" alt="Use the force Luke"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When team members see the benefits of well-written commit messages, they are likely to follow suit. This can lead to a more disciplined approach to code commits across the entire team, encouraging a culture of clarity and precision. This is the kind of stuff that makes an &lt;strong&gt;SDE1 act think and act like an SDE2&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/middleware" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8758%2Ff9005c66-6f04-4fcf-b2be-e5b14298aaf0.png" alt="Middleware"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F254865%2F9eaccf4b-b8b4-4761-9040-bc986853a276.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/middleware/going-from-sde1-to-sde2-and-beyond-what-it-actually-takes-1cld" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Going from SDE1 to SDE2, and beyond! 🚀 What it actually takes.&lt;/h2&gt;
      &lt;h3&gt;Jayant Bhawal for Middleware ・ Jun 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#promotion&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Here's another example of such a commit:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Update permissions routing layer to handle subroutes independently.

- TKT-1234
- The permissions routing logic was previously coupled with its nested routes
- This change will allow you to move subroutes to any other parent route without also having to make any changes to how the permissions for that subroute are defined


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

&lt;/div&gt;
&lt;p&gt;In environments where multiple people work on the same project, consistent and detailed commit messages can align everyone's understanding and expectations, &lt;strong&gt;reducing potential conflicts&lt;/strong&gt; and misunderstandings, without needing as much time to block for context sharing.&lt;/p&gt;

&lt;p&gt;And of course, if you can be the champion of better commit messages in your team or organization, you'd love to get the credits for any benefits that brings, won't you? 👀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams that can work asynchronously, is a team that can work efficiently.&lt;/strong&gt; No one wants your teams to have bottlenecks on stuff like this. 👌&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;br&gt;
I really should have covered this earlier, but if you're convinced about the idea of using good commit messages and are using it in some form regularly, you might be ready to take the next step.&lt;/p&gt;

&lt;p&gt;The next step would be to have a standard way and structure of writing commits in your org. Adhering to standards can involve a bit of a friction in your experience, but it can prove to be fruitful in the long term.&lt;/p&gt;

&lt;p&gt;Presenting, &lt;a href="https://conventionalcommits.org/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;!&lt;br&gt;
Thanks &lt;a class="mentioned-user" href="https://dev.to/taosif7"&gt;@taosif7&lt;/a&gt; for reminding me of this!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/conventional-commits" rel="noopener noreferrer"&gt;
        conventional-commits
      &lt;/a&gt; / &lt;a href="https://github.com/conventional-commits/conventionalcommits.org" rel="noopener noreferrer"&gt;
        conventionalcommits.org
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The conventional commits specification
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ConventionalCommits.org&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://conventionalcommits.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9ea1e10c1ab914b1dd7da03303de38e18f5ae6ef43f47f63f844113f3340306d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e76656e74696f6e616c253230436f6d6d6974732d312e302e302d2532334645353139363f6c6f676f3d636f6e76656e74696f6e616c636f6d6d697473266c6f676f436f6c6f723d7768697465" alt="Conventional Commits"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This repo is the home of the Conventional Commits specification.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Repo Layout&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;We use &lt;a href="https://gohugo.io/" rel="nofollow noopener noreferrer"&gt;HUGO&lt;/a&gt; as static site generator, so we use the &lt;a href="https://gohugo.io/getting-started/directory-structure/" rel="nofollow noopener noreferrer"&gt;directory structure&lt;/a&gt; HUGO proposes.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Our implementation&lt;/h4&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;./content&lt;/code&gt;: contains all the versions of the specification.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./content/next/&lt;/code&gt;: contains the version of the specification (where all the changes SHOULD be made).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./content/**/index.[lang].md&lt;/code&gt;: contains the content of the specification, if a language is specified it's a translation.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;We'd love your help refining the language of this specification,
fixing typos, or adding more translations. Please don't hesitate
to send a pull request.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Adding a translation&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Create a new file in &lt;code&gt;./content/version/index.[lang].md&lt;/code&gt; using the hugo command &lt;code&gt;hugo new [version]/index.[lang].md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensure all files have the appropriate fields required (see others as an example)..&lt;/li&gt;
&lt;li&gt;Add the language to the &lt;code&gt;config.yaml&lt;/code&gt; file (see others as an example).&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Running project locally&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;There's a docker-compose.yml file ready that will help you to…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/conventional-commits/conventionalcommits.org" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Conventional Commits is a specification for writing great commits in a standardised way. There are many tools which rely on commits written following this spec which may be able to automate even more things for you in terms of release notes, feature updates, separation of commits/PRs by the nature of the work involved in them (such as refactors, chores, fixes, features, etc.).&lt;/p&gt;

&lt;p&gt;It's absolutely the next thing you should at least give a look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping this up
&lt;/h2&gt;

&lt;p&gt;Good commit messages have serious GAINS. 💪&lt;br&gt;
Gains for you, and the teams that you're a part of.&lt;/p&gt;

&lt;p&gt;Less time spent debugging, fewer frustration moments, better documentation, automatic release notes, etc.&lt;/p&gt;

&lt;p&gt;As a side-effect of all those improvements, you might even notice faster code deliveries, lesser wait time in reviews, fewer rework cycles!&lt;/p&gt;

&lt;p&gt;Go on! Take credit for all the efficiency improvements you introduced!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And see exactly how much of a gain it was for your teams by using a productivity intelligence tool, such as &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;!&lt;/em&gt; 🚀&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>programming</category>
      <category>git</category>
      <category>codereview</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Senior Engineer's Guide to Code Reviews</title>
      <dc:creator>Jayant Bhawal</dc:creator>
      <pubDate>Mon, 03 Jun 2024 11:03:42 +0000</pubDate>
      <link>https://forem.com/middleware/the-senior-engineers-guide-to-the-code-reviews-1p3b</link>
      <guid>https://forem.com/middleware/the-senior-engineers-guide-to-the-code-reviews-1p3b</guid>
      <description>&lt;h2&gt;
  
  
  Code reviews.
&lt;/h2&gt;

&lt;p&gt;You know how important they are.&lt;/p&gt;

&lt;p&gt;They are one of the pillars of getting reliable code out there.&lt;/p&gt;

&lt;p&gt;Yet, it’s one of those things you need to &lt;strong&gt;squeeze&lt;/strong&gt; out some time for in your super busy days.&lt;/p&gt;

&lt;p&gt;If you’re not reviewing code, you might as well ship landmines to your users because you never know when it’ll blow up. 🤷&lt;/p&gt;

&lt;p&gt;Obviously, you know that. You’re not here to be told “Hey! You should have code reviews! It’s a vital thing!”&lt;/p&gt;

&lt;h2&gt;
  
  
  My team already does reviews. Why should I care?
&lt;/h2&gt;

&lt;p&gt;Code reviews processes handled without care and diligence can have serious consequences.&lt;/p&gt;

&lt;p&gt;At one of my previous orgs, code reviews were often not done thoroughly, and hence needed multiple passes. They were also done by reviewers on the opposite ends of the earth! 🌏&lt;/p&gt;

&lt;p&gt;So addressing any comment took almost a whole day. And again, because the reviews would usually not be comprehensive the rework time on a PR would be in days for trivial things.&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%2Fuvws8nxa2kjdvx6034n1.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%2Fuvws8nxa2kjdvx6034n1.png" alt="Cycle time breakdown of a team"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“You can’t improve, what you don’t measure”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Often attributed to Peter Drucker, but I’ve not been able to actually find evidence for that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But it’s a statement I found to be profound in my experiences.&lt;/p&gt;

&lt;p&gt;I’ve made a case to my leadership in the past to make much needed organizational changes to enable all teams to have fewer inter-dependencies across time-zones to enable people to collaborate faster.&lt;/p&gt;

&lt;p&gt;I understand how difficult it can be to do so, but it’s even harder to get any change in motion without a solid data-backed reason for why it’s needed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S.: That’s part of why Dhruv &amp;amp; I started &lt;a href="https://www.middlewarehq.com/" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;. 🚀&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/middlewarehq" rel="noopener noreferrer"&gt;
        middlewarehq
      &lt;/a&gt; / &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;
        middleware
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ✨ Open-source DORA metrics platform for engineering teams ✨
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.middlewarehq.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Flogo.png" alt="Middleware Logo" width="300px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Open-source engineering management that unlocks developer potential&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/middlewarehq/middleware/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img alt="continuous integration" src="https://camo.githubusercontent.com/d72013fe354cb76bdb62fae188d011c4d1bce7723189bacad6cbde6387cf52e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6d6964646c657761726568712f6d6964646c65776172652f6275696c642e796d6c3f6272616e63683d6d61696e266c6162656c3d6275696c64267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="Commit activity per month" src="https://camo.githubusercontent.com/b694441288287fd6f4c8750f3887fcc6853aef9bfc84ee8a0e1e490a7633639a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;a href="https://github.com/middlewarehq/middleware/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img alt="contributors" src="https://camo.githubusercontent.com/15f7e201a0b0e240425157b1a7251f24a91dcd6b6bbec76af4ad66efda00eeba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732d616e6f6e2f6d6964646c657761726568712f6d6964646c65776172653f636f6c6f723d79656c6c6f77267374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44fae73fb8fb80dc9f5673dc4e1d0e57b1ac81da1166a70c8a5ce52bb39ed67f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617061636865253230322e302d707572706c652e7376673f7374796c653d666f722d7468652d6261646765266c6162656c3d6c6963656e7365" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/eab8dfd78113b2679d98f9f33a66e3a157276c68cc4cf3541fa1287f4dddb379/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6964646c657761726568712f6d6964646c65776172653f7374796c653d666f722d7468652d6261646765" alt="Stars"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mhq.link/oss-community" rel="nofollow noopener noreferrer"&gt;Join our Open Source Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/middlewarehq/middleware/blob/main/media_files/banner.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmiddlewarehq%2Fmiddleware%2Fraw%2Fmain%2Fmedia_files%2Fbanner.gif" alt="Middleware Opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is an open-source tool designed to help engineering leaders measure and analyze the effectiveness of their teams using the &lt;a href="https://dora.dev" rel="nofollow noopener noreferrer"&gt;DORA metrics&lt;/a&gt;. The DORA metrics are a set of &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="nofollow noopener noreferrer"&gt;four key values&lt;/a&gt; that provide insights into software delivery performance and operational efficiency.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: The frequency of code deployments to production or an operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: The time it takes for a commit to make it into production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Restore&lt;/strong&gt;: The time it takes to restore service after an incident or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: The percentage of deployments that result in failures or require remediation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#introduction" rel="noopener noreferrer"&gt;Middleware - Open Source&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/middlewarehq/middleware#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-installing-middleware" rel="noopener noreferrer"&gt;Installing Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/middlewarehq/middleware#-developer-setup" rel="noopener noreferrer"&gt;Developer Setup&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-using-gitpod" rel="noopener noreferrer"&gt;Using Gitpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-using-docker" rel="noopener noreferrer"&gt;Using Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-manual-setup" rel="noopener noreferrer"&gt;Manual Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#-how-we-calculate-dora-metrics" rel="noopener noreferrer"&gt;How we Calculate DORA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/middlewarehq/middleware#%EF%B8%8F-contributing-guidelines" rel="noopener noreferrer"&gt;Contributing guidelines&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Okay, I hear ya. What are my options?
&lt;/h2&gt;

&lt;p&gt;What you ideally want are code reviews that are done thoroughly, which is to say that obvious red flags, performance or security defects, or other hard-to-read code shouldn’t go unnoticed.&lt;/p&gt;

&lt;p&gt;But you also want all of this to happen in a reasonable amount of time.&lt;/p&gt;

&lt;p&gt;Well reviewed code merged in a reasonable amount of time, means your team's delivery predictably, and with high reliability.&lt;/p&gt;

&lt;p&gt;Only if there were a well researched, structured way of getting a grip on this. 🤔&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;Have you heard of… DORA metrics?&lt;/p&gt;

&lt;p&gt;Okay, this isn’t another one of “DORA GOOD!” articles.&lt;/p&gt;

&lt;p&gt;These are my experiences of how keeping an eye on the four-keys (as &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="noopener noreferrer"&gt;explained&lt;/a&gt; by the awesome &lt;a href="https://www.linkedin.com/in/nathen/" rel="noopener noreferrer"&gt;Nathen Harvey&lt;/a&gt;) helped me improve the code delivery experience for myself and my team in the past.&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%2Fb49lb17w68bs5fojske7.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%2Fb49lb17w68bs5fojske7.png" alt="DORA Metrics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DORA Metrics as seen on Middleware Open Source&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring Code Reviews with DORA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How Long Reviews Inflate Lead Time
&lt;/h3&gt;

&lt;p&gt;Long review cycles directly impact Lead Time for Changes.&lt;/p&gt;

&lt;p&gt;Lead time consists of basically 5 parts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Time from first commit to the PR being open&lt;/li&gt;
&lt;li&gt;Then the PR receiving its first review (could be a comment, change, approval)&lt;/li&gt;
&lt;li&gt;Time spent on making changes to the PR, till it’s finally approved&lt;/li&gt;
&lt;li&gt;Time between approval and the PR being merged&lt;/li&gt;
&lt;li&gt;Time when the PR was eventually deployed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Naturally, any of the parts taking time will inflate your team time. But there are 2 parts that are particularly egregious factors for delays here. That’s #2 and #3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#2. Time till the PR receives its first review (First Response Time)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the PR is open, a dev can’t really do much on it. The PR may be totally good to go! It may need solid changes. At this point, only a review will tell. This is also the point when a dev may not be able to pick up more tasks either because technically a review could happen at any time, and they would suffer from context switching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context switching is one of the biggest productivity killers for devs.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Misleading Focus on "Time per Review"
&lt;/h3&gt;

&lt;p&gt;This talks about the third sub-part of the Lead Time metric.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#3. Time spent on making changes to the PR (Rework Time)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real problem here isn’t stemming so much from how much time was spent here, but how many times back and forth happened. Let’s call that “Rework cycles”.&lt;/p&gt;

&lt;p&gt;Because if there was only 1 rework cycle because the PR was approved, then it could still have taken a long time before approval, but it was actual implementation time, not idle time. This kind of rework could be mitigated by better training, codebase onboarding, context sharing, etc.&lt;/p&gt;

&lt;p&gt;But… if you’re going back and forth a lot of times, then each of these cycles has some idle time associated with it, much like first response time.&lt;/p&gt;

&lt;p&gt;During this time, the dev can’t pick up new work, because that would inevitably result in rapid context switching.&lt;/p&gt;

&lt;p&gt;This is likely to happen when the PR is too large to review in one go, or the reviewer didn’t review thoroughly for other reasons. This is especially exacerbated when the author and reviewer are in far apart time-zones. Because each review, and rework is likely to happen during the work hours in their respective time-zones, inflating the time before the reworked changes can be checked into many many hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is a snow-ball effect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The more PRs get blocked like this, the slower the teams deliver. And often the new work doesn’t stop coming, so that makes it even more challenging for devs to manage and estimate their work accurately.&lt;/p&gt;

&lt;p&gt;If this keeps happening constantly, it also deals a blow to the morale of the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Focusing solely on reducing "time per review" can backfire.&lt;/p&gt;

&lt;p&gt;The goal should be to optimize the review process without sacrificing thoroughness, ensuring each review adds real value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subpar Reviews and Change Failure Rates
&lt;/h3&gt;

&lt;p&gt;Teams operate under pressure and tight deadlines all the time. And it’s unreasonable to expect that to magically change. But it’s also unrealistic to think that corners won’t be cut to ensure things don’t get shipped on time.&lt;/p&gt;

&lt;p&gt;Since we’re talking about code reviews, one of the corners that are cut often, are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Large PRs created that contain all the code for a feature instead of well contained smaller and easier to review PRs.&lt;/li&gt;
&lt;li&gt;PRs are reviewed by just skimming over them because the reviewer may just not have the mental capacity or time to deal with it properly at the moment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both of those things happen from time to time. Devs are humans too. You won’t solve this by just blaming it on them or strong-arming them into reviewing “properly”.&lt;/p&gt;

&lt;p&gt;The most important thing is for you to know that it’s happening in the first place. Because then you can do something about it. How would you know about it, you ask?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your Lead Time should be going down. Because reviews are being done faster (often than they should)&lt;/li&gt;
&lt;li&gt;Your Change Failure Rate might be going up. Of course, with subpar reviews you’re likely shipping more bugs.

&lt;ol&gt;
&lt;li&gt;But, even if your CFR isn’t going noticeably down, your team might still be shipping low performance or quality code that would bite you back later, and will likely show up as higher Lead Time down the line. But by then it’ll be too difficult to correlate with the reviews of today.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This is a good time to mention that DORA is a great guide, but it’s not perfect.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t treat it like a definitive rule-book. Don’t measure individuals against it.&lt;/p&gt;

&lt;p&gt;Use it holistically for your team, but also be involved to make sure it’s actually helping your team. That’s the goal after all, isn’t it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Great! How? 👉 Strategies for Faster, More Effective Reviews
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Here’s a quick &lt;strong&gt;pre-review checklist&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Tests: Ensure all relevant tests are written and passing ✅.

&lt;ol&gt;
&lt;li&gt;This can be done by a CI bot (or Github Actions)&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Documentation: Update relevant docs, including inline comments and README files.&lt;/li&gt;

&lt;li&gt;Clear Commit Messages: Write descriptive commit messages that explain the 'why' behind changes.

&lt;ol&gt;
&lt;li&gt;This could also be enforced via &lt;a href="https://commitlint.js.org/" rel="noopener noreferrer"&gt;commit-lint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You could also use &lt;a href="https://github.com/Nutlope/aicommits" rel="noopener noreferrer"&gt;aicommit&lt;/a&gt; to help write good and detailed commit messages!&lt;/li&gt;
&lt;li&gt;My team often uses GH Copilot to create commit messages that actually end up being totally satisfactory to me!&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Example commit message:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;feat: add user authentication&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Implemented OAuth2 for secure login&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added unit tests for authentication flows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updated API documentation with new endpoints&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Right Reviewer, Right Time&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;Match reviewers to their expertise and current workload to avoid overload. Complex changes go to senior devs, simpler ones to peers.&lt;/p&gt;

&lt;p&gt;But you also need to be aware of how much context a dev has of a specific codebase.&lt;/p&gt;

&lt;p&gt;There’s a few challenges here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your devs are highly specialized within singular specific repos, then it’ll be pretty difficult to use their skills on a separate codebase simply due to the required time to onboard and share context.&lt;/li&gt;
&lt;li&gt;If your devs are too generalized over all codebases, it might be difficult for them to solve certain issues faster due to a lack of deep context of specific codebases.&lt;/li&gt;
&lt;li&gt;If one of the devs on the team has a lot of context about things, it’s super easy to overburden them. You need to make time to distribute context sooner than later, so your work doesn’t get blocked at a time when it’s most critical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You want to ensure you have a mix of both, and that could be achieved with as few as 2-3 devs that you work with.&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%2Fva7uc3ajyb17kiamhq0h.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%2Fva7uc3ajyb17kiamhq0h.png" alt="Visualizing bottlenecks in a team"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Understanding who gets blocked on whom for code reviews is crucial. You don’t want your team to not deliver at all because someone needed to be on leave.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools of the Trade
&lt;/h3&gt;

&lt;p&gt;Use static analysis, code linting, and automated checks to catch simple issues before human review. This lets reviewers focus on more complex feedback.&lt;/p&gt;

&lt;p&gt;Example Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;: JavaScript linting.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt;: For running pre-commit checks and static analysis.&lt;/li&gt;
&lt;li&gt;CI/CD Pipelines: Automated testing and build processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Super important tip:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s easy to lose a LOT of time arguing over spaces and tabs, semicolons or not, trailing newlines.&lt;/p&gt;

&lt;p&gt;But all that doesn’t matter.&lt;/p&gt;

&lt;p&gt;Decide on, and agree with whatever code-style the team finalizes, and enforce them as part of the linter rules.&lt;/p&gt;

&lt;p&gt;This stuff isn’t worth your time. 👍&lt;/p&gt;

&lt;h3&gt;
  
  
  The Art of Feedback
&lt;/h3&gt;

&lt;p&gt;Give actionable, specific comments that focus on improvement, not nitpicking. Avoid vague statements and offer clear guidance.&lt;/p&gt;

&lt;p&gt;Share how a file could have been restructured into multiple, along with why doing that is a good idea.&lt;/p&gt;

&lt;p&gt;Share why making that DB call multiple times in a loop might be a bad idea because of reasons I’m sure I don’t need to explain here. 😆&lt;/p&gt;

&lt;p&gt;If the nitpicks are largely things that could have been handled by a linter, then use one of those.&lt;/p&gt;

&lt;p&gt;People hate reviews that mostly have only nits. But again, poor variable names, typos, etc. can’t just go to prod! 😁&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;h1&gt;
  
  
  Ineffective comment
&lt;/h1&gt;

&lt;p&gt;"Fix this."&lt;/p&gt;
&lt;h1&gt;
  
  
  Effective comment
&lt;/h1&gt;

&lt;p&gt;"Consider using a map here to improve lookup efficiency. This will reduce the time complexity from O(n) to O(1)."&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Streamlining the Process with Middleware&lt;br&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How Middleware Helps
&lt;/h3&gt;

&lt;p&gt;I’m able to see specifically where my teams get stuck, why, and how I can unblock them.&lt;/p&gt;

&lt;p&gt;That’s kind of half of my job, and now I’m able to do this stuff a lot faster than before!&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%2Fyl0k380fegaussrrckyd.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%2Fyl0k380fegaussrrckyd.png" alt="Process overview of a team"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Here’s a few things I focus on:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Review Metrics: Track how long reviews take and identify where delays occur.&lt;/li&gt;
&lt;li&gt;Process Insights: Gain visibility into the entire review process and find areas for optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I won’t get too much into that because then it’ll sound like a sales pitch! 😂&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Technicalities: The Human Element
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fostering a Culture of Constructive Feedback
&lt;/h3&gt;

&lt;p&gt;Promote a culture where feedback is seen as a growth opportunity. Constructive, respectful communication helps improve code quality and team morale 💬.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balancing Speed with Thoroughness
&lt;/h3&gt;

&lt;p&gt;Balance speed with thoroughness. Quick reviews shouldn't compromise scrutiny, and thorough reviews shouldn't drag on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Psychological Safety
&lt;/h3&gt;

&lt;p&gt;Ensure psychological safety for both reviewers and authors. Encourage open discussions and address mistakes without blame, fostering an environment of continuous improvement 🌱.&lt;/p&gt;

&lt;p&gt;Remember, people often go guards-up when you’re sharing feedback for improvement. Be considerate, and clear.&lt;/p&gt;

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

&lt;p&gt;Effective code reviews are crucial for maintaining code quality and delivery speed. By aligning with DORA metrics, using the right tools, and fostering a constructive feedback culture, teams can streamline their review processes. Embrace these practices to make your code reviews both efficient and impactful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try &lt;a href="https://www.middlewarehq.com/" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt; to gain deeper insights into your code review processes and identify areas for further improvement. 🚀&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Again these are just guidelines and how we look at code reviews. Do share how code reviews are done in your organization!&lt;/p&gt;

&lt;p&gt;Code reviews play a vital role in overall product reliability. There are instances of bad code reviews (not lousy code!) causing negative brand impact. To sum up, better code review processes contribute to less failure rate. &lt;/p&gt;

&lt;p&gt;Frameworks like &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;DORA&lt;/a&gt; are designed to be light-weight to help the engineering team be productive without too much effort from engineers or even leaders. We at Middleware are on a mission to help engineering teams ship productive code. Do check out our &lt;a href="https://github.com/middlewarehq/middleware" rel="noopener noreferrer"&gt;Middleware open-source&lt;/a&gt;, our open-source DORA metrics solution, that is locally hostable. Consider giving us a star if you like it!&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>productivity</category>
      <category>learning</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
