<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Junior Felix</title>
    <description>The latest articles on DEV Community by Junior Felix (@jrfelix).</description>
    <link>https://dev.to/jrfelix</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%2F1350436%2F45997e7a-b1b9-4507-bbbf-b73a15850119.png</url>
      <title>DEV Community: Junior Felix</title>
      <link>https://dev.to/jrfelix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jrfelix"/>
    <language>en</language>
    <item>
      <title>The Discourse Around React Server Components</title>
      <dc:creator>Junior Felix</dc:creator>
      <pubDate>Thu, 14 Mar 2024 11:26:53 +0000</pubDate>
      <link>https://dev.to/jrfelix/the-discourse-around-react-server-components-glo</link>
      <guid>https://dev.to/jrfelix/the-discourse-around-react-server-components-glo</guid>
      <description>&lt;p&gt;On December 21, 2020, an &lt;a href="https://github.com/reactjs/rfcs/pull/188" rel="noopener noreferrer"&gt;RFC&lt;/a&gt; was published in ReactJs that started the React Server Components discussion. This RFC was accompanied by a &lt;a href="https://www.youtube.com/watch?v=TQQPAU21ZUw" rel="noopener noreferrer"&gt;YouTube video&lt;/a&gt; that detailed an implementation that would allow ReactJs developers to ship zero bundle-sized components. The bundle size issue frequently arises when React applications face performance issues. Consequently, over the years, the react community has developed strategies such as tree shaking, minification, code-splitting and lazy loading to reduce bundle size.&lt;/p&gt;

&lt;p&gt;Despite solving a significant problem, React Server Components have received mixed reactions from the ReactJs community. To get a clearer picture of this discourse, let us start with an understanding of React Server Components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding React Server Components
&lt;/h2&gt;

&lt;p&gt;As the name suggests, RSCs are React Components that run exclusively on the server.&lt;/p&gt;

&lt;p&gt;During ReactJs's early years, Client Side Rendering (CSR) was the norm. Consequently, when a browser visited a website built with ReactJs, it would receive an HTML file that resembled this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/static/js/bundle.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bundle.js file would contain all the rendering logic and include all the ReactJs code that had been written. Upon receiving the bundle.js file, the browser would parse the JavaScript and show the intended content to the user.&lt;/p&gt;

&lt;p&gt;The problem that came with this approach is that as the application grew in complexity, the bundle size also increased. Consequently, users are likely to experience longer loading times; which is a negative in user experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1694293302575%2F273b0a2d-5600-45d8-a2c7-1ef51561eb60.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1694293302575%2F273b0a2d-5600-45d8-a2c7-1ef51561eb60.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's take a closer look at an example of a React Server Component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ItemsPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-api-url/items/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Available&lt;/span&gt; &lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/article&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Itemspage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this instance, the data fetching is carried out on the server and the corresponding HTML is generated. The browser receives an HTML document without the JavaScript that was used in its creation.&lt;/p&gt;

&lt;p&gt;Additionally, since this component is on the server, it has direct access to the server's database and filesystem.&lt;/p&gt;

&lt;p&gt;Apart from reduced bundle size, server components offer the following benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved data fetching&lt;/strong&gt;: By moving data fetching to the server, the amount of network requests the client has to make is reduced significantly. Moreover, fetching data in this manner reduces the need for loading states and data query libraries; which simplifies the developer experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt;: As rendering occurs on the server, the resulting HTML and assets can be cached and reused when a similar request is received. This is significantly better than re-rendering on each request; resulting in better performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improves First Contentful Paint(&lt;/strong&gt;&lt;a href="https://web.dev/fcp/" rel="noopener noreferrer"&gt;&lt;strong&gt;FCP&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;) metric&lt;/strong&gt;: Since HTML is generated on the server, the client does not have to download and parse JavaScript before rendering. Consequently, initial load time is shortened; thus resulting in a better user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community Adoption and Response
&lt;/h2&gt;

&lt;p&gt;Currently, it is not advisable to use React Server Components with React only as a library in production. Instead, React meta-frameworks are highly recommended. Among those frameworks, NextJs has emerged as the top advocate for RSCs.&lt;/p&gt;

&lt;p&gt;It is important to note that other alternatives such as &lt;a href="https://github.com/dai-shi/waku" rel="noopener noreferrer"&gt;Waku&lt;/a&gt; and &lt;a href="https://github.com/cyco130/vite-rsc" rel="noopener noreferrer"&gt;Vite RSC Experiments&lt;/a&gt; implement RSCs. For a simple implementation, the &lt;a href="https://github.com/bholmesdev/simple-rsc" rel="noopener noreferrer"&gt;simple rsc repository&lt;/a&gt; would suffice.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Server Components in NextJs
&lt;/h3&gt;

&lt;p&gt;Vercel went all in on RSCs in their NextJs 13 rollout. They developed the &lt;a href="https://nextjs.org/docs/app" rel="noopener noreferrer"&gt;App Router&lt;/a&gt; that is built on RSCs which provides support for features such as parallel routes, intercepting routes, layouts, loading states and error handling. Additionally, Vercel strongly recommends using the app router when building applications with NextJs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community Response
&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, the React Server Components have received mixed reactions. On one hand, we have RSC adopters who are experiencing its intended benefits. For instance, the team behind &lt;a href="https://github.com/dbt-labs/dbt-docs" rel="noopener noreferrer"&gt;dbt docs&lt;/a&gt; was able to reduce page load time from 4.5s to 220ms and memory storage from 350 MB to 16 MB, as detailed &lt;a href="https://dagster.io/blog/dbt-docs-on-react" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the other hand, there seems to be a lot of frustration in the ReactJs community. Some of the concerns voiced in this frustration include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Added Complexity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1694634293165%2Ff30002c6-0a75-444d-9c25-daaff21b39f7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1694634293165%2Ff30002c6-0a75-444d-9c25-daaff21b39f7.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sauce: &lt;a href="https://x.com/MelkeyDev/status/1655620353601974274?s=20" rel="noopener noreferrer"&gt;https://x.com/MelkeyDev/status/1655620353601974274?s=20&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a significant number of ReactJs developers, server components introduce added complexity to the development of ReactJs applications. Before server components, the decision of whether a component should be server-side or client-side wasn't a factor to consider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limited Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Currently, apart from the basic implementation of React Server Components and NextJs documentation, there is inadequate documentation around RSC. The Next.js documentation is well-written; however, it's confined in scope as it primarily caters to individuals utilizing Next.js. Therefore, changes brought by RSC are likely to leave library maintainers at a disadvantage. This is further elaborated in &lt;a href="https://phryneas.de/react-server-components-controversy" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; by &lt;a href="https://phryneas.de/" rel="noopener noreferrer"&gt;Lenz Weber-Tronic&lt;/a&gt;, a co-maintainer of Redux Toolkit and TypeScript Apollo Client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RSC Makes Library Maintenance Harder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since React Server Components run exclusively on the server, libraries have to accommodate the server context during development. Moreover, development features such as React Context and hooks such as useState are not available; hence libraries are likely to experience errors when used with server components.&lt;/p&gt;

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

&lt;p&gt;Despite React Server Components being touted as the future, it is important to note that they don't work for every ReactJs application. At the end of the day, the goal is to provide a better user/developer experience and RSC are just a tool to get there. Therefore, it would be wise to consider if they are a good fit for the application you are building before going all in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;p&gt;Here are some resources that helped me understand server components better:&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.joshwcomeau.com/react/server-components/#introduction-to-react-server-components-3" rel="noopener noreferrer"&gt;https://www.joshwcomeau.com/react/server-components/#introduction-to-react-server-components-3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mux.com/blog/what-are-react-server-components" rel="noopener noreferrer"&gt;https://www.mux.com/blog/what-are-react-server-components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Repositories That Use RSC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/SashenJayathilaka/Airbnb-Build" rel="noopener noreferrer"&gt;https://github.com/SashenJayathilaka/Airbnb-Build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sadmann7/skateshop" rel="noopener noreferrer"&gt;https://github.com/sadmann7/skateshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joschan21/breadit" rel="noopener noreferrer"&gt;https://github.com/joschan21/breadit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://thisweekinreact.com/" rel="noopener noreferrer"&gt;This Week In React&lt;/a&gt; is a great resource that keeps readers up to date with what's happening in&lt;br&gt;
      the ReactJs developer community. Kindly consider subscribing!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Revisiting GraphQL in 2023</title>
      <dc:creator>Junior Felix</dc:creator>
      <pubDate>Thu, 14 Mar 2024 11:23:25 +0000</pubDate>
      <link>https://dev.to/jrfelix/revisiting-graphql-in-2023-220e</link>
      <guid>https://dev.to/jrfelix/revisiting-graphql-in-2023-220e</guid>
      <description>&lt;p&gt;I first interacted with GraphQL in late 2019 in the &lt;a href="https://github.com/saleor/saleor" rel="noopener noreferrer"&gt;Saleor open source project&lt;/a&gt;. At the time, it had a lot of hype around it because it came from Meta(formerly Facebook), whose engineering team had open-sourced called ReactJs. I remember finding GraphQL fascinating because the principles that inspired seemed solid and it offered solutions to problems that using REST posed. Moreover, GraphQL was adopted by companies such as Airbnb and Github which gave it legitimacy as a viable alternative to REST.&lt;/p&gt;

&lt;p&gt;In this article, I am going to explore the current state of GraphQL, considering its evolution since my first experience with it. To accomplish this, we are going to start with a brief introduction of GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792569047%2F6aa57d8f-9c65-4a3d-963a-14933d127786.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792569047%2F6aa57d8f-9c65-4a3d-963a-14933d127786.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An Introduction of GraphQL
&lt;/h2&gt;

&lt;p&gt;GraphQL is a query language for APIs that empowers clients to ask for exactly what they need from pre-existing data sources. According to &lt;a href="https://en.wikipedia.org/wiki/GraphQL" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;, Meta (formerly Facebook) commenced development of GraphQL in 2012 and used it internally until it was released as open source in 2015. At the time, Meta encountered limitations of the REST and thus came up with GraphQL to address these shortcomings, as outlined &lt;a href="https://engineering.fb.com/2015/09/14/core-data/graphql-a-data-query-language/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Some of these bottlenecks are as follows:&lt;/p&gt;

&lt;h3&gt;
  
  
  Over-fetching/Under-fetching of Data
&lt;/h3&gt;

&lt;p&gt;Let’s say you’re building a user profile page in your web application and you only need the username and email of the user. Using the REST approach, you would need to perform a GET request to the &lt;code&gt;/user/&amp;lt;id&amp;gt;&lt;/code&gt; endpoint that would return a result that resembles the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"randomIdFffs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chaduser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gigachad@ayahoo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-15-05 23:04:42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;..&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this scenario, the client does not need the other fields apart from username and email; thus resulting in over-fetching. While this might not noticeably impact performance in a small application, it becomes problematic in a larger application. Over-fetching can lead to increased response times and unnecessary bandwidth consumption, negatively affecting the overall user experience. On the other hand, GraphQL clients can specify the exact data they need; thus avoiding the overfetching problem. Using the above scenario, we can structure our query to only fetch username as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;query&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;User(id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"randomIdFffs"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;username&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By performing the above query, you will retrieve only the "username" and "email" properties of the user.&lt;/p&gt;

&lt;p&gt;Using the same analogy, let’s say we want to display a user’s posts on the user profile age, including the post titles and descriptions. The current API request (a GET request to &lt;code&gt;/users/&amp;lt;id&amp;gt;&lt;/code&gt;) does not provide us with the additional information we need. To implement this feature, we would need to make another GET request, thus showcasing the under-fetching problem of using REST APIs. In contrast, GraphQL allows you to get all the data you need in one query. The above scenario can be executed as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple Endpoints
&lt;/h3&gt;

&lt;p&gt;When working with REST APIs, the use of multiple endpoints can be a pain in large-scale applications. Let’s say we are building a blog website and we need to display each of our posts in their own pages. To accomplish this, we may need three endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/posts/&amp;lt;id&amp;gt;&lt;/code&gt; to retrieve post content.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/users/&amp;lt;id&amp;gt;&lt;/code&gt; to retrieve author information.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/posts/&amp;lt;postId&amp;gt;/comments&lt;/code&gt; to retrieve post comments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using this approach would result in multiple round trips; just to retrieve a single blog post; thus showing the inefficiency that comes with the REST methodology. Moreover, additional client-side logic would be needed to ensure that the data is retrieved in the right sequence.&lt;/p&gt;

&lt;p&gt;On the other hand, GraphQL facilitates the querying of multiple resources from a single endpoint; thus eliminating the drawbacks that come with multiple endpoints. Additionally, the need for multiple round trips to the server is eliminated since all this information can be retrieved with one request.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Versioning
&lt;/h3&gt;

&lt;p&gt;In REST APIs, it is common practice to version APIs whenever a breaking change is introduced. Consequently, we may end up having multiple versions of the same API; thus leading to more work since we need to maintain the aforementioned versions.&lt;/p&gt;

&lt;p&gt;For instance, let’s say we are renaming the &lt;code&gt;username&lt;/code&gt; property in our user entity to &lt;code&gt;name&lt;/code&gt;. To ensure that our API consumers’ applications don’t break, we may introduce a new version such as &lt;code&gt;/api/v1/users&lt;/code&gt; or &lt;code&gt;/api/users?version=2&lt;/code&gt; depending on our versioning strategy. In GraphQL, there’s more flexibility when it comes to introducing changes to APIs. Using the aforementioned analogy, we may choose to deprecate the field that we are changing instead of removing it completely while introducing the new field. By using this method, the API consumer can incrementally update their schema while maintaining backward compatibility. An example of this can be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;oldField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;deprecated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;oldField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deprecated&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="err"&gt;."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;newField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;deprecatedField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;deprecated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moreover, GraphQL has introspection abilities that allow a client to explore the schema as it is being updated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Under-Documented APIs
&lt;/h3&gt;

&lt;p&gt;In some cases, REST APIs lack consistent and adequate documentation; hence making it difficult for API consumers to effectively utilize the APIs. While tools like &lt;a href="https://www.npmjs.com/package/@airtasker/spot" rel="noopener noreferrer"&gt;Spot&lt;/a&gt; can be utilized to document APIs, regularly updating the APIs can introduce additional overhead in terms of API maintenance.&lt;/p&gt;

&lt;p&gt;On the other hand, GraphQL leverages its introspection capabilities to provide a well-defined schema with detailed field-level documentation. Moreover, GraphQL tools such as GraphiQL and GraphQL playground provide an interactive IDE where one can explore the schema, run queries, and view documentation on the fly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Current State of GraphQL
&lt;/h2&gt;

&lt;p&gt;Evaluating the current state of a specific technology can be challenging as there is often a lack of consensus on the criteria to use. However, I shall take upon this challenge while exploring the following factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer surveys&lt;/li&gt;
&lt;li&gt;Case Studies&lt;/li&gt;
&lt;li&gt;VC Funding&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Surveys
&lt;/h3&gt;

&lt;p&gt;To gauge the level of interest in GraphQL, I am going to depend on statistics from the following sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/" rel="noopener noreferrer"&gt;Postman’s state of the API Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stateofjs.com/en-us/" rel="noopener noreferrer"&gt;State of JavaScript Developer Survey Reports&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postman’s State of the API Report&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The annual State of the API report provides key information regarding the API development landscape; which includes GraphQL interest levels over the last few years. Under the category “Future technologies”, survey respondents were asked about the technologies they were most excited to use. From 2018 to 2022, GraphQL managed to be among the top 5 technologies mentioned with the following trajectory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693791900177%2Fb582c4b3-fb57-4a37-9898-5bf82c9b8abf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693791900177%2Fb582c4b3-fb57-4a37-9898-5bf82c9b8abf.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on the graph, it is evident that GraphQL peaked in interest in 2019, receiving a significant interest level of 36.9% from the survey respondents. It is also important to note that there has not been an extreme increase or decrease in its numbers over the years.&lt;/p&gt;

&lt;p&gt;Under the category “Architectural style”, data from 2020 to 2022 was available and revealed the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693791972546%2F5a27f2a0-4b27-4ea9-ba57-6640c85a938a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693791972546%2F5a27f2a0-4b27-4ea9-ba57-6640c85a938a.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GraphQL was also listed among the API specifications used by respondents in the survey's "Specifications" section, and the numbers were as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792013528%2F7a4613a8-c5e2-4c2a-b10c-d21a9db927ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792013528%2F7a4613a8-c5e2-4c2a-b10c-d21a9db927ce.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The statistics on both API specifications and architectural styles indicate that GraphQL is being utilized in API development. However, it doesn't show a significant wave suggesting that it is completely overtaking the industry. At the same time, we do not see a sharp decline in its use that would suggest that GraphQL is “dying”.&lt;/p&gt;

&lt;p&gt;The sources for all the above data are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/2018/" rel="noopener noreferrer"&gt;Postman State of the API Report 2018&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/2019/" rel="noopener noreferrer"&gt;Postman State of the API Report 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/2020/" rel="noopener noreferrer"&gt;Postman State of the API Report 2020&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/2021/" rel="noopener noreferrer"&gt;Postman State of the API Report 2021&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/2022/" rel="noopener noreferrer"&gt;Postman State of the API Report 2022&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;State of JavaScript Surveys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we dive into the numbers, it is important to acknowledge the caveats that come with the State of JavaScript survey as compared to Postman’s State of the API survey. Firstly, it's important to note that the pool of respondents for this survey is limited to JavaScript developers, unlike Postman's surveys which typically gather responses from developers of various programming languages.&lt;/p&gt;

&lt;p&gt;Furthermore, JavaScript developers are generally more likely to be familiar with GraphQL since it was originally developed by Meta, the same company that created ReactJS. Additionally, the State of JavaScript opted to remove GraphQL statistics from its survey in 2021 as it seemed out of place. Luckily, we still have numbers from 2016 to 2020. In the data layer section of these surveys, GraphQL statistics were as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792242443%2Fa690f818-a8f2-47e9-8d8b-c0a096ad4259.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792242443%2Fa690f818-a8f2-47e9-8d8b-c0a096ad4259.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://2020.stateofjs.com/en-US/technologies/datalayer/" rel="noopener noreferrer"&gt;The State of JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From these numbers, we can infer that GraphQL has been gradually gaining popularity over the years among JavaScript developers. This can be attributed from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The declining number of respondents who’ve never heard of GraphQL; from 36.6% in 2016 to 2.3% in 2020.&lt;/li&gt;
&lt;li&gt;The growing number of respondents who are interested in GraphQL (combining both those who’ve used it and those who wish to learn); from 50% in 2016 to 88.1%.&lt;/li&gt;
&lt;li&gt;The declining number of respondents who would not use GraphQL; from 13.8% in 2016 to 6.8%.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Case Studies of GraphQL Adoption
&lt;/h3&gt;

&lt;p&gt;Various industry leaders have publicly endorsed and documented their adoption journeys with GraphQL. Analyzing these experiences reveals comparable challenges to those encountered by Meta, as previously discussed in the introduction. To get a clearer picture, let’s explore two specific adoption journeys: Cousera’s and Paypal’s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coursera’s Adoption Journey&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before adopting GraphQL, Coursera implemented a “resource-based” approach in the development of the API infrastructure (meaning an API for courses, another one for instructors, grades, and so on). Consequently, the number of APIs grew over time which led to issues such as multiple server round trips, maintaining documentation, and performance issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coursera’s Initial Implementation Process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially, the Coursera engineering team opted to add a GraphQL layer that integrates the pre-existing REST APIs. In this implementation, the core business logic did not live in GraphQL itself but in the underlying services. This approach can be better understood through the following diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792327860%2F40809468-52ab-4b59-b161-846bda8243ae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1693792327860%2F40809468-52ab-4b59-b161-846bda8243ae.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This implementation had the following key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It consisted of a single GraphQL layer that acted as a proxy between incoming requests and the underlying services.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/coursera/naptime" rel="noopener noreferrer"&gt;Naptime&lt;/a&gt; and &lt;a href="https://github.com/sangria-graphql/sangria" rel="noopener noreferrer"&gt;Sangria&lt;/a&gt; were used to generate a unified GraphQL schema.&lt;/li&gt;
&lt;li&gt;Teams could retain ownership over their individual services.&lt;/li&gt;
&lt;li&gt;It was easier to integrate pre-existing services into the GraphQL schema.&lt;/li&gt;
&lt;li&gt;Changes could only be previewed in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The setup’s flexibility empowered Coursera’s engineering team to successfully realize their goal of enabling clients to define the structure of the data they want from the API. Furthermore, they managed to achieve this without a complete overhaul of their existing infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current State of GraphQL at Coursera&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since its first implementation of GraphQL, Coursera has been re-evaluating its GraphQL approach as challenges arise. Initially, they had adopted a data-first approach, prioritizing the client’s retrieval of necessary data from the API over the schema’s quality. Consequently, the schema grew to encompass over 7000 GraphQL types, increasing the likelihood of duplication within these types. Moreover, the inability to preview changes from underlying services prompted testing them in production, which is not an ideal practice.&lt;/p&gt;

&lt;p&gt;To address these challenges, Coursera is actively moving towards a schema-first approach that will prioritize schema quality over its quantity. This strategic shift aims to fully leverage the benefits offered by GraphQL. More on this can be found &lt;a href="https://medium.com/coursera-engineering/evolving-the-graph-4c587a4ad9a8" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paypal’s Adoption Journey&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PayPal began its GraphQL adoption by overhauling their &lt;a href="https://www.paypal.com/us/business/accept-payments/checkout/integration" rel="noopener noreferrer"&gt;checkout application&lt;/a&gt; to use GraphQL, prompted by the limitations they encountered while using REST. These constraints include overfetching/underfetching of data, multiple round trips, and keeping up with new API versions, as indicated &lt;a href="https://medium.com/paypal-tech/graphql-at-paypal-an-adoption-story-b7e01175f2b7" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The issue of multiple round trips led to slower rendering times, subsequently causing user frustration and a decrease in checkout conversion rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PayPal’s Initial Implementation Process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before embracing GraphQL, PayPal's checkout team investigated Bulk REST, a method that empowered clients to define the specific structure and volume of data they required. In this approach, the request would resemble this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/user"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createCheckout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/checkout/ec-1234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currencyCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"getCheckout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/checkout/ec-1234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"createCheckout"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response to the above request would resemble the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mark Stuart"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hobbies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chess"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"painting"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createCheckout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"getCheckout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"shippingAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123 Main St, San Jose, CA 23434"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fundingOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SVB"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although this approach enabled clients to specify the desired structure and size of the data, it also brought about the following issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clients still needed to understand the API’s inner workings&lt;/strong&gt;: While specifying the request, the clients had to be explicit with the method and URI needed. Consequently, more time was spent on configuring data fetching as opposed to actually building user interfaces. This led to an unfavorable developer experience for those focused on UI development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overfetching was still a problem&lt;/strong&gt;: Even in this approach, entire resources were being fetched as opposed to specific fields that were needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since Bulk REST failed to solve their problems, the team at PayPal opted for GraphQL. This choice brought about these benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance Improvements&lt;/strong&gt;: The clients’ ability to specify their required data in a single request effectively resolved the problem of multiple rounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Productivity&lt;/strong&gt;: Unlike Bulk REST, developers did not need to understand the inner workings of the API. Furthermore, GraphQL delivers the necessary data in JSON format, which is a more comprehensible concept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolution&lt;/strong&gt;: GraphQL enabled Paypal’s engineering team to know which fields are utilized by clients, thus simplifying the process of deprecating unused fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Current State of GraphQL at PayPal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The adoption of GraphQL within PayPal has grown to the extent that it now serves as the default pattern for developing new UI applications. This progress culminated in the release of a &lt;a href="https://graphql.braintreepayments.com/explorer/" rel="noopener noreferrer"&gt;public GraphQL API&lt;/a&gt;, providing concrete evidence of the substantial advantages derived from embracing GraphQL.&lt;/p&gt;

&lt;p&gt;To reach this point, PayPal had to undertake the following actions to ensure the scalability of GraphQL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standardizing GraphQL API definitions internally&lt;/strong&gt;: These guidelines indicated naming conventions, header standards, directive standards, and error handling strategies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcing Authorization with Special Directives in GraphQL Operations&lt;/strong&gt;: In this directive, every operation, such as queries and mutations, is required to explicitly outline authorization prerequisites. Consequently, the security and privacy of sensitive data are maintained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Providing Essential Tooling for GraphQL Implementation&lt;/strong&gt;: As Paypal aimed to standardize GraphQL practices across the company, it became logical to implement common tools/libraries for common concerns. These shared aspects include logging, directives for data-classification, middleware for Apollo and playground, CLI, error classes, and Apollo graph variants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Providing Adequate Support to Developers&lt;/strong&gt;: This assistance was provided through resources designed to onboard teams onto GraphQL, template samples for both backend and frontend development, and dedicated Slack channels established to address questions related to GraphQL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As indicated in &lt;a href="https://medium.com/paypal-tech/graphql-at-paypal-an-adoption-story-b7e01175f2b7" rel="noopener noreferrer"&gt;this article&lt;/a&gt;, PayPal is moving towards implementing a “centralized graph” instead of every team maintaining its own graph. The purpose of this strategy is to uphold consistent GraphQL standards across engineering teams, as certain individual graphs were diverging from the established guidelines. Furthermore, this initiative aims to foster schema sharing within the organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  VC Funding
&lt;/h3&gt;

&lt;p&gt;Regarding venture capitalist funding, companies offering GraphQL tools and infrastructure have continued to successfully close funding rounds. Some of the highlights in recent years include:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.apollographql.com/blog/announcement/apollo-raises-130m-to-pioneer-the-graph-for-app-developers/" rel="noopener noreferrer"&gt;&lt;strong&gt;Apollo GraphQL Raising $130 Million in Series D&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apollo GraphQL is a key figure in the GraphQL space; with the widespread use of their open-source tools that include GraphQL clients and servers. I have worked with &lt;a href="https://www.apollographql.com/docs/react/" rel="noopener noreferrer"&gt;React Apollo Client&lt;/a&gt; and &lt;a href="https://www.apollographql.com/docs/apollo-server" rel="noopener noreferrer"&gt;Apollo Server&lt;/a&gt; in several projects. Based on my personal experience, these tools have greatly enhanced my developer experience and enhanced my comprehension of GraphQL.&lt;/p&gt;

&lt;p&gt;On 17th August 2021, Apollo GraphQL declared the successful closure of its Series D funding round. This funding round was accompanied by the following objectives, as outlined in &lt;a href="https://www.apollographql.com/blog/announcement/apollo-raises-130m-to-pioneer-the-graph-for-app-developers/" rel="noopener noreferrer"&gt;their announcement post&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developing Open-Source Software&lt;/strong&gt;: Aside from their current offerings, such as Apollo Client and Apollo Server, Apollo GraphQL is actively exploring new ideas in the GraphQL ecosystem. Additionally, Apollo GraphQL is aiming to invest in developer education around GraphQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand Apollo Federation to include more programming languages&lt;/strong&gt;: A common challenge frequently encountered by large engineering teams that implement GraphQL is the management and organization of their numerous graphs. Consequently, industry leaders such as PayPal and Walmart are leaning towards &lt;a href="https://medium.com/@luishrsoares/what-is-graphql-federation-26545a64cbb#:~:text=GraphQL%20Federation%20is%20an%20architecture%20model%20that%20allows%20multiple%20GraphQL,services%20using%20a%20single%20request" rel="noopener noreferrer"&gt;federation architecture&lt;/a&gt; that combines multiple subgraphs into one supergraph. Apollo Federation aims to adopt this strategy while extending its support to additional programming languages, thereby rendering the process more accessible and manageable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://wundergraph.com/blog/seed_funding_announcement" rel="noopener noreferrer"&gt;&lt;strong&gt;WunderGraph Raising $3 Million in Seed Funding to Build GitHub for APIs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wundergraph.com/" rel="noopener noreferrer"&gt;WunderGraph&lt;/a&gt; is a framework that enables developers to compose multiple APIs into one interface. Additionally, it allows developers to create code pipelines that introspect the various APIs within the unified API structure, resulting in an optimized developer workflow.&lt;/p&gt;

&lt;p&gt;On 26th April 2023, the team behind WunderGraph announced that they had raised $3M in seed funding for their “Github for APIs” project. The general idea of this endeavor is to treat APIs as dependencies; similar to how we handle npm packages for JavaScript, modules for Golang, and cargo for Rust. Currently, WunderGraph enables developers to combine APIs; and it holds promise in expanding its toolset and ecosystem to bring this vision to fruition.&lt;/p&gt;

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

&lt;p&gt;Throughout our recap of GraphQL, the growth of GraphQL is evident. Moreover, its unique approach to data query and manipulation has not only withstood the test of time but has also grown to address the challenges faced by large engineering teams. Going into this deep dive, I had the following questions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Is GraphQL Dying?
&lt;/h3&gt;

&lt;p&gt;My answer is no. Factors such as substantial venture capital funding and the growing awareness of GraphQL as shown by the survey numbers refute this claim. However, it doesn't appear poised for the exponential growth it experienced during the peak of its popularity in 2019 and 2020.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is GraphQL Going to Replace REST?
&lt;/h3&gt;

&lt;p&gt;My answer is no. Although it addresses the shortcomings of REST, GraphQL has its own fair of challenges that have already been addressed in REST. Hence, there are scenarios where GraphQL may prove less advantageous when compared to REST.&lt;/p&gt;

&lt;p&gt;At the end of the day, technology is very dynamic; making it even more intriguing to watch. Perhaps a future day will witness GraphQL replacing REST completely or GraphQL “dying”. When that day comes, I look forward to revisiting the topic in another article. Till next time!&lt;/p&gt;

&lt;p&gt;Featured Photo by &lt;a href="https://unsplash.com/@kaleidico?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Kaleidico&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/man-drawing-on-dry-erase-board-7lryofJ0H9s?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Becoming an AWS Solutions Architect Associate</title>
      <dc:creator>Junior Felix</dc:creator>
      <pubDate>Thu, 14 Mar 2024 10:30:31 +0000</pubDate>
      <link>https://dev.to/jrfelix/becoming-an-aws-solutions-architect-associate-2o1m</link>
      <guid>https://dev.to/jrfelix/becoming-an-aws-solutions-architect-associate-2o1m</guid>
      <description>&lt;p&gt;It has been a while since I got certified as an AWS Solutions Architect - Associate level; thus, I wanted to share my journey through it all. I’m hoping that this article provides insight to anyone who plans on studying and eventually taking the exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reasons for getting the certification
&lt;/h2&gt;

&lt;p&gt;I’m a software developer(&lt;em&gt;insert surprised Pikachu&lt;/em&gt;) who has done quite a bit of front-end work. I’ve been looking for an opportunity to improve my knowledge of the back-end side of things. Thus, I began looking at the available AWS Certifications I could study in the hopes that I would learn more things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing which certification to take
&lt;/h2&gt;

&lt;p&gt;The AWS Certifications that I felt I could take were as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Certified Cloud Practitioner:&lt;/strong&gt; This is a foundational level certificate that is aimed at individuals that have no prior experience with AWS. Even though I fit the bill for this certificate, I chose to skip it. From my perspective, just knowing what AWS services do wouldn’t help me improve my technical skills as a developer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Certified SysOps Administrator – Associate:&lt;/strong&gt; This is an associate-level certificate that targets individuals who are in or aspire to be in a Systems Administrator role. Since being a sysadmin isn’t in my immediate plans, I chose not to take it. (&lt;em&gt;Plus, it seems quite challenging. Not saying that the others are easy, but this one seemed to be quite something.&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Certified Developer - Associate:&lt;/strong&gt; This is an associate-level certificate that goes deeper into AWS services that revolve around software development such as Elastic Beanstalk, SQS, and SNS. I’ll admit it; the term “Developer” in the title was appealing. Instead, I chose its counterpart that had a more inviting name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Certified Solutions Architect - Associate:&lt;/strong&gt; This is an associate-level certification that covers a wide range of AWS services that focus on the design of an application that runs on AWS. It equips one with the skills to design a solution on AWS that balances the key pillars of a well-architected solution: Operational Excellence, Security, Reliability, Performance, and Cost. It allows you to see all these beautiful moving parts of software and its underlying infrastructure work in harmony to serve the intended customer. It’s like being a conductor in an orchestra. (&lt;em&gt;No, I take that back. It’s really not that cool&lt;/em&gt;). Plus, it has the word “Architect” in the title.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I eventually chose to go for the AWS Certified Solutions Architect - Associate.&lt;/p&gt;



&lt;p&gt;💡 All these definitions are from my perspective. To get a clearer explanation of all these certifications, please visit the official AWS documentation &lt;a href="https://aws.amazon.com/certification/"&gt;here&lt;/a&gt;. (&lt;em&gt;The badges are clickable on the page in case you get confused when you get there&lt;/em&gt;). Also, this article &lt;a href="https://acloudguru.com/blog/engineering/which-aws-certification-should-i-take?"&gt;here&lt;/a&gt; gives a clearer definition of the certifications if you’re stuck on deciding which certificate to go for.&lt;/p&gt;



&lt;p&gt;After deciding on which certification to take, I started gathering information on resources I could use to successfully get it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources I Used
&lt;/h2&gt;

&lt;p&gt;In the information-gathering phase, I was overwhelmed by the wealth of information that is present on the internet. However, I was lucky to find a community on Reddit called &lt;a href="https://www.reddit.com/r/AWSCertifications/"&gt;r/AWSCertifications&lt;/a&gt; that provided useful information as well as user testimonials on what they used to pass the certification. From the discussions in the subreddit, I narrowed my options to two courses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03/"&gt;&lt;strong&gt;Stephane Maarek’s Udemy SAA-C03 Course&lt;/strong&gt;&lt;/a&gt;: As a complete beginner in AWS, this course gave me an adequate introduction; one that didn’t make me feel overwhelmed. Additionally, following through with the lectures while doing the hands-on exercises significantly helped in understanding the AWS ecosystem. Moreover, Stephane provides explanations on programming concepts such as CORS from a beginner’s perspective.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://portal.tutorialsdojo.com/courses/aws-certified-solutions-architect-associate-practice-exams/"&gt;&lt;strong&gt;Tutorials Dojo Practice Exams for SAA-C03&lt;/strong&gt;&lt;/a&gt;: After completing Stephane’s course, I began doing practice tests on Tutorials Dojo. Here, I was humbled by my test scores in the practice tests. Here’s a picture of the practice test I took:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8f5n4p69s3ameiuk65b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8f5n4p69s3ameiuk65b.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While completing Stephane’s course made me feel like a had a good grasp of AWS, my lack of in-depth knowledge showed in the practice tests. After getting bad scores on my practice tests, I decided to highlight the areas where I scored poorly and revise these areas thoroughly before moving to the next practice. Thankfully, Tutorials Dojo gives detailed explanations of each question and answer after completing each practice test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://aws.amazon.com/architecture/?cards-all.sort-by=item.additionalFields.sortDate&amp;amp;cards-all.sort-order=desc&amp;amp;awsf.content-type=content-type%23whitepaper&amp;amp;awsf.methodology=*all&amp;amp;awsf.tech-category=*all&amp;amp;awsf.industries=*all&amp;amp;awsf.business-category=*all"&gt;&lt;strong&gt;AWS Whitepapers&lt;/strong&gt;&lt;/a&gt;: The available AWS whitepapers cover a huge range of issues surrounding the AWS ecosystem. For me, the &lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html"&gt;Well-Architected Framework&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/disaster-recovery-workloads-on-aws/disaster-recovery-workloads-on-aws.html?did=wp_card&amp;amp;trk=wp_card"&gt;Disaster Recovery&lt;/a&gt; proved very useful in understanding why certain actions are considered best practices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://aws.amazon.com/architecture"&gt;&lt;strong&gt;AWS Architecture Centre&lt;/strong&gt;&lt;/a&gt;:The AWS documentation not only offers whitepapers, but also provides architectural diagrams. You can refer to these diagrams to enhance your comprehension of AWS solutions. These diagrams illustrate how various AWS services can be integrated to build highly scalable and resilient applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I continued with my preparations until I felt confident enough to take the AWS Certification. In this phase, I would go over areas I found challenging and do practice tests to identify my weaknesses.&lt;/p&gt;



&lt;p&gt;💡 Practice tests can be a trap, sometimes. There are cases of people passing practice tests and still failing the certification exam. This article &lt;a href="https://www.linkedin.com/pulse/you-might-using-practice-exams-all-wrong-adrian-cantrill/"&gt;here &lt;/a&gt; details how you can leverage practice tests to your benefit.&lt;/p&gt;



&lt;h2&gt;
  
  
  Taking the Test
&lt;/h2&gt;

&lt;p&gt;For the certification examination, I opted to use a testing center near me. I did not want to worry about the technical stuff like setting up the OnVue testing software. Additionally, I was worried about scenarios like experiencing a power outage while taking the test or the neighbor's dog deciding to bark loudly on that particular day. True to my concerns, on the day I had scheduled my exam, my power went out.&lt;/p&gt;

&lt;p&gt;Fortunately, I was able to do the certification exam at the testing center on time. The questions felt familiar to me because I had encountered similar situations in my practice tests. They weren't exact replicas of my practice tests, but the thought process required to arrive at an answer was similar.&lt;/p&gt;

&lt;p&gt;After a couple of days, my results came in my mail. I managed a passing score of 772/1000.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Takeaways From The Process
&lt;/h2&gt;

&lt;p&gt;When I was starting this process, I hoped to learn more about back-end software development. At the end of the process, I realized I got more out of the process than I had anticipated. There are concepts I knew about that were reinforced by learning about how AWS implements them. Additionally, I was introduced to new concepts (to me) that I found fascinating. Here are some of the concepts I found intriguing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Least Privilege Principle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4blaymoskgiq9o308aa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4blaymoskgiq9o308aa.gif" alt="Image description" width="220" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sauce: &lt;a href="https://tenor.com/view/ziekenhuisbal-steward-guard-security-guard-guard-check-gif-15705678"&gt;https://tenor.com/view/ziekenhuisbal-steward-guard-security-guard-guard-check-gif-15705678&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my personal experience, access has always been a key factor in security; whether on the internet or in real life. This was reiterated when I was studying the IAM (Identity and Access Management) section of AWS. With the least privilege principle, individuals are only given permission that they need to perform their duty. AWS provides enough tools that facilitate the implementation of this principle. Some of these tools/techniques include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IAM Groups&lt;/strong&gt;: In this method, instead of assigning permissions to an individual user, a group is created and has permissions assigned to it. Afterward, the users are assigned to the created groups. This allows the admin to monitor the privileges granted to many users from a central point; thus making oversight easier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IAM Access Advisor&lt;/strong&gt;: This tool shows services granted to a user and service last accessed information; which is critical when determining if a specific user needs certain permissions. Together with AWS Organizations and Service Control Policies, it can be used to enforce permission restrictions on AWS. More information can be found &lt;a href="https://aws.amazon.com/about-aws/whats-new/2019/06/now-use-iam-access-advisor-with-aws-organizations-to-set-permission-guardrails-confidently/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS CloudTrail&lt;/strong&gt;: This AWS service tracks all the activity on your AWS service. Through CloudTrail logs, an audit of everyone’s activities within an AWS account can be conducted. Furthermore, you can do a deep dive into these logs using advanced analysis tools; if the need arises.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Living on the Edge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fysk4l8r1pfjdvzemf5wq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fysk4l8r1pfjdvzemf5wq.jpeg" alt="Image description" width="750" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sauce: &lt;a href="https://imgflip.com/i/7io09o"&gt;https://imgflip.com/i/7io09o&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, applications have continued to grow a global audience; which has prompted the need to cater to consumers around the world. Hence, we have the edge. Since AWS has multiple regions and availability zones around the globe, leveraging its infrastructure can be significantly beneficial to a global business. Some of the services that involve the edge include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon CloudFront&lt;/strong&gt;: This is AWS’ global Content Delivery Network (CDN) that distributes videos, files, APIs, applications, and data to the intended consumers. In addition to content delivery, additional features such as geo-restriction, firewall setup, and DDoS protection measures can be implemented here. Additionally, using caching strategies can be deployed using CloudFront; hence making response time faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Lambda@Edge&lt;/strong&gt;: In conjunction with Amazon CloudFront, you can deploy functions that execute at the edge locations instead of a centralized location. This service can be beneficial in situations such as conducting A/B testing on your application. Additionally, you can modify headers and cookies before forwarding the request to the origin. For more information, see &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are significant contributions made in the edge space: varying from deploying functions at the edge to database edge databases by companies such as Vercel and Cloudflare. It will be interesting to see how computing at the edge develops in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managed Services
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/BY8ORoRpnJDXeBNwxg/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/BY8ORoRpnJDXeBNwxg/giphy.gif" alt="https://media.giphy.com/media/BY8ORoRpnJDXeBNwxg/giphy.gif" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sauce: &lt;a href="https://media.giphy.com/media/BY8ORoRpnJDXeBNwxg/giphy.gif"&gt;https://media.giphy.com/media/BY8ORoRpnJDXeBNwxg/giphy.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a managed service, users are only concerned with using the service and are not required to know the setup details. For instance, let’s say we want to use a database to use for a web application. We can decide to implement it in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using Amazon Aurora&lt;/strong&gt;: In this scenario, we won’t have to provision a server to host our database. Additionally, if auto-scaling is enabled, we are not required to monitor our database to ensure that it can handle the load it gets. Furthermore, we do not have to manually update Aurora when there’s a new update.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using a PostgreSQL/MySQL Instance on a Live Server&lt;/strong&gt;: In this instance, we have to provision resources and monitor our database to ensure that it appropriately handles its load. Moreover, we have to manually set up backups and deploy updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a glance, it may seem like managed services are the better option; since they can significantly reduce the overhead that comes with the alternative. However, there are concerns, such as &lt;a href="https://www.cloudflare.com/learning/cloud/what-is-vendor-lock-in/"&gt;vendor lock-in&lt;/a&gt;, that eliminate the possibility of managed services being viewed as a silver bullet for all the problems that other frameworks provide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serverless Ecosystem
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbez97c6kx9qzkh60c9f5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbez97c6kx9qzkh60c9f5.jpg" alt="Image description" width="500" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sauce: &lt;a href="https://imgflip.com/i/7insfr"&gt;https://imgflip.com/i/7insfr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the years, serverless architectures have gained traction. The idea of not having idle servers when there is no traffic was what sold me on going serverless. Moreover, the automatic scaling that comes with serverless is also advantageous when dealing with unexpected workloads. In the AWS ecosystem, these services help in creating a serverless solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;: This service enables a user to deploy functions regardless of the programming language used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt;: Using this service, RESTful APIs and WebSocket APIs can easily be deployed. By using the Amazon API Gateway to invoke AWS Lambda, our Lambda functions can be reached through HTTP endpoints, which leads to a completely serverless configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;: This is a NoSQL, serverless database that auto-scales based on demand.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are more AWS services under the serverless umbrella; you can find them &lt;a href="https://aws.amazon.com/serverless/"&gt; here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Currently, I don’t intend on taking another associate-level AWS certification exam; despite it being an attractive option. Instead, I would like to apply the foundational knowledge I have acquired on building resilient systems and explore open-source alternatives to AWS's proprietary tools. I also hope to gain more experience in designing solutions on AWS. I also plan to take the &lt;a href="https://roadmap.sh/system-design"&gt;System Design Roadmap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for taking the time to read this to the end! If you are planning to take the SAA-C03 examination I wish you the best of luck.&lt;/p&gt;



&lt;p&gt;💡 This &lt;a href="https://valenciandigital.com/insights/are-certifications-worth-it"&gt; article &lt;/a&gt; provides a detailed analysis of the value of certifications in the tech industry.&lt;/p&gt;



&lt;p&gt;Featured Image Credit: &lt;a href="https://unsplash.com/@mrpeker"&gt;Mehmet Ali Peker &lt;/a&gt;on&lt;a href="https://unsplash.com/photos/hfiym43qBpk"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Next.js 14: Skeptical Observations</title>
      <dc:creator>Junior Felix</dc:creator>
      <pubDate>Thu, 14 Mar 2024 10:21:24 +0000</pubDate>
      <link>https://dev.to/jrfelix/nextjs-14-skeptical-observations-2do3</link>
      <guid>https://dev.to/jrfelix/nextjs-14-skeptical-observations-2do3</guid>
      <description>&lt;p&gt;A few releases ago, I'd wholeheartedly recommend Next.js to both friends and foes whenever a React frameworks discussion arose. With this latest release, my enthusiasm has waned. Next.js has taken a more "futuristic" persona, moving at a blazingly fast pace, and it feels like a significant portion of its community is being left behind. In this article, I will narrow my focus on &lt;a href="https://nextjs.org/blog/next-14"&gt;the release of Next.js 14&lt;/a&gt;, and my concerns related to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttcf29pz1a5fomow94it.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttcf29pz1a5fomow94it.jpg" alt="Image description" width="637" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js 14 Release Notes
&lt;/h2&gt;

&lt;p&gt;The cliff notes from this release are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No new APIs.&lt;/li&gt;
&lt;li&gt;Performance improvements for &lt;a href="https://turbo.build/pack"&gt;Turbopack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Server Actions are stable now.&lt;/li&gt;
&lt;li&gt;Partial Prerendering can be previewed now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 The official release blog post provides a more in-depth explanation. Click &lt;a rel="noopener noreferrer nofollow" href="https://nextjs.org/blog/next-14"&gt;here &lt;/a&gt;to read, but kindly come back! I'm not done yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Concerns with this Release
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Canary vs. Production Conundrum
&lt;/h3&gt;

&lt;p&gt;With certain decisions, Next.js blurs the line between experimental and stable features. Some of these decisions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turbopack's premature promotion&lt;/strong&gt;: It is concerning that despite Turbopack not passing all the tests for both App router and Pages router, it is prominently featured in the official release notes as a significant improvement. Moreover, these margins of improvement are boldly highlighted despite its unstable nature. It is worth noting that Turbopack is not the default bundler when running the &lt;code&gt;next dev&lt;/code&gt; command, further contributing to this ambiguity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server actions confusion&lt;/strong&gt;: Recently, the React team shared a post on X announcing the availability of server actions in React Canary, as shown &lt;a href="https://twitter.com/reactjs/status/1716573234160967762"&gt;here&lt;/a&gt;. From the replies, you can tell that the developer community is confused if server actions are a feature of Next.js or React. Additionally, the presence of server actions in React Canary implies their instability within React, even though they may be considered stable in the context of Next.js. The lingering ambiguity adds to the complexity of the situation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyrebf1hecxvfbibpux0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyrebf1hecxvfbibpux0.jpg" alt="Image description" width="500" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reevaluating the Major Release Label
&lt;/h3&gt;

&lt;p&gt;Despite Next.js 14 being a major release, it lacks the substantial changes that are typically associated with major releases. The nature of the updates included in this release is more aligned with what I'd expect from a minor release. It's worth noting that Next.js has a relatively high frequency of version releases, especially when we consider that version 1 was initially released in October 2016.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing Partial Prerendering
&lt;/h3&gt;

&lt;p&gt;The Next.js 14's accompanying blog post acknowledges the complexities introduced in prior releases. However, in the next paragraph, Next.js 14 introduces partial prerendering, which adds further complexity. While it does not introduce new APIs, it is probably a new concept to many which does not make it any easier digest. Additionally, the release does not provide a lot of details on it; and promises to do so in a future minor update.&lt;/p&gt;

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

&lt;p&gt;Contrary to the skepticism I've expressed in this article, I'm still bullish on Next.js. I recognize their willingness to push the React community forward, but at the same time, I'm not sure if this is the way to get us there. Maybe, this is similar to the pushback React faced when it was first introduced to the JavaScript community. However, I am no wizard with a pondering orb to make those conclusions.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Integrating Bun: A Developer’s Journey</title>
      <dc:creator>Junior Felix</dc:creator>
      <pubDate>Thu, 14 Mar 2024 01:26:45 +0000</pubDate>
      <link>https://dev.to/jrfelix/integrating-bun-a-developers-journey-4me5</link>
      <guid>https://dev.to/jrfelix/integrating-bun-a-developers-journey-4me5</guid>
      <description>&lt;p&gt;I have often thought of the JavaScript ecosystem as a free market; where multiple solutions to the same problem can co-exist. In this dynamic environment, new tools can emerge and gain prominence by addressing the specific needs of developers. Recently, Bun has been the cause of “buzz” in the JavaScript “marketplace” with the release of Bun 1.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bun.sh/"&gt;Bun&lt;/a&gt; is a new JavaScript runtime and toolset that aims to fulfill the needs of the modern JavaScript ecosystem. Bun’s selling points include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;: Bun extends the JavaScript Core engine, which prioritizes speed and powers Safari(the browser). In contrast, Node.js and Deno use the V8 engine that powers Chromium.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better Tooling&lt;/strong&gt;: Aside from being a runtime, Bun also serves as a bundler, package manager and test runner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js Compatibility&lt;/strong&gt;: Bun is a drop-in replacement for Node.js; meaning you can run Node.js projects with Bun without significantly changing your code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a JavaScript/TypeScript developer, I found Bun's pitch to be quite compelling. Therefore, I set off on a journey to personally evaluate the noteworthy benefits it promises.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvih7u415wkef8ikoqtjv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvih7u415wkef8ikoqtjv.jpg" alt="Image description" width="620" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Before picking tools/libraries for my development workflow, I ask myself these three questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does it prevent me from shooting myself in the foot?&lt;/strong&gt;&lt;br&gt;
This question mainly focuses on questioning a tool's or library's reliability and safety. It's about choosing a tool or library that has enough safeguards to protect against unintended consequences or potential missteps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does it get in my way when I'm rolling out new features?&lt;/strong&gt;&lt;br&gt;
This question assesses a tool's adaptability and user-friendliness. If a tool is a roadblock during feature development, it may not be the right fit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Will it cost me more to use?&lt;/strong&gt;&lt;br&gt;
In addition to assessing the financial aspect, I consider the tool's resource demands. This involves memory usage, computational power, time consumed and other software or hardware resources it may require.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these considerations in mind, I started the process of integrating Bun into my Node.js/Express API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial Setup
&lt;/h3&gt;

&lt;p&gt;My local development environment had the following key features/components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application Stack&lt;/strong&gt;: Node.js/Express application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Tool&lt;/strong&gt;: Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process flow&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Code is written in TypeScript(".ts")&lt;/li&gt;
&lt;li&gt;Transpilation from TypeScript to JavaScript&lt;/li&gt;
&lt;li&gt;Node.js/Express server serving the application&lt;/li&gt;
&lt;li&gt;PostgreSQL for data storage&lt;/li&gt;
&lt;li&gt;Docker containers for running both the API and the Database.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main benefit of this setup was the ability to operate the application in a self-contained environment, offering enhanced portability and isolation. Additionally, with this setup, I could start up my application in two commands; &lt;code&gt;docker compose build&lt;/code&gt; and &lt;code&gt;docker compose up&lt;/code&gt;. Moreover, the "it only works on my machine" issue is dealt with.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Integration Process
&lt;/h2&gt;

&lt;p&gt;In the reconfigured setup, I wanted Bun to serve the following roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As a Runtime&lt;/strong&gt;: Bun is capable of executing TypeScript without requiring a transpilation step; thus simplifying the development. Moreover, Bun allows you to run your application in watch mode without installing another package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As a Package manager&lt;/strong&gt;: Bun would replace npm in executing scripts in my project. Since Bun's main selling point is speed, I'd reap the intended benefits.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;First, I had to install Bun locally. To accomplish this, I run the following command on my Ubuntu computer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afterward, I ran &lt;code&gt;bun install&lt;/code&gt; in my project's root directory. This action generated a &lt;code&gt;bun.lockb&lt;/code&gt; file. This is a binary file that serves a similar role as &lt;code&gt;yarn.lock&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt;. The key distinction from the previously mentioned lock files lies in its binary format, which enables &lt;code&gt;bun.lockb&lt;/code&gt; to store more data and load swiftly, resulting in enhanced performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Streamlining Dependencies
&lt;/h3&gt;

&lt;p&gt;Since Bun executes TypeScript out-of-the-box, we can remove the npm packages we added to support TypeScript. These packages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@types/node&lt;/strong&gt;: Provides types for node.js runtime&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ts-node&lt;/strong&gt;: Provides a TypeScript execution engine and REPL for Node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;nodemon&lt;/strong&gt;: Provides hot reloading by automatically restarting Node.Js upon file changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I removed all these packages by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bun remove @types/node ts-node nodemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afterwards, I added the package bun/types using the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bun add bun-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also edited the tsconfig.json file to include bun-types in the global scope as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bun-types"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Updating the "dev" script
&lt;/h3&gt;

&lt;p&gt;Before running the application, I added the following script in my project's package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bun --watch run ./src/index.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Updating the Dockerfile
&lt;/h3&gt;

&lt;p&gt;Initially, this was my Dockerfile.dev:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;FROM node:14-alpine&lt;/span&gt;

&lt;span class="s"&gt;WORKDIR /app&lt;/span&gt;

&lt;span class="s"&gt;COPY . .&lt;/span&gt;

&lt;span class="s"&gt;RUN npm install&lt;/span&gt;

&lt;span class="s"&gt;CMD ["npm", "run", "dev"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I updated it to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;FROM oven/bun:1 as dev&lt;/span&gt;
&lt;span class="s"&gt;WORKDIR /usr/src/app&lt;/span&gt;

&lt;span class="s"&gt;COPY package.json bun.lockb ./&lt;/span&gt;

&lt;span class="s"&gt;RUN bun install&lt;/span&gt;

&lt;span class="s"&gt;COPY . .&lt;/span&gt;

&lt;span class="s"&gt;CMD ["bun", "run", "dev"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My &lt;code&gt;docker-compose.yml&lt;/code&gt; file remained as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15.2-bullseye&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bookclub&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;bookclub-postgres-data:/var/lib/postgres/data&lt;/span&gt;

  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.dev&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./env/.env.development&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;4000:4000&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bookclub-postgres-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By following these steps, I successfully configured Bun as the runtime and package manager for my Node.Js/Express application. I got a running application at &lt;code&gt;http://localhost:4000&lt;/code&gt; after running the &lt;code&gt;docker compose build&lt;/code&gt; and &lt;code&gt;docker compose up&lt;/code&gt; commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact on Workflow
&lt;/h2&gt;

&lt;p&gt;After switching to Bun, my setup became faster and used less space. Running both setups in &lt;a href="https://github.com/features/codespaces"&gt;GIthub Codespaces&lt;/a&gt; yielded the following results:&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;docker compose build&lt;/code&gt; on the Node.Js setup finished in 69.2s as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37cjmxcyydcrp975zacf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37cjmxcyydcrp975zacf.png" alt="Image description" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;docker compose build&lt;/code&gt; on the Bun setup finished in 26.4s as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b8gooipjmu0rc5t0vbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b8gooipjmu0rc5t0vbi.png" alt="Image description" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The docker image sizes also differ for both setups. The results were as follows:&lt;/p&gt;

&lt;p&gt;For the Node.Js setup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0ht6j9drm09xvc1ua60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0ht6j9drm09xvc1ua60.png" alt="Image description" width="800" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the Bun setup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xpx4ro5egece19dadpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xpx4ro5egece19dadpy.png" alt="Image description" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bun is still relatively new
&lt;/h3&gt;

&lt;p&gt;Since this is version 1, users will occasionally run into unlikely bugs. I experienced this issue myself during my initial installation of Bun. When I ran &lt;code&gt;bun run index.ts&lt;/code&gt;, there were no logs or feedback on my terminal. Fortunately, a fix was released shortly after my encounter, and I was able to get rolling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges in Cloud Provider Integration
&lt;/h3&gt;

&lt;p&gt;Due to Bun being relatively new, cloud providers have not rushed to provide supporting infrastructure for it. Consequently, there are cases where Node.Js outperforms Bun due to the optimizations these providers have implemented for Node.Js. The following articles outline this issue in the context of AWS lambda; where performance is very important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@mitchellkossoris/serverless-bun-vs-node-benchmarking-on-aws-lambda-ecd4fe7c2fc2"&gt;https://medium.com/@mitchellkossoris/serverless-bun-vs-node-benchmarking-on-aws-lambda-ecd4fe7c2fc2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://lumigo.io/blog/is-bun-the-next-big-thing-for-aws-lambda-a-thorough-investigation/"&gt;https://lumigo.io/blog/is-bun-the-next-big-thing-for-aws-lambda-a-thorough-investigation/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bun has backward compatibility issues
&lt;/h3&gt;

&lt;p&gt;When Bun 1.0 was released, libraries such as &lt;a href="https://github.com/pinojs/pino"&gt;Pino&lt;/a&gt; and &lt;a href="https://github.com/fastify/fastify"&gt;Fastify&lt;/a&gt; had problems working with Bun because Bun did not support all Node.js APIs, as indicated &lt;a href="https://adventures.nodeland.dev/archive/my-thoughts-on-bun/"&gt;here&lt;/a&gt;. This resulted in the lead maintainer of Fastify giving &lt;a href="https://twitter.com/matteocollina/status/1700489064867123674"&gt;this response&lt;/a&gt; on Twitter to clarify this issue. Again, Bun is relatively new and these issues are expected as they iron them out.&lt;/p&gt;

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

&lt;p&gt;Bun feels like a true challenger to Node.js, the default runtime for people who want to run JavaScript or TypeScript on the server. While there are many unknowns with Bun, especially regarding the success of its all-in-one approach, it's been a while since I've felt this excited about a new JavaScript runtime. As a participant in the JavaScript marketplace, I'm always rooting for alternate solutions to the problems we face as developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/data-science-community-srm/unleashing-the-speed-exploring-the-power-of-bun-js-and-the-future-of-javascript-runtimes-a689ff274952"&gt;Unleashing the Speed: Exploring the Power of Bun.js and the Future of JavaScript Runtimes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bun.sh/docs"&gt;Bun's official documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bun.sh/discord"&gt;Bun's Discord Community&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
