<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gaurav Keswani</title>
    <description>The latest articles on Forem by Gaurav Keswani (@gaurav_keswani).</description>
    <link>https://forem.com/gaurav_keswani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F347852%2Fec5d7825-5567-40cd-a7df-2f21cfac34b0.jpg</url>
      <title>Forem: Gaurav Keswani</title>
      <link>https://forem.com/gaurav_keswani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gaurav_keswani"/>
    <language>en</language>
    <item>
      <title>Event-Driven Serverless Computing</title>
      <dc:creator>Gaurav Keswani</dc:creator>
      <pubDate>Fri, 31 Jul 2020 20:53:36 +0000</pubDate>
      <link>https://forem.com/gaurav_keswani/event-driven-serverless-computing-5a3h</link>
      <guid>https://forem.com/gaurav_keswani/event-driven-serverless-computing-5a3h</guid>
      <description>&lt;p&gt;&lt;em&gt;In a previous post, I wrote about serverless computing and why it should be on your mind while building software applications in today's world.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/gaurav_keswani" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kJ99kq3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--SWtWHHlv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/347852/ec5d7825-5567-40cd-a7df-2f21cfac34b0.jpg" alt="gaurav_keswani image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/gaurav_keswani/what-is-serverless-computing-4pbc" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;What is Serverless Computing? 🤔&lt;/h2&gt;
      &lt;h3&gt;Gaurav Keswani ・ Jul 31 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#serverless&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#azure&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#googlecloud&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;Wikipedia defines serverless computing as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Serverless computing is a cloud-computing execution model in which the cloud provider runs the server, and dynamically manages the allocation of machine resources.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Simply put, serverless computing is a paradigm of computing that entirely manages the deployment and execution of the code while allowing the developer to focus on their application logic.&lt;/p&gt;




&lt;h1&gt;
  
  
  Serverless Design Patterns
&lt;/h1&gt;

&lt;p&gt;Serverless computing has three major design patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event-driven data processing&lt;/li&gt;
&lt;li&gt;Web applications&lt;/li&gt;
&lt;li&gt;Event workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I'll go into details for the "Event-driven data processing" pattern and follow up with posts for the other two at a later time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event-Driven Data Processing
&lt;/h2&gt;

&lt;p&gt;One of the most common applications for serverless computing is to trigger actions after an event occurs. This pattern is known as the event-driven data processing pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case
&lt;/h3&gt;

&lt;p&gt;Allow client applications to upload images to AWS S3 and compress the image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solutions
&lt;/h3&gt;

&lt;p&gt;One way of building a system that does this would be to use a batch process that continuously polls our S3 bucket for newly uploaded images. Once our batch process finds a new image, it can compress it and store the compressed image in the destination S3 bucket.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--auSSoIHq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AlR4P23hnKvAXZ2ezlAL60A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--auSSoIHq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AlR4P23hnKvAXZ2ezlAL60A.png" alt="Batch Process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While this would do the job, one can argue that there is a better way to do it. Instead of having a batch process continuously poll the S3 bucket (which is a massive waste of resources😔), we can have our application submit the image to a message queue (like AWS SQS) and have the queue workers do the job of compression and loading into AWS S3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ggivYbyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AXwEgsmmL7BugdqZkmlsOdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ggivYbyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AXwEgsmmL7BugdqZkmlsOdQ.png" alt="SQS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the second solution with the message queue is better than the first one, there are two issues with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We must have the queue workers (batch processes that poll for messages from AWS SQS) running at all times😔 irrespective of whether a client is submitting images or not.&lt;/li&gt;
&lt;li&gt;Our client application now has to submit to SQS instead of doing what it was originally supposed to do i.e. store images in S3. While this isn't a huge deal, it leaks unnecessary information to the client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where serverless and the event-driven data processing pattern comes into the picture. The serverless solution would &lt;strong&gt;let the user upload the image to S3 and have a lambda function triggered every time a new image is uploaded&lt;/strong&gt;. This lambda function would have to contain the application logic to compress the image and store the compressed image back into the destination S3 bucket.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Kxv1zPq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AgRboAz-3Zbjml5_mFgCoiQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Kxv1zPq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1320/1%2AgRboAz-3Zbjml5_mFgCoiQ.png" alt="Serverless Solution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apart from being straightforward, using a serverless solution in this scenario is also much cheaper🤑 . This is because you only get charged for compute resources when an image is uploaded and compressed compared to the previous "server-full" solutions where you need to have a process running at all times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;At a very high level, event-driven serverless solutions have the following benefits when used in the right scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer Agility&lt;/strong&gt;: Developers can focus their efforts on application logic and deliver business value quicker rather than focussing on infrastructure issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elasticity&lt;/strong&gt;: The infrastructure scales down all the way to 0 if there are no incoming requests with little to no configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Cost&lt;/strong&gt;: We pay nothing for the periods when no requests coming in.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thank you for reading! ❤️&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>azure</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>What is Serverless Computing? 🤔</title>
      <dc:creator>Gaurav Keswani</dc:creator>
      <pubDate>Fri, 31 Jul 2020 20:44:06 +0000</pubDate>
      <link>https://forem.com/gaurav_keswani/what-is-serverless-computing-4pbc</link>
      <guid>https://forem.com/gaurav_keswani/what-is-serverless-computing-4pbc</guid>
      <description>&lt;p&gt;&lt;em&gt;Please note that this blog post is a compilation of my thoughts after working with different serverless solutions and reading the material provided by Amazon Web Services (Lambda Functions), Microsoft (Azure Functions), Google (Cloud Functions) and Twilio (Twilio Functions). The aim is to introduce you to the concept of serverless to pique your interest around this new computing paradigm.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Okay. So what is Serverless?
&lt;/h1&gt;

&lt;p&gt;Serverless architecture (also known as serverless computing) is a computing pattern where the application is hosted by a third-party service in a way where the developer does not need to manage the server software or hardware😍.&lt;br&gt;
Simply put, serverless computing is a paradigm of computing that entirely manages the deployment and execution of the code while allowing the developer to focus on their application logic.&lt;/p&gt;

&lt;h1&gt;
  
  
  And how does it differ from a PaaS (Platform as a Service) solution?
&lt;/h1&gt;

&lt;p&gt;In the world of PaaS, your applications are deployed as a single unit using some kind of web framework like Ruby on Rails, Django, etc. These deployments can only be scaled at the application level and you have no choice but to run multiple instances of your entire application to handle any additional load😔.&lt;/p&gt;

&lt;p&gt;With Serverless, also known as FaaS (Function as a Service), you can compose your application into individual, autonomous functions. Each function can be scaled individually and automatically as the function call frequency increases or decreases😃.&lt;/p&gt;

&lt;h1&gt;
  
  
  But why is this important?
&lt;/h1&gt;

&lt;p&gt;Being able to scale your functions individually and independently of the overall application is a very cost-effective🤑 way of paying for compute resources. This is because you will only pay for the number of times your function was called and the amount of time it spent performing the computation rather than paying to have your application always on and waiting for requests to come in.&lt;/p&gt;

&lt;h1&gt;
  
  
  So when should you consider using Serverless?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;When you have a high volume of activities (like web requests, kew messages, transactions) and you want to isolate and scale tasks independently.&lt;/li&gt;
&lt;li&gt;Dynamic workloads: If you have dynamic workloads or run something infrequently, it might not make sense paying for compute 24 x 7. Using the serverless pattern ensures that you don't get charged until your functions are called.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Wait. Does my cloud vendor even support this?
&lt;/h1&gt;

&lt;p&gt;All major cloud vendors have an implementation of serverless computing in 2020 and so there is really no excuse to ignore it😜.&lt;/p&gt;

&lt;p&gt;Amazon calls their implementation AWS Lambda, Microsoft calls their Azure Functions while Google calls it Cloud Functions. And while these names might differ they all pretty much do the exact same thing😂.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview"&gt;Azure Functions&lt;/a&gt;&lt;br&gt;
&lt;a href="https://cloud.google.com/functions"&gt;Google Cloud Functions&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Shouldn't we be building vendor-agnostic solutions though?
&lt;/h1&gt;

&lt;p&gt;If you really want to, sure. If you're someone that is on the multi-cloud train and aims to build a vendor-agnostic solution, there is something for you as well😉&lt;/p&gt;

&lt;p&gt;&lt;a href="//www.serverless.com"&gt;The Serverless Application Framework&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Why don't we migrate everything to serverless then?
&lt;/h1&gt;

&lt;p&gt;Serverless computing has some major benefits if used in the right way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced service costs 💵 since you only pay for what you use and when you use it.&lt;/li&gt;
&lt;li&gt;Simplified scalability management - The cloud vendor (AWS in this case) manages uptime, availability, reliability, etc and most companies in the world would be better off letting the cloud vendor manage this for them.&lt;/li&gt;
&lt;li&gt;Quicker and smaller deployments since the code is now decoupled into smaller units&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While there are clear benefits to using serverless, it comes with its own risks that need to be weighed before committing to it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immaturity of the ecosystem and lack of tooling&lt;/li&gt;
&lt;li&gt;It is difficult/expensive to migrate current legacy systems/monoliths (data migration, people training, code rewrites, etc)&lt;/li&gt;
&lt;li&gt;The decoupling can lead to too many small parts to manage 😕 if things are not planned well. This is something we're seeing today in the discussion of monoliths and micro-services as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Like most things in life, serverless comes with its own pros and cons. That being said, if used in the right scenario and built thoughtfully, the pros quickly outnumber the cons.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Thank you for reading! ❤️&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>azure</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Why code reviews should be top of mind for all engineering teams?</title>
      <dc:creator>Gaurav Keswani</dc:creator>
      <pubDate>Fri, 31 Jul 2020 20:26:40 +0000</pubDate>
      <link>https://forem.com/gaurav_keswani/why-code-reviews-should-be-top-of-mind-for-all-engineering-teams-1844</link>
      <guid>https://forem.com/gaurav_keswani/why-code-reviews-should-be-top-of-mind-for-all-engineering-teams-1844</guid>
      <description>&lt;p&gt;Code reviews are a great opportunity for developers to learn from each other and improve their skill set. At the same time, it's our last chance to avoid shipping bugs to production. Make sure you make good use of them instead of falling into a common trap&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d2JpPHnY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/770/0%2AbPxmaRf7W2sWF2Bb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d2JpPHnY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/770/0%2AbPxmaRf7W2sWF2Bb.png" alt="Code Review Trap"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Why are code reviews important?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The value it brings to the team
&lt;/h2&gt;

&lt;p&gt;Code review is one of the most crucial processes for ensuring knowledge transfer and best practices throughout a development team. As important as code reviews are, we typically leave it up to the reviewer to improve their process and this usually results in inconsistent review quality across a team. The poor reviewers become known and folks looking for an easy approval know who to go to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your team is only as good as your weakest reviewer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Catching errors early
&lt;/h2&gt;

&lt;p&gt;One part of managing a software-engineering process is catching problems at the "lowest-value" stage - that is, at the time at which the least investment has been made and at which problems cost the least to correct. To achieve such a goal, developers use "quality gates", periodic tests or reviews that determine whether the quality of the product at one stage is sufficient to support moving on to the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge Sharing
&lt;/h2&gt;

&lt;p&gt;A code review has 4 purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To make everyone on the team better&lt;/li&gt;
&lt;li&gt;To make everyone on the team better&lt;/li&gt;
&lt;li&gt;To make everyone on the team better&lt;/li&gt;
&lt;li&gt;To catch errors or code smells before they become bugs or tech debt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not me forgetting to change the 2nd and 3rd reasons. The first 3 reasons are the same because it's that much more important than anything else you do in a code review.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Making knowledge communal makes everyone better.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Making everyone on the team better means that everyone understands the codebase. Everyone understands the data flow. Everyone understands the reasoning behind not just the mechanics of why something is the way it is. At least someone at the code review learns something and this does not necessarily have to be the person whose code is being reviewed. While this may not always happen, it should always be the goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promoting Collective Ownership
&lt;/h2&gt;

&lt;p&gt;The original intent and a continued motivation behind the code review process is that they help us take collective ownership in the creation of our software. In other words, we're all stakeholders in the development process by having a hand in controlling the quality of our products.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sRV-XaUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/655/0%2ALclET8AnV3EVgjOy" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sRV-XaUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/655/0%2ALclET8AnV3EVgjOy" alt="Team Work"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Code Review Best Practices
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Keep reviews small
&lt;/h2&gt;

&lt;p&gt;Giving a valuable code review requires that pull requests are small. It's unfair to give a reviewer a diff consisting of hundreds or thousands of lines of code changes. They'll end up spending anywhere from 30 to 60 minutes reviewing that diff and then have to do re-reviews when the reviewee makes the suggested changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4yXdg7Gi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.inadram.com/media/review.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4yXdg7Gi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.inadram.com/media/review.jpg" alt="LOC v/s Defects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A larger review also leads to a lot more time spent in the process and a lower quality output than desired. This effect has been measured by multiple companies and is documented below as the inverse correlation between lines of code and defect density. (i.e. number of defects discovered in the code review stage)&lt;/p&gt;

&lt;h2&gt;
  
  
  Always discuss architecture
&lt;/h2&gt;

&lt;p&gt;Making sure that things are architected in a consistent and correct way is really important. This doesn't just benefit the piece of code being added, but also future hires. If things are consistent in terms of architecture it's easier for new people to understand how things fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to relevant style guidelines
&lt;/h2&gt;

&lt;p&gt;If you find code that needs to be changed to conform to your team's style guidelines or language guidelines (like PEP8 for Python), link to a document that outlines this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you find yourself commenting on style frequently, you should automate code style through hooks. The idea should be to focus on reviewing the code for correctness rather than style!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Constructive criticism
&lt;/h2&gt;

&lt;p&gt;It is very important to cultivate a constructive criticism culture in your team and value it the most.&lt;/p&gt;

&lt;p&gt;To have someone say all kinds of stuff about your code can be tough. We learn that criticism means you did something bad, you screwed up. And we tend to take it personally, to get offended, to feel not good enough. This is one attitude each and every one of us needs to get over. To not take criticism personally but as a suggestion of how to become better and constantly improve.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is very important to have someone that challenges your code constantly. There is no faster way of becoming a better programmer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  As a senior developer, should I be doing code reviews?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1_0PxW8Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/563/0%2A9WA62nDosmn3sTeE" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1_0PxW8Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/563/0%2A9WA62nDosmn3sTeE" alt="Harry Potter's Snape saying always!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Absolutely. In fact, you should be doing more code reviews as your responsibility on the team grows. There are multiple reasons around this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There's always something to learn, even from more new developers.&lt;/li&gt;
&lt;li&gt;You can understand the problems that particular developers face and help them out.&lt;/li&gt;
&lt;li&gt;Spotting repeating problems allows senior developers to start thinking about raising those issues in team meetings, creating more guidelines around them, giving presentations or writing articles, or possibly writing custom static analysis rules to catch these problems before code reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Communication is key
&lt;/h2&gt;

&lt;p&gt;As a code reviewee, it's fine to conduct a drafting/work in progress review to solicit preliminary feedback (especially for large changes), but make sure to explicitly communicate this with the reviewer to avoid confusion. Also, make sure to communicate with your reviewer when your review has left the "drafting" state.&lt;/p&gt;

&lt;p&gt;As a code reviewer, remember that reviews don't need to be finished in one sitting (especially large ones). If the review is large, review a chunk of code at a time and communicate your progress. Communication is important to avoid multiple back and forth and to avoid giving a false sense of being near to completion to the code reviewee. This will then allow the code reviewee to plan their day and other tasks accordingly while also communicating the correct estimations to the project lead and manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Point out good lines of code
&lt;/h2&gt;

&lt;p&gt;It is good practice to let the code reviewee know when you were impressed with a particular code snippet or learnt something new from their code review. This behaves like a morale booster for the reviewee and also lets them know that the approach they tried was better than the status quo of the code base.&lt;/p&gt;

&lt;p&gt;A shout out like this also leads to a permanent registry of this new way of doing things in their mind (and the team's mind!) and might encourage them to try more of their ideas in the future instead of sticking to the way things are usually done on the team.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give shoutouts when you learn something new because it is in those moments that you level up from your local maxima as an engineering team.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Thank you for reading❤️ &lt;/p&gt;

</description>
      <category>codequality</category>
      <category>computerscience</category>
      <category>healthydebate</category>
    </item>
  </channel>
</rss>
