<?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: Paul Cullen Rowe</title>
    <description>The latest articles on DEV Community by Paul Cullen Rowe (@prowe214).</description>
    <link>https://dev.to/prowe214</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%2F116479%2F7ad852eb-4d8e-4b4e-87f4-0fe845460f2d.jpg</url>
      <title>DEV Community: Paul Cullen Rowe</title>
      <link>https://dev.to/prowe214</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prowe214"/>
    <language>en</language>
    <item>
      <title>Onboard New Developers Faster With This Guide</title>
      <dc:creator>Paul Cullen Rowe</dc:creator>
      <pubDate>Thu, 14 Oct 2021 14:02:12 +0000</pubDate>
      <link>https://dev.to/prowe214/onboard-new-developers-faster-with-this-guide-2alk</link>
      <guid>https://dev.to/prowe214/onboard-new-developers-faster-with-this-guide-2alk</guid>
      <description>&lt;p&gt;Are you tired of having to hold every new developer’s hand and watching them struggle to get up to speed with your team?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.method.com/insights/company-onboarding-from-a-distance/"&gt;Onboarding new teammates&lt;/a&gt; should be fun and easy, for everyone involved.&lt;/p&gt;

&lt;p&gt;I've lost track of how many developers I've onboarded to my engineering teams. Though important, this process is very often a pain point that sucks time away from my day-to-day responsibilities. Or at least that was the case until I created the “Zero to Deployed” guide for our team. This guide has streamlined the onboarding process so that both existing and new team members can complete necessary training and get up to speed as quickly as possible. That way, onboarding transforms from a drain on resources to a streamlined process that allows everyone to focus on their primary responsibilities in a timely fashion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Zero To Deployed" Guide
&lt;/h2&gt;

&lt;p&gt;The “Zero to Deployed” guide walks a new dev through every single, tiny step from the moment they open their laptop until the moment they deploy a feature. We write it with deep detail so that a junior developer can follow the steps without asking for help.&lt;/p&gt;

&lt;p&gt;We immediately saw this pay off — our onboarding time (for us, this spans the moment new hires open their laptops until the moment they create a PR) went from one to two weeks down to two to three days. The process also involved significantly less hands-on assistance from team leads. We then broadened the guide to apply to all engineering teams across our organization, and the benefits immediately scaled.&lt;/p&gt;

&lt;p&gt;Below, you can find a rough outline of what we include, how detailed we get, and you can use this as a template to develop your own version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beyond The "Zero To Deployed" Guide
&lt;/h3&gt;

&lt;p&gt;Before we look at the guide itself, however, we need to consider a few important ancillary documents. After all, there's more to your codebase than just the setup. So, we include some other complementing documents with the guide itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Core Concepts Onboarding&lt;/li&gt;
&lt;li&gt;Rules and Guidelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;Core Concepts Onboarding&lt;/strong&gt; is a high-level overview of the tools in your product and the main components of the applications. The aim with this document is not to be exhaustive, but just to give the new team member enough context and guidance to be productive. For example, it might include what a fully-baked React Component usually looks like, how our app uses some crucial library, how our app interacts with other apps/services, and the main features of our application (or suite of applications) to name a few items.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Rules and Guidelines&lt;/strong&gt; set the practices and standards for the codebase, acting as a how-to guide for the code that we write. For example, this document details our git management strategy and merging rules, our rules around redux patterns, &lt;a href="https://www.method.com/insights/writing-user-focused-tests-with-react-testing-library/"&gt;unit testing guidelines&lt;/a&gt;, code style rules, and &lt;a href="https://prowe214.medium.com/the-code-review-checklist-3b538194786b"&gt;things to look out for during code review&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These can all be compiled into one document or spread out over many smaller ones. The important thing is that the guide is easy to reference and clearly teaches your new teammates how to write code in your repository. It also helps if you can create links directly to certain content in these documents (with header anchors or separate pages) so you can easily share relevant information later during code reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintaining the Guide
&lt;/h3&gt;

&lt;p&gt;Every time we onboard a new developer, we also give them the power to edit the guide. As time goes on, steps change, and it may come to contain outdated information or be missing new material. The new team member is responsible for finding the new information and updating the guide so that future developers don't run into this same roadblock. This is usually the only time that managers are required for assistance in order to find that information, and becomes an increasingly rare occurrence as the guide matures.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Example "Zero To Deployed" Guide
&lt;/h2&gt;

&lt;p&gt;Here's a high-level example of our Zero To Deployed Guide, so you can understand and create one for your own team.&lt;/p&gt;

&lt;p&gt;Note: In our real guide, each bullet point includes detailed commands, instructions, and examples for successfully performing that step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev Setup
&lt;/h3&gt;

&lt;p&gt;Figuring out the best environment for developing our app usually matures with time, as we discover which tools most effectively help our development process.  We can fast-forward this discovery experience for our new teammates by explicitly walking them through setting up every tool that has been making us productive for so long.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What logging into your computer for the first time involves

&lt;ul&gt;
&lt;li&gt;Step-by-step instructions for getting logged in, and what applications you need to log into&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;(If needed) How to request access permissions for software/environments&lt;/li&gt;
&lt;li&gt;When you open your computer, install &amp;lt;these things&amp;gt;, using &amp;lt;these commands&amp;gt;

&lt;ul&gt;
&lt;li&gt;Homebrew, git, etc.&lt;/li&gt;
&lt;li&gt;VSCode, Postman, Chrome, etc.

&lt;ul&gt;
&lt;li&gt;Required and recommended extensions for each app&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clone the repo, then install dependencies

&lt;ul&gt;
&lt;li&gt;Step-by-step guide for cloning, setting up git credentials, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How to Run the app

&lt;ul&gt;
&lt;li&gt;Include main flows for them to experience to validate that their application is running smoothly&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Building a Feature
&lt;/h3&gt;

&lt;p&gt;Every development team has a different process for taking a feature from ticket to merged code.  Here, we set up a step-by-step walkthrough of this process, and what to expect as they reach each step.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to Create a feature branch

&lt;ul&gt;
&lt;li&gt;Typical root branch, branch naming&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How to &lt;a href="https://www.method.com/insights/a-guide-for-software-quality-assurance/"&gt;Test the feature&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Unit testing, manual testing, dependency testing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How to Submit a PR

&lt;ul&gt;
&lt;li&gt;Rules around titles, descriptions, and build pipelines&lt;/li&gt;
&lt;li&gt;What to expect during code review&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How QA Tests your feature

&lt;ul&gt;
&lt;li&gt;This gives context on what kind of feedback they'll be receiving from QA&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How to Merge the PR&lt;/li&gt;
&lt;li&gt;How to deploy&lt;/li&gt;
&lt;li&gt;How to validate a deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Supporting Guides for our organization
&lt;/h3&gt;

&lt;p&gt;Our supporting guides are our source of truth for all practices and patterns.  We make these as easy to access as we can, so that links can be shared directly to the relevant content.  Our developers continuously update these guides as they come across new issues or develop new patterns.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resources

&lt;ul&gt;
&lt;li&gt;External links for training modules&lt;/li&gt;
&lt;li&gt;Important links within the organization (Confluence, JIRA, etc)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;React Practices (Core Concepts)

&lt;ul&gt;
&lt;li&gt;There are lots of ways to build React applications, here's our pattern to follow&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Typescript Practices (Core Concepts)

&lt;ul&gt;
&lt;li&gt;Typescript is still new to a lot of people and documentation is overwhelming. We include the important parts for our applications&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Styling React components (Core Concepts)

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.method.com/insights/when-third-party-libraries-add-technical-debt/"&gt;How we use libraries&lt;/a&gt; and reuse component styles&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Unit Testing Practices (Core Concepts)

&lt;ul&gt;
&lt;li&gt;What to test for, how to test for it, and the most-used methods&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Redux Practices (Core Concepts)

&lt;ul&gt;
&lt;li&gt;Defining our patterns around redux, and giving examples of the most common cases&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Git and Pull Request Practices

&lt;ul&gt;
&lt;li&gt;Rules around branch naming, PR rules, and code review guidelines&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At &lt;a href="https://www.method.com/"&gt;Method&lt;/a&gt;, we design, strategize, and build all types of software for our clients. Beyond just delivering a quality product, our duty is to teach our clients practices to leave them stronger as an organization. This is one that has proved extremely successful.&lt;/p&gt;

</description>
      <category>management</category>
      <category>onboarding</category>
      <category>development</category>
      <category>teambuilding</category>
    </item>
    <item>
      <title>The Code Review Checklist ✅</title>
      <dc:creator>Paul Cullen Rowe</dc:creator>
      <pubDate>Thu, 12 Nov 2020 16:26:17 +0000</pubDate>
      <link>https://dev.to/prowe214/the-code-review-checklist-1nmm</link>
      <guid>https://dev.to/prowe214/the-code-review-checklist-1nmm</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p2js9YaU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/853/1%2AE9V7MjV9f4Hwt3KzpUQ5iw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p2js9YaU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/853/1%2AE9V7MjV9f4Hwt3KzpUQ5iw.jpeg" alt=""&gt;&lt;/a&gt;Of course, we don’t review code while walking down the hall. Yes, this is staged. There isn’t even coffee in that cup.&lt;/p&gt;

&lt;p&gt;Code review is &lt;strong&gt;the most effective teaching tool&lt;/strong&gt; for onboarding team members, upskilling newer developers, and becoming an expert on the product and technology.&lt;/p&gt;

&lt;p&gt;But it isn’t effective if you breeze through it.&lt;/p&gt;

&lt;p&gt;Code Review should take a good amount of time, &lt;strong&gt;longer than you’re probably comfortable with&lt;/strong&gt;. The reviewer should understand what is being changed, why, and how it was resolved. Once these are understood, the reviewer can effectively critique the work.&lt;/p&gt;

&lt;p&gt;On my teams, we prioritize quality over speed. Ironically, we often end up delivering faster than teams that prioritize speed — and with significantly fewer bugs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code Review takes a significant amount of time invested up front, but it creates a shared knowledge that eliminates tons of basic mistakes down the line. Ultimately this saves tons of time and effort for everyone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s my code review checklist for these teams:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Understand the original problem
&lt;/h3&gt;

&lt;p&gt;Whether a feature, a bug, or an enhancement, understand &lt;strong&gt;WHY&lt;/strong&gt; we are doing this work in the first place.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review the work’s ticket (if there is one) and understand the requirements&lt;/li&gt;
&lt;li&gt;Talk to the developer or the reporter if further clarification is needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answer the question: “What’s the problem that this work solves?”&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Locally replicate the problem
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull develop
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Take the branch that the PR branched from, and physically watch the problem occurring.&lt;/p&gt;

&lt;p&gt;When you can see what the problem is, you can diagnose the proper solution more effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Understand the required fix or feature
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Based on what you’ve seen so far, what would you determine are the possible solutions? Try to think of a few options.&lt;/li&gt;
&lt;li&gt;What areas of the code might need work to solve this problem?&lt;/li&gt;
&lt;li&gt;From a UX perspective, is the solution that was proposed in the requirements actually the best way to fix the issue?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Review the PR directly (understanding dev’s approach, checking syntax errors)
&lt;/h3&gt;

&lt;p&gt;Now we start looking at code. Review the code’s diff in your repository (Github, Bitbucket, etc). This is the easiest way to see the “before and after” of what’s been changed, and the major pieces of the work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is the overall approach a good one?&lt;/strong&gt; Is it adding too much complexity? Is it working on the right area of the code?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If so, are there any basic mistakes?&lt;/strong&gt; Syntax errors, poorly named or mistyped variables, extraneous comments, formatting issues, or typos?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;MOST IMPORTANTLY&lt;/em&gt;: Do you understand &lt;em&gt;everything&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;about how this code works?&lt;/strong&gt; If there’s something you don’t understand, &lt;em&gt;you should add a comment asking for clarification!&lt;/em&gt; This will either a) help the developer teach you new tools, or b) help them realize that their code isn’t clear and needs to be cleaner.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Locally play with the PR branch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# on root branch
git pull
git checkout the-pr-branch
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pull down the code and see the solution in action, explore how pieces are being linked together and how interactions work in the code.&lt;/li&gt;
&lt;li&gt;Try to break the feature again.&lt;/li&gt;
&lt;li&gt;Change some code and see how it changes things.&lt;/li&gt;
&lt;li&gt;See if there are any lingering errors in the console or IDE which need cleanup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all steps you will take to confirm that the code works as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Check if unit tests are testing every interaction effectively
&lt;/h3&gt;

&lt;p&gt;Every codebase should have unit tests, and those tests should check that every function is working &lt;em&gt;exactly&lt;/em&gt; as expected with both “usual” input and “unusual” input.&lt;/p&gt;

&lt;p&gt;Are you actually testing everything you &lt;em&gt;think&lt;/em&gt; you’re testing? Code coverage tools like &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt; or &lt;a href="https://www.sonarqube.org/"&gt;SonarQube&lt;/a&gt; are easy to implement and can tell you if you are truly testing everything — I personally like a coverage level of 80%.&lt;/p&gt;

&lt;p&gt;For each test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check if the output is correct with good values. Check that function handles bad values gracefully.&lt;/li&gt;
&lt;li&gt;Check that all logic inside of a function is being tested effectively. Is something inside of a function hard to test? &lt;strong&gt;It probably needs to be pulled out into a separate function&lt;/strong&gt; and tested separately.&lt;/li&gt;
&lt;li&gt;Check that all unit tests are passing and not throwing odd/unnecessary errors in the test suite.&lt;/li&gt;
&lt;li&gt;Check that your code coverage level has not fallen below the coverage threshold you configured. If it has, add more/better tests where the report identifies weak coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ When you’ve given feedback, do it all again when changes are pushed
&lt;/h3&gt;

&lt;p&gt;You have reviewed one PR, and it probably took a while. Good! But it doesn’t end here.&lt;/p&gt;

&lt;p&gt;When the developer pushes new commits to address the feedback of you or others (fixes and improvements), you should go back and test it again. When small things are changed, it can have a big impact on other areas of the application. Run through the checklist again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The code in a PR should always be considered “ready for production”, never accept “I can fix that later”. It should always be reviewed expecting a high quality of delivery.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;This process takes a while and is intentionally intensive. That’s a good thing!&lt;/p&gt;

&lt;p&gt;When you follow this process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer bugs get through&lt;/li&gt;
&lt;li&gt;Developers understand more deeply about the product and learn it MUCH faster&lt;/li&gt;
&lt;li&gt;Reduces the amount of “re-reviews” because — when done effectively — devs learn from each others’ mistakes in other PRs. This dramatically speeds up time that PRs spend “in review”&lt;/li&gt;
&lt;li&gt;The team develops a culture of constant improvement and peer mentorship&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are all ultimately goals of every software development team. So put better PR review practices in place, embrace the initial heavier load, and watch your team’s quality of output improve dramatically!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paul is an engineering manager at&lt;/em&gt; &lt;a href="http://skookum.com/"&gt;&lt;em&gt;Skookum&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, a former UI/UX designer, a snowboarder and golfer in Colorado, and apparently a&lt;/em&gt; &lt;a href="http://prowe214.medium.com/"&gt;&lt;em&gt;dev blogger&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Follow me on&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/paulcullenrowe"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, the&lt;/em&gt; &lt;a href="https://twitter.com/prowe214"&gt;&lt;em&gt;Tweeter&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://github.com/prowe214"&gt;&lt;em&gt;Github&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, or anywhere you can find deep snow.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Need help building a product or a team? I’ll chat with ya on&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/paulcullenrowe"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bugs</category>
      <category>softwareengineering</category>
      <category>codereview</category>
      <category>development</category>
    </item>
    <item>
      <title>How to 10x Your Speed (For anyone that uses a computer)</title>
      <dc:creator>Paul Cullen Rowe</dc:creator>
      <pubDate>Mon, 19 Oct 2020 14:02:46 +0000</pubDate>
      <link>https://dev.to/prowe214/how-to-10x-your-speed-for-anyone-that-uses-a-computer-4ck7</link>
      <guid>https://dev.to/prowe214/how-to-10x-your-speed-for-anyone-that-uses-a-computer-4ck7</guid>
      <description>&lt;h3&gt;
  
  
  3 Tips to 10x Your Speed (For anyone that uses a computer)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4LB-2Nra--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ayip9QAxgsH00qvbg4lD4yg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4LB-2Nra--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ayip9QAxgsH00qvbg4lD4yg.jpeg" alt="wow such speed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll bet you think you’re fast. I’m going to give you some tips that will make you faster, and you’ll like your computer a whole lot more.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TL;DR — If you read nothing else in this article, the takeaway is to&lt;/em&gt; &lt;strong&gt;&lt;em&gt;reduce your reliance on your point-and-click mouse/trackpad&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;, because its slow and often inaccurate.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ditch your mouse, use keyboard shortcuts for everything
&lt;/h3&gt;

&lt;p&gt;Let’s run a quick experiment.&lt;/p&gt;

&lt;p&gt;Type your mailing address into some app. Then when you’re done, without touching the mouse or trackpad, try to spot your mouse on your screen.&lt;/p&gt;

&lt;p&gt;It probably took you a couple of seconds to find it. But while you were typing, you didn’t even think about where those keys were located. They’re always in the same predictable place. &lt;strong&gt;Your keyboard is your fastest way to tell the computer to do something.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a simple example: Time yourself hitting Cmd+C, Cmd+V to copy/paste. Now time yourself to Find Your Mouse &amp;gt; Edit &amp;gt; Copy, Find Your Mouse &amp;gt; Edit &amp;gt; Paste. Or even the same with the right-click menu. And that’s not mentioning time lost with missed clicks.&lt;/p&gt;

&lt;p&gt;By using keyboard shortcuts, you save seconds on every action. Those many little seconds add up to many minutes per day, and in a week can add up to hours.&lt;/p&gt;

&lt;h4&gt;
  
  
  Starting today, make every effort to ditch your mouse
&lt;/h4&gt;

&lt;p&gt;Keep your hands on your keyboard and don’t let them leave. Be hard on yourself, and only use your mouse if you absolutely can’t figure something out. (You should google that action’s shortcuts and keyboard it next time!)&lt;/p&gt;

&lt;p&gt;This is going to be a very uncomfortable process and you will feel very slow for a week or two. And you’ll have a harder time when surfing websites (but don’t let this deter you, try your best, &lt;em&gt;especially if you’re a software/web developer!&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Learning this skill will dramatically increase your speed!&lt;/p&gt;

&lt;p&gt;My most-used keyboard shortcuts that people forget (mac):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In text, &lt;strong&gt;Option+Arrow&lt;/strong&gt;  — skip to end of word/paragraph. &lt;strong&gt;Option+Delete&lt;/strong&gt; deletes whole words too.&lt;/li&gt;
&lt;li&gt;In text, &lt;strong&gt;Cmd+Arrow&lt;/strong&gt;  — skip to end of line/page. &lt;strong&gt;Cmd+Delete&lt;/strong&gt; deletes whole lines too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cmd+Tab&lt;/strong&gt;  — quickly switch apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cmd+Space&lt;/strong&gt;  — App/File finder (way faster than navigating through your file system, just start typing the name!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cmd+~&lt;/strong&gt;  — Next window in the current app (like switching between open word docs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl+Tab&lt;/strong&gt;  — Next tab in current window (like switching between chrome tabs)&lt;/li&gt;
&lt;li&gt;(For developers) &lt;strong&gt;Learn Vim!&lt;/strong&gt; VSCode has a great Vim emulator and it increases your development speed like crazy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Only use full-screen or half-screen
&lt;/h3&gt;

&lt;p&gt;If your screen looks like this, you might as well get a smaller screen&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sOCok5Pg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASWxFawGKdVrGkxNpBDNlRQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sOCok5Pg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASWxFawGKdVrGkxNpBDNlRQ.png" alt="small window on a large screen = poor window management"&gt;&lt;/a&gt;Figure 01: Small windows on a big screen are wasted space&lt;/p&gt;

&lt;p&gt;Always use ALL of your screen real-estate so that you can see more, do more, and be more productive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z7J3FHCB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AArgzfNWOzVVQxEy1OMorKQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z7J3FHCB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AArgzfNWOzVVQxEy1OMorKQ.png" alt="desktop using window management for split screen"&gt;&lt;/a&gt;Figure 02: Using full screen real-estate with two windows via a window manager!&lt;/p&gt;

&lt;h4&gt;
  
  
  How? Use a window manager!
&lt;/h4&gt;

&lt;p&gt;Window managers create keyboard shortcuts (ayyyy!) to snap your windows to full screen, half screen, third, quarter, any screen configuration you want, super quickly and easily. No more click and drag because mouse accuracy is slow and difficult.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://rectangleapp.com/"&gt;Rectangle&lt;/a&gt; (easy, free, and successor of the late great Spectacle)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apps.apple.com/us/app/moom/id419330170?mt=12"&gt;Moom&lt;/a&gt; ($10, lightly-customizable)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://folivora.ai/"&gt;BetterTouchTool&lt;/a&gt; ($9, advanced, more configurable and does way more than just window management)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Use the desktop app of your web apps
&lt;/h3&gt;

&lt;p&gt;Lots of our favorite web apps have desktop apps — Slack, Spotify, Todoist, etc. Sure, their site works great in Chrome, but it gets easily lost in all of your Chrome tabs!&lt;/p&gt;

&lt;p&gt;The desktop app keeps a separate area of concern for each piece of your daily workflow, rather than mashing them all together in your browser. This makes it easy to quickly &lt;strong&gt;Cmd+Tab&lt;/strong&gt; to your chats, or your music, or your code editor.&lt;/p&gt;

&lt;p&gt;Plus, most desktop apps come with a few extra features that you can’t get out of the website (including keyboard shortcuts!).&lt;/p&gt;

&lt;p&gt;So go download the desktop app for your daily tools.&lt;/p&gt;

&lt;h4&gt;
  
  
  But my thing doesn’t have a desktop app!
&lt;/h4&gt;

&lt;p&gt;😱 &lt;em&gt;Busted!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Just kidding. Things like GSuite, Asana, Trello, and your regularly visited websites, don’t have desktop apps. But there’s a way around that!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tryshift.com/"&gt;Shift&lt;/a&gt; — Free/$99ann. A desktop app to manage &lt;a href="https://tryshift.com/apps/"&gt;hundreds of web apps&lt;/a&gt; (that don’t have desktop apps) from one organized place. Check this out for sure.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stationhq.com/"&gt;Station&lt;/a&gt; — Free. A Chrome extension to quickly navigate to recently visited docs, tabs, sites, apps, and more. I loved their desktop competitor to Shift, but their new extension looks promising.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fluidapp.com/"&gt;Fluid&lt;/a&gt; — Free/$5. Creates a devoted desktop app for any website. For some sites, this tool can be clumsy, but for many its seamless. Worth a shot if you want a devoted desktop experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— —&lt;/p&gt;

&lt;p&gt;Got more tips and tricks? Drop them in the comments, I’m always learning new ways to get faster!&lt;/p&gt;

</description>
      <category>10x</category>
      <category>efficiency</category>
      <category>development</category>
      <category>keyboard</category>
    </item>
    <item>
      <title>A `zsh` script to make git squashes easy!</title>
      <dc:creator>Paul Cullen Rowe</dc:creator>
      <pubDate>Fri, 22 May 2020 17:32:30 +0000</pubDate>
      <link>https://dev.to/prowe214/a-zsh-script-to-make-git-squashes-easy-4id2</link>
      <guid>https://dev.to/prowe214/a-zsh-script-to-make-git-squashes-easy-4id2</guid>
      <description>&lt;p&gt;Keep a clean git source tree and squash your branches before merging!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This script squashes all commits on your branch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you look at your main branch’s git history, in most development environments it is more useful to just see commits for major changes, &lt;em&gt;not all the little steps and mistakes it took to get there.&lt;/em&gt; A &lt;strong&gt;“squash”&lt;/strong&gt; in git is the term used for combining past commits together, thereby reducing the amount of commits in your git history.&lt;/p&gt;

&lt;p&gt;In most of my repositories, that means when I’m done building on a feature branch, I squash the branch down to one commit, rebase the feature onto the latest original branch (&lt;code&gt;master&lt;/code&gt;, or &lt;code&gt;develop&lt;/code&gt; in gitflow), force-push and merge.&lt;/p&gt;

&lt;p&gt;This makes my git history of the main branch only show commits of the finished product of branches!  I use this script all the time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: Most repository managers like Github and Bitbucket have a “squash and merge” option for merging Pull Requests. This is for those who are not using Pull Requests or do not have that option)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;zsh&lt;/code&gt; in your terminal (&lt;a href="https://ohmyz.sh/"&gt;and you totally should&lt;/a&gt;), this simple script will work great for you.&lt;/p&gt;

&lt;p&gt;Copy and paste this into your &lt;code&gt;~/.zshrc&lt;/code&gt; file (I put it just before my aliases are defined):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;squashon &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;# If user just enters 'squashon', give help text&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="c"&gt;# == 0 )); then&lt;/span&gt;
    &lt;span class="nb"&gt;echo &lt;/span&gt;Hello!  This will squash your current branch down to one unstaged commit.
    &lt;span class="nb"&gt;echo &lt;/span&gt;Use by typing &lt;span class="s1"&gt;'squashon rootBranchName'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;not current branch name&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo &lt;/span&gt;usage: squashon develop
  &lt;span class="k"&gt;fi&lt;/span&gt;
  &lt;span class="c"&gt;# If a root branch is provided, run the squasher&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="c"&gt;# == 1 )); then&lt;/span&gt;
    &lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git symbolic-ref HEAD&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo &lt;/span&gt;Squashing all commits from &lt;span class="nv"&gt;$branch&lt;/span&gt;
    git reset &lt;span class="si"&gt;$(&lt;/span&gt;git merge-base &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="nv"&gt;$branch&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;------SUCCESS&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nt"&gt;------&lt;/span&gt;
    &lt;span class="nb"&gt;echo &lt;/span&gt;Commits successfully squashed, all file changes are unstaged.
    &lt;span class="nb"&gt;echo &lt;/span&gt;Run &lt;span class="s1"&gt;'git add -A'&lt;/span&gt; and &lt;span class="s1"&gt;'git commit -m "your commit message"'&lt;/span&gt; to add your squashed commit.
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What &lt;code&gt;squashon&lt;/code&gt; does
&lt;/h2&gt;

&lt;p&gt;Assume you have a root branch called &lt;code&gt;develop&lt;/code&gt;, and a feature branch called &lt;code&gt;feature/new-thing&lt;/code&gt; which originated from &lt;code&gt;develop&lt;/code&gt;. Your feature branch has 10 commits on it, the feature is complete and approved, and it is ready to be squashed!&lt;/p&gt;

&lt;p&gt;Run the script in the terminal with: &lt;code&gt;squashon develop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will take all changes you made on your branch, bring you back to the point when you branched off of develop, and keep them as unstaged changes.&lt;/p&gt;

&lt;p&gt;Now just run &lt;code&gt;git add -A &amp;amp;&amp;amp; git commit -m 'your commit message'&lt;/code&gt; and you’ll have one single commit that includes all of your branch’s changes!&lt;/p&gt;

&lt;p&gt;Note that you will need to force-push if you already pushed up to your remote, because you are rewriting the git history on this branch.  &lt;code&gt;git push -f&lt;/code&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>zsh</category>
    </item>
    <item>
      <title>Tip: How to view localhost web apps on your phone</title>
      <dc:creator>Paul Cullen Rowe</dc:creator>
      <pubDate>Mon, 29 Apr 2019 15:39:14 +0000</pubDate>
      <link>https://dev.to/prowe214/tip-how-to-view-localhost-web-apps-on-your-phone-4a4k</link>
      <guid>https://dev.to/prowe214/tip-how-to-view-localhost-web-apps-on-your-phone-4a4k</guid>
      <description>&lt;h3&gt;
  
  
  Dev Tip: How to view localhost web apps on your phone
&lt;/h3&gt;

&lt;p&gt;I’m always building web application products that need to be optimized for mobile. Viewing my project on a phone before deploying is a must.&lt;/p&gt;

&lt;p&gt;I often use the mobile device emulator in Chrome Devtools for little style adjustments, but there’s nothing that will perfectly emulate an actual mobile browser better than the mobile device itself. This helps me catch mobile-specific bugs before they surface as a problem for users.&lt;/p&gt;

&lt;p&gt;Here’s a method I use to make testing on mobile devices extremely easy. These instructions are for a Mac environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serve over your wifi via local IP
&lt;/h3&gt;

&lt;p&gt;This sounds complicated but its actually really easy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IMPORTANT: Make sure that your dev computer and your mobile device are connected to the same wifi network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Step 1: Serve to Localhost
&lt;/h4&gt;

&lt;p&gt;On your dev machine, serve your application in whatever way you usually do that serves it over a localhost address.&lt;/p&gt;

&lt;p&gt;Make sure to note what port number its being served on. In the image below, we’re noting 8080.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dWZSKT92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/390/1%2AkiDQjculr-6N-Op9IyMnBQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dWZSKT92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/390/1%2AkiDQjculr-6N-Op9IyMnBQ.png" alt="" width="390" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you are able to view your app locally on your computer via localhost, you can move to step 2.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Find your Local IP Address
&lt;/h4&gt;

&lt;p&gt;Open &lt;strong&gt;System Preferences&lt;/strong&gt; &amp;gt; &lt;strong&gt;Network&lt;/strong&gt;. Select “Wifi” in the left pane if it isn’t already selected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EwUWa6Pj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/676/1%2AOyT7ea8egn5rMUqnF45TCA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EwUWa6Pj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/676/1%2AOyT7ea8egn5rMUqnF45TCA.png" alt="" width="676" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under “Status: Connected”, you should see “Wi-Fi is connected to  and has the IP address &amp;lt; &lt;strong&gt;local IP address&lt;/strong&gt; &amp;gt;.”&lt;/p&gt;

&lt;p&gt;Take note of that IP address!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: It’s common for your Local IP Address to change automatically when your device or other devices connect/disconnect from the network. So you can’t really bookmark this address. Instead, you’ll have to find your address each time — for me, this is usually just when I get started each morning and it stays throughout the day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Step 3: View on your phone
&lt;/h4&gt;

&lt;p&gt;On your mobile device’s browser (any will work), navigate to http://:.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7KxuJo7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AowcqvRlQDfYrtTllwVbRGQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7KxuJo7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AowcqvRlQDfYrtTllwVbRGQ.png" alt="" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, if I was serving on localhost:8080 and my local IP address is 123.45.67.890, on my mobile device’s browser I would navigate to &lt;a href="http://123.45.67.890:8080."&gt;http://123.45.67.890:8080&lt;/a&gt; . The http:// is important, don’t leave it off.&lt;/p&gt;

&lt;h3&gt;
  
  
  Success!
&lt;/h3&gt;

&lt;p&gt;You should now be viewing your app on your mobile device. Set it up right next to your main monitor, because it will reload every time your localhost reloads, so it will be perfectly in sync with the locally served desktop web application.&lt;/p&gt;

&lt;p&gt;You don’t get any front-end devtools with this experience, but you do get an early warning if things look or behave differently on a native browser’s experience.&lt;/p&gt;

</description>
      <category>localhost</category>
      <category>frontend</category>
      <category>mobile</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
