<?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: Ravin Rau</title>
    <description>The latest articles on Forem by Ravin Rau (@juniourrau).</description>
    <link>https://forem.com/juniourrau</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%2F627952%2Fac6cb717-a0ac-4f9a-80b3-094dc5c545a4.png</url>
      <title>Forem: Ravin Rau</title>
      <link>https://forem.com/juniourrau</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juniourrau"/>
    <language>en</language>
    <item>
      <title>🌐 HTTP Status Codes: A Comprehensive Guide to API Responses</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Sat, 01 Feb 2025 21:05:43 +0000</pubDate>
      <link>https://forem.com/juniourrau/http-status-codes-a-comprehensive-guide-to-api-responses-13pm</link>
      <guid>https://forem.com/juniourrau/http-status-codes-a-comprehensive-guide-to-api-responses-13pm</guid>
      <description>&lt;p&gt;"Is this just a &lt;strong&gt;200 OK&lt;/strong&gt;? No, maybe a &lt;strong&gt;202 Accepted&lt;/strong&gt;… or wait, is it actually a &lt;strong&gt;201 Created&lt;/strong&gt;? Or should it be a &lt;strong&gt;204 No Content&lt;/strong&gt;? Why does this feel like a philosophical debate instead of a status code?"&lt;/p&gt;

&lt;p&gt;One moment, you are confidently returning a &lt;strong&gt;404 Not Found&lt;/strong&gt;, only to realize it was actually a &lt;strong&gt;403 Forbidden&lt;/strong&gt; situation. The next, you're staring at an error log, wondering if this is more of a &lt;strong&gt;503 Service Unavailable&lt;/strong&gt; or just your sanity slowly timing out.&lt;/p&gt;

&lt;p&gt;Deciding on the HTTP status code for my backend REST API has always been a bit tricky. I have been reading through the &lt;a href="https://tools.ietf.org/html/rfc7231" rel="noopener noreferrer"&gt;RFC 7231&lt;/a&gt; and &lt;a href="http://httpstatuses.com" rel="noopener noreferrer"&gt;httpstatuses.com&lt;/a&gt;, and I am overwhelmed by the number of status codes available. So, in this article, I would like to provide a comprehensive guide on when to use each type of status code.&lt;/p&gt;




&lt;p&gt;HTTP status codes are essential for communication between clients and servers in web APIs. They provide quick insights into the outcome of a request, enabling engineers to diagnose issues and improve user experiences. These codes are grouped into five classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1xx (Informational):&lt;/strong&gt; The request was received, and the process is continuing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2xx (Successful):&lt;/strong&gt; The request was successfully received, understood, and accepted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3xx (Redirection):&lt;/strong&gt; Further action is needed to complete the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4xx (Client Error):&lt;/strong&gt; There was an error with the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5xx (Server Error):&lt;/strong&gt; The server failed to fulfill a valid request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwadguq6cucpqx1cuvmiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwadguq6cucpqx1cuvmiy.png" alt="HTTP Status Code Flowchart Guide" width="800" height="817"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1xx: Informational Responses
&lt;/h2&gt;

&lt;p&gt;These codes indicate provisional responses while the request is being processed.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.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%2Fc6twif5ot1vlarsqcuuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fc6twif5ot1vlarsqcuuj.png" alt="100-199 Informational Responses" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;When to Use / Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Continue&lt;/td&gt;
&lt;td&gt;Use this when the initial part of a request has been received and the client should continue sending the rest.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Switching Protocols&lt;/td&gt;
&lt;td&gt;Use this when the client requests a change in protocols (e.g., from HTTP/1.1 to HTTP/2) and the server agrees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Processing (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the server is still processing the request but no final response is yet available.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Early Hints&lt;/td&gt;
&lt;td&gt;Use this with the &lt;code&gt;Link&lt;/code&gt; header to tell the client to begin preloading resources while the server prepares the final response.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;100 Continue&lt;/strong&gt; for large payloads (e.g., file uploads) to avoid unnecessary data transfers if headers are invalid.
&lt;/li&gt;
&lt;li&gt;Reserve &lt;strong&gt;1xx&lt;/strong&gt; codes for niche cases; most APIs don’t need them.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2xx: Successful Responses
&lt;/h2&gt;

&lt;p&gt;These codes indicate the request was successfully received, understood, and processed. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fne3ku1h31ll911a5y2t5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fne3ku1h31ll911a5y2t5.png" alt="200-299 Successful Responses" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;When to Use / Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;Use this when a request has succeeded. It is the standard response for successful HTTP requests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;Use this when a request has been fulfilled and has resulted in one or more new resources being created (e.g., after a successful POST request).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;202&lt;/td&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;td&gt;Use this when a request has been accepted for processing, but the processing is not yet complete.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;Non-Authoritative Information&lt;/td&gt;
&lt;td&gt;Use this when the returned meta-information is not exactly from the origin server but from a local or third-party copy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;204&lt;/td&gt;
&lt;td&gt;No Content&lt;/td&gt;
&lt;td&gt;Use this when the server successfully processed the request but does not need to return any content (e.g., a successful DELETE request).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;205&lt;/td&gt;
&lt;td&gt;Reset Content&lt;/td&gt;
&lt;td&gt;Use this when the request was successful and the client needs to reset the document view (e.g., clear a form after submission).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;Partial Content&lt;/td&gt;
&lt;td&gt;Use this when only part of the resource is delivered, often in response to a request with a Range header.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;207&lt;/td&gt;
&lt;td&gt;Multi-Status (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when multiple operations need individual status reports (commonly used in WebDAV).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;td&gt;Already Reported (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the members of a DAV binding have already been enumerated in a previous response to prevent duplication.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;226&lt;/td&gt;
&lt;td&gt;IM Used&lt;/td&gt;
&lt;td&gt;Use this when the server has fulfilled a request and the response is a result of instance manipulations (related to HTTP Delta encoding).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer specific codes (&lt;strong&gt;201&lt;/strong&gt;, &lt;strong&gt;204&lt;/strong&gt;) over generic &lt;strong&gt;200&lt;/strong&gt; responses.
&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;202&lt;/strong&gt;, provide a way to check the async task’s status (e.g., a pollable endpoint).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3xx: Redirection Messages
&lt;/h2&gt;

&lt;p&gt;These codes signal that the client must take additional action to complete the request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa72fy0zbv95zp3ltfd1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa72fy0zbv95zp3ltfd1n.png" alt="300-399 Redirection Messages" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;When to Use / Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;Multiple Choices&lt;/td&gt;
&lt;td&gt;Use this when there are multiple options for the resource, and the client (or user agent) can choose one of them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301&lt;/td&gt;
&lt;td&gt;Moved Permanently&lt;/td&gt;
&lt;td&gt;Use this when a resource has permanently moved to a new URI. All future requests should be directed to this new URI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;302&lt;/td&gt;
&lt;td&gt;Found&lt;/td&gt;
&lt;td&gt;Use this to indicate that the resource is temporarily located at a different URI. (Originally “Moved Temporarily”.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;303&lt;/td&gt;
&lt;td&gt;See Other&lt;/td&gt;
&lt;td&gt;Use this when the response to a request can be found under a different URI, and the client should use the GET method to retrieve it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;304&lt;/td&gt;
&lt;td&gt;Not Modified&lt;/td&gt;
&lt;td&gt;Use this when the requested resource has not been modified since the last request (commonly used with caching mechanisms).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;Use Proxy (deprecated)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Deprecated:&lt;/strong&gt; Use not recommended. It indicated that a proxy should be used to access the resource.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;306&lt;/td&gt;
&lt;td&gt;Switch Proxy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reserved:&lt;/strong&gt; No longer used.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;307&lt;/td&gt;
&lt;td&gt;Temporary Redirect&lt;/td&gt;
&lt;td&gt;Use this when the resource is temporarily located at a different URI; the client should use the same method for future requests to the original URI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;308&lt;/td&gt;
&lt;td&gt;Permanent Redirect&lt;/td&gt;
&lt;td&gt;Use this when the resource has permanently moved, similar to 301, but the request method and body will not change when reissuing the request to the new URI.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;301/308&lt;/strong&gt; for permanent redirects and &lt;strong&gt;302/307&lt;/strong&gt; for temporary ones.
&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;304&lt;/strong&gt; to reduce bandwidth via caching.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4xx: Client Error Responses
&lt;/h2&gt;

&lt;p&gt;These codes indicate the client sent an invalid request.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9p65vr68x48hy54idlu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9p65vr68x48hy54idlu6.png" alt="400-499 Client Error Responses" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;When to Use / Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Bad Request&lt;/td&gt;
&lt;td&gt;Use this when the server cannot process the request due to a client error (e.g., malformed request syntax).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;Use this when authentication is required but has failed or not been provided. (Different from 403; the client can try to authenticate.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;402&lt;/td&gt;
&lt;td&gt;Payment Required&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reserved:&lt;/strong&gt; Not typically used; originally intended for future use related to digital payment systems.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Forbidden&lt;/td&gt;
&lt;td&gt;Use this when the client’s request is understood, but the server refuses to authorize it (even if authentication is provided).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Not Found&lt;/td&gt;
&lt;td&gt;Use this when the requested resource could not be found on the server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;405&lt;/td&gt;
&lt;td&gt;Method Not Allowed&lt;/td&gt;
&lt;td&gt;Use this when the request method is not supported by the resource (e.g., sending a DELETE request to a read-only resource).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;406&lt;/td&gt;
&lt;td&gt;Not Acceptable&lt;/td&gt;
&lt;td&gt;Use this when the requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;407&lt;/td&gt;
&lt;td&gt;Proxy Authentication Required&lt;/td&gt;
&lt;td&gt;Use this when the client must first authenticate with a proxy before proceeding with the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;408&lt;/td&gt;
&lt;td&gt;Request Timeout&lt;/td&gt;
&lt;td&gt;Use this when the server times out waiting for the request from the client.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;409&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;Use this when the request could not be processed because of a conflict in the request (e.g., simultaneous updates causing an edit conflict).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;410&lt;/td&gt;
&lt;td&gt;Gone&lt;/td&gt;
&lt;td&gt;Use this when the requested resource is no longer available and will not be available again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;411&lt;/td&gt;
&lt;td&gt;Length Required&lt;/td&gt;
&lt;td&gt;Use this when the server requires the request to specify the Content-Length header, but it is missing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;412&lt;/td&gt;
&lt;td&gt;Precondition Failed&lt;/td&gt;
&lt;td&gt;Use this when one of the request’s preconditions (using headers like If-Match) is not met by the server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;413&lt;/td&gt;
&lt;td&gt;Payload Too Large&lt;/td&gt;
&lt;td&gt;Use this when the request entity is larger than what the server is willing or able to process.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;414&lt;/td&gt;
&lt;td&gt;URI Too Long&lt;/td&gt;
&lt;td&gt;Use this when the URI provided by the client is too long for the server to process.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;415&lt;/td&gt;
&lt;td&gt;Unsupported Media Type&lt;/td&gt;
&lt;td&gt;Use this when the request entity has a media type that the server or resource does not support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;416&lt;/td&gt;
&lt;td&gt;Range Not Satisfiable&lt;/td&gt;
&lt;td&gt;Use this when the client requests a portion of the file (using the Range header), but the server cannot supply that portion.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;417&lt;/td&gt;
&lt;td&gt;Expectation Failed&lt;/td&gt;
&lt;td&gt;Use this when the server cannot meet the requirements of the Expect request-header field.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;418&lt;/td&gt;
&lt;td&gt;I'm a teapot&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Humorous / April Fools':&lt;/strong&gt; Originally defined in RFC 2324, this is not expected to be implemented on actual HTTP servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;421&lt;/td&gt;
&lt;td&gt;Misdirected Request&lt;/td&gt;
&lt;td&gt;Use this when the request was directed to a server that is not able to produce a response (e.g., wrong combination of scheme and authority).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;Unprocessable Entity (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the request was well-formed but could not be followed due to semantic errors (commonly used with WebDAV).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;423&lt;/td&gt;
&lt;td&gt;Locked (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the resource being accessed is locked, preventing further operations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;424&lt;/td&gt;
&lt;td&gt;Failed Dependency (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when a request fails due to a failure in a previous request (e.g., one of the dependent operations failed).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;425&lt;/td&gt;
&lt;td&gt;Too Early (Experimental)&lt;/td&gt;
&lt;td&gt;Use this experimentally when the server is unwilling to risk processing a request that might be replayed. (Not widely used in production.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;426&lt;/td&gt;
&lt;td&gt;Upgrade Required&lt;/td&gt;
&lt;td&gt;Use this when the client should switch to a different protocol (often seen when secure communication is required).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;428&lt;/td&gt;
&lt;td&gt;Precondition Required&lt;/td&gt;
&lt;td&gt;Use this when the server requires the request to be conditional (usually by adding headers like If-Match).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Too Many Requests&lt;/td&gt;
&lt;td&gt;Use this when the user has sent too many requests in a given period (“rate limiting”).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;431&lt;/td&gt;
&lt;td&gt;Request Header Fields Too Large&lt;/td&gt;
&lt;td&gt;Use this when the request’s header fields are too large for the server to process.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;451&lt;/td&gt;
&lt;td&gt;Unavailable For Legal Reasons&lt;/td&gt;
&lt;td&gt;Use this when the requested resource cannot be provided due to legal reasons (e.g., government censorship).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid vague &lt;strong&gt;400&lt;/strong&gt; errors; use specific codes (&lt;strong&gt;404&lt;/strong&gt;, &lt;strong&gt;429&lt;/strong&gt;) where possible.
&lt;/li&gt;
&lt;li&gt;Return &lt;strong&gt;401&lt;/strong&gt; for authentication failures and &lt;strong&gt;403&lt;/strong&gt; for authorization issues.
&lt;/li&gt;
&lt;li&gt;Provide actionable error details in the response body (e.g., &lt;code&gt;{ "error": "Invalid API key" }&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5xx: Server Error Responses
&lt;/h2&gt;

&lt;p&gt;These codes indicate the server failed to fulfill a valid request.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxutwzb07fpls6vpeqp4p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxutwzb07fpls6vpeqp4p.png" alt="500-599 Server Error Responses" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;When to Use / Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Internal Server Error&lt;/td&gt;
&lt;td&gt;Use this as a generic error message when no more specific message is suitable. Indicates an unexpected condition on the server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;501&lt;/td&gt;
&lt;td&gt;Not Implemented&lt;/td&gt;
&lt;td&gt;Use this when the server does not recognize the request method or lacks the ability to fulfill the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;502&lt;/td&gt;
&lt;td&gt;Bad Gateway&lt;/td&gt;
&lt;td&gt;Use this when a server acting as a gateway or proxy receives an invalid response from the upstream server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;Service Unavailable&lt;/td&gt;
&lt;td&gt;Use this when the server is currently unavailable due to overload or maintenance. This is usually temporary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;504&lt;/td&gt;
&lt;td&gt;Gateway Timeout&lt;/td&gt;
&lt;td&gt;Use this when a server acting as a gateway or proxy does not receive a timely response from the upstream server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;505&lt;/td&gt;
&lt;td&gt;HTTP Version Not Supported&lt;/td&gt;
&lt;td&gt;Use this when the server does not support the HTTP protocol version used in the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;506&lt;/td&gt;
&lt;td&gt;Variant Also Negotiates&lt;/td&gt;
&lt;td&gt;Use this in cases of transparent content negotiation that result in a circular reference. (Rarely encountered in typical applications.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;507&lt;/td&gt;
&lt;td&gt;Insufficient Storage (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the server is unable to store the representation needed to complete the request (mainly seen in WebDAV contexts).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;508&lt;/td&gt;
&lt;td&gt;Loop Detected (WebDAV)&lt;/td&gt;
&lt;td&gt;Use this when the server detects an infinite loop while processing a request (common in complex WebDAV operations).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;510&lt;/td&gt;
&lt;td&gt;Not Extended&lt;/td&gt;
&lt;td&gt;Use this when further extensions to the request are required for the server to fulfill it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;511&lt;/td&gt;
&lt;td&gt;Network Authentication Required&lt;/td&gt;
&lt;td&gt;Use this when the client needs to authenticate to gain network access (commonly seen in captive portal scenarios, such as in public Wi-Fi networks).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid &lt;strong&gt;5xx&lt;/strong&gt; errors in development; they signal unhandled exceptions.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;503&lt;/strong&gt; for planned downtime and include a &lt;code&gt;Retry-After&lt;/code&gt; header.
&lt;/li&gt;
&lt;li&gt;Log &lt;strong&gt;5xx&lt;/strong&gt; errors for debugging but mask sensitive details in responses. &lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Hopefully now when I am designing my API or handling HTTP responses, I will be able to choose the status code that best fits the situation&lt;/p&gt;

&lt;p&gt;Hope the article above gives some clarity to you too. &lt;em&gt;Mastering these codes not only improves API reliability but also enhances the development experience for everyone using your API.&lt;/em&gt; 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🛥️ Docker Architecture: The Docker Engine</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Fri, 24 Jan 2025 21:52:40 +0000</pubDate>
      <link>https://forem.com/juniourrau/docker-architecture-the-engine-behind-the-magic-4d2a</link>
      <guid>https://forem.com/juniourrau/docker-architecture-the-engine-behind-the-magic-4d2a</guid>
      <description>&lt;p&gt;Docker’s power lies in its architecture that works behind the scenes to make containerization feel effortless. In this article, we are going to dive deep into the heart of Docker Engine and uncover the magic behind it (Docker Daemon, Docker Client (CLI), and Docker Desktop). By the end, you will get a clear picture of how these components work together to give developers the seamless experience they crave.&lt;/p&gt;




&lt;h3&gt;
  
  
  Docker’s Client-Server Model
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fc14z5eygvbdt2y6v89qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fc14z5eygvbdt2y6v89qc.png" alt="Docker Architecture" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At its core, Docker uses a &lt;strong&gt;client-server architecture&lt;/strong&gt;. Think of it like a restaurant: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Docker Client&lt;/strong&gt; is the customer who places an order (e.g., “Run this container!”). &lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Docker Daemon&lt;/strong&gt; (server) is the chef who prepares the meal in the kitchen. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Desktop&lt;/strong&gt; is the friendly menu and waiter that bridges your desktop OS to the Docker environment.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Docker Client: Your Command Center
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxpwqmruwzze0cy5qyjxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxpwqmruwzze0cy5qyjxr.png" alt="Docker CLI" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Docker Client&lt;/strong&gt; is the CLI (Command Line Interface) you interact with. It’s how you send commands like &lt;code&gt;docker build&lt;/code&gt; or &lt;code&gt;docker ps&lt;/code&gt; to the daemon. Key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translates your commands into API requests.&lt;/li&gt;
&lt;li&gt;Works on any machine that can communicate with the daemon (local or remote).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use &lt;code&gt;docker help&lt;/code&gt; or &lt;code&gt;docker --help&lt;/code&gt; to display &lt;strong&gt;all available Docker CLI commands&lt;/strong&gt; at the top level.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example Workflow:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The client sends the &lt;code&gt;run&lt;/code&gt; command to the daemon.&lt;/li&gt;
&lt;li&gt;The daemon starts an Nginx container in detached mode.&lt;/li&gt;
&lt;li&gt;The client receives confirmation and exits, while the container runs in the background.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The Docker Daemon: The Silent Workhorse
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzfdz8n6tuxqxd3zsy2kk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzfdz8n6tuxqxd3zsy2kk.png" alt="Docker Daemon" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Docker Daemon&lt;/strong&gt; (&lt;code&gt;dockerd&lt;/code&gt;) is the brain of Docker. It’s a background process that manages containers, images, networks, and storage. Here’s what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listens for requests from the Docker Client (via REST API).&lt;/li&gt;
&lt;li&gt;Builds, runs, and monitors containers.&lt;/li&gt;
&lt;li&gt;Manages Docker objects (images, volumes, networks).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;When you run a command like &lt;code&gt;docker run&lt;/code&gt;, the client sends it to the daemon.&lt;/li&gt;
&lt;li&gt;The daemon checks if the image exists locally. If not, it pulls it from a registry.&lt;/li&gt;
&lt;li&gt;It creates and starts the container using components like &lt;code&gt;containerd&lt;/code&gt; and &lt;code&gt;runc&lt;/code&gt; (OCI-compliant tools).&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Docker Desktop: The User-Friendly Gateway
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsqs9f1iq30gute7wdmoc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsqs9f1iq30gute7wdmoc.png" alt="Docker Desktop" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt; wraps the Docker ecosystem into a sleek app for macOS, Windows, and Linux. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Docker Daemon, Client, and CLI tools.&lt;/li&gt;
&lt;li&gt;A GUI dashboard for managing containers, images, and volumes.&lt;/li&gt;
&lt;li&gt;Kubernetes integration and development-friendly features (e.g., file sharing, networking).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why Use Docker Desktop?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simplifies setup (no manual daemon configuration).&lt;/li&gt;
&lt;li&gt;Manages OS-specific quirks (e.g., Linux VM on Windows/Mac).&lt;/li&gt;
&lt;li&gt;Great for beginners and GUI lovers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Under the Hood: Containerd and runc
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr1h460wqnp920niqjo7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr1h460wqnp920niqjo7h.png" alt="Containerd and runc" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the Docker Daemon handles high-level tasks, it delegates low-level container operations to specialized tools like &lt;code&gt;containerd&lt;/code&gt; and &lt;code&gt;runc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;containerd&lt;/code&gt; is a &lt;strong&gt;daemon&lt;/strong&gt; that manages the complete container lifecycle (pulling images, creating containers, managing storage, etc.). Docker uses containerd under the hood, but you can interact with containerd directly via its CLI (&lt;code&gt;ctr&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;runc&lt;/code&gt; is a lightweight CLI tool for spawning and running containers according to the &lt;strong&gt;OCI (Open Container Initiative) runtime specification&lt;/strong&gt;. It is the underlying tool Docker (via containerd) uses to run containers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Pull an image (e.g., Alpine Linux)
sudo ctr images pull docker.io/library/alpine:latest

# List images
sudo ctr images list

# Run a container
sudo ctr run --rm -t docker.io/library/alpine:latest my-alpine-container sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start a shell inside the container (&lt;code&gt;/bin/sh&lt;/code&gt; by default). Exit the shell to stop the container.&lt;/p&gt;

&lt;p&gt;If you want to dive deep into the OCI runtime specification you can check out &lt;a href="https://wking.github.io/opencontainer-runtime-spec/runtime-spec.pdf" rel="noopener noreferrer"&gt;this paper&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How Components Work Together
&lt;/h3&gt;

&lt;p&gt;Let’s break down what happens when you run &lt;code&gt;docker run hello-world&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Docker Client&lt;/strong&gt;: You type the command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Daemon&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;Checks for the &lt;code&gt;hello-world&lt;/code&gt; image locally.&lt;/li&gt;
&lt;li&gt;Pulls it from Docker Hub if missing.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;containerd&lt;/code&gt; and &lt;code&gt;runc&lt;/code&gt; to create the container.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt;: The container runs, prints a message, and exits.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Example: Debugging with Docker Client and Daemon
&lt;/h3&gt;

&lt;p&gt;Imagine your container is crashing. Here’s how the architecture helps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;docker logs &amp;lt;container&amp;gt;&lt;/code&gt; (Client fetches logs from Daemon).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker exec -it &amp;lt;container&amp;gt; sh&lt;/code&gt; to inspect the container interactively.&lt;/li&gt;
&lt;li&gt;Check resource usage with &lt;code&gt;docker stats&lt;/code&gt; (Daemon provides real-time data).&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Docker’s architecture is a symphony of components working in harmony. The &lt;strong&gt;Docker Daemon&lt;/strong&gt; does the heavy lifting, the &lt;strong&gt;Client (CLI)&lt;/strong&gt; is your control panel, and &lt;strong&gt;Docker Desktop&lt;/strong&gt; makes it all accessible. Together, they abstract the complexity of containers, letting you focus on building amazing apps.&lt;/p&gt;

&lt;p&gt;Next week, we will dive into &lt;code&gt;docker run&lt;/code&gt;—the command that brings containers to life. You will learn flags, use cases, and pro tips to master container execution!&lt;/p&gt;




&lt;h3&gt;
  
  
  Cheat Sheet: Key Docker Architecture Commands
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show Docker Client and Daemon versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display daemon configuration and system info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live view of container resource usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker system prune&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clean up unused Docker objects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>cloud</category>
      <category>learning</category>
    </item>
    <item>
      <title>Github Challenge: Arise - Mindful Morning Planner</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Sun, 19 Jan 2025 05:51:11 +0000</pubDate>
      <link>https://forem.com/juniourrau/github-challenge-arise-mindful-morning-planner-2fl7</link>
      <guid>https://forem.com/juniourrau/github-challenge-arise-mindful-morning-planner-2fl7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github"&gt;GitHub Copilot Challenge &lt;/a&gt;: New Beginnings&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I believe every day is a new beginning, just like Amazon’s ‘Day One’ culture. My morning routine starts with some deep breathing. I take three deep breaths and then write down the three most important tasks I want to accomplish that day. This helps me stay focused on what really matters and what I can actually get done. I’m not a big fan of having too much on my plate and working nonstop. I think the best way to be productive is to focus on just three things and do them well. That is what I have tried to do with the GitHub challenge in a day. &lt;/p&gt;

&lt;p&gt;Arise is a mindful morning planner. Start your day with a quick minute of deep breathing and writing down the top three important things you want to tackle for the day.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Check out the app: &lt;a href="https://arise-31p.pages.dev/" rel="noopener noreferrer"&gt;https://arise-31p.pages.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExZDZ1MzcydjgyazRyYW4zczlydGQ5NzAzbXo4dGgyZ3YyY2xrZmJnbSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fe7bDXd7jmU5mmzGE5l%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExZDZ1MzcydjgyazRyYW4zczlydGQ5NzAzbXo4dGgyZ3YyY2xrZmJnbSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fe7bDXd7jmU5mmzGE5l%2Fgiphy.gif" width="480" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0qllcrylhgwwov2hypie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0qllcrylhgwwov2hypie.png" alt="arise focus" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;Github Repo: &lt;a href="https://github.com/RavinRau/arise" rel="noopener noreferrer"&gt;https://github.com/RavinRau/arise&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot Experience
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot has been a game-changer for me! From the very beginning, it’s been a lifesaver. I usually spend a good hour setting up a new Next.js project with TypeScript and Tailwind CSS. But with Copilot, it was all done in seconds! It understood my needs and guided me through creating a functional and clean base project effortlessly.&lt;/p&gt;

&lt;p&gt;Component creation was another area where Copilot really impressed me. Whether I wanted to make a button with fancy styling or add animations with libraries like Framer Motion, Copilot’s chat suggestions were spot-on. It helped me write beautifully styled components with animations that felt both intuitive and polished. In fact, the autocomplete feature often suggested animation types and transitions that perfectly matched what I had in mind—sometimes even better than I had imagined.&lt;/p&gt;

&lt;p&gt;One of the most exciting moments was when I was creating a store. Writing application logic for state management can be a real pain, but Copilot made it a breeze. As I started typing, its autocomplete suggestions almost read my mind, offering exactly what I needed. With just a tap of the tab key, my code was seamlessly generated, saving me tons of time and effort.&lt;/p&gt;

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

&lt;p&gt;This hackathon was an absolute blast! Working on ‘Arise’ with Copilot was a breeze. The autocomplete and the chat feature were like having a coding buddy. They helped me stay focused and keep coding without getting distracted. I could concentrate on the core logic and user experience, knowing that my super smart AI buddy was there to lend a hand. Thanks for the challenge and for giving me the confidence that I can complete apps in a day.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>🛥️ Introduction to Docker: Core Concepts</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Mon, 13 Jan 2025 17:36:22 +0000</pubDate>
      <link>https://forem.com/juniourrau/introduction-to-docker-core-concepts-and-basics-for-beginners-4n0h</link>
      <guid>https://forem.com/juniourrau/introduction-to-docker-core-concepts-and-basics-for-beginners-4n0h</guid>
      <description>&lt;p&gt;Docker is like a magic toolbox for developers. It lets them build, ship, and manage their apps in tiny, portable boxes called containers. Containers are like virtual rooms, but they are way faster and more efficient than traditional virtual machines (VMs). Thanks to Docker, containers have become super popular, and they’re now a must-have part of modern software development.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is Docker?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9htrofcvtd3s4xl4ipb8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9htrofcvtd3s4xl4ipb8.jpeg" alt="Docker Container" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker is an open-source platform that automates the deployment of applications inside containers. Containers are isolated environments that contain everything needed to run an application, including the code, runtime, libraries, and system tools. Docker provides developers with tools to build, manage, and distribute these containers.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.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%2F21c87tiiei3c9vwutoig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F21c87tiiei3c9vwutoig.png" alt="OCI" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the &lt;a href="https://opencontainers.org/" rel="noopener noreferrer"&gt;Open Container Initiative (OCI)&lt;/a&gt;?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Open Container Initiative (OCI)&lt;/strong&gt; is an open governance structure established in 2015 by the Linux Foundation. It aims to create industry standards for container runtime and image specifications, ensuring interoperability across container ecosystems. &lt;/p&gt;

&lt;p&gt;Docker originally developed its own container runtime and image formats. However, the rise of containers and the need for broader standardization led Docker to contribute its container runtime technology, &lt;strong&gt;runc&lt;/strong&gt;, to the OCI. Today, Docker’s ecosystem adheres to OCI standards, making Docker containers compatible with other OCI-compliant runtimes and tools.&lt;/p&gt;

&lt;p&gt;By aligning with OCI standards, Docker ensures that its containers and images can run across various platforms and tools, fostering a more open and collaborative container ecosystem.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why are Containers Useful?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt;: Containers can run on any system that supports OCI-compliant runtimes, ensuring that applications behave consistently across environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt;: Containers share the host system's kernel, making them lightweight and fast to start compared to VMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Containers can be easily scaled up or down to handle varying loads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: Containers reduce the "it works on my machine" problem by encapsulating all dependencies and configurations.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Containers vs. Virtual Machines vs. Bare Metal
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fe6o2s2vcjyif26hfb291.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fe6o2s2vcjyif26hfb291.png" alt="Container vs VMs vs Bare Metal" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bare Metal&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs directly on physical hardware without any virtualization.&lt;/li&gt;
&lt;li&gt;Offers maximum performance and direct access to hardware resources.&lt;/li&gt;
&lt;li&gt;Best suited for high-performance workloads and applications that require complete control over hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fycy497pibgwrmssz00dl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fycy497pibgwrmssz00dl.png" alt="Bare Metal" width="618" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtual Machines (VMs)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Include a full OS, making them heavier.&lt;/li&gt;
&lt;li&gt;Require more resources and take longer to start.&lt;/li&gt;
&lt;li&gt;Suitable for running multiple OS environments on a single physical machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F60ggkldxfxzrnaldhkws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F60ggkldxfxzrnaldhkws.png" alt="Virtual Machines (VMs)" width="793" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share the host OS kernel, making them lightweight.&lt;/li&gt;
&lt;li&gt;Use less memory and start quickly.&lt;/li&gt;
&lt;li&gt;Ideal for microservices and rapid deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzgnqagk4uw896ds2mqje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzgnqagk4uw896ds2mqje.png" alt="Container" width="773" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Containers&lt;/th&gt;
&lt;th&gt;Virtual Machines&lt;/th&gt;
&lt;th&gt;Bare Metal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Efficiency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;em&gt;Isolation *&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Process-level&lt;/td&gt;
&lt;td&gt;Full OS-level&lt;/td&gt;
&lt;td&gt;Complete physical isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Portability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Near-native&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microservices, CI/CD pipelines&lt;/td&gt;
&lt;td&gt;Legacy applications, OS testing&lt;/td&gt;
&lt;td&gt;High-performance computing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Docker Terminology
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmcy8hiuv7eb7za599jev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmcy8hiuv7eb7za599jev.png" alt="Docker Terminology" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dockerfile&lt;/strong&gt;: A text file with instructions for building a Docker image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt;: A read-only template used to create containers. Images are built from a Dockerfile and follow OCI image specifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt;: A runnable instance of an image. Containers can be started, stopped, and deleted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry&lt;/strong&gt;: A repository for Docker images. Docker Hub is a popular public registry, and other OCI-compliant registries include Harbor and Quay.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Docker Command Line Cheat Sheet
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwu6n4m5tzgdnvc201wlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwu6n4m5tzgdnvc201wlh.png" alt="Docker Command Line Cheat Sheet" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  0. &lt;strong&gt;Basic Docker Commands&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker --version&lt;/code&gt;&lt;/strong&gt;: Check Docker version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker help&lt;/code&gt;&lt;/strong&gt;: Show Docker commands and options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker info&lt;/code&gt;&lt;/strong&gt;: Display system-wide information about Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Images&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/strong&gt;: List all local images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker pull &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Download an image from Docker Hub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker build -t &amp;lt;image_name&amp;gt; .&lt;/code&gt;&lt;/strong&gt;: Build an image from a Dockerfile in the current directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker rmi &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Remove an image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker tag &amp;lt;source_image&amp;gt; &amp;lt;new_image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Tag an image with a new name.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Containers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker run &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Run a container from an image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker run -it &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Run a container in interactive mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker run -d &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Run a container in detached mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/strong&gt;: List running containers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/strong&gt;: List all containers (including stopped ones).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker stop &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Stop a running container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker start &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Start a stopped container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker restart &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Restart a container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker rm &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Remove a stopped container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker exec -it &amp;lt;container&amp;gt; &amp;lt;command&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Run a command inside a running container.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Container Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker logs &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: View logs of a container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker top &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Display the processes running in a container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker stats &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Display a live stream of resource usage statistics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker inspect &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: View details about a container or image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker rename &amp;lt;old_name&amp;gt; &amp;lt;new_name&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Rename a container.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Networking&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker network ls&lt;/code&gt;&lt;/strong&gt;: List all Docker networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker network create &amp;lt;network_name&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Create a new network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker network connect &amp;lt;network&amp;gt; &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Connect a container to a network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker network disconnect &amp;lt;network&amp;gt; &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Disconnect a container from a network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker network inspect &amp;lt;network&amp;gt;&lt;/code&gt;&lt;/strong&gt;: View details about a network.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Volumes&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker volume ls&lt;/code&gt;&lt;/strong&gt;: List all volumes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker volume create &amp;lt;volume_name&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Create a volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker volume inspect &amp;lt;volume&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Display detailed information about a volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker volume rm &amp;lt;volume&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Remove a volume.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Example: Creating a Simple Docker Container
&lt;/h3&gt;

&lt;p&gt;Let's create a simple Docker container that runs a Python script.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Python Script&lt;/strong&gt;: Save the following code in a file named &lt;code&gt;app.py&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, Docker!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Dockerfile&lt;/strong&gt;: Create a file named &lt;code&gt;Dockerfile&lt;/code&gt; with the following content:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;   FROM python:3.9-slim
   COPY app.py /app.py
   CMD ["python", "/app.py"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build the Docker Image&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker build &lt;span class="nt"&gt;-t&lt;/span&gt; python-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the Docker Container&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker run python-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Hello, Docker!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Docker makes building, deploying, and running apps using containers is a breeze. By following the OCI standards, Docker ensures everything works together seamlessly in the container world. Containers are super efficient, portable, and scalable, which is why they’re at the heart of modern software development. If you know Docker and how it works with OCI, you can use this tech to speed up your workflows and ensure your apps work on any platform.&lt;/p&gt;

&lt;p&gt;Next week I will dive into the docker architecture, so stay tune.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>cloud</category>
      <category>python</category>
    </item>
    <item>
      <title>My 2025 Roadmap As An Entrepreneur</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Fri, 10 Jan 2025 11:38:49 +0000</pubDate>
      <link>https://forem.com/juniourrau/my-2025-roadmapas-an-entrepreneur-4kak</link>
      <guid>https://forem.com/juniourrau/my-2025-roadmapas-an-entrepreneur-4kak</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;: Compiling 2025.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This year is shaping up to be a transformative one for me. After seven years in a full-time job, I am making a significant leap by joining my close friend’s startup. It’s not just a career change; it is the beginning of an entrepreneurial journey that I have always dreamed of. Alongside this, I aim to grow as a stronger engineer, contribute back to the community, explore the future of AI, and pursue some personal adventures. Here’s my roadmap for 2025:&lt;/p&gt;

&lt;p&gt;🚀 Starting Back My Entrepreneurial Journey&lt;br&gt;
💪 Becoming a Stronger Full Stack Engineer&lt;br&gt;
🪴 Contributing Back to the Community&lt;br&gt;
🤖 Exploring the Future of AI&lt;br&gt;
⛵ A Bit of a Personal Side Quest&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Starting Back My Entrepreneurial Journey
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9aqtp0zdns4qxgra6e0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9aqtp0zdns4qxgra6e0u.png" alt="Starting Back My Entrepreneurial Journey" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have always been fascinated by the idea of running my own business. During my university days, I made a few attempts at entrepreneurship, but they didn’t go as planned. Those setbacks made me hesitant to try again, so I joined a startup instead of a multinational corporation for my first job. Over the past seven years, I have gained invaluable experience, polished my skills, and learned how businesses operate. Now, I feel ready to take the leap and apply what I have learned by starting something. It is a mix of excitement and nervousness, but I am determined to embrace the challenges ahead.&lt;/p&gt;




&lt;h3&gt;
  
  
  💪 Becoming a Stronger Full Stack Engineer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fw3idsnivte8oi2thhn7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fw3idsnivte8oi2thhn7o.png" alt="Becoming a Stronger Full Stack Engineer" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My career so far has been heavily focused on frontend development, where I have built reliable and user-friendly web applications. In 2024, I began exploring backend and DevOps technologies, diving into areas that were unfamiliar to me. This year, my goal is to master these domains and become a proficient full-stack engineer.&lt;/p&gt;

&lt;p&gt;Being a well-rounded engineer is not just about technical skills; it is about finding cost-effective solutions and building products that are reliable, scalable, and maintainable. These skills will empower me to approach problems holistically and make better decisions, especially in the entrepreneurial world where resources can be limited.&lt;/p&gt;




&lt;h3&gt;
  
  
  🪴 Contributing Back to the Community
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fm90sjbvykyjpzeyb2g7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fm90sjbvykyjpzeyb2g7w.png" alt="Contributing Back to the Community" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I dive deeper into backend and DevOps, I am committed to sharing my knowledge with others. I have been writing on Dev.to for a month now, and the community has been incredibly supportive, offering feedback that has opened my eyes to new perspectives.&lt;/p&gt;

&lt;p&gt;In 2025, I plan to write more frequently, document my learnings, and participate in Dev.to competitions to win at least one. Sharing knowledge is a powerful way to solidify what I have learned and give back to the community that has helped me grow.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Exploring the Future of AI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8cdq7s6emvbyp2c6wzca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8cdq7s6emvbyp2c6wzca.png" alt="Exploring the Future of AI" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artificial Intelligence and automation are reshaping the world, and I am eager to be part of this revolution. One of my goals this year is to learn more about AI, particularly in areas like Retrieval-Augmented Generation (RAG) and fine-tuning models.&lt;/p&gt;

&lt;p&gt;AI agents fascinate me because of their potential to automate repetitive tasks, freeing up time for more creative and meaningful work. As an entrepreneur, leveraging AI will be a game-changer, enabling me to build innovative solutions efficiently. By diving into AI, I hope to create something impactful and add this valuable skill to my toolkit.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⛵ A Bit of a Personal Side Quest
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fugpsoqbmqihjo8p8ktut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fugpsoqbmqihjo8p8ktut.png" alt="A Bit of a Personal Side Quest" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This year, I also want to embrace the joy of travel. I recently returned from a trip to Bali, which left me inspired to explore more. In 2025, I would like to visit other Southeast Asian countries, India, and China. Immersing myself in diverse cultures and experiencing local lifestyles will not only broaden my perspective but also help me grow as a problem solver. Understanding people from different walks of life can offer fresh insights that are invaluable in entrepreneurship.&lt;/p&gt;




&lt;p&gt;2025 is a year of growth, learning, and exploration for me. From taking bold steps in my entrepreneurial journey to mastering technical skills and giving back to the community, I am ready to embrace the opportunities and challenges ahead. Along the way, I will seek inspiration from new places and people, hoping to make this year truly transformative. Here is to a year of dreams, growth, and success! Wish me luck.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>newyearchallenge</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🎖️ The Dark Side Of Being An Engineering Manager</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Fri, 03 Jan 2025 11:36:39 +0000</pubDate>
      <link>https://forem.com/juniourrau/the-dark-side-of-being-an-engineering-manager-29c2</link>
      <guid>https://forem.com/juniourrau/the-dark-side-of-being-an-engineering-manager-29c2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;: Retro’ing and Debugging 2024.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;2024 was a wild ride for me! It was a year of learning to accept things as they are and go with the flow. It was also a year where I saw the darker side of being an engineering manager in a startup. I was proud of being an engineering manager because I could make a real difference in people’s lives, boost team morale, and create a collaborative environment between teams. But during my second year of being an engineering manager in a startup, everything went completely upside down. Here are the challenges, lessons, and lessons I learned during the toughest year of my career.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fafz36413srfng9hvo7sx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fafz36413srfng9hvo7sx.gif" alt="Shall we start" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💥 &lt;strong&gt;Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balancing performance appraisals with financial constraints and no bonuses.&lt;/li&gt;
&lt;li&gt;Keeping team spirits high during tough times and uncertainty.&lt;/li&gt;
&lt;li&gt;Making the tough decision to lay off employees when things got even worse financially.&lt;/li&gt;
&lt;li&gt;Leading the team through emotional ups and downs while meeting expectations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📚 &lt;strong&gt;Lessons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Being honest and open, even when delivering bad news, is super important.&lt;/li&gt;
&lt;li&gt;Rebuilding morale means showing empathy, getting to know your team, and celebrating small successes.&lt;/li&gt;
&lt;li&gt;As a leader, you have to make tough choices, but you can still support your team by being there for them.&lt;/li&gt;
&lt;li&gt;Sometimes, the best way to grow is to face challenges and learn from them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎉 &lt;strong&gt;Achievements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I helped the team get back on track by having one-on-one meetings and focusing on the little things that really matter.&lt;/li&gt;
&lt;li&gt;I successfully led a restructured team as a proxy tech lead, and we had some amazing sprint performances!
I played a key role in completing some important features that improved the company’s finances.&lt;/li&gt;
&lt;li&gt;I came out of this experience stronger, more focused, and with a deeper understanding of what it means to be a leader.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Chapter 1: The Winds of January
&lt;/h3&gt;

&lt;p&gt;The year 2024 began under a heavy cloud. January, the month of reflection and appraisal, felt unusually tense. It was the season for performance reviews—a time that typically brought a mix of anticipation and excitement. But this year, things were different. The company’s cash reserves had been significantly depleted, a harsh consequence of decisions made in 2023 that had not borne the fruits we had hoped for. Adding to this, global economic uncertainties and geopolitical conflicts had cast a long shadow over the leadership’s outlook, forcing them to take a more conservative stance.&lt;/p&gt;

&lt;p&gt;One cold morning, my VP of Engineering approached me, his expression serious. He outlined the company’s risky financial position and explained the implications for the upcoming appraisal season: there would be no bonuses. Salary increments? Reserved only for those who had truly delivered exceptional results in 2023.&lt;/p&gt;

&lt;p&gt;This was my second time leading performance appraisals as a manager. I knew it would be tough, but nothing could have prepared me for the weight of what lay ahead. My team had worked tirelessly—long nights, countless weekends—to ensure that the features we believed in were delivered on time. Despite our efforts, we had not achieved the outcomes we had hoped for. I braced myself for the conversations that awaited, fully aware of the disappointment that would follow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fd4lfs63c4bh8ozvuwtc2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fd4lfs63c4bh8ozvuwtc2.gif" alt="The night" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Chapter 2: Facing the Team
&lt;/h3&gt;

&lt;p&gt;I have always believed in honesty, even when the truth is hard to hear. As a manager, I refuse to make false promises, no matter how tempting it might be to cushion the blow. I gathered my team for a candid discussion, explaining the company’s situation and the reasons behind the tough decisions. Then, one by one, I conducted the individual performance reviews.&lt;/p&gt;

&lt;p&gt;It was a delicate balance. I wanted to acknowledge their hard work and dedication while also providing fair and constructive feedback. Most of my team appreciated the transparency, even if the outcome left them disappointed. Some were disappointed, others visibly upset. A few expressed their frustration openly, their words held with resentment and sadness. I listened patiently, remaining calm and composed, even as the emotions in the room threatened to overwhelm me.&lt;/p&gt;

&lt;p&gt;As expected, morale took a hit. The energy that once fueled our team’s collaboration and creativity seemed to dim. Some team members became quieter and less enthusiastic about their tasks. Others, to my surprise, remained optimistic, choosing to see the challenges as opportunities for growth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdft4mpsd2jpwsr62ldjj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdft4mpsd2jpwsr62ldjj.gif" alt="disappointed results" width="498" height="280"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Chapter 3: A New Perspective
&lt;/h3&gt;

&lt;p&gt;Recognizing the drop in motivation, I decided to take action. I scheduled one-on-one sessions with each team member, not just to talk about work but to reconnect on a personal level. These conversations were crucial. They allowed me to understand their concerns, aspirations, and frustrations.&lt;/p&gt;

&lt;p&gt;During these sessions, I tried to shift the narrative.&lt;/p&gt;

&lt;p&gt;“Success isn’t just about titles or monetary rewards,” I told them. “It’s about growth, learning, and the impact we create. Every challenge we overcome makes us stronger.”&lt;/p&gt;

&lt;p&gt;Some nodded in agreement; others needed more time to process. Slowly, I noticed a shift. While the sting of disappointment lingered, there was a renewed sense of purpose. We started focusing on smaller wins, celebrating progress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhdl81ea4yjqak7i11r1g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhdl81ea4yjqak7i11r1g.gif" alt="team back" width="498" height="258"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Chapter 4: The Hardest Goodbye
&lt;/h3&gt;

&lt;p&gt;By May, the company's financial situation had worsened. My VP of Engineering approached me again, his tone heavier than before. This time, the conversation was about reducing the size of the team. We discussed the company's state and the difficult decisions that lay ahead. By the end of the discussion, he delivered the crushing news: we had to let people go.&lt;/p&gt;

&lt;p&gt;At first, I was in denial. This team has been with me through countless challenges. Each member brought unique strengths that contributed to our success. I pushed back, arguing passionately to protect them. But after several rounds of discussion, I came to understand the harsh reality—to keep the company afloat, sacrifices had to be made.&lt;/p&gt;

&lt;p&gt;For the first time in my career, I faced the unbearable task of deciding who would stay and who would go. It was the hardest and most emotional decision I had ever made as a manager. Over three grueling rounds of SWOT analyses, I evaluated each team member’s capabilities, behaviors, and performance over the past two years. Eventually, I arrived at a list of names—a list I had hoped never to create.&lt;/p&gt;

&lt;p&gt;After finalizing the list with my VP, I moved forward with the layoff conversations. These were some of the most challenging moments of my career. Letting someone go is never easy, especially when they have placed their trust in you as a leader. My team saw me as their protector, someone who shielded them from external challenges so they could focus on achieving our goals together. The weight of that expectation made the task even more heartbreaking.&lt;/p&gt;

&lt;p&gt;Some of those I let go had families to support, and given the difficult job market, the impact was devastating. I prepared myself as best as I could, maintaining calm and composure during the conversations. Still, the immediate reactions—shock, sadness, and sometimes anger—were brutal. Even though most understood the rationale, I could not shake the feeling that I had betrayed them. It felt like I had robbed them of their drive and stolen their motivation.&lt;/p&gt;

&lt;p&gt;Afterward, I became quiet and withdrawn in the office. The emotional toll was overwhelming, and I requested to work from home for a time. For two weeks, I wrestled with my decisions, replaying every conversation and second-guessing every choice. Sleepless nights became routine. I often found myself on my balcony, gazing at the stars, questioning the kind of person I was and whether I wanted to continue on the path of engineering management. The experience left me deeply reflective, forcing me to confront the complexities of leadership and the heavy responsibilities it entails.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Febi120gqxw7274zh1dy2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Febi120gqxw7274zh1dy2.gif" alt="understanding the pain" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Chapter 5: Stepping Into a New Role
&lt;/h3&gt;

&lt;p&gt;The months of August to December 2024 marked another turning point. Following the recent layoffs, the team was undergoing a restructuring, and I was appointed as a proxy tech lead for one of the restructured teams. This role came naturally to me. Even as an Engineering Manager, I remained involved in sprints, regularly contributing as an engineer. Stepping into the tech lead position wasn’t a challenge but rather an opportunity to focus on something new while recovering emotionally from the earlier turmoil.&lt;/p&gt;

&lt;p&gt;As a tech lead, I found the role both refreshing and rewarding. My responsibilities centered on delivery, and I quickly set about molding the team—a senior engineer and two interns or juniors—into a cohesive unit. Together, we tackled crucial features that played a significant role in helping the company secure deals and regain its financial footing. The pressure was intense, but it was also gratifying. The synergy within the team was remarkable, and for the first time in months, there was a sense of momentum. We consistently met our goals, breaking records since the company adopted Scrum.&lt;/p&gt;

&lt;p&gt;The experience of leading this team reaffirmed my love for building and delivering impactful solutions. It also reminded me of the power of teamwork and resilience, even in the face of adversity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcgl9rcrhw0pifcmsu1d7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcgl9rcrhw0pifcmsu1d7.gif" alt="team work wins" width="500" height="210"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Chapter 6: A Bittersweet Farewell
&lt;/h3&gt;

&lt;p&gt;As the year drew to a close and management began planning for 2025, I reflected my journey. The challenges, growth, and victories all painted a vivid picture of an insightful year. But as I reflected, I realized it was time for a new chapter. This chapter doesn't involve my current company in the picture—the company that I had been with for seven years, from an intern to becoming an engineering manager.&lt;/p&gt;

&lt;p&gt;In December, I approached my VP of Engineering and submitted my resignation letter. It was a decision made with a heavy heart and a sense of clarity. My journey with the company has been transformative. I had grown immensely, both professionally and personally. The relationships I built, the challenges we overcame, and the milestones we achieved were unforgettable. Yet, I knew it was time to explore new horizons.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final words
&lt;/h3&gt;

&lt;p&gt;Thank you very much for taking the time to read this short novel-like article. If you dream of becoming an engineering manager, don’t let this discourage you. I hope I can give you a realistic glimpse into what it is like to lead a team. Right now, I am taking a little break from my leadership role to recharge and focus on the things I love doing technically. I enjoy solving meaningful problems using technology while I recover from my energy. Does this mean I will never take up the engineering manager position again? Haha, no way! I will always be up for the challenge of improving people’s lives, but I think it is important to take some time out to reflect and improve my skills in other areas. The goal is always to become a great problem solver.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>newyearchallenge</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>✨ 10 Books For Every Software Engineer in 2025</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Mon, 30 Dec 2024 19:07:09 +0000</pubDate>
      <link>https://forem.com/juniourrau/10-books-that-changed-my-career-as-a-software-engineer-3fcp</link>
      <guid>https://forem.com/juniourrau/10-books-that-changed-my-career-as-a-software-engineer-3fcp</guid>
      <description>&lt;p&gt;Throughout my seven years in tech, from being a frontend engineer to an engineering manager, I have found some amazing books that have helped me grow and stay on top of things in this ever-changing field. Here are ten books that have really made a difference in my career, divided into three sections based on how they helped me at different stages of my journey.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please consider purchasing the original book to support the authors and publishers. The PDF versions provided here are intended solely for educational and knowledge-sharing purposes.&lt;/em&gt; &lt;/p&gt;




&lt;h3&gt;
  
  
  1. The Pragmatic Programmer: Your Journey to Mastery
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhvwb62qeue9na69wtsry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhvwb62qeue9na69wtsry.png" alt="The Pragmatic Programmer" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was one of the first books I read when I entered the tech world, and it shaped my approach to coding and problem-solving. Its emphasis on writing adaptable, maintainable code taught me to think ahead and work smarter. I recommend it to every engineer starting their journey.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Software%20Engineering%20Principle/The%20Pragmatic%20Programmer%20Your%20Journey%20to%20Mastery%2C%2020th%20Anniversary%20Edition%20by%20Andrew%20Hunt%20David%20Hurst%20Thomas.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download The Pragmatic Programmer Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Clean Code: A Handbook of Agile Software Craftsmanship
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1jozktt0wm9n5q96xp4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1jozktt0wm9n5q96xp4a.png" alt="Clean Code" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean Code taught me the importance of making my code readable and simple—a skill that helps me and my teammates, as well as my junior engineers. It’s a must-read for anyone who wants to write code that’s both functional and beautiful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Software%20Engineering%20Principle/Clean%20Code%20A%20Handbook%20of%20Agile%20Software%20Craftsmanship.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Clean Code Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Think Like a Programmer: An Introduction to Creative Problem Solving
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa4jimeykkmeziwdnpgfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa4jimeykkmeziwdnpgfh.png" alt="Think Like a Programmer" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re into problem-solving and coding, this book is a must-read. It taught me how to break down tricky challenges and come up with creative, logical solutions. Whether you’re a seasoned coder or just starting, this book will give you a fresh perspective and help you approach coding with a logical mindset.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Software%20Engineering%20Principle/Think%20Like%20a%20Programmer_%20An%20Introduction%20to%20Creative%20Problem%20Solving.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Think Like a Programmer Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Algorithms Illustrated: Programmers Curious
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fobmxsepq7t2u584qnmvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fobmxsepq7t2u584qnmvr.png" alt="Algorithms Illustrated" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algorithms became a bigger focus for me as I started mentoring junior engineers. This book, with its clear visual explanations, helped me understand and teach complex algorithmic concepts. It’s perfect for anyone who wants to grasp algorithms intuitively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Software%20Engineering%20Principle/Algorithms%20illustrated%20programmers%20curious.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Algorithms Illustrated Book&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Designing for Performance: Weighing Aesthetics and Speed
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Felhp9wgk0r3chwmorkkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Felhp9wgk0r3chwmorkkb.png" alt="Designing for Performance" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frontend performance optimization is an art, and this book gave me the tools to master it. Balancing speed and user experience can be tricky, but the strategies here helped me deliver high-performance websites without compromising design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Frontend/Designing%20for%20performance_%20weighing%20aesthetics%20and%20speed.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Designing for Performance Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Frontend Architecture for Design Systems: A Modern Blueprint for Scalable and Sustainable Websites
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzly2r8rt8020lj5jkqin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzly2r8rt8020lj5jkqin.png" alt="Frontend Architecture" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building scalable frontend systems is no small task. This book helped me to structure design systems and create sustainable workflows. It’s invaluable for frontend engineers looking to tackle large-scale projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Frontend/Frontend%20architecture%20for%20design%20systems_%20a%20modern%20blueprint%20for%20scalable%20and%20sustainable%20websites.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Frontend Architecture Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Domain Driven Design: Tackling Complexity in the Heart of Software
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa16fga8hzf60v7rqtjui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa16fga8hzf60v7rqtjui.png" alt="Domain Driven Design" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I grew into senior roles, understanding complex systems became crucial. Domain-Driven Design helped me navigate and simplify intricate architectures by focusing on the business domain and its core logic. It’s a must-read for anyone dealing with large-scale systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/System%20Design/Domain%20driven%20design%20Tackling%20Complexity%20in%20the%20Heart%20of%20Software.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Domain Driven Design Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Designing Data Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff0vwsqannbl95zmpur52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff0vwsqannbl95zmpur52.png" alt="Designing Data Intensive Application" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I advanced in my career, designing robust systems became a critical part of my role. This book delves into the foundations of data systems, teaching you how to handle scalability and reliability—a must-read for anyone working on backend systems or complex architectures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Database/Designing%20Data-Intensive%20Applications%20The%20Big%20Ideas%20Behind%20Reliable%2C%20Scalable%2C%20and%20Maintainable%20Systems.pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download Designing Data Intensive Application Book&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  9. The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flvxdxe5pwnr5fa08jahu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flvxdxe5pwnr5fa08jahu.png" alt="The Phoenix Project" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I transitioned into management, The Phoenix Project provided a relatable and insightful look into improving team efficiency. It introduced me to the principles of DevOps and systems thinking in a narrative format that’s both engaging and educational.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Devops/The%20Phoenix%20Project%20A%20Novel%20About%20IT%2C%20DevOps%2C%20and%20Helping%20Your%20Business%20Win%20(Gene%20Kim%2C%20Kevin%20%20Behr%2C%20George%20Spafford).pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download The Phoenix Project Book&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  10. The Unicorn Project: A Novel About Developers, Digital Disruption, and Thriving in the Age of Data
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvf93p1msyi4q8vdb9vhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvf93p1msyi4q8vdb9vhb.png" alt="The Unicorn Project" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This companion to The Phoenix Project digs deeper into the developer experience and the role of innovation. It inspired me to create an environment where my team could thrive, be creative, and deliver high-quality work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Devops/The%20Unicorn%20Project%20A%20Novel%20about%20Developers%2C%20Digital%20Disruption%2C%20and%20Thriving%20in%20the%20Age%20of%20Data%20(Gene%20Kim).pdf" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download The Unicorn Project Book&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
      <category>frontend</category>
    </item>
    <item>
      <title>🚀 Accelerate Your Career Path and Professional Development</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Thu, 26 Dec 2024 07:11:54 +0000</pubDate>
      <link>https://forem.com/juniourrau/accelerate-your-career-path-and-professional-development-1k40</link>
      <guid>https://forem.com/juniourrau/accelerate-your-career-path-and-professional-development-1k40</guid>
      <description>&lt;p&gt;This article is a bit different from the technical topics I usually write about. Since it is the holiday season—a time to reflect, recharge, and plan for the future—I thought it would be a great chance to share something more personal.&lt;/p&gt;

&lt;p&gt;This year, I hit an important milestone: seven years in the software industry. I started as an intern in March 2018, worked my way up, and became an engineering manager in August 2022. Over the past two years in leadership, I have learned a lot about what helped me grow my career path faster.&lt;/p&gt;

&lt;p&gt;From the start, I was known as a high-performing team member. My managers valued how I always delivered on time, and my colleagues often said I was dependable and easy to work with. Looking back, I’ve identified the key things I did that made a difference. In this article, I will share those lessons to help you grow your career path too, whether you are just starting out or looking to take the next step. I hope it motivates and guides you on your journey!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Being Proactive
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Winners don't wait, They create&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvn9cy67mzgmibt4p5gg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvn9cy67mzgmibt4p5gg9.png" alt="Being Proactive" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I believe in taking initiative rather than waiting passively for instructions from my manager. When tackling a feature or project, I proactively communicate my thoughts and propose potential solutions. Instead of waiting for direction, I develop a plan and share my ideas with my manager, presenting a clear problem statement along with three possible solutions for consideration. This simple &lt;em&gt;1:3:1 approach&lt;/em&gt;—one problem, three solutions, and one recommendation—ensures thorough preparation and provides ample room for evaluation and execution. It has been invaluable in helping me clarify my thoughts, conduct comprehensive research, and present well-informed plans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6u6kv90shthawzm4viai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6u6kv90shthawzm4viai.png" alt="1:3:1 Problem Solving Framework" width="713" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During my free time, I often check in with my team members to understand what they are working on. This allows me to learn from their approaches while fostering collaboration. Whether through discussions or exchanging ideas, this practice strengthens team chemistry and creates a foundation for future opportunities. Building these connections not only enhances teamwork but also opens doors for innovation and collective growth.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Master Prioritization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Focus on what truly matters and eliminate distractions. Delegate or schedule incomplete tasks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhwm6k83h1qpycdm7z9fh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhwm6k83h1qpycdm7z9fh.png" alt="Master Prioritization" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I became a senior engineer, I was given the opportunity to train and mentor junior engineers and interns. This came with increased responsibilities, including attending more meetings, tackling new projects, and devising solutions. Initially, I handled it well, but as my workload grew, it became overwhelming. I found myself losing focus under the weight of numerous tasks, struggling to ensure everything was delivered on time.&lt;/p&gt;

&lt;p&gt;Recognizing this, I reached out to my manager for advice. His response was simple yet transformative: &lt;strong&gt;delegate effectively&lt;/strong&gt;. He emphasized that as a senior engineer, my primary focus should be on high-impact tasks that align with the organization’s goals. For smaller, less critical tasks, I should delegate and plan them appropriately with the team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsnblt0dixrodnrnqc4tw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsnblt0dixrodnrnqc4tw.png" alt="Effective Delegation" width="584" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He introduced me to a framework that has since become an essential part of my approach: prioritize and delegate based on urgency and importance. For tasks that are urgent and critical—especially those requiring a higher level of expertise—I take ownership. For everything else, I delegate while monitoring progress.&lt;/p&gt;

&lt;p&gt;Delegation not only allows me to focus on what truly matters but also empowers my team to take on more responsibility and grow in their roles. This approach has helped me build trust, develop leadership skills, and create a more productive team. Ultimately, mastering prioritization and delegation played a significant role in my transition to an engineering manager role, enabling me to lead effectively and deliver impactful results.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Set Ruthless Goals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My goals inspire and drive me. I review them every three months.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftn5asymxekeskjjmjo6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftn5asymxekeskjjmjo6v.png" alt="Set Ruthless Goals" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have always been passionate about setting and achieving goals. From a young age, I’ve been obsessed with tracking metrics, setting clear targets, and working methodically to reach them. I take the time to learn and understand what is needed to achieve my objectives, which keeps me focused and motivated. For me, life feels like an exciting game where each goal is a new level to conquer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffzi9in6ffbu6721uu3dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffzi9in6ffbu6721uu3dz.png" alt="30-60-90 days plan" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every three months, I review my goals, evaluate my progress, and identify what adjustments I need to make to stay on track. This regular check-in helps me maintain focus and adapt as needed to ensure success.&lt;/p&gt;

&lt;p&gt;When I started working, I found that this personal habit aligned perfectly with professional practices like OKRs (Objectives and Key Results) and bi-weekly sprints. These structured frameworks allowed me to thrive, as they matched the way I’ve been operating for most of my life. Setting clear goals with a defined timeframe enables me to enter a state of flow, where I am deeply immersed in my work and highly productive.&lt;/p&gt;

&lt;p&gt;This habit has also made me an effective planner. I have become skilled at creating actionable strategies to ensure that my team and I can deliver on our commitments. Reviewing and refining goals consistently not only fuels my motivation but also drives meaningful progress in both my personal and professional life.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Being Optimistic
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Develop a gratitude practice and surround yourself with people who energize you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1ytxpbr5a2nmlw4w27k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1ytxpbr5a2nmlw4w27k7.png" alt="Being Optimistic" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the habits I developed early in life that accelerated my career growth is practicing gratitude. People are naturally drawn to those who appreciate others and work collaboratively rather than those who take all the credit or act like they’re always the best. My ambition has never been just about winning; it is about learning, exploring, and achieving broader goals. To do that, I need a team that motivates and energizes me.&lt;/p&gt;

&lt;p&gt;When you work with people who inspire you, it creates a positive feedback loop. You push each other to perform better, learn more, and reach new heights. For example, every time my team completes a project or meets a tough deadline, we make it a point to celebrate and acknowledge each other’s contributions. It could be as simple as thanking a colleague during a meeting or writing a LinkedIn post highlighting the team’s success.&lt;/p&gt;

&lt;p&gt;This approach not only strengthens team morale but also catches the attention of higher-ups. Gratitude and positivity can open doors to new opportunities and help you stand out as someone people want to collaborate with. In the end, it’s not just about what you achieve individually—it’s about what you achieve together.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Never Stop Learning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Learning isn't optional; it's a lifeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fry7nqzifmi8c83lc9vlf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fry7nqzifmi8c83lc9vlf.png" alt="Never Stop Learning" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the tech industry, things change fast. Languages evolve, frameworks come and go, and new tools pop up every year. The only way to stay relevant is to keep learning. Think of learning as your career's heartbeat—without it, progress stops.&lt;/p&gt;

&lt;p&gt;I remember when React.js was first becoming popular. I had a solid foundation in JavaScript and thought I was good to go. But when my team switched to React for a new project, I felt like a beginner again. Instead of resisting, I took it as an opportunity to learn. I stayed up late, went through documentation, and even built small projects on the side to grasp the concepts. That decision not only helped me deliver in that project but also set me up for more opportunities in frontend development.&lt;/p&gt;

&lt;p&gt;Successes, failures, and feedback are also your greatest teachers. I once led a feature rollout that failed miserably due to miscommunication. Initially, it stung. But when I sat down to reflect, I realized where we went wrong and implemented changes in our workflow. That failure taught me lessons I couldn’t have learned from any book.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Think Beyond Today.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Plan for tomorrow like your life depends on it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fu1eeped2jb6grx1zpp5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fu1eeped2jb6grx1zpp5o.png" alt="Think Beyond Today" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to grow, you need to think ahead—always be 10 steps in front of where you are now. Early in my career, I had a habit of just completing tasks assigned to me. It kept me busy, but it didn’t help me grow. Then one day, one of my mentor told me, &lt;em&gt;“Good engineers solve problems, but great engineers foresee them.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That stuck with me. Now, I don’t just plan my day; I strategize for the week, the month, and even the year. When I was leading a project migration to a new technology stack, I spent weeks identifying potential pitfalls and mapping out solutions before they even became problems. This forward-thinking approach saved the team countless hours and built trust in my leadership skills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Life and technology are like a game of chess—always think a few moves ahead.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Be Accountable
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Win or lose, own it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhca4r257qtsvho4z5ypf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhca4r257qtsvho4z5ypf.png" alt="Be Accountable" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accountability is the hallmark of true professionalism. If something goes wrong, the last thing people want is finger-pointing. Instead, they respect someone who takes ownership and works to make things right.&lt;/p&gt;

&lt;p&gt;I remember leading a project where an important deadline was missed because I underestimated the complexity of the task. Instead of making excuses, I told my manager, “This was on me. Here’s what went wrong, and here’s how I will ensure it doesn’t happen again.” I worked overtime, coordinated with the team, and we eventually delivered a solid product. My manager came up to me after that and congratulated me on a great comeback. &lt;/p&gt;

&lt;p&gt;This incident taught me that accountability builds trust. People want to work with someone who takes responsibility for their actions and outcomes, whether good or bad. It also made me focus on improving my planning and risk management skills.&lt;/p&gt;




&lt;p&gt;This is something I am currently focusing on, and sometimes I wish I had started earlier, as it has a powerful compounding effect over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Network Everywhere You Go
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Opportunities are made in conversation, not cubicles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3mweju89f7qug7dtgixp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3mweju89f7qug7dtgixp.png" alt="Network Everywhere You Go" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During university, I actively participated in events and community service programs. These experiences broadened my perspective and kept me informed about the world around me. However, when I entered the workforce, I shifted my focus entirely to developing my skill set and creating a meaningful career impact.&lt;/p&gt;

&lt;p&gt;For five years, I dedicated myself to deliberate growth and eventually reached the pinnacle of my current role, becoming the most experienced member of my department. That is when I realized I needed to step outside my comfort zone again. I began networking, connecting with new people, and broadening my exposure to diverse perspectives.&lt;/p&gt;

&lt;p&gt;Networking is not limited to just your team or department. Engaging with people from other teams, disciplines, or industries opens the door to fresh ideas and helps you understand the challenges others face. This expanded exposure allows you to contribute beyond your immediate role, making a broader impact.&lt;/p&gt;

&lt;p&gt;More importantly, networking creates opportunities—not just for personal growth but also for career advancement. The relationships you build today could lead to exciting opportunities tomorrow. By actively connecting with others, I have not only revitalized my professional journey but also laid the groundwork for exploring new roles and challenges in the future.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Dark Side of Accelerating Your Growth
&lt;/h3&gt;

&lt;p&gt;Accelerating your career growth can be exciting, but it is important to acknowledge the challenges that come with it. Here are a few realities I’ve encountered on this journey, along with lessons I have learned along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Risk of Burnout
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbcbxrpzyzgq1m4ci5ihe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbcbxrpzyzgq1m4ci5ihe.png" alt="Risk Of Burnout" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you are focused on growing quickly, it is easy to push yourself too hard. Early in my career, I had the advantage of fewer personal commitments, which allowed me to take on challenging projects and work long hours. However, without proper boundaries, I found myself physically and mentally drained at times.&lt;/p&gt;

&lt;p&gt;Burnout is a real risk when you are constantly striving to outperform yourself. I have learned that it is important to prioritize self-care and set limits. Taking breaks, learning to say no, and focusing on tasks that truly matter have helped me stay productive without burning out.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Embracing Loneliness
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9j4b1ee1m65rgfuhzylx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9j4b1ee1m65rgfuhzylx.png" alt="Embracing Loneliness" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you grow, you will often find yourself moving to new teams or taking on roles that set you apart from your peers. This constant change can sometimes feel isolating. I remember switching teams frequently as I took on new challenges, and while it was exciting, it also meant that I wasn’t always able to form lasting bonds with colleagues.&lt;/p&gt;

&lt;p&gt;Over time, I learned to embrace this loneliness as part of my personal development. It pushed me to build stronger communication skills and adapt to different work environments. It is not always easy, but finding ways to connect with others—even in small moments—can help you feel grounded.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Sacrificing "Young Enjoyment"
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvc0za2tpj210b47bk9e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvc0za2tpj210b47bk9e1.png" alt="Sacrificing Youth" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Focusing on career growth early in life often means sacrificing some of the carefree moments others enjoy. I skipped out on late-night hangouts and weekend trips with friends because I was prioritizing work and self-improvement. Looking back, I sometimes feel like I missed out on those memories.&lt;/p&gt;

&lt;p&gt;That said, I don’t regret the choices I made. The work I put in has paid off, but it has also taught me to find a better work life balance. Now, I try to set aside time for personal relationships and experiences, realizing that career growth success doesn’t have to come at the expense of a fulfilling personal life.&lt;/p&gt;




&lt;p&gt;Check out my &lt;a href="https://www.linkedin.com/in/ravin-rau/" rel="noopener noreferrer"&gt;linkiden&lt;/a&gt; where I often update about my career journey. Thank you for taking the time to read this! I hope the article gave you useful tips and ideas to help you succeed in your career. Feel free to share your own career growth advice in the comments!&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🎄CSS Art: December Challange - Christmas In Malaysia ✨</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Sun, 22 Dec 2024 18:01:41 +0000</pubDate>
      <link>https://forem.com/juniourrau/css-art-december-challange-christmas-in-malaysia-1fjb</link>
      <guid>https://forem.com/juniourrau/css-art-december-challange-christmas-in-malaysia-1fjb</guid>
      <description>&lt;p&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2024-12-04"&gt;Frontend Challenge - December Edition, CSS Art: December.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inspiration
&lt;/h3&gt;

&lt;p&gt;I’m from Malaysia, a tropical country where we celebrate Christmas as a festive holiday. The malls here are beautifully decorated, making it a magical time to enjoy the season. While we don’t have snow, every year there’s a fun celebration at the KL Twin Towers where fake snow is dropped from the top—it's such a cool sight! You can check it out &lt;a href="https://www.tiktok.com/@kl.foodie/video/7440720919644900615" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Inspired by this, I imagine how amazing it would be to have the KL Twin Towers inside a snow globe!&lt;/p&gt;

&lt;p&gt;And below is the result of the imagination.&lt;/p&gt;




&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/RavinJr/embed/LEPyzaB?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  Journey
&lt;/h3&gt;

&lt;p&gt;So, I got the idea to create a snow globe using HTML Pug and Scss. I started by checking out what others had done with snow globes online. That’s when I found this cool codepen &lt;a href="https://codepen.io/maku85/pen/VqyXJV" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I was inspired by it and started working on my own project. It was really exciting when I finally reached the final result and could see the iconic KL Twin Tower in the snow globe. It took me about 8 hours to work on it, and I’m pretty happy with how it turned out. I’d love to spend more time on this challenge and try to make it even better by adding more details like Christmas lights. &lt;/p&gt;

&lt;p&gt;Thanks for reading this and for those celebrating Merry Christmas and a Happy New Year.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>6 Types of Git Branching Strategy for DevOps</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Fri, 20 Dec 2024 18:56:15 +0000</pubDate>
      <link>https://forem.com/juniourrau/6-types-of-git-branching-strategy-g54</link>
      <guid>https://forem.com/juniourrau/6-types-of-git-branching-strategy-g54</guid>
      <description>&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;In modern software development, &lt;strong&gt;Trunk-Based Development&lt;/strong&gt; and &lt;strong&gt;GitHub Flow&lt;/strong&gt; are often favored for their simplicity and support for continuous integration and deployment. Trunk-Based Development encourages rapid integration with minimal branches, promoting collaboration and fast iteration. GitHub Flow, with its straightforward feature branching and immediate deployment, aligns well with CI/CD pipelines, making it ideal for fast-paced projects. Both strategies require strong automated testing to ensure stability. For larger teams or complex projects, &lt;strong&gt;Gitflow&lt;/strong&gt; offers a structured approach with clear workflows, though it demands strict adherence to processes. Ultimately, the best approach depends on team size, project complexity, and deployment needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr1to6pg7bp2kobm83nlw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr1to6pg7bp2kobm83nlw.png" alt="Git Branching Strategy" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Git branching strategies are like roadmaps that teams use to organize their work, keep track of different code versions, and work together smoothly in version control. And guess what? Having a consistent naming convention for branches is like having a secret code that makes communication and collaboration a breeze within the team. But here’s the thing, the best branching strategy for your team depends on what you need, how complex your project is, and how you deploy your code. So, let’s dive into the major Git branching strategies, their ups and downs, and when to use them.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Main-Only Strategy
&lt;/h3&gt;

&lt;p&gt;The main branch is the only branch used for development and deployment. All changes are committed directly to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffbrbhaga1k2218xj77bj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffbrbhaga1k2218xj77bj.png" alt="Main-Only Strategy" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Small teams with minimal collaboration.&lt;/li&gt;
&lt;li&gt;Projects with short lifecycles and low complexity.&lt;/li&gt;
&lt;li&gt;Rapid prototyping or proof-of-concept work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple&lt;/strong&gt;: Easy to understand and manage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No merge conflicts&lt;/strong&gt;: Since there are no additional branches, conflicts are minimal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal for small teams&lt;/strong&gt;: Works well for projects with few contributors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Risky&lt;/strong&gt;: Direct changes can lead to instability if errors are introduced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of history&lt;/strong&gt;: It’s harder to track the development process for individual features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No isolation&lt;/strong&gt;: No separation for testing or experimenting with changes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Feature Branching
&lt;/h3&gt;

&lt;p&gt;Each feature or bug fix is developed in its own branch. Developers should follow best practices such as regularly merging changes from the main branch into the feature branch to keep it updated and prevent merge conflicts. Once the feature or fix is complete and thoroughly tested, the branch is merged into the main branch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmufdlg3q1xj9tbzv0geg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmufdlg3q1xj9tbzv0geg.png" alt="Feature Branching" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Teams working on multiple features at once.&lt;/li&gt;
&lt;li&gt;Projects requiring clear tracking of features or tasks.&lt;/li&gt;
&lt;li&gt;Scenarios where risk of breaking production needs to be minimized.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear isolation&lt;/strong&gt;: Changes for each feature are isolated from the main codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better collaboration&lt;/strong&gt;: Multiple developers can work on different features simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy rollback&lt;/strong&gt;: If a feature is buggy, its branch can be discarded without affecting others.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge conflicts&lt;/strong&gt;: Frequent merging can lead to conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhead&lt;/strong&gt;: Requires discipline to regularly merge and update branches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Gitflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gitflow is a structured branching strategy that uses multiple branches like main, develop, feature, release, and hotfix. Branch naming conventions play a crucial role in maintaining clarity and consistency. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feature branches&lt;/strong&gt;: &lt;code&gt;/feature/{{author}}/{{card-number}}/{{short-description}}&lt;/code&gt; (e.g., &lt;code&gt;/feature/john/1234/add-login&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hotfix branches&lt;/strong&gt;: &lt;code&gt;/hotfix/{{issue-number}}&lt;/code&gt; (e.g., &lt;code&gt;/hotfix/5678&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release branches&lt;/strong&gt;: &lt;code&gt;/release/{{version}}&lt;/code&gt; (e.g., &lt;code&gt;/release/1.2.0&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff3xopzq3pjvrewt7thmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff3xopzq3pjvrewt7thmq.png" alt="Gitflow Brancing" width="714" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Teams with well-defined release cycles.&lt;/li&gt;
&lt;li&gt;Large or complex projects requiring high stability.&lt;/li&gt;
&lt;li&gt;Scenarios where roles and responsibilities are clearly defined.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Well-organized:&lt;/strong&gt; Provides a clear workflow for development, testing, and deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports large teams:&lt;/strong&gt; Effective for projects with many contributors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release isolation:&lt;/strong&gt; Ensures stability during release preparation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex:&lt;/strong&gt; Requires strict adherence to rules and workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhead:&lt;/strong&gt; Managing multiple branches can be time-consuming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow pace:&lt;/strong&gt; Not ideal for rapid or continuous deployment needs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;GitHub Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Flow is a simplified strategy focused on continuous delivery. To maintain consistency, teams can adopt a branch naming convention such as &lt;code&gt;/{{author}}/{{short-description}}&lt;/code&gt; (e.g., &lt;code&gt;/alice/add-login-button&lt;/code&gt;). This ensures clarity while keeping the approach straightforward. Developers create feature branches, merge them into the main branch, and deploy immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Feq6kfa8nky3nbybdbwxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Feq6kfa8nky3nbybdbwxp.png" alt="Github Flow" width="751" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Teams practicing continuous integration and deployment.&lt;/li&gt;
&lt;li&gt;Smaller projects with fast-paced development cycles.&lt;/li&gt;
&lt;li&gt;Cloud-based or SaaS applications requiring frequent updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple:&lt;/strong&gt; Easy to learn and implement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous deployment:&lt;/strong&gt; Encourages shipping small, incremental changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal for CI/CD pipelines:&lt;/strong&gt; Works well with automated testing and deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No long-term branches:&lt;/strong&gt; Lacks structure for handling long-term development or pre-release testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Potential instability:&lt;/strong&gt; Main branch must always be production-ready, requiring thorough testing in feature branches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Trunk-Based Development&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In trunk-based development, all developers commit directly to the main branch or use short-lived branches that are merged quickly. For short-lived branches, a naming convention like &lt;code&gt;/fix/{{bug-id}}&lt;/code&gt; (e.g., &lt;code&gt;/fix/1234&lt;/code&gt;) or &lt;code&gt;/task/{{id}}&lt;/code&gt; (e.g., &lt;code&gt;/task/5678&lt;/code&gt;) can help maintain clarity and traceability during rapid iterations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3iun0sd72b8inc5sf22n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3iun0sd72b8inc5sf22n.png" alt="Trunk Based Development" width="777" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Agile teams practicing frequent releases.&lt;/li&gt;
&lt;li&gt;Scenarios with strong automated testing and CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;Projects requiring high collaboration and fast iteration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast:&lt;/strong&gt; Encourages rapid integration and deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal branches:&lt;/strong&gt; Reduces complexity and merge conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encourages collaboration:&lt;/strong&gt; Promotes frequent communication and code reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Risk of instability:&lt;/strong&gt; Main branch can become unstable if proper testing isn’t enforced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High discipline required:&lt;/strong&gt; Requires strict code review and testing processes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;Release Branching&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Separate branches are maintained for each release version, often labeled with version numbers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhnez4qml7p3decx9209q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhnez4qml7p3decx9209q.png" alt="Release Branching" width="745" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Projects with long-term support (LTS) requirements.&lt;/li&gt;
&lt;li&gt;Scenarios where maintaining multiple release versions is critical.&lt;/li&gt;
&lt;li&gt;Enterprise applications needing well-documented release histories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version control:&lt;/strong&gt; Clear history of all releases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stable main branch:&lt;/strong&gt; Maintains a clean and production-ready main branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports patching:&lt;/strong&gt; Allows bug fixes for specific releases without affecting others.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Branch proliferation:&lt;/strong&gt; Too many branches can become unmanageable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slower pace:&lt;/strong&gt; Not ideal for fast-moving projects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Choosing the Right Strategy
&lt;/h3&gt;

&lt;p&gt;Here are some factors to consider when selecting a branching strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team size:&lt;/strong&gt; Smaller teams may prefer simpler strategies like main-only or GitHub Flow, while larger teams benefit from structured approaches like Gitflow. Use consistent branch naming conventions, such as &lt;code&gt;/feature/{{author}}/{{card-number}}/{{description}}&lt;/code&gt; for Gitflow or &lt;code&gt;/{{author}}/{{short-description}}&lt;/code&gt; for GitHub Flow, to maintain clarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project complexity:&lt;/strong&gt; Complex projects often need more organization, making Gitflow or release branching ideal. For example, Gitflow can use &lt;code&gt;/hotfix/{{issue-number}}&lt;/code&gt; for critical fixes or &lt;code&gt;/release/{{version}}&lt;/code&gt; for release preparation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment needs:&lt;/strong&gt; Continuous deployment works best with GitHub Flow or trunk-based development. Short-lived branches in trunk-based development can follow formats like &lt;code&gt;/fix/{{bug-id}}&lt;/code&gt; or &lt;code&gt;/task/{{id}}&lt;/code&gt; for traceability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing and stability:&lt;/strong&gt; If testing and stability are critical, Gitflow or release branching provides better control with clear branch naming practices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development pace:&lt;/strong&gt; Fast-moving projects benefit from trunk-based development or GitHub Flow, where lightweight branch naming conventions like &lt;code&gt;/{{author}}/{{short-description}}&lt;/code&gt; are effective.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;No single Git branching strategy fits all projects. The key is to align the strategy with your team’s workflow, project needs, and goals. Start with a strategy that suits your current needs and be open to evolving it as your team grows and your processes mature.&lt;/p&gt;

&lt;p&gt;Comment below what your favorite branching strategy is and how effective it has been with your team members.&lt;/p&gt;

&lt;p&gt;Happy branching!&lt;/p&gt;




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

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=U_IFGpJDbeU&amp;amp;t=454s" rel="noopener noreferrer"&gt;Branching Strategies Explained&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=gQVUCTVt39o&amp;amp;t=1854s" rel="noopener noreferrer"&gt;Branching strategies: GitHub Flow and Git Flow&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>discuss</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Clean Code Essentials: YAGNI, KISS, DRY</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Tue, 17 Dec 2024 11:04:22 +0000</pubDate>
      <link>https://forem.com/juniourrau/clean-code-essentials-yagni-kiss-and-dry-in-software-engineering-4i3j</link>
      <guid>https://forem.com/juniourrau/clean-code-essentials-yagni-kiss-and-dry-in-software-engineering-4i3j</guid>
      <description>&lt;p&gt;In the world of software engineering, where clean code and efficient design patterns reign supreme, three principles stand out as guiding lights: YAGNI, KISS, and DRY. These principles are not just buzzwords; they are the foundation of effective software development. Whether you're a seasoned developer or just starting your coding journey, understanding these concepts can transform the way you approach building software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ft8o3k8iiruz0txx7kwed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ft8o3k8iiruz0txx7kwed.png" alt="YAGNI - KISS - DRY" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, we'll dive into the heart of these principles. We'll explore how &lt;strong&gt;YAGNI (You Aren't Gonna Need It)&lt;/strong&gt; helps prevent unnecessary complexity, how &lt;strong&gt;KISS (Keep It Simple, Stupid)&lt;/strong&gt; encourages straightforward solutions, and how &lt;strong&gt;DRY (Don't Repeat Yourself)&lt;/strong&gt; promotes code reusability. By the end, you'll see how these principles can lead to cleaner, more maintainable code and ultimately make you a more efficient software engineer. So, let's get started!&lt;/p&gt;




&lt;h2&gt;
  
  
  YAGNI - You Aren't Gonna Need It.
&lt;/h2&gt;

&lt;p&gt;It's a principle in software development that reminds us to only implement features when they are actually needed, not when we think they might be needed in the future. The idea is to avoid over-engineering and keep things simple.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkx4a32w0ajlaocu3ifi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkx4a32w0ajlaocu3ifi0.png" alt="Yagni Principle" width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Do We Need to Use YAGNI?
&lt;/h3&gt;

&lt;p&gt;Using YAGNI helps prevent unnecessary complexity in your code. When you add features or code that you don't currently need, you increase the chances of introducing bugs and make your codebase harder to maintain. By sticking to YAGNI, you focus on what's essential, saving time and resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use the YAGNI Principle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fztgoc3w3gefpjaclpb2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fztgoc3w3gefpjaclpb2n.png" alt="Yagni Principle In Action" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To apply YAGNI, always ask yourself if a feature is necessary right now. If it's not, don't build it. Prioritize the current requirements and resist the temptation to plan for every possible future scenario. This approach keeps your code lean and focused.&lt;/p&gt;




&lt;h2&gt;
  
  
  KISS - Keep It Simple, Stupid.
&lt;/h2&gt;

&lt;p&gt;It's a principle in software development that encourages simplicity in design and implementation. The idea is to avoid unnecessary complexity and make things as straightforward as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxx388wm0vgyrnm2e8ssp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxx388wm0vgyrnm2e8ssp.png" alt="Kiss Principle" width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Do We Need to Use KISS?
&lt;/h3&gt;

&lt;p&gt;Using the KISS principle helps make your code easier to read, understand, and maintain. Complex solutions can be difficult to debug and extend, while simple solutions are more robust and flexible. By keeping things simple, you reduce the risk of errors and make it easier for others (and your future self) to work with your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use the KISS Principle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fx6fio1kj0of80o3dfbe4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fx6fio1kj0of80o3dfbe4.png" alt="Kiss Principle" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To apply KISS, always aim for the simplest solution that meets the requirements. Avoid overengineering and resist the temptation to add unnecessary features or complexity. Focus on clarity and straightforwardness in your code and design.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY - Don't Repeat Yourself.
&lt;/h2&gt;

&lt;p&gt;It's a principle in software development that emphasizes the importance of reducing repetition in your code. The idea is to have a single, unambiguous source of truth for every piece of knowledge or logic in your codebase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fm0q29z69bz9founj06es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fm0q29z69bz9founj06es.png" alt="Dry Principle" width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Do We Need to Use DRY?
&lt;/h3&gt;

&lt;p&gt;Using the DRY principle helps make your code more maintainable and less error-prone. When you have duplicate code, any change or bug fix needs to be applied in multiple places, increasing the risk of inconsistencies and errors. DRY ensures that you only need to make changes in one place, making your code easier to manage and understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use the DRY Principle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsvbtueg3vxx7jt18s910.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsvbtueg3vxx7jt18s910.png" alt="Using Dry Principle" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To apply DRY, look for repeated code or logic in your codebase and refactor it into a single, reusable component. This could mean creating functions, classes, or modules encapsulating repeated logic. Always aim to consolidate similar code to avoid duplication.&lt;/p&gt;




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

&lt;p&gt;In the journey of software development, embracing the principles of YAGNI, DRY, and KISS can make a world of difference. By focusing on what's necessary with YAGNI, reducing repetition with DRY, and keeping things straightforward with KISS, you can create cleaner, more maintainable code. These principles not only help you write better software but also make your development process more efficient and enjoyable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwx8u570bopmekbfmkgfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwx8u570bopmekbfmkgfy.png" alt="Clean Code Principle, YAGNI-KISS-DRY" width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember, the goal is to build software that is easy to understand, modify, and extend. By applying these principles, you set a strong foundation for your projects and make life easier for yourself and your team.&lt;/p&gt;

&lt;p&gt;Stay tuned for our next article, where we'll dive into the SOLID principles, another set of guidelines that can help you become an even more effective software engineer. Happy coding!&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do check out &lt;a href="https://github.com/RavinRau/Ebooks/blob/main/Software%20Engineering%20Principle/Clean%20Code%20-%20A%20Handbook%20of%20Agile%20Software%20Craftsmanship.pdf" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt; to understand more in-depth on the best practices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comic Strip made possible by people from &lt;a href="https://www.openpeeps.com/" rel="noopener noreferrer"&gt;Open Peeps&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🦸 Supercharge your debugging skills with the console.trace</title>
      <dc:creator>Ravin Rau</dc:creator>
      <pubDate>Fri, 13 Dec 2024 18:34:50 +0000</pubDate>
      <link>https://forem.com/juniourrau/supercharge-your-debugging-skills-with-the-consoletrace-425p</link>
      <guid>https://forem.com/juniourrau/supercharge-your-debugging-skills-with-the-consoletrace-425p</guid>
      <description>&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;🔍 What's your debugging superpower? Mine was discovering console.trace() - it turned hours of debugging into minutes by revealing the exact execution path in my code. Share your game-changing debugging tool that transformed your development workflow in the comment section below!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Skip the intro to go into the gist of the content&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first started coding, I relied heavily on console.log to debug and understand how my code was working. I think many of us have been there—sprinkling console.log statements everywhere to track down a pesky bug. But as our applications grow and we collaborate with larger teams, this approach can quickly become chaotic.&lt;/p&gt;

&lt;p&gt;I remember one particular bug that had me stumped. It was related to a service I knew well, so I confidently took on the task. After two hours of diving into multiple files and littering my code with &lt;code&gt;console.log&lt;/code&gt; statements, I was still no closer to finding the root cause. Frustrated, I reached out to a senior developer for help. That's when I was introduced to the magic of &lt;code&gt;console.trace&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For the first time, I could see the stack trace of function calls, giving me a clear view of the execution flow. It was like having a map instead of wandering in the dark, guessing where to place my console.log statements.&lt;/p&gt;

&lt;p&gt;Share your personal experience in the comment section below on which debugging tools help you to debug issues faster.&lt;/p&gt;

&lt;p&gt;Debugging is a crucial part of software development, and JavaScript offers several tools to make this process easier. Two of the most common are console.log and console.trace. Let's dive into how these tools can be used effectively, using a simple bookstore application as an example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F83ybne0mj6snc7vx83eb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F83ybne0mj6snc7vx83eb.png" alt="BookStore Architecture" width="800" height="470"&gt;&lt;/a&gt;&lt;br&gt;
If you want to play around with the services with the console.log and console.trace, &lt;a href="https://github.com/RavinRau/knowledge-sharing/tree/main/trace-vs-log" rel="noopener noreferrer"&gt;visit my github repo link here.&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What is &lt;code&gt;console.log&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqm6ncgc74ke0xlq4m4v8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqm6ncgc74ke0xlq4m4v8.png" alt="consolelog" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log&lt;/code&gt; is a method used to print messages to the console. It's often used to display variable values, track the flow of execution, or simply output information for the developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it :&lt;/strong&gt; Use &lt;code&gt;console.log&lt;/code&gt; when you need to output simple messages or variable values. It's great for quick checks and confirming that certain parts of your code are executing as expected.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is &lt;code&gt;console.trace&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fuce6kjq28oiw9delqm6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fuce6kjq28oiw9delqm6d.png" alt="consoletrace" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.trace&lt;/code&gt; is a more advanced debugging tool that not only logs a message but also provides a stack trace. This stack trace shows the sequence of function calls that led to the point where &lt;code&gt;console.trace&lt;/code&gt; was called, which can be invaluable for understanding the flow of execution and identifying where things might be going wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Use &lt;code&gt;console.trace&lt;/code&gt;when you need more context about the execution flow. It's particularly useful for complex applications where understanding the call stack can help diagnose issues.&lt;/p&gt;


&lt;h3&gt;
  
  
  Scenario: 🦹 Debugging a Mysterious Order Total Calculation
&lt;/h3&gt;

&lt;p&gt;Let's say we are getting a customer complaints that order totals are incorrect. Here's how we can demonstrate the power of &lt;code&gt;console.trace()&lt;/code&gt; vs &lt;code&gt;console.log()&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, let's modify the &lt;code&gt;OrderService.js&lt;/code&gt; to include both debugging approaches:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class OrderService {
    calculateTotal(items) {
        console.log('Calculating total for items:', items);  // Traditional approach

        const total = items.reduce((total, item) =&amp;gt; {
            const book = this.bookService.getBook(item.bookId);
            console.trace('Book price calculation');  // Using console.trace
            return total + (book.price * item.quantity);
        }, 0);

        return total;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When you run this with an order that has incorrect totals, here's what you'll see:&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;console.log()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Calculating&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bookId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;book1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bookId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;book2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;console.trace()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Book&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="nx"&gt;calculation&lt;/span&gt;
    &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;OrderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateTotal &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;OrderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;OrderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createOrder &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;OrderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;anonymous&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;console.trace()&lt;/code&gt; output immediately shows us the entire call stack, revealing that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The calculation starts in &lt;code&gt;index.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Goes through &lt;code&gt;createOrder&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then hits &lt;code&gt;calculateTotal&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This becomes particularly valuable when you have multiple services calling each other. For example, if we look at the order creation flow in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// console.trace('Creating order');  // Using console.trace&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Verify all books are available&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bookService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkBookAvailability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bookId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Book &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bookId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; not available in requested quantity`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;// Process billing&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;billingService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;processBilling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we add &lt;code&gt;console.trace()&lt;/code&gt; in the &lt;code&gt;processBilling&lt;/code&gt; method, we can see the complete chain of service calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In BillingService.js&lt;/span&gt;
&lt;span class="nf"&gt;processBilling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Processing billing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createInvoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trace: Processing billing
    at BillingService.processBilling (src/services/BillingService.js:3)
    at OrderService.createOrder (src/services/OrderService.js:32)
    at Object.&amp;lt;anonymous&amp;gt; (src/index.js:27)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This trace immediately shows us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which file initiated the billing process&lt;/li&gt;
&lt;li&gt;The exact sequence of method calls&lt;/li&gt;
&lt;li&gt;The specific line numbers where each call occurred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is particularly useful when debugging issues in a complex system where multiple services interact, like in this bookstore application&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwnib467krwaqju16jey9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwnib467krwaqju16jey9.png" alt="When everything is connected" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;console.trace()&lt;/code&gt;, you might need multiple &lt;code&gt;console.log()&lt;/code&gt; statements across different files to understand the execution flow. With &lt;code&gt;console.trace()&lt;/code&gt;, you get the complete picture in one go.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✨ Best Practice Tip
&lt;/h3&gt;

&lt;p&gt;Add &lt;code&gt;console.trace()&lt;/code&gt; at critical points where services interact with each other, especially in methods that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Handle financial calculations&lt;/li&gt;
&lt;li&gt;Process user transactions&lt;/li&gt;
&lt;li&gt;Interact with multiple services&lt;/li&gt;
&lt;li&gt;Have complex conditional logic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way, when issues arise, we can quickly understand the exact path our code took to reach that point.&lt;/p&gt;




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

&lt;p&gt;Both &lt;code&gt;console.log&lt;/code&gt; and &lt;code&gt;console.trace&lt;/code&gt; are powerful tools for debugging, each serving different purposes. By using them appropriately, you can gain better insights into your application's behavior and more effectively identify and fix issues. Share your game-changing debugging tool that transformed your development workflow in the comment below!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
