<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jonathan Irvin</title>
    <description>The latest articles on DEV Community by Jonathan Irvin (@offendingcommit).</description>
    <link>https://dev.to/offendingcommit</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%2F86100%2Fe09c5463-f058-4520-abcb-3c8b56f249c5.png</url>
      <title>DEV Community: Jonathan Irvin</title>
      <link>https://dev.to/offendingcommit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/offendingcommit"/>
    <language>en</language>
    <item>
      <title>chore(dev.to): change to offendingcommit</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Fri, 19 Apr 2024 17:16:38 +0000</pubDate>
      <link>https://dev.to/offendingcommit/choredevto-change-to-offendingcommit-63l</link>
      <guid>https://dev.to/offendingcommit/choredevto-change-to-offendingcommit-63l</guid>
      <description>&lt;p&gt;Time to retire my old handle and continue with my new handle. &lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Transitioning from Frontend Engineer to DevOps Engineer: Four Questions to Streamline Processes</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Thu, 16 Mar 2023 15:05:15 +0000</pubDate>
      <link>https://dev.to/offendingcommit/transitioning-from-frontend-engineer-to-devops-engineer-four-questions-to-streamline-processes-1a5l</link>
      <guid>https://dev.to/offendingcommit/transitioning-from-frontend-engineer-to-devops-engineer-four-questions-to-streamline-processes-1a5l</guid>
      <description>&lt;p&gt;As a Frontend Engineer turned DevOps Engineer, I've learned the importance of optimizing team productivity and efficiency. But let's face it, DevOps is not just about mean time to recovery or continuous integration pipelines, it's about making work fun and playful. So, in collaboration with my colleague Karl Monney, we've come up with four simple questions that will help streamline processes and keep things playful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What's your endgame, and how does this task fit in?
&lt;/h3&gt;

&lt;p&gt;Tell me what you want to achieve with this task and how it fits into your grand scheme of things. It's like playing a game of chess. We need to know your strategy so we can help you execute your moves.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What can you offer to speed things up?
&lt;/h3&gt;

&lt;p&gt;We know you're busy, and so are we. So, let's make things more efficient. What do you have that can help us get the job done faster? Screenshots, links, or code snippets, you name it. If you want it fast, give us the tools to do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. How is this affecting you right now, and how can it help us establish priorities with our own work?
&lt;/h3&gt;

&lt;p&gt;We get it. You're under pressure, and we don't want to add to it. So, tell us how this task is impacting you right now, and we'll make sure it gets done with the urgency it deserves. Not only does this help us understand your pain points, but it also helps us establish priorities with our own work. We want to make sure that we're addressing the most critical issues first, so your feedback is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How will you know when it's done?
&lt;/h3&gt;

&lt;p&gt;It's all about setting clear expectations. So, let us know what "done" means to you, and we'll make sure to hit the mark. We want you to feel confident that when we say it's done, it's done.&lt;/p&gt;

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

&lt;p&gt;These four questions are easy to use and will keep things playful while helping us streamline processes, establish priorities, and define completion criteria. Whether you're a designer, developer, or a DevOps engineer, these questions can be used by anyone, anytime, anywhere. So, let's get playful and make work fun again!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>agile</category>
      <category>kanban</category>
    </item>
    <item>
      <title>What kind of Git Workflow does an elephant use?</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Thu, 09 Jun 2022 14:20:02 +0000</pubDate>
      <link>https://dev.to/offendingcommit/what-kind-of-git-workflow-does-an-elephant-use-47pl</link>
      <guid>https://dev.to/offendingcommit/what-kind-of-git-workflow-does-an-elephant-use-47pl</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trunk-based development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>dadjokes</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Removing Git Branch Bloat</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Mon, 06 Jun 2022 16:01:14 +0000</pubDate>
      <link>https://dev.to/offendingcommit/removing-git-branch-bloat-6eb</link>
      <guid>https://dev.to/offendingcommit/removing-git-branch-bloat-6eb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If you have too many Git branches, bookmark and like this page.&lt;/p&gt;

&lt;p&gt;Note: You'll see &lt;code&gt;"(^*|master|main|develop|release)"&lt;/code&gt; a lot in the below scripts. This is a regular expression that excludes those long-lived branches so those won't be considered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To &lt;strong&gt;list&lt;/strong&gt; all &lt;strong&gt;local&lt;/strong&gt; branches that have been merged into the current branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch --merged | egrep -v "(^*|master|main|develop|release)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To &lt;strong&gt;list all branches&lt;/strong&gt; that have been merged into the current branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -r --merged | egrep -v "(^*|master|main|develop|release)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To &lt;strong&gt;PURGE&lt;/strong&gt; all &lt;strong&gt;local&lt;/strong&gt; branches that have been merged into the current branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch --merged | egrep -v "(^*|master|main|develop|release)" | xargs git branch -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STOP!
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Be very, VERY certain you know what you are doing. This following command modifies the shared repo and unless there is a perfect clone, it has the potential to remove branches that people don’t have a reference to. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To &lt;strong&gt;PURGE&lt;/strong&gt; all &lt;strong&gt;REMOTE&lt;/strong&gt; branches that have been merged into the current branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch --merged | egrep -v "(^*|master|main|develop|release)" | xargs git push --delete origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git Anti-patterns</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Mon, 06 Jun 2022 15:47:06 +0000</pubDate>
      <link>https://dev.to/offendingcommit/git-anti-patterns-1ean</link>
      <guid>https://dev.to/offendingcommit/git-anti-patterns-1ean</guid>
      <description>&lt;p&gt;Git has ENORMOUS flexibility. It can sometimes (always) be intimidating.  So much so, there are &lt;a href="https://dev.to/t/git"&gt;countless&lt;/a&gt; articles on "this is better than THAT".  Don't worry, this won't be one of those articles. &lt;/p&gt;

&lt;p&gt;I'm here to air out some dirty laundry. You know, the &lt;em&gt;anti-patterns&lt;/em&gt;. The stuff that makes us cringe. The cautionary tales.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncreative
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Same Commit Message, Different Day
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fb14c9 updates
1fcf56 updates
0e2506 updates
970bc6 updates
ae3aaf updates
2e3aa6 updates
e62616 updates
d5a520 updates
c3a77d updates
b9fba4 updates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Deal With It Later
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Branches for DAYS, weeks, ...months...years?
&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%2Flmn2tl7g2s7pqjmoihfe.png" alt="Too Many Branches" width="800" height="323"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Silo
&lt;/h2&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%2Ffza0j05m9ochtwdi7dle.png" 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%2Ffza0j05m9ochtwdi7dle.png" alt="84 years since you pulled down develop" width="500" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One Commit To Rule Them All
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You keep force pushing the same commit with different changes&lt;/li&gt;
&lt;/ul&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%2Ff3zwqg3lpvypbzcjlc9m.png" 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%2Ff3zwqg3lpvypbzcjlc9m.png" alt="wait you guys make unique commits" width="602" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Squashing is for posers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't like squashing your commits
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fb14c9 it works
1fcf56 trying something else
0e2506 fixes
970bc6 reply to pr
ae3aaf it doesn't work
2e3aa6 it works again
e62616 something is broken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I’m on TikTok now</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Mon, 30 May 2022 13:51:10 +0000</pubDate>
      <link>https://dev.to/offendingcommit/im-on-tiktok-now-56a9</link>
      <guid>https://dev.to/offendingcommit/im-on-tiktok-now-56a9</guid>
      <description>&lt;p&gt;&lt;a href="https://tiktok.com/@offendingcommit"&gt;https://tiktok.com/@offendingcommit&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I’m posting content related to git, adhd, programming, relatable, Q&amp;amp;A, tips and tricks, and some random stuff that gives me dopamine.&lt;/p&gt;

</description>
      <category>tiktok</category>
      <category>selfpromotion</category>
      <category>socialmedia</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Let's get one thing straight: Code is read by humans, interpreted by machines</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Fri, 20 May 2022 18:51:05 +0000</pubDate>
      <link>https://dev.to/offendingcommit/lets-get-one-thing-straight-code-is-read-by-humans-interpreted-by-machines-4pnm</link>
      <guid>https://dev.to/offendingcommit/lets-get-one-thing-straight-code-is-read-by-humans-interpreted-by-machines-4pnm</guid>
      <description>&lt;p&gt;It doesn't matter how eloquent your code is or how you turned a bunch of code into a one-liner. If you are the only one who can read the code, have someone else go find a manager or executive...because it's their problem now.&lt;/p&gt;

&lt;p&gt;Spell. Out. Your. Code.&lt;/p&gt;

&lt;p&gt;Make it readable. Add comments, abstract it out into functions that read like a sentence.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, humans have to maintain it. Machines interpret it. So as long as the logic is sound, make it easy and pleasant to read.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>It's OK To Be Replaceable</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Thu, 19 May 2022 15:34:15 +0000</pubDate>
      <link>https://dev.to/offendingcommit/its-ok-to-be-replaceable-30dc</link>
      <guid>https://dev.to/offendingcommit/its-ok-to-be-replaceable-30dc</guid>
      <description>&lt;p&gt;You might come across some articles on the web about how you should be "irreplaceable" to your team. We tend to put ourselves in positions where we are the only one who can do X, Y, or Z. The whole operation comes crashing down without us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm here to tell you that is a big ol' lie.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The truth is this: your employer can drop you at the blink of an eye. Obviously, no one wants to lose their job and I'm not talking about the loss of gainful employment here.  What I &lt;em&gt;am&lt;/em&gt; talking about is being in a position where your team can pick up where you left off.&lt;/p&gt;

&lt;p&gt;Silos happen purely out of convenience and herein lies the situation. Management tends to "stick with what works" and put the best people on the tasks that would be best suited for them. What people don't realize is you can gain more dividends by putting someone &lt;em&gt;else&lt;/em&gt; on the task that would get you 85% of the way there and let the person who you would normally assign the task to provide some feedback.  Now you have two people who can do the task.&lt;/p&gt;

&lt;p&gt;So, what &lt;em&gt;if&lt;/em&gt; you've dug yourself into the trench of reliability? Well, guess what? You're probably inundated with emails, IMs, meetings, Slack messages, PagerDuty ... the list goes on. Those are obviously plentiful, but what isn't is your mental health or your freedom to take PTO.&lt;/p&gt;

&lt;p&gt;The answer? Knowledge management.&lt;/p&gt;

&lt;p&gt;Write documentation, record videos, loop people in on what you know. Explain. Educate. Powerpoint. If you're the Primary on something, tag someone to be your padawan and show them the ways of the Force. You get the idea. Stop holding the cards close to your chest.&lt;/p&gt;

&lt;p&gt;Trust me. You're valuable with what you already know. Sharing doesn't make you any less valuable or put you at any more risk of getting canned. If you're at risk of getting canned, I guarantee it wasn't this article and you likely deserve better employment anyway.&lt;/p&gt;

&lt;p&gt;Think about it. We would never have the beautiful works of art from famous painters and sculptors if they never expressed what they know. The same applies to technology. Just because you know something and the other teammate doesn't, means that you have to be available more to do the same task. &lt;/p&gt;

&lt;p&gt;Delegate. Educate. Disseminate. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>What's your Git Personality?</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Thu, 16 Dec 2021 15:56:31 +0000</pubDate>
      <link>https://dev.to/offendingcommit/whats-your-git-personality-46np</link>
      <guid>https://dev.to/offendingcommit/whats-your-git-personality-46np</guid>
      <description>&lt;h2&gt;
  
  
  The Git Slinger
&lt;/h2&gt;

&lt;p&gt;You're the fastest committer this side of the stack.  You are speed. You put forth Pull Requests with no less than 25 commits and it only took you a day.  Who needs rules about formatting when you commit like it's a Yahoo chatroom in the 90s.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Silo
&lt;/h2&gt;

&lt;p&gt;MY PRECIOUS!  You hoard your commits and only those that are worthy get pushed.  No one sees your true commits, only the ones you absolutely have to let loose into the wild.  Your local repo is filled with commits and branches that will never see the light of another repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Re-Re-Rebaser
&lt;/h2&gt;

&lt;p&gt;You like to play fast and loose with git commits. Who cares if they get rewritten.  Merges are for losers and that's not you. You rebase everything, even your thoughts.  Why merge when you can just replay 30 commits on top of master. Conflicts be damned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ancient One
&lt;/h2&gt;

&lt;p&gt;Your commits are based off of a release that no one has seen for months. You've been working off of the same branch and when you go to submit a pull request, you're shocked to learn you have so many merge conflicts.  The team groans at sorting out the mess you've made.  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Go-With-The-Git-Flow
&lt;/h2&gt;

&lt;p&gt;Ok, so bugfix branches are branched off of and merge into release branches. Feature branches get merged to develop. Releases di-merge into develop and master. Hotfix branches only branch off of master.  The answer: MORE BRANCHES.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Singularity
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docs: git commits should be read by machines, not humans [skip-ci]&lt;/code&gt; &lt;br&gt;
&lt;code&gt;feat(dev.to): add emoji to commits to prove sentience :heart:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Slides into the CI/CD server's DMs&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;hey girl, heyyyyy! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Well, Actually...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Well, actually, git commits are like emails with a subject line and a body, but the subject line is most important.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Well, actually, git commits should be no more than 50 characters, any more than that is just wasteful&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Well, actually, rebasing is better than merging...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Well, actually, the best git workflow is...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choose your own!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add your own personality in the comments!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>fun</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>If you're going to use a poor commit message, just git rebase -i instead</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Thu, 16 Dec 2021 15:32:16 +0000</pubDate>
      <link>https://dev.to/offendingcommit/if-youre-going-to-use-a-poor-commit-message-just-git-rebase-i-instead-37dn</link>
      <guid>https://dev.to/offendingcommit/if-youre-going-to-use-a-poor-commit-message-just-git-rebase-i-instead-37dn</guid>
      <description>&lt;h2&gt;
  
  
  We've all been there.
&lt;/h2&gt;

&lt;p&gt;Panic commits. You've spent HOURS on a problem only to solve it at the end of your day. The end of your sanity.&lt;/p&gt;

&lt;p&gt;You know you want to save your work and commit it, but you've done so much brain-mashing that the eloquent commit message you had hours ago is lost to a sea of fog and quick-hacks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;it works.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before you push, let's take a beat here.&lt;/p&gt;

&lt;p&gt;Maybe you are trying some things and a rapid commit-cycle is more your style. You are a &lt;em&gt;git-slinger&lt;/em&gt;. Pew pew pew!&lt;/p&gt;

&lt;p&gt;You arrive at the same destination as above.  Before you push, let's take a moment to reflect on your last N commits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit rebase -i HEAD~{{number of commits you've done}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://dev.to/sublimegeek/do-your-commits-pass-this-simple-test-4ak2"&gt;As you know&lt;/a&gt;, I'm &lt;strong&gt;vehemently against&lt;/strong&gt; rebasing &lt;strong&gt;public&lt;/strong&gt; commits, but if it hasn't been pushed yet, the world is your oyster.&lt;/p&gt;

&lt;p&gt;So, a &lt;code&gt;rebase&lt;/code&gt; stacks the group of commits on top of your new "base" point, in which case, it's the commit you chose above.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HEAD&lt;/code&gt; is the &lt;em&gt;latest&lt;/em&gt; commit and the number of commits before that selects the right ancestor.  I know, it's some Marty McFly shit.&lt;/p&gt;

&lt;p&gt;An interactive rebase gives you the ability to squash commits into each other (basically summating the changes into a single commit), reorder them, change their commit messages, and many more options.&lt;/p&gt;

&lt;p&gt;In short, you can clean up that disaster you committed trying to solve that one thing by that one date.&lt;/p&gt;

&lt;p&gt;Let me close by saying this one important thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be careful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Rebasing&lt;/strong&gt; rewrites your git history.  You can lose work if you aren't careful.  When in doubt, just squash all of your commits instead of removing or reordering them until you get more comfortable with the operation.&lt;/p&gt;

&lt;p&gt;For more about rebasing, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-rebase"&gt;https://git-scm.com/docs/git-rebase&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like my git posts, check out &lt;a href="https://dev.to/sublimegeek/git-staging-area-explained-like-im-five-1anh"&gt;https://dev.to/sublimegeek/git-staging-area-explained-like-im-five-1anh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dynamically Create Jenkins Executors Using Docker</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Wed, 15 Dec 2021 20:42:07 +0000</pubDate>
      <link>https://dev.to/offendingcommit/dynamically-create-jenkins-executors-using-docker-51ga</link>
      <guid>https://dev.to/offendingcommit/dynamically-create-jenkins-executors-using-docker-51ga</guid>
      <description>&lt;p&gt;Jenkins is great until you run out of executors and are waiting on other jobs to finish before you get to run yours.&lt;/p&gt;

&lt;p&gt;Inspired by and based off of &lt;a href="https://devopscube.com/docker-containers-as-build-slaves-jenkins/"&gt;https://devopscube.com/docker-containers-as-build-slaves-jenkins/&lt;/a&gt; I created a simple docker image that uses Volta to install NodeJS so I can farm jobs to a pool of docker containers that dynamically provision and disappear as needed when jobs complete.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jonathan-irvin"&gt;
        jonathan-irvin
      &lt;/a&gt; / &lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs"&gt;
        jenkins-docker-nodejs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Run Jenkins jobs that require Node.js in a container using a Docker cloud so you can dynamically allocate executors instead of having to provision new ones each time
    &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;jenkins-docker-nodejs&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs/actions/workflows/docker-publish.yml"&gt;&lt;img src="https://github.com/jonathan-irvin/jenkins-docker-nodejs/actions/workflows/docker-publish.yml/badge.svg" alt="Docker Image CI (Publish)"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Runs Jenkins agent in a docker container with different versions of NodeJS to easily build those projects you have in an ephemeral way instead of setting up individual jenkins executors.  This allows you to run several jobs at once with minimal resources in a much more controlled way.&lt;/p&gt;
&lt;p&gt;Job runs nightly and on pushes to main to refresh the packages.&lt;/p&gt;
&lt;p&gt;Node LTS Docker Container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs/pkgs/container/jenkins-docker-nodejs"&gt;jenkins-docker-nodejs:12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs/pkgs/container/jenkins-docker-nodejs"&gt;jenkins-docker-nodejs:14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs/pkgs/container/jenkins-docker-nodejs"&gt;jenkins-docker-nodejs:16&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Latest Node Version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jonathan-irvin/jenkins-docker-nodejs/pkgs/container/jenkins-docker-nodejs"&gt;jenkins-docker-nodejs:latest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inspired by and based off of &lt;a href="https://devopscube.com/docker-containers-as-build-slaves-jenkins/" rel="nofollow"&gt;https://devopscube.com/docker-containers-as-build-slaves-jenkins/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jonathan-irvin/jenkins-docker-nodejs"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>docker</category>
      <category>jenkins</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>Test Optimized Development</title>
      <dc:creator>Jonathan Irvin</dc:creator>
      <pubDate>Tue, 05 Oct 2021 15:30:38 +0000</pubDate>
      <link>https://dev.to/offendingcommit/test-optimized-development-ia9</link>
      <guid>https://dev.to/offendingcommit/test-optimized-development-ia9</guid>
      <description>&lt;p&gt;As devs, we’re taught to write tests first, then refactor until the tests pass. This is difficult if you don’t know your design first and frustrating if you have the functionality, but the tests aren’t passing.&lt;/p&gt;

&lt;p&gt;Which is why, if you write your code to where it can be tested easily, everyone wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Functional Programming vs. Class-based components
&lt;/h2&gt;

&lt;p&gt;The concept is not new. Writing functions vs. classes is much more efficient. While you can easily instantiate a class and have everything you need, they are hard to test when it comes to React. Breaking just about everything into functions and utilities allows your code to be tested with ease and code coverage is boiled up using abstract methods vs complex classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maps, ForEach, other loopy things? Use a function for that, too.
&lt;/h2&gt;

&lt;p&gt;Unless the operation is super simple, define a named function for what happens within a map() or forEach() loop which can be isolated and tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quality over Quantity
&lt;/h2&gt;

&lt;p&gt;It’s super easy to pad code coverage these days. Just test to see if something mounts without breaking and tada! You’ve got super high code coverage…but what did you test, really? TOD expects that your tests should be value over volume. If you have a lot of code that flows through a small area or maybe you already have methods that are shared throughout your code base. Start there. If there’s one small break in that code, it will wreck the most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quality Multiplied
&lt;/h2&gt;

&lt;p&gt;Now that we a test that adds value over volume, what other scenarios can we throw at it. Don’t settle for just one scenario. Cover multiple. Got several test cases you want to iron out? Write a function for it and make your tests DRY.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>react</category>
      <category>opinion</category>
    </item>
  </channel>
</rss>
