<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shravan Kumar B</title>
    <description>The latest articles on DEV Community by Shravan Kumar B (@zhravan).</description>
    <link>https://dev.to/zhravan</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%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg</url>
      <title>DEV Community: Shravan Kumar B</title>
      <link>https://dev.to/zhravan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhravan"/>
    <language>en</language>
    <item>
      <title>Sharing my thoughts on experience/learning from Freelancing journey</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Sat, 03 Jan 2026 20:24:26 +0000</pubDate>
      <link>https://dev.to/zhravan/sharing-my-thoughts-on-experiencelearning-from-freelancing-journey-1dgh</link>
      <guid>https://dev.to/zhravan/sharing-my-thoughts-on-experiencelearning-from-freelancing-journey-1dgh</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk" class="crayons-story__hidden-navigation-link"&gt;On Freelancing: My lessons and learnings&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/zhravan" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" alt="zhravan profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/zhravan" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Shravan Kumar B
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Shravan Kumar B
                
              
              &lt;div id="story-author-preview-content-3115419" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/zhravan" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Shravan Kumar B&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 19 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk" id="article-link-3115419"&gt;
          On Freelancing: My lessons and learnings
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;19&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>On Freelancing: My lessons and learnings</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Fri, 19 Dec 2025 10:52:42 +0000</pubDate>
      <link>https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk</link>
      <guid>https://dev.to/zhravan/on-freelancing-my-lessons-and-learnings-21lk</guid>
      <description>&lt;h1&gt;
  
  
  On Freelancing: My lessons and learnings
&lt;/h1&gt;

&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;This article is a reflection on my journey as a freelancer, the lessons learned, the challenges faced, and the reality behind the promise of freedom. If you are considering freelancing or already on this path, I hope that these insights help you navigate it better.&lt;/p&gt;

&lt;p&gt;This &lt;a href="https://zhravan.dev/blogs/on-freelancing/" rel="noopener noreferrer"&gt;article&lt;/a&gt; was originally posted on my personal space; before cross-posting it here.&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%2Fqkbva354lbrh7h4s7hv6.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%2Fqkbva354lbrh7h4s7hv6.png" alt="The independent path: freedom comes with responsibility" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The independent path: freedom comes with responsibility&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Freelancing?
&lt;/h2&gt;

&lt;p&gt;I was drawn to freelancing for the same reasons, that most people are drawn to freelancing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Freedom from the daily commute&lt;/li&gt;
&lt;li&gt;Freedom to choose your projects&lt;/li&gt;
&lt;li&gt;Freedom to set your own hours&lt;/li&gt;
&lt;li&gt;Freedom from office politics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's what they don't tell you upfront:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Freelancing isn't freedom from work. It's freedom in work.&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;The work is still work. The deadlines are still deadlines. The clients are still demanding. The difference is; they're yours—you choose which projects to take, which deadlines to accept, and which clients to work with.&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%2Fs921m9ehzvklje081und.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%2Fs921m9ehzvklje081und.png" alt="A freelancer building their own path" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A freelancer building their own path &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The First Project
&lt;/h2&gt;

&lt;p&gt;I remember my first freelance project clearly. I was excited, nervous, and honestly, I was undercharging.&lt;/p&gt;

&lt;p&gt;I took a product that was to migrate legacy product to modern Next.js Application. Current system whose UI and Backend was built on Django with Server Side Rendered. The client was a Venture Capitalist company. The application was a No Code tool for the companies they have funded or undertaken, to manage their portfolio and all other operations. The whole system was legacy, where all UI design and components were done using jQuery, Javascript embedded on Django templates.&lt;/p&gt;

&lt;p&gt;The client seemed nice, the requirements seemed clear initially, and I thought I had everything figured out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  I was wrong.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;I quickly discovered significant technical caveats and communication challenges. There was no knowledge transfer, no API documentation, lets no documentation at all. It was like being handed a black box and expected to explore it and deliver results quickly.&lt;/p&gt;

&lt;p&gt;To make matters worse, the team who built this product came from a business background with little to no engineering background as such. The entire codebase reflected this; it was a disaster.&lt;/p&gt;

&lt;p&gt;None of these challenges were communicated during the initial discovery call. This was partly my fault; I was too excited to take on the work and get started, so I didn't ask the right questions upfront. Transitioning the existing jQuery-based UI components to React and decoupling the backend from the frontend proved extremely difficult, as the legacy system didn't follow standard engineering practices.&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%2Fny17xqlqwl9g7qu05rba.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%2Fny17xqlqwl9g7qu05rba.png" alt="Reality of freelance challenges: what they don't tell you upfront" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reality of freelance challenges: what they don't tell you upfront&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I managed to migrate two modules and deliver them before parting ways with the client. I decided not to continue with the remaining 10-11 modules. The product was built over years from 2008-09 and had been maintained (or rather, patched) using the same approach ever since. The technical debt was overwhelming, and decoupling such a legacy system was more pain than I was willing to take on especially since the client couldn't understand the technical complexity involved in decoupling legacy system and time taken to it, given such large product. Perhaps I'll write more about this experience in a separate article.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Negotiation is a skill&lt;/strong&gt;: Don't be afraid to discuss rates. Your time and expertise have value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clear communication saves time&lt;/strong&gt;: What seems obvious to you might not be obvious to the client. Always clarify requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contracts matter&lt;/strong&gt;: Even for small projects. Define scope, timeline, payment terms, and what happens if things change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Saying no is powerful&lt;/strong&gt;: Not every project is worth taking. Some clients aren't worth the stress.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: Setting clear boundaries&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Frontend development (React/Next.js)&lt;/li&gt;
&lt;li&gt;API integration with existing backend&lt;/li&gt;
&lt;li&gt;Responsive design implementation&lt;/li&gt;
&lt;li&gt;Development testing and bug fixes&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;DevOps and deployment setup (outside project scope)&lt;/li&gt;
&lt;li&gt;Post-launch maintenance and support (available as separate service)&lt;/li&gt;
&lt;li&gt;Backend development or API creation&lt;/li&gt;
&lt;li&gt;Content creation or copywriting&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Revisions: 2 rounds of feedback included&lt;/li&gt;
&lt;li&gt;Timeline: 4 weeks from project start&lt;/li&gt;
&lt;li&gt;Payment: 50% upfront, 50% on delivery&lt;/li&gt;
&lt;li&gt;Additional features: Quoted separately and require scope change approval&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Feast and Famine Cycle
&lt;/h2&gt;

&lt;p&gt;One of the hardest lessons in freelancing is dealing with the feast and famine cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Feast:&lt;/strong&gt; You are drowning in work. Multiple clients, tight deadlines, late nights. You are making good money, but you are exhausted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Famine:&lt;/strong&gt; Radio silence. No new projects. No responses to proposals. You start questioning everything.&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%2Fkes3e2lvld1dnp69brb1.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%2Fkes3e2lvld1dnp69brb1.png" alt="The reality of freelance income: prepare for both extremes" width="709" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The reality of freelance income: prepare for both extremes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How to Handle It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save during the feast&lt;/strong&gt;: When work is abundant, save aggressively. Aim for at least 6 months of expenses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use downtime productively&lt;/strong&gt;: During slow periods, work on your portfolio, learn new skills, write blog posts, contribute to open source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build a pipeline&lt;/strong&gt;: Always have potential projects in the pipeline. Network, maintain relationships, stay visible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diversify income streams&lt;/strong&gt;: Don't rely on a single client or project type. Consider passive income, products, or retainer agreements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Loneliness
&lt;/h2&gt;

&lt;p&gt;Working alone sounds romantic until you are actually alone. No water cooler conversations. No team lunches. No one to bounce ideas off at 2 AM when you are stuck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Community
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Join communities&lt;/strong&gt;: Online forums, Discord servers, local meetups. Find your tribe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find accountability partners&lt;/strong&gt;: Someone to check in with, share goals, and keep each other motivated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Co-working spaces&lt;/strong&gt;: Even if it's just a few days a week, being around other people helps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentorship&lt;/strong&gt;: Find mentors. Be a mentor. Both help combat isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've found that the best freelancers aren't lone wolves; they're part of a pack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Boundaries
&lt;/h2&gt;

&lt;p&gt;When work is everywhere, work is everywhere.&lt;/p&gt;

&lt;p&gt;Your laptop is always open. Your phone is always buzzing. Your mind is always working.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protecting Your Time
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define work hours&lt;/strong&gt;: Even if you are flexible, have core hours when you are available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a dedicated workspace&lt;/strong&gt;: Separate work from life, even if it's just a corner of your room.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learn to say no&lt;/strong&gt;: Not just to bad projects, but to requests outside your scope or availability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Take breaks&lt;/strong&gt;: Seriously. Burnout is real, and it is crazy harder to recover when you are on your own, trust me when I say this. This is coming from a very very personal experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lets say if you are &lt;strong&gt;setting availability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working hours&lt;/strong&gt;: 9 AM - 6 PM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response time&lt;/strong&gt;: Within 24 hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emergency contact&lt;/strong&gt;: Only for critical issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekends&lt;/strong&gt;: Unavailable unless discussed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understanding Your Value
&lt;/h2&gt;

&lt;p&gt;When you start freelancing, you'll likely say yes to everything.&lt;/p&gt;

&lt;p&gt;Then you &lt;strong&gt;learn to say no&lt;/strong&gt;. You learn that your value isn't in your availability, its in your expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing Your Work
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't compete on price&lt;/strong&gt;: Compete on value. Cheap clients are often the most demanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Know your numbers&lt;/strong&gt;: Calculate your actual costs; this includes taxes, health insurance, equipments, software, time off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Value based pricing&lt;/strong&gt;: Sometimes hourly doesn't make sense. Charge based on the value you deliver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Raise your rates&lt;/strong&gt;: Regularly. As you gain experience, your rates should reflect that.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Your rate is not just about money. It is about the respect you &lt;br&gt; have for your own time and expertise.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;Freelancing is nott easier than a traditional job. It is different. You are still working. You still have deadlines. You still have responsibilities.&lt;/p&gt;

&lt;p&gt;The difference is: &lt;strong&gt;they are yours.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You choose the projects. You choose the clients. You choose your path.&lt;/p&gt;

&lt;p&gt;But with that choice comes responsibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You are Really Signing Up For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You are the CEO&lt;/strong&gt;: Strategy, planning, business development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are the sales team&lt;/strong&gt;: Finding clients, proposals, negotiations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are the accountant&lt;/strong&gt;: Invoicing, taxes, bookkeeping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are the developer&lt;/strong&gt;: Actually doing the work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are the support team&lt;/strong&gt;: Client communication, maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a lot, but it is also empowering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade offs
&lt;/h2&gt;

&lt;p&gt;Every choice is a trade off.&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%2Fgqgg1ynvcsb981fc72ww.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%2Fgqgg1ynvcsb981fc72ww.png" alt="The trade-offs of freelancing: freedom comes with choices" width="787" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The trade-offs of freelancing: freedom comes with choices&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stability vs. Flexibility&lt;/strong&gt;: Traditional jobs offer stability. Freelancing offers flexibility. You rarely get both. At least, in the current stage that I am in, that is what I have experienced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security vs. Freedom&lt;/strong&gt;: Regular paychecks feel secure. But is it security or the illusion of security?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comfort vs. Growth&lt;/strong&gt;: Staying in your comfort zone is easy. But growth happens outside it. There are plenty of opportunities where you will have to work outside your comfort zone, and that is something you cannot avoid. That is where the real fun lies, you get to learn constantly, gain new perspectives, and understand how things work beyond just engineering and code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no right answer. Only the answer that fits you.&lt;/p&gt;

&lt;p&gt;Some days you'll question your choice. Some days you'll celebrate it.&lt;/p&gt;

&lt;p&gt;Both are valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting your space &amp;amp; workflow
&lt;/h2&gt;

&lt;p&gt;The most successful freelancers I know are not the most talented, rather they're the most organized. They are constant learners who adapt quickly to changing needs and continuously level up their skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflows that worked for me
&lt;/h3&gt;

&lt;p&gt;Here are some things that have become essential to my workflow, making daily planning and execution much smoother.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project Management&lt;/strong&gt;: Track your projects, deadlines, and tasks. Use tools like AppFlowy, Trello, Notion, or a simple spreadsheet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Time Tracking&lt;/strong&gt;: Know where your time goes. It helps with pricing and identifying time sinks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invoicing&lt;/strong&gt;: Automate it. Use tools that handle recurring invoices, reminders, and payment tracking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Document your processes, common solutions, and client preferences. It saves time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contracts&lt;/strong&gt;: Have templates ready. Customize as needed, but start with solid foundations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note:&lt;br&gt;
 I use self-hosted open-source tools that have significantly improved my&lt;br&gt;
  workflow. I plan to write about these tools in a separate article.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learning to Communicate
&lt;/h2&gt;

&lt;p&gt;Communication is everything in freelancing. You are not just building products, you are managing expectations, setting boundaries, and building relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Communication Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Over communicate&lt;/strong&gt;: Especially early in a project. Better to share too much than too little.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set expectations&lt;/strong&gt;: Be clear about timelines, deliverables, and what is included (and explicitly what is not).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document everything&lt;/strong&gt;: Meeting notes, decisions, changes. Written records protect everyone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be proactive&lt;/strong&gt;: Don't wait for problems. Check in regularly, share progress, flag issues early.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Know your audience&lt;/strong&gt;: Technical details for developers, business value for stakeholders.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Freelancing: Usain Bolt or Mo Farah?
&lt;/h2&gt;

&lt;p&gt;Freelancing isn't a sprint. It is a marathon.&lt;/p&gt;

&lt;p&gt;You will have good months and bad months. Good clients and bad clients. Good projects and projects you would rather forget.&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%2Fz9y1ge3xg6jnjnx7lkta.jpg" 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%2Fz9y1ge3xg6jnjnx7lkta.jpg" alt="Marathon, not a sprint; Usain Bolt runs fast but Mo Farah runs far" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Marathon, not a sprint; Usain Bolt runs fast but Mo Farah runs far&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But if you stick with it, you build something valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A reputation&lt;/strong&gt;: Your work speaks for itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A network&lt;/strong&gt;: Relationships that open doors to new opportunities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A portfolio&lt;/strong&gt;: Proof of what you can do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence&lt;/strong&gt;: The ability to choose your path&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is Freelancing Right for You?
&lt;/h2&gt;

&lt;p&gt;Not everyone should freelance. Not everyone shouldn't.&lt;/p&gt;

&lt;p&gt;The question is not: &lt;strong&gt;"Should I freelance?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather, the question is: &lt;strong&gt;"What do I want?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And are you willing to pay the price for what you want?&lt;/p&gt;

&lt;h3&gt;
  
  
  Signs It Might Be Right
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You are self motivated and disciplined&lt;/li&gt;
&lt;li&gt;You are comfortable with uncertainty&lt;/li&gt;
&lt;li&gt;You enjoy variety in your work&lt;/li&gt;
&lt;li&gt;You are good at managing your time&lt;/li&gt;
&lt;li&gt;You can handle the business side (sales, admin, customer relationship etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Signs It Might Not Be
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need structure and routine&lt;/li&gt;
&lt;li&gt;Financial security is your top priority&lt;/li&gt;
&lt;li&gt;You prefer working in teams&lt;/li&gt;
&lt;li&gt;You do not want to handle business tasks&lt;/li&gt;
&lt;li&gt;You struggle with self discipline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no shame in either path. The goal is to find what works for you.&lt;/p&gt;

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

&lt;p&gt;Freelancing is not freedom from work; rather it is freedom in work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Your projects. Your clients. Your time. Your life.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that's the point.&lt;/p&gt;

&lt;p&gt;Not escaping work, but shaping it to fit your life.&lt;/p&gt;

&lt;p&gt;It's not easy. It's not for everyone. But if it's for you, it's worth it.&lt;/p&gt;








&lt;p&gt;I know this has been a longer post than expected. If you got this far, I appreciate&lt;br&gt;
your patience and thank you for your time.&lt;/p&gt;

&lt;p&gt;If you are considering freelancing or already on this path, I hope these insights help. And if you have your own experiences to share, I would love to hear them.&lt;/p&gt;

&lt;p&gt;If you like the article, hit the like button, share the article and subscribe the blog. If you want me to write an article on a specific domain or technology, feel free to drop a mail at &lt;a href="mailto:shravan@ohmyscript.com"&gt;shravan@ohmyscript.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned for more.&lt;/p&gt;

&lt;p&gt;That's all for now. Thank you for reading.&lt;/p&gt;

&lt;p&gt;Signing off until next time.&lt;br&gt;
Happy Learning.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Expedition of Async Programming in JavaScript</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Sat, 02 Aug 2025 10:48:40 +0000</pubDate>
      <link>https://dev.to/zhravan/expedition-of-async-programming-in-javascript-136a</link>
      <guid>https://dev.to/zhravan/expedition-of-async-programming-in-javascript-136a</guid>
      <description>&lt;h3&gt;
  
  
  My Background with Programming
&lt;/h3&gt;

&lt;p&gt;This is a story of my expedition of understanding Asynchronous Programming in JS. Coming from a Computer Science background, I got various opportunities to explore multiple platforms, where I could learn different programming languages, from Assembly languages to High-level languages. However, I have never struggled to understand the construct or flow of the language.&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%2Fj8479e37h8ruk4z89s78.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%2Fj8479e37h8ruk4z89s78.png" alt=" " width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Synchronous JS
&lt;/h3&gt;

&lt;p&gt;As far as I know, JS is one of those technologies that stands out from the rest that is in the industry. Far more, I am not speaking about performance, optimization, and things so on.&lt;/p&gt;

&lt;p&gt;JS in Node is an asynchronous programming language.&lt;br&gt;
This might be pretty confusing. While JavaScript runs on a single thread, Node.js introduced a powerful way to handle non-blocking operations. This means, even though only one operation can run on the main thread, time-consuming tasks like reading files or hitting APIs don’t halt the execution of other code.&lt;/p&gt;

&lt;p&gt;To put it in simple words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;JavaScript is a &lt;strong&gt;single threaded&lt;/strong&gt; language, which means it has a one call stack and memory heap, that simply executes the code in the order it is written. It must finish executing a piece of code before it moves to the next.&lt;/p&gt;

&lt;p&gt;This is the synchronous behavior of JS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whoa! You might wonder, then, why the title &lt;strong&gt;&lt;em&gt;Async Programming&lt;/em&gt;&lt;/strong&gt;, and what on Earth does &lt;strong&gt;&lt;em&gt;Async Programming have to do with JavaScript&lt;/em&gt;&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;For this, we should thank Ryan Dahl, the mastermind and also criminal behind one of the most dominant, powerful runtime environments, Node.js.&lt;br&gt;
Node.js was an environment that enabled Asynchronism in JavaScript.&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%2Fex1aqqwet1fy4b2ym7lk.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%2Fex1aqqwet1fy4b2ym7lk.png" alt=" " width="500" height="403"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Asynchronism with JS
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Asynchronism in JavaScript, or now on, let’s say Node.js, runs in a single process, without creating another thread.&lt;br&gt;
This simply means that, unlike other languages like Java, Python, which block their thread for I/O ( What this means is, when we have to do an API call, accessing the database, or reading text files, so on), will pause the runtime until this process is completed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Node.js, it is contrary to the above situation. Node.js uses something referred to as &lt;strong&gt;&lt;em&gt;Callbacks&lt;/em&gt;&lt;/strong&gt;. The Node.js Event Loop orchestrates async tasks without blocking the main thread.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Simple real life scenario, let us say,&lt;br&gt;
You are cooking and have to wash clothes as well. You put the clothes into the washing machine for a wash, and resume back to cooking. Once the washing is done, you can get back to it.&lt;br&gt;
Washing clothes did not stop you from cooking? Did it?&lt;br&gt;
The same principle applies here as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I suppose this gives you a basic ideology behind &lt;strong&gt;&lt;em&gt;What&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;How&lt;/em&gt;&lt;/strong&gt; of Async Programming, and now let us dive into something deeper, What and How of Async Programming in Node.js.&lt;/p&gt;
&lt;h3&gt;
  
  
  Async Programming in Node.js
&lt;/h3&gt;

&lt;p&gt;In Node.js, functions that perform asynchronous operations, on completing the execution of the asynchronous task, they return control and push onto a stack known to us as a callback.&lt;/p&gt;
&lt;h4&gt;
  
  
  Callback
&lt;/h4&gt;

&lt;p&gt;This is how I initially understood that the way Node.js works using a callback.&lt;/p&gt;

&lt;p&gt;For instance:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserById&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="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&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="nx"&gt;err&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="nx"&gt;err&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nl"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="nx"&gt;World&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;id&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Lee&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above function runs, and once it's complete, the result is made available within the callback function.&lt;/p&gt;

&lt;p&gt;In Node.js, for it to know that a function has some asynchronous operation, i.e., returns some data or throws some error, it points to a function that will be executed once the asynchronous operation is done.&lt;/p&gt;

&lt;p&gt;This function, which deals with the returned value/throws an error, is called a Callback function.&lt;/p&gt;

&lt;p&gt;Meanwhile, Node.js ensures it continues with the normal execution of the code, just as in the above example, where &lt;code&gt;console.log()&lt;/code&gt; did not wait for the complete execution of the &lt;code&gt;getUserById()&lt;/code&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%2Fhwgxreoyuwvz7mo2wg5w.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%2Fhwgxreoyuwvz7mo2wg5w.png" alt=" " width="413" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Callback hell, the vexation
&lt;/h3&gt;

&lt;p&gt;As time passed, I found it quite frustrating to deal with these Callback functions.&lt;/p&gt;

&lt;p&gt;The first problem is variable scope, and the second is dealing with too many callbacks to access the results of the callback function, as we cannot return the resultant value from the callback.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserById&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;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulate async behavior&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
     &lt;span class="na"&gt;id&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
     &lt;span class="na"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iam@you.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;getUserById&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="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 3&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// 1&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;

&lt;span class="c1"&gt;// 1,2,3 being order execution&lt;/span&gt;
&lt;span class="nl"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="nx"&gt;World&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;id&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Lee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;you&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only way to access or do anything with the result was to operate inside the callback.&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserById&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;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulate async DB fetch&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="na"&gt;id&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iam@you.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulate async email sending&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email sent successfully to &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Call the function&lt;/span&gt;
&lt;span class="nf"&gt;getUserById&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="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;emailResult&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailResult&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "Email sent successfully to iam@you.com"&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 caused me a lot of confusion with naming a variable, accessing the variable. All in the flow of the code and function calls. This is where I realized I was dealing with something called &lt;strong&gt;&lt;em&gt;CALLBACK HELL&lt;/em&gt;&lt;/strong&gt; because of its confusing paradigm view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heartily thankful to StackOverflow.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Promises
&lt;/h3&gt;

&lt;p&gt;As I struggled with nested callbacks, I stumbled upon a concept that served as a solution to my problem of Callback Hell; something called &lt;strong&gt;&lt;em&gt;Promises&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;&lt;em&gt;Promise&lt;/em&gt;&lt;/strong&gt; is an object that encapsulates an asynchronous operation and on completion of the execution. It is a proxy for a value not known when the asynchronous code starts executing.&lt;/p&gt;

&lt;p&gt;In simpler terms, it's a placeholder for a value that will be available in the future, once the async task is done.&lt;/p&gt;

&lt;p&gt;Sounds very similar to Callback?&lt;br&gt;
It is quite similar to Callback design but was less sophisticated in terms of readability of the code, variable scope, and variable hoisting.&lt;/p&gt;

&lt;p&gt;Instead of giving a callback function to deal with the asynchronous function, the Promises API provides its own methods called “.then” and “.catch”, which basically execute based on functional chaining, as given below.&lt;br&gt;
The same example, in terms of promises;&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserById&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;id&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;someone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;someone@everyone@email.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
      &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&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;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Email sent successfully to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&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="nf"&gt;getUserById&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;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;result&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email to be sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// return promise&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userEmail&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailStatus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// waits until sendEmail is resolved&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailStatus&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;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;Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;


&lt;span class="nl"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="nx"&gt;World&lt;/span&gt;
&lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nl"&gt;id&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;someone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;someone&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;everyone&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;be&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks basically more organized than the way Callback looked and the way the code structure seemed in the callback functions.&lt;/p&gt;

&lt;p&gt;This paradigm, too, had issues. This dealt with firstly what I call &lt;strong&gt;Promise Hell&lt;/strong&gt; when you need to keep passing the resultant to many 'then' functions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Another major setback was the scope again. Data flow can be passed/ returned from one then() to another then(), but they were not available outside for processing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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%2Fj3uh0losid7iwsrwdhiv.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%2Fj3uh0losid7iwsrwdhiv.png" alt=" " width="259" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This became a very major issue when I had to deal with several complex API's and that's when again I came across the solution, again in the StackOverflow, which was something called &lt;strong&gt;&lt;em&gt;Async/Await&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Async/Await
&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%2F457s0isk9fdolcri1h8e.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%2F457s0isk9fdolcri1h8e.png" alt=" " width="800" height="974"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a step forward for me, to write several logics simplified and sorted.&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%2Fzef9v7hlz46vkj7aj2id.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%2Fzef9v7hlz46vkj7aj2id.png" alt=" " width="500" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a JavaScript date has gone bad, "Don't call me, I'll callback you. I promise!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turned out to be the ultimate solution for several problems I had been facing during the development.&lt;/p&gt;

&lt;p&gt;Async/Await is one best way to make asynchronous Node.js operate more imperatively.&lt;/p&gt;

&lt;p&gt;This was one such pattern, where asynchronous operations were handled much more simplified way.&lt;br&gt;
It brings in two keywords into the picture;&lt;br&gt;
"&lt;strong&gt;async&lt;/strong&gt;" and "&lt;strong&gt;await&lt;/strong&gt;", where async is for declaring a function that will be dealing with some asynchronous operations and await is used to declare inside the "&lt;strong&gt;async&lt;/strong&gt;" function that it shall "&lt;strong&gt;await&lt;/strong&gt;" for the result of the asynchronous operation.&lt;/p&gt;

&lt;p&gt;Simple Example with the above code:&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;someFunction&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&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;await&lt;/span&gt; &lt;span class="nf"&gt;getUserById&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email to be sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&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="nx"&gt;userEmail&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email sent&lt;/span&gt;&lt;span class="dl"&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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="nx"&gt;error&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="nl"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; 
 &lt;span class="na"&gt;id&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;someone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
 &lt;span class="na"&gt;userEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;someone&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;everyone&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;be&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="nx"&gt;World&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above instance, isn't the code more readable? The code is neatly structured and also makes sense with the flow and how it executes. Async/Await makes the code look more like a synchronous code format.&lt;/p&gt;

&lt;p&gt;One major thing to be considered in async/await way of handling asynchronous operation is that a function call can &lt;strong&gt;await&lt;/strong&gt; only its "&lt;em&gt;awaitable&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Awaitable, meaning a function that returns a Promise Object or if its function carrying some asynchronous operation.&lt;/p&gt;

&lt;p&gt;This was my journey of learning Asynchronous programming with Node.js.&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%2Frgo50pg07zvmjiabhwza.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%2Frgo50pg07zvmjiabhwza.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;From my point of view, I believe Callbacks are one of the worst ways to code and deal with asynchronous operations, given that at any point in time. But the Promise method of dealing with asynchronous programming overcomes with Callback Hell issue. But definitely see that the Promises methodology of dealing with async operations has its own perks in different cases. Async/Await might seem the best solution to be as of now. But don't limit yourself to these. Explore and use each of them based on the optimal use cases that you are dealing with.&lt;/p&gt;

&lt;p&gt;Thanks for reading. Signing off, until next time.&lt;/p&gt;

&lt;p&gt;Happy Learning.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Interesting read!! ⭐</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Mon, 14 Jul 2025 08:12:54 +0000</pubDate>
      <link>https://dev.to/zhravan/interesting-read-8bp</link>
      <guid>https://dev.to/zhravan/interesting-read-8bp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/raghavyuva/how-jkyll-almost-killed-our-vitepress-docs-3ph8" class="crayons-story__hidden-navigation-link"&gt;How Jekyll almost killed our vitepress docs&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/raghavyuva" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3094143%2Fbcd6301c-c3e4-4daa-ad83-ec6b9a5ce8d6.jpeg" alt="raghavyuva profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/raghavyuva" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Raghav
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Raghav
                
              
              &lt;div id="story-author-preview-content-2683884" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/raghavyuva" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3094143%2Fbcd6301c-c3e4-4daa-ad83-ec6b9a5ce8d6.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Raghav&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/raghavyuva/how-jkyll-almost-killed-our-vitepress-docs-3ph8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 13 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/raghavyuva/how-jkyll-almost-killed-our-vitepress-docs-3ph8" id="article-link-2683884"&gt;
          How Jekyll almost killed our vitepress docs
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/raghavyuva/how-jkyll-almost-killed-our-vitepress-docs-3ph8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/raghavyuva/how-jkyll-almost-killed-our-vitepress-docs-3ph8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>jekyll</category>
      <category>vite</category>
      <category>documentation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>VPS Management made easy with Nixopus</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Wed, 09 Jul 2025 05:01:45 +0000</pubDate>
      <link>https://dev.to/zhravan/vps-management-made-easy-with-nixopus-1fop</link>
      <guid>https://dev.to/zhravan/vps-management-made-easy-with-nixopus-1fop</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-story__hidden-navigation-link"&gt;Nixopus: Simplifying VPS Management&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/nixopus"&gt;
            &lt;img alt="Nixopus logo" 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%2Forganization%2Fprofile_image%2F11732%2F077d9019-9f24-4ce0-b028-d1847c6b8273.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/zhravan" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" alt="zhravan profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/zhravan" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Shravan Kumar B
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Shravan Kumar B
                
              
              &lt;div id="story-author-preview-content-2618414" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/zhravan" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Shravan Kumar B&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/nixopus" class="crayons-story__secondary fw-medium"&gt;Nixopus&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" id="article-link-2618414"&gt;
          Nixopus: Simplifying VPS Management
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/selfhosting"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;selfhosting&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;60&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              9&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devops</category>
      <category>beginners</category>
      <category>selfhosting</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Self Hosting Management made easy!!!</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Tue, 08 Jul 2025 09:13:14 +0000</pubDate>
      <link>https://dev.to/zhravan/self-hosting-management-made-easy-2b1b</link>
      <guid>https://dev.to/zhravan/self-hosting-management-made-easy-2b1b</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-story__hidden-navigation-link"&gt;Nixopus: Simplifying VPS Management&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/nixopus"&gt;
            &lt;img alt="Nixopus logo" 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%2Forganization%2Fprofile_image%2F11732%2F077d9019-9f24-4ce0-b028-d1847c6b8273.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/zhravan" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" alt="zhravan profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/zhravan" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Shravan Kumar B
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Shravan Kumar B
                
              
              &lt;div id="story-author-preview-content-2618414" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/zhravan" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F334128%2F9a59ff39-b737-4241-9bfa-43e36d994e55.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Shravan Kumar B&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/nixopus" class="crayons-story__secondary fw-medium"&gt;Nixopus&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" id="article-link-2618414"&gt;
          Nixopus: Simplifying VPS Management
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/selfhosting"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;selfhosting&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;60&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              9&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devops</category>
      <category>beginners</category>
      <category>selfhosting</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Inside Nixopus: How We Manage Our Database Migrations?</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Fri, 27 Jun 2025 13:44:31 +0000</pubDate>
      <link>https://dev.to/nixopus/inside-nixopus-how-we-manage-our-database-migrations-3i34</link>
      <guid>https://dev.to/nixopus/inside-nixopus-how-we-manage-our-database-migrations-3i34</guid>
      <description>&lt;p&gt;This article mainly focuses on laying out our foundational approach to setting up the &lt;a href="https://github.com/raghavyuva/nixopus/" rel="noopener noreferrer"&gt;database migration system for Nixopus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Database migrations&lt;/em&gt;&lt;/strong&gt; are often the unsung heroes of software application development. They work silently in the background, ensuring that your database schema evolves safely alongside your application code. Yet for many teams, this is a major source of stress and uncertainty. In this blog, we will explore how we have set up the migration framework for Nixopus. This has become a pivotal step in our developmental and self-host workflow.&lt;/p&gt;

&lt;p&gt;To start with, let us first explore and understand what we mean by &lt;strong&gt;&lt;em&gt;database migration&lt;/em&gt;&lt;/strong&gt;. As we always do, let us take an analogy.&lt;/p&gt;

&lt;p&gt;We often use different database systems like MySQL, PostgreSQL, MongoDB, etc, for data persistence. These data are stored in the form of Tables having columns and rows.&lt;/p&gt;

&lt;p&gt;As the application grows, the number of tables grows, and the data defined at each table might vary and change; hence, it is very important to keep track of these changes.&lt;/p&gt;

&lt;p&gt;Tables are at the database system level, whereas at the programmatic level, we maintain them with something called &lt;strong&gt;&lt;em&gt;schemas&lt;/em&gt;&lt;/strong&gt;. Like a house blueprint that dictates where rooms, doors, and wiring go, a schema simply defines how the data is organized and connected.&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%2Fhumm2q3dkpxw5zv5180m.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%2Fhumm2q3dkpxw5zv5180m.png" alt="schema-vs-tables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's imagine that you decide to change the blueprint mid-build, to add a new room or window, you need to carefully make changes to the existing blueprint such that you don’t end up collapsing the walls down.&lt;/p&gt;

&lt;p&gt;This problem is addressed at the schema level to ensure the changes in the existing tables, which may be in the form of adding new columns, altering the type of existing columns, or adding new tables, are handled through what we call &lt;strong&gt;&lt;em&gt;Database Migrations&lt;/em&gt;&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%2Fx9pm6demw0q72mcmykqc.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%2Fx9pm6demw0q72mcmykqc.png" alt="data-migration-meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we started building Nixopus, we quickly realized that database schema management would be critical to our success in self-hosting and local development setups. We planned with an expectation set that eventually we would see multiple developers working on different features, frequent deployments, and the need to support both development and production environments, which would require a very streamlined process to handle database migration.&lt;/p&gt;

&lt;p&gt;We had aligned on the following factors that our migration system would have to adhere to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Reliability&lt;/em&gt;&lt;/strong&gt;: Migrations must execute consistently across all envs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic&lt;/strong&gt;: No manual intervention should be required during deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forward &amp;amp; Backward Compatible&lt;/strong&gt;: Ensure easy rollback scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separations of Concerns&lt;/strong&gt;: Organization of migrations by domain or feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many existing tools either lacked the flexibility we needed or came with unnecessary complexity, be it in terms of testability or adding rollbacks in case of errors, etc.&lt;/p&gt;

&lt;p&gt;Hence, we decided to build our migration system tailored to our needs and requirements using a tool called &lt;a href="https://bun.uptrace.dev/guide/migrations.html" rel="noopener noreferrer"&gt;Bun ORM&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%2Ficreopncr72qkqyyq2se.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%2Ficreopncr72qkqyyq2se.png" alt="sql-vs-orm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To those who are not aware of the terminology ORM, let me give a glimpse of it; ORM, otherwise called as &lt;strong&gt;&lt;em&gt;Object Relational Mapper&lt;/em&gt;&lt;/strong&gt;, is like a waiter at a restaurant, to who you tell what you want, he/she goes to kitchen(I mean database), then brings back your order(data) as perfectly plated objects in ready to use form.&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%2F605ksjoeg5exjzcot4vv.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%2F605ksjoeg5exjzcot4vv.png" alt="who-orm-who-orm-bun-orm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without ORM, you would have been presented with raw vegetables and ingredients straight from the kitchen (of course, by that I mean the database), and you would have to do all the cooking yourself, which means writing and managing every query and data transformation.&lt;/p&gt;

&lt;p&gt;Coming back, we have built our migration system around a simple yet &lt;strong&gt;powerful concept&lt;/strong&gt;, where a pair of SQL files represents every database change:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Applying the change (up migrations)&lt;/strong&gt;&lt;br&gt;
2) &lt;strong&gt;Rolling it back (down migrations)&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%2Fnu808jb4jnzs8vl5c5ko.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%2Fnu808jb4jnzs8vl5c5ko.png" alt="migration-code-structure-flow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach has helped our system to easily take care of schema evolution and database versioning.&lt;/p&gt;

&lt;p&gt;The migration system follows a defined life cycle:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Discovery&lt;/strong&gt;: The system scans the &lt;code&gt;api/migrations&lt;/code&gt; directory&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Parsing&lt;/strong&gt;: Migration files are parsed and paired (up/down migrations)&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Ordering&lt;/strong&gt;: Migrations are sorted by their numeric IDs&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;State Check&lt;/strong&gt;: The system compares file system migrations with applied migrations in the database&lt;/p&gt;

&lt;p&gt;5) &lt;strong&gt;Execution&lt;/strong&gt;: Pending migrations are executed in transactions&lt;/p&gt;

&lt;p&gt;6) &lt;strong&gt;Recordings&lt;/strong&gt;: Successfully applied migrations are recorded in the migration table&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%2Fej1w31t3m718xo63qfyo.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%2Fej1w31t3m718xo63qfyo.png" alt="migration-system-lifecycle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that you know an overview of our setup and how it works, you might wonder what actually sets our approach apart? Fair enough!!!!&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%2Fwnoxp32ng9v8t7ajwhip.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%2Fwnoxp32ng9v8t7ajwhip.png" alt="migration-differentiator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;&lt;em&gt;Domain Driven Structure&lt;/em&gt;&lt;/strong&gt;: Instead of throwing all migrations into a single directory, we have organized them by domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/migrations/
├── applications/   # App deployment features
├── audit/          # Audit logging and compliance
├── auth/           # Authentication &amp;amp; authorization
├── containers/     # Container management
├── domains/        # Domain and DNS management
├── feature-flags/  # Feature toggle system
├── integrations/   # Third-party integrations
├── notifications/  # Notification system
├── organizations/  # Multi-tenancy &amp;amp; organizations
├── rbac/           # Role-based access control
└── users/          # User management and profiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This structure makes it easy for us to find and create migrations related to specific work or flow, helping us avoid confusion or conflicts.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Automatic migration execution on application startup&lt;/strong&gt;: One of the key design decisions was to make migrations completely automatic. When the application starts, the migration system runs before any other initialization. This approach eliminated the need for separate deployment and ensures that the database schema is always up to date when the application starts.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Atomic, Transactional Migrations&lt;/strong&gt;: Every migration runs inside a database transaction, ensuring atomicity. If any part of a migration fails, the entire migration is rolled back, ensuring that the schema remains fully consistent.&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;&lt;em&gt;Bidirectional Migrations&lt;/em&gt;&lt;/strong&gt;: Every migrations have 2 files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;seqno_entity_up.sql&lt;/code&gt; (applies the change)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seqno_entity_down.sql&lt;/code&gt; (rolls back the change)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that we can always roll back changes if something goes wrong.&lt;/p&gt;

&lt;p&gt;As we are close to concluding the deep dive into the first of many articles of the &lt;strong&gt;&lt;em&gt;Inside Nixopus&lt;/em&gt;&lt;/strong&gt; series, I would like to highlight some of the major learnings and key takeaways:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Keep each migration small and focused&lt;/strong&gt;for easier review or rollback.&lt;br&gt;
2) Ensure to keep a &lt;em&gt;&lt;strong&gt;down migration&lt;/strong&gt; for every &lt;strong&gt;up migration&lt;/strong&gt;&lt;/em&gt;, ensuring roll backs are easy.&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%2Fcz9ijjmrruycdzpx65cn.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%2Fcz9ijjmrruycdzpx65cn.png" alt="key-learning-takeaways-nixopus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key insight is that sometimes the best tool is the one you build yourself. By understanding our specific needs and constraints, we were able to set up our migration system that fits perfectly into our development workflow and easy self-hosting.&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%2F66k8t8vncrm2g0vzpkym.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%2F66k8t8vncrm2g0vzpkym.png" alt="nixopus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project, as we publish this article, is in the Alpha stage. &lt;/p&gt;

&lt;p&gt;You can check it out on &lt;a href="https://github.com/raghavyuva/nixopus" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and see for yourself.&lt;/p&gt;

&lt;p&gt;To sum it up, the approach helped us change schema changes from a headache to a reliable process.&lt;/p&gt;

&lt;p&gt;If you would like to get involved or have questions, join our Discord community for real-time support and feedback. You can self-host Nixopus today, subscribe for updates, and stay tuned as we roll out new features and stability enhancements.&lt;/p&gt;

&lt;p&gt;
        &lt;a href="https://discord.gg/skdcq39Wpv" rel="noopener noreferrer"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F31022056%2F158916278-4504b838-7ecb-4ab9-a900-7dc002aade78.png" alt="Join our Discord Community" width="200"&gt;
        &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;We have recently collaborated with &lt;strong&gt;&lt;em&gt;HostUp&lt;/em&gt;&lt;/strong&gt;, a reliable VPS provider based in Sweden, to bring you an exclusive deal of &lt;strong&gt;&lt;em&gt;10% off&lt;/em&gt;&lt;/strong&gt; recurring on any VPS plan. Whether you choose to self-host Nixopus or deploy containerized apps, this is the perfect opportunity to secure rock-solid infrastructure at a &lt;a href="https://discord.com/invite/skdcq39Wpv" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hostup.se/en/vps/" rel="noopener noreferrer"&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%2Fitnnybtsdrgzmv5dj0lz.png" alt="partnership"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned for more freshly brewed content.&lt;/p&gt;

&lt;p&gt;That's all for now. Thank you for reading.&lt;/p&gt;

&lt;p&gt;Signing off until next time.&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/nixopus" rel="noopener noreferrer"&gt;
        nixopus
      &lt;/a&gt; / &lt;a href="https://github.com/nixopus/nixopus" rel="noopener noreferrer"&gt;
        nixopus
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open Source Alternative to vercel, heroku, netlify with simplified workflows
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;a href="https://nixopus.com" rel="nofollow noopener noreferrer"&gt;&lt;img width="1800" height="520" alt="Heading(4)" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F53376933%2F489183579-e103a9df-7abf-4f78-b75a-221331231247.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDk5ODEsIm5iZiI6MTc3NDY0OTY4MSwicGF0aCI6Ii81MzM3NjkzMy80ODkxODM1NzktZTEwM2E5ZGYtN2FiZi00Zjc4LWI3NWEtMjIxMzMxMjMxMjQ3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIyMTQ0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZhNWNjZDk4ZWUzMjg1Mjg0N2E3NDE1N2JlZWM5YWRiODBjMDFlZWJjZjhjMTk3Mzg1NjEzODAwNWNjMTgxZDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.wllWcFyhKI6-epgomUARL0MegOdLw4DOJfrpa-34GIQ"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;
 Open Source alternative to vercel, heroku, netlify with Terminal integration, and Self Hosting capabilities
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://nixopus.com" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Website&lt;/b&gt;&lt;/a&gt; •
  &lt;a href="https://docs.nixopus.com" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Documentation&lt;/b&gt;&lt;/a&gt; •
  &lt;a href="https://nixopus.com/blog" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Blog&lt;/b&gt;&lt;/a&gt; •
  &lt;a href="https://discord.gg/skdcq39Wpv" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Discord&lt;/b&gt;&lt;/a&gt; •
  &lt;a href="https://github.com/nixopus/nixopus/discussions/262" rel="noopener noreferrer"&gt;&lt;b&gt;Roadmap&lt;/b&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;p&gt;
 &lt;a href="https://trendshift.io/repositories/15336" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b1e517a10005ef87f5f3e79c6bff19c1231008ede15755cf0ae5b59cc68544ec/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7265706f7369746f726965732f3135333336" alt="nixopus/nixopus | Trendshift" width="250" height="55"&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/nixopus/nixopus/assets/nixopus_dashboard.jpeg"&gt;&lt;img width="1210" height="764" alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnixopus%2Fnixopus%2Fassets%2Fnixopus_dashboard.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important Note&lt;/strong&gt;: Nixopus is currently in alpha/pre-release stage and is not yet ready for production use. While you're welcome to try it out, we recommend waiting for the beta or stable release before using it in production environments. The platform is still undergoing testing and development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Features&lt;/h1&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploy apps with one click.&lt;/strong&gt; No config files, no SSH commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage files in your browser.&lt;/strong&gt; Drag, drop, edit. Like any file manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in terminal.&lt;/strong&gt; Access your server without leaving the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time monitoring.&lt;/strong&gt; See CPU, RAM, disk usage at a glance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto SSL certificates.&lt;/strong&gt; Your domains get HTTPS automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub integration.&lt;/strong&gt; Push code → auto deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy management.&lt;/strong&gt; Route traffic with Caddy reverse proxy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart alerts.&lt;/strong&gt; Get notified via Slack, Discord, or email when something's wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nixopus/nixopus" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>go</category>
      <category>opensource</category>
      <category>database</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Nixopus: Simplifying VPS Management</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Mon, 23 Jun 2025 18:03:39 +0000</pubDate>
      <link>https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f</link>
      <guid>https://dev.to/nixopus/nixopus-simplifying-vps-management-4g0f</guid>
      <description>&lt;p&gt;This article is my reflection on the journey of how I relied on free tier clouds and platform specific hosting until I discovered VPS. &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%2F9h9rvhdq7040pvgrt9mk.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%2F9h9rvhdq7040pvgrt9mk.png" alt="my journey from using cloud setup to VPS" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shipping Code while Sipping Coffee&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back then, I was still trying to figure out and understand how all this worked. Starting from which command did what, which service refused to start, and why things that worked on my local; didn’t work when deployed (Thank God for Docker)&lt;/p&gt;

&lt;p&gt;I still recall one of my earliest deployment. It was &lt;a href="https://github.com/shravan20/github-readme-quotes" rel="noopener noreferrer"&gt;github-readme-quotes&lt;/a&gt; app on Heroku. A simple git push to deploy felt magical. I didn’t really have to care how it worked. I just knew that if I followed the documentation devoutly, it was assured to work; if not, StackOverflow always had my back.&lt;/p&gt;

&lt;p&gt;This was the same with Firebase, Render, or Netlify for static stuff. All of them taught me how to ship quickly. &lt;/p&gt;

&lt;p&gt;But then came the real world; need to host private apps, things that need ports, memory tuning, background workers, cron jobs, etc. Soon, those magical platforms started speaking back and complaining to me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"You can’t bind that port"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"You’re out of free dynos"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"Exceed dynos quota for the month"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found myself stuck on an architectural impasse till the day when one of the engineers I know suggested saying these lines, “Just spin up a VPS“. That advice removed the roadblock.&lt;/p&gt;

&lt;p&gt;To those who are not aware of what is &lt;strong&gt;&lt;em&gt;VPS&lt;/em&gt;&lt;/strong&gt;? How is it different from Server? Let me try to explain it with an analogy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine you’ve built a website and now you want to make it public, so you need to host it. Basically put it out on a computer that is always online. This is called hosting.&lt;/p&gt;
&lt;/blockquote&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%2F2j7ke33delch7jw8wo9x.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%2F2j7ke33delch7jw8wo9x.png" alt="How to Hosting your site" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before hosting a website, there are 3 types of hosting, each of which balances cost, control, and performance in its own way. Let us take an analogy of hosting with where we live:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Shared Hosting&lt;/em&gt;&lt;/strong&gt; is like renting a room in PG, which is extremely affordable, but you share your resources with others and have very little control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Virtual Private Server&lt;/em&gt;&lt;/strong&gt; (aka VPS) is like having your own apartment, you get private space, you are secure, decorate and customize as you want, and truly call your own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dedicated Server&lt;/em&gt;&lt;/strong&gt; is like leasing an entire bungalow; you alone enjoy all its resources and full autonomy at a very high price.&lt;/p&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%2F78id0zjgbqfldv4sejxw.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%2F78id0zjgbqfldv4sejxw.png" alt="understanding VPS" width="800" height="784"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dedicated Servers&lt;/strong&gt; are either some crazy big computers in freezing cold data centers or virtual computers carved out of bigger machines using virtualization.&lt;/p&gt;

&lt;p&gt;So, yep, VPS was that sweet middle ground; cost of a simple 1 BHK flat with freedom to knock down a wall (just kidding). So that balance I needed came in the form of VPS.&lt;/p&gt;

&lt;p&gt;So I picked a VPS provider, bought a VPS server for 7€ (~₹697). I got an IP address, username(root), and SSH details. &lt;/p&gt;

&lt;p&gt;Till then, I had learnt what VPS was and lil about behind the scenes from the few Google searches  I had done. I understood that a VPS is a virtual machine running on a larger physical server with its own dedicated RAM, disk space, and CPU. And fortunately, since I was already comfortable with Linux commands, so felt navigating this environment shouldn’t be a problem.&lt;/p&gt;

&lt;p&gt;Since I had previously tinkered quite a lot with Raspberry Pi, by hooking it to the local network and SSH’ing into it from my laptop, I already knew that the only way to connect to my VPS was using SSH.&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%2F3pc43sa7g5oxh8ghng7y.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%2F3pc43sa7g5oxh8ghng7y.png" alt=" " width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To those who do not know what SSH means, let us again explore it with an analogy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;SSH is like a passport to access your VPS&lt;/em&gt;&lt;/strong&gt;. With SSH, you can remotely step inside your VPS like teleporting into a distant terminal. It was like I’d opened the door to another computer without leaving mine. There is no UI, browser, but a simple terminal access for your VPS and raw power.&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%2Fcd849rottalq04z538aw.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%2Fcd849rottalq04z538aw.png" alt="just linux haha" width="559" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every server I touched so far ran Linux, so I already had a clear cut understanding. So for everything looked good.&lt;/p&gt;

&lt;p&gt;I started slowly moving my apps to the VPS, and running the scripts to have it run on the VPS. I ran into another hurdle; I was only able to access the deployed applications or services using their IP address, like &lt;code&gt;http://123.45.67.89&lt;/code&gt;. Unlike Heroku or Netlify, which provided me ready made subdomain for a project like [&lt;code&gt;github-readme-quotes.herokuapp.com&lt;/code&gt;], my move to a VPS setup left me staring at a bare IP address.&lt;/p&gt;

&lt;p&gt;I knew I needed a proper name and URL, &lt;code&gt;some-project.com&lt;/code&gt;, and that’s where DNS comes in. &lt;/p&gt;

&lt;p&gt;To those who do not know what &lt;strong&gt;DNS&lt;/strong&gt; is, consider it as a &lt;strong&gt;Internet’s Yellow Page (Phonebook)&lt;/strong&gt;; basically translates domain names to IP addresses. &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%2Fh16osgkfsihc61kau7nj.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%2Fh16osgkfsihc61kau7nj.png" alt="yellow-page" width="768" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lot of them still find tying a domain to a VPS surprisingly tricky. Hence, I keep a simple recipe:&lt;/p&gt;

&lt;p&gt;1) You buy a domain from Domain Registrar&lt;br&gt;
2) Point it to your VPS IP using A records in your registrar’s control panel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: A  
Host: @  
Value: 123.45.67.89
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Set up Nginx&lt;br&gt;
4) Configure SSL&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%2F39wnt05pkg4pq4veabaw.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%2F39wnt05pkg4pq4veabaw.png" alt=" " width="800" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might be wondering, what are these Nginx and SSL? Let us understand this better, diving a little deeper into the concepts.&lt;/p&gt;

&lt;p&gt;Every service on your server or computer communicates over a specific port; some of them are already predefined, say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SSH&lt;/code&gt; on port &lt;code&gt;22&lt;/code&gt; for remote access&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HTTP&lt;/code&gt; on port &lt;code&gt;80&lt;/code&gt; for unencrypted web traffic&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HTTPS&lt;/code&gt; on port &lt;code&gt;443&lt;/code&gt; for encrypter web traffic via SSL/TLS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By now, you must have understood that SSL/TLS is what turns ordinary HTTP into secure HTTPS, making sure that the data between user and server stays private and secure.&lt;/p&gt;

&lt;p&gt;Nginx is the traffic police on my VPS which is mainly responsible for forwarding user requests to respective applications, handling SSL encryption, and serving the static contents.&lt;/p&gt;

&lt;p&gt;You must be wondering, &lt;strong&gt;&lt;em&gt;"Voila, Great, now that everything is in place, and the hard part is over, life must be easier"&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hahaha!! Well, thats exactly when the real problems began. Over time, deployments process became a familiar and routine; rather painful routing I would say.&lt;/p&gt;

&lt;p&gt;This routing masked a lot of headaches: broken configs, panicky Nginx configuration tweaks, dread thought of “Did I actually run the right script?“ and manual responsibility of deploying all of these without any automations and verifying the releases.&lt;/p&gt;

&lt;p&gt;Eventually, I scripted it all, but I can never forget those initial days of manual, shaky deployments. They taught me the cost of carelessness, where I had spent a day to find one config misplaced. It wasn’t about skill, but rather about mental tax caused due to this.&lt;/p&gt;

&lt;p&gt;By then, I had realised managing multiple applications on a single VPS only made things worse, where I had to juggle and handle process monitoring, checking the logs, and mainly running update scripts.&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%2Fdj6vony210gqg82f3sey.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%2Fdj6vony210gqg82f3sey.png" alt="VPS monitoring" width="578" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With power comes great responsibility&lt;/p&gt;
&lt;/blockquote&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%2Fm7hqma5tahj5zzo2eigy.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%2Fm7hqma5tahj5zzo2eigy.png" alt="on a lighter note" width="600" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With experience comes great clarity; I started seeing patterns in the process I followed. I’ve been doing this for a while now, everytime I spun up a VPS or deploy new project on a VPS, I found myself re-Googling the same 20 commands. I observed that across some major pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy-pasting Identical configurations&lt;/li&gt;
&lt;li&gt;Deployment failures&lt;/li&gt;
&lt;li&gt;DNS setups&lt;/li&gt;
&lt;li&gt;Setting up Firewall rules&lt;/li&gt;
&lt;li&gt;Forgetting about SSL renewals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was the same story day in and day out. That is when I asked myself, is this problem not actually solved and standardized yet? Do we not have a tool that streamlines and simplifies the VPS management?&lt;/p&gt;

&lt;p&gt;My search led me to Nixopus, an indie tool built by a community led by Raghav to tackle these exact frustrations. As we talked, it became clear that Nixopus wasn’t born from ambition rather from fatigue, the kind that drives you to refactor your life. It promised everything I had been hunting for.&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%2Fois17ln8re3q31a9gekb.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%2Fois17ln8re3q31a9gekb.png" alt="VPS Management SOlution" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Though in Alpha stage, I’ve started using it for managing my VPS and even actively contributing to improvements whenever I can. I am convinced that this project has a bright future. You check it out on &lt;a href="https://github.com/raghavyuva/nixopus" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and see for yourself.&lt;/p&gt;

&lt;p&gt;If you would like to get involved or have questions, join our Discord community for real-time support and feedback. You can self-host Nixopus today, subscribe for updates, and stay tuned as we roll out new features and stability enhancements.&lt;/p&gt;

&lt;p&gt;We have recently collaborated with HostUp, a reliable VPS provider based in Sweden, to bring you an exclusive deal of 10% off recurring on any VPS plan. Whether you choose to self-host Nixopus or deploy containerized apps, this is the perfect opportunity to secure rock-solid infrastructure at a &lt;a href="https://discord.com/invite/skdcq39Wpv" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hostup.se/en/vps/" rel="noopener noreferrer"&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%2Fitnnybtsdrgzmv5dj0lz.png" alt="partnership" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can claim your VPS coupon and start building with Nixopus today.&lt;/p&gt;

&lt;p&gt;Join our &lt;a href="https://discord.com/invite/skdcq39Wpv" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; community, you’re always welcome to hop in for community support!&lt;/p&gt;

&lt;p&gt;Summing it up, my journey from building on free-tier clouds and shared hosting to fully embracing VPS has taught me one thing is that having control doesn't have to mean endless repetitive manual work and management. Nixopus bridges that gap, so that from now on you can focus on what really matters.&lt;/p&gt;

&lt;p&gt;Stay tuned for more freshly brewed content. &lt;/p&gt;

&lt;p&gt;That’s all for now. Thank you for reading.&lt;/p&gt;

&lt;p&gt;Signing off until next time.&lt;/p&gt;

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

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>selfhosting</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Neonode: Power Up Your Development with TypeScript &amp; Neon.tech</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Thu, 29 Aug 2024 13:34:10 +0000</pubDate>
      <link>https://dev.to/zhravan/neonode-power-up-your-development-with-typescript-neontech-25d8</link>
      <guid>https://dev.to/zhravan/neonode-power-up-your-development-with-typescript-neontech-25d8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/neon"&gt;Neon Open Source Starter Kit Challenge&lt;/a&gt;: Ultimate Starter Kit&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  My Kit
&lt;/h3&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;&lt;strong&gt;Neonode&lt;/strong&gt;&lt;/a&gt;, the Ultimate OSS TypeScript Starter Kit powered by &lt;a href="//neon.tech"&gt;neon.tech&lt;/a&gt; for Modern development.&lt;/p&gt;

&lt;p&gt;A boilerplate built crafted to TypeScript with Neon.tech's serverless PostgreSQL. &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt; is not just a boilerplate or starter kit; it's your launchpad for building amazing products.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt; is designed to let you focus on building your product while handling standardization and development efficiency out of the box. &lt;/p&gt;

&lt;p&gt;With &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt;, enjoy the amazing DX, where the essentials are taken care of out of the box, allowing you to innovate and create without getting bogged down by the usual setup hassles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt; brings you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seamless TypeScript Integration&lt;/li&gt;
&lt;li&gt;Serverless PostgreSQL Integration&lt;/li&gt;
&lt;li&gt;Best Practices Out of the Box&lt;/li&gt;
&lt;li&gt;Support Monolithic Architecture (ROADMAP)&lt;/li&gt;
&lt;li&gt;ORM Flexibility (ROADMAP)&lt;/li&gt;
&lt;li&gt;Server Framework Flexibility (ROADMAP)&lt;/li&gt;
&lt;li&gt;Integration with FOSS utility tools (ROADMAP)&lt;/li&gt;
&lt;li&gt;AI-based Automated Testing with Keploy (ROADMAP)&lt;/li&gt;
&lt;li&gt;Many more innovative ideas (ROADMAP)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Link to Kit
&lt;/h3&gt;

&lt;p&gt;Explore the &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt; starter kit on GitHub here: &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;neonode-oss-quick-starter&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%2Fz5x8tg8a00kczymxnfda.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%2Fz5x8tg8a00kczymxnfda.png" alt="Nodejs TypeScript OSS Starter Kit" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;From my experience working with various server technologies and frameworks, I find that the development ecosystem for Node.js and TypeScript is less streamlined compared to others.&lt;/p&gt;

&lt;p&gt;For instance, in my experience with frameworks like Spring and Spring Boot, I've enjoyed a mature ecosystem that offers a smooth development process with built-in conventions and extensive support. These frameworks simplify many aspects of application development, from dependency management to configuration. In contrast, TypeScript with Node.js typically requires more manual setup and configuration, which can be a shift from the streamlined experience offered by Java-based frameworks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;&lt;strong&gt;Neonode&lt;/strong&gt;&lt;/a&gt; was designed to bridge this gap and hence, chose this stack for its potential to simplify serverless architecture while leveraging TypeScript's modern capabilities with Neon.tech's serverless PostgreSQL.&lt;/p&gt;

&lt;p&gt;During this development of the project, faced few challenges with serverless setups and managing databases. &lt;/p&gt;

&lt;p&gt;I had to deal with the complexities of TypeScript's type system and Node.js's asynchronous nature, which are quite different from the more straightforward, convention-based style of Spring Boot. However, these challenges helped to improve, as we learned to refine the approach and make development more efficient.&lt;/p&gt;

&lt;p&gt;It's been a rewarding experience seeing how these tools can come together to create a seamless development and deployment environment.&lt;/p&gt;

&lt;p&gt;Each change was a step in creating a toolkit that addresses current demands while also setting the stage for future improvements and innovations.&lt;/p&gt;

&lt;p&gt;Reflecting on this experience, I believe Neonode goes beyond being just another starter kit or boilerplate.&lt;/p&gt;

&lt;p&gt;I'm excited to see how the developer community will use Neonode to innovate and create. I hope Neonode serves as a valuable asset for fellow developers, helping them to craft exceptional applications with less effort and greater impact.&lt;/p&gt;

&lt;p&gt;Cheers to pushing the boundaries of development and building solutions that drive the future.&lt;/p&gt;

&lt;p&gt;PS: On a fun note, give me a shout when you use &lt;a href="https://github.com/shravan20/neonode-oss-quick-starter" rel="noopener noreferrer"&gt;Neonode&lt;/a&gt; to bring your ideas to life 😛&lt;/p&gt;

&lt;p&gt;Signing off,&lt;br&gt;
&lt;a href="https://github.com/shravan20" rel="noopener noreferrer"&gt;Shravan Kumar B&lt;/a&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>neonchallenge</category>
      <category>postgres</category>
      <category>database</category>
    </item>
    <item>
      <title>Bit Wars: 32-bit vs 64-bit Systems Explained</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Fri, 21 Jun 2024 06:26:27 +0000</pubDate>
      <link>https://dev.to/zhravan/bit-wars-32-bit-vs-64-bit-systems-explained-511a</link>
      <guid>https://dev.to/zhravan/bit-wars-32-bit-vs-64-bit-systems-explained-511a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/cs"&gt;DEV Computer Science Challenge v24.06.12: One Byte Explainer&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explainer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A 64-bit system is like a highway, while a 32-bit system is like a bypass road. &lt;/p&gt;

&lt;p&gt;A 64-bit system allows more data to be transmitted simultaneously, resulting in improved overall speed and performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Additional Context
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A 64-bit system can handle more data at once than 32-bit, like using 64 fingers instead of 32, hence the analogy of a Highway with multiple lanes and Bypass road with 2 lanes.&lt;/p&gt;
&lt;/blockquote&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%2Fgo7yje8naozdtpkkvc10.jpg" 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%2Fgo7yje8naozdtpkkvc10.jpg" alt="analogy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cschallenge</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Must-follow Ethics behind Pragmatic Programmer</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Sat, 15 Jul 2023 08:00:48 +0000</pubDate>
      <link>https://dev.to/zhravan/must-follow-ethics-behind-pragmatic-programmer-3ipk</link>
      <guid>https://dev.to/zhravan/must-follow-ethics-behind-pragmatic-programmer-3ipk</guid>
      <description>&lt;p&gt;This article(&lt;em&gt;originally published on &lt;a href="https://shravan20.medium.com/must-follow-ethics-behind-pragmatic-programmer-df1afd63b92c" rel="noopener noreferrer"&gt;medium&lt;/a&gt;&lt;/em&gt;) speaks about the fundamental ethics that every programmer/developer must follow, so, as to be one of the elites and the best in the evolving Software and Technology Industry.&lt;/p&gt;

&lt;p&gt;Most developers fail to understand two things, firstly to understand&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What do people mean when they say &lt;strong&gt;Pragmatic&lt;/strong&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What does it take to become a programmer following &lt;strong&gt;Pragmatism&lt;/strong&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fp05tet8ud563ngzgfwt1.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%2Fp05tet8ud563ngzgfwt1.jpeg" alt="Derives from Latin /praɡˈmatɪk/ (adjective)" width="300" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the simplest words that I can put up, &lt;strong&gt;being&lt;/strong&gt; &lt;strong&gt;pragmatic&lt;/strong&gt; can be interpreted as “&lt;strong&gt;&lt;em&gt;Being Skilled in Craftsmanship&lt;/em&gt;&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%2Fw516nuaokt91kxkw0xtd.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%2Fw516nuaokt91kxkw0xtd.jpeg" alt="Pragmatism is about practicality" width="500" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pragmatic is all about practicality and being guided by “&lt;em&gt;the priority of action over doctrine and of experience over fixed principles&lt;/em&gt;”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  “ I am this person who values craftsmanship, not because the end is a result of beauty, but an investment for my future. ”
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Being pragmatic&lt;/em&gt;&lt;/strong&gt; is about being a better developer. It is less about skills and more about experience and practice. It takes a lot of practice and experience to evolve as a pragmatic developer.&lt;/p&gt;

&lt;p&gt;With every new experience, you take away something new that you learn, which definitely will connect to the dot as you move forward to face new challenges.&lt;/p&gt;

&lt;p&gt;A developer must understand that every software that you develop is a craft. Each person who involves in building that craft is equally responsible. In such a scenario, how do you think you can &lt;strong&gt;pragmatism&lt;/strong&gt; help?&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%2Fob2nncsw69r2pla5hc1d.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%2Fob2nncsw69r2pla5hc1d.gif" alt="Scenario: construction of a house" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For instance, consider a scenario of the construction of a house, in which various craftsmen have an important role to play. From Architect, Civil engineers to Painters, Laborers, all of them have their own skills that contribute to beautifying and completing the construction of the house.&lt;/p&gt;

&lt;p&gt;In the same context, when you are a part of a team that is building a product, your individual contribution plays a very vital role. Irrespective of whether you are part of the backend/frontend/DevOps team, it doesn’t matter. Your contribution is important, as you, on the whole, will be representing the team building the product, not just as an individual.&lt;/p&gt;

&lt;p&gt;As said, Pragmatism is more about how you can make a quality contribution to the team, not just as a developer but also as a team member.&lt;/p&gt;

&lt;p&gt;Wondering, what does it take to follow &lt;strong&gt;&lt;em&gt;pragmatism?&lt;/em&gt;&lt;/strong&gt; Let us figure out what distinguishes Pragmatic Programmers from the crowd.&lt;/p&gt;

&lt;h2&gt;
  
  
  Being Responsible
&lt;/h2&gt;

&lt;p&gt;In every project, there will definitely be problems. Problems are packed with every project you will be working on, despite taking every safety measure, i.e., cross verifying the Minutes of Meeting, documentation, testing, etc.&lt;/p&gt;

&lt;p&gt;Despite taking all the measures, the possibilities of deliveries being delayed or unforeseen technical problems may come up, which is unavoidable at times.&lt;/p&gt;

&lt;p&gt;Take responsibility and be accountable for your responsibility. Ensure you are communicating and keeping the team informed with all the updates.&lt;/p&gt;

&lt;p&gt;The smallest mistakes during the presentation of your product to the client can lead to catastrophic damage to the reputation of the company or firm that you are representing.&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%2Fupk6vqprogu9sptbu28v.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%2Fupk6vqprogu9sptbu28v.gif" alt="Communicate: Verify what you have understood" width="575" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Miscommunication or lack of communication can cause a lot of misleading in the team or within the project. When I was getting out of my Intern developer phase, we had to showcase our work to the client. The backend team had to make some changes on functionality at the last moment and had conveyed it to the mobile team but failed to inform it to the web team, expecting it would be conveyed. This ended up causing a lot of fuss.&lt;/p&gt;

&lt;p&gt;Ensure that everything is conveyed to the team properly and avoid miscommunication. If you or the team feel the product is not in the best shape for the presentation, make sure you ask for an extension by taking responsibility for what has happened and ensuring not to repeat it.&lt;/p&gt;

&lt;p&gt;If we can accept and be proud of our ability, we must accept and be honest about our shortcomings.&lt;/p&gt;

&lt;p&gt;Assuming a situation where you are not able to solve a problem due to the shortcoming of resources or any other issue, avoid presenting the problem/shortcoming you are facing for the given problem statement. Rather present the reasons why you cannot solve them and provide them with alternative solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Avoiding Tech Debts - Software Entropy&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you work in a team, you are a part of a group sailing in the same boat to build a product. A leak on a boat (similar to the wrong decision or code that you put in the codebase) can cause the boat to rot (technical debt) and sink, leading the boat to sink along with people in 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%2Fg6fsym67roe89uw27542.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%2Fg6fsym67roe89uw27542.jpeg" alt="Avoid blame game or safe game, be accountable" width="750" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is our responsibility to fix those leaks in the first place when we figured it. Do not leave such loopholes open even if the deadline is near. If it is not a serious one, add ToDo and fix it later.&lt;/p&gt;

&lt;p&gt;In one of the projects, I was working on, we initially did not structure the code when we had 2/3 services to deal with, due to time constraints. As we kept on building features on top of them, we ended up with 12 services and a whole codebase beyond repair and in the end, had to structure it in a single go which was such a pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Take the initiative, be the catalyst
&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%2Fcf3us6uiui9yr5b4mqgk.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%2Fcf3us6uiui9yr5b4mqgk.png" alt="Take responsibility to fix issues" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes it so happens that we see some dirty code. When it does happen, try to convey that to your team. If time constraint does not allow the team to work on it and fix it, the best you can do is flag it.&lt;br&gt;
In a situation when pieces of code are such that you have to fix it (severe bug), inform the team, take the initiative and responsibility of fixing the broken code and get it reviewed.&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%2Fo19hwocaljhmk7m9h4rp.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%2Fo19hwocaljhmk7m9h4rp.gif" alt="Gardening === Software Development process" width="540" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gardening is the closest analogy to the development process. Just like how once you plant a sapling, and you need to take care of it every day, the same way as you build the code, ensure no part of the codebase is getting rotten. Once you develop the software, it is necessary to ensure and nourish it carefully.&lt;/p&gt;

&lt;p&gt;Whenever new requirements pitch in, ensure that the development of the new feature doesn't affect or cause a lot of change in the existing functionality. Also, ensure that the addition of the new requirement is done in such a way that there is space for another set of new requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good enough isn’t good enough
&lt;/h2&gt;

&lt;p&gt;How can we evaluate that the product/software we are building is good enough?&lt;/p&gt;

&lt;p&gt;Good enough can have two meanings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fully satisfactory&lt;/strong&gt;: Requirements are met, expectations are satisfied, the underlying problem is solved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Barely adequate&lt;/strong&gt;: Lowest level of performance that doesn't qualify as a failure&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“&lt;strong&gt;Good Enough&lt;/strong&gt;” isn’t “&lt;strong&gt;Good Enough&lt;/strong&gt;”, in the sense that “&lt;strong&gt;Fully Satisfactory&lt;/strong&gt;” is not the same as “&lt;strong&gt;Barely Adequate&lt;/strong&gt;”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  “ How can we know if it’s good enough? ”
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perfect Software is a myth. Perhaps the key to the right balance is to understand the perceptions of the user and stakeholder.&lt;/p&gt;

&lt;p&gt;The software/products you build are going to be used by a certain set of users or by general users. It is always best to get feedback from the end-users from their user experience. We can release a beta (release candidate) version, roll it out to your stakeholders, other team members, and possibly end-users for feedback.&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%2Fbab8wlmo2fnl2pmsdux8.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%2Fbab8wlmo2fnl2pmsdux8.png" alt="Minimum Viable Product" width="602" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I said earlier, perfect software is a myth. Despite being a myth, there is something that we call a Minimum Viable Product ( MVP ). Every product that you are building, will have minimum viability to be accepted as a functional product.&lt;/p&gt;

&lt;p&gt;MVP can be best described as a mid-point between the earlier stages of the development process and the final product, meeting all the fundamental requirements of the product.&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%2Fq7g9196ppzffbfde9m1e.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%2Fq7g9196ppzffbfde9m1e.gif" alt="MVP" width="512" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assume a mansion is under construction, initially when a mansion is under construction, it doesn't fit good for you to stay in it. But as the construction of the mansion is completed with required carpentry work, it becomes fit (viable) enough for you to stay.&lt;/p&gt;

&lt;p&gt;Same way, when a product solves the fundamental needs of a given problem statement, it can be considered as a &lt;em&gt;Minimum Viable Product.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  “ Apple shipped the first version of Hypercard with about 500 known bugs in it, yet the product was a smashing success. The Hypercard QA team chose the right bugs to ship with. They also chose the right qualities… it isn’t the number of bugs that matters, it’s the effect of each bug. ”
&lt;/h1&gt;
&lt;h1&gt;
  
  
  - &lt;a href="https://www.egr.msu.edu/classes/ece480/capstone/docs/good_enough.html" rel="noopener noreferrer"&gt;James Bach&lt;/a&gt;, person who coined the term &lt;strong&gt;Good Enough Software&lt;/strong&gt;
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;As we move on, there definitely must have been a situation, where you might have added some functionality as an add-on even without being mentioned in requirements based on your astrological assumptions.&lt;/p&gt;

&lt;p&gt;The add-on that you add to the project, might be the one thing that is not necessary and ruins the quality or standards of the project.&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%2Fk655rsxbtri8nn3srh0y.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%2Fk655rsxbtri8nn3srh0y.jpeg" alt="Do not let add-ons deviate from actual requirements" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Identify the expectation based on the timeline and the resources given. Give the best for programmers, end-users, and future code maintainers. Nothing is always perfect. And most importantly, we need to know when to stop. Do not kill the good program with over-engineering.&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%2F4jwnfnrt0ubs7pyve5x9.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%2F4jwnfnrt0ubs7pyve5x9.png" alt="Avoid Over-Engineering" width="372" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge Portfolio, long-term investment
&lt;/h2&gt;

&lt;p&gt;As you all know, Software and Technology Industry is an ever-changing landscape, where technology and the science behind the technology are evolving. With the pace of evolution, just as important as it is to be an expert in a field of certain technology, it is equally important to keep yourself updated with regard to that technology.&lt;/p&gt;

&lt;p&gt;If you fail to keep yourself updated in regard to technology you are working on with the time you will be considered as an outdated resource.&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%2Fgpzq2dciexmsvanxgref.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%2Fgpzq2dciexmsvanxgref.gif" alt="Knowlege Portfolio, a type of investment with ensured ROI" width="746" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Investing in Knowledge Portfolio is a type of investment that has an assured ROI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  “An investment in knowledge always pays the best interest.”
&lt;/h1&gt;
&lt;h1&gt;
  
  
  - Benjamin Franklin
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Considering Knowledge Portfolio as an investment, you can classify the investments into two types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Low Risk, High Reward Investments&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;High Risk, High Reward Investments&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Low Risk, High Reward Investments&lt;/strong&gt; are the types of investment where you are investing your time in learning and sharpening your skills in the technology that you are proficient in.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;High Risk, High Reward Investments&lt;/strong&gt; are those investments in the knowledge portfolio, where you are not sure about the future of that technology but currently is in the trends.&lt;/p&gt;

&lt;p&gt;You should aim to find emerging technologies and learn them before they become popular.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  “ Learning Java when it first came out may have been risky, but it paid off handsomely for the early adopters who are now at the top of that field. ”
&lt;/h1&gt;
&lt;h1&gt;
  
  
  — The Pragmatic Programmer
&lt;/h1&gt;
&lt;/blockquote&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%2Ffgl91wbdpofeni8q0pz7.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%2Ffgl91wbdpofeni8q0pz7.jpeg" alt="Assures the best ROI for each investment" width="300" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep investing regularly with diverse technologies. Always stay contained with the spirit of learning new things that may enlighten you to think out of the box.&lt;/p&gt;

&lt;p&gt;Always be skeptical and analyze what you have heard or read about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Communication, a lethal weapon
&lt;/h2&gt;

&lt;p&gt;Communication is an important factor that as a developer we fail to fulfill sometimes. Communication is an art of transmitting information, ideas, and attitude from one person to another. Communication is a process of meaningful interaction among humans.&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%2Fsz7b7ewb97d0q9eai8sa.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%2Fsz7b7ewb97d0q9eai8sa.png" alt="Best ideas or suggestions or plans cannot take form without communication" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a developer, we have to communicate at various levels, starting from communication within the team up to communication with the client.&lt;/p&gt;

&lt;p&gt;Most of the time we fail to identify and understand the WISDOM principle behind communication.&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%2Fxq2gxfn64ik6wsmata6g.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%2Fxq2gxfn64ik6wsmata6g.gif" alt="WISDOM Principle of Communication" width="405" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the most important factors that play a vital role in realizing who you are conveying your idea.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a product owner, I would want to know about the product based on it’s viability and the problem that it solves.&lt;br&gt;
 As a developer, I would want to know how we can solve the problem statement or deal with it, technically.&lt;br&gt;
 As an end-user or client, I would want to know more about how does the product works and how does that fulfil all my requirements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is certainly something that we always miss out on. Despite being the best communicator in the team, if you explain the aspects and flaws of the products technically to the client, it is less likely expected for them to understand it unless they belong to an IT background or have some prior knowledge.&lt;/p&gt;

&lt;p&gt;As far as effective communication is considered, listening is also as important as conveying your idea. Always be an attentive listener.&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%2Ftvz8zwxktz6h2xcsslx2.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%2Ftvz8zwxktz6h2xcsslx2.jpeg" alt="Be an attentive listener" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, how you communicate your idea to the other person contributes to building an effective exchange of ideas. Every meeting not necessarily has to be some sort of presentation of your idea. Some might just be about mailing minutes of the meeting and cross verifying 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%2Fz4to1qbeo7tguhtmgspr.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%2Fz4to1qbeo7tguhtmgspr.png" alt="Always cross-verify your understanding from the exchange of ideas" width="512" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And however you are doing it, make sure you are doing it right. Even when you write emails or minutes of the meeting, ensure there are no grammatical errors or spelling mistakes.&lt;/p&gt;

&lt;p&gt;This is vital because, when these mistakes happen with the client we are working with, it speaks more about the firm you are representing and not just yourself. That is why it is necessary to be careful regarding these minute knots.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Communication is not just about what you say. It is about what you say and the way you&lt;/p&gt;
&lt;/blockquote&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%2Fkvffxlg5t4o1f2pn6a1h.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%2Fkvffxlg5t4o1f2pn6a1h.png" alt="Choose the right form of Communication: You could have just emailed instead of a presentation" width="800" height="792"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always respond to emails, missed calls, Slack messages, whatever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;You don’t have to immediately respond to everything!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Documentation is another means of communication, basically a written proof of the process flow of functionality. In the software and technology industry, documentation plays an important role in keeping requirements intact to the final functionality.&lt;/p&gt;

&lt;p&gt;Always ensure that you document the minutes of every meeting with the client and within the team.&lt;/p&gt;

&lt;p&gt;I know this has been a bit longer post than expected. If you got this far, I appreciate your patience and thank you for your time. I had too many thoughts to put up, but adding them all onto a single post may not have been the right idea. Anyhow, wrapping up the post, these simple baby steps are the fundamental ethics that will make you stand out from the rest of the developers out there. As a developer, we should and must strive to be better than we were yesterday. That was my first step towards being pragmatic, and probably, I believe it could be yours as well.&lt;/p&gt;

&lt;p&gt;I hope this article has helped to figure those minute things that you missed out on. Stay tuned for more.&lt;/p&gt;

&lt;p&gt;Happy Learning! :)&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>programming</category>
    </item>
    <item>
      <title>Reflecting on My Voyage as an Intern to a Developer</title>
      <dc:creator>Shravan Kumar B</dc:creator>
      <pubDate>Tue, 13 Apr 2021 19:58:52 +0000</pubDate>
      <link>https://dev.to/zhravan/reflecting-on-my-voyage-as-an-intern-to-a-developer-1d6k</link>
      <guid>https://dev.to/zhravan/reflecting-on-my-voyage-as-an-intern-to-a-developer-1d6k</guid>
      <description>&lt;p&gt;Hi everyone! This is a revised version of my article from &lt;a href="https://ohmyscript.com/2021/04/13/reflecting-on-my-voyage-as-an-intern-to-a-developer/" rel="noopener noreferrer"&gt;my personal blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is an article that expresses a few major learnings I would like to take away and mistakes I wouldn’t want to commit again from my journey, and maybe stand out like a guide book for those who are starting their career in Software Industry. I have tried to put up my learning and takeaways from my voyage in the simplest way I can.&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%2Fmiro.medium.com%2Fmax%2F2400%2F1%2AcD-wC5pUgL-mSI8bpyYF9A.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%2Fmiro.medium.com%2Fmax%2F2400%2F1%2AcD-wC5pUgL-mSI8bpyYF9A.png" width="800" height="560"&gt;&lt;/a&gt;&lt;br&gt;Learning is a Continuum Concept, where at every level and stage of your life, you learn and take away something from your previous experiences
  &lt;/p&gt;

&lt;p&gt;I am closing in on completing two years of my career at a startup, starting as a Graduate Intern Developer to Junior Developer and what a journey it has been. I have learnt a lot during the course of this ride. I explored newer nooks of the developmental and DevOps technology. I have made mistakes and learnt from them.&lt;/p&gt;

&lt;p&gt;During the Internship experience, I encountered a bunch of challenges that are very much typical to all, who is going through a transition from the College Graduate phase to the Working Professional phase. Likewise, I am going to address the challenges that I had faced along with the changes in my perception while growing as a working professional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some takeaways so far from my experience:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. &lt;strong&gt;Tutorial Hell&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially, when we start out as newbies, it is quite common that we prefer to learn videos from Youtube Tutorials, Udemy or any other LMS application. Some might prefer following and reading from some open blogs like Freecodecamp or Medium blogs.&lt;/p&gt;

&lt;p&gt;Now, let us first understand what is Tutorials Hell?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tutorial Hell&lt;/strong&gt; is a typical situation, where you find a lot of tutorials and you are not sure about which one to follow and learn from. &lt;br&gt;
Assuming, let us say somehow you figured out which tutorial to learn from. Now you struggle with what to do/build with what you have learnt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Initially, I had a very hard time getting through this situation. I was learning Node.js and I was very new to the Event-Driven Programming Paradigm and had a lot of confusions about fundamentals, despite I had followed one of the many tutorials available.&lt;/p&gt;

&lt;p&gt;Generally speaking, I do not have any issue with tutorials, but I find that most of the tutorials, always tend to miss 4–5 core concepts, as they expect you to have a technical grasp of the same. Those missed out concepts create a lot of voids as you go ahead.&lt;/p&gt;

&lt;p&gt;Let me give you an instance from my own experience. If you have worked on any JS-based framework/libraries, you must be knowing different ways of handling asynchronous operations (Callbacks, Promises, async-await). Those of you who do not know, do not worry, it is just 3 different ways of handling async operations. The point being, Callbacks are a real pain, whereas Promises and async-await is a better and cleaner way of writing code.&lt;/p&gt;

&lt;p&gt;Initially, when I started out writing RESTful APIs, I followed the Callback way of handling asynchronous operation, because the tutorial I had followed did not bother to speak about Promises and async-await. For around a month or so, imagine my life, handling every DB calls and asynchronous functions as callbacks. It was too difficult to write simple logic, despite the problem statement was quite straightforward.&lt;/p&gt;

&lt;p&gt;With time, as I kept exploring different technologies, one thing that I realised is that nothing beats the &lt;strong&gt;OFFICIAL DOCUMENTATION&lt;/strong&gt;. Every technology that you want to learn, has its own Learning Management System or its own Official Documentation published, which surely covers every aspect of the technology that you are learning. Since then, any technology that I want to explore, I always prefer to follow the official documentation.&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%2Fmiro.medium.com%2Fmax%2F300%2F1%2AdEaEwTrhabKDUxcmDpttDA.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%2Fmiro.medium.com%2Fmax%2F300%2F1%2AdEaEwTrhabKDUxcmDpttDA.png" alt="" width="300" height="250"&gt;&lt;/a&gt;&lt;br&gt;Avoid Cobwebbed by tutorials
  &lt;/p&gt;

&lt;p&gt;Finally, after we learn from the resource, follows another overwhelming situation where you are more confused about what to do with the updated knowledge portfolio?&lt;/p&gt;

&lt;p&gt;Initially, since I was already working on a project, I could easily fill in whatever I learnt to fulfil the project requirements. It allowed me to constantly learn and explore.&lt;/p&gt;

&lt;p&gt;There could be scenarios where you learn technologies out of the scope of your project you are working on. How to deal with situations in that scenario?&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AV8wl8X5-fnrwRhNX3125Hg.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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AV8wl8X5-fnrwRhNX3125Hg.jpeg" alt="" width="700" height="228"&gt;&lt;/a&gt;&lt;br&gt;Difference between Knowing vs Understanding
  &lt;/p&gt;

&lt;p&gt;The best thing one should do after learning technology is &lt;strong&gt;BUILDING SOMETHING&lt;/strong&gt;. Build, Create something you want. Be it simply for fun. Does not really have to be a real-time useful product. It is simply a product that you can apply conceptual learning to practicality.&lt;/p&gt;

&lt;p&gt;If it’s a new programming language, you can explore more by trying to solve problems from HackerRank or other competitive platforms. Maintain a GitHub Repository to keep track of whatever you are learning with simple documentation for your understanding. This allows you to have your own documentation that you can look back into whenever you want. Creating and documenting the Proof of Concepts is a deal.&lt;/p&gt;

&lt;p&gt;Meanwhile, &lt;strong&gt;KEEP CODE-READING&lt;/strong&gt; from different GitHub repositories. I used to randomly code-read just to get a glimpse of different approaches to solving problems and writing code. This actually helped me improvise the way I wrote the code.&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AG6IMBGB--Xr0iHrajQROpA.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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AG6IMBGB--Xr0iHrajQROpA.jpeg" alt="" width="700" height="467"&gt;&lt;/a&gt;&lt;br&gt;Open Source Contribution allows you to spread your wings and collaborate with people having different ideologies.
  &lt;/p&gt;

&lt;p&gt;Open Source Contribution allows you to spread your wings and collaborate with people having different ideologies.&lt;/p&gt;

&lt;p&gt;One more way to get through this situation is to &lt;strong&gt;CONTRIBUTE TOWARDS&lt;/strong&gt; &lt;strong&gt;OPEN SOURCE&lt;/strong&gt;. Try to search for some Open Source Projects built on top of the technology and try actively contributing towards it or recreating your own project as a Proof of Concept.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Build Products, not Junk
&lt;/h1&gt;

&lt;p&gt;This seriously was a huge misconception I had initially, where I thought trying to solve the problem statement and coming up with a solution, is the most important thing. Probably, because of an attitude sometimes your graduate syllabus forces you to inculcate, where finding a solution is considered important than any other factors.&lt;/p&gt;

&lt;p&gt;There are two factors that we tend to fail to focus upon, firstly &lt;strong&gt;END-USER&lt;/strong&gt; of the application and secondly &lt;strong&gt;CLARITY over USER REQUIREMENTS&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2A1cujLlFONgNdPC5RtF1FrA.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%2Fmiro.medium.com%2Fmax%2F700%2F1%2A1cujLlFONgNdPC5RtF1FrA.png" alt="" width="700" height="364"&gt;&lt;/a&gt;&lt;br&gt;What user wanted vs What you delivered
  &lt;/p&gt;

&lt;p&gt;Sometimes we fail to understand the user requirements. At times, we misinterpret given User Requirement, due to our individual perception and experience, which, of course, is not a mistake. But, it is very important to clarify what you have understood with the client/user/product-owner.&lt;/p&gt;

&lt;p&gt;It is always better to ask, in the very initial stage of the project, with the product-owner/client, whether your understanding of the requirements are accurate or not. When you question the client in the very first stage, you won’t end up building a product that was not required.&lt;/p&gt;

&lt;p&gt;Similarly whenever, requirement pitches in between the development cycle, ensure you clarify that as well, just to make sure that your project doesn’t end up going south.&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%2Fmiro.medium.com%2Fmax%2F602%2F1%2Ax7B9p3FkuOID95MPyu3nIA.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%2Fmiro.medium.com%2Fmax%2F602%2F1%2Ax7B9p3FkuOID95MPyu3nIA.png" alt="" width="602" height="402"&gt;&lt;/a&gt;&lt;br&gt;&lt;strong&gt;Bad UI/UX&lt;/strong&gt;: Label [PUSH/PULL] and Handlebars.&lt;br&gt;&lt;br&gt;
Why? Do I need the handlebar to push?
  &lt;/p&gt;

&lt;p&gt;Always focus on building the product on the basis of how the product owner (End-User) wants 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%2Fmiro.medium.com%2Fmax%2F658%2F1%2Ap6-KTu5kcpbD-fVBPIgE9A.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%2Fmiro.medium.com%2Fmax%2F658%2F1%2Ap6-KTu5kcpbD-fVBPIgE9A.jpeg" alt="" width="658" height="857"&gt;&lt;/a&gt;&lt;br&gt;&lt;strong&gt;Bad Design Aesthetics&lt;/strong&gt;: A button showing the corresponding number and another actual button to click the floor number
  &lt;/p&gt;

&lt;p&gt;When you are building the product, ask yourself, “&lt;strong&gt;As an owner of the product, does this make my work easier? Does this solve my problem? Is this solution feasible? Is this the only approach available? Are there better approaches?&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;By the time, your research is done, and have it evaluated based on the above factors, you will have a conclusive and evident answer, portraying clarity over how to go about building the product with a better User Experience.&lt;/p&gt;

&lt;p&gt;Keep constantly in touch with end-user and build the product always iteratively.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Knowing the Best Practices
&lt;/h1&gt;

&lt;p&gt;To those who do not know what do I mean by &lt;strong&gt;Best Practices&lt;/strong&gt;? Best Practices are evidently proved guidelines with a strong theory behind them.&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2Ac6GeX3zdBru2d9yHjp-N4Q.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%2Fmiro.medium.com%2Fmax%2F700%2F1%2Ac6GeX3zdBru2d9yHjp-N4Q.jpeg" alt="BigSur wallpaper" width="700" height="405"&gt;&lt;/a&gt;&lt;br&gt;Daily Healthy Routine is the closest analogy to the Best Practices
  &lt;/p&gt;

&lt;p&gt;Just like how we follow certain practices on daily basis like bathing, washing hands after eating, and so on, to maintain our hygiene and keep ourselves neat and tidy. Similarly, in software development, we follow a certain set of proved norms, just to ensure that the product we are building doesn’t rot with time or newer requirements.&lt;/p&gt;

&lt;p&gt;Every technology you learn, there are always best practices tagged along with it. It is quite difficult to remember all the best practices. Over time, one thing that I realised and noticed about the &lt;strong&gt;BEST PRACTICES&lt;/strong&gt; is that most of them try to learn and recollect the best practices. And fail to understand the theory behind the practice that we should follow.&lt;/p&gt;

&lt;p&gt;If you understand the theory behind the practice, it wouldn’t be difficult to remember them while implementing it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Practice tells you that things are good or bad; theory tells why.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let us take a simple instance, whenever we want to scale your project structure, how do you figure that out?&lt;br&gt;&lt;br&gt;
We have a proposed model called the &lt;strong&gt;Scaling Cube&lt;/strong&gt; Theory, which describes the basic principle behind the model and why should you consider it when scaling the project.&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%2Fmiro.medium.com%2Fmax%2F427%2F1%2Acg9znQR8I2orO8ooLMCv4w.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%2Fmiro.medium.com%2Fmax%2F427%2F1%2Acg9znQR8I2orO8ooLMCv4w.png" alt="BigSur wallpaper" width="427" height="335"&gt;&lt;/a&gt;&lt;br&gt;&lt;strong&gt;Scale Cube&lt;/strong&gt;: Service Scalability Best Practices
  &lt;/p&gt;

&lt;p&gt;Each axis of the indicates, as shown below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  X-axis: &lt;strong&gt;Scaling by cloning&lt;/strong&gt;, otherwise known as Horizontal Duplication. Usually monolithic projects when deployed, have multiple cloned copies of an application behind a load balancer. When you have only one service to deal with, we are mostly advised to go with &lt;strong&gt;&lt;em&gt;Monolithic Architecture&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Y-axis: &lt;strong&gt;Scaling by splitting different services&lt;/strong&gt;, known as decomposition. Usually, projects with complex problems statements and several services, are often advised to split the application into multiple distinct services. When you take this kind of decomposition approach, we call it &lt;strong&gt;&lt;em&gt;Microservice Architecture&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Z-axis: &lt;strong&gt;Scaling by splitting similar things&lt;/strong&gt;, known as Data Partitioning. In projects where robustness is a very high priority, improving Infrastructure from the Data Storage point of view helps a lot. In this kind of approach, there are several replicated copy of the code, but each of them is accessible only to a subset of the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see in the above instance, by knowing the theory behind the Scaling Cube, it is easier for us to understand which approach to be considered when we are building the project architecture, based on the business requirements of the project. When we apply Scaling Cube, it is easier to evaluate whether or not to scale the project.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Debugging
&lt;/h1&gt;

&lt;p&gt;At the early stage of my learning, I devoted a lot of my time to debugging, since I was very new to the technology I was working on. And I did not have the grasp of the errors and crashes that followed. I always used to seek help from &lt;strong&gt;StackOverflow&lt;/strong&gt; and &lt;strong&gt;Grepper&lt;/strong&gt; extension for finding the cause and origin of the bug and do some quick fixes. As I kept exploring, I became quite familiar with some set of errors.&lt;/p&gt;

&lt;p&gt;But as I kept exploring new services and stacks, sometimes it was due to bugs in packages that I am using, it so used to happen, where I encounter some new types of error. I couldn’t afford to spend more time to debug and resolve errors, so I started following a simple backtracking method to debug called &lt;strong&gt;Five whys&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Debugging is a sort of aggravating task when you can not figure out the origin and cause of the error. The five whys method was a very basic technique, which helped me determine the root cause of the error in the easiest way, by iteratively asking the question “Why?”.&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%2Fmiro.medium.com%2Fmax%2F400%2F1%2A9vUBXY9HW42xWutui8QeIw.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%2Fmiro.medium.com%2Fmax%2F400%2F1%2A9vUBXY9HW42xWutui8QeIw.png" alt="BigSur wallpaper" width="400" height="519"&gt;&lt;/a&gt;&lt;br&gt;5 Whys: Technique used by Toyota Motors for finding manufacturing defects
  &lt;/p&gt;

&lt;p&gt;I used loggers to ensure from where exactly the issue has originated. This saves a lot of time. It is important to find the origin and root cause of the error.&lt;/p&gt;

&lt;p&gt;Also ensure that you document the tracked bug, which is at the application level. It is important to document the bug, maintain the history of bug tracks and record the solution for the bug reported.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. When you have to explore something new, create Proof of Concept
&lt;/h1&gt;

&lt;p&gt;Whenever a new problem statement pitches in, something that you have not worked on. Always create a Proof of Concept for the same. Try out different possible solutions for the same. And do some research work on the different possible solution and make a simple Proof of Concept with enough documentation(for your teammates to follow up). Have a healthy discussion and take opinions from your team.&lt;/p&gt;

&lt;p&gt;Proof of Concept is not final implementation, rather they are intended to provide proof that a given system would work effectively for the problem statement posed. Take feedback on the PoC, and also do not forget to keep them in your GitHub Repository for future reference for yourself and others.&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Unit Tests makes your code better
&lt;/h1&gt;

&lt;p&gt;I learnt this the hard way, but honestly speaking, Unit tests are the best way to catch bugs. In the initial stage, I hardly knew and cared about writing Unit Tests for the APIs, I used to often find myself concentrating on completing the tasks in the expected slot with good quality.&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%2Fmiro.medium.com%2Fmax%2F225%2F1%2AjSLR-uO-8cBDuAvvWA6BKQ.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%2Fmiro.medium.com%2Fmax%2F225%2F1%2AjSLR-uO-8cBDuAvvWA6BKQ.jpeg" alt="BigSur wallpaper" width="225" height="225"&gt;&lt;/a&gt;&lt;br&gt;&lt;strong&gt;Unit Testing&lt;/strong&gt;: Verify if the piece of code is doing what it is intended to do
  &lt;/p&gt;

&lt;p&gt;Writing Unit Tests helps you to verify that the code is doing what it is intended to do. Unit tests always help and provide strong backbone support to maintain your code and safely refactor them from time to time. Sometimes, Unit Tests helped me to discover edge cases that I have missed upon. Since the time, I have learnt to write Unit Tests, I have always made it a habit to write Unit Tests for the code I write, which gives me more confidence in the quality of the code I deliver.&lt;/p&gt;

&lt;h1&gt;
  
  
  7. Maintain Documentation
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; is always the best way to define a feature from the User’s perspective. Before developing the feature, document the feature first. As a developer, always maintain documentation for the feature you are building.&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AP9uD6rvLW1FhNPoFOIdz6w.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%2Fmiro.medium.com%2Fmax%2F700%2F1%2AP9uD6rvLW1FhNPoFOIdz6w.jpeg" alt="BigSur wallpaper" width="700" height="525"&gt;&lt;/a&gt;&lt;br&gt;“Documentation is a love letter that you write to your future self” &lt;br&gt;
-Twitter&lt;br&gt;

  &lt;/p&gt;

&lt;p&gt;Whenever you can, ensure that you have the document written has been reviewed by the end users and stakeholders before any development begins. As and when the feature is modified during development, make sure that the corresponding changes are documented. Just as documentations are modified, so should be the Unit Tests.&lt;/p&gt;

&lt;h1&gt;
  
  
  8. Writing Blogs
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Writing blogs&lt;/strong&gt; is useful for many reasons. Writing blogs will help you realise if you have understood the concepts well and if you are able to explain them in a way others can understand. As developers, we mostly work on creating and adding values to the product, we are building maybe by resolving a bug or implementing new features, which most of them do, but writing blogs would help you get a better understanding of the concepts and gives you a very good feeling about helping people. Some day, someone might read your content and may be able to produce a feature required for their project through your guidance. Your experience can help someone get proper guidance.&lt;/p&gt;

&lt;h1&gt;
  
  
  9. Contribute towards Open Source
&lt;/h1&gt;

&lt;p&gt;Open Source has a great community built around. Contributing and being part of the Open Source Community allows me to explore and embrace newer perspectives. Contributing to Open Source helps me a lot in improvising my problem-solving skills.&lt;/p&gt;

&lt;p&gt;I get to meet like-minded people and they help me inspire to become a better developer. It is always nice to be part of a peer, passionate about developing and building products. Trust me, it feels great to have your name as a contributor to someone’s project, which boosts your positivity and confidence.&lt;/p&gt;

&lt;h1&gt;
  
  
  10. Always be Open to Continuous Learn
&lt;/h1&gt;

&lt;p&gt;Firstly make sure that you build upon your fundamentals. Keep your fundamentals strong. If your fundamentals are strong, switching between similar technologies and exploring them would not be a difficult task.&lt;/p&gt;

&lt;p&gt;Keep exploring new technologies. The Software and Technology Industry is an everlasting industry that keeps expanding with time. As time evolves, the industry also keeps evolving with new technology arising every new day. Always ensure you are open to switch and learn, explore and practically work on those technologies.&lt;/p&gt;

&lt;p&gt;Read Technical and Non Technical books to keep yourself aware of the revolutionary changes happening in the industry. Keep reading blogs published by Major MNCs and have an understanding of their system design and architecture and the theory behind it.&lt;/p&gt;

&lt;p&gt;I always keep exploring different technologies, because it helps me have a wider perspective. Wider perspective helps you come out with better and creative solutions. I prefer to be a &lt;strong&gt;Generalizing Specialist&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Generalizing Specialist is jack-of-all-trades, and master of a few&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  11. Be polite
&lt;/h1&gt;

&lt;p&gt;Life becomes much easier as a developer when you start listening to others. Always have a certain level of humility when listening to others. It is very important to be open to different perspectives and opinions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every expert was once a beginner.&lt;/p&gt;

&lt;p&gt;You were a beginner before you reached this stage today.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Always be there for those who need your guidance and keep helping others learn and grow. In the process of guiding others and helping them expand their wings, there is a lot that you will explore and experience as well.&lt;/p&gt;

&lt;p&gt;These were some of the major takeaways from my journey as an Intern to a Developer. I hope all the beginners who are reading the article, will find these useful for your journey. Those who have already passed this phase might find it very much relatable.&lt;/p&gt;

&lt;p&gt;The post has been longer than expected, if you got this far, I appreciate your patience and thank you for your time.&lt;/p&gt;

&lt;p&gt;If you like the article, hit the like button, share the article and subscribe to the blog. If you want me to write an article on specific domain/technology I am provisioned in, feel free to drop a mail at &lt;a href="mailto:shravan@ohmyscript.com"&gt;shravan@ohmyscript.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned for my next article.&lt;/p&gt;

&lt;p&gt;That’s all for now. Thank you for reading.&lt;/p&gt;

&lt;p&gt;Signing off until next time.&lt;br&gt;&lt;br&gt;
Happy Learning.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>node</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
  </channel>
</rss>
