<?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: Reviewpad</title>
    <description>The latest articles on DEV Community by Reviewpad (@reviewpad).</description>
    <link>https://dev.to/reviewpad</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%2Forganization%2Fprofile_image%2F4228%2Fcf9e22b5-9a7b-4e3e-97b4-4a0ac5128190.jpg</url>
      <title>DEV Community: Reviewpad</title>
      <link>https://dev.to/reviewpad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reviewpad"/>
    <language>en</language>
    <item>
      <title>How to accelerate your code reviews?</title>
      <dc:creator>Fábio Freitas</dc:creator>
      <pubDate>Thu, 20 Jul 2023 16:00:00 +0000</pubDate>
      <link>https://dev.to/reviewpad/how-to-accelerate-your-code-reviews-4p0m</link>
      <guid>https://dev.to/reviewpad/how-to-accelerate-your-code-reviews-4p0m</guid>
      <description>&lt;p&gt;&lt;em&gt;The code review process can often be tedious and filled with bottlenecks, making it slow and time-consuming. However, there are tools like Promyze and Reviewpad that can greatly assist in improving the code review process and saving you and your team a significant amount of work. In this article provided by Promyze, you'll discover effective strategies on how to expedite your review process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Code reviews through Pull/Merge Requests have become an essential process for the majority of tech companies.&lt;br&gt;
A recent study in 2022 unveils that 84% of the surveyed companies use it.&lt;br&gt;
Several years of practice allowed practitioners to take a step back on this methodology to identify pain points and how to overcome them.&lt;br&gt;
Besides, code reviews should always be continuously evaluated internally to improve how it’s done.&lt;br&gt;
In this post, we discuss how to add more flexibility to the Pull Request process and, thus, improve the delivery time.&lt;/p&gt;

&lt;p&gt;The lead time for change is the amount of time it takes a commit to get into production, and is part of the 4-key metrics defined by the DevOps Research and Assessment (DORA).&lt;br&gt;
Engineering teams seek to optimize this delay to deliver sooner value to their customers. But before bringing solutions, let’s first define the problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;During code reviews, what can slow down the whole process, create bottlenecks, and grow the lead time for change?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/cqxtE-DcvcA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Narrowing the context and purpose of code reviews
&lt;/h2&gt;

&lt;p&gt;The most often quoted obstructions to code reviews are the lack of human resources and the workload of engineers that don’t allow enough time for code reviews. A common reaction consists in adding more human resources to address the issue. Not so fast!&lt;/p&gt;

&lt;p&gt;First ask yourself:&lt;br&gt;
&lt;em&gt;Is each code review truly necessary? Can we affirm that all the discussions within reviews are relevant and should happen there?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Indeed, what we observe in practice is that code reviews often lack a clear context and purpose. If you’ve opened a merge/pull request, what do you expect from that? From our point of view, we propose two primary purposes for a Pull Request.&lt;/p&gt;
&lt;h3&gt;
  
  
  #1 Code approval
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;I need to ensure my code is okay before merging ⇒ I need your approval.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this case, it may raise friction from both sides, as reviews come late in the process.&lt;br&gt;
Authors can feel reviews as a constraint that slows down their delivery, and a frustration to get many comments, with which they won’t always agree.&lt;br&gt;
Reviewers can also adopt defensive behavior. What if they think: “I wouldn’t have done [the code] this way.&lt;br&gt;
Should I tell this? Should it be blocking for merging? My colleague waits for 2 days; how will my feedback be welcome?”&lt;br&gt;
So you can see that frictions can emerge from code reviews, mainly because we have the pressure induced by the quest for a satisfying lead time for change.&lt;/p&gt;
&lt;h3&gt;
  
  
  #2 Get help to improve the code
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;I’d like to show you my code and get your feedback to improve it ⇒ I need your help.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Compared with item #1, we’re looking to improve our code and learn from a peer.&lt;br&gt;
In this context, it’s worth considering whether this review is part of the delivery process.&lt;br&gt;
We may be convinced this code could be merged first. That’s something commonly observed in trunk-based development.&lt;/p&gt;

&lt;p&gt;The workflows and policies are different based on the context of the PR, so it makes sense to define it clearly.&lt;/p&gt;

&lt;p&gt;Another problem we observe during code reviews is the long discussion threads about implementation choices, design, and best coding practices.&lt;br&gt;
And there, discussions get emotional and passionate: this is precisely what we want to avoid during reviews.&lt;/p&gt;
&lt;h2&gt;
  
  
  Do we still need code reviews?
&lt;/h2&gt;

&lt;p&gt;Aside from this discussion, you may ask whether doing code reviews still make sense in 2023, in an era where we can find plenty of “DevOps automation” tools on the market.&lt;/p&gt;

&lt;p&gt;We consider that, yes, indeed, code reviews are still necessary.&lt;br&gt;
Even though automatic tools have become increasingly powerful, they’re good at detecting known problems.&lt;br&gt;
They can’t prove the absence of problems. Think about this Dijkstra quote:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Program testing can be used to show the presence of bugs, but never to show their absence!”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So during a Pull Request, we seek for what tools can’t detect.&lt;/p&gt;

&lt;p&gt;Now let’s go back to our main point: how to address the aforementioned issues?&lt;/p&gt;
&lt;h2&gt;
  
  
  Do code reviews only when it makes sense
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The concept of Fluid Pull Request
&lt;/h3&gt;

&lt;p&gt;To answer the question: “Do all Pull Requests require a code review?”, we can explore the model Ship Show Ask. In this approach*,* PR authors are considered free of trust to evaluate themselves if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code doesn’t require a code review since the changes are trivial (Ship)&lt;/li&gt;
&lt;li&gt;They’d like to show the code changes to colleagues and get their feedback (Show); This mode can sound totally counternatural as the feedback can be provided after the merge. This is part of the paradigm shift.&lt;/li&gt;
&lt;li&gt;The code requires a review (Ask)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of adding more human resources to review the code, we reconsider the necessity for each PR to be approved;&lt;br&gt;
This is how we can positively impact the lead time for change. This concept is also called Fluid Pull Request.&lt;/p&gt;
&lt;h3&gt;
  
  
  Next generation pull requests with Reviewpad
&lt;/h3&gt;

&lt;p&gt;Reviewpad is a GitHub app designed to automate your code review process and which implements the Fluid Pull Request concept.&lt;br&gt;
A single configuration file in your Git repository will contain all your workflows and policies for your Pull Requests.&lt;br&gt;
Based on the context, you’ll define rules to enforce or relax your security net. With Reviewpad, you can define rules such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a file in this folder is edited, one person from this group should approve the code.&lt;/li&gt;
&lt;li&gt;If the PR includes a new method in the code with an annotation @Critical, add a label ‘security, and require a double-validation.
Rules can decide whether PRs can be automatically merged or refused, define a validation workflow, and more.
Rules can address syntactic patterns in the code changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of workflow to automatically raise awareness when a critical change is introduced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;critical&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Modifications to critical changes&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#294b75"&lt;/span&gt;

&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owners&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;["lina",&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"caris"]'&lt;/span&gt;

&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;changes to critical code&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$hasAnnotation("critical") || $hasFileName("runner.go")&lt;/span&gt;
        &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$addLabel("critical")&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$assignReviewer($group("owners"), 1)&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;$info("@samir:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;you&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;are&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;being&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;notified&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;because&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;was&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;modified")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Discuss best practices and design outside code reviews
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Knowledge sharing should be collective
&lt;/h3&gt;

&lt;p&gt;f you request a review to improve your code or show it, this shouldn’t be done under pressure before merging the code.&lt;br&gt;
Engineers should instead find dedicated time to discuss code design and best practices, avoiding friction.&lt;br&gt;
If you’re having a 1:1 conversation and debating about a best practice, you hold a discussion that may impact your whole team.&lt;br&gt;
Indeed, if you come up with a decision, shouldn’t everyone agree with that? We can assume that you seek code uniformity and practice alignment.&lt;/p&gt;

&lt;p&gt;So maybe it’s time to consider running dedicated workshops on your best coding practices, as 1:1 conversations should not be the right place for that purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best practices sharing with Promyze
&lt;/h3&gt;

&lt;p&gt;Promyze is a knowledge-sharing platform for developers and provides integrations with IDE and code reviews (GitHub, GitLab, Azure DevOps, Bitbucket, and Helix Swarm).&lt;br&gt;
With the code review plugins, you can create a best coding practice from a comment, and the code is sent to Promyze along with your best practice proposal.&lt;br&gt;
You thus avoid long 1:1 discussions during code reviews.&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%2Fwww.promyze.com%2Fwp-content%2Fuploads%2Fimage.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%2Fwww.promyze.com%2Fwp-content%2Fuploads%2Fimage.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, Promyze helps your team regularly run dedicated workshops to review contributions from developers (made during code reviews or within IDE).&lt;br&gt;
It’s a suitable time to share knowledge and make technical decisions together and ensure everyone is aligned with the appropriate gestures to apply in the code.&lt;br&gt;
This is a continuous improvement process for your best coding practices and to grow developers’ skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to accelerate your code reviews?
&lt;/h2&gt;

&lt;p&gt;If you feel your engineering team has bottlenecks in their code reviews, we hope you found in this post some insights to improve your process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consider the necessity to approve each code change;&lt;/li&gt;
&lt;li&gt;Consider dedicated sessions to avoid never-ending discussions during reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also showed that Reviewpad and Promyze can be complementary to accelerate the code reviews while fostering knowledge sharing.&lt;/p&gt;

&lt;p&gt;Tell us if you’ve improved your lead time for change in your context and how you made it; we’d be happy to learn!&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Evolution of Code Reviews: The Beginnings</title>
      <dc:creator>Fábio Freitas</dc:creator>
      <pubDate>Wed, 12 Jul 2023 17:00:00 +0000</pubDate>
      <link>https://dev.to/reviewpad/the-evolution-of-code-reviews-the-beginnings-58ml</link>
      <guid>https://dev.to/reviewpad/the-evolution-of-code-reviews-the-beginnings-58ml</guid>
      <description>&lt;p&gt;Code review is now a vital part of software development in the age of DevOps. Understand the evolution of code review from its early days to its present shape. We'll look at how code review has adjusted to the demands of development teams, from time-consuming manual reviews to efficient automated ones.&lt;/p&gt;

&lt;p&gt;With the rise of DevOps, the code review process has become a substantial part of software development. The right code review process ensures that our applications are highly available and can be built with high velocity.&lt;/p&gt;

&lt;p&gt;Over the years, code review has evolved from manual processes to automated tools, adapting to the changing needs of development teams. As application development continues to evolve, it's essential for code review to keep pace and provide teams with the best possible workflow for ensuring code quality.&lt;/p&gt;

&lt;p&gt;In this 2 part series, we will explore the evolution of code review from its early days to its current state. We'll look at how code review has adapted to the needs of development teams, the trends driving its evolution, and the future of code review.&lt;/p&gt;

&lt;p&gt;In this first part, we will go through the pages of history to understand how the code review process came into existence, and how some of the shortcomings led to major disruptions.&lt;/p&gt;

&lt;p&gt;Whether you're a team leader trying to set the right practices for your development team, just a seasoned developer or simply starting in the software development world, this series will provide valuable insights into the importance of code review. Join us on a journey through the evolution of code review, and discover how it continues to shape the future of application development.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dark Ages
&lt;/h2&gt;

&lt;p&gt;In the early days of software development, code review was a manual process. Developers would physically sit down together and review the code line by line, discussing any issues or suggestions. While this method was effective, it was also time-consuming and not scalable for large development teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oo7PeVrh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tynxcfpcaerpvxlrbjvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oo7PeVrh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tynxcfpcaerpvxlrbjvt.png" alt="code review evolution meme" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The  &lt;a href="https://www.welcometothejungle.com/en/articles/btc-history-git"&gt;introduction of Git in 2005&lt;/a&gt; revolutionized how software development teams worked. It scaled the way teams, and contributors could now collaborate as developers could submit their code changes as pull requests. These pull requests would then be discussed and reviewed by other team members and, once accepted, were automatically merged into the main codebase. This was the rise of version control and all its benefits, such as keeping a history of changes and being able to roll back to previous versions.&lt;/p&gt;

&lt;p&gt;However, this method relied on manual reviews, and the feedback process was often slow and inconsistent. With Git, teams had the flexibility to conduct code reviews in any way they saw fit, which led to inconsistencies in how code was reviewed. Different teams used different processes and tools, and the process of manually checking the pull request still made it difficult to standardize the entire code review process.&lt;/p&gt;

&lt;p&gt;Overall the code review process was very manual and slow. Cutting corners to get functionality out to production often meant disruptions and bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Disaster Hit
&lt;/h2&gt;

&lt;p&gt;This is exactly what happened to the &lt;a href="https://www.nytimes.com/2008/09/08/business/worldbusiness/08iht-lse.4.15984073.html"&gt;London Stock Exchange on February 8th, 2008&lt;/a&gt;. It's usually not the best time for a financial institution facilitating trade in Europe's financial hub to be down in the middle of a global recession. This disruption was caused due to a bug in the new trading system that was released then.&lt;/p&gt;

&lt;p&gt;The impact was that trading came to a halt for almost an entire day, and till today the financial amount lost due to the impact is not publicly available. It is safe to say, though, there are significant losses for the Exchange and its customers. Given the scale of the incident and the impact, it had on the financial markets.&lt;/p&gt;

&lt;p&gt;Another such example is that of &lt;a href="https://www.henricodolfing.com/2019/06/project-failure-case-study-knight-capital.html"&gt;Knight Capital Group's trading systems&lt;/a&gt; which experienced an incident that led to a significant financial loss of $440 million in just 45 minutes. The issue was due to a code change that was not properly reviewed and tested, underscoring the significance of a comprehensive and efficient code review process.&lt;/p&gt;

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

&lt;p&gt;The code review process has become an integral part of software development with the rise of DevOps. Over the years, code review has evolved from manual processes to incorporating automation. This was due to the need to push changes faster while maintaining the stability of your systems.&lt;/p&gt;

&lt;p&gt;However, meeting this requirement was something that was just not feasible with the way code reviews were being performed. Stress the system too much and you could have experienced great outages and disruptions such as that of the London Stock Exchange or…&lt;/p&gt;

&lt;p&gt;By tracking the evolution of code reviews and being aware of the past issues, we know it is important for us to refine our coe review process. How we can do so is answered in &lt;a href="https://dev.to/blog/the-evolution-of-code-reviews-a-better-tomorrow"&gt;part 2&lt;/a&gt; of this series where we continue our evolution into the future!&lt;/p&gt;




</description>
      <category>programming</category>
      <category>devops</category>
      <category>productivity</category>
      <category>github</category>
    </item>
    <item>
      <title>The Evolution of Code Reviews: A Better Tomorrow</title>
      <dc:creator>Fábio Freitas</dc:creator>
      <pubDate>Wed, 12 Jul 2023 17:00:00 +0000</pubDate>
      <link>https://dev.to/reviewpad/the-evolution-of-code-reviews-a-better-tomorrow-40jd</link>
      <guid>https://dev.to/reviewpad/the-evolution-of-code-reviews-a-better-tomorrow-40jd</guid>
      <description>&lt;p&gt;In this second part of the evolution of code review, we explore the impact of emerging trends in application development. Discover the significance of the shift-left approach, the challenges posed by microservice architectures, and the rise of DevOps-related concepts like GitOps. Embrace change management and explore tools like ReviewPad that automate and streamline the code review process, ensuring swift and confident deployments for your applications.&lt;/p&gt;

&lt;p&gt;This is the 2nd part of a 2-part series on the evolution of code reviews. If you haven’t already, check out &lt;a href="https://dev.to/blog/the-evolution-of-code-reviews-the-beginnings"&gt;Part 1 here&lt;/a&gt;. In the first part of this series we saw how code reviews were performed in the early days of application development, and how the process if stressed could result in major issues and disruptions. The story of the London Stock Exchange and … is just a couple of examples from a long list of stories where companies suffered because of their outdated or faulty code review process.\&lt;br&gt;
In this second part, we will go over some of the trends that have come up in the world of application development. By understanding these trends we will be able to understand the needs for the future of the code review process. So lets continue on our journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emerging Trends and Their Impact on Code Reviews
&lt;/h2&gt;

&lt;p&gt;Over the past decade, with the DevOps revolution kicking off, we have seen many emerging trends that have redefined how applications are developed and how code goes through development to review to production. Many of these trends, coming, have had an impact on the overall code review process, and it's necessary to understand these trends to understand what lies next.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Whole Org Shifts-left
&lt;/h3&gt;

&lt;p&gt;Shift-left advocates for quality control measures of code to occur sooner in the development process, near the time code is being written. This approach enables teams to quickly spot and address any issues, reducing the possibility of defects and enhancing the general standard of the software.&lt;br&gt;
As a result, code reviews became essential to software release as the QA testing phase merged into the code review phase. No longer was it enough just to ensure that the code was compliant and met set standards but also that it worked and did not result in any regression.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rise of Microservice Architectures
&lt;/h3&gt;

&lt;p&gt;Microservices architecture &lt;a href="https://articles.noodlefactory.ai/riseofmicroservices"&gt;became popular&lt;/a&gt; due to its ability to allow for more flexible, scalable, and agile software development compared to monolithic architecture.&lt;/p&gt;

&lt;p&gt;However, with the microservice paradigm, it does become difficult to track how different services are related to one another, especially as your application scales. As a result, a change in one service could affect and even disrupt another.&lt;/p&gt;

&lt;p&gt;So it became necessary that these dependencies are realized during the code review process. Some of the related services to the service experiencing the change may be extremely sensitive to disruptions and downtime as per the business goals set. Putting more significance on an effective and clean code review process.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps, GitOps, NoOps…Why?
&lt;/h3&gt;

&lt;p&gt;With the rise of the DevOps concept, concepts under its umbrella &lt;a href="https://dzone.com/articles/under-the-hood-of-gitops"&gt;also emerged&lt;/a&gt;. These included concepts such as GitOps, AIOps, and even NoOps. Whatever type of “Ops” you may adopt, the goal is the same. Increase the velocity of product development while maintaining the availability and stability of the application.&lt;/p&gt;

&lt;p&gt;Overall, what is expected is the use of automation wherever possible, combined with the shift-left mentality, to aid in the two goals mentioned. We have seen now how the significance of code reviews increased due to other emerging trends. With the “Ops” trend, we tried to lessen the pressure on the code review stage using automation to ensure that changes could roll out quickly but also safely with high confidence that it's not going to break anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Future of Code Review
&lt;/h3&gt;

&lt;p&gt;Considering the various trends in the application development space, one thing that becomes clear is that pushing changes with a high degree of confidence is key. This is where the concept of change management arises.&lt;/p&gt;

&lt;p&gt;Change management is identifying, planning, and implementing changes in an organized and systematic way. It helps organizations deal effectively with change, minimize disruption, and maximize the benefits of change initiatives. Change management includes various activities, such as identifying the need for change, assessing the impact of change, communicating change to stakeholders, implementing change, and monitoring the results.&lt;/p&gt;

&lt;p&gt;By realizing the need for change management, it becomes clear why new paradigms, such as Fluid Pull Requests, are gaining momentum when it comes to adoption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reviewpad.com/blog/fluid-pull-requests"&gt;Fluid Pull Requests&lt;/a&gt; are an advanced form of the Pull Request method utilized in software development. In the traditional Pull Request system, a developer submits code modifications for review and evaluation by the repository managers. Fluid Pull Requests attempt to resolve these challenges by modifying the code review process based on the risk of the change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qL_IgHD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acg0ccv41dozz0mqvv26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qL_IgHD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acg0ccv41dozz0mqvv26.png" alt="manual code review meme" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Risk could depend on multiple factors such as how the service being affected is related to other services. The type of change of whether it is a config change or a change in the front, and the number of incidents reported by the team performing the change.&lt;/p&gt;

&lt;p&gt;Depending on the outcome of this assessment, various code review procedures can be established and automated to either lessen or increase the rigor of the code review process. For instance, if an important security patch is added, it might be necessary to include the security team in the code review process.&lt;/p&gt;

&lt;p&gt;This is exactly the methodology that a team performing change management needs. Any tooling employed could  instill confidence in accepting the change, and even automatically merge the pull requests when the risk score is lower below a certain threshold. Increasing both velocity and stability of the application development life cycle.&lt;/p&gt;

&lt;p&gt;This is why we are seeing increased adoption of tools such as &lt;a href="https://reviewpad.com/"&gt;ReviewPad&lt;/a&gt; that automate the review process and instill confidence in code changes. Reducing the need for manual intervention and overall reducing the time it takes for customers to see value in the applications you are developing.&lt;/p&gt;

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

&lt;p&gt;The rise of various trends such as DevOps-related concepts, developing in the cloud, and new architecture paradigms such as microservices greatly increased the importance of code review, making it a possible bottleneck to the entire application lifecycle. As a result further is tools such as ReviewPad, which enable you to perform change management with the speed and confidence required.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>devops</category>
      <category>productivity</category>
      <category>github</category>
    </item>
    <item>
      <title>How Reviewpad is Putting the Reviewer Assignment Problem to Rest</title>
      <dc:creator>Reviewpad</dc:creator>
      <pubDate>Fri, 24 Feb 2023 10:52:20 +0000</pubDate>
      <link>https://dev.to/reviewpad/how-reviewpad-is-putting-the-reviewer-assignment-problem-to-rest-28bb</link>
      <guid>https://dev.to/reviewpad/how-reviewpad-is-putting-the-reviewer-assignment-problem-to-rest-28bb</guid>
      <description>&lt;p&gt;&lt;em&gt;Streamline your code reviews with Reviewpad. Our advanced algorithm suggests the best reviewers for your pull requests, making your workflow faster and more efficient.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Are you tired of manually assigning reviewers to pull requests on GitHub? Do you find it time-consuming and difficult to ensure that each pull request is assigned to the most appropriate reviewer? If so, Reviewpad has the solution for you. With its new Code Reviewer Assignment feature, Reviewpad can help you streamline your code review process and ensure that each pull request is assigned to the right reviewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Manual PR Reviewer Assignments
&lt;/h2&gt;

&lt;p&gt;For teams working on GitHub, the manual assignment of reviewers to pull requests can be a time-consuming and error-prone process. As development teams grow in size, the need for an automated review assignment mechanism becomes increasingly critical. Without such a mechanism, developers must spend valuable time manually selecting the most relevant and available reviewers for each pull request. This process can take critical time away from development tasks, slow down the review process, and lead to bias in the selection of reviewers.&lt;/p&gt;

&lt;p&gt;In addition, it can be challenging to ensure that reviewers have the necessary expertise to review the code in the pull request. This can result in longer review cycles, errors in the code, and delays in the development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviewpad's Innovative Solution for Effortless Reviews
&lt;/h2&gt;

&lt;p&gt;Reviewpad's Code Author Reviewer Assignment Mechanism aims to solve these problems by automating the assignment of reviewers to pull requests. Reviewpad analyzes the past contribution history of code authors and uses that data to suggest the most appropriate reviewers for each pull request.&lt;/p&gt;

&lt;p&gt;In this process, &lt;strong&gt;Reviewpad considers two factors when assigning a reviewer&lt;/strong&gt;. Those are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relevancy&lt;/strong&gt; and&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;of the reviewers.&lt;/p&gt;

&lt;p&gt;The relevancy evaluation is based on the authorship of the code. It analyzes how many lines of code have been written by possible reviewers in the latest version of the impacted source files.&lt;/p&gt;

&lt;p&gt;The availability evaluation is based on the number of open reviews per reviewer, which ensures that reviewers with too many open reviews are considered unavailable.&lt;/p&gt;

&lt;p&gt;If there are no reviewers available or identified by the algorithm, a random user within the organization will be assigned as the reviewer for the PR. This fallback mechanism ensures that the pull request does not remain unreviewed and that the code changes are still scrutinized by someone in the organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Crucial Role of assignCodeAuthorReviewers Function
&lt;/h2&gt;

&lt;p&gt;Reviewpad's Code Author Reviewer Assignment Mechanism is powered by the &lt;code&gt;assignCodeAuthorReviewers&lt;/code&gt; function, a built-in function that takes several parameters to determine the most relevant and available reviewers for each pull request.&lt;/p&gt;

&lt;p&gt;This function is critical as it allows teams to customize the review assignment process to fit their specific needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Parameters of assignCodeAuthorReviewers
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;assignCodeAuthorReviewers()&lt;/code&gt; function takes three parameters.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Total&lt;/code&gt; (Optional): This parameter specifies the total number of reviewers to assign to a pull request. The default value is one, but you can change it to assign more than one reviewer to a pull request.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Excluded Reviewers&lt;/code&gt; (Optional): This parameter is a list of reviewers to exclude from being assigned to a pull request. You can use this parameter to exclude specific reviewers who might not be appropriate for the review.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Max Reviews&lt;/code&gt; (Optional): This parameter specifies the maximum number of open reviews per reviewer. If a reviewer has more open reviews than this value, they will be considered unavailable and will not be assigned to the pull request. If we don't specify a value to Max Reviews, the algorithm ignores that parameter and considers reviewers regardless of the number of open reviews they have.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Examples of assignCodeAuthorReviewers at Work
&lt;/h3&gt;

&lt;p&gt;Let's look at an example of how you can use the &lt;code&gt;assignCodeAuthorReviewers&lt;/code&gt; function in Reviewpad.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 1
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$assignCodeAuthorReviewers()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example uses the default parameters for the &lt;code&gt;assignCodeAuthorReviewers&lt;/code&gt; function. It will assign one reviewer to the pull request based on code authorship and availability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 2
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$assignCodeAuthorReviewers(3)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example assigns three reviewers to the pull request based on code authorship and availability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 3
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$assignCodeAuthorReviewers(2, ["user1", "user2"])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example assigns two reviewers to the pull request, but it excludes &lt;code&gt;"user1"&lt;/code&gt; and &lt;code&gt;"user2"&lt;/code&gt; from being assigned as reviewers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 4
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$assignCodeAuthorReviewers(1, [], 2)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example assigns one reviewer to the pull request, but it limits the number of open reviews per reviewer to two.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Step-by-Step Guide to Using Reviewpad's Code Author Reviewer Assignment Feature
&lt;/h2&gt;

&lt;p&gt;Now that you have a better understanding of the &lt;code&gt;assignCodeAuthorReviewers&lt;/code&gt; function, let's take a look at the steps of the workflow of the Reviewpad's Code Reviewer Assignment Mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Sign up for Reviewpad and integrate it with your GitHub account. (&lt;a href="https://docs.reviewpad.com/getting-started/installation" rel="noopener noreferrer"&gt;Installation Guide ↗︎&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: In your repository, create a new workflow with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Code Author Reviewer Assignment&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!$isDraft()'&lt;/span&gt;
    &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$assignCodeAuthorReviewers()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Customize the &lt;code&gt;assignCodeAuthorReviewers&lt;/code&gt; function to fit your specific needs. You can use the parameters and variables mentioned earlier in this article to customize the review assignment process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Create a draft pull request in your repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: When the pull request is ready for review, move it to the &lt;code&gt;Ready for Review&lt;/code&gt; status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: Reviewpad's Code Author Reviewer Assignment Mechanism will analyze the relevancy and the availability of the reviewers and suggest the most appropriate reviewers for the pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering the Advanced Functionality of Reviewpad
&lt;/h2&gt;

&lt;p&gt;It's important to note that Reviewpad's Code Author Reviewer Assignment Mechanism is a powerful tool that can help you streamline your code review process. However, it's not a replacement for good code review practices. It's still important to ensure that reviewers have the necessary expertise to review the code in the pull request and to maintain a clear and organized review process.&lt;/p&gt;

&lt;p&gt;In addition, Reviewpad provides other powerful features such as &lt;a href="https://docs.reviewpad.com/use-cases/automated-labelling" rel="noopener noreferrer"&gt;automated pull request labeling&lt;/a&gt;, &lt;a href="https://docs.reviewpad.com/use-cases/auto-merge" rel="noopener noreferrer"&gt;automatic pull request merge&lt;/a&gt;, and &lt;a href="https://docs.reviewpad.com/use-cases/enforce-branch-conventions" rel="noopener noreferrer"&gt;enforcing branch conventions&lt;/a&gt;. By using Reviewpad's Code Reviewer Assignment feature in combination with these other features, you can create a robust and efficient code review process that saves time and reduces errors.&lt;/p&gt;

</description>
      <category>critique</category>
      <category>uidesign</category>
      <category>ui</category>
      <category>productdesign</category>
    </item>
    <item>
      <title>Fluid Pull Requests</title>
      <dc:creator>Reviewpad</dc:creator>
      <pubDate>Thu, 05 Jan 2023 17:32:00 +0000</pubDate>
      <link>https://dev.to/reviewpad/fluid-pull-requests-36a4</link>
      <guid>https://dev.to/reviewpad/fluid-pull-requests-36a4</guid>
      <description>&lt;p&gt;By &lt;a href="https://www.linkedin.com/in/freddymallet/"&gt;Freddy Mallet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pull Requests have become the backbone of the DevOps movement: the faster, the safer, the better. But the code review step, this systematic and synchronized communication task between humans, inherited from ancient times, slows down the overall development lifecycle for an illusion of safety. It’s time to introduce the Fluid Pull Requests paradigm.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Back in 2008, GitHub introduced the concept of Pull Request and, by doing so, significantly eased the contribution to &lt;strong&gt;open-source&lt;/strong&gt; projects. For the first time, it had never been so simple for two strangers to collaborate on the same code base. At that time, the only purpose of a Pull Request was to provide a safe way to suggest code changes and discuss them in a collaborative interface. &lt;/p&gt;

&lt;p&gt;More than a decade later, &lt;strong&gt;170 Million&lt;/strong&gt; [1] Pull Requests are created each year on &lt;strong&gt;private projects&lt;/strong&gt; and 30 Million on public projects. So the concept has been embraced by the overall software industry and has become a de facto standard. During the same period, the &lt;strong&gt;DevOps&lt;/strong&gt; movement took off, and nowadays, Pull Requests are the &lt;strong&gt;backbone&lt;/strong&gt; of any automated SDLC (Software Delivery LifeCycle). On each Pull Request, many highly valuable tasks are fully automated: building, testing, static analysis to spot bugs, deployment on staging environments, etc. All this DevOps movement could be summarized in one mantra: &lt;strong&gt;“The faster, the safer, the better”&lt;/strong&gt;. Starting in 2015, the DORA (DevOps Research and Assessment) [2] team has identified four key metrics that indicate the performance of a software development team. Three of those four metrics illustrate this mantra: Deployment Frequency, Lead Time for Changes, and Time to Restore Service.&lt;/p&gt;

&lt;p&gt;So today, the lifecycle of a Pull Request should be a matter of a few hours, but it is always a few days or even a few weeks. Developers managed to automate many things, but we still have in the middle of each PR lifecycle a systematic and &lt;strong&gt;synchronized communication task between humans&lt;/strong&gt;: the code review step. This inflexible code review step, inherited from 2008, slows down everything and is the main bottleneck.&lt;/p&gt;

&lt;p&gt;Why do we keep on accepting to pay such a price? Why do we keep on pushing the stop-the-line button on each PR? Because no software, no static analyzer, nor AI will ever be able to formally prove that a code change is safe and maintainable. Our tooling will keep evolving to spot more patterns but proving the absence of problems is an unsolvable challenge. So we rely on humans to do so. But humans are even less efficient at spotting problems, tracking a flow of execution, or keeping more than 10 variables in our working memory. This is especially true when each PR has to be reviewed. Developers are progressively desensitized, and LGTM symptoms arise. We’re just accepting to pay the price for an &lt;strong&gt;illusion of safety&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So what do we suggest doing? As we said, Pull Requests are nowadays the backbone of the DevOps infrastructure, so we can’t work without them. Moreover, today there is no code analyzer to prove the absence of bugs or vulnerabilities, or critical design flaws, so we still need developers to review some code changes. The only problem is that this code review is done systematically, regardless of the context, and always involves synchronous communication between humans. Here is where the Fluid Pull Requests paradigm knocks on the door.&lt;/p&gt;

&lt;p&gt;At the core of this Fluid Pull Requests paradigm is the capacity to adjust the code review process based on the &lt;strong&gt;sensitivity of the code change&lt;/strong&gt;, either to &lt;strong&gt;lighten or strengthen it&lt;/strong&gt;. This sensitivity evaluation must take into account several different elements. We can mention, for instance, the seniority of the developer on a code base, the complexity of the code change, or the history of changes. Based on this sensitivity evaluation, you can specify and automate &lt;strong&gt;several code review processes&lt;/strong&gt; to automatically approve and merge, do an asynchronous review, assign several reviewers, and spot the most sensitive parts of the code changes. For instance, if a database migration script is added, it could be relevant to involve the database team, but only to approve this piece of code.&lt;/p&gt;

&lt;p&gt;I guess you got it: Fluid Pull Requests is an extension of the Pull Request concept, to increase both the throughput and safety of delivery. We still rely on human review, but only when it’s the most relevant, and in a very driven way. &lt;strong&gt;Instead of reviewing everything every time, we only have the most critical changes reviewed by the most impactful reviewers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;[1] Octoverse Report 2021: &lt;a href="https://octoverse.github.com/writing-code-faster"&gt;https://octoverse.github.com/writing-code-faster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2] DevOps Research and Assessment: &lt;a href="https://www.devops-research.com/research.html"&gt;https://www.devops-research.com/research.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>culture</category>
      <category>practices</category>
    </item>
    <item>
      <title>Why Developers Should Care About Knowledge Sharing</title>
      <dc:creator>Adriano Martins</dc:creator>
      <pubDate>Mon, 18 Oct 2021 09:18:44 +0000</pubDate>
      <link>https://dev.to/reviewpad/why-developers-should-care-about-knowledge-sharing-3ilg</link>
      <guid>https://dev.to/reviewpad/why-developers-should-care-about-knowledge-sharing-3ilg</guid>
      <description>&lt;p&gt;&lt;em&gt;Sharing knowledge usually comes as the last step of a process, or even worse, as something optional, that can be passed on if need be. This makes it easy to skip on this step if you feel you’re tired, or your team is busy. Developers are almost always creating new technologies and figuring out new solutions. Odds are, whatever knowledge you acquire won’t be available anywhere else. The time has come to remind everyone of the fundamental benefits of making whatever knowledge you’ve acquired available to your colleagues.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it helps you
&lt;/h2&gt;

&lt;p&gt;Knowledge sharing is &lt;a href="https://codingsans.com/state-of-software-development-2020"&gt;the second biggest problem software companies face&lt;/a&gt;. It affects everyone, so it also affects anyone. With the advent of remote work, this issue may become even more important. First of all, let’s appeal to our own self-interest. Sharing knowledge doesn’t only help our team, it actually helps those who are imparting the knowledge in more ways than one.&lt;/p&gt;

&lt;p&gt;Let’s see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You are &lt;strong&gt;advancing your own knowledge&lt;/strong&gt;. By explaining what you’ve learnt to someone else, you are consolidating what you’ve learnt. You will retain it better, systematise it better, and, frankly, you’ll probably advance it by seeing it through others’ eyes. You will have to consider what you’re sharing and think twice about it. That reflection will bring with it valuable learning.&lt;/li&gt;
&lt;li&gt;  You will be &lt;strong&gt;receiving feedback&lt;/strong&gt;. No developer is an island. We learn from others. By sharing what you’ve learnt, you will be receiving other people’s thoughts on the subject, which will surely advance your own understanding. Maybe they will even correct some aspect of it that you misunderstood.&lt;/li&gt;
&lt;li&gt;  You will &lt;strong&gt;help future you&lt;/strong&gt;. If you learn something and just file it away in the caverns of a closed pull request, odds are you may not remember it fully whenever you bump into the same problem again. If you write it down, though, and teach it to others, it will be right there for you when you need it. It’s the easiest way to &lt;strong&gt;only solve problems once&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  You will be &lt;strong&gt;advancing your career&lt;/strong&gt;. Sharing knowledge and contributing to the team’s success does not go unnoticed. If when people are in trouble and seek solutions your name pops up all the time, everyone will take notice. This is how promotions happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why it helps your team
&lt;/h2&gt;

&lt;p&gt;But sharing isn’t just about oneself, now is it? There must be advantages for the whole team. Let’s see what they are.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It helps &lt;strong&gt;build team spirit&lt;/strong&gt;. This may sound like a meaningless phrase, but it isn’t. What goes around comes around, and a team that is accustomed to helping each other will resort to helping each other naturally. Giving everyone a hand shouldn’t be contingent on someone being in trouble.&lt;/li&gt;
&lt;li&gt;  You will be &lt;strong&gt;saving everyone A LOT of time&lt;/strong&gt;. How long did it take you to solve the problem? An hour? Two? A whole day? Whenever someone on your team runs into the exact same issue, they will (depending on skill level or just sheer instinct) take roughly the same amount of time. If there’s an explanation available, though, that everyone has knowledge of… Not so much.&lt;/li&gt;
&lt;li&gt;  You will be &lt;strong&gt;building a knowledge base&lt;/strong&gt;. It may seem like just a small addition, but small additions build up. If your team develops a culture of sharing knowledge, they will inevitably create a repository that will become a cornerstone of success.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to do it
&lt;/h2&gt;

&lt;p&gt;So, are there any best practices, aside from simply gathering the team and telling them, or writing stuff down somewhere public, such as an internal Wiki?&lt;/p&gt;

&lt;p&gt;We do have some ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you’re using &lt;strong&gt;Reviewpad&lt;/strong&gt;, which you should, the &lt;em&gt;Comments from the Past&lt;/em&gt; feature makes it so whenever someone touches code with comments, they’ll be able to see what was shared when that code was made. Forget about re-working the same problems, or going down avenues that somebody else already found out that don’t work.&lt;/li&gt;
&lt;li&gt;  Whenever a team member explains something to you, &lt;strong&gt;encourage them to document it&lt;/strong&gt;. If it was useful to you, it will likely be useful to others.&lt;/li&gt;
&lt;li&gt;  Much in the same way, whenever someone asks you for help, &lt;strong&gt;document it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Whenever you are the one who needs an explanation, avoid asking in private. &lt;strong&gt;Ask on a public forum&lt;/strong&gt;, so everyone can read the discussion and take advantage of it.&lt;/li&gt;
&lt;li&gt;  Make it &lt;strong&gt;easily accessible&lt;/strong&gt;. Your knowledge base needs to be freely and easily accessible to everyone, at all times. Developers don’t particularly like over complicated wikis, so it’s up to you to create this space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the reasons why we are building Reviewpad is making knowledge sharing easier and more convenient to everyone involved.&lt;/p&gt;

&lt;p&gt;Reviewpad is about communication as much as it is about reviews.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reviewpad.com/get-started"&gt;Are you ready to give it a go?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>knowledgesharing</category>
      <category>teamwork</category>
      <category>culture</category>
    </item>
    <item>
      <title>Ship / Show / Ask With Reviewpad</title>
      <dc:creator>Marcelo Sousa</dc:creator>
      <pubDate>Fri, 08 Oct 2021 14:36:42 +0000</pubDate>
      <link>https://dev.to/reviewpad/ship-show-ask-with-reviewpad-47jh</link>
      <guid>https://dev.to/reviewpad/ship-show-ask-with-reviewpad-47jh</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://martinfowler.com/articles/ship-show-ask.html" rel="noopener noreferrer"&gt;Ship / Show / Ask&lt;/a&gt; is a methodology to get faster releases with pull requests. With Reviewpad you get a code review platform that allows teams to naturally apply this methodology and extend it to new scenarios that give you greater velocity and team communication by going beyond pull requests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pull requests have been widely adopted by software teams as a way to collaborate in codebases. For all their benefits when contributing to open source projects, when it comes to projects where individual contributors have the power to merge their changes, &lt;strong&gt;pull requests slow software development&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull Requests Are Slowing You Down
&lt;/h2&gt;

&lt;p&gt;The first reason pull requests are slowing you down is that &lt;strong&gt;theyare being used to document developer work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you need to open a pull request for every change, regardless of whether it is a new feature or a cosmetic change in a file, inevitably pull requests will be a bottleneck to integrate changes into a product.&lt;/p&gt;

&lt;p&gt;When you associate “pull request” to “unit of dev work” and combine it with automated CI/CD pipelines, you get an overhead of time + resources that doesn’t always make sense in a fast-paced environment.&lt;/p&gt;

&lt;p&gt;The second reason why pull requests are slowing you down is that we have associated code reviews with pull requests to a degree that we now use them interchangeably.&lt;/p&gt;

&lt;p&gt;The truth is that &lt;strong&gt;not all pull requests need code reviews&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By enforcing processes such as “every pull request must be approved by a team member”, which is not aware of the actual changes, we have created a wait time in the process that is unreasonable in many situations.&lt;/p&gt;

&lt;p&gt;This coupling of code reviews with pull requests has another major pitfall.&lt;/p&gt;

&lt;p&gt;Because reviewing code is hard and the tooling around code reviews in pull requests is quite limited, &lt;strong&gt;it is standard to constraint the number of changes in a pull request&lt;/strong&gt;. This means that changes that should be pushed together have to be broken up to accommodate this process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ship / Show / Ask
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/articles/ship-show-ask.html" rel="noopener noreferrer"&gt;&lt;em&gt;Ship / Show / Ask&lt;/em&gt;&lt;/a&gt; is a methodology to get faster releases by categorising changes into &lt;strong&gt;Ship (merge without pull request)&lt;/strong&gt;, &lt;strong&gt;Show (merge with pull request + later review)&lt;/strong&gt; and &lt;strong&gt;Ask (standard pull request with review approval)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This methodology is powerful but still relies on the existence of pull requests. This limits you to always having to discuss changes between branches and trigger some automated process even when you just want to ask. It can also happen that you might need to do a later review but the changes were wrongly classified as Ship.&lt;/p&gt;

&lt;p&gt;We think &lt;strong&gt;there’s a better way&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Reviews without Pull Requests
&lt;/h2&gt;

&lt;p&gt;Reviewpad decouples code reviews from pull requests so that you fully embrace the idea that &lt;em&gt;&lt;strong&gt;not all pull requests need code reviews&lt;/strong&gt;&lt;/em&gt; and that &lt;em&gt;&lt;strong&gt;code reviews can be done without pull requests&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s take a look!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/iNCu085ML64"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Reviewpad – Creating a Review Between Commits



&lt;p&gt;With Reviewpad it is possible to practice the &lt;em&gt;Ship / Show / Ask&lt;/em&gt; methodology in a more flexible way. In fact, what we have been practicing at Reviewpad is a &lt;em&gt;Ship / Show / Ask / &lt;strong&gt;Revise&lt;/strong&gt;&lt;/em&gt; methodology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ship
&lt;/h2&gt;

&lt;p&gt;If you want to push a change to the main branch and you have the confidence to do so, you should just do it.&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%2Fb4uggrho49mbz8cgt8do.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%2Fb4uggrho49mbz8cgt8do.png" alt="ship"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You shouldn’t have to wait for the CI checks or a review approval on a pull request to do so. Anyway, you typically run some CI pipeline in the main branch so you can always backtrack if something goes terribly wrong. You should have the power and trust to simply push changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show
&lt;/h2&gt;

&lt;p&gt;A Show process is when you run the CI checks over a branch before the merge, merge and only later get a review.&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%2F645tcr8qg1kv6iqpcdmx.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%2F645tcr8qg1kv6iqpcdmx.png" alt="show"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although you can do this with a pull request, with Reviewpad there is really no need to do so. You can simply wait for the CI pipeline to finish when you push to a feature branch, merge, and then open a code review between those commits in the main branch. You can choose to open this code review to get later feedback between the branches or in the main branch itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask
&lt;/h2&gt;

&lt;p&gt;The Ask process happens when you want feedback on our ongoing work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here we pause. We make our changes on a branch, we open a Pull Request, and we wait for feedback before merging. Maybe we’re not sure we’ve taken the right approach.&lt;/em&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%2Ft3rfomo8l2ckq8cuncgv.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%2Ft3rfomo8l2ckq8cuncgv.png" alt="ask"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, for many developers, the idea of a pull request is more of a “work done” than a “work in progress”. In fact, mixing the two can be quite confusing because sometimes you just want early feedback on code that you know will not pass the CI checks.&lt;/p&gt;

&lt;p&gt;Reviewpad allows you to create a code review between commits to get that feedback, revise it, close this code review and then open a pull request kicking off the official merge process in a team. &lt;strong&gt;That encourages more collaboration and communication about the code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use the same code review interface regardless if you what you are reviewing is a pull request or just a diff between two commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revise
&lt;/h2&gt;

&lt;p&gt;So what happens if you want to revise some code that went into the main branch? This could be useful in the case of a huge load of pull requests with no time to review them or because you wrongly considered changes to be in “Ship” mode.&lt;/p&gt;

&lt;p&gt;By going beyond the limitation of reviewing code with pull requests you can revise code in a single branch.&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%2Fkro57gqjoi9kpvu6z3nh.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%2Fkro57gqjoi9kpvu6z3nh.png" alt="revise"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows you to create code reviews that document specific parts of the code, or to keep track of changes when you spend some time away from the project.&lt;/p&gt;

&lt;p&gt;If you find issues in this mode, you can always connect to the code host by creating issues from comments.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Kw5V6z0juSE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Reviewpad – Creating an issue from a comment



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

&lt;p&gt;With Reviewpad, you get a tool that provides the flexibility of new methodologies such as &lt;em&gt;Ship / Show / Ask&lt;/em&gt; and beyond so that you can get the full benefits of code reviews and continuous integration without the limitations of pull requests.&lt;/p&gt;

&lt;p&gt;You can try now at &lt;a href="https://beta.reviewpad.com" rel="noopener noreferrer"&gt;beta.reviewpad.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>git</category>
      <category>branching</category>
      <category>codereview</category>
      <category>shipshowask</category>
    </item>
    <item>
      <title>Managing expectations in code reviews</title>
      <dc:creator>Reviewpad</dc:creator>
      <pubDate>Mon, 06 Sep 2021 10:55:57 +0000</pubDate>
      <link>https://dev.to/reviewpad/managing-expectations-in-code-reviews-5ehp</link>
      <guid>https://dev.to/reviewpad/managing-expectations-in-code-reviews-5ehp</guid>
      <description>&lt;p&gt;&lt;em&gt;Best practices are&lt;/em&gt; &lt;a href="https://reviewpad.com/blog/six-best-practices-to-improve-your-code-reviews/"&gt;&lt;em&gt;one thing&lt;/em&gt;&lt;/a&gt; &lt;em&gt;that surely matters. Improving standards is always good. Who could argue against that? But what do you expect to get from code reviews? How do you expect the experience to go? Managing these expectations, especially when it's often so hard to measure results, can be daunting. Here are some thoughts on how to manage this.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Embrace the qualitative
&lt;/h2&gt;

&lt;p&gt;Code reviews are about &lt;strong&gt;continuous improvement&lt;/strong&gt;. That means it won't always be easy (sometimes it will be impossible) to quantify how much you've improved. Any metric you can come up with to measure &lt;strong&gt;return on investment (ROI)&lt;/strong&gt; is likely flawed, and will probably tell you as much about the quality of your other processes as the reviews themselves.&lt;/p&gt;

&lt;p&gt;We do know some things, such as the skyrocketing costs of &lt;a href="https://www.typemock.com/software-bugs-infographic"&gt;catching bugs later&lt;/a&gt;, but the value of code reviews far exceeds that of simple debugging. The kinds of improvements code reviews achieve can sometimes only be felt years later, when an entirely different team is charged with updating the codebase and finding easily readable code.&lt;/p&gt;

&lt;p&gt;Some things you just can't measure. We need to accept this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expect people will be reading you
&lt;/h2&gt;

&lt;p&gt;This goes for several stages of the process. Sometimes developers will tend to forget that all their notes and comments will be read by a person that is also a teammate. A person with feelings, issues, and varying degrees of seniority and skill. Sometimes developers will tend to forget that their code will have to be read and understood by people over time.&lt;/p&gt;

&lt;p&gt;This means you must be mindful of what you're telling others, but also what you're asking of them. A couple of examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massive pull requests will probably lead to shorter and more superficial comments. Is this what you want?&lt;/li&gt;
&lt;li&gt;Reviewers will need to place themselves. Have you provided the context that will allow them to fully understand what you're going for?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always keep in mind: if you're typing it, expect someone will read it.&lt;/p&gt;

&lt;h2&gt;
  
  
  People make mistakes
&lt;/h2&gt;

&lt;p&gt;One of the hardest things to manage regarding code reviews is the frustration that comes from reviewing bad code. Lots of mistakes, bad choices in terms of style, and unreadable code.&lt;/p&gt;

&lt;p&gt;This, however, is almost inevitable. You're going to have to deal with bad code sometimes.&lt;/p&gt;

&lt;p&gt;It's important to not let that frustration boil over into aggressive or hurtful comments. Communication must always be geared towards improvement, both of the codebase and the team. Code reviews are a great way for everyone to learn from mistakes, but that depends on the kindness of the reviewers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be mindful of people's schedules
&lt;/h2&gt;

&lt;p&gt;Full-time code reviewers are rare. And even if they weren't, they would have a schedule anyway. Sometimes we expect our colleagues to pick up whatever is our priority as if it is also theirs, but that's not how it works.&lt;/p&gt;

&lt;p&gt;Code reviews are often treated by teams like an afterthought, something that can be done by anyone "as soon as they have a minute". This is never the case, and reviewing is a task that should be treated with the same consideration as any other. Assign your reviews in due time, and expect people will be busy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices matter
&lt;/h2&gt;

&lt;p&gt;Your expectations of code reviews should always take into account how they are being done. Are you posting the pull requests to a public channel and expecting anyone to pick them up? Then you shouldn't be surprised no one does, or if it takes them a long time to do so. Are you bundling up all the reviews and doing them at the end of the week? Then you should expect a lot of confusion. Are you reviewing for hours on end? Expect mistakes.&lt;/p&gt;

&lt;p&gt;The full benefit of code reviews heavily depends on them being integrated into a continuous code-review-centric operational model, and the more your practices reflect this, the more you can expect from them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code reviews are about your team
&lt;/h2&gt;

&lt;p&gt;An underappreciated aspect of code reviews is how they are a collective endeavor. We believe in them as a form of fomenting co-ownership of the codebase, and always tell reviewers to not think of what they're looking over as someone else's work. It belongs to the whole team.&lt;/p&gt;

&lt;p&gt;Code reviews, when done right, will expand the whole team's knowledge of the product, and help everyone learn with both the mistakes and the skills of everyone else.&lt;/p&gt;

&lt;p&gt;This is probably the most important thing you can expect from code reviews, if you make them work in that way: you can expect them to be not only a guarantor of your code's quality, but also a true engine of team building.&lt;/p&gt;




&lt;p&gt;What are your expectations for code reviews? Did we miss something important? Drop us a line on Twitter (&lt;a href="https://twitter.com/codereviewpad"&gt;@codereviewpad&lt;/a&gt;) and let us know!&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Mitigating Conflicts In Pull Requests</title>
      <dc:creator>Marcelo Sousa</dc:creator>
      <pubDate>Wed, 01 Sep 2021 16:13:13 +0000</pubDate>
      <link>https://dev.to/reviewpad/mitigating-conflicts-in-pull-requests-35g2</link>
      <guid>https://dev.to/reviewpad/mitigating-conflicts-in-pull-requests-35g2</guid>
      <description>&lt;p&gt;&lt;em&gt;One of the most annoying tasks for a developer is to fix git conflicts. You open a pull request, ace the code review process, all checks are passing&lt;/em&gt;, &lt;em&gt;and when you go for that merge button you find out that it is blocked because of git conflicts. Wouldn’t it be nice if you could avoid this situation?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Developers that use a &lt;a href="https://reviewpad.com/blog/github-flow-trunk-based-development-and-code-reviews/" rel="noopener noreferrer"&gt;git flow&lt;/a&gt; branching model rely on 3-way merge tools (like &lt;em&gt;git-merge&lt;/em&gt; or &lt;em&gt;kdiff3&lt;/em&gt;) to automatically merge their changes.&lt;/p&gt;

&lt;p&gt;Unfortunately, these tools are unable to resolve all concurrent changes made to files in the branches involved in the merge. As developers, we experience these &lt;em&gt;unresolved&lt;/em&gt; concurrent changes as &lt;strong&gt;git merge conflicts&lt;/strong&gt;. As the name suggests, the existence of a git merge conflict prevents the merge action.&lt;/p&gt;

&lt;p&gt;The exact definition of a git merge conflict depends on the algorithm used to compute the merge commit. The most widely used algorithms are textual in nature – a conflict in a file means that the branches involved in the merge have both made modifications to the same line in a file. Nowadays, there are much more sophisticated algorithms to compute merge commits than what is offered in GitHub, Gitlab, or Bitbucket. For an overview check out the article &lt;a href="https://dl.acm.org/doi/pdf/10.1145/3276535" rel="noopener noreferrer"&gt;Verified Three-Way Program Merge&lt;/a&gt; – we do plan to incorporate some of them soon into Reviewpad.&lt;/p&gt;

&lt;p&gt;However, a merge is and always will be a sensitive operation. That is, some concurrent changes really do conflict and require human intervention.&lt;/p&gt;

&lt;p&gt;The reality is that git merge conflicts are relatively common in highly collaborative teams.&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%2F49v94pob82mhqoou9lpm.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%2F49v94pob82mhqoou9lpm.png" alt="Guava Board"&gt;&lt;/a&gt;&lt;/p&gt;
There are currently 27 pull requests blocked in the &lt;a href="https://github.com/google/guava/pulls" rel="noreferrer noopener"&gt;google/guava&lt;/a&gt; project because of git conflicts.



&lt;p&gt;While some conflicts are unavoidable, it is possible to create awareness of their future existence so that you can mitigate their effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviewpad’s Concurrent Pull Request Analysis
&lt;/h2&gt;

&lt;p&gt;At Reviewpad, we believe that git conflicts are being discovered at a very late stage in the review process. That is very annoying because sometimes after you have gone through the entire review process you find out that a recently merged PR just introduced git conflicts. Now, you need to restart the entire process.&lt;/p&gt;

&lt;p&gt;So, to reduce this effort we have built into Reviewpad a concurrent pull request analysis that provides information about future git conflicts.&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%2Fhlbovjiy298vtfbv974i.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%2Fhlbovjiy298vtfbv974i.png" alt="Open PR"&gt;&lt;/a&gt;&lt;/p&gt;
Information about conflicting changes with ongoing reviews at &lt;a href="https://github.com/google" rel="noreferrer noopener"&gt;google&lt;/a&gt; / &lt;a href="https://github.com/google/guava" rel="noreferrer noopener"&gt;guava&lt;/a&gt; – &lt;a rel="noreferrer noopener" href="https://github.com/google/guava/pull/5654"&gt;&lt;/a&gt;&lt;a rel="noreferrer noopener" href="https://github.com/google/guava/pull/5654"&gt;#5654&lt;/a&gt; &lt;a rel="noreferrer noopener" href="https://github.com/google/guava/pull/5654"&gt;Remove redundant bit masking&lt;/a&gt;.



&lt;p&gt;The way Reviewpad keeps track of potential future git conflicts is by checking if modified files in a particular pull request are also modified in other open pull requests that share the base branch.&lt;/p&gt;

&lt;p&gt;We have been using this check in two use cases that improve the review process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve reviewer selection
&lt;/h3&gt;

&lt;p&gt;Finding the right reviewer can be difficult at times in highly collaborative projects. Who better to review than a developer who is also changing the same parts of the code, or a reviewer of such PR?&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jNLEL_GFfGY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Example of pull request without reviewers that has conflicts with concurrent PRs.



&lt;p&gt;In the video, we can see that there is another open PR that is also changing the &lt;code&gt;ci.yml&lt;/code&gt;. The author of that pull request could be a great candidate to review this pull request. Ideally, both developers could collaborate so that all conflicts could be avoided once one of the PRs is merged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve merge strategy
&lt;/h3&gt;

&lt;p&gt;As we mentioned in the beginning of this article, there is nothing more annoying than a pull request that is ready to merge but will be blocked by the merge of another PR. Although we can’t completely avoid this situation, we have integrated this check into &lt;a href="https://reviewpad.com/blog/a-board-to-rule-all-pull-requests/" rel="noopener noreferrer"&gt;Reviewpad’s Release Board&lt;/a&gt; so that it becomes evident.&lt;/p&gt;

&lt;p&gt;In this first version, we have decided to restrict this information to pull requests that are ready to merge. Here’s what a PR card with conflicts in concurrent PRs looks like:&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%2Fnajtffegw1fa65613d7k.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%2Fnajtffegw1fa65613d7k.png" alt="Pull Request Card"&gt;&lt;/a&gt;&lt;/p&gt;
Pull request card that is ready to merge and that has conflicts with another PR that is also ready to merge.



&lt;p&gt;In the following video, we go over the simple flow of approving a PR, seeing the conflicts in the &lt;strong&gt;Ready to Merge&lt;/strong&gt; column and also the effect of merging this PR which moves the conflicting PR back to the &lt;strong&gt;Git conflicts&lt;/strong&gt; column.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6Z22wHxW7_M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Integration of concurrent PR check with Review Board in the &lt;strong&gt;Ready to Merge&lt;/strong&gt; column.






&lt;h2&gt;
  
  
  Cool. How do I check this out by myself?
&lt;/h2&gt;

&lt;p&gt;We have a public beta version of Reviewpad available at &lt;a href="https://reviewpad.com/get-started/" rel="noopener noreferrer"&gt;reviewpad.com/get-started&lt;/a&gt;. You will need to create a new account and once you log in for the first time, you will see the following page to connect to a code host:&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%2Fct76he1fpvv6awocl191.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%2Fct76he1fpvv6awocl191.png" alt="Connect to code host page"&gt;&lt;/a&gt;&lt;/p&gt;
Connect to code host page on Reviewpad.



&lt;p&gt;You can connect to GitHub through our OAuth app or manually &lt;a href="https://docs.reviewpad.com/github" rel="noopener noreferrer"&gt;add a personal access token&lt;/a&gt;. The OAuth requires minimal scopes to be able to read and comment on public repositories.&lt;/p&gt;

&lt;p&gt;And voilà – you are ready to get started with Reviewpad!&lt;/p&gt;

&lt;p&gt;We are just getting started with incorporating features that improve the merge experience in pull requests. Feel free to reach us on our &lt;a href="https://reviewpad.com/slack" rel="noopener noreferrer"&gt;community Slack&lt;/a&gt; with requests!&lt;/p&gt;

</description>
      <category>git</category>
      <category>pullrequest</category>
      <category>conflict</category>
    </item>
    <item>
      <title>Pull Requests for Dummies</title>
      <dc:creator>Adriano Martins</dc:creator>
      <pubDate>Mon, 30 Aug 2021 09:48:50 +0000</pubDate>
      <link>https://dev.to/reviewpad/pull-requests-for-dummies-2baj</link>
      <guid>https://dev.to/reviewpad/pull-requests-for-dummies-2baj</guid>
      <description>&lt;p&gt;&lt;em&gt;Debate about code reviews is often dominated by debate about pull requests. The confusion between the two is so common we have made it a point to clarify that they are not the same quite often. So what are pull requests? And why are they called that way?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine you're writing a book.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://reviewpad.com/blog/series-for-dummies/"&gt;You knew that was coming&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;In this case, you're writing collaboratively. Let's say it's a non-fiction book, or a technical manual. Something that requires a certain degree of responsibility and accuracy.&lt;/p&gt;

&lt;p&gt;You will need to figure out a strategy to make sure there are as few mistakes as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How about… version control?
&lt;/h2&gt;

&lt;p&gt;If this is a collaborative work, then it stands to reason that you will want to keep your file (let's say a Word document) somewhere everyone can easily find it and work on it. Let's say you keep your manuscript on Dropbox.&lt;/p&gt;

&lt;p&gt;You (or any one of the other authors) are working on a specific chapter, so you download the manuscript that the team is keeping online. You would never edit the manuscript directly, that would be way too risky. You create a temporary version, and label it as such.&lt;/p&gt;

&lt;p&gt;You do your work, write your lines, make sure everything is to your liking, and then what do you do?&lt;/p&gt;

&lt;p&gt;You upload it to the Dropbox, always making sure that it's labeled correctly as a temporary version. Why? Because you would like feedback from your colleagues before &lt;strong&gt;pulling&lt;/strong&gt; everything together (notice our word choice there 🧐).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a simple word for asking for feedback?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;review&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dictionaries are interesting.&lt;/p&gt;

&lt;p&gt;Anyway, your colleagues will then look at your brand new text and they will carefully look over it. They will correct mistakes, leave notes and suggestions, make recommendations, and, of course, if all is well, simply accept it.&lt;/p&gt;

&lt;p&gt;When this is done, and the author of the new chapter is confident he's answered all the queries and fixed all the problems, they can then &lt;strong&gt;request&lt;/strong&gt; whoever is responsible for the manuscript to &lt;strong&gt;pull&lt;/strong&gt; his changed text into the main document.&lt;/p&gt;

&lt;p&gt;And that is what a &lt;strong&gt;pull request&lt;/strong&gt; is.&lt;/p&gt;

&lt;p&gt;When a developer finishes a task, they will start a process to &lt;strong&gt;join the new code to the project&lt;/strong&gt;. For that purpose, they will ask whoever's in charge of the project to &lt;strong&gt;pull&lt;/strong&gt; the changes from their working branch to the main branch. Voilá, a request to pull changes: a pull-request.&lt;/p&gt;

&lt;h2&gt;
  
  
  So it's not a review, but it implies a review?
&lt;/h2&gt;

&lt;p&gt;Most of the time, yes.&lt;/p&gt;

&lt;p&gt;Unless the changes are very trivial, it would be irresponsible to pull changes into the main branch without performing a code review.&lt;/p&gt;

&lt;p&gt;What happens frequently is the opposite: code reviews happen all the time without the need for a pull request.&lt;/p&gt;

&lt;p&gt;A developer might want to review the changes between different states of a project for many different purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auditing the source code is always important;&lt;/li&gt;
&lt;li&gt;Reviewing code without making it visible to everyone else in the project (pull-requests are always visible), for whatever reason;&lt;/li&gt;
&lt;li&gt;Reviewing the code when the project is scattered across many repositories;&lt;/li&gt;
&lt;li&gt;There are even some software development methodologies that don't use pull requests at all! And they still review code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We hope this helped clear up what pull requests are, and why they are often wrongly mistaken for code reviews. Are there any topics you'd like us to cover next on this series?&lt;/p&gt;

&lt;p&gt;If so, you know where to find us on Twitter (&lt;a href="http://twitter.com/codereviewpad/"&gt;@reviewpad&lt;/a&gt;)!&lt;/p&gt;

</description>
      <category>pullrequest</category>
      <category>git</category>
      <category>beginners</category>
    </item>
    <item>
      <title>When You Merge Pull Requests You Lose Knowledge</title>
      <dc:creator>Marcelo Sousa</dc:creator>
      <pubDate>Tue, 24 Aug 2021 15:33:30 +0000</pubDate>
      <link>https://dev.to/reviewpad/when-you-merge-pull-requests-you-lose-knowledge-194p</link>
      <guid>https://dev.to/reviewpad/when-you-merge-pull-requests-you-lose-knowledge-194p</guid>
      <description>&lt;p&gt;&lt;em&gt;What happens to comments and discussions of a pull request when it is merged? Isn’t that knowledge valuable for the team? Why isn’t it readily accessible to future pull requests?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pull requests (PRs) are a mainstream way of proposing changes to a codebase. One of the most important features around pull requests is the ability to perform a code review, allowing developers to inspect and comment on the proposed changes.&lt;/p&gt;

&lt;p&gt;Frequently, the knowledge in these comments is invaluable to the team. Reviewers, which are familiar with the codebase and related technologies, will notice bad patterns, suggest optimisations, enforce team guidelines and best practices, etc.&lt;/p&gt;

&lt;p&gt;However, as soon as you merge that pull request on GitHub, Gitlab, or Bitbucket, all this information is &lt;em&gt;lost&lt;/em&gt; into the bag of closed PRs that you will rarely (if ever) inspect.&lt;/p&gt;

&lt;p&gt;We all have had that dé&lt;em&gt;jà vu&lt;/em&gt; feeling when writing a comment in a code review: “Didn’t I write this comment already?” When preparing a PR sometimes we also have that feeling: “I think I’m forgetting something in this line of code.” Or better yet: “Didn’t someone already thought of this before?”&lt;/p&gt;

&lt;p&gt;Let’s look at three scenarios.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Knowledge useful to a broader audience
&lt;/h4&gt;

&lt;p&gt;Knowledge that could be beneficial to developers not involved in this codebase. For instance, &lt;a href="https://github.com/apache/superset/pull/14710#discussion_r637929403" rel="noopener noreferrer"&gt;this comment&lt;/a&gt; could be useful for other developers modifying similar code.&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%2Fat6xrzdnuh1t2h2xu90i.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%2Fat6xrzdnuh1t2h2xu90i.png" alt="Discussions useful in the future"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://github.com/apache/superset/pull/14710#discussion_r637929403" rel="noopener noreferrer"&gt;Discussion&lt;/a&gt;&lt;em&gt; by &lt;/em&gt;&lt;a href="https://github.com/kgabryje" rel="noopener noreferrer"&gt;kgabryje&lt;/a&gt;&lt;em&gt; at &lt;/em&gt;&lt;a href="https://github.com/apache/superset" rel="noopener noreferrer"&gt;apache / superset&lt;/a&gt;&lt;em&gt; “&lt;/em&gt;&lt;a href="https://github.com/apache/superset/pull/14710" rel="noopener noreferrer"&gt;feat(native-filters): add search all filter options #14710&lt;/a&gt;“



&lt;h4&gt;
  
  
  2. Knowledge about design decisions
&lt;/h4&gt;

&lt;p&gt;Teams with a lot of contributors can suffer from problems associated with the lack of context in design decisions. For instance, when a decision was taken on a discussion on a previous pull request. Consider the following discussion:&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%2F6k8ih0g0glzg1tc3ic04.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%2F6k8ih0g0glzg1tc3ic04.png" alt="Useful knowledge about design decisions in discussions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://github.com/dapr/dapr/pull/3297#discussion_r665609722" rel="noopener noreferrer"&gt;Discussion&lt;/a&gt;&lt;em&gt; with &lt;/em&gt;&lt;a href="https://github.com/halspang" rel="noopener noreferrer"&gt;halspang&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a href="https://github.com/artursouza" rel="noopener noreferrer"&gt;artursouza&lt;/a&gt;&lt;em&gt; at &lt;/em&gt;&lt;a href="https://github.com/dapr/dapr" rel="noopener noreferrer"&gt;dapr / dapr&lt;/a&gt;&lt;em&gt; “&lt;/em&gt;&lt;a href="https://github.com/dapr/dapr/pull/3297" rel="noopener noreferrer"&gt;Write reminders in multiple partitions #3297&lt;/a&gt;&lt;em&gt;“&lt;/em&gt;



&lt;p&gt;Assuming that this PR is merged, when someone else modifies this code in the future, it would be useful to retrieve this discussion. In this case, that would be particularly relevant if this person starts the support for a decrementing path.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Review déjà vu
&lt;/h4&gt;

&lt;p&gt;Senior developers that are active reviewers also experience what we call review déjà vus. These are situations where you are repeating similar comments in different PRs, like this one:&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%2Flc7wccblup0rzmnal1n8.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%2Flc7wccblup0rzmnal1n8.png" alt="Review dejá vù in discussions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://github.com/nim-lang/Nim/pull/16203#discussion_r534435743" rel="noopener noreferrer"&gt;Comment&lt;/a&gt;&lt;em&gt; by &lt;/em&gt;&lt;a href="https://github.com/timotheecour" rel="noopener noreferrer"&gt;timotheecour&lt;/a&gt;&lt;em&gt; at &lt;/em&gt;&lt;a href="https://github.com/nim-lang/Nim" rel="noopener noreferrer"&gt;nim-lang / Nim&lt;/a&gt;&lt;em&gt; “&lt;/em&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/16203" rel="noopener noreferrer"&gt;oids: switch from PRNG to random module #16203&lt;/a&gt;&lt;em&gt;“&lt;/em&gt;





&lt;p&gt;These situations also occur when there are some hidden assumptions that do not make sense to document in the code.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice if we could re-use the comments from past reviews into future PRs without having to maintain them?&lt;/p&gt;
&lt;h3&gt;
  
  
  Enter Reviewpad
&lt;/h3&gt;

&lt;p&gt;Reviewpad builds semantic diffs of changes in pull requests and associates metadata such as comments to these semantic objects. This is a big shift from the current behavior of existing code hosts such as Github, Gitlab, and Bitbucket. They associate comments to a line of a file in a particular git diff – as soon as the contents of the line change, this comment is marked as &lt;em&gt;outdated&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We’ll showcase Reviewpad with the &lt;em&gt;&lt;a href="https://tour.golang.org/concurrency/10" rel="noopener noreferrer"&gt;Web Crawler&lt;/a&gt;&lt;/em&gt; exercise of A Tour of Go using the linked &lt;a href="https://github.com/reviewpad/dejavus" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. In this exercise of A Tour of Go, we are given a first implementation of a fake web crawler – the exercise is to parallelise it and prevent fetching the same URL twice.&lt;/p&gt;
&lt;h4&gt;
  
  
  Semantic git diffs
&lt;/h4&gt;

&lt;p&gt;As a first step, we used &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/2" rel="noopener noreferrer"&gt;Reviewpad&lt;/a&gt; to create a pull request with this first implementation.&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%2Fe226jgeda6o3ggq0bpqi.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%2Fe226jgeda6o3ggq0bpqi.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Reviewpad interface for &lt;a rel="noreferrer noopener" href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/2"&gt;pull request&lt;/a&gt; after review and merge



&lt;p&gt;Reviewpad performs a relational static analysis (in the style of [1] and [2]) over the git diff associated with the pull request to build semantic diffs. These semantic diffs form what we call the &lt;strong&gt;Explore Tree&lt;/strong&gt; in Reviewpad.&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%2Fo7jzqmaws5rryw9ox9be.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%2Fo7jzqmaws5rryw9ox9be.png" alt="Reviewpad symbol tree"&gt;&lt;/a&gt;&lt;/p&gt;
Explore tree for &lt;a href="https://github.com/reviewpad/dejavus/pull/2" rel="noreferrer noopener"&gt;pull request&lt;/a&gt;



&lt;p&gt;An explore tree is an annotated file tree of the modified files. For each modified file, we present an annotated semantic tree of the changes. For example, the file &lt;code&gt;fakeFetcher.go&lt;/code&gt; as presented on &lt;a href="https://github.com/reviewpad/dejavus/pull/2/files#diff-242890664cf40fb88eaec89e6f477a923f63fec6fed10c42bb9e4fa2a95606f6" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; requires an entire scan to understand the main symbols added: 1) the type &lt;code&gt;fakeFetcher&lt;/code&gt;, 2) the struct &lt;code&gt;fakeResult&lt;/code&gt; with two fields &lt;code&gt;body&lt;/code&gt; and &lt;code&gt;urls&lt;/code&gt; and 3) the method &lt;code&gt;Fetch&lt;/code&gt;. Note that the method &lt;code&gt;Fetch&lt;/code&gt; is shown as a child of the type &lt;code&gt;fakeFetcher&lt;/code&gt; as it is the receiver type. At the moment, our analysers focus on types and methods – this is why we don’t show variable &lt;code&gt;fetcher&lt;/code&gt;. The color in the beginning of the symbol indicates the type of modification: green for added, red for deleted and yellow for modified.&lt;/p&gt;

&lt;p&gt;We show the explore tree on the left of the description and general conversation so that developers can quickly match the description and discussions to code changes.&lt;/p&gt;

&lt;p&gt;Each element of the explore tree is clickable to its representation in the git diff. For example, clicking on the &lt;code&gt;fakeFetcher&lt;/code&gt; type directs the user to the &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/2?base=953653eb93f5a5f57811746e197eb19fd9bc8d74&amp;amp;head=e06496d88c2bb59c3cb17b497ef7caeb3c16594f&amp;amp;review-mode=true#diff-fakeFetcher.goR5" rel="noopener noreferrer"&gt;beginning of the symbol in the diff&lt;/a&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%2Fvc8r6icp372563a0zdho.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%2Fvc8r6icp372563a0zdho.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Navigation from the explore tree to the code diff



&lt;p&gt;Note: For those you noticed the coloured icon next to the file &lt;code&gt;go.mod&lt;/code&gt; – this means that the file is automatically hidden from the review mode. Each Reviewpad user can tweak their file view in their review settings to exclude files.&lt;/p&gt;

&lt;p&gt;In this PR, I did a &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/2?base=953653eb93f5a5f57811746e197eb19fd9bc8d74&amp;amp;head=e06496d88c2bb59c3cb17b497ef7caeb3c16594f#review-d11ab796-13e5-4735-8060-9b45499e0069" rel="noopener noreferrer"&gt;first review&lt;/a&gt; to document parts of the code. For example, while the original code for &lt;code&gt;Crawl&lt;/code&gt; is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
    // TODO: Fetch URLs in parallel.
    // TODO: Don't fetch the same URL twice.
    // This implementation doesn't do either:
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I chose to &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/2?base=953653eb93f5a5f57811746e197eb19fd9bc8d74&amp;amp;head=e06496d88c2bb59c3cb17b497ef7caeb3c16594f&amp;amp;review-mode=true#comment-ea03c917-a66f-454d-a3b8-74b7b30e05d1" rel="noopener noreferrer"&gt;comment&lt;/a&gt; on the function as a code diff comment. These review comments are inserted into the knowledge base maintained by Reviewpad:&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%2F0zlnkoy7544cyurld5i9.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%2F0zlnkoy7544cyurld5i9.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Diff comment in Crawl function



&lt;p&gt;Note that the comment in the explore tree appears as a child of &lt;code&gt;Crawl&lt;/code&gt; symbol. This means that the comment was made in the definition of the symbol (not just in its signature).&lt;/p&gt;

&lt;h4&gt;
  
  
  Comments from past reviews
&lt;/h4&gt;

&lt;p&gt;After the PR with the initial code was squash and merged, I created a &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/3" rel="noopener noreferrer"&gt;new PR&lt;/a&gt; with a &lt;a href="https://www.notion.so/6a4979aa7f8b90db6cbc74400d0beb49" rel="noopener noreferrer"&gt;solution&lt;/a&gt; presented by the GitHub user &lt;a href="https://github.com/harryhare" rel="noopener noreferrer"&gt;harryhare&lt;/a&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%2Figqrf320iogzzf6f8yjx.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%2Figqrf320iogzzf6f8yjx.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Reviewpad interface for &lt;a rel="noreferrer noopener" href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/3"&gt;pull request&lt;/a&gt; with first solution



&lt;p&gt;The explore tree again shows the overview of the solution which involve the introduction of a &lt;code&gt;SafeCounter&lt;/code&gt; struct with a map &lt;code&gt;v&lt;/code&gt; to check if an URL was visited, a mutex &lt;code&gt;mux&lt;/code&gt; and a method &lt;code&gt;checkvisited&lt;/code&gt; that checks if URL was already visited or not.&lt;/p&gt;

&lt;p&gt;The rest of the solution involves changes to the functions &lt;code&gt;Crawl&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt; to fetch URLs in parallel. In the &lt;code&gt;Crawl&lt;/code&gt; method, Reviewpad presents the comment from the past PR that documents the method. This way, developers can retrieve discussions from previous PRs that changed this method.&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%2Fvzx14m55fyrq9m5njz0a.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%2Fvzx14m55fyrq9m5njz0a.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Code diff view with comment from previous pull request



&lt;p&gt;A user review raised an issue with the &lt;code&gt;checkvisited&lt;/code&gt; which is fixed in the commit &lt;code&gt;[fix from review](https://github.com/reviewpad/dejavus/pull/3/commits/a629a38fddad2305a13f2ce07da6a001c263920b)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/3?base=004717a707bb13b9b25cae49cb591c412ae7b8ff&amp;amp;head=a629a38fddad2305a13f2ce07da6a001c263920b#review-cb18ad6e-eb82-47f2-8626-d3dbb7f1e43c" rel="noopener noreferrer"&gt;final review&lt;/a&gt; approves the PR with the request to remove the TODOs in the code.&lt;/p&gt;

&lt;p&gt;In the final &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/3?base=004717a707bb13b9b25cae49cb591c412ae7b8ff&amp;amp;head=17df68f8195eb427fd84d57fae7dc92663a8efd8&amp;amp;review-mode=true&amp;amp;hide_symbol_comments_history=false#diff-crawler.goR7" rel="noopener noreferrer"&gt;commit&lt;/a&gt; of this PR, we add the reference to the solution as a code comment in the &lt;code&gt;Crawl&lt;/code&gt; method and remove the TODOs.&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%2Fjmn4nqfepcu9brnhdm74.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%2Fjmn4nqfepcu9brnhdm74.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Reviewpad interface for all changes in &lt;a rel="noreferrer noopener" href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/3"&gt;pull request&lt;/a&gt;



&lt;p&gt;Hovering on the function &lt;code&gt;Crawl&lt;/code&gt; in the explore tree displays the code documentation associated with this function for readability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Keeping track of comments and changes over time
&lt;/h4&gt;

&lt;p&gt;At this point you might be wondering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What happens if the comment was made in a PR that was not the exact previous one?&lt;/li&gt;
&lt;li&gt;  What happens if I start refactoring the code?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To answer these questions, let’s go over the two open PRs in our &lt;a href="https://beta.reviewpad.com/project/github.com/reviewpad/dejavus" rel="noopener noreferrer"&gt;project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first is an improvement proposed by another Github user that uses &lt;em&gt;wait groups&lt;/em&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%2F933mu23pptppv30rjt7g.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%2F933mu23pptppv30rjt7g.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a rel="noreferrer noopener" href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/4?base=b8faf59d56b2635b94a3a87431b6a654a917f8dd&amp;amp;head=e548593190974aa0327fb2d6b6ec516a6900eb61&amp;amp;review-mode=true"&gt;Pull request&lt;/a&gt; proposing an improvement using wait groups



&lt;p&gt;The comment shown in this pull request was the one made in the first PR. Reviewpad tracks comments regardless of their time difference. For example in the following &lt;a href="https://beta.reviewpad.com/review/github.com/google/error-prone/pull/1817?base=e7a6713dd4775efaece12a2facd2f29d5ba02c25&amp;amp;head=f57bdf7d67fb340abad6f3732f2b8e1cab12ea76&amp;amp;review-mode=true#diff-check_api/src/main/java/com/google/errorprone/fixes/SuggestedFixes.java" rel="noopener noreferrer"&gt;PR&lt;/a&gt; from the google/error-prone project:&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%2F8c13p63ke879gwv8o0xp.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%2F8c13p63ke879gwv8o0xp.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Reviewpad review mode for &lt;a rel="noreferrer noopener" href="https://beta.reviewpad.com/review/github.com/google/error-prone/pull/1817?base=e7a6713dd4775efaece12a2facd2f29d5ba02c25&amp;amp;head=f57bdf7d67fb340abad6f3732f2b8e1cab12ea76&amp;amp;review-mode=true#diff-check_api/src/main/java/com/google/errorprone/fixes/SuggestedFixes.java"&gt;pull request&lt;/a&gt; of the google/error-prone project. You can check it on Github &lt;a href="https://github.com/google/error-prone/pull/1817" rel="noopener noreferrer"&gt;here&lt;/a&gt;.



&lt;p&gt;The PR was opened in September 2020 and it is changing class methods that were commented in January 2020.&lt;/p&gt;

&lt;p&gt;The second open &lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/5" rel="noopener noreferrer"&gt;pull request&lt;/a&gt; demonstrates a beta version of our refactoring analyser:&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%2Fnzsb03bsy9qvawjf46ui.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%2Fnzsb03bsy9qvawjf46ui.png" alt="Reviewpad screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://beta.reviewpad.com/review/github.com/reviewpad/dejavus/pull/5" rel="noreferrer noopener"&gt;Pull request&lt;/a&gt; with a refactoring



&lt;p&gt;In this PR, we introduced two commits, the first that changes the signature of the function &lt;code&gt;Crawl&lt;/code&gt; by renaming the variable &lt;code&gt;url&lt;/code&gt; to &lt;code&gt;reqUrl&lt;/code&gt; and the second renames the file.&lt;/p&gt;

&lt;p&gt;Reviewpad understands that it is the same function and presents the comment made in the first PR. Note that we are squash and merging these pull requests – the commit associated with the comment is not an ancestor of the commits in this PR.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cool. How do I check this out by myself?
&lt;/h3&gt;

&lt;p&gt;We have a public beta version of Reviewpad available at &lt;a href="https://reviewpad.com/get-started/" rel="noopener noreferrer"&gt;https://reviewpad.com/get-started/&lt;/a&gt;. You will need to create a new account and once you log in for the first time, you will see the following page to connect to a code host:&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%2Fnn7yr1j3wungd53tqwr0.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%2Fnn7yr1j3wungd53tqwr0.png" alt="Reviewpad Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Connect to code host page on Reviewpad



&lt;p&gt;You can connect to GitHub through our OAuth app or manually &lt;a href="https://docs.reviewpad.com/github" rel="noopener noreferrer"&gt;add a personal access token&lt;/a&gt;. The OAuth requires minimal scopes to be able to read and comment on public repositories.&lt;/p&gt;

&lt;p&gt;And that’s it – you will be able to give Reviewpad a spin on public repositories! We will be adding more and more public repositories in the upcoming days – feel free to reach us on our &lt;a href="https://reviewpad.com/slack" rel="noopener noreferrer"&gt;community Slack&lt;/a&gt; with requests!&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;[1]: &lt;a href="https://dl.acm.org/doi/abs/10.1145/2908080.2908092" rel="noopener noreferrer"&gt;Cartesian hoare logic for verifying k-safety properties&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;[2]: &lt;a href="https://www.notion.so/18-Stop-losing-knowledge-when-you-merge-pull-requests-c9696eafba52432ab09f62ac1abce95b" rel="noopener noreferrer"&gt;Verified three-way program merg&lt;/a&gt;&lt;a href="https://dl.acm.org/doi/10.1145/3276535" rel="noopener noreferrer"&gt;e&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>pullrequest</category>
      <category>knowledge</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A code review checklist from Reviewpad</title>
      <dc:creator>Reviewpad</dc:creator>
      <pubDate>Fri, 20 Aug 2021 09:25:02 +0000</pubDate>
      <link>https://dev.to/reviewpad/a-code-review-checklist-from-reviewpad-1887</link>
      <guid>https://dev.to/reviewpad/a-code-review-checklist-from-reviewpad-1887</guid>
      <description>&lt;p&gt;&lt;em&gt;Not everyone will need a checklist for code reviews, and not all code reviews will fit into your checklist. We accept that, and &lt;a href="https://reviewpad.com/blog/six-more-best-practices-to-improve-your-code-review/"&gt;we have written about how some more senior developers sometimes even think they get in their way&lt;/a&gt;. They are a very good idea, however, if you haven't yet reached a comfort zone with your reviews.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A good checklist will keep you &lt;strong&gt;consistent&lt;/strong&gt;. It will also prevent mistakes and omissions.&lt;/p&gt;

&lt;p&gt;Here's our humble proposal, just to get you started:&lt;/p&gt;

&lt;h3&gt;
  
  
  Are all requirements met? 📋
&lt;/h3&gt;

&lt;p&gt;Requirements are the basis for all development. Regardless of what the project you're working on is, and its scope, you will have a series of basic (and not so basic) requirements that the code must accomplish.&lt;/p&gt;

&lt;p&gt;Check them, one by one.&lt;/p&gt;

&lt;p&gt;Find the relevant code.&lt;/p&gt;

&lt;p&gt;Review it.&lt;/p&gt;

&lt;p&gt;Job done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are code conventions being followed? 🤝
&lt;/h3&gt;

&lt;p&gt;Code conventions aren't bylaws, and they will change from project to project, and from language to language. They must be kept consistent throughout, otherwise, you can give rise to a whole ocean of troubles.&lt;/p&gt;

&lt;p&gt;Whatever's been established for the project and language you're working with, it's your job while doing a code review, that everything is up to snuff. That ranges from things as trite as indentation to things as meaningful as comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt; is the key word.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are magic values/scenarios accounted for? 🦄
&lt;/h3&gt;

&lt;p&gt;What would you think if you saw the number 259200000 in the middle of a particularly important piece of code about dates (i.e. days and months, not romantic liaisons), with no explanation?&lt;/p&gt;

&lt;p&gt;And that number is absolutely key for the way the function works?&lt;/p&gt;

&lt;p&gt;You wouldn't be happy, would you? Well, that's the number of milliseconds in three days, and some people might immediately get it and others might not. Anything that is key for the inner workings of your code that isn't explained, is said to just "magically" work.&lt;/p&gt;

&lt;p&gt;There's no magic in development. Make sure everything is clear. Which leads us to:&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the code easy to read? 🤓
&lt;/h3&gt;

&lt;p&gt;Remember: you don't know who is going to be doing maintenance on the code base your team is working on. It may be you, or not. And even if it is you, it's going to be the &lt;strong&gt;future you&lt;/strong&gt;. We can promise you right now that you will not remember why that wonderfully clever function you've just written down works.&lt;/p&gt;

&lt;p&gt;Everything needs to be readable. As readable as you can possibly make it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it have good test coverage? ✅
&lt;/h3&gt;

&lt;p&gt;As much as the codebase as possible should be covered when running your tests. If the percentage isn't high enough, then you probably need to consider changing the battery of tests you're running.&lt;/p&gt;

&lt;p&gt;Tests aren't technically a part of code reviews, but they definitely go hand in hand as two of the most effective practices to ensure code quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there no unused code? 💤
&lt;/h3&gt;

&lt;p&gt;Pretty self-explanatory, right? If the code is unused, it shouldn't be there. No good can come of it. Only mistakes.&lt;/p&gt;




&lt;p&gt;Did you enjoy our little checklist? Did we miss something? Is there a key step to your reviewing process that you feel should be on everyone's list?&lt;/p&gt;

&lt;p&gt;Make sure to drop us a line on Twitter (&lt;a class="mentioned-user" href="https://dev.to/codereviewpad"&gt;@codereviewpad&lt;/a&gt;) and let us know.&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>checklist</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
