<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Juan Cruz Martinez</title>
    <description>The latest articles on Forem by Juan Cruz Martinez (@jcmartinezdev).</description>
    <link>https://forem.com/jcmartinezdev</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%2F398445%2F72662da2-5b4b-4704-9385-6b77cc22ecb2.jpg</url>
      <title>Forem: Juan Cruz Martinez</title>
      <link>https://forem.com/jcmartinezdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jcmartinezdev"/>
    <language>en</language>
    <item>
      <title>The Quiet Surrender to AI</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Tue, 24 Feb 2026 12:44:12 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/the-quiet-surrender-to-ai-51h6</link>
      <guid>https://forem.com/jcmartinezdev/the-quiet-surrender-to-ai-51h6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;​We imagined machines would have to overpower us. We didn't imagine we'd just let go.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For years whenever people talked about AI taking over the world, the image was always the same, Skynet, Terminator like Judgment Day. Machines rising up, overpowering humanity, forcing us into submission. The fear was physical domination, the idea that one day we would have to fight back against something stronger than us to preserve what makes us human. That story assumed resistance. It assumed conflict. It assumed that if our autonomy were threatened, we would defend 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%2Fdgvbh1qiou5anctk21p1.webp" 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%2Fdgvbh1qiou5anctk21p1.webp" alt="Terminator 3: Rise of the Machines" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is actually happening is far less dramatic and far more unsettling. There are no machines dragging our minds away from us. No system is coercing us into obedience. No apocalypse is required, no war, no conquest. Instead, we are steadily handing over our thinking because it is easier to let something else do it for us. The trade is simple: less effort, less friction, less discomfort. And most people are taking it.&lt;/p&gt;

&lt;p&gt;I am not afraid of AI. I am far more concerned with what we are doing with it. Used deliberately, AI is extraordinary. It can accelerate research, surface alternatives you hadn't considered, generate scaffolding that lets you work at a higher level of abstraction. I use it. I let it handle boilerplate, clean up grammar, automate the mechanical parts of my work. I am not interested in pretending the tool doesn't exist.&lt;/p&gt;

&lt;p&gt;But somewhere along the way, something shifted. We stopped using AI to extend our thinking and started using it to avoid thinking altogether. That shift is subtle, and I think it is one of the most important things happening right now.&lt;/p&gt;

&lt;p&gt;​I feel this most acutely in coding because coding is the craft I care about.&lt;/p&gt;

&lt;p&gt;I started programming as a teenager, and what hooked me was not output or efficiency. It was the struggle. Staring at a problem until it hurt and refusing to move on until it made sense. Debugging something for hours and slowly constructing a mental model of why the system behaved the way it did. It was failing, tracing the failure back to its cause, and earning understanding instead of skipping to the answer.&lt;/p&gt;

&lt;p&gt;That friction was not an obstacle. It was the training itself. It built intuition. It built the ability to hold complexity in my head without collapsing under it. It built what I can only call taste, the sense of when a solution is right, not just functional.&lt;/p&gt;

&lt;p&gt;Now I watch people generate code they cannot explain and ship systems they cannot reason about. If you cannot walk someone through the logic behind what you built without reopening the chat window, you did not build it. You assembled it. And over time, that difference compounds. The muscle you never use is the muscle you lose.&lt;/p&gt;

&lt;p&gt;​But I want to be honest about something. About a month ago I hit a bug in a system I was writing. The kind of thing that, five years ago, I would have traced methodically for hours, checking assumptions, slowly cornering the defect. Instead, ninety seconds in, I pasted the stack trace into a chat window. The answer came back almost instantly. It was correct. I fixed the bug and moved on.&lt;/p&gt;

&lt;p&gt;​And I felt something I didn't expect: a small, quiet loss. Not because the tool failed. Because it worked. Because the hours I would have spent building a deeper model of that system simply didn't happen. I got the fix. I missed the understanding. And I'm not sure I would have even noticed if I hadn't been paying attention.&lt;/p&gt;

&lt;p&gt;​That is what concerns me. Not the dramatic failures. The invisible ones.&lt;/p&gt;

&lt;p&gt;​Now, I know the counterargument, and I want to take it seriously, because it is not wrong.&lt;/p&gt;

&lt;p&gt;​Every generation has this panic. Socrates argued that writing would destroy memory, that people would carry knowledge in notebooks instead of in their minds, and become shallow as a result. He was partly right, actually. We did lose something. Oral cultures had capacities for memory and narrative that most literate people cannot match. But what we gained the ability to build on each other's ideas across centuries, to accumulate knowledge beyond what any single mind could hold. It was so transformative that the trade-off was clearly worth it.&lt;/p&gt;

&lt;p&gt;​Calculators. Google. Wikipedia. GPS. Every time, the fear was that cognitive offloading would make us weaker. Every time, the reality was more nuanced than the panic suggested. So why should AI be different?&lt;/p&gt;

&lt;p&gt;Maybe it isn't. Maybe this is just the next turn of the same wheel, and the people warning about cognitive decay are playing the same role Socrates played: correct about the loss, blind to the gain.&lt;/p&gt;

&lt;p&gt;I hold that possibility genuinely. But I think there is something different this time, and it is worth articulating precisely.&lt;/p&gt;

&lt;p&gt;​Previous tools offloaded information. AI offloads reasoning. A calculator doesn't think about the problem for you, it executes a mechanical operation so you can focus on the higher-order question. Google doesn't construct an argument, it surfaces sources so you can evaluate and synthesize them. These tools removed mechanical friction while leaving cognitive friction intact.&lt;/p&gt;

&lt;p&gt;​Large language models are the first tools that remove cognitive friction directly. They don't just give you facts. They assemble the argument. They don't just retrieve information. They do the synthesis. The thing that previous tools left for you to do, the thinking itself, is precisely what this tool offers to handle.&lt;/p&gt;

&lt;p&gt;​That doesn't make it evil. It makes the question of how you use it genuinely different from any previous technology. The line between "tool that extends my thinking" and "tool that replaces my thinking" has never been this blurry.&lt;/p&gt;

&lt;p&gt;​And I want to admit: I don't know exactly where that line is.&lt;/p&gt;

&lt;p&gt;This pattern extends far beyond programming. Open X and you are watching bots interact with bots while humans prompt machines to manufacture engagement. Open LinkedIn and everything sounds polished, structured, optimized, safe. Every paragraph feels assembled rather than wrestled with. The voice is technically there, but it feels synthetic. You can almost hear the prompt humming behind the sentences.&lt;/p&gt;

&lt;p&gt;We have more expressive power than ever before, and everything is starting to sound the same. Not because people lack original thoughts, but because the tool they're filtering those thoughts through has a center of gravity, and it pulls everything toward it.&lt;/p&gt;

&lt;p&gt;That is not intelligence expanding. That is intelligence flattening. And the loss is not just aesthetic. When everyone's output converges on the same median, the signal that used to distinguish deep understanding from shallow fluency disappears. We lose the ability to tell who has actually done the thinking. Including, sometimes, ourselves.&lt;/p&gt;

&lt;p&gt;The hardest version of this problem is generational, and I don't think my generation is equipped to talk about it honestly.&lt;/p&gt;

&lt;p&gt;I built my intuition through friction because I had no choice. There was no tool to skip the struggle. The hours I spent debugging, the months I spent confused, the years of slowly building mental models, that was the only path available. It is easy for me to say "do the hard work" when the hard work was the only option I ever had.&lt;/p&gt;

&lt;p&gt;Someone learning to code today at fifteen faces a fundamentally different landscape. The tool that skips the struggle is right there, it's free, and everyone around them is using it. Telling them to artificially impose difficulty is like telling someone to hand-wash their clothes to build character. It might even be right, in some narrow sense. But it is not a serious engagement with the reality they face.&lt;/p&gt;

&lt;p&gt;What I think we actually owe that generation is not a lecture about discipline. It is an honest framework for when to use the tool and when to refuse it. When to let AI carry the load and when to carry it yourself because the carrying is the point. I don't have that framework fully worked out. I'm not sure anyone does yet.&lt;/p&gt;

&lt;p&gt;But I know it matters, because the people who figure it out will develop genuine understanding. And the people who don't will spend years producing output that looks competent while building nothing underneath it. And they may not realize what they've lost until they need it and it isn't there.&lt;/p&gt;

&lt;p&gt;Here is what I keep coming back to.&lt;/p&gt;

&lt;p&gt;Convenience is not the enemy. It never was. The enemy is convenience unexamined, the slow, comfortable slide from "this tool helps me think" to "this tool thinks for me" without ever noticing the transition.&lt;/p&gt;

&lt;p&gt;I use AI every day. I am not fighting the technology. I am fighting the gravitational pull it exerts on my own mind, the pull toward ease, toward letting the machine carry weight I should be carrying, toward skipping the part that feels slow and stupid and uncertain.&lt;/p&gt;

&lt;p&gt;I don't always win. That concurrency bug I mentioned? I lost. I took the easy path, and I chose not to go back and do the hard work of understanding that system more deeply. I'm aware of that. I chose convenience, told myself I'd circle back, and I haven't.&lt;/p&gt;

&lt;p&gt;So when I say most people are choosing convenience over thinking, I am not exempting myself. I am describing a gravity I feel every day. Some days I resist it well. Some days I don't.&lt;/p&gt;

&lt;p&gt;The difference, the only difference I can claim, is that I am paying attention to the trade. I am trying to notice when I'm drifting. I am trying to keep the thinking muscle under load even when the tool offers to carry everything.&lt;/p&gt;

&lt;p&gt;Because the uncomfortable truth is that we imagined machines would have to conquer us to take our autonomy. We imagined a fight. We imagined resistance.&lt;/p&gt;

&lt;p&gt;We didn't imagine we would just... let go. Quietly. Willingly. Not because we were forced, but because it was easier.&lt;/p&gt;

&lt;p&gt;And the most unsettling part is not that it's happening.&lt;/p&gt;

&lt;p&gt;It's that most of us won't notice until it's already done.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Tue, 03 Feb 2026 09:19:01 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/-5dee</link>
      <guid>https://forem.com/jcmartinezdev/-5dee</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/auth0/why-your-demo-code-should-be-treated-as-production-code-and-other-devrel-secrets-3332" class="crayons-story__hidden-navigation-link"&gt;Why Your Demo Code Should Be Treated as Production Code (And Other DevRel Secrets) 🎸&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/FSbUpFngpWo" title="Why Your Demo Code Should Be Treated as Production Code (And Other DevRel Secrets) 🎸"&gt;&lt;/iframe&gt;
    &lt;/div&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="/auth0"&gt;
            &lt;img alt="Auth0 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%2F634%2Fc6bfc78f-136d-456b-96dc-bcc4be1c88f9.jpg" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/carlastabile" 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%2F550123%2F37561a9e-396f-4a02-bade-a8670d4a035c.jpg" alt="carlastabile profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/carlastabile" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Carla Urrea Stabile
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Carla Urrea Stabile
                
              
              &lt;div id="story-author-preview-content-3205537" 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="/carlastabile" 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%2F550123%2F37561a9e-396f-4a02-bade-a8670d4a035c.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Carla Urrea Stabile&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="/auth0" class="crayons-story__secondary fw-medium"&gt;Auth0&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/auth0/why-your-demo-code-should-be-treated-as-production-code-and-other-devrel-secrets-3332" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 29&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/auth0/why-your-demo-code-should-be-treated-as-production-code-and-other-devrel-secrets-3332" id="article-link-3205537"&gt;
          Why Your Demo Code Should Be Treated as Production Code (And Other DevRel Secrets) 🎸
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devrel"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devrel&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/auth0/why-your-demo-code-should-be-treated-as-production-code-and-other-devrel-secrets-3332" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&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/auth0/why-your-demo-code-should-be-treated-as-production-code-and-other-devrel-secrets-3332#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;
            3 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>devrel</category>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>From Senior to Staff: What Actually Changes (and How to Get There)</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:33:48 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/from-senior-to-staff-what-actually-changes-and-how-to-get-there-5a53</link>
      <guid>https://forem.com/jcmartinezdev/from-senior-to-staff-what-actually-changes-and-how-to-get-there-5a53</guid>
      <description>&lt;p&gt;Moving from Senior to Staff is one of the most misunderstood transitions in an engineering career. It isn’t just a bigger paycheck, more code, or a new fancy title on LinkedIn. It’s a &lt;strong&gt;shift in what success looks like&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;At Senior, your value is measured by &lt;strong&gt;how well you deliver complex work within a team&lt;/strong&gt;. At Staff, your value comes from &lt;strong&gt;changing the system so multiple teams succeed&lt;/strong&gt;. That means stepping into fuzzier problems, shaping standards, and building the paved roads that others use to move faster and safer.  &lt;/p&gt;

&lt;p&gt;If you’re asking yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;What does Staff really mean compared to Senior?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How do I know if I’m operating at that level?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;What practical steps should I take to make the leap?&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide is for you. It breaks down the core differences, provides a 30-60-90 days playbook, and shares concrete signals and artifacts that show Staff-level impact. We’ll also touch briefly on Principal level for context, but the focus is squarely on &lt;strong&gt;how to go from Senior -&amp;gt; Staff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is all coming from my own personal journey, plus having worked with people in both levels, so if you have any additional tips, or comments, hit me up on socials!&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Senior engineers&lt;/strong&gt; deliver complex work reliably within a team.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Staff engineers&lt;/strong&gt; create leverage across teams: they choose the right problems, set standards, reduce systemic risk, and multiply others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moving up isn’t “more coding”&lt;/strong&gt;. It’s a shift to &lt;strong&gt;strategy, systems, and influence&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Senior vs. Staff Isn’t “More of the Same”
&lt;/h2&gt;

&lt;p&gt;It’s easy to assume that Staff is just &lt;em&gt;“Senior, but better.”&lt;/em&gt; More code, more responsibility, bigger projects. But that assumption is exactly what keeps many engineers stuck at Senior for years.  &lt;/p&gt;

&lt;p&gt;The truth is: &lt;strong&gt;Staff is a role change, not an upgrade.&lt;/strong&gt; The skills that make you an excellent Senior, deep technical execution, owning complex features, mentoring teammates, are still valuable, but they’re no longer enough on their own.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Senior&lt;/strong&gt;, success means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can take a loosely defined project and deliver it end-to-end.&lt;/li&gt;
&lt;li&gt;You’re the go-to person when your team faces a tough technical challenge.&lt;/li&gt;
&lt;li&gt;You help raise the quality bar through reviews, mentoring, and design work.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At &lt;strong&gt;Staff&lt;/strong&gt;, success means something different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;choose which problems matter&lt;/strong&gt; at the organizational level, not just solve the ones handed to you.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;reduce systemic risk&lt;/strong&gt;, reliability, scalability, cost, not just project risk.&lt;/li&gt;
&lt;li&gt;You create &lt;strong&gt;systems and standards&lt;/strong&gt; so, dozens of engineers can deliver faster and safer, without your direct involvement.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;influence peers and leaders across teams&lt;/strong&gt;, not just within your own.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Senior = “I deliver complex projects well.”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staff = “I make the organization deliver better.”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shift feels uncomfortable at first. It requires letting go of being the hero who personally fixes everything, and instead becoming the person who &lt;strong&gt;designs the system&lt;/strong&gt; that prevents problems in the first place.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Big Differences at a Glance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;Senior&lt;/th&gt;
&lt;th&gt;Staff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One service, project, or feature team&lt;/td&gt;
&lt;td&gt;Multiple teams or an entire domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time horizon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 sprint -&amp;gt; 1 quarter&lt;/td&gt;
&lt;td&gt;2–4 quarters; sets direction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ambiguity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clarifies project requirements&lt;/td&gt;
&lt;td&gt;Defines problems &amp;amp; guardrails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Influence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mentors teammates&lt;/td&gt;
&lt;td&gt;Aligns leaders, gains adoption across teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;De-risks features&lt;/td&gt;
&lt;td&gt;De-risks themes (reliability, cost, security)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensures correctness in repo&lt;/td&gt;
&lt;td&gt;Creates “paved roads” so others ship safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Feature delivery, bug rates&lt;/td&gt;
&lt;td&gt;Domain health: latency, cost, adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Artifacts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Design docs, PRs, run books&lt;/td&gt;
&lt;td&gt;Strategy docs, RFCs, standards, deprecation plans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Staff Engineers Actually Produce
&lt;/h2&gt;

&lt;p&gt;Staff engineers aren’t judged by how many features they ship.&lt;br&gt;&lt;br&gt;
They’re judged by the &lt;strong&gt;systems, standards, and artifacts&lt;/strong&gt; that make everyone else more effective.&lt;/p&gt;

&lt;p&gt;Here are the kinds of things a strong Staff engineer leaves behind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strategy docs&lt;/strong&gt; not just “what we’re building” but &lt;em&gt;why this direction matters&lt;/em&gt;, how it ties to company goals, and the principles that should guide decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-team RFCs&lt;/strong&gt; proposals for shared libraries, APIs, or processes that align multiple teams and prevent divergence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paved roads&lt;/strong&gt; starter templates, CI/CD checks, infra defaults, or documentation that make the right way the easy way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability and cost programs&lt;/strong&gt; SLOs, performance budgets, or cost guardrails that reduce systemic risk across services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration and deprecation plans&lt;/strong&gt; clear timelines, tooling, and communication to move dozens of teams without chaos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarterly impact memos&lt;/strong&gt; short, visible write-ups showing before/after metrics and what’s next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These outputs are different from a Senior’s deliverables. They aren’t about &lt;em&gt;your project&lt;/em&gt; being successful, they’re about &lt;strong&gt;changing the environment so every project in the org has a better chance of success&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A good litmus test:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you went on vacation for a month, would your work keep helping others succeed?&lt;br&gt;
If the answer is yes, you’re probably operating at Staff level.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These outputs keep quality and speed high &lt;em&gt;even when you’re not in the room&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signs You’re Operating at Staff Level
&lt;/h2&gt;

&lt;p&gt;Titles don’t always match reality. Some engineers hold the Staff title but still operate like Seniors, while others quietly work at Staff level without the title.&lt;br&gt;&lt;br&gt;
The difference shows up in the &lt;strong&gt;signals of your day-to-day work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Positive signals&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leaders ask you &lt;em&gt;which problems to tackle&lt;/em&gt;, not how to implement.&lt;/li&gt;
&lt;li&gt;Teams beyond yours adopt your standards voluntarily.&lt;/li&gt;
&lt;li&gt;You turn vague mandates (“improve reliability”) into measurable plans.&lt;/li&gt;
&lt;li&gt;Colleagues ship faster/safer on your paved road.&lt;/li&gt;
&lt;li&gt;You’re comfortable saying &lt;em&gt;no&lt;/em&gt; to projects that aren’t leverage.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Anti-signals&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heroics: saving projects by working more hours.&lt;/li&gt;
&lt;li&gt;Endless debate threads with no decisions.&lt;/li&gt;
&lt;li&gt;Docs with no adoption.&lt;/li&gt;
&lt;li&gt;Optimizing local metrics while domain outcomes stagnate.&lt;/li&gt;
&lt;li&gt;You measure success by &lt;strong&gt;your personal output&lt;/strong&gt;, not by &lt;strong&gt;the outcomes of the system&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Senior -&amp;gt; Staff Playbook
&lt;/h2&gt;

&lt;p&gt;So how do you actually make the leap?&lt;br&gt;&lt;br&gt;
It isn’t about working longer hours or taking on every hard project.&lt;br&gt;&lt;br&gt;
It’s about &lt;strong&gt;shifting the kind of problems you own and the way you solve them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a playbook you can follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pick leverage, not tasks
&lt;/h3&gt;

&lt;p&gt;Staff engineers don’t wait for assignments. They &lt;em&gt;choose the right problems&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
Look for issues that are &lt;strong&gt;painful across multiple teams&lt;/strong&gt;, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeated outages caused by the same reliability gap&lt;/li&gt;
&lt;li&gt;Onboarding that slows every new hire&lt;/li&gt;
&lt;li&gt;Skyrocketing infra costs without visibility&lt;/li&gt;
&lt;li&gt;Cross-service latency or data consistency issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write a short &lt;strong&gt;problem statement&lt;/strong&gt; that frames:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why this problem matters now&lt;/li&gt;
&lt;li&gt;What success would look like (metrics, not feelings)&lt;/li&gt;
&lt;li&gt;What principles should guide solutions
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Align early and often
&lt;/h3&gt;

&lt;p&gt;Staff isn’t a solo act.&lt;br&gt;&lt;br&gt;
Before you design solutions, &lt;strong&gt;pull in stakeholders&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Talk to adjacent team leads and PMs&lt;/li&gt;
&lt;li&gt;Test your problem framing: &lt;em&gt;“If we solved this, would it change your outcomes?”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Surface objections early in 1:1s&lt;/li&gt;
&lt;li&gt;Recruit a pilot team who’s motivated to help prove it out&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Prove it with a thin slice
&lt;/h3&gt;

&lt;p&gt;Don’t try to fix everything at once.&lt;br&gt;&lt;br&gt;
Instead, create a &lt;strong&gt;reference implementation&lt;/strong&gt; or &lt;strong&gt;minimum viable paved road&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A working example, not just a slide deck&lt;/li&gt;
&lt;li&gt;Instrumentation to measure before/after impact&lt;/li&gt;
&lt;li&gt;Enough tooling/docs so, one team can adopt it quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Scale it into a system
&lt;/h3&gt;

&lt;p&gt;Once the thin slice works, &lt;strong&gt;make adoption easy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Templates and golden paths&lt;/li&gt;
&lt;li&gt;CI/CD checks or automation that enforce best practices&lt;/li&gt;
&lt;li&gt;Migration playbooks and office hours to support teams&lt;/li&gt;
&lt;li&gt;Clear docs and FAQs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal: the system succeeds without you constantly pushing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Make impact visible
&lt;/h3&gt;

&lt;p&gt;Staff work is only valuable if people see its outcomes.&lt;br&gt;&lt;br&gt;
Create a rhythm of &lt;strong&gt;visible reporting&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboards for reliability, cost, performance, or adoption&lt;/li&gt;
&lt;li&gt;Short monthly updates to stakeholders&lt;/li&gt;
&lt;li&gt;A quarterly “impact memo” that highlights wins, misses, and next bets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visibility not only proves value. It builds trust and opens doors for your next initiative.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Moving to Staff isn’t about &lt;em&gt;doing more&lt;/em&gt;.&lt;br&gt;
It’s about &lt;strong&gt;doing work that multiplies others&lt;/strong&gt; and proving it with artifacts and outcomes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A 30-60-90 Day Plan for Operating at Staff Level
&lt;/h2&gt;

&lt;p&gt;It’s one thing to understand what Staff engineers do.&lt;br&gt;&lt;br&gt;
It’s another to &lt;strong&gt;start practicing those behaviors deliberately&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;This 30-60-90 plan isn’t a magic shortcut to promotion. You won’t “become Staff” in three months.&lt;br&gt;&lt;br&gt;
But if you follow it, you’ll create visible artifacts, measurable outcomes, and habits that put you on the right trajectory.&lt;br&gt;&lt;br&gt;
Think of it as a &lt;strong&gt;prototype of operating at Staff level&lt;/strong&gt;, not a promise of a title change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Days 0–30: Define &amp;amp; Align
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Choose the right problem and make sure it matters to the organization.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identify one high-leverage problem.&lt;/strong&gt; Look for an issue that hurts multiple teams: recurring outages, high infra costs, broken onboarding, or slow release cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a 2-pager.&lt;/strong&gt; Frame the problem, why it matters now, success metrics, principles, non-goals, and risks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run stakeholder 1:1s.&lt;/strong&gt; Validate your framing with adjacent leads, PMs, and managers. Ask: &lt;em&gt;“If we solved this, would it change your outcomes?”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Align with your manager.&lt;/strong&gt; Make sure this work is recognized as Staff-level and not just a “side project.”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Days 31–60: Pilot &amp;amp; Prove
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Show that your idea works in practice, not just in theory.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build a thin slice.&lt;/strong&gt; Create a reference implementation, paved-road starter kit, or minimum viable tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a pilot.&lt;/strong&gt; Partner with one motivated team to adopt it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure before/after.&lt;/strong&gt; Latency dropped? Setup time cut in half? Incidents avoided? Capture the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share results early.&lt;/strong&gt; Publish a short memo or internal post showing outcomes and lessons. This creates momentum and credibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incorporate feedback.&lt;/strong&gt; Adjust the system based on real adoption pain points.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Days 61–90: Scale &amp;amp; Institutionalize
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Turn a one-off win into a repeatable system.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expand adoption.&lt;/strong&gt; Add docs, templates, CI checks, and migration playbooks so, multiple teams can use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it visible.&lt;/strong&gt; Create a simple dashboard and circulate monthly health/adoption metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable others.&lt;/strong&gt; Run brown-bags, host office hours, or publish internal blogs to spread knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a quarterly memo.&lt;/strong&gt; Summarize impact, show metrics, highlight who adopted it, and propose next bets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan succession.&lt;/strong&gt; Identify other engineers who can maintain or evolve the system so you can move on. Staff impact scales when systems outlive the creator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ A quick reality check
&lt;/h3&gt;

&lt;p&gt;This plan &lt;strong&gt;won’t automatically promote you to Staff in 90 days&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Most organizations require sustained evidence, often across 2–3 quarters, before recognizing Staff-level impact.  &lt;/p&gt;

&lt;p&gt;But by following this structure, you will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build the &lt;strong&gt;muscle memory&lt;/strong&gt; of operating beyond your team&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;tangible artifacts&lt;/strong&gt; that prove your impact&lt;/li&gt;
&lt;li&gt;Show leaders that you can think, act, and deliver like a Staff engineer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: you’ll stop waiting for the title to change and start &lt;strong&gt;living the role today&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The promotion will come as a lagging indicator of that consistent behavior.&lt;/p&gt;




&lt;p&gt;👉 By the end of 90 days, you’ll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tackled an org-level problem&lt;/li&gt;
&lt;li&gt;Created a working system, not just ideas&lt;/li&gt;
&lt;li&gt;Demonstrated measurable outcomes&lt;/li&gt;
&lt;li&gt;Made the impact visible to leaders&lt;/li&gt;
&lt;li&gt;Built momentum for your Staff-level promotion packet&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Metrics That Matter at Staff Level
&lt;/h2&gt;

&lt;p&gt;Staff engineers aren’t measured by how many tickets they close.&lt;br&gt;&lt;br&gt;
They’re measured by whether they improve the &lt;strong&gt;systems and outcomes that matter to the organization&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;The exact metrics will depend on your role and your company’s priorities, but they usually fall into a few families:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;: uptime, SLO attainment, incident recurrence, MTTR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: latency, throughput, customer-facing SLAs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Efficiency&lt;/strong&gt;: infra cost per request/user, budget variance, efficiency gains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality&lt;/strong&gt;: defect escape rate, change failure rate, deployment success rate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption&lt;/strong&gt;: % of teams using the new standard/tool, paved-road usage vs. custom paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User/Business Impact&lt;/strong&gt;: feature adoption, conversion, retention, time-to-first-success&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Tailor metrics to your context
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;platform/infrastructure roles&lt;/strong&gt;, reliability and cost efficiency dominate.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;product or frontend roles&lt;/strong&gt;, adoption and customer-facing performance matter more.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;data/ML roles&lt;/strong&gt;, freshness, correctness, and trust are key.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;developer relations roles&lt;/strong&gt;, Staff-level impact is measured less by &lt;em&gt;outputs&lt;/em&gt; (talks, blog posts, swag) and more by &lt;strong&gt;program-level outcomes&lt;/strong&gt;, such as:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Activation:&lt;/strong&gt; reduction in “time to first success” for new developers using the product (e.g., from 45 min -&amp;gt; 15 min).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption:&lt;/strong&gt; percentage of developers or teams actively using the SDK, API, or framework.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retention:&lt;/strong&gt; repeat usage of docs, samples, or community channels over time.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community scale:&lt;/strong&gt; number and quality of ambassador/advocate contributions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product influence:&lt;/strong&gt; roadmap changes that came directly from aggregated developer feedback.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The right metrics are the ones that connect your work to &lt;strong&gt;company outcomes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the Staff mindset: not “what did I deliver,” but “how did the org get better because of it?”&lt;/p&gt;




&lt;h2&gt;
  
  
  Building Your Promotion Packet
&lt;/h2&gt;

&lt;p&gt;A promotion packet isn’t a form you fill out at the last minute.&lt;br&gt;&lt;br&gt;
It’s the &lt;strong&gt;story of your impact&lt;/strong&gt;, backed by evidence, artifacts, and feedback that show you’ve been operating at Staff level consistently.&lt;/p&gt;

&lt;p&gt;Think of it as three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Collecting evidence along the way&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assembling it into a clear packet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using it in conversations with your manager for feedback and alignment&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Collecting Evidence Along the Way
&lt;/h3&gt;

&lt;p&gt;The biggest mistake engineers make is waiting until promotion season and scrambling to remember what they did.&lt;br&gt;&lt;br&gt;
Staff-level packets are strongest when you &lt;strong&gt;systematically collect proof over time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What to collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Artifacts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save strategy docs, RFCs, paved roads, dashboards, migration plans, and memos.&lt;/li&gt;
&lt;li&gt;Keep a personal archive (a folder, Notion doc, or Google Drive), don’t rely only on changing org wikis.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capture “before” baselines before you start.&lt;/li&gt;
&lt;li&gt;Record “after” results as soon as they’re visible.&lt;/li&gt;
&lt;li&gt;Keep screenshots or exports; dashboards evolve, but committees need fixed evidence.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Feedback &amp;amp; Testimonials&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask partner teams or managers for short notes after rollouts.&lt;/li&gt;
&lt;li&gt;Save Slack threads, emails, or comments that recognize impact.&lt;/li&gt;
&lt;li&gt;Example: &lt;em&gt;“This new CI pipeline cut our release failures in half.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Success Stories&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post short internal updates when something lands.&lt;/li&gt;
&lt;li&gt;Communicate impact and create a trail of proof.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;A simple &lt;strong&gt;evidence log&lt;/strong&gt; can keep this organized:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan&lt;/td&gt;
&lt;td&gt;RFC: New CI template&lt;/td&gt;
&lt;td&gt;Release failure rate cut 50%&lt;/td&gt;
&lt;td&gt;Build dashboard screenshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mar&lt;/td&gt;
&lt;td&gt;Migration playbook&lt;/td&gt;
&lt;td&gt;5 teams adopted in Q1&lt;/td&gt;
&lt;td&gt;Slack feedback from Team X lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apr&lt;/td&gt;
&lt;td&gt;Error budget policy&lt;/td&gt;
&lt;td&gt;Incidents reduced 6 -&amp;gt; 2/qtr&lt;/td&gt;
&lt;td&gt;Quarterly ops report&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Assembling the Packet
&lt;/h3&gt;

&lt;p&gt;When it’s time to prepare the packet, the goal is to &lt;strong&gt;make the story easy to understand at a glance&lt;/strong&gt;, with details available for anyone who wants to dig deeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-page summary (story at a glance):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: the org-level issue you tackled and why it mattered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outcomes&lt;/strong&gt;: before/after metrics that show impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifacts&lt;/strong&gt;: key strategy docs, RFCs, paved roads, dashboards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption&lt;/strong&gt;: which teams or orgs used your work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testimonials&lt;/strong&gt;: short quotes from peers or leaders outside your team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Appendix (the receipts):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links to the full artifacts: docs, repos, dashboards, memos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one-pager tells the &lt;strong&gt;narrative&lt;/strong&gt;; the appendix provides the &lt;strong&gt;evidence&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Having the Conversations
&lt;/h3&gt;

&lt;p&gt;A promotion packet isn’t just a submission. It’s a &lt;strong&gt;conversation tool&lt;/strong&gt; with your manager. The goal is to use it to get feedback and alignment long before the actual review cycle.&lt;/p&gt;

&lt;p&gt;Questions to ask your manager:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“If I aim for Staff, which org-level problems would have the most impact?”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Which metrics would prove I’m operating at that level here?”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Looking at my current packet draft, where do you see gaps?”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Who else should I involve or influence to show broader impact?”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It ensures you’re working on problems the organization actually values.&lt;/li&gt;
&lt;li&gt;It helps you avoid spending months on projects that won’t be recognized.&lt;/li&gt;
&lt;li&gt;It creates a shared definition of “Staff-level” for your role and company.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Would you be interested in a follow-up post on &lt;strong&gt;how to have effective promotion conversations with your manager&lt;/strong&gt;? Let me know. If enough people ask, I’ll write it up.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;The packet isn’t about proving you worked hard.&lt;br&gt;&lt;br&gt;
It’s about proving you &lt;strong&gt;changed the system so the entire org got better&lt;/strong&gt; and that you’ve been doing it consistently.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Note on Principal Level
&lt;/h2&gt;

&lt;p&gt;This article is focused on the transition from &lt;strong&gt;Senior -&amp;gt; Staff&lt;/strong&gt;, but it’s worth briefly touching on &lt;strong&gt;Principal&lt;/strong&gt; because many engineers wonder what comes next.&lt;/p&gt;

&lt;p&gt;Similarly to "Senior to Staff", Principal isn’t just “Staff, but bigger.” It’s another shift in scope and mindset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope:&lt;/strong&gt; Where Staff usually owns a &lt;em&gt;domain&lt;/em&gt; (a set of systems, a technical area, or a developer journey), Principal owns &lt;em&gt;multiple domains&lt;/em&gt; or an &lt;em&gt;entire function&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time horizon:&lt;/strong&gt; Staff plans quarters ahead; Principal sets multi-year direction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Influence:&lt;/strong&gt; Staff aligns teams; Principal aligns whole organizations, often including execs and cross-functional leadership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifacts:&lt;/strong&gt; Staff creates paved roads and domain strategies; Principals create company-wide technical visions, technology charters, and roadmaps that endure beyond a single product cycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact:&lt;/strong&gt; Staff makes the environment safer and faster for dozens of engineers; Principal raises the bar for the entire company.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why it matters even if you’re aiming for Staff
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understanding Principal helps you see &lt;strong&gt;how Staff fits into the bigger ladder&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Some behaviors (like shaping principles, influencing multiple orgs, or thinking in multi-year horizons) start small at Staff and expand at Principal.&lt;/li&gt;
&lt;li&gt;Knowing the basics helps you avoid confusing Staff deliverables with Principal expectations, or overshooting too early.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Principal isn’t the next checkbox after Staff.&lt;br&gt;&lt;br&gt;
It’s a different job with broader scope, longer horizons, and heavier influence.&lt;br&gt;
For now, focus on mastering Staff: solving cross-team problems, creating leverage, and proving outcomes.&lt;br&gt;
But keep Principal in mind as the &lt;em&gt;context&lt;/em&gt; for where the path can lead.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Self-Check: Are You Ready?
&lt;/h2&gt;

&lt;p&gt;Can you say “yes” to at least 8/12?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’m driving an org-level problem this quarter.&lt;/li&gt;
&lt;li&gt;There’s a visible dashboard for it.&lt;/li&gt;
&lt;li&gt;Another team uses my paved road without me.&lt;/li&gt;
&lt;li&gt;I’ve led a cross-team RFC to decision.&lt;/li&gt;
&lt;li&gt;My standard is enforced in CI/policy.&lt;/li&gt;
&lt;li&gt;I have before/after metrics tied to my work.&lt;/li&gt;
&lt;li&gt;Managers outside my team recognize me as DRI for the domain.&lt;/li&gt;
&lt;li&gt;I say no to low-leverage projects.&lt;/li&gt;
&lt;li&gt;I sponsor at least one engineer through my system.&lt;/li&gt;
&lt;li&gt;I publish quarterly memos.&lt;/li&gt;
&lt;li&gt;I’ve declined popular work and explained why.&lt;/li&gt;
&lt;li&gt;I have a succession plan for my system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; this isn’t a checklist to game. It’s a mirror to reflect on whether your work is &lt;strong&gt;multiplying others at scale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Moving from Senior to Staff isn’t about grinding harder or being the smartest person in the room.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;changing what you optimize for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From delivering features -&amp;gt; to shaping outcomes&lt;/li&gt;
&lt;li&gt;From personal output -&amp;gt; to organizational leverage&lt;/li&gt;
&lt;li&gt;From fixing problems -&amp;gt; to building systems that prevent them&lt;/li&gt;
&lt;li&gt;From mentoring one person -&amp;gt; to multiplying many&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The journey can feel uncomfortable because it asks you to let go of being the hero and start being the enabler. But that’s exactly what makes Staff engineers so valuable: they make everyone around them better.&lt;/p&gt;

&lt;p&gt;If you remember nothing else, remember this:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Staff engineers don’t measure success by what they deliver. They measure success by what the organization can deliver because of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start with one problem worth solving, create leverage, make it visible, and collect the evidence as you go. Do that consistently, and you won’t just earn the Staff title, you’ll already be living it.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>careerdevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Real Reasons Why Developers Burnout</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Tue, 30 Sep 2025 21:32:43 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/the-real-reasons-why-developers-burnout-4ce</link>
      <guid>https://forem.com/jcmartinezdev/the-real-reasons-why-developers-burnout-4ce</guid>
      <description>&lt;p&gt;Most people think that developer burnout comes from coding too much. But here's the truth: developers rarely burn out from writing code. They burn out from everything that prevents them from doing it well.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.linkedin.com/posts/jcmartinezdev_ive-never-seen-a-developer-burn-out-from-activity-7369375194538336256-mcVv" rel="noopener noreferrer"&gt;post I shared on LinkedIn&lt;/a&gt; that captured a lot of attention said something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ve never seen a developer burn out from ‘too much coding.’&lt;br&gt;
I’ve seen them burn out from:&lt;/p&gt;

&lt;p&gt;– unclear priorities&lt;/p&gt;

&lt;p&gt;– constant interruptions&lt;/p&gt;

&lt;p&gt;– politics&lt;/p&gt;

&lt;p&gt;Protecting focus isn’t selfish. It’s survival.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s dig into why this resonates with so many developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comfortable Myth About Developer Burnout
&lt;/h2&gt;

&lt;p&gt;When people outside tech hear “developer burnout,” they imagine a programmer glued to their chair for 14 hours a day, writing code until their eyes bleed. The tired stereotype of the overworked hacker.&lt;/p&gt;

&lt;p&gt;But that’s not what most of us experience.&lt;/p&gt;

&lt;p&gt;Developers don’t burn out because they get to spend &lt;em&gt;too much time coding&lt;/em&gt;. Coding is the fun part. It’s what we signed up for. Solving problems with code can be exhausting, sure, but it’s often deeply fulfilling.&lt;/p&gt;

&lt;p&gt;The truth is uglier: developers burn out because of the &lt;em&gt;system&lt;/em&gt; around coding, not the coding itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Burnout Triggers
&lt;/h2&gt;

&lt;p&gt;In two decades in this industry, I’ve seen the same culprits again and again. They’re not technical. They’re organizational.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Unclear priorities
&lt;/h3&gt;

&lt;p&gt;When everything is urgent, nothing is. Priorities change weekly or daily. You ship work that gets thrown away. You spend hours building features nobody uses. You never know if you’re working on the &lt;em&gt;right thing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The impact is subtle at first: you feel busy, but not productive. Over time, this disconnect kills motivation. Developers thrive on progress on seeing their work matter. When you remove that sense of direction, the work becomes a treadmill. Burnout follows.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Constant interruptions
&lt;/h3&gt;

&lt;p&gt;Slack pings. Calendar Tetris. A “quick sync” that turns into a 45-minute derail. Studies show it takes &lt;a href="https://www.researchgate.net/publication/221516226_No_Task_Left_Behind_Examining_the_Nature_of_Fragmented_Work" rel="noopener noreferrer"&gt;~23 minutes to recover from a single interruption&lt;/a&gt;. Now imagine 10 or of those in a day. You hardly get to work on anything at all.&lt;/p&gt;

&lt;p&gt;Interruptions don’t just waste time they destroy depth. Deep work is where complex problems get solved. It’s where creativity emerges. Without it, developers are stuck in the shallow end: fixing small bugs, answering questions, juggling tasks but never progressing on the hard, meaningful problems. That constant surfacenlevel thrashing leaves people exhausted and unfulfilled.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Politics
&lt;/h3&gt;

&lt;p&gt;Few things kill developer motivation like politics. Not office politics in the sitcom sense—&lt;em&gt;decision-making politics&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Features prioritized because an exec shouted loudest.&lt;/li&gt;
&lt;li&gt;Architectures chosen to please egos, not users.&lt;/li&gt;
&lt;li&gt;Credit claimed, blame shifted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s demoralizing to realize that merit doesn’t matter, that the best ideas aren’t heard, and that decisions have little to do with solving user problems. Developers want to make things better. Politics blocks that impulse and twists it into frustration. That’s when burnout sets in, not because the work is hard, but because it feels pointless.&lt;/p&gt;




&lt;h2&gt;
  
  
  Focus Isn’t Luxury. It’s Survival.
&lt;/h2&gt;

&lt;p&gt;Burnout doesn’t come from writing too much code. It comes from being prevented from writing it well.&lt;/p&gt;

&lt;p&gt;Focus is the oxygen of engineering. Take it away, and even the strongest developers suffocate. With it, small teams can move mountains.&lt;/p&gt;

&lt;p&gt;Yet in too many companies, focus is treated as a luxury. Something you fight to carve out between meetings and Slack messages. That’s backwards. Protecting focus should be as sacred as protecting uptime.&lt;/p&gt;

&lt;p&gt;If production goes down, everyone scrambles to fix it. If developer focus goes down, nobody notices, until the team is already burned out or bleeding attrition.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code Complexity vs. Context Chaos
&lt;/h2&gt;

&lt;p&gt;When developers talk about what drains them, the comparison often comes up: Is it code complexity or context chaos that wears you down more?&lt;/p&gt;

&lt;p&gt;Most agree, it’s context chaos.&lt;/p&gt;

&lt;p&gt;Here’s why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code complexity is frustrating&lt;/strong&gt;, but it’s fair. Complex systems have rules. The logic may be tangled, but it’s still logic. You can trace it, refactor it, add tests, improve it over time. There’s always a sense that progress is possible, that effort pays off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context chaos&lt;/strong&gt;, on the other hand, is unfair. It’s interruptions breaking your flow just as you’re making progress. It’s priorities shifting without explanation. It’s politics pushing the wrong projects forward. Unlike complex code, chaos doesn’t follow rules. You can’t debug it. You can’t refactor it. You can’t run a unit test to prove it works. Chaos steals energy without creating value.&lt;/p&gt;

&lt;p&gt;And here’s the kicker: chaos amplifies complexity. A messy codebase becomes ten times harder to deal with when you’re interrupted every 20 minutes. A tough architectural problem feels impossible when politics dictates half the decisions. Chaos doesn’t just compete with code it magnifies its pain.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That’s why so many developers report that chaos, not code, is what breaks them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Developers Can Protect Themselves From Burnout
&lt;/h2&gt;

&lt;p&gt;What can you do if you find yourself in one of these environments? Here are some survival tactics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Draw hard boundaries&lt;/strong&gt;. Protect blocks of time for deep work and defend them. Even two hours of uninterrupted coding can change your week.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make priorities visible&lt;/strong&gt;. If leadership won’t clarify, ask questions until they do. Push for written goals, not verbal fire drills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limit your context surface&lt;/strong&gt;. Turn off non-critical notifications. Decline meetings where your input isn’t essential. Shrink the number of doors chaos can enter through.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build allies&lt;/strong&gt;. Find teammates who also value focus. A united voice is harder to ignore than a single frustrated engineer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document the cost&lt;/strong&gt;. Track interruptions, shifting priorities, wasted work. Data can turn complaints into undeniable evidence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Know when to walk&lt;/strong&gt;. Sometimes the healthiest choice is leaving a culture that refuses to change. Protecting your energy is more important than any job.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because developers don’t burn out from coding. They burn out from being denied the space to code. And when the system won’t give you that space you have to learn how to carve it out yourself, or decide it’s time to move on.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
      <category>careerdevelopment</category>
    </item>
    <item>
      <title>What to Do When a Client Ends a Freelancing Relationship</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Wed, 12 Apr 2023 19:47:04 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/what-to-do-when-a-client-ends-a-freelancing-relationship-3g26</link>
      <guid>https://forem.com/jcmartinezdev/what-to-do-when-a-client-ends-a-freelancing-relationship-3g26</guid>
      <description>&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%2Flivecodestream.dev%2Fpost%2Fwhat-to-do-when-a-client-ends-a-freelancing-relationship%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_90216_600x0_resize_q90_h2_lanczos.webp" 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%2Flivecodestream.dev%2Fpost%2Fwhat-to-do-when-a-client-ends-a-freelancing-relationship%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_90216_600x0_resize_q90_h2_lanczos.webp" alt="Live Code Stream - Programming | Career | Freelancing" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ve all been there.&lt;/p&gt;

&lt;p&gt;You feel like freelancing is going great when, out of nowhere, you get that dreaded email, call, or text.&lt;/p&gt;

&lt;p&gt;A client ends their working relationship with you.&lt;/p&gt;

&lt;p&gt;Sometimes, giving little or no reason.&lt;/p&gt;

&lt;p&gt;One of the most difficult aspects of working as a freelancer is when a client ends the relationship.&lt;/p&gt;

&lt;p&gt;It’s personal because you’ve invested so much time and energy into working with them.&lt;/p&gt;

&lt;p&gt;It seems like they’re not just rejecting your work, they’re rejecting you. And that hurts.&lt;/p&gt;

&lt;p&gt;Whether it’s a long-term client whom you’ve worked with for years, or a brand new account that you looked to build a relationship and trust with, ending a client relationship can be both emotionally and professionally taxing.&lt;/p&gt;

&lt;p&gt;Although there is no one-size-fits-all approach to handling client break-ups, there are a few key things to keep in mind so that you don’t let it derail your freelancing journey.&lt;/p&gt;

&lt;p&gt;Here are four essential things to keep in mind when a client ends a relationship.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Don’t Burn Bridges 
&lt;/h2&gt;

&lt;p&gt;Not all client break-ups are amicable or go smoothly.&lt;/p&gt;

&lt;p&gt;You may be tempted to react unprofessionally, especially if a client ends the relationship abruptly or rudely.&lt;/p&gt;

&lt;p&gt;It’s only natural to get upset or be defensive.&lt;/p&gt;

&lt;p&gt;But even if you are disappointed or hurt by the end of the relationship, keep your emotions in check and take the high road.&lt;/p&gt;

&lt;p&gt;Don’t burn bridges.&lt;/p&gt;

&lt;p&gt;Professionalism and respect should always be your main focus, and this is especially important when parting ways with a client.&lt;/p&gt;

&lt;p&gt;You never know what may happen in the future.&lt;/p&gt;

&lt;p&gt;Just because a client has rejected your work or ended their working relationship with you in the present moment, they may change their mind in the future or decide that you are perfect for a different project.&lt;/p&gt;

&lt;p&gt;So, instead of allowing negative emotions to dictate your reaction, it’s important to take the time to acknowledge the decision and express your understanding and support.&lt;/p&gt;

&lt;p&gt;A client’s decision to end a business relationship should be respected, and you can show respect by thanking them for working with you.&lt;/p&gt;

&lt;p&gt;Let them know that you wish their decision was different and that you’re open to working with them in the future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The goal of this step is to leave the relationship on good terms.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Based on the wishes of both parties, you may not have a choice but to cut off communication entirely.&lt;/p&gt;

&lt;p&gt;Sometimes, &lt;a href="https://dev.to/post/handling-impossible-clients/"&gt;handling difficult clients&lt;/a&gt; necessitates cutting off all communication.&lt;/p&gt;

&lt;p&gt;However, if you can, take the opportunity to offer one final pleasant exchange with the client, whether it’s an email, a phone call, or even a face-to-face meeting if possible.&lt;/p&gt;

&lt;p&gt;Remain diplomatic and courteous to them throughout the process, as you want to leave a good impression.&lt;/p&gt;

&lt;p&gt;In addition, ensure that all the terms of your work contract are respected.&lt;/p&gt;

&lt;p&gt;Whether it’s refunds, payment arrangements, or any other agreement in the contract, each term should be followed in order to avoid any conflict.&lt;/p&gt;

&lt;p&gt;This also shows that you are respectful of your client’s decision and value their privacy.&lt;/p&gt;

&lt;p&gt;By acting professionally and courteously, you can leave a final, positive impression with a client, so even if they don’t return to work with you at a later time, they may recommend you to new clients. After all, building a positive freelancing reputation is a crucial part of &lt;a href="https://freelancing101fordevs.com/" rel="noopener noreferrer"&gt;Freelancing 101 for Devs&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Learn from the Experience 
&lt;/h2&gt;

&lt;p&gt;It’s easy to want to brush off the loss of a client, but before you do that it’s important to acknowledge it.&lt;/p&gt;

&lt;p&gt;Even though a relationship has ended, this doesn’t mean it was a total loss.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the perfect time to reflect and learn from the experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After all, every experience is an opportunity for personal and professional growth.&lt;/p&gt;

&lt;p&gt;Even if the relationship was not as successful as you had hoped, there are usually valuable lessons to be taken away.&lt;/p&gt;

&lt;p&gt;Take time to understand why the client left and what (if anything) could have been done differently on your end to keep them.&lt;/p&gt;

&lt;p&gt;If you haven’t already talked with them personally, reach out and get in touch with them.&lt;/p&gt;

&lt;p&gt;No one likes to hear about their shortcomings, but sometimes it takes an outsider to make us more aware of how we can improve.&lt;/p&gt;

&lt;p&gt;Ask them for any feedback that may be helpful in order to build better client relationships.&lt;/p&gt;

&lt;p&gt;Take the time to reflect on the process and consider any improvements you can make with other clients in the future.&lt;/p&gt;

&lt;p&gt;Using this experience as an opportunity to assess where you could have done better can help you avoid similar issues in the future.&lt;/p&gt;

&lt;p&gt;The end of a client relationship can be tough, but it is an inevitable part of any client-facing role.&lt;/p&gt;

&lt;p&gt;It’s simply a part of &lt;a href="https://dev.to/post/embracing-the-journey-as-a-freelancer/"&gt;embracing the journey as a freelancer&lt;/a&gt; that we all need to navigate.&lt;/p&gt;

&lt;p&gt;By following the steps outlined above, you will be able to handle the situation with grace and professionalism – while also learning valuable lessons in the process.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Re-Evaluate Your Support Systems 
&lt;/h2&gt;

&lt;p&gt;If you’ve recently lost a client, it can be a difficult experience, especially if it leads to financial strain.&lt;/p&gt;

&lt;p&gt;You may even have to consider necessary budget cutbacks, at least short-term.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So, it’s important to take steps to ensure that your business bounces back, as quickly as possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now may be the perfect time to step up your networking efforts.&lt;/p&gt;

&lt;p&gt;There are lots of &lt;a href="https://dev.to/post/tips-for-networking-as-a-freelancer/"&gt;tips for networking as a freelancer&lt;/a&gt; that can help you boost your career.&lt;/p&gt;

&lt;p&gt;Join industry associations, start attending industry events, add new contacts on LinkedIn, and leverage any existing relationships to spread the word about your business.&lt;/p&gt;

&lt;p&gt;If you’ve parted ways with a client on good terms, you may even incentivize them to spread the word or send referrals to you by offering discounts on future work.&lt;/p&gt;

&lt;p&gt;Also, losing a client is the first time some freelancers realize the &lt;a href="https://dev.to/post/the-importance-of-creating-multiple-streams-of-income-as-a-freelancer/"&gt;importance of creating multiple streams of income&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you haven’t already developed multiple income streams, there’s no better time to start!&lt;/p&gt;

&lt;p&gt;Multiple income streams are essential for long-term success and avoiding a financial catastrophe when you lose an important client.&lt;/p&gt;

&lt;p&gt;Creating multiple income streams can mean many things, like having several clients, doing varied work, or investing in different lines of business.&lt;/p&gt;

&lt;p&gt;Now may be the right time to explore new avenues of freelancing.&lt;/p&gt;

&lt;p&gt;Or learn new skills that you can add to your portfolio.&lt;/p&gt;

&lt;p&gt;Or reach out to form new client relationships.&lt;/p&gt;

&lt;p&gt;Whether it means adding new clients to your workload or adding to what you are able to offer your existing clients, focus on generating new income streams that will keep your business afloat.&lt;/p&gt;

&lt;p&gt;Re-evaluating what support systems you need to add or improve can make all the difference in how fast your freelancing career rebounds after losing a client.&lt;/p&gt;




&lt;h2&gt;
  
  
  Move On 
&lt;/h2&gt;

&lt;p&gt;Sometimes, jumping back into freelancing and trying to find new clients can feel a bit like jumping back into the dating scene.&lt;/p&gt;

&lt;p&gt;You might cringe just thinking about trying to move on with new clients.&lt;/p&gt;

&lt;p&gt;You might feel reluctant and even be tempted to give up.&lt;/p&gt;

&lt;p&gt;Don’t give up!&lt;/p&gt;

&lt;p&gt;Turning a disappointing or bad situation into a good one is part of &lt;a href="https://dev.to/post/pivoting-as-a-freelancer/"&gt;pivoting as a freelancer&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The most important factor to moving on is keeping a positive attitude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negativity will only work against you, so focus your energy on rebuilding and working toward your freelancing dream.&lt;/p&gt;

&lt;p&gt;Remember that dream? It’s not gone.&lt;/p&gt;

&lt;p&gt;You’ve faced difficulties in the past and persevered.&lt;/p&gt;

&lt;p&gt;You can do the same thing now.&lt;/p&gt;

&lt;p&gt;What you need is to create an action plan for moving forward.&lt;/p&gt;

&lt;p&gt;Part of that action plan is to &lt;a href="https://dev.to/post/freelancer-habits/"&gt;practice habits that will help you be successful as a freelancer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Habits may seem boring or confining, but habits can be comforting.&lt;/p&gt;

&lt;p&gt;Having steady habits to fall back on (especially when you don’t feel very motivated) will help you move on.&lt;/p&gt;

&lt;p&gt;Another part of that action plan is to refocus on the future and on your successful client relationships.&lt;/p&gt;

&lt;p&gt;Don’t dwell on the past, or on what “could-have-been” with a client that is gone. Your focus and energy should be spent on improving your relationships with clients you still have. You want to give them 100% of your efforts.&lt;/p&gt;

&lt;p&gt;By staying positive, you will be more ready to pivot from a bad situation and move on to bigger, and better, opportunities.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;When a client ends a relationship, it can be difficult and a little disappointing, but it can actually be one of the best experiences for your freelancing business.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can teach you to remain professional, respect terms, and reflect on the experience.&lt;/p&gt;

&lt;p&gt;It can help you make the most of the situation and use it as an opportunity to grow.&lt;/p&gt;

&lt;p&gt;It can remind you to re-evaluate your support systems and make sure your business is well-positioned for success.&lt;/p&gt;

&lt;p&gt;Most importantly, it can show you that you can move on from a bad experience and still realize the freelancing dreams you once had.&lt;/p&gt;

&lt;p&gt;With hard work and a positive attitude, you can get your business back on track in no time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>freelancing</category>
    </item>
    <item>
      <title>Most Common Ways to Make HTTP Requests in JavaScript</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Sun, 09 Apr 2023 21:32:12 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/most-common-ways-to-make-http-requests-in-javascript-21mc</link>
      <guid>https://forem.com/jcmartinezdev/most-common-ways-to-make-http-requests-in-javascript-21mc</guid>
      <description>&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%2Flivecodestream.dev%2Fpost%2Fhttp-requests-in-javascript%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_106557_600x0_resize_q90_h2_lanczos.webp" 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%2Flivecodestream.dev%2Fpost%2Fhttp-requests-in-javascript%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_106557_600x0_resize_q90_h2_lanczos.webp" alt="Live Code Stream - Programming | Career | Freelancing" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In modern web development, one of the most important aspects is the ability to communicate with servers and other resources to fetch or send data. HTTP (Hypertext Transfer Protocol) is the foundation of data communication on the World Wide Web, and it allows clients (such as web browsers) to request and receive data from servers. As a web developer, understanding how to make HTTP requests is essential for creating dynamic and interactive web applications.&lt;/p&gt;

&lt;p&gt;JavaScript, the most widely used programming language for client-side web development, provides several ways to make HTTP requests. These methods enable web applications to interact with servers, APIs, and other resources, facilitating the exchange of data in various formats, such as JSON, XML, or plain text.&lt;/p&gt;

&lt;p&gt;In this article, we will explore the most common ways to make HTTP requests in JavaScript, including XMLHttpRequest, Fetch API, Axios, and jQuery Ajax. We will discuss their usage, syntax, and advantages, as well as potential limitations and browser support. This knowledge will help you choose the most suitable method for your projects and expand your skillset as a web developer.&lt;/p&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;

&lt;p&gt;Useful tutorials, guides, and career tips for developers, delivered once a week.&lt;/p&gt;

&lt;p&gt;Subscribe and get a FREE copy of my book &lt;strong&gt;ten learning strategies&lt;/strong&gt;.&lt;/p&gt;


&lt;br&gt;
                    &lt;br&gt;
                        &lt;ul&gt;&lt;/ul&gt;
&lt;br&gt;
                        &lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                                    &lt;br&gt;
                                        &lt;br&gt;
                                            &lt;br&gt;
                                            &lt;br&gt;
                                        &lt;br&gt;
                                        &lt;span&gt;Sending...&lt;/span&gt;&lt;br&gt;
                                    &lt;br&gt;
                                    &lt;span&gt;&lt;br&gt;
                                        DOWNLOAD THE FREE EBOOK&lt;br&gt;
                                    &lt;/span&gt;&lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                        &lt;br&gt;
                    &lt;br&gt;
                


&lt;h2&gt;
  
  
  Fetch API 
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch" rel="noopener noreferrer"&gt;Fetch API&lt;/a&gt; is a modern and powerful alternative to XMLHttpRequest for making HTTP requests in JavaScript. Introduced as a native feature in modern browsers, the Fetch API is designed to be more concise, readable, and easier to use than its predecessor. It is built on top of the Promises API, which simplifies the process of handling asynchronous operations and managing complex workflows.&lt;/p&gt;

&lt;p&gt;One of the key advantages of the Fetch API is its native support for making requests outside the same-origin policy using CORS (Cross-Origin Resource Sharing). This enables web applications to interact with resources hosted on different domains more easily and securely.&lt;/p&gt;

&lt;p&gt;Following a promise-based syntax, we can use Fetch to send HTTP requests from the client-side, as this example shows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch("https://world.openfoodfacts.org/category/pastas/1.json")
  .then(response =&amp;gt; {
    // indicates whether the response is successful (status code 200-299) or not
    if (!response.ok) {
      throw new Error(`Request failed with status ${reponse.status}`)
    }
    return response.json()
  })
  .then(data =&amp;gt; {
    console.log(data.count)
    console.log(data.products)
  })
  .catch(error =&amp;gt; console.log(error))

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch significantly reduces the complexity and verboseness of the code with the use of simpler syntax and promises. In this implementation, we have to use the &lt;code&gt;response.ok&lt;/code&gt; field to check whether the response contains an HTTP error or not because the errors caught in the catch method belong to the network level, not the application level.&lt;/p&gt;

&lt;p&gt;The fetch method accepts a configuration object as the second parameter to allow easy manipulation of HTTP fields like headers, content-types, the request method, etc. You can find the complete list of configuration options Fetch supports in its &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/fetch" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Making POST requests with Fetch also follows a similar pattern to the previous example. Here, we use the config object to specify the request method and pass data that needs to be posted.&lt;/p&gt;

&lt;p&gt;Let’s try this implementation using async/await:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function postData () {
  const food = {
    name: "Bread",
    weight: 450,
    quantity: 3
  }

  const response = await fetch("/food", {
    method: "POST",
    body: JSON.stringify(food),
    headers: {
      "Content-Type": "application/json"
    }
  })

  if (!response.ok) {
    throw new Error(`Request failed with status ${reponse.status}`)
  }
  console.log("Request successful!")
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros of Fetch API 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modern, concise, and more readable syntax based on Promises, making it easier to use and understand compared to XMLHttpRequest.&lt;/li&gt;
&lt;li&gt;Native support for making requests outside the same-origin policy using CORS, which simplifies interactions with resources hosted on different domains.&lt;/li&gt;
&lt;li&gt;Built-in error handling with the catch method, allowing for improved error handling capabilities in web applications.&lt;/li&gt;
&lt;li&gt;Provides additional features over XMLHttpRequest such as integrating Request and Response objects with the native Cache API and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Request/mode" rel="noopener noreferrer"&gt;sending no-cors requests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Natively supported in modern browsers, eliminating the need for additional libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons of Fetch API 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lacks some useful features supported by XMLHttpRequest such as aborting a request and monitoring request progress. (However, it allows the use of a separate &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/AbortController" rel="noopener noreferrer"&gt;AbortController&lt;/a&gt; object to control request aborts and timeouts.)&lt;/li&gt;
&lt;li&gt;Accepts a response even when an HTTP error occurs. We have to manually check for HTTP errors and handle them.&lt;/li&gt;
&lt;li&gt;No built-in progress monitoring for requests, which can be useful for tracking the progress of large file uploads or downloads.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Axios 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/axios/axios" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; is a popular and widely used JavaScript library for making HTTP requests. It offers a simple, clean, and easy-to-use API based on Promises, making it an attractive choice for developers who prefer a more readable and concise syntax compared to XMLHttpRequest. Unlike the Fetch API, Axios works seamlessly in both browser and Node.js environments, making it a versatile solution for various types of projects.&lt;/p&gt;

&lt;p&gt;The library provides a range of advanced features and built-in functionality, such as error handling, request cancellation, and interceptors, which can be used to modify requests and responses globally or on a per-request basis. Additionally, Axios automatically transforms JSON data, simplifying the process of sending and receiving data in a common format.&lt;/p&gt;

&lt;p&gt;When making GET requests with Axios, we can use the dedicated &lt;code&gt;axios.get()&lt;/code&gt; method to compile the request. Here we’ve shown an example of the implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;axios.get("https://world.openfoodfacts.org/category/pastas/1.json")
  .then(response =&amp;gt; {
    // access parsed JSON response data using response.data field
    data = response.data
    console.log(data.count)
    console.log(data.products)
  })
  .catch(error =&amp;gt; {
    if (error.response) {
      //get HTTP error code
      console.log(error.reponse.status)
    } else {
      console.log(error.message)
    }
  })

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As this example shows, Axios reduces the amount of work we have to do on our end to make HTTP requests even compared to Fetch. It automatically parses the received JSON data, which we can access through response.data field. Axios also catches HTTP errors in its catch method, removing the need to specifically check for status code before processing the response. Inside the catch method, we can distinguish HTTP errors using an error.response check, which stores the HTTP error code.&lt;/p&gt;

&lt;p&gt;For sending POST requests with Axios, we use the dedicated &lt;code&gt;axios.post()&lt;/code&gt; method as the following example, implemented using async/await, shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function postData () {
  const food = {
    name: "Bread",
    weight: 450,
    quantity: 3
  }

  try {
    const response = await axios.post("/food", food)
    console.log("Request successful!")
  } catch (error) {
    if (error.response) {
      console.log(error.reponse.status)
    } else {
      console.log(error.message)
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, Axios simplifies this implementation by automatically converting Javascript objects to JSON without our interception. These Axios methods also accept a final parameter specifying HTTP configurations.&lt;/p&gt;

&lt;p&gt;Other than these basic features, Axios provides solutions for many unique use cases that we won’t discuss here. But if you want to dive deeper into working with Axios in Javascript as well as Node.js, you can follow this &lt;a href="https://livecodestream.dev/post/how-to-master-http-requests-with-axios/" rel="noopener noreferrer"&gt;in-depth guide to Axios&lt;/a&gt; on our blog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros of Axios 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easy-to-use and concise syntax based on Promises, offering a more readable and intuitive experience compared to XMLHttpRequest.&lt;/li&gt;
&lt;li&gt;Built-in support for error handling and request cancellation, which simplifies the process of managing complex requests and improving the user experience.&lt;/li&gt;
&lt;li&gt;Supports both browser and Node.js environments, making it a versatile solution for various types of projects and platforms.&lt;/li&gt;
&lt;li&gt;Provides useful features like interceptors for modifying requests and responses globally or on a per-request basis, and automatic JSON data transformation.&lt;/li&gt;
&lt;li&gt;Rejects on HTTP errors by default, making error handling more intuitive than the Fetch API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons of Axios 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requires an additional library to be added to your project, which can increase the overall size of the application.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  XMLHttpRequest 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest" rel="noopener noreferrer"&gt;XMLHttpRequest&lt;/a&gt; is a native API in Javascriptthat has been around since the early 2000s. It was initially developed by Microsoft and later adopted by other browsers. Although the name suggests that it is specifically designed for XML data, XMLHttpRequest can be used to request and handle a variety of data formats, such as JSON, HTML, and plain text.&lt;/p&gt;

&lt;p&gt;Over the years, XMLHttpRequest has become a fundamental building block for making asynchronous HTTP requests in web applications. However, its usage has somewhat declined with the introduction of more modern and easier-to-use alternatives, such as the Fetch API.&lt;/p&gt;

&lt;p&gt;Here’s how we can send GET requests and asynchronously retrieve data from a remote API using XMLHttpRequest API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//create XMLHttpRequest object
const xhr = new XMLHttpRequest()
//open a get request with the remote server URL
xhr.open("GET", "https://world.openfoodfacts.org/category/pastas/1.json")
//send the Http request
xhr.send()

//EVENT HANDLERS

//triggered when the response is completed
xhr.onload = function() {
  if (xhr.status === 200) {
    //parse JSON datax`x
    data = JSON.parse(xhr.responseText)
    console.log(data.count)
    console.log(data.products)
  } else if (xhr.status === 404) {
    console.log("No records found")
  }
}

//triggered when a network-level error occurs with the request
xhr.onerror = function() {
  console.log("Network error occurred")
}

//triggered periodically as the client receives data
//used to monitor the progress of the request
xhr.onprogress = function(e) {
  if (e.lengthComputable) {
    console.log(`${e.loaded} B of ${e.total} B loaded!`)
  } else {
    console.log(`${e.loaded} B loaded!`)
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As this example shows, the process of sending a GET request with XMLHttpRequest involves three steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create XMLHttpRequest&lt;/li&gt;
&lt;li&gt;Opening the HTTP request of the indented type&lt;/li&gt;
&lt;li&gt;Sending the request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the request is sent, we can use the event handlers provided by the XMLHttpObject to handle its response. Here, we have used two event handlers: &lt;code&gt;onload&lt;/code&gt;, &lt;code&gt;onerror&lt;/code&gt;, and &lt;code&gt;onprogress&lt;/code&gt;. It’s important to note here that onerror method only handles network-level errors related to the request. To identify HTTP errors, we have to check the HTTP status code inside the onload method specifically.&lt;/p&gt;

&lt;p&gt;We can send POST requests with XMLHttpRequest following a similar pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// create XMLHttpRequest object
const xhr = new XMLHttpRequest()
// open a POST request
xhr.open("POST", "/food")
// set content-type header to JSON
xhr.setRequestHeader("Content-Type", "application/json");
// send JSON data to the remote server
xhr.send(JSON.stringify(food))

// Event Handlers

// track data upload progress
xhr.upload.onprogress = function(e) {
  console.log(`${e.loaded}B of ${e.total}B uploaded!`)
}

// triggered when data upload is finished
xhr.upload.onload = function(e) {
  console.log("Upload completed")
}

// triggered when the response is fully received
xhr.onload = function() {
  console.log(xhr.status)
}

// triggered due to a network-level error
xhr.onerror = function() {
  console.log("Network error occurred")
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One main difference between the earlier GET and the current POST request is explicitly setting the content-type headers when posting JSON data. Also, there is an additional event type a POST request can trigger compared to a GET request. They are upload events accessed through the xhr.upload field. These event handlers help us track the data upload progress when the request body has to carry a significant amount of data (e.g., images, files, etc.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros of XMLHttpRequest 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Excellent browser support, including older browsers like Internet Explorer 7 and above.&lt;/li&gt;
&lt;li&gt;Removes the need for external dependencies.&lt;/li&gt;
&lt;li&gt;Ability to monitor the progress of a request using the readystatechange event.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons of XMLHttpRequest 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Verbose and less intuitive syntax compared to modern alternatives.&lt;/li&gt;
&lt;li&gt;No support for async/await or promise-based syntax.&lt;/li&gt;
&lt;li&gt;Lacks some advanced features and error handling capabilities found in newer APIs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  JQuery Ajax 
&lt;/h2&gt;

&lt;p&gt;jQuery is a widely used and popular JavaScript library that simplifies various aspects of web development, such as DOM manipulation, event handling, and animation. One of its powerful features is jQuery Ajax, which provides a simple and easy-to-use API for making asynchronous HTTP requests. jQuery Ajax has been a popular choice among web developers for many years due to its simplified syntax and ease of use compared to XMLHttpRequest.&lt;/p&gt;

&lt;p&gt;The jQuery Ajax API offers several advanced features and options, such as error handling, timeout settings, caching, and support for JSONP (JSON with Padding) to work around cross-domain request limitations. These features make it an attractive option for developers who are already using jQuery in their projects or prefer a more simplified approach to making HTTP requests.&lt;/p&gt;

&lt;p&gt;Though it is from the pre-framework (like React, angular, etc) era, it is still adopted by many websites, specially when working with platforms such as wordpress and templates.&lt;/p&gt;

&lt;p&gt;Let’s see an example of a GET request with jQuery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.ajax({
  url: 'https://world.openfoodfacts.org/category/pastas/1.json',
  method: 'GET',
  dataType: 'json',
  success: function(data) {
    // Handle the received data
    console.log(data);
  },
  error: function(xhr, status, error) {
    // Handle any errors
    console.error('Error: ' + status + ' - ' + error);
  }
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, you can have a post request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.ajax({
  url: 'https://world.openfoodfacts.org/category/pastas/1.json',
  method: 'POST',
  dataType: 'json',
  data: json,
  success: function(data) {
    // Handle the received data
    console.log(data);
  },
  error: function(xhr, status, error) {
    // Handle any errors
    console.error('Error: ' + status + ' - ' + error);
  }
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros of jQuery Ajax 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simplified syntax and ease of use, making it more accessible for developers compared to XMLHttpRequest.&lt;/li&gt;
&lt;li&gt;Provides advanced features and options like error handling, timeout settings, caching, and JSONP support for cross-domain requests, which can improve the overall user experience.&lt;/li&gt;
&lt;li&gt;Widely adopted and popular due to the extensive use of the jQuery library in the web development community, ensuring a wealth of resources and support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons of jQuery Ajax 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requires the inclusion of the jQuery library, which may not be needed for other parts of the project, adding extra weight and complexity to the application.&lt;/li&gt;
&lt;li&gt;Less relevant and less frequently used in modern web development due to the rise of alternative libraries and native APIs like Fetch and Axios, which offer similar functionality without the need for jQuery.&lt;/li&gt;
&lt;li&gt;Not as lightweight and performant as native APIs like Fetch or XMLHttpRequest, which might be a concern for performance-sensitive projects or applications targeting slow connections or limited resources.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ky 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/sindresorhus/ky" rel="noopener noreferrer"&gt;Ky&lt;/a&gt; is a relatively new Javascript package that can be used for making asynchronous HTTP requests from the front end of a web application. It’s built on top of the native Fetch API with a simpler syntax and additional functionality.&lt;/p&gt;

&lt;p&gt;Ky provides a simple syntax for making requests with its dedicated HTTP methods. Here’s an example of sending a GET request using Ky with async/await.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function getData () {
  try {
    const data = await ky.get("https://world.openfoodfacts.org/category/pastas/1.json").json()
    console.log(data.count)
    console.log(data.products)
  } catch (error) {
    if (error.response) {
      console.log(error.response.status)
    } else {
      console.log(error.message)
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can send POST requests following a similar pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function postData () {
  try {
    const response = await ky.post("/food", { json: food })
    console.log("Request successful!")
  } catch (error) {
    if (error.response) {
      console.log(error.reponse.status)
    } else {
      console.log(error.message)
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros of Ky 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gives a simple, lightweight, promise-based API for making HTTP requests.&lt;/li&gt;
&lt;li&gt;Addresses some limitations in the native Fetch API with support for features like request timeout, retry, and monitoring progress.&lt;/li&gt;
&lt;li&gt;Provides hooks for modifying requests during their lifecycle: beforeRequest, afterResponse, beforeRetry, etc.&lt;/li&gt;
&lt;li&gt;Supports all modern browsers like Chrome, Firefox, Safari. For Internet Explorer support, Ky provides an alternative package, &lt;a href="https://github.com/sindresorhus/ky-universal" rel="noopener noreferrer"&gt;Ky-Universal&lt;/a&gt;, not sure why they still bother.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons of Ky 
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Relatively a new package compared to other mature, versatile options discussed in this post. Adds an external dependency.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;n conclusion, there are several methods available for making HTTP requests in JavaScript, each with its own advantages and disadvantages. Choosing the right method for your project depends on various factors, such as browser support, ease of use, performance, and the specific requirements of your application.&lt;/p&gt;

&lt;p&gt;In this article we explored, XMLHttpRequest, Axios, Fetch API, jQuery Ajax, and Ky with examples, pros and cons. By now you should be able to evaluate the specific needs of your project, and choose the most suitable approach for making HTTP requests in JavaScript, ensuring efficient and responsive web applications with improved error handling and versatile functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: Nowadays I almost always go with Axios or FetchAPI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>Turning a Freelance Gig into a Long-Term Partnership</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Wed, 05 Apr 2023 12:50:32 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/turning-a-freelance-gig-into-a-long-term-partnership-1642</link>
      <guid>https://forem.com/jcmartinezdev/turning-a-freelance-gig-into-a-long-term-partnership-1642</guid>
      <description>&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%2Flivecodestream.dev%2Fpost%2Fturning-a-freelance-gig-into-a-long-term-partnership%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_89288_600x0_resize_q90_h2_lanczos.webp" 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%2Flivecodestream.dev%2Fpost%2Fturning-a-freelance-gig-into-a-long-term-partnership%2Ffeatured_hu4319d5ff4a4e9c05cba253c9f6e69f4d_89288_600x0_resize_q90_h2_lanczos.webp" alt="Live Code Stream - Programming | Career | Freelancing" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two types of freelancers.&lt;/p&gt;

&lt;p&gt;The first type views freelancing as a side-hustle. They still hold a 9-to-5 job and most of their time and energy goes into that career.&lt;/p&gt;

&lt;p&gt;But they also want a little more - more money, or more creative freedom, or more challenging work. So, they dabble in freelancing.&lt;/p&gt;

&lt;p&gt;The second type deep-dives into freelancing. They’ve left their 9-to-5 job and view freelancing as their new career.&lt;/p&gt;

&lt;p&gt;They also want more - but on a bigger scale. So, they’re all in.&lt;/p&gt;

&lt;p&gt;Both types usually start out in the same way. They’re trying to secure a freelancing gig, so they may take advantage of online freelancing platforms, or try to find freelancing opportunities through networking.&lt;/p&gt;

&lt;p&gt;Hopefully, they start to land some gigs. But it’s at this point that the two types go in different directions.&lt;/p&gt;

&lt;p&gt;For the part-time freelancer, gigs come and go. They take whatever they can get, whenever they can get it. They view gigs as short-term opportunities.&lt;/p&gt;

&lt;p&gt;But for the “all-in” freelancer, a gig isn’t just a one-time job or a short-term opportunity. They’re looking to establish connections with clients and create long-term opportunities.&lt;/p&gt;

&lt;p&gt;They want to know how to turn a freelancing gig into a long-term partnership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s the secret. Turning a freelancing gig into a long-term partnership is beneficial for both types of freelancers, and there are a few key ways to do it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, let me explain why it’s beneficial for both types of freelancers.&lt;/p&gt;

&lt;p&gt;Of course, the long-term freelancer sees the benefits because he wants to secure gigs that will keep generating income and help him grow his freelancing business.&lt;/p&gt;

&lt;p&gt;He knows the value of &lt;a href="https://dev.to/post/the-importance-of-creating-multiple-streams-of-income-as-a-freelancer/"&gt;creating multiple streams of income as a freelancer&lt;/a&gt;, especially if those streams keep flowing.&lt;/p&gt;

&lt;p&gt;Having a long-term partnership means more jobs, and more money, are coming in.&lt;/p&gt;

&lt;p&gt;As an added bonus, long-term clients are also more likely to recommend you among their networks, so this partnership can generate additional opportunities for you.&lt;/p&gt;

&lt;p&gt;Maybe you’re thinking, freelancing is just a side-hustle for me, and long-term partnerships would require too much from me.&lt;/p&gt;

&lt;p&gt;Let me explain how long-term partnerships can even benefit a part-time freelancer.&lt;/p&gt;

&lt;p&gt;If you’ve correctly turned a freelance gig into a long-term partnership, you’ve got a constant source and a sustainable stream of income from which you can supplement your side-hustle.&lt;/p&gt;

&lt;p&gt;You no longer have to go online looking for gigs, or filling out bids, or spending your precious time and energy networking.&lt;/p&gt;

&lt;p&gt;Additionally, your work becomes more efficient.&lt;/p&gt;

&lt;p&gt;One of the hardest parts about working with a new client is the process of figuring out what they want and how to communicate with them.&lt;/p&gt;

&lt;p&gt;Defining their design aesthetic, determining the best way to meet their needs, and learning what they really want when they ask you for something, are all hard to do at first.&lt;/p&gt;

&lt;p&gt;They take time, require extra effort, and often involve mistakes at first.&lt;/p&gt;

&lt;p&gt;But, once you’ve worked with a client for a few months, you can begin to anticipate their needs, develop the solutions they need quicker, and know what they want without asking.&lt;/p&gt;

&lt;p&gt;As a result, you deliver better results, move quicker, and make more money.&lt;/p&gt;

&lt;p&gt;So, long-term partnerships with even just a few clients can greatly benefit your freelancing business, whether you’re a part-time or all-in freelancer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real question becomes, How do I turn a freelance gig into this type of long-term partnership that benefits my freelancing business?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We all know that the freelance industry has become increasingly saturated, and it can be difficult to stand out and secure long-term freelance gigs.&lt;/p&gt;

&lt;p&gt;Here are a few key ways to successfully create this type of long-term partnership with a client.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Show Interest by Asking Questions 
&lt;/h2&gt;

&lt;p&gt;When you begin freelancing you are, of course, focused on your business. That’s natural.&lt;/p&gt;

&lt;p&gt;But, to really build a long-term partnership, you’ve got to shift your focus to the client.&lt;/p&gt;

&lt;p&gt;You have to understand the client’s business, needs, and motivation. You need to show that you are interested in really helping them achieve their long-term goals, not just delivering on a short-term gig.&lt;/p&gt;

&lt;p&gt;Understanding the long-term value of client relationships, instead of only focusing on immediate gain, is part of &lt;a href="https://dev.to/post/embracing-the-journey-as-a-freelancer/"&gt;embracing the journey as a freelancer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That means, you’ve got to ask questions. People love talking about themselves. Begin by finding some common interest so that you can connect with the client.&lt;/p&gt;

&lt;p&gt;Clients want to work with someone they like, someone they feel comfortable with, someone they feel connected to.&lt;/p&gt;

&lt;p&gt;At the most basic level, you can talk about how their business got started and where they see it heading. This will give you valuable information about whether or not this client relationship should be turned into a long-term partnership.&lt;/p&gt;

&lt;p&gt;Not all long-term partnerships will benefit you. By asking a few questions at the start, you can determine if this short-term gig is really something you want to develop into a long-term partnership.&lt;/p&gt;

&lt;p&gt;If it is, continue asking questions about what is important to them in this business. What struggles are they facing? What goals do they have?&lt;/p&gt;

&lt;p&gt;The more you understand about their business, the better chance you have of being able to offer them valuable services.&lt;/p&gt;

&lt;p&gt;A long-term partnership should be a mutually beneficial arrangement.&lt;/p&gt;

&lt;p&gt;When they see that you are really genuine and invested in trying to help them, they will want to continue working with you.&lt;/p&gt;

&lt;p&gt;It’s a win-win situation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Create Trust by following Through 
&lt;/h2&gt;

&lt;p&gt;Building a rapport with your client will create a sense of trust and show them that you value their business and are committed to the partnership.&lt;/p&gt;

&lt;p&gt;The worst thing you can do is botch the short-term project they’ve hired you for.&lt;/p&gt;

&lt;p&gt;Clients will only continue working with a freelancer they trust to follow through and deliver on time.&lt;/p&gt;

&lt;p&gt;Of course, things happen. Clients change the scope of a project or demand faster delivery. Or maybe you deliver exactly what they asked for, but they’re still not happy.&lt;/p&gt;

&lt;p&gt;That’s when effective communication skills are crucial.&lt;/p&gt;

&lt;p&gt;Trust is created through transparency and communication, as well as by following through on what you promise.&lt;/p&gt;

&lt;p&gt;In order to avoid an unhappy client, keep in touch regularly and communicate often. Keep them updated on the status of their project.&lt;/p&gt;

&lt;p&gt;Be honest about any set-backs and provide them with an updated timeline.&lt;/p&gt;

&lt;p&gt;Be sure to follow up with them if you haven’t heard from them in a while and always respond quickly to any queries or requests.&lt;/p&gt;

&lt;p&gt;These effective communication skills are one of the essential &lt;a href="https://dev.to/post/freelancer-habits/"&gt;habits to practice that will help you be successful as a freelancer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These days, it’s harder and harder to find someone whom you can really trust.&lt;/p&gt;

&lt;p&gt;If a client realizes that they can trust you to make things right and deliver, even through set-backs or unexpected changes, they will want to continue building a partnership with you.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Demonstrate Initiative by Thinking Ahead 
&lt;/h2&gt;

&lt;p&gt;The key to forming a long-term partnership is to go above and beyond the expectations of your client.&lt;/p&gt;

&lt;p&gt;This is one key &lt;a href="https://dev.to/post/tips-for-securing-high-paying-freelance-gigs/"&gt;tip for securing high-paying freelance gigs&lt;/a&gt; and turning those gigs into long-term partnerships.&lt;/p&gt;

&lt;p&gt;High-end clients are looking for a freelancer who offers more value for their business.&lt;/p&gt;

&lt;p&gt;Once you successfully deliver on a short-term gig, try offering to work on a trial project to showcase your skills.&lt;/p&gt;

&lt;p&gt;This allows you and your client to test the waters and assess if the partnership is a natural fit.&lt;/p&gt;

&lt;p&gt;During the process, demonstrate your creativity and flexibility, and showcase how you can tailor your services to their needs and provide valuable insights.&lt;/p&gt;

&lt;p&gt;For example, if a client asks you to write content for their website, and you notice the website isn’t tailored for mobile users, offer your expertise in web development to help them reach mobile users and generate more sales.&lt;/p&gt;

&lt;p&gt;Or maybe you realize that their systems could be updated and integrated more efficiently. Let them know that you’re happy to help them with this and explain the added value for their business.&lt;/p&gt;

&lt;p&gt;This is when truly understanding their business, because you asked the right questions in the beginning, pays off.&lt;/p&gt;

&lt;p&gt;If you’ve neglected to really get to know your client, you won’t be able to communicate how you can help them further, and you won’t be able to take the initiative to build a long-term partnership.&lt;/p&gt;

&lt;p&gt;Knowing your client well, thinking ahead, and offering effective solutions show that you take initiative.&lt;/p&gt;

&lt;p&gt;This type of initiative can set you apart from the scores of other freelancers competing for a client’s business.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Provide Value by Offering Excellence 
&lt;/h2&gt;

&lt;p&gt;This plays out in several ways.&lt;/p&gt;

&lt;p&gt;Of course this means handing over an excellent product to your client. High-end clients, especially, are paying premiums to get excellent results.&lt;/p&gt;

&lt;p&gt;But even smaller gigs deserve your best efforts. Excellence for every client is part of &lt;a href="https://freelancing101fordevs.com/" rel="noopener noreferrer"&gt;Freelancing 101 for Devs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This might mean not taking on more than you can handle. Realize when your time and energy are stretched to the limit, so that you don’t end up with too many projects that turn out to be sub-par.&lt;/p&gt;

&lt;p&gt;Prioritize which clients and projects are going to be beneficial for you in the long-term. Then, focus on providing them with excellence.&lt;/p&gt;

&lt;p&gt;Part of the value of working with you should be that clients receive excellent customer service. Make sure you are available and responsive to their needs.&lt;/p&gt;

&lt;p&gt;This doesn’t mean you can’t establish boundaries and routines to support your mental health and ensure your best output.&lt;/p&gt;

&lt;p&gt;But, understand that poor customer service is a problem everywhere. Clients have enough headaches.&lt;/p&gt;

&lt;p&gt;They aren’t going to be open to a long-term partnership with a freelancer who offers substandard customer service.&lt;/p&gt;

&lt;p&gt;In addition to excelling in your services and interactions, have a consistent pricing structure and ensure that you are providing value for their money.&lt;/p&gt;

&lt;p&gt;Offer great incentives to encourage your clients to remain loyal, such as offering discounts on one-off jobs or providing extras such as free consultations or resources that can benefit their business.&lt;/p&gt;

&lt;p&gt;You should also be open to changing or adapting your services as your client’s needs evolve.&lt;/p&gt;

&lt;p&gt;The bottom line is this: Is your work associated with excellence?&lt;/p&gt;

&lt;p&gt;Ask yourself, What do I need to do or change so that clients expect to get excellent value when working with me?&lt;/p&gt;

&lt;p&gt;Whatever the answer is, do it.&lt;/p&gt;

&lt;p&gt;Creating a culture of excellence is what will entice clients to turn a short-term gig into a long-term partnership with you.&lt;/p&gt;




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

&lt;p&gt;Finding and transforming a successful short-term freelance gig into a long-term partnership takes hard work, dedication, and excellence.&lt;/p&gt;

&lt;p&gt;It might take some time and practice to find the right gigs and clients who will be mutually beneficial in a long-term partnership.&lt;/p&gt;

&lt;p&gt;You’ll need to practice these four keys consistently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asking&lt;/strong&gt; questions to show interest in and learn about the client’s business,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Following&lt;/strong&gt; through so you earn the client’s trust,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking&lt;/strong&gt; ahead so you can solve the client’s problems and show initiative,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offering&lt;/strong&gt; excellence in a variety of ways so you can provide value to the client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether a part-time or full-time freelancer, if you do these things you will soon find that clients pursue working with you.&lt;/p&gt;

&lt;p&gt;And these successful long-term partnerships will help grow and sustain your business so that freelancing affords you the life you’ve always wanted.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>freelancing</category>
    </item>
    <item>
      <title>How to Fix: Error: Src Refspec Master Does Not Match Any in Git</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Tue, 28 Mar 2023 20:05:32 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/how-to-fix-error-src-refspec-master-does-not-match-any-in-git-1di4</link>
      <guid>https://forem.com/jcmartinezdev/how-to-fix-error-src-refspec-master-does-not-match-any-in-git-1di4</guid>
      <description>&lt;p&gt;If you’re a developer using Git, you’ve probably encountered the error message “src refspec master does not match any” at some point. This error can be frustrating and confusing, especially for beginners who are new to version control.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explain what this error message means common causes of the error and provide you with several solutions to help you fix it.&lt;/p&gt;

&lt;p&gt;If you have this exact error, naming the master branch in the error message and you want a quick attempt to fix it without reading any further, try: &lt;code&gt;git push origin main&lt;/code&gt;. If that doesn’t help, keep reading as this error can be caused by different reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Error Message 
&lt;/h2&gt;

&lt;p&gt;The error message “src refspec master does not match any” is usually caused by Git when pushing changes and not finding the master branch in your remote repository.&lt;/p&gt;

&lt;p&gt;The actual error can happen with any branch, and the branch will be highlithed in the error itself, “Error: src refspec {branch} does not match any”.&lt;/p&gt;

&lt;p&gt;This could be due to several reasons, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The branch name may be incorrect (e.g., it is called main).&lt;/li&gt;
&lt;li&gt;There may be no commits on the branch.&lt;/li&gt;
&lt;li&gt;The branch may have been deleted.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Fixes for the Error 
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Working on the Wrong Default Branch 
&lt;/h3&gt;

&lt;p&gt;This error happened a lot when we moved from using &lt;code&gt;master&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; as the default branch in most systems, for example, GitHub.&lt;/p&gt;

&lt;p&gt;Most local copies of projects were using the &lt;code&gt;master&lt;/code&gt; branch, but the repository default branch was renamed to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The best way to find out if your branch exists in the remote repository is by running &lt;code&gt;git branch -r&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -r

&amp;gt; result:
&amp;gt; origin/main
&amp;gt; origin/test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Knowing that the &lt;code&gt;master&lt;/code&gt; branch is missing in the remote we have two options forward. We either create and push the &lt;code&gt;master&lt;/code&gt; branch, or we switch to another branch, i.e.: &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To force the use of the master branch and fix the error, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b master
git push origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don’t want that, and instead use another branch, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are unaware of the name of the default branch, you can run &lt;code&gt;git show-ref&lt;/code&gt; to find it out.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Commints on the Branch 
&lt;/h3&gt;

&lt;p&gt;Another common reason why you may get: “Error: src refspec {branch} does not match any” when pushing in Git is that you haven’t made a single commit for the branch yet.&lt;/p&gt;

&lt;p&gt;This is easy to reproduce if you start with a new Git repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir git-test
cd git-test

git init

touch README.md
git add README.md

git remote add origin https://github.com/username/git-test.git
git push -u origin main

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After creating a new git repository with &lt;code&gt;git init&lt;/code&gt; and introducing some changes, we add the remote (notice that it doesn’t matter if the repo doesn’t exist) and we try to push, but in the process we forgot to commit the changes, so we receive the error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: src refspec main does not match any
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it was as expected. Commiting the changes and pushing again will work as it should.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure you commit your changes before trying to push!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To check if you have pending changes from commiting, you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To commit, after staging the changes with &lt;code&gt;git add&lt;/code&gt; run the following command and specify the commit message that you want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m "my first commit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices for Avoiding the Error 
&lt;/h2&gt;

&lt;p&gt;Here are some recommendations to prevent you from seeing “src refspec master does not match any” often:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Use the correct branch name: When pushing or pulling changes, make sure you’re using the correct branch name. If you’re not sure, use the git branch command to check which branch you’re on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit changes frequently: It’s always a good idea to commit changes frequently, especially if you’re working on a larger project. This helps you avoid having too many uncommitted changes and reduces the risk of encountering errors when pushing changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep your local and remote repositories in sync: To avoid errors, make sure you’re pulling changes regularly from the remote repository to keep your local repository up to date. Use the git pull command to update your local repository with the latest changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;In conclusion, the “src refspec master does not match any” error in Git can be a frustrating issue to encounter, especially if you’re new to version control. However, with the solutions we’ve provided in this article, you should be able to resolve the error and continue managing your code effectively and efficiently.&lt;/p&gt;

&lt;p&gt;Remember to always use the correct branch name, commit changes frequently, keep your local and remote repositories in sync, use descriptive commit messages, and use branches for experimental changes to avoid encountering this error in the future.&lt;/p&gt;

&lt;p&gt;By following these best practices, you can reduce the risk of encountering errors and ensure a smooth and streamlined workflow when working with Git. With proper version control, you can manage your code effectively and collaborate with others on your projects with confidence.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Must-Know JavaScript Array Methods</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Mon, 13 Feb 2023 21:00:36 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/must-know-javascript-array-methods-1haa</link>
      <guid>https://forem.com/jcmartinezdev/must-know-javascript-array-methods-1haa</guid>
      <description>&lt;p&gt;Arrays are one of the most powerful data structures in JavaScript and are helpful for all sorts of tasks. This blog post will discuss 15 array methods in detail so you can start using them immediately!&lt;/p&gt;

&lt;p&gt;If you are working with JavaScript, arrays are something you can’t avoid, so knowing these 15 JavaScript array methods is not only helpful, but it is a must, and they are often the subject of &lt;a href="https://livecodestream.dev/post/20-common-javascript-interview-questions/" rel="noopener noreferrer"&gt;interview questions&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are JavaScript Arrays? 
&lt;/h2&gt;

&lt;p&gt;A JavaScript array is a data structure that stores multiple values in a single variable. They are similar to other data structures, like lists and dictionaries, but they have some key differences. Arrays are ordered collections of items, so each item has an index. This index can be used to access or modify the items in the array.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create an Array 
&lt;/h2&gt;

&lt;p&gt;You can create an array in JavaScript using any of the following syntaxes:&lt;/p&gt;

&lt;p&gt;Create an array by encapsulating array elements in squared brackets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array_name = [item1, item2, ...];

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can start with an empty array and fill the array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array_name = [];
array_name[0]= item1;
array_name[1]= item2;
array_name[2]= ...;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can use the keyword &lt;code&gt;new&lt;/code&gt; with the array constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array_name = new Array(item1, item2, ...);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there are more clever and fun ways of doing that, but that will have to be for another article.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Are JavaScript Arrays So Good? 
&lt;/h2&gt;

&lt;p&gt;JavaScript arrays are powerful because they provide a lot of methods to manipulate data. These methods make it easy to perform everyday tasks, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding and removing elements from an array&lt;/li&gt;
&lt;li&gt;Searching for an element in an array&lt;/li&gt;
&lt;li&gt;Sorting the elements in an array&lt;/li&gt;
&lt;li&gt;Looping through an array&lt;/li&gt;
&lt;li&gt;Filtering an array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And much more!&lt;/p&gt;

&lt;p&gt;So, without further ado, let’s get started with the 15 must-know JavaScript array methods.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #1: Some() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;some()&lt;/code&gt; method tests whether at least one element in the array passes the test implemented by the provided function. It returns a Boolean value.&lt;/p&gt;

&lt;p&gt;This is how you use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.some(callback(element[, index[, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;some()&lt;/code&gt; method executes the callback function once for each element present in the array until it finds one where &lt;code&gt;callback&lt;/code&gt; returns a truthy value (a value that coerces to &lt;code&gt;true&lt;/code&gt;). It returns’ false’ if it doesn’t find such an array element.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const a = [1, 2, 3, 5, 8].some(item =&amp;gt; item &amp;gt; 5)
const b = [1, 2, 3, 4, 5].some(item =&amp;gt; item &amp;gt; 5)

console.log(a)
console.log(b)

---------
Output
---------
&amp;gt; true
&amp;gt; false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method #2: Every() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;every()&lt;/code&gt; method tests whether all elements in the array pass the test implemented by the provided function. It returns a Boolean value.&lt;/p&gt;

&lt;p&gt;This is how you use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.every(callback(element[, index[, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;every()&lt;/code&gt; method executes the callback function once for each array element until it finds one where &lt;code&gt;callback()&lt;/code&gt; returns a falsy value (a value that coerces to false). It returns &lt;code&gt;true&lt;/code&gt; if it doesn’t find such an array element.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const a = [10, 9, 8, 7, 6].every(item =&amp;gt; item &amp;gt; 5)
const b = [7, 6, 5].every(item =&amp;gt; item &amp;gt; 5)

console.log(a)
console.log(b)

---------
Output
---------
&amp;gt; true
&amp;gt; false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method #3: Reduce() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;reduce()&lt;/code&gt; method executes a reducer function (that you provide) on each array element, resulting in a single output value.&lt;/p&gt;

&lt;p&gt;The reducer function takes four arguments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;accumulator&lt;/li&gt;
&lt;li&gt;currentValue&lt;/li&gt;
&lt;li&gt;currentIndex&lt;/li&gt;
&lt;li&gt;array&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first time the &lt;code&gt;callback&lt;/code&gt; is called, &lt;code&gt;accumulator&lt;/code&gt; and &lt;code&gt;currentValue&lt;/code&gt; can be either the &lt;code&gt;initialValue&lt;/code&gt; if provided or the first array element if not.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.reduce(callback( accumulator, currentValue[, index[, array]] )[, initialValue])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How reduce() works 
&lt;/h3&gt;

&lt;p&gt;Let’s see with an example how &lt;code&gt;reduce()&lt;/code&gt; works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) =&amp;gt; accumulator + currentValue)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we go step by step and put in a table all the parameters plus the resulting value of the &lt;code&gt;callback&lt;/code&gt;, we would get the following:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;accumulator&lt;/th&gt;
&lt;th&gt;currentValue&lt;/th&gt;
&lt;th&gt;currentIndex&lt;/th&gt;
&lt;th&gt;array&lt;/th&gt;
&lt;th&gt;return value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the final result would be &lt;code&gt;10&lt;/code&gt;. In our particular case, I did not provide an initial value. Let’s try that next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const initialValue = 10
[0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) =&amp;gt; accumulator + currentValue, initialValue)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this new scenario, our table would like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;accumulator&lt;/th&gt;
&lt;th&gt;currentValue&lt;/th&gt;
&lt;th&gt;currentIndex&lt;/th&gt;
&lt;th&gt;array&lt;/th&gt;
&lt;th&gt;return value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;[0, 1, 2, 3, 4]&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the final resulting value is &lt;code&gt;20&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;reduce()&lt;/code&gt; function is great. It has several uses, like summing all the values of an array or in an object array, counting for particular items in the array, grouping objects, merging arrays contained in an array of objects, removing duplicates, etc.&lt;/p&gt;

&lt;p&gt;If you want to know more about &lt;code&gt;reduce()&lt;/code&gt; check our guide on &lt;a href="https://livecodestream.dev/post/javascript-reducer-a-simple-yet-powerful-array-method/" rel="noopener noreferrer"&gt;JavaScript reducer, a simple, yet powerful array method&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #4: Map() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;map()&lt;/code&gt; method creates a new array with the results of calling the provided function on each array element.&lt;/p&gt;

&lt;p&gt;The function takes three arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;currentValue&lt;/li&gt;
&lt;li&gt;index (optional)&lt;/li&gt;
&lt;li&gt;array (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order, the &lt;code&gt;map()&lt;/code&gt; method calls the provided function once for each element in an array. It does not execute the &lt;code&gt;callback&lt;/code&gt; on elements without values. The return value of the callback function is stored in the new array.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.map(callback( currentValue[, index[, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Always be careful when using &lt;code&gt;map()&lt;/code&gt;. Remember that for each element, JavaScript creates an array. If you don’t need the resulting array and want to iterate the array elements, use &lt;code&gt;forEach()&lt;/code&gt; or &lt;code&gt;for-of&lt;/code&gt; instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const numbers = [1, 2, 3, 4, 5]
const doubled = numbers.map(value =&amp;gt; value * 2)

console.log(doubled)

---------
Output
---------
&amp;gt; (5) [2, 4, 6, 8, 10]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we mentioned, &lt;code&gt;map()&lt;/code&gt; will create a new array, so the following is a consequence of that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const numbers = [1, 2, 3, 4, 5]
const numbers2 = numbers.map(value =&amp;gt; value)
console.log('numbers', numbers)
console.log('numbers2', numbers2)
console.log(numbers === numbers2)

---------
Output
---------
numbers (5) [1, 2, 3, 4, 5]
numbers2 (5) [1, 2, 3, 4, 5]
false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though each array contains the same elements, they are not the same reference. Thus the &lt;code&gt;numbers === numbers2&lt;/code&gt; resolves to false.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #5: Flat() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;flat()&lt;/code&gt; method creates a new array with all sub-array elements concatenated recursively up to the specified depth. The default depth is one.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr1 = [1, 2, [3, 4]]
console.log(arr1.flat())

const arr2 = [1, 2, [3, 4, [5, 6]]]
console.log(arr2.flat())

const arr3 = [1, 2, [3, 4, [5, 6]]]
console.log(arr3.flat(2))

const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
console.log(arr4.flat(Infinity))

---------
Output
---------
&amp;gt; (4) [1, 2, 3, 4]
&amp;gt; (5) [1, 2, 3, 4, Array(2)]
&amp;gt; (6) [1, 2, 3, 4, 5, 6]
&amp;gt; (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note that if we want to flatten all levels recursively, we can pass &lt;code&gt;Infinity&lt;/code&gt; as the function’s argument.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Method #6: Filter() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;filter()&lt;/code&gt; method creates a new array with all elements that pass the given test implemented by the provided function.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;filter()&lt;/code&gt; method does not mutate the original array but returns a new one.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.filter(callback(element[, index, [array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

function isPrime(num) {
 for (let i = 2; num &amp;gt; i; i++) {
  if (num % i == 0) {
   return false
  }
 }
 return num &amp;gt; 1
}

console.log(array.filter(isPrime))

---------
Output
---------
&amp;gt; (6) [2, 3, 5, 7, 11, 13]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the example above, we use a &lt;code&gt;filter()&lt;/code&gt; method with a callback function to test whether each element of an array is a prime number or not. The resulting new array only contains the elements of an array that are prime numbers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #7: ForEach() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;forEach()&lt;/code&gt; method executes the provided function once for all the elements in the array. It differs from the &lt;code&gt;map()&lt;/code&gt; method because it does not create a new array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array = [1, 2, 3, 4, 5]
array.forEach((item) =&amp;gt; console.log(item))

---------
Output
---------
1
2
3
4
5

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are two critical considerations when using &lt;code&gt;forEach()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no way to stop or break a &lt;code&gt;forEach()&lt;/code&gt; loop other than throwing an exception.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forEach()&lt;/code&gt; expects a synchronous &lt;code&gt;callback&lt;/code&gt;, it won’t wait for promises to be resolved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s see an example of the latter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let ratings = [5, 4, 5]
let sum = 0

let sumFunction = async function (a, b)
{
 return a + b
}

ratings.forEach(async function(rating) {
 sum = await sumFunction(sum, rating)
})

console.log(sum)

---------
Output
---------
0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected outcome for the above example would have been &lt;code&gt;14&lt;/code&gt;, but we got &lt;code&gt;0&lt;/code&gt; instead. The &lt;code&gt;forEach()&lt;/code&gt; array method did not await the promise, and the &lt;code&gt;console.log()&lt;/code&gt; statement was executed before the variable &lt;code&gt;sum&lt;/code&gt; was updated.&lt;/p&gt;

&lt;p&gt;If you want to know more about &lt;code&gt;forEach()&lt;/code&gt; check our guide on &lt;a href="https://livecodestream.dev/post/javascript-foreach-powered-array-for-loop/" rel="noopener noreferrer"&gt;looping arrays with JavaScript forEach&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #8: FindIndex() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;findIndex()&lt;/code&gt; method returns the index of the first element in an array that satisfies a given test function. Otherwise, it returns &lt;code&gt;-1&lt;/code&gt;. Unlike other methods, &lt;code&gt;findIndex()&lt;/code&gt; will execute the given function even for indexes with unassigned values.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.findIndex(callback( element[, index[, array]] )[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function isPrime(num) {
 for (let i = 2; num &amp;gt; i; i++) {
  if (num % i == 0) {
   return false
  }
 }
 return num &amp;gt; 1
}

console.log([4, 6, 8, 9, 12].findIndex(isPrime))
console.log([4, 6, 7, 9, 12].findIndex(isPrime))

---------
Output
---------
-1
2

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see from the example above, &lt;code&gt;findIndex()&lt;/code&gt; returns &lt;code&gt;-1&lt;/code&gt; if an array does not contain any prime numbers and the index of the first element that’s a prime number.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #9: Find() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;find()&lt;/code&gt; method returns the value of the first element in an array that satisfies a given test function. Otherwise, it returns &lt;code&gt;undefined&lt;/code&gt;. Note the difference with &lt;code&gt;findIndex()&lt;/code&gt;, where the element’s index is returned instead of the value.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.find(callback(element[, index[, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const inventory = [
 {name: 'apples', quantity: 2},
 {name: 'bananas', quantity: 0},
 {name: 'cherries', quantity: 5}
]

const result = inventory.find( ({ name }) =&amp;gt; name === 'cherries' )

console.log(result)

---------
Output
---------
&amp;gt; {name: "cherries", quantity: 5}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method #10: Sort() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;sort()&lt;/code&gt; method returns a new sorted array with the elements sorted in ascending order. When called with no arguments, the array is sorted alphabetically by converting each element to a string and comparing these strings using Unicode code point value.&lt;/p&gt;

&lt;p&gt;Sorting is among the most popular js array methods, yet it is sometimes misused, as it has a &lt;a href="https://philna.sh/blog/2019/08/26/how-not-to-sort-an-array-in-javascript/" rel="noopener noreferrer"&gt;few particularities&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const numbers = [4, 2, 5, 1, 3]
numbers.sort((a, b) =&amp;gt; a - b)
console.log(numbers)

---------
Output
---------
&amp;gt; (5) [1, 2, 3, 4, 5]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always remember that the sorting happens in place, so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const numbers = [4, 2, 5, 1, 3]
const numbers2 = numbers.sort((a, b) =&amp;gt; a - b)

console.log('numbers', numbers)
console.log('numbers2', numbers2)
console.log(numbers === numbers2)

---------
Output
---------
numbers &amp;gt; (5) [1, 2, 3, 4, 5]
numbers2 &amp;gt; (5) [1, 2, 3, 4, 5]
true

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sort function will modify the original array and return a reference to itself. Thus, the initial array and the returned array are the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #11: Concat() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;concat()&lt;/code&gt; method merges two or more arrays into a single javascript array. This method does not alter the original but returns a new array instance containing all the elements from both arrays.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const new_array = old_array.concat([value1[, value2[, ...[, valueN]]]])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const letters = ['a', 'b', 'c']
const numbers = [1, 2, 3]

console.log(letters.concat(numbers))

---------
Output
---------
&amp;gt; (6) ["a", "b", "c", 1, 2, 3]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method #12: Fill() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;fill()&lt;/code&gt; method sets all the elements in an array, from a start index to an end index, with a static value. It returns a new array object without altering the original one.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.fill(value[, start[, end]])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const original = [1, 2, 3]
const result = original.fill(4)
console.log('original', original)
console.log('result', result)
console.log(original === result)

---------
Output
---------
original &amp;gt; (3) [4, 4, 4]
result &amp;gt; (3) [4, 4, 4]
true

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method #13: Includes() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;includes()&lt;/code&gt; method returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; depending on whether a given value is present among the array elements. It is similar to the &lt;code&gt;indexOf()&lt;/code&gt; method, but instead of returning the index, it returns just a boolean indicating its presence in the array.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.includes(valueToFind[, fromIndex])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log([1, 2, 3].includes(2))
console.log([1, 2, 3].includes(4))

---------
Output
---------
true
false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note that includes is case-sensitive when dealing with strings.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Method #14: Reverse() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;reverse()&lt;/code&gt; method reverses an array &lt;strong&gt;in place&lt;/strong&gt;. By reversing, we mean that the function will transpose the elements of the array. The first element will become the last, and the last the first element.&lt;/p&gt;

&lt;p&gt;This operation will mutate the original array and return a reference to the same.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a.reverse()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log([1, 2, 3].reverse())

---------
Output
---------
&amp;gt; (3) [3, 2, 1]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical use case for &lt;code&gt;reverse()&lt;/code&gt; is, for example, if you have an array of comments and want to display them in reverse chronological order.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method #15: FlatMap() 
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;flatMap()&lt;/code&gt; method applies a function to each array element and then flattens the result into an array. It combines &lt;code&gt;flat()&lt;/code&gt; and &lt;code&gt;map()&lt;/code&gt; in one function.&lt;/p&gt;

&lt;p&gt;Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arr.flatMap(callback(currentValue[, index[, array]])[, thisArg])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array = [[1], [2], [3], [4], [5]]

const a = array.flatMap(arr =&amp;gt; arr * 10)

// With .flat() and .map()
const b = array.flat().map(arr =&amp;gt; arr * 10)

console.log('flatMap', a)
console.log('flat&amp;amp;map', b)

---------
Output
---------
flatMap (5) [10, 20, 30, 40, 50]
flatMap (5) [10, 20, 30, 40, 50]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bonus: Add and Remove Array Elements with Push() and Pop() and Shift() 
&lt;/h2&gt;

&lt;h3&gt;
  
  
  push() 
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;push()&lt;/code&gt; method adds one or more elements to the end of an array and returns the new length of the new array. It mutates the array in place. The elements are added one by one after the last array element, in the order in which they appear in the arguments list.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fruits = ["🍌", "🍊", "🍎"];
fruits.push("🥝", "🍋");
console.log(fruits); // output: ['🍌', '🍊', '🍎', '🥝', '🍋']

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  pop() 
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;pop()&lt;/code&gt; method removes the last array element and returns that removed element. It mutates the array in place.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fruits = ["🍌", "🍊", "🍎"];
const popped = fruits.pop(); // remove last element

console.log(fruits); // output: ['🍌', '🍊']
console.log(popped); // output: 🍎

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  shift() 
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;shift()&lt;/code&gt; method removes the first element from an array and returns that removed element. It mutates the array in place.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fruits = ["🍌", "🍊", "🍎"];
const shifted = fruits.shift(); // remove first array element

console.log(fruits); // output: ['🍊', '🍎']
console.log(shifted); // output: 🍌

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These methods are particularly useful when dealing with stacks or queues. A stack is a data structure that allows you to store and retrieve data in a last-in, first-out (LIFO) order. A queue is a data structure that allows you to store and retrieve data in a first-in, first-out (FIFO) order.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary 
&lt;/h2&gt;

&lt;p&gt;In this article, we have gone over the most important JavaScript array methods. Knowing them can save us some time and in some cases even boost the performance of our code.&lt;/p&gt;

&lt;p&gt;I hope that today you learned some new arr y methods, or refresh old concepts which you can use for your next project.&lt;/p&gt;

&lt;p&gt;Do you know any other interesting JavaScript array methods? Let me know in the comments below.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How to Clear Your NPM Cache?</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Wed, 08 Feb 2023 21:01:23 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/how-to-clear-your-npm-cache-379</link>
      <guid>https://forem.com/jcmartinezdev/how-to-clear-your-npm-cache-379</guid>
      <description>&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%2Flivecodestream.dev%2Fpost%2Fhow-to-clear-your-npm-cache%2Ffeatured_huc994e921612493fc973a3e15e9e74ad8_115262_600x0_resize_q90_h2_lanczos.webp" 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%2Flivecodestream.dev%2Fpost%2Fhow-to-clear-your-npm-cache%2Ffeatured_huc994e921612493fc973a3e15e9e74ad8_115262_600x0_resize_q90_h2_lanczos.webp" alt="Live Code Stream" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We all love NPM, right? It’s the go-to package manager for all our JavaScript projects, but sometimes a little maintenance is required. It’s possible over time, NPM can become clogged with packages and files that are no longer needed occupying space on your disk, or sometimes some of those files go rogue and corrupt the cache.&lt;/p&gt;

&lt;p&gt;When you need to, there’s an easy way to clean the NPM cache and in this article we will explain the why and how of cleaning up the NPM cache.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;if you are in a rush just run &lt;code&gt;npm cache clean --force&lt;/code&gt;, if not keep on reading to learn more.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Is the NPM Cache? 
&lt;/h2&gt;

&lt;p&gt;The NPM cache is a collection of packages stored on your computer used by the Node Package Manager when installing new packages. This cache helps speed up the installation process since it doesn’t need to download the same packages repeatedly. The cache also allows NPM to track what extensions, files, and packages your computer has installed.&lt;/p&gt;

&lt;p&gt;Unfortunately, this cache folder can get cluttered over time because NPM regularly updates old packages or installs new ones. This clutter can cause issues with installing new packages since it may not recognize what files are already installed on your machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should You Clean the NPM Cache? 
&lt;/h2&gt;

&lt;p&gt;Let me start by saying that it is not recommended to clean the NPM cache unless you are facing errors due to data corruption issues or simply trying to free up disk space. NPM is pretty good at handling the cache, and if something is odd, it will try to fix it automatically or let you know of any possible corruption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Clear the Npm Cache? 
&lt;/h2&gt;

&lt;p&gt;Here are a few reasons why you may want to clean up your NPM cache:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To free up disk space.&lt;/li&gt;
&lt;li&gt;To get rid of the “Please run npm cache clean” error.&lt;/li&gt;
&lt;li&gt;To fix libraries that didn’t download correctly.&lt;/li&gt;
&lt;li&gt;To reinstall libraries free of cache (not sure why you would, though).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Clean the NPM Cache? 
&lt;/h2&gt;

&lt;p&gt;Cleaning up the NPM cache is simple and only requires one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm cache clean --force  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will delete all the data stored in the NPM cache, including any outdated versions of packages. Note that it’s important to use the “–force” flag when running this command, as it ensures all data is deleted, even if there may be errors because of cache corruption or others.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Npm Cache Verify? 
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm cache verify&lt;/code&gt; is a command that verifies the integrity of all installed packages in the NPM cache. It verifies the contents of the cache folder, garbage collecting any unneeded data, and verifies the integrity of the cache index and all cached data.&lt;/p&gt;

&lt;p&gt;How to run it?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm cache verify

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Is Deleting the NPM Cache the Same as Deleting the Node_modules Folder? 
&lt;/h2&gt;

&lt;p&gt;No, deleting the NPM cache is different from removing your node_modules folder from your project. The NPM cache is global for your computer, whereas the node_modules folder is stored within each project. If you just remove the node_modules folder and install all packages again, you could still be getting those packages from the NPM cache, and cleaning the NPM cache, won’t affect your project’s libraries.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary 
&lt;/h2&gt;

&lt;p&gt;NPM cache is an important part of the NPM package manager that helps speed up installation processes and keeps track of what packages are installed on your machine. Cleaning the NPM cache can help free up disk space, fix corrupted libraries, and save you from running into “Please run npm cache clean” errors.&lt;/p&gt;

&lt;p&gt;It’s not recommended to clean the NPM cache unless you really have to, but if you ever need it, now you know how.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Importance of Creating Multiple Streams of Income as a Freelancer</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Wed, 01 Feb 2023 09:22:21 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/the-importance-of-creating-multiple-streams-of-income-as-a-freelancer-10cc</link>
      <guid>https://forem.com/jcmartinezdev/the-importance-of-creating-multiple-streams-of-income-as-a-freelancer-10cc</guid>
      <description>&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%2Fa9gnz7s1r46m5igybajg.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%2Fa9gnz7s1r46m5igybajg.jpg" alt="The Importance of Creating Multiple Streams of Income as a Freelancer" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every new freelancer has a vision of what freelancing will be like. This vision usually includes the optimal project and the perfect client, bringing in the right amount of money.&lt;/p&gt;

&lt;p&gt;And when you start, you will often only have one or two different income streams, usually coming from your first client. It could be a short-term web-design project. Or, it could be an ongoing support agreement with a business.&lt;/p&gt;

&lt;p&gt;This is great, but a freelancer who only has one client or one project isn’t a freelancer. They just have a part-time job. If this is all you want, that is fine.&lt;/p&gt;

&lt;p&gt;But, if you want to grow your business and make this freelancing life work for you, you soon realize that multiple income streams are essential for long-term success.&lt;/p&gt;

&lt;p&gt;Multiple income streams can mean many things, like having several clients, doing varied work, or investing in different lines of business.&lt;/p&gt;

&lt;p&gt;There’s a difference between a new freelancer specializing in web design and an experienced, diversified freelancer.&lt;/p&gt;

&lt;p&gt;The new freelancer has two monthly contracts to manage - hosting, providing simple site updates, and troubleshooting if something goes wrong. At $200/client, this is a great start.&lt;/p&gt;

&lt;p&gt;But this freelancer is in a precarious situation. What if one (or both) of the clients decides to go in another direction? What does the freelancer then do? How do they compensate for lost revenue? How do they gain more clients? How do they keep moving their business forward?&lt;/p&gt;

&lt;p&gt;In this article, I want to remind you why generating multiple income streams is essential for success as a freelancer and then explain how you can generate multiple income streams.&lt;/p&gt;

&lt;p&gt;So, why do you need multiple income streams to succeed at freelancing?&lt;/p&gt;

&lt;p&gt;Let me give you 5 reasons to consider:&lt;/p&gt;




&lt;h2&gt;
  
  
  You Gain Stability.
&lt;/h2&gt;

&lt;p&gt;Multiple income streams mean you have income flowing in from various avenues. So, if one avenue dries up, more money keeps flowing in. You are less vulnerable to periods of stagnation or economic instability.&lt;/p&gt;

&lt;p&gt;You have to remember that freelancing is an ever-changing business. Technology is always changing. Clients’ expectations are changing. The economy is changing. Jobs come and go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/post/pivoting-as-a-freelancer/"&gt;Pivoting as a freelancer&lt;/a&gt; is just the nature of the beast. And it’s easier to pivot when you have the financial backing to do so because you aren’t so vulnerable to slight industry changes or the whims of one client.&lt;/p&gt;

&lt;p&gt;Feeling financially stable is key to having peace of mind. You’ve left a reliable 9-to-5 job with paid vacation days, sick days, and a steady paycheck for the unpredictable world of freelancing.&lt;/p&gt;

&lt;p&gt;So you have to create the financial stability you once enjoyed by diversifying and creating multiple income streams. There is nothing quite as valuable as your peace of mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Enjoy Freedom.
&lt;/h2&gt;

&lt;p&gt;Along with peace of mind, the financial stability of multiple income streams allows you to enjoy more freedom.&lt;/p&gt;

&lt;p&gt;No one is paying you for sick days. No one is giving you permission to take a paid vacation. You are in charge of your own time and time off.&lt;/p&gt;

&lt;p&gt;If you have created many and varied ways to make money, you can afford to take time off.&lt;/p&gt;

&lt;p&gt;When your child gets sick, you can take care of him without worrying that you’re not actively creating money because you have already set up avenues to continue making money, even when you’re not frantically working at your computer.&lt;/p&gt;

&lt;p&gt;When you need a mental health break, you can afford to take a vacation or put work on hold to prioritize your well-being because you know that the money will keep flowing in through multiple contracts you’ve acquired.&lt;/p&gt;

&lt;p&gt;Freelancing is awesome because it can afford you the freedom you crave if you’ve set up your freelancing effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Have Greater Control. 
&lt;/h2&gt;

&lt;p&gt;Because you’re not solely reliant on one client, project, or gig, you have greater control over what clients you want to work with, what projects you want to work on, and how you want to work.&lt;/p&gt;

&lt;p&gt;The more varied your income streams are, the more control you have over your freelancing business. You can spread the revenue you generate across multiple projects, clients, and services.&lt;/p&gt;

&lt;p&gt;You can afford to say no to the &lt;a href="https://dev.to/post/client-types/"&gt;types of client&lt;/a&gt; who aren’t a good match for you.&lt;/p&gt;

&lt;p&gt;You can pick and choose which projects are really worth your time and effort.&lt;/p&gt;

&lt;p&gt;You can decide in which direction you want your freelancing business to go.&lt;/p&gt;

&lt;p&gt;You aren’t constrained because you’re too worried about losing valuable income or losing your only client. Multiple streams of income allow you to invest your time, talent, and resources in ways that will realize the freelancing vision you have.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Realize More Opportunities.
&lt;/h2&gt;

&lt;p&gt;The reality is that the more you diversify and create varied income streams, the more opportunities come your way. It’s sort of like the “snowball effect.”&lt;/p&gt;

&lt;p&gt;As you take on more clients, your name and reputation spreads to new clients. You gain those valuable referrals.&lt;/p&gt;

&lt;p&gt;As you diversify your services, you attract more businesses and clients who need those services.&lt;/p&gt;

&lt;p&gt;As you increase your visibility, you can expand your networking and forge potential partnerships with promising revenue.&lt;/p&gt;

&lt;p&gt;Soon, new opportunities are coming your way, along with new income streams. Your freelancing business and your bottom line are growing.&lt;/p&gt;

&lt;p&gt;Suddenly, you can free up time and resources to explore new avenues of freelancing, gain new skills and experience, and set yourself up for success.&lt;/p&gt;

&lt;p&gt;You can even take some calculated risks you wouldn’t have dared with limited resources or income streams.&lt;/p&gt;

&lt;p&gt;This leads me to why you should have multiple income streams.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Experience Growth.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/share?url=https%3a%2f%2flivecodestream.dev%2fpost%2fthe-importance-of-creating-multiple-streams-of-income-as-a-freelancer%2f&amp;amp;text=%22You%20need%20multiple%20income%20streams%20to%20effectively%20grow%20your%20business.=%22&amp;amp;via=livecodestream" rel="noopener noreferrer"&gt;You need multiple income streams to effectively grow your business.&lt;/a&gt;&lt;a href="http://twitter.com/share?url=https%3a%2f%2flivecodestream.dev%2fpost%2fthe-importance-of-creating-multiple-streams-of-income-as-a-freelancer%2f&amp;amp;text=%22You%20need%20multiple%20income%20streams%20to%20effectively%20grow%20your%20business.%22&amp;amp;via=livecodestream" rel="noopener noreferrer"&gt;Tweet this&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You need to decide your end goals. You need to decide if you are actively trying to grow a business that will support the lifestyle you envision.&lt;/p&gt;

&lt;p&gt;If you’re just supplementing your 9-to-5 income, then maybe focusing on one client or project at a time works for you. And that’s great.&lt;/p&gt;

&lt;p&gt;But if you’re looking to leave the 9-to-5 grind behind and create a new life through freelancing, consistent and dependable growth is key to making that new life happen. And multiple income streams are the key to making growth happen.&lt;/p&gt;

&lt;p&gt;So, now that we understand why it’s so important to create multiple streams of income, we come to this question:&lt;/p&gt;




&lt;h2&gt;
  
  
  How Do You Successfully Create Multiple Income Streams?
&lt;/h2&gt;

&lt;p&gt;Again, let me give you four suggestions:&lt;/p&gt;

&lt;h3&gt;
  
  
  The simplest solution is to add more clients.
&lt;/h3&gt;

&lt;p&gt;Adding additional clients usually requires no new skills, but it does require the knowledge and effort needed to generate leads and referrals.&lt;/p&gt;

&lt;p&gt;If you’ve been with a client for some time and it seems to be going well for both of you, don’t be shy in letting them know you are growing your business and in asking them to refer you.&lt;/p&gt;

&lt;p&gt;Word of mouth is one of the best recommendations you can have, and you can incentivize existing clients to recommend you by offering a one-time discount for every new client they bring your way.&lt;/p&gt;

&lt;p&gt;Usually, your work will speak for itself. People are always networking. Happy clients will spread the word about the value that you bring to their business.&lt;/p&gt;

&lt;p&gt;When new clients contact you, be ready to take them on so that you can begin to add to your income streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diversify your services
&lt;/h3&gt;

&lt;p&gt;As a freelancer, you have quite some flexibility in which areas you expand your services; if you are doing web development and you have design skills, you can bundle those in the package or sell them as individual services. Or perhaps you have experience and like writing content that can be an excellent addition to your portfolio.&lt;/p&gt;

&lt;p&gt;Broadening your services can help you diversify your income streams and generate a more stable and future-proof business, but be careful to overdo it and lose focus on what your real goal as a freelancer is.&lt;/p&gt;

&lt;p&gt;If you would like some ideas for inspiration, check out my article on side gigs to make money as a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consulting
&lt;/h3&gt;

&lt;p&gt;Consulting is an excellent way to increase your income without handling the full project. You will provide advice or feedback in a certain area of expertise, and that’s it. This keeps your workload manageable while still allowing you to help others and get compensated for it.&lt;/p&gt;

&lt;p&gt;Consulting can be very rewarding since you are paid for your knowledge and experience. It’s a great way to start building relationships with potential clients and exploring new opportunities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provide tech support/digital integration.
&lt;/h3&gt;

&lt;p&gt;More and more of every business requires the integration of different tools and platforms, which are always changing and improving.&lt;/p&gt;

&lt;p&gt;Inventory management connects to online ordering, connects to POS systems, connects to automated postage services, etc.&lt;/p&gt;

&lt;p&gt;Many business owners don’t have the time or knowledge to link these pieces together and streamline their business.&lt;/p&gt;

&lt;p&gt;Especially when working with a client doing web consultations or web-design, you could offer additional services around building and maintaining interconnected frameworks, and business processes.&lt;/p&gt;

&lt;p&gt;Time is money, right? Explain how this service will add value to their business by automating essential components that will run without them having to think about it. They’ll be more willing to pay you if you can show them how you can save them valuable time and a lot of headaches.&lt;/p&gt;




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

&lt;p&gt;Diversification and creating multiple revenue streams are essential for continued growth, peace of mind, and stability as a freelancer.&lt;/p&gt;

&lt;p&gt;To create varied streams of reliable income, you may need to expand your client base, learn marketable skills, or offer new services.&lt;/p&gt;

&lt;p&gt;But the growing pains are worth it when you begin to experience the freedom of a successful freelancing career that affords you the lifestyle you’ve always dreamed of.&lt;/p&gt;

&lt;p&gt;Generating and maintaining multiple income streams is the key to securing this freedom.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodestream.dev/newsletter/" rel="noopener noreferrer"&gt;Subscribe to my weekly newsletter&lt;/a&gt; for developers and builders and get a weekly email with relevant content.&lt;/p&gt;

</description>
      <category>careeradvice</category>
      <category>freelancing</category>
    </item>
    <item>
      <title>The Types of Clients You’ll Get</title>
      <dc:creator>Juan Cruz Martinez</dc:creator>
      <pubDate>Sun, 29 Jan 2023 22:04:04 +0000</pubDate>
      <link>https://forem.com/jcmartinezdev/the-types-of-clients-youll-get-11gm</link>
      <guid>https://forem.com/jcmartinezdev/the-types-of-clients-youll-get-11gm</guid>
      <description>&lt;p&gt;&lt;a href="https://bajcmartinez.medium.com/the-types-of-clients-youll-get-c2ecdbbab784?source=rss-46b6f430560f------2" 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%2F3cklfyer2wlvw9tjgs3u.jpeg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn about the seven types of customers you may encounter in your professional life and how to work with them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bajcmartinez.medium.com/the-types-of-clients-youll-get-c2ecdbbab784?source=rss-46b6f430560f------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>freelancingtips</category>
      <category>saas</category>
      <category>freelancing</category>
      <category>business</category>
    </item>
  </channel>
</rss>
