<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Full Stack Express</title>
    <description>Become a better full stack developer. A newsletter dedicated to web development and software architecture.</description>
    
    <link>https://www.fullstackexpress.io/</link>
    <atom:link href="https://rss.beehiiv.com/feeds/BChdncwEsc.xml" rel="self"/>
    
    <lastBuildDate>Thu, 14 May 2026 19:35:13 +0000</lastBuildDate>
    <pubDate>Thu, 25 Apr 2024 12:00:00 +0000</pubDate>
    <atom:published>2024-04-25T12:00:00Z</atom:published>
    <atom:updated>2026-05-14T19:35:13Z</atom:updated>
    
      <category>Programming</category>
      <category>Software Engineering</category>
      <category>Technology</category>
    <copyright>Copyright 2026, Full Stack Express</copyright>
    
    <image>
      <url>https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/publication/logo/0329b21b-7fe6-43a3-ad44-524ff7be066a/_removal.ai__702afb3d-1a87-4ed0-b2ba-e15387d6b6e8-fse-icon.png</url>
      <title>Full Stack Express</title>
      <link>https://www.fullstackexpress.io/</link>
    </image>
    
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>beehiiv</generator>
    <language>en-us</language>
    <webMaster>support@beehiiv.com (Beehiiv Support)</webMaster>

      <item>
  <title>How to Prepare Node.js Applications for Production</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/84f83bbc-5e0c-4c01-b5be-f2399a6e367f/1200px-Node.js_logo.svg.png" length="54812" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/prepare-nodejs-application-production</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/prepare-nodejs-application-production</guid>
  <pubDate>Thu, 25 Apr 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-04-25T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Node.Js]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">Stephen here.</p><p class="paragraph" style="text-align:left;">I spend my weekends researching, learning, and creating content for this newsletter.</p><p class="paragraph" style="text-align:left;">It would mean the world to me, if you took a few seconds of your time to check out The Rundown AI.</p><p class="paragraph" style="text-align:left;"><span style="color:rgb(34, 34, 34);font-family:Trebuchet MS, Lucida Grande, Tahoma, sans-serif;font-size:16px;">They’re the fastest growing AI newsletter for a reason (I’m a subscriber too).</span></p><p class="paragraph" style="text-align:left;">Now let’s get on with the show.</p><hr class="content_break"><div class="image"><a class="image__link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_f576667b-fcfc-43ad-ba1e-be8c0b27a0a1_e4221c46&bhcl_id=58cd8c05-e65d-47d9-8650-8e7ad131fb01_{{subscriber_id}}_{{email_address_id}}" rel="noopener" target="_blank"><img class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d8f3f17d-ab6e-46cb-8aed-3df7ba10ea55/image.png?t=1709840162"/></a></div><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_f576667b-fcfc-43ad-ba1e-be8c0b27a0a1_e4221c46&bhcl_id=58cd8c05-e65d-47d9-8650-8e7ad131fb01_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Learn how to make AI work for you.</a></b></p><p class="paragraph" style="text-align:left;">How do you stay up-to-date with the insane pace of AI? Join The Rundown – the world’s fastest-growing AI newsletter with over 500,000+ readers learning how to become more productive using AI every morning.</p><p class="paragraph" style="text-align:left;">1. Our team spends all day researching and talking with industry experts.</p><p class="paragraph" style="text-align:left;">2. We send you updates on the latest AI news and how to apply it in 5 minutes a day.</p><p class="paragraph" style="text-align:left;">3. You learn how to become 2x more productive by leveraging AI.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_f576667b-fcfc-43ad-ba1e-be8c0b27a0a1_e4221c46&bhcl_id=58cd8c05-e65d-47d9-8650-8e7ad131fb01_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Subscribe with one click</a>.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i><b>Production is always hard.</b></i></p><p class="paragraph" style="text-align:left;">There’s databases, configurations, infrastructure, performance, security, observability…the list goes on.</p><p class="paragraph" style="text-align:left;">On top of all of these things, the stakes are high. Defects can lead to downtime, and the company could lose money.</p><p class="paragraph" style="text-align:left;">For Node.js applications, there’s several things we need to keep in mind when moving to production.</p><p class="paragraph" style="text-align:left;">Let’s go over them.</p><h2 class="heading" style="text-align:left;">Configure Node.js Properly</h2><p class="paragraph" style="text-align:left;">It’s common for a company to have multiple servers and environments. Each environment will typically have different configurations and environment variables.</p><p class="paragraph" style="text-align:left;">For example, a common setup is the following: Development → Staging → Production.</p><p class="paragraph" style="text-align:left;">For environment variables, Node.js contains a built-in core module named <a class="link" href="https://nodejs.org/api/process.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">process</a>. The process object has a property named <a class="link" href="https://nodejs.org/api/process.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production#processenv" target="_blank" rel="noopener noreferrer nofollow">env</a> with key-value pairs of all environment variables on startup.</p><p class="paragraph" style="text-align:left;">One particular environment variable to pay attention to is <code>NODE_ENV</code>. Not only is it part of Node.js, it’s also widely used in NPM packages.</p><p class="paragraph" style="text-align:left;">When targeting a production environment, <code>NODE_ENV</code> needs to be set to <code>production</code>. Doing so provides several benefits such as reduced logging (essential) and performance optimizations.</p><p class="paragraph" style="text-align:left;">Otherwise, sensitive information used during development and stack traces may be logged unintentionally.</p><h2 class="heading" style="text-align:left;">Audit NPM Packages</h2><p class="paragraph" style="text-align:left;">In the Node.js ecosystem, there are over <a class="link" href="https://nodejs.org/en/learn/getting-started/an-introduction-to-the-npm-package-manager?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">2.1 million NPM packages</a> (in 2022). Not all packages are properly maintained, leading to security vulnerabilities.</p><p class="paragraph" style="text-align:left;">The <a class="link" href="https://snyk.io/blog/open-source-npm-packages-colors-faker/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">latest incident</a> was a commit in the popular colors package. The <a class="link" href="https://github.com/Marak/colors.js/commit/074a0f8ed0c31c35d13d28632bd8a049ff136fb6?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production#diff-92bbac9a308cd5fcf9db165841f2d90ce981baddcb2b1e26cfff170929af3bd1" target="_blank" rel="noopener noreferrer nofollow">commit added an infinite loop</a>, creating a Domino Effect. It broke many widely-used NPM packages such as Jest, Rollup, and Faker.</p><p class="paragraph" style="text-align:left;">Other examples include the <a class="link" href="https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">event-stream incident in 2018</a> and the <a class="link" href="https://www.theregister.com/2016/03/23/npm_left_pad_chaos/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">left-pad debacle in 2016</a>.</p><p class="paragraph" style="text-align:left;">These cases highlight the importance of vetting packages in an application. NPM provides commands to address these issues:</p><div class="codeblock"><pre><code># Scan for vulnerabilities
npm audit

# Fix issues automatically
npm audit fix

# Update and fix
npm update &amp;&amp; npm audit fix</code></pre></div><p class="paragraph" style="text-align:left;">Scans can also by automated. At my company, we use <a class="link" href="https://snyk.io/advisor/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">Snyk</a>.</p><p class="paragraph" style="text-align:left;">We’ve integrated Snyk into our CI/CD pipelines and trigger when pull requests are opened.</p><h2 class="heading" style="text-align:left;">Use a Non-Root User in Docker</h2><p class="paragraph" style="text-align:left;">Nowadays, most Node.js applications are containerized with Docker.</p><p class="paragraph" style="text-align:left;">Docker packages up the code and dependencies needed to run the application into a container image.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bc1432e7-1f47-4f96-b810-72929edf5713/image.png?t=1713967612"/><div class="image__source"><span class="image__source_text"><p>High-Level View Of How Docker Containers Are Used</p></span></div></div><p class="paragraph" style="text-align:left;">The Docker Engine then creates the container from the image at runtime. </p><p class="paragraph" style="text-align:left;">Pipelines and orchestration tools like Docker Compose and Kubernetes can be used to streamline the deployment process.</p><p class="paragraph" style="text-align:left;">By default, Docker runs commands inside containers as root. Following the Principle of Least Privilege (PoLP), a user should only have access to the necessary data and resources needed to perform the task.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/nodejs/docker-node?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">The official Docker image for Node</a> provides a non-root user:</p><div class="codeblock"><pre><code>FROM node:6.10.3
...
# At the end, set the user to use when running this image
USER node</code></pre></div><p class="paragraph" style="text-align:left;">The name, uid, and gid of the user can be changed as needed.</p><h2 class="heading" style="text-align:left;">Implement Strong Authentication Policies</h2><p class="paragraph" style="text-align:left;">Node.js has a core module called <a class="link" href="https://nodejs.org/api/crypto.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">crypto</a>. It’s a general purpose library for doing things like password hashing, encryption, and decryption (and much more).</p><p class="paragraph" style="text-align:left;">For password hashing, crypto uses the <a class="link" href="https://en.wikipedia.org/wiki/Scrypt?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">scrypt algorithm</a> to hash a password using a <a class="link" href="https://en.wikipedia.org/wiki/Salt_(cryptography)?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">salt</a>.</p><p class="paragraph" style="text-align:left;">Other packages like bcrypt (<a class="link" href="https://en.wikipedia.org/wiki/Blowfish_(cipher)?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">blowfish algorithm</a>) and node-argon2 (<a class="link" href="https://en.wikipedia.org/wiki/Argon2?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">argon2 algorithm</a>) can be used to address more specific cases like brute force attacks.</p><p class="paragraph" style="text-align:left;">Multi-Factor Authentication (MFA) is also becoming a standard security practice for web applications and should be added as an additional layer of security.</p><h2 class="heading" style="text-align:left;">Protect Against Vulnerabilities</h2><p class="paragraph" style="text-align:left;">Cross-site scripting (XSS), clickjacking, and injections are different types of attacks you may run into.</p><p class="paragraph" style="text-align:left;">Adding proper headers mitigates many different vulnerabilities. If you’re application uses Express, you can use an NPM package called <a class="link" href="https://github.com/helmetjs/helmet?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">Helmet</a>.</p><p class="paragraph" style="text-align:left;">Helmet sets the following headers and can be customized accordingly:</p><ul><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Content-Security-Policy</b></span>: A powerful allow-list of what can happen on your page which mitigates many attacks</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Cross-Origin-Opener-Policy</b></span>: Helps process-isolate your page</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Cross-Origin-Resource-Policy</b></span>: Blocks others from loading your resources cross-origin</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Origin-Agent-Cluster</b></span>: Changes process isolation to be origin-based</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Referrer-Policy</b></span>: Controls the <code>Referer</code> header</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Strict-Transport-Security</b></span>: Tells browsers to prefer HTTPS</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>X-Content-Type-Options</b></span>: Avoids <span style="text-decoration:underline;"><a class="link" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production#mime_sniffing" target="_blank" rel="noopener noreferrer nofollow" style="color: var(--fgColor-accent, var(--color-accent-fg))">MIME sniffing</a></span></p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">X-DNS-Prefetch-Control</span></b>: Controls DNS prefetching</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>X-Download-Options</b></span>: Forces downloads to be saved (Internet Explorer only)</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">X-Frame-Options</span></b>: Legacy header that mitigates <span style="text-decoration:underline;"><a class="link" href="https://en.wikipedia.org/wiki/Clickjacking?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow" style="color: var(--fgColor-accent, var(--color-accent-fg))">clickjacking</a></span><span style="text-decoration:underline;"> </span>attacks</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">X-Permitted-Cross-Domain-Policies</span></b>: Controls cross-domain behavior for Adobe products, like Acrobat</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">X-Powered-By</span></b>: Info about the web server. Removed because it could be used in simple attacks</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">X-XSS-Protection</span></b>: Legacy header that tries to mitigate <span style="text-decoration:underline;"><a class="link" href="https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow" style="color: var(--fgColor-accent, var(--color-accent-fg))">XSS attacks</a></span>, but makes things worse, so Helmet disables it</p></li></ul><p class="paragraph" style="text-align:left;">For DDoS and brute force attacks, rate limiting policies can be added to the load balancer (like NGINX).</p><p class="paragraph" style="text-align:left;">During development, security rules can be enforced using a linter. ESLint provides a <a class="link" href="https://www.npmjs.com/package/eslint-plugin-security?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">security plugin</a> for identifying potential hotspots.</p><h2 class="heading" style="text-align:left;">Integrate Monitoring Tools</h2><p class="paragraph" style="text-align:left;">There are many different Application Performance Monitoring (APM) tools on the market.</p><p class="paragraph" style="text-align:left;">Datadog, New Relic, and Dynatrace are some of the more popular ones, all with different price points.</p><p class="paragraph" style="text-align:left;">If you’re using a cloud platform, there’s native tools. For AWS, CloudWatch can be used for monitoring and observability (logs and metrics).</p><p class="paragraph" style="text-align:left;">X-Ray can be used for request tracing. This is useful for debugging issues spanning multiple services (end-to-end).</p><p class="paragraph" style="text-align:left;">Open source is also an option. A combination of Prometheus, Loki, and Grafana can be used to create dashboards and track metrics.</p><h2 class="heading" style="text-align:left;">Practice Debugging</h2><p class="paragraph" style="text-align:left;">As long as there’s code, there’s going to be bugs. Bugs need to be fixed, and code needs to be maintained. It’s inevitable.</p><p class="paragraph" style="text-align:left;"><i><b>Debugging is a skill and takes practice.</b></i></p><p class="paragraph" style="text-align:left;">Learn how to use the <a class="link" href="https://nodejs.org/api/debugger.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">debugger</a> (IDE) and how to debug memory leaks and performance issues.</p><p class="paragraph" style="text-align:left;">For memory leaks, a combination of a <a class="link" href="https://nodejs.org/en/learn/diagnostics/memory/using-heap-profiler/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">heap profiler</a>, <a class="link" href="https://nodejs.org/en/learn/diagnostics/memory/using-heap-snapshot/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">heap snapshots</a>, and <a class="link" href="https://nodejs.org/en/learn/diagnostics/memory/using-gc-traces?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">garbage collection traces</a> can be used.</p><p class="paragraph" style="text-align:left;">For performance issues, <a class="link" href="https://nodejs.org/en/learn/getting-started/profiling/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">Node.js has a built-in profiler (from V8)</a> to sample the stack at certain intervals. A generated tick file shows which functions take the most CPU time.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://nodejs.org/en/learn/diagnostics/poor-performance/using-linux-perf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">Linux Perf</a> is another tool that can be used for low level CPU profiling. The output can then be used to generate a flame graph.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/882796b2-27b4-4ba9-bd2a-64e1c36c3caa/129488674-8fc80fd5-549e-4a80-8ce2-2ba6be20f8e8.png?t=1713972501"/><div class="image__source"><span class="image__source_text"><p>Flame Graph For Visualizing Stack Traces</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://netflixtechblog.com/node-js-in-flames-ddd073803aa4?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">Netflix used flame graphs</a> to debug a performance issue related to Express.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network and subscribe:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p><hr class="content_break"><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Node.js Documentation,” <i>nodejs.org.</i><br><a class="link" href="https://nodejs.org/docs/latest/api/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">https://nodejs.org/docs/latest/api/</a>.</p><p class="paragraph" style="text-align:left;">[2] “User Journey,” <i>nodejs.org.</i><br><a class="link" href="https://nodejs.org/en/learn/diagnostics/user-journey?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">https://nodejs.org/en/learn/diagnostics/user-journey</a>.</p><p class="paragraph" style="text-align:left;">[2] “Docker Documentation,” <i>docs.docker.com.</i><br><a class="link" href="https://docs.docker.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-to-prepare-node-js-applications-for-production" target="_blank" rel="noopener noreferrer nofollow">https://docs.docker.com/</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=299e70b5-ec2f-45b1-a43b-583293be5a92&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Jersey Mike&#39;s Rebuilt their Infrastructure during COVID</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/467a39d8-6ffb-43cb-b211-59bd5bf30218/intro-1683041109.jpg" length="124109" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/how-jersey-mikes-rebuilt-infrastructure-covid</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-jersey-mikes-rebuilt-infrastructure-covid</guid>
  <pubDate>Thu, 18 Apr 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-04-18T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Infrastructure]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">Stephen here.</p><p class="paragraph" style="text-align:left;">I spend my weekends researching, learning, and creating content for this newsletter.</p><p class="paragraph" style="text-align:left;">It would mean the world to me, if you took a few seconds of your time to check out The Rundown AI.</p><p class="paragraph" style="text-align:left;">They’re the fastest growing AI newsletter for a reason (I’m a subscriber too).</p><p class="paragraph" style="text-align:left;">Now let’s get on with the show.</p><hr class="content_break"><div class="image"><a class="image__link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_21d62709-ed7f-4d84-9771-5130d85d6d95_e4221c46&bhcl_id=16b682c0-f9db-44f6-9341-4479f60ebce0_{{subscriber_id}}_{{email_address_id}}" rel="noopener" target="_blank"><img class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ce016bfa-cfa1-4095-8aea-de1a1995d7b1/rundownthumb.png?t=1712078481"/></a></div><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_21d62709-ed7f-4d84-9771-5130d85d6d95_e4221c46&bhcl_id=16b682c0-f9db-44f6-9341-4479f60ebce0_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Stay up-to-date with AI.</a></b></p><p class="paragraph" style="text-align:left;">The Rundown is the world’s fastest-growing AI newsletter, with over 500,000+ readers staying up-to-date with the latest AI news and learning how to apply it.</p><p class="paragraph" style="text-align:left;"><span style="color:rgb(34, 34, 34);">Our research team spends all day learning what’s new in AI, </span>then distills the most important developments into one free email every morning.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://magic.beehiiv.com/v1/4d03390d-2481-4299-b949-ffd8b38b4c38?email={{email}}&utm_source=beehiiv&utm_campaign={{publication_name_param}}&redirect_to=https%3A%2F%2Funiversity.therundown.ai%2Fcheckout%2Fjoin&redirect_delay=2&_bhiiv=opp_21d62709-ed7f-4d84-9771-5130d85d6d95_e4221c46&bhcl_id=16b682c0-f9db-44f6-9341-4479f60ebce0_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Sign up with one click.</a></p><hr class="content_break"><p class="paragraph" style="text-align:left;">Jersey Mike’s has been my latest fast food addiction.</p><p class="paragraph" style="text-align:left;">My go-to order is a #9 Club Supreme, Mike’s Way, with cherry pepper relish and jalapeños.</p><p class="paragraph" style="text-align:left;">So good.</p><p class="paragraph" style="text-align:left;">Don’t believe me? Give it a try some time. You won’t regret it.</p><p class="paragraph" style="text-align:left;">But what separates Jersey Mike’s from other sandwich chains is their commitment to giving back to the community.</p><p class="paragraph" style="text-align:left;">During the COVID pandemic, Jersey Mike’s ran an <a class="link" href="https://slickdeals.net/e/13940477-jersey-mike-s-50-off-all-subs-ordered-through-app?src=SiteSearchV2Algo1&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">advertising campaign offering 50% off all sandwiches</a>.</p><p class="paragraph" style="text-align:left;">To make the deal even sweeter, the company offered free deliveries.</p><p class="paragraph" style="text-align:left;">As you can guess, the majority of these orders came from their mobile app.</p><p class="paragraph" style="text-align:left;">The ad went viral, jumping from an average of 800 orders a day to 80,000+ orders within the first four hours.</p><p class="paragraph" style="text-align:left;">Jersey Mike’s legacy infrastructure couldn’t fulfill the orders, and <a class="link" href="https://www.reddit.com/r/marketing/comments/mhhu9m/please_learn_from_this_marketing_fail_from_jersey/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">customers were unhappy</a>.</p><p class="paragraph" style="text-align:left;">Changes needed to be made.</p><h2 class="heading" style="text-align:left;">A Sub Above</h2><p class="paragraph" style="text-align:left;">Jersey Mike’s used AWS for their existing services and pipelines. The logical choice was to continue building off the current environment.</p><p class="paragraph" style="text-align:left;">But that’s not the case.</p><p class="paragraph" style="text-align:left;">The team wanted <a class="link" href="https://www.jerseymikes.com/mobile-app?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">a new mobile app</a>. Like an eCommerce platform that provided customers with a complete ordering experience.</p><p class="paragraph" style="text-align:left;">An app with a rewards system, exclusive offers and multiple ordering options (delivery, pickup, catering).</p><p class="paragraph" style="text-align:left;">To reach these goals, the team needed to build from the ground up.</p><p class="paragraph" style="text-align:left;">An environment capable of supporting and maintaining a business-critical application.</p><p class="paragraph" style="text-align:left;">A system built around security, reliability, and performance.</p><h2 class="heading" style="text-align:left;">Freshly Made, Right in Front of You</h2><p class="paragraph" style="text-align:left;">Following the <a class="link" href="https://aws.amazon.com/architecture/cloud-foundations/cloud-foundations-framework-overview/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">Cloud Foundations Framework</a>, Jersey Mike’s built their deployment around AWS Control Tower.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b75246f0-78be-4969-8540-1a90bdb23cfe/image.png?t=1713364548"/><div class="image__source"><span class="image__source_text"><p>Jersey Mike’s Cloud Foundation Around AWS Control Tower</p></span></div></div><p class="paragraph" style="text-align:left;">The first step was to setup the following key services:</p><ul><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>AWS Organizations</b></span>: Centrally manage multiple AWS accounts.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>AWS Single Sign-On</b></span>: Manage user access to AWS applications and services (now known as AWS IAM Identity Center).</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>AWS CloudTrail</b></span>: Audit, monitor, and troubleshoot user activity and API usage.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>AWS Config</b></span>: Manage resource configuration changes.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Amazon SNS</b></span>: Publish messages to subscribers.</p></li></ul><p class="paragraph" style="text-align:left;">By creating a proper <a class="link" href="https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-aws-environment/understanding-landing-zones.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">landing zone</a> and leveraging <a class="link" href="https://aws.amazon.com/blogs/mt/automate-account-customization-using-account-factory-customization-in-aws-control-tower/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">Account Factory</a>, Jersey Mike’s built an automated provisioning strategy for multiple accounts.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/32bb06d8-9b8a-417d-a2d4-def55eccc94e/image.png?t=1713364597"/><div class="image__source"><span class="image__source_text"><p>Automated Account Provisioning Strategy With Account Factory</p></span></div></div><p class="paragraph" style="text-align:left;">This strategy provisioned accounts in a standardized, secure and repeatable way.</p><h2 class="heading" style="text-align:left;">It’s Not Just a Sandwich, It’s a Jersey Mike’s</h2><p class="paragraph" style="text-align:left;">With the core AWS accounts completed, the team used <a class="link" href="https://aws.amazon.com/cloudformation/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">AWS CloudFormation</a> to automate infrastructure within each account.</p><p class="paragraph" style="text-align:left;">The team created CloudFormation templates to do the following:</p><ul><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Deploy infrastructure components</b></span>: EKS resources, Fargate, RDS, and more.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Deploy VPC for Flow Logs</b></span>: Logs aggregated to centralized S3 bucket.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Attach VPC to AWS Transit Gateway</b></span>: Gain visibility of network traffic patterns.</p></li></ul><p class="paragraph" style="text-align:left;"><i>How about scalability?</i></p><p class="paragraph" style="text-align:left;">Jersey Mike’s new mobile app needed to scale with demand in a cost efficient way.</p><p class="paragraph" style="text-align:left;">By pairing EKS with Fargate, the system would scale accordingly, and the company would only pay for the resources needed to run the app.</p><p class="paragraph" style="text-align:left;">In addition, both services can easily be integrated into existing application pipelines.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0dea8882-fde8-43b9-90c4-2f4508b7a835/image.png?t=1713318062"/><div class="image__source"><span class="image__source_text"><p>Scaling Jersey Mike’s Mobile App with EKS on Fargate</p></span></div></div><p class="paragraph" style="text-align:left;">As an influx of orders came in, Kubernetes would deploy more pods to handle the increased load through <a class="link" href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">autoscaling</a>. This is also known as <a class="link" href="https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/wat.concept.horizontal-scaling.en.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">horizontal scaling</a>.</p><p class="paragraph" style="text-align:left;">With these new infrastructure changes, Jersey Mike’s is able to meet high user demand, optimize cloud spend, and reduce the operation workload for their team.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network and subscribe:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p><hr class="content_break"><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Jersey Mike’s is a Brand that Believes,” <i>jerseymikes.com.</i><br><a class="link" href="https://www.jerseymikes.com/culture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">https://www.jerseymikes.com/culture</a>.</p><p class="paragraph" style="text-align:left;">[2] “Jersey Mike’s: Securely Scaling Cloud Capabilities to Meet Demand,” <i>wwt.com.</i><br><a class="link" href="https://www.wwt.com/case-study/jersey-mikes-securely-scaling-to-meet-demand?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">https://www.wwt.com/case-study/jersey-mikes-securely-scaling-to-meet-demand</a>.</p><p class="paragraph" style="text-align:left;">[3] “AWS Well-Architected,” <i>aws.amazon.com.</i><br><a class="link" href="https://aws.amazon.com/architecture/well-architected?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">https://aws.amazon.com/architecture/well-architected</a>.</p><p class="paragraph" style="text-align:left;">[4] “Cloud Foundations Framework Overview,” <i>aws.amazon.com.</i><br><a class="link" href="https://aws.amazon.com/architecture/cloud-foundations/cloud-foundations-framework-overview/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-jersey-mike-s-rebuilt-their-infrastructure-during-covid" target="_blank" rel="noopener noreferrer nofollow">https://aws.amazon.com/architecture/cloud-foundations/cloud-foundations-framework-overview/</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=4021180b-4140-47a3-a451-9ed4f55ece59&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Evolution of SoundCloud: Final Part</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8e769d23-46a2-4e0d-a754-9aa25f9c5205/419679-1x1_SoundCloudLogo_cloudmark-f5912b-medium-1645807040.jpg" length="7086" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/evolution-soundcloud-architecture-final</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/evolution-soundcloud-architecture-final</guid>
  <pubDate>Thu, 11 Apr 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-04-11T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Architecture]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;"><i>This is the final part of the SoundCloud series. If you haven’t read the previous parts, I encourage you to do so. You can read </i><b><a class="link" href="https://www.fullstackexpress.io/p/evoluton-soundcloud-architecture-part-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow"><i>Part 1 here</i></a></b><b><i> </i></b><i>and </i><b><a class="link" href="https://www.fullstackexpress.io/p/evolution-soundcloud-architecture-part-2?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow"><i>Part 2 here</i></a></b><i>.</i></p><hr class="content_break"><p class="paragraph" style="text-align:left;">Hi, I’m Stephen!</p><p class="paragraph" style="text-align:left;">I spend my weekends researching, learning, and creating content for this newsletter.</p><p class="paragraph" style="text-align:left;">It would mean the world to me, if you took a few seconds of your time to check out Bright Data.</p><p class="paragraph" style="text-align:left;">At least see why they’re the world’s #1 web data platform. They even have their own dog walkers.</p><p class="paragraph" style="text-align:left;">Go ahead and check them out. Now let’s get on with the show.</p><hr class="content_break"><div class="image"><a class="image__link" href="https://brightdata.com/?utm_source=brand&utm_campaign=brnd-mkt_newsletter_beehiiv_{{publication_name_param}}&_bhiiv=opp_d46a90ad-3bcf-4867-8dcb-da75459e6f66_28ad078a&bhcl_id=0c14d123-4dec-4fe3-b5ea-dd4a5955fb0f_{{subscriber_id}}_{{email_address_id}}" rel="noopener" target="_blank"><img class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d7119fec-c3f5-4d64-a8fb-6fb6ad5f7e51/Get_more__Spend_Less.jpg?t=1710354754"/></a></div><h2 class="heading" style="text-align:left;" id="web-intelligence-unlocked">Web Intelligence, Unlocked</h2><p class="paragraph" style="text-align:left;">With <a class="link" href="https://brightdata.com/?utm_source=brand&utm_campaign=brnd-mkt_newsletter_beehiiv_{{publication_name_param}}&_bhiiv=opp_d46a90ad-3bcf-4867-8dcb-da75459e6f66_28ad078a&bhcl_id=0c14d123-4dec-4fe3-b5ea-dd4a5955fb0f_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Bright Data</a>&#39;s cutting-edge proxy solutions, harness the full potential of web data for your business. Tap into our global proxy network to scale your data collection activities. Ecommerce platforms, travel agencies, financial institutions, and market researchers are all leveraging web data to gain a competitive edge. </p><p class="paragraph" style="text-align:left;"><a class="link" href="https://brightdata.com/?utm_source=brand&utm_campaign=brnd-mkt_newsletter_beehiiv_{{publication_name_param}}&_bhiiv=opp_d46a90ad-3bcf-4867-8dcb-da75459e6f66_28ad078a&bhcl_id=0c14d123-4dec-4fe3-b5ea-dd4a5955fb0f_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Bright Data</a> offers the scalability and flexibility necessary for gathering and analyzing web data. <a class="link" href="https://brightdata.com/?utm_source=brand&utm_campaign=brnd-mkt_newsletter_beehiiv_{{publication_name_param}}&_bhiiv=opp_d46a90ad-3bcf-4867-8dcb-da75459e6f66_28ad078a&bhcl_id=0c14d123-4dec-4fe3-b5ea-dd4a5955fb0f_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Take the first step towards data-driven excellence</a>.</p><p class="paragraph" style="text-align:left;"></p><hr class="content_break"><p class="paragraph" style="text-align:left;">Previously, we learned why SoundCloud pivoted towards a microservices architecture.</p><p class="paragraph" style="text-align:left;">The catalyst for this decision started with the engineering team’s inefficient development process.</p><p class="paragraph" style="text-align:left;">In order to deliver more features, the team as a whole needed to be more productive.</p><p class="paragraph" style="text-align:left;">As a result, a collaborative approach was implemented across the engineering, design, and product teams.</p><p class="paragraph" style="text-align:left;">All working together in unison to deliver new features.</p><p class="paragraph" style="text-align:left;">SoundCloud’s progression towards a microservice architecture proved to be challenging.</p><p class="paragraph" style="text-align:left;">Even though new services were stood up, they still had to work in conjunction with the Mothership.</p><p class="paragraph" style="text-align:left;">This is the evolution of SoundCloud’s architecture over the last 10 years.</p><h2 class="heading" style="text-align:left;">Backends for Frontends</h2><p class="paragraph" style="text-align:left;">The combination of autonomous teams, new microservices, and an internal API led to a new concept: Backends for Frontends (BFFs).</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://philcalcado.com/about/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">Phil Calçado</a> first introduced this architectural pattern at SoundCloud in 2013.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f435b7fc-7d14-41c1-b34b-33bd588c8677/image.png?t=1712710422"/><div class="image__source"><span class="image__source_text"><p>Backends for Frontends Pattern</p></span></div></div><p class="paragraph" style="text-align:left;">The pattern focuses on creating multiple, dedicated API gateways for each client platform (web, mobile). BFFs are also responsible for:</p><ul><li><p class="paragraph" style="text-align:left;">Rate limiting</p></li><li><p class="paragraph" style="text-align:left;">Authentication</p></li><li><p class="paragraph" style="text-align:left;">Header sanitization</p></li><li><p class="paragraph" style="text-align:left;">Cache control</p></li></ul><p class="paragraph" style="text-align:left;">One advantage is autonomy. Separate APIs allow each specific client type to be optimized.</p><p class="paragraph" style="text-align:left;">Another is resilience. If a BFF goes down in an availability zone, the rest of the platform would still be available.</p><p class="paragraph" style="text-align:left;">Finally, sometimes ugly workarounds and mitigations are necessary. It’s much easier to implement these in the BFF versus a more complex application like the Mothership.</p><p class="paragraph" style="text-align:left;">Today, SoundCloud handles dozens of BFFs, each one powering a dedicated API (Mobile, Web, Public, Partner). </p><p class="paragraph" style="text-align:left;">These BFFs handle hundreds of millions of requests per hour.</p><h2 class="heading" style="text-align:left;">With Great Power Comes Great Responsibility</h2><p class="paragraph" style="text-align:left;">Like any solution, there’s always tradeoffs.</p><p class="paragraph" style="text-align:left;">For example, multiple BFFs can oftentimes lead to duplicate code. Even worse, inconsistent implementations.</p><p class="paragraph" style="text-align:left;">Authorization rules that can only be applied at integration time can also be problematic. Imagine if private or unreleased tracks were leaked.</p><p class="paragraph" style="text-align:left;">Two areas needing improvement were the Track and Playlist entities (more on these later).</p><p class="paragraph" style="text-align:left;">As they grew, these entities were decomposed into multiple microservices.</p><p class="paragraph" style="text-align:left;"><i>How does one decide when to create a new BFF or when to reuse an existing one?</i></p><p class="paragraph" style="text-align:left;"><i>And how many BFFs is too many?</i></p><p class="paragraph" style="text-align:left;">Both valid questions. Clearly, there’s a tradeoff between autonomy and operational overhead.</p><p class="paragraph" style="text-align:left;">BFFs require extensive collaboration between frontend and backend engineers.</p><h2 class="heading" style="text-align:left;">Value-Added Services</h2><p class="paragraph" style="text-align:left;">With the amount of business logic and authorization code living in the BFFs, they became difficult to maintain.</p><p class="paragraph" style="text-align:left;">Keeping code synchronized and consistent was a big challenge.</p><p class="paragraph" style="text-align:left;">To address these issues, the team needed to make some architecture improvements.</p><p class="paragraph" style="text-align:left;"><b>Enter Value-Added Services (VAS)</b>.</p><p class="paragraph" style="text-align:left;">VAS are business services solely responsible for returning entities and associated value objects (aggregate).</p><p class="paragraph" style="text-align:left;">Consolidating the business logic into its own service keeps the BFFs clean. In doing so, centralized point is created where metadata and authorization rules can be defined.</p><p class="paragraph" style="text-align:left;">This is known as the <a class="link" href="https://en.wikipedia.org/wiki/Separation_of_concerns?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">separation of concerns principle</a>.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cfe51e55-d545-4f68-a0e4-05235463bd63/image.png?t=1712710444"/><div class="image__source"><span class="image__source_text"><p>SoundCloud’s Architecture Containing Multiple Service Layers</p></span></div></div><p class="paragraph" style="text-align:left;">The new architecture is divided into three core service layers:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Edge</b></span>: BFFs live in this layer and maintain dedicated APIs. Each API is tailored to a specific client.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Value Added</b></span>: Consumes and processes data from other services (VAS or Foundation) for user experience.</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">Foundation</span></b>: Serves as the building blocks around different domains and contains low-level services.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2ee6b4e6-303b-4006-b6d4-d6b5a7d656e4/entity_diagram.png?t=1712751318"/><div class="image__source"><span class="image__source_text"><p>Value-Added Service’s Building Blocks</p></span></div></div><p class="paragraph" style="text-align:left;">Each VAS also consists of the following building blocks:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Domain</b></span>: Represents a user or business concern. Used to draw boundaries around service integrations.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Entity</b></span>: Represents an object with an independent identifier and lifecycle.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Value Objects</b></span>: Contains an entity’s metadata. Also tied to the lifecycle of the entity.</p></li><li><p class="paragraph" style="text-align:left;"><b><span style="text-decoration:underline;">Aggregate</span></b>: Contains one or more relate entities.</p></li></ol><h2 class="heading" style="text-align:left;">Tracks and Playlists</h2><p class="paragraph" style="text-align:left;">In 2019, the team began applying the VAS pattern, starting with the Tracks VAS.</p><p class="paragraph" style="text-align:left;">A track is an entity with associated value objects like metadata, transcodings, and authorization policies to determine who can see that track.</p><p class="paragraph" style="text-align:left;">Since each track has an owning user (user is its own entity), the track object holds a user id as a reference.</p><p class="paragraph" style="text-align:left;">Simultaneously, if another consuming service has a track id that needs to be resolved, that service can call the Tracks VAS.</p><p class="paragraph" style="text-align:left;">The Tracks VAS will then determine whether the request is authorized and return the track aggregate accordingly.</p><p class="paragraph" style="text-align:left;">This effort was successful and in 2020, the team started a major refactoring of the Public API.</p><p class="paragraph" style="text-align:left;">Up first were the track-related endpoints.</p><p class="paragraph" style="text-align:left;">With the new Tracks VAS, all track-related endpoints just had to be re-routed to the new service (Public API was calling the Mothership directly).</p><p class="paragraph" style="text-align:left;">But the playlist-related endpoints were far more complex. Business logic and authorization rules were spread across multiple BFFs and services.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7571cea1-4c6c-4dc3-b854-77d37a67d6e2/flow_chart_pre_vas_2.png?t=1712752835"/><div class="image__source"><span class="image__source_text"><p>Original Architecture Without VAS</p></span></div></div><p class="paragraph" style="text-align:left;">The logical solution was to stand up a new Playlists VAS to centralize all playlist-related logic.</p><p class="paragraph" style="text-align:left;">By doing so, cross-platform feature development, refactoring and optimizations would be easier and faster.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/db8fcaaf-746b-4040-9a30-3eb8c469cba0/image.png?t=1712753310"/><div class="image__source"><span class="image__source_text"><p>New Architecture With VAS</p></span></div></div><p class="paragraph" style="text-align:left;">This also solved the authorization inconsistencies across multiple services and reduced the risk of potential vulnerabilities.</p><h2 class="heading" style="text-align:left;">SoundCloud’s Architecture Today</h2><p class="paragraph" style="text-align:left;">As SoundCloud’s platform grew, so did the scope of each VAS.</p><p class="paragraph" style="text-align:left;">For example, SoundCloud provides music tracks to consumer applications. </p><p class="paragraph" style="text-align:left;">But the platform also provides tools for creators to upload and distribute their music.</p><p class="paragraph" style="text-align:left;">As both use cases grew, so did the complexity of the Tracks VAS. The engineering team determined that the VAS pattern needed to evolve.</p><p class="paragraph" style="text-align:left;">A more scalable approach was needed.</p><p class="paragraph" style="text-align:left;">What was originally one domain has now grown into two similar but different business domains.</p><p class="paragraph" style="text-align:left;">As a result, using the same implementation for both was no longer the best solution.</p><p class="paragraph" style="text-align:left;">It was time to create different implementations specific for each use case (same line of thinking as BFFs).</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/54f71f9f-90a5-4af9-aac8-e32afd44cf1e/image.png?t=1712755174"/><div class="image__source"><span class="image__source_text"><p>Different Domain Gateways For Tracks</p></span></div></div><p class="paragraph" style="text-align:left;">This led to the adoption of <a class="link" href="https://www.uber.com/blog/microservice-architecture/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">Domain Gateways and a Domain-Oriented Microservice Architecture (DOMA)</a>, an architecture also used by Uber.</p><p class="paragraph" style="text-align:left;">Each business domain would have its own implementation, but still rely on the same foundational layer of services.</p><p class="paragraph" style="text-align:left;">Overall, this <a class="link" href="https://en.wikipedia.org/wiki/Facade_pattern?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">façade</a> provides both stability and an anti-corruption layer for each of the domains.</p><p class="paragraph" style="text-align:left;">This pattern is still being implemented at SoundCloud today.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network and subscribe:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p><hr class="content_break"><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Evolution of SoundCloud’s Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture</a>.</p><p class="paragraph" style="text-align:left;">[2] “Building Products at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith</a>.</p><p class="paragraph" style="text-align:left;">[3] “Service Architecture at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/service-architecture-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/service-architecture-1</a>.</p><p class="paragraph" style="text-align:left;">[4] “How SoundCloud Uses HAProxy with Kubernetes for User-Facing Traffic,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic</a>.</p><p class="paragraph" style="text-align:left;">[5] “The End of the Public API Strangler,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/end-of-the-strangler?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/end-of-the-strangler</a>.</p><p class="paragraph" style="text-align:left;">[6] “How We Develop New Features Using Offsites and Clean Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture</a>.</p><p class="paragraph" style="text-align:left;">[7] “How We Ended Up With Microservices,” <i>philcalcado.com.</i><br><a class="link" href="https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html</a>.</p><p class="paragraph" style="text-align:left;">[8] “BFF @ SoundCloud,” <i>thoughtworks.com.</i><br><a class="link" href="https://www.thoughtworks.com/insights/blog/bff-soundcloud?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://www.thoughtworks.com/insights/blog/bff-soundcloud</a>.</p><p class="paragraph" style="text-align:left;">[9] “Pattern: Backends For Frontends,” <i>samnewman.io.</i><br><a class="link" href="https://samnewman.io/patterns/architectural/bff/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://samnewman.io/patterns/architectural/bff/</a>.</p><p class="paragraph" style="text-align:left;">[10] “Pattern: Backends For Frontends,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/announcing-twinagle?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/announcing-twinagle</a>.</p><p class="paragraph" style="text-align:left;">[11] “Microservices and the Monolith,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/microservices-and-the-monolith?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=evolution-of-soundcloud-final-part" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/microservices-and-the-monolith</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=f5ad0c3e-2bf0-4d46-aff3-54e3dc3faf4c&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>The Evolution of SoundCloud&#39;s Architecture: Part 2</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/639b1062-3273-4e55-9096-c30bc6b41c9b/jbareham_170721_1862_0056.jpg" length="149904" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/evolution-soundcloud-architecture-part-2</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/evolution-soundcloud-architecture-part-2</guid>
  <pubDate>Thu, 04 Apr 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-04-04T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Architecture]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;"><i>This is Part 2 of the SoundCloud series. If you haven’t read Part 1, I encourage you to do so. You can read it </i><b><a class="link" href="https://www.fullstackexpress.io/p/evoluton-soundcloud-architecture-part-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow"><i>here</i></a></b><i>.</i></p><hr class="content_break"><p class="paragraph" style="text-align:left;">Previously, we learned SoundCloud wasn’t initially built for scale. The platform was built for opportunity.</p><p class="paragraph" style="text-align:left;">The team was adaptive, product-driven, and developed a simple architecture.</p><p class="paragraph" style="text-align:left;">To SoundCloud, scaling was a luxury problem. A problem that could be addressed over time.</p><p class="paragraph" style="text-align:left;">SoundCloud at this point was a combination of a large social network and music distribution platform.</p><p class="paragraph" style="text-align:left;">Every minute, there was about 12 hours of music uploaded, with hundreds of millions of daily users.</p><p class="paragraph" style="text-align:left;">The Mothership was battle-tested against peak performance, and <a class="link" href="https://github.com/soundcloud/lhm?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">great tooling</a> was created to facilitate the next level of growth.</p><p class="paragraph" style="text-align:left;">But as it turns out, technical challenges were only a small piece of the puzzle.</p><p class="paragraph" style="text-align:left;">The core issue holding SoundCloud back was in their development process.</p><h2 class="heading" style="text-align:left;">Visualizing the Development Process</h2><p class="paragraph" style="text-align:left;">The engineering team at the time was really made up of two core teams:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>App team</b></span>: Responsible for the Mothership and old (current) user interface.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Web team</b></span>: Responsible for <i>v2,</i> branded as The Next SoundCloud, a single-page JavaScript web application.</p></li></ol><p class="paragraph" style="text-align:left;">There was a big disconnect as both teams worked in isolation (separate buildings) and communicated mainly through issue trackers and IRC.</p><p class="paragraph" style="text-align:left;">In order to identify problems in the development process, the teams used a method called <a class="link" href="https://en.wikipedia.org/wiki/Value-stream_mapping?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">value-stream mapping</a>.</p><p class="paragraph" style="text-align:left;">This tool can be used to visualize critical steps in a process, and quantify the time taken in each stage.</p><p class="paragraph" style="text-align:left;">In this case, it would be the different stages the teams need to deliver a feature.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/16533bfd-d56f-4cbf-9256-66b1d6469dcd/vm1.png?t=1712073582"/><div class="image__source"><span class="image__source_text"><p>Value-Stream Mapping: Original Process</p></span></div></div><p class="paragraph" style="text-align:left;">With the current process, it would take over two months to go live with a feature.</p><p class="paragraph" style="text-align:left;">More than half the time was waiting for the feature to be picked up by the next person responsible.</p><p class="paragraph" style="text-align:left;">The flow looked something like this:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">There’s an idea for a new feature. Spec and screen mockups are written and stored in Google Drive.</p></li><li><p class="paragraph" style="text-align:left;"><i>Waiting</i></p></li><li><p class="paragraph" style="text-align:left;">Design team gets the spec and designs user experience. Development card is added to the Web team’s Trello board.</p></li><li><p class="paragraph" style="text-align:left;"><i>Waiting</i></p></li><li><p class="paragraph" style="text-align:left;">A front-end engineer converts the design into client-side code using mock data. A story is created in Pivotal Tracker with the necessary API (Rails) changes.</p></li><li><p class="paragraph" style="text-align:left;"><i>Waiting</i></p></li><li><p class="paragraph" style="text-align:left;">A back-end engineer writes the code, integration tests, and any changes needed to get the API live. Card in Trello is updated.</p></li><li><p class="paragraph" style="text-align:left;"><i>Waiting</i></p></li><li><p class="paragraph" style="text-align:left;">A front-end engineer implements the new backend changes and gives the green light for deployment.</p></li><li><p class="paragraph" style="text-align:left;">Deployments were risky and painful, so the App team waits for several features before deploying to production. Rollbacks happened frequently due to unrelated code issues.</p></li></ol><p class="paragraph" style="text-align:left;"><b><i>Out of a grand total of 66 days, only 11 days was actually used for development.</i></b></p><h2 class="heading" style="text-align:left;">From 66 Days to 24 Days</h2><p class="paragraph" style="text-align:left;">In order to improve the development process, fundamental changes were needed.</p><p class="paragraph" style="text-align:left;">Through value-stream mapping, letting features accumulate in the main branch before deployment was not ideal.</p><p class="paragraph" style="text-align:left;">Instead, the engineering team adopted an <a class="link" href="https://www.productplan.com/glossary/agile-release-train/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">Agile Release Train (ART) approach</a> for the Mothership. In fact, regardless of how many features were in the main branch, deployments would happen every day after standup.</p><p class="paragraph" style="text-align:left;">As a result, features were deployed to production when they were ready, not several days later.</p><p class="paragraph" style="text-align:left;">Another problem was the disconnect between the Web and App teams. Not only were the teams working in isolation, but the back-end developers felt they didn’t have a say in the product.</p><p class="paragraph" style="text-align:left;">The process was extremely frontend-driven.</p><p class="paragraph" style="text-align:left;">To address this issue head on, the process was modified to pair the front-end and back-end developers together.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/30d65969-9fac-47bb-96b0-176be0cbcef2/vm3.png?t=1712084265"/><div class="image__source"><span class="image__source_text"><p>Value-Stream Mapping: Pairing Front-End and Back-End Engineers</p></span></div></div><p class="paragraph" style="text-align:left;">This change ensured constant communication between the two and would hold the pair responsible for the completion of a feature.</p><p class="paragraph" style="text-align:left;">Last but not least, the team added a mandatory code review to the process. Every pull request had to at least be approved by a second engineer before the changes could be merged to the main branch.</p><p class="paragraph" style="text-align:left;">The collaboration-driven approach worked well for the engineering team as a whole. So much so, it was also implemented across the design and product teams as well.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/08aaa855-0dce-47a2-8be1-bd6b7f795d86/image.png?t=1712094324"/><div class="image__source"><span class="image__source_text"><p>Value-Stream Mapping: Final Process</p></span></div></div><p class="paragraph" style="text-align:left;">The end result was 24 days.</p><p class="paragraph" style="text-align:left;"><b><i>A 42 day improvement for a feature to go from idea to go live!</i></b></p><h2 class="heading" style="text-align:left;">Building Alongside the Mothership</h2><p class="paragraph" style="text-align:left;">Even though the process improved significantly, the previous diagram still showed features sitting in GitHub for 7 days before being reviewed.</p><p class="paragraph" style="text-align:left;"><i>Why would a new feature sit in queue for so long?</i></p><p class="paragraph" style="text-align:left;">The Mothership codebase was massive and complex.</p><p class="paragraph" style="text-align:left;">Not only did large changes require time to be reviewed, big changes were extremely risky due to all the tightly-coupled code over the years.</p><p class="paragraph" style="text-align:left;">The first thought is to create smaller pull requests.</p><p class="paragraph" style="text-align:left;">Breaking large code changes into smaller pull requests meant that things would be more manageable and reviews would be easier, but could also lead to unforeseen architecture mistakes.</p><p class="paragraph" style="text-align:left;"><i>Well, why does a single codebase need to implement so many features and components?</i></p><p class="paragraph" style="text-align:left;"><i>Why not break the monolith into multiple, smaller systems?</i></p><p class="paragraph" style="text-align:left;">Now that the development process has been addressed, it’s time to tackle the technical challenges.</p><p class="paragraph" style="text-align:left;">Even though the Mothership had a battle-tested architecture, in order for the team and the platform to continue to scale, a new strategy had to be implemented.</p><p class="paragraph" style="text-align:left;">A strategy that could be implemented incrementally and could deliver value right away.</p><p class="paragraph" style="text-align:left;"><b><i>Enter microservices.</i></b></p><h2 class="heading" style="text-align:left;">Adding Microservices Into the Mix</h2><p class="paragraph" style="text-align:left;">Instead of splitting up the monolith immediately, the engineering team made the decision to first build new features as microservices.</p><p class="paragraph" style="text-align:left;">Nothing new would be added to the Mothership, and any feature that needed refactoring in the monolith, would be extracted out. </p><p class="paragraph" style="text-align:left;">But as more microservices were created, a new problem arose.</p><p class="paragraph" style="text-align:left;">Since the Mothership still had the majority of the logic, the majority of the microservices still had to communicate with it in some shape or form.</p><p class="paragraph" style="text-align:left;">A common approach would be to have the microservices access the Mothership’s database directly. The issue with this approach is the <a class="link" href="https://martinfowler.com/ieeeSoftware/published.pdf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">public versus published interfaces problem</a>.</p><p class="paragraph" style="text-align:left;">Having both the Mothership and microservices share the same tables would make it difficult to make table structure changes down the road.</p><p class="paragraph" style="text-align:left;">Instead, the engineering team decided to have the microservices consume the <a class="link" href="https://developers.soundcloud.com/docs/api/guide?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">Public API</a>, a published interface.</p><p class="paragraph" style="text-align:left;">This meant that SoundCloud’s own internal microservices would behave exactly like the third-party applications integrating with the platform.</p><p class="paragraph" style="text-align:left;">This model had a major flaw: The microservices needed to be aware of user activity updates.</p><p class="paragraph" style="text-align:left;">For example, if a track received a new comment, the push notifications system needed to know about it.</p><p class="paragraph" style="text-align:left;">With the current architecture, there wasn’t a way for these microservices to be notified. Polling would also be a bad solution at this scale.</p><p class="paragraph" style="text-align:left;">The engineering team decided on two major architecture changes:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">A new model called Semantic Events was created.</p></li><li><p class="paragraph" style="text-align:left;">A new Internal API was created using Rails’ engines.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/64787cdc-8cc2-4ca1-88bc-266e5a83a933/product-engineering-diagram-4.jpg?t=1712113508"/><div class="image__source"><span class="image__source_text"><p>SoundCloud’s Transition to Microservices Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">Whenever there was a change in the domain objects, a corresponding message would be dispatched to the broker.</p><p class="paragraph" style="text-align:left;">This message could then be consumed by any of the microservices, allowing them to react appropriately to the event.</p><p class="paragraph" style="text-align:left;">These new changes also enabled <a class="link" href="https://martinfowler.com/eaaDev/EventSourcing.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">Event Sourcing</a>, allowing the microservices to deal with shared data.</p><p class="paragraph" style="text-align:left;">Since the Public API was used by external applications, there were limitations on certain data that could be accessed. By creating an Internal API, microservices could access private data and notify users of private information.</p><p class="paragraph" style="text-align:left;">The main idea around the new architecture changes was to break the coupling between the Mothership and the new microservices, by adding push and pull interfaces.</p><p class="paragraph" style="text-align:left;">Contrary to what most people think, the catalyst for SoundCloud’s move towards a microservice architecture was driven mostly to improve team productivity.</p><p class="paragraph" style="text-align:left;">Without streamlining the development process first, the team wouldn’t be able to produce and scale fast enough to build out the features the platform needed.</p><p class="paragraph" style="text-align:left;">These new changes led to shorter feedback cycles, and allowed the team to push out production-ready features at a faster pace.</p><p class="paragraph" style="text-align:left;"><i><b>In Part 3 of this series, we’ll learn about SoundCloud’s new challenges and design patterns with the microservices architecture.</b></i></p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network and subscribe:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p><hr class="content_break"><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Evolution of SoundCloud’s Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture</a>.</p><p class="paragraph" style="text-align:left;">[2] “Building Products at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith</a>.</p><p class="paragraph" style="text-align:left;">[3] “Service Architecture at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/service-architecture-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/service-architecture-1</a>.</p><p class="paragraph" style="text-align:left;">[4] “How SoundCloud Uses HAProxy with Kubernetes for User-Facing Traffic,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic</a>.</p><p class="paragraph" style="text-align:left;">[5] “The End of the Public API Strangler,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/end-of-the-strangler?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/end-of-the-strangler</a>.</p><p class="paragraph" style="text-align:left;">[6] “How We Develop New Features Using Offsites and Clean Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture</a>.</p><p class="paragraph" style="text-align:left;">[7] “How We Ended Up With Microservices,” <i>philcalcado.com.</i><br><a class="link" href="https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html</a>.</p><p class="paragraph" style="text-align:left;">[8] “BFF @ SoundCloud,” <i>thoughtworks.com.</i><br><a class="link" href="https://www.thoughtworks.com/insights/blog/bff-soundcloud?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://www.thoughtworks.com/insights/blog/bff-soundcloud</a>.</p><p class="paragraph" style="text-align:left;">[9] “Pattern: Backends For Frontends,” <i>samnewman.io.</i><br><a class="link" href="https://samnewman.io/patterns/architectural/bff/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://samnewman.io/patterns/architectural/bff/</a>.</p><p class="paragraph" style="text-align:left;">[10] “Pattern: Backends For Frontends,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/announcing-twinagle?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/announcing-twinagle</a>.</p><p class="paragraph" style="text-align:left;">[11] “Microservices and the Monolith,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/microservices-and-the-monolith?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/microservices-and-the-monolith</a>.</p><p class="paragraph" style="text-align:left;">[12] “How SoundCloud’s Broken Business Model Drove Artists Away,” <i>theverge.com.</i><br><a class="link" href="https://www.theverge.com/2017/7/21/15999172/soundcloud-business-model-future-spotify-streaming?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-2" target="_blank" rel="noopener noreferrer nofollow">https://www.theverge.com/2017/7/21/15999172/soundcloud-business-model-future-spotify-streaming</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=fdb25c83-d44f-424c-8d86-c959ec336792&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>The Evolution of SoundCloud&#39;s Architecture: Part 1</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/037fa044-f064-4186-84a4-a4c34b547bb8/rachit-tank-CDJa851MH0E-unsplash.jpg" length="89076" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/evoluton-soundcloud-architecture-part-1</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/evoluton-soundcloud-architecture-part-1</guid>
  <pubDate>Thu, 28 Mar 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-03-28T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Architecture]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">Stephen here.</p><p class="paragraph" style="text-align:left;">I spend my weekends researching, learning, and creating content for this newsletter.</p><p class="paragraph" style="text-align:left;">It would mean the world to me, if you took a few seconds of your time to check out Clumio.</p><p class="paragraph" style="text-align:left;">At least see why they were able to raise $75 million. Even Atlassian is using it for Jira.</p><p class="paragraph" style="text-align:left;">Doing so supports my work. Now let’s get on with the show.</p><hr class="content_break"><div class="image"><img class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dd2b4c32-e90c-4314-9b7c-68eaa1cf5ae5/s3_dummies__1_.png?t=1710479684"/></div><h2 class="heading" style="text-align:left;" id="get-smarter-about-protecting-your-s"><a class="link" href="https://track.presspool.ai/U2FsdGVkX188Ex4vy08FNivFxJln2gJj%2FBjSnTGRGBoKKCr%2FAKBwRfDOUydSmfzmCHWgwLPq0AOQ1VlzO%2BD7l38NhasOwCs2EeuU6QJtx3IL2ZxQ2KP0un0pmNx9pUsGcLoubzGs%2BDO68VA7EJOJxY%2BsXBlNIX%2B28oDM79mJK%2Fk%3D?_bhiiv=opp_1391767f-274f-4a6f-883f-64de250bed9b_fda39895&bhcl_id=e1a55493-334a-4040-942c-6a6ad3ee77ce_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">Get smarter about protecting your S3 data</a></h2><p class="paragraph" style="text-align:left;">With rising costs for Amazon S3 storage and potentially devastating business consequences from data loss, you need a holistic approach to cutting unnecessary spending and guarding against risks. Lawrence Miller, a consultant to multinational corporations who holds numerous networking certifications, has authored a concise volume that lays out the path to success in managing backup and compliance for S3 data lakes.</p><div class="button" style="text-align:center;"><a target="_blank" rel="noopener nofollow noreferrer" class="button__link" style="" href="https://track.presspool.ai/U2FsdGVkX188Ex4vy08FNivFxJln2gJj%2FBjSnTGRGBoKKCr%2FAKBwRfDOUydSmfzmCHWgwLPq0AOQ1VlzO%2BD7l38NhasOwCs2EeuU6QJtx3IL2ZxQ2KP0un0pmNx9pUsGcLoubzGs%2BDO68VA7EJOJxY%2BsXBlNIX%2B28oDM79mJK%2Fk%3D?_bhiiv=opp_1391767f-274f-4a6f-883f-64de250bed9b_fda39895&bhcl_id=e1a55493-334a-4040-942c-6a6ad3ee77ce_{{subscriber_id}}_{{email_address_id}}"><span class="button__text" style=""> Get the Free eBook! </span></a></div><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;"></p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i><b>Remember how difficult it used to be to find music?</b></i></p><p class="paragraph" style="text-align:left;">People used to use record players. And then cassette players. And then MP3 players.</p><p class="paragraph" style="text-align:left;">People pirated music through Napster and LimeWire.</p><p class="paragraph" style="text-align:left;">Separate devices had to be carried around in order to listen to music on the go.</p><p class="paragraph" style="text-align:left;">And then everything changed.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.youtube.com/watch?v=MnrJzXM7a6o&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">The Apple iPhone was released in 2007</a>, transforming the way we access and listen to music. iPod, phone, and Internet all-in-one.</p><p class="paragraph" style="text-align:left;">This revolutionary product paved the way for companies like SoundCloud today.</p><p class="paragraph" style="text-align:left;">As engineers, we can learn many valuable lessons analyzing the evolution of SoundCloud’s architecture over the last two decades.</p><h2 class="heading" style="text-align:left;">Scaling is a Luxury Problem</h2><p class="paragraph" style="text-align:left;">From the start, the engineering team optimized for opportunity.</p><p class="paragraph" style="text-align:left;">Instead of designing an architecture that could support millions of users, they started with a simple setup: Ruby on Rails application (called Mothership), Apache web server, and MySQL database.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2d33b14c-d0c4-4951-95dd-de4f4a2d1645/image.png?t=1711590027"/><div class="image__source"><span class="image__source_text"><p>SoundCloud’s Initial Architecture</p></span></div></div><p class="paragraph" style="text-align:left;"><i>Simple right?</i></p><p class="paragraph" style="text-align:left;">SoundCloud launched in 2008. There was no high availability. In fact, the architecture wasn’t even asynchronous.</p><p class="paragraph" style="text-align:left;">If a new comment was posted on a track, communication was blocked until all followers were notified.</p><p class="paragraph" style="text-align:left;"><i>What would be the reason for this?</i></p><p class="paragraph" style="text-align:left;">The answer goes back to optimizing for opportunity. They leveraged a simple tech stack the team knew well, and focused on delivering value to their users.</p><p class="paragraph" style="text-align:left;">As a result, SoundCloud was able to move fast and build a “sticky” platform with strong product-market fit.</p><p class="paragraph" style="text-align:left;">One way of showing this was by <a class="link" href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">eating their own dog food</a>.</p><p class="paragraph" style="text-align:left;">From the beginning, <a class="link" href="https://developers.soundcloud.com/docs/api/guide?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">SoundCloud’s public API</a> was developed alongside their website.</p><p class="paragraph" style="text-align:left;">Third-party applications integrating with SoundCloud used the same exact APIs used by the engineering team’s internal application.</p><p class="paragraph" style="text-align:left;">Shortly after, Apache was switched out for <a class="link" href="https://www.nginx.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Nginx</a> (incremental changes).</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a6fb87fd-3512-4e5b-a690-859158cb372f/image.png?t=1711590068"/><div class="image__source"><span class="image__source_text"><p>SoundCloud Changes Web Servers</p></span></div></div><p class="paragraph" style="text-align:left;">Nginx provided better connection pooling and simplified routing configurations between different environments.</p><h2 class="heading" style="text-align:left;">The Grocery Store and the Post Office</h2><p class="paragraph" style="text-align:left;">As SoundCloud grew, traffic grew.</p><p class="paragraph" style="text-align:left;">And as traffic grew, there was a growing problem: some workloads took much longer than others (hundreds of milliseconds).</p><p class="paragraph" style="text-align:left;">This was a problem with Nginx at the time. More specifically <a class="link" href="https://www.wallarm.com/what/what-is-http-2-and-how-is-it-different-from-http-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">HTTP/1</a>.</p><p class="paragraph" style="text-align:left;">In computer networking, there’s something called <a class="link" href="https://en.wikipedia.org/wiki/Head-of-line_blocking?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Head-of-Line (HoL) blocking</a>. This happens when slower requests clog up connections, and other requests are stuck waiting to be processed.</p><p class="paragraph" style="text-align:left;">Imagine waiting in line at the grocery store to checkout. Because the first customer has a cart full of items, the rest of the line is delayed.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8152d647-0668-4599-99a8-d335f3e3f987/resized_image_3_2_ratio.png?t=1711591070"/><div class="image__source"><span class="image__source_text"><p>Grocery Store HoL Blocking Example</p></span></div></div><p class="paragraph" style="text-align:left;">Today, HoL blocking is partially solved with HTTP/2 through multiplexing requests over a connection. <a class="link" href="https://stackoverflow.com/questions/45583861/how-does-http2-solve-head-of-line-blocking-hol-issue?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">This only solves blocking at the HTTP level but blocking can still happen at the TCP level</a>.</p><p class="paragraph" style="text-align:left;"><i>This begs the question, how can the current architecture process requests concurrently?</i></p><p class="paragraph" style="text-align:left;">When SoundCloud’s architecture was initially developed (2008), concurrent request processing in Rails was still considered immature.</p><p class="paragraph" style="text-align:left;">Instead of investing more time auditing dependencies, the engineering team decided to stay with the existing model:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Single concurrency per application server process.</p></li><li><p class="paragraph" style="text-align:left;">Multiple processes per host.</p></li></ol><p class="paragraph" style="text-align:left;">Even though there are multiple processes per host, SoundCloud was already experiencing high traffic. Several long-running requests could easily recreate the HoL blocking problem.</p><p class="paragraph" style="text-align:left;">For example, with 5 processes instead of 1, the system would theoretically be able to handle an average of 5 times as many slow requests.</p><p class="paragraph" style="text-align:left;">Again, picture yourself at the post office. You’re waiting in line for an available worker to help you with your package. With more people, there’s a higher chance of delays (people with multiple packages).</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e4ecb559-f9da-4480-a050-1872a626f5a2/DALL_E_2024-03-27_21.41.15_-_Design_a_simple_and_clear_diagram_in_a_3_2_aspect_ratio_that_represents_a_post_office_queue_system._The_diagram_should_visually_convey_a_single_waitin.png?t=1711593728"/><div class="image__source"><span class="image__source_text"><p>Post Office Example</p></span></div></div><p class="paragraph" style="text-align:left;"><i>How could this HoL problem be solved?</i></p><p class="paragraph" style="text-align:left;">The engineering team came to a realization. What they wanted was a system that never queued. Or at least a queue with minimal wait time.</p><p class="paragraph" style="text-align:left;">To accomplish this, they had to make sure each Rails application server never received more than one request at a time.</p><p class="paragraph" style="text-align:left;">They made the following changes:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Ensured servers were stateless.</p></li><li><p class="paragraph" style="text-align:left;">Added <a class="link" href="https://www.haproxy.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">HAProxy</a> to infrastructure.</p></li><li><p class="paragraph" style="text-align:left;">Configured backend with a maximum connection count of 1.</p></li></ol><p class="paragraph" style="text-align:left;">With a <a class="link" href="https://en.wikipedia.org/wiki/M/M/c_queue?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">multi-server queueing model (M/M/c)</a> and HAProxy as the queueing load balancer, any temporary back-pressure would be buffered.</p><p class="paragraph" style="text-align:left;">Again, simple design choices.</p><h2 class="heading" style="text-align:left;">Synchronous to Asynchronous</h2><p class="paragraph" style="text-align:left;">These new changes may have solved the HoL issue, but long-running requests is still a problem in and of itself.</p><p class="paragraph" style="text-align:left;">One example is user notifications.</p><p class="paragraph" style="text-align:left;">When a user uploads a new track to SoundCloud, the user’s followers are notified. This may be fine for a users with less followers, but for more popular users, there were huge delays.</p><p class="paragraph" style="text-align:left;">In fact, the <a class="link" href="https://en.wikipedia.org/wiki/Fan-out_(software)?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">fan-out</a> of notifications would frequently exceed tens of seconds. These long-running requests needed to be jobs (queue) instead.</p><p class="paragraph" style="text-align:left;"><i>Remember how everything was still synchronous in this architecture?</i></p><p class="paragraph" style="text-align:left;">Enter <a class="link" href="https://www.rabbitmq.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">RabbitMQ</a>.</p><p class="paragraph" style="text-align:left;">Since storage was also growing rapidly for sounds and images, the team decided to offload assets to Amazon S3. Storage scaled nicely, while <a class="link" href="https://en.wikipedia.org/wiki/Transcoding?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">transcoding</a> compute stayed in Amazon EC2.</p><p class="paragraph" style="text-align:left;">To connect everything, RabbitMQ’s <a class="link" href="https://www.rabbitmq.com/tutorials/amqp-concepts?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Advanced Messaging Queuing Protocol (AMQP)</a> was used as a middleware to manage the lifecycle of these jobs.</p><p class="paragraph" style="text-align:left;"><i>“One broker to queue them all.”</i></p><p class="paragraph" style="text-align:left;">Jobs fell into two main categories based on work time:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Interactive - less than 250ms work time</p></li><li><p class="paragraph" style="text-align:left;">Batch - everything else</p></li></ol><h2 class="heading" style="text-align:left;">Identifying Points of Scale</h2><p class="paragraph" style="text-align:left;">At this point, SoundCloud was at the hundreds of thousands user mark.</p><p class="paragraph" style="text-align:left;">In order for the architecture to continue to evolve, the engineering team knew they needed to decouple the read and write paths.</p><p class="paragraph" style="text-align:left;">The read and write paths could then be individually optimized.</p><p class="paragraph" style="text-align:left;">This technique resembles the <a class="link" href="https://martinfowler.com/bliki/CQRS.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Command Query Responsibility Segregation (CQRS) pattern</a> today.</p><p class="paragraph" style="text-align:left;">One area of focus was the widget.</p><p class="paragraph" style="text-align:left;">As it turns out, SoundCloud’s highest volume request was a single endpoint delivering data for the widget.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://memcached.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Memcached</a> and <a class="link" href="https://varnish-cache.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Varnish</a> were added to cache the following:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Full pages</p></li><li><p class="paragraph" style="text-align:left;">DOM fragments</p></li><li><p class="paragraph" style="text-align:left;">Partially rendered templates</p></li><li><p class="paragraph" style="text-align:left;">Read-only API responses</p></li></ol><p class="paragraph" style="text-align:left;">These performance improvements solved CPU issues (rendering engine and runtime) in the application tier.</p><p class="paragraph" style="text-align:left;">Another area of focus was the Dashboard, a user’s personalized view of activities.</p><p class="paragraph" style="text-align:left;">When the Dashboard receives an update, the appropriate users are notified across all devices and third party applications.</p><p class="paragraph" style="text-align:left;">The read path needed to be optimized for sequential access per user over a time range.</p><p class="paragraph" style="text-align:left;">The write path needed to be optimized for random access where one event can affect the indexing of millions of users.</p><p class="paragraph" style="text-align:left;">To account for these optimizations, <a class="link" href="https://cassandra.apache.org/_/index.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Cassandra</a> was chosen as the storage system and <a class="link" href="https://www.elastic.co/elasticsearch?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">Elasticsearch</a> was chosen to enhance search. These solutions provided persistence and scaling.</p><p class="paragraph" style="text-align:left;">The final monolithic architecture looked like this:</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cb07d2c7-541c-41cc-b598-dc62b9ac37b6/e9.png?t=1711597608"/><div class="image__source"><span class="image__source_text"><p>SoundCloud’s Monolithic Architecture</p></span></div></div><h2 class="heading" style="text-align:left;">The Story Continues</h2><p class="paragraph" style="text-align:left;">SoundCloud was known as the “YouTube for audio”, with unique features such as the waveform player, track comments, and collaborations.</p><p class="paragraph" style="text-align:left;">The engineering team’s architecture decisions in its early years allowed the company to be adaptive and product-driven.</p><p class="paragraph" style="text-align:left;">The key takeaways from SoundCloud’s early success can be summarized in three points:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Optimize for opportunity. Focus on the product.</p></li><li><p class="paragraph" style="text-align:left;">Scaling is a luxury problem. Architect for growth over time.</p></li><li><p class="paragraph" style="text-align:left;">Identify points of scale. Define integration points well for organic growth.</p></li></ol><p class="paragraph" style="text-align:left;">In the next part of this series, we’ll learn about SoundCloud’s transition to a microservices architecture, and their challenges of scaling to hundreds of millions of users.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network and subscribe:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p><hr class="content_break"><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Evolution of SoundCloud’s Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture</a>.</p><p class="paragraph" style="text-align:left;">[2] “Building Products at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith</a>.</p><p class="paragraph" style="text-align:left;">[3] “Service Architecture at SoundCloud,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/service-architecture-1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/service-architecture-1</a>.</p><p class="paragraph" style="text-align:left;">[4] “How SoundCloud Uses HAProxy with Kubernetes for User-Facing Traffic,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-soundcloud-uses-haproxy-with-kubernetes-for-user-facing-traffic</a>.</p><p class="paragraph" style="text-align:left;">[5] “The End of the Public API Strangler,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/end-of-the-strangler?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/end-of-the-strangler</a>.</p><p class="paragraph" style="text-align:left;">[6] “How We Develop New Features Using Offsites and Clean Architecture,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/how-we-develop-new-features-using-offsites-and-clean-architecture</a>.</p><p class="paragraph" style="text-align:left;">[7] “How We Ended Up With Microservices,” <i>philcalcado.com.</i><br><a class="link" href="https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html</a>.</p><p class="paragraph" style="text-align:left;">[8] “BFF @ SoundCloud,” <i>thoughtworks.com.</i><br><a class="link" href="https://www.thoughtworks.com/insights/blog/bff-soundcloud?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://www.thoughtworks.com/insights/blog/bff-soundcloud</a>.</p><p class="paragraph" style="text-align:left;">[9] “Pattern: Backends For Frontends,” <i>samnewman.io.</i><br><a class="link" href="https://samnewman.io/patterns/architectural/bff/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://samnewman.io/patterns/architectural/bff/</a>.</p><p class="paragraph" style="text-align:left;">[10] “Pattern: Backends For Frontends,” <i>developers.soundcloud.com.</i><br><a class="link" href="https://developers.soundcloud.com/blog/announcing-twinagle?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-evolution-of-soundcloud-s-architecture-part-1" target="_blank" rel="noopener noreferrer nofollow">https://developers.soundcloud.com/blog/announcing-twinagle</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=f77052d8-e51e-4e16-8a63-029c2b6c60fa&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Node.js Changed My Life</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d5279a73-58e0-41e5-8e97-c674cabd1957/GGycszqXcAEzdNR.jpeg" length="87635" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/how-nodejs-changed-my-life</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-nodejs-changed-my-life</guid>
  <pubDate>Thu, 21 Mar 2024 13:00:00 +0000</pubDate>
  <atom:published>2024-03-21T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Node.Js]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d5279a73-58e0-41e5-8e97-c674cabd1957/GGycszqXcAEzdNR.jpeg?t=1710704251"/><div class="image__source"><span class="image__source_text"><p>Rocket Turtle, Node’s New Mascot</p></span></div></div><h2 class="heading" style="text-align:left;">How It Started</h2><p class="paragraph" style="text-align:left;">$60,000, Google Chrome, and six months in a Starbucks. This was all that was needed to create the first prototype for Node.js.</p><p class="paragraph" style="text-align:left;">Node.js was created in 2009 by a brilliant engineer named Ryan Dahl. If you don’t know his story, I would encourage you to <a class="link" href="https://www.sequoiacap.com/article/deno-spotlight/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">read about it</a>. It’s a good one.</p><p class="paragraph" style="text-align:left;">I had just started college at the time, on track to becoming a petroleum engineer. I hated it, I changed majors halfway through, and ended up learning ARM and C as my first programming languages (for microcontrollers).</p><p class="paragraph" style="text-align:left;">I remember those classes. They were hard. But they taught me the fundamentals and how to do things like memory management. And what pointers are. So when I transitioned to the web, I found JavaScript and Node.js to be different, but in a pleasant way. It was my gateway drug into web development.</p><p class="paragraph" style="text-align:left;">I didn’t have to worry about allocating and freeing up memory because there’s garbage collection. Node.js was simple and easy to work with. There was only one rule: Don’t block the event loop.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f2d80fae-eda6-49a6-b827-031d9b1c1b6b/image.png?t=1710763195"/><div class="image__source"><span class="image__source_text"><p>Event Loop</p></span></div></div><p class="paragraph" style="text-align:left;">I can write code in JavaScript (or TypeScript), enjoy fast startup times, and prototype quickly. What’s not to like about all of that?</p><p class="paragraph" style="text-align:left;">Yes, there are things in JavaScript that are hard to explain. In fact, there’s <a class="link" href="https://github.com/denysdovhan/wtfjs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">an entire GitHub repository highlighting weird scenarios</a>.</p><p class="paragraph" style="text-align:left;">There’s <code>node_modules</code>, which gets bloated from long dependency chains and long install times. Getting ES Modules, TypeScript, and Jest to work correctly together is a pain.</p><p class="paragraph" style="text-align:left;">The list goes on, but like all technologies, there’s always pros and cons. Like this ad.</p><hr class="content_break"><div class="image"><a class="image__link" href="https://track.presspool.ai/U2FsdGVkX19mjfgYRBmIdd%2F%2F5Wy1TURT%2BHcXBVaWlGWSy9s45V4B%2FfCW7Zwmx9WQLv2JwWBQEPhkAdKVbYeGrc8Ju%2B2FUeaQAchGLX6F71CMBLI5XCCWXAaVzmuE6LbOjO7Q42y8rHqhrXyk%2FZkEdcEMWC1ZyIjNw32U1YkZzoFPFEoTqhXE2QOYnPb2fzPrh%2B3Vt9u2%2BUQ5rnm%2FK561Qw%3D%3D?_bhiiv=opp_17980dac-1393-442b-8cac-2d36f59249eb_a4091aa9&bhcl_id=e2742b98-468e-4896-a2ef-a947b9d104e9_{{subscriber_id}}_{{email_address_id}}" rel="noopener" target="_blank"><img class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7f1a4549-d548-403e-b01f-492fb1dfe919/finops__1_.png?t=1710384227"/></a></div><h2 class="heading" style="text-align:left;" id="take-control-of-your-aws-spend-and-">Take control of your AWS spend and cut backup bills by 50%</h2><p class="paragraph" style="text-align:left;">As cloud adoption increases to run modernized applications, costs can quickly rise out of control. How do best-in-class <a class="link" href="https://track.presspool.ai/U2FsdGVkX19mjfgYRBmIdd%2F%2F5Wy1TURT%2BHcXBVaWlGWSy9s45V4B%2FfCW7Zwmx9WQLv2JwWBQEPhkAdKVbYeGrc8Ju%2B2FUeaQAchGLX6F71CMBLI5XCCWXAaVzmuE6LbOjO7Q42y8rHqhrXyk%2FZkEdcEMWC1ZyIjNw32U1YkZzoFPFEoTqhXE2QOYnPb2fzPrh%2B3Vt9u2%2BUQ5rnm%2FK561Qw%3D%3D?_bhiiv=opp_17980dac-1393-442b-8cac-2d36f59249eb_a4091aa9&bhcl_id=e2742b98-468e-4896-a2ef-a947b9d104e9_{{subscriber_id}}_{{email_address_id}}" target="_blank" rel="noopener noreferrer nofollow">companies</a> manage their storage spend while continuing to grow the business? Clumio, a cloud-native backup solution, depends on cloud storage to run their entire business. They took a FinOps approach to optimizing their costs, and reduced their AWS dev costs by over 50%.</p><div class="button" style="text-align:center;"><a target="_blank" rel="noopener nofollow noreferrer" class="button__link" style="" href="https://track.presspool.ai/U2FsdGVkX19mjfgYRBmIdd%2F%2F5Wy1TURT%2BHcXBVaWlGWSy9s45V4B%2FfCW7Zwmx9WQLv2JwWBQEPhkAdKVbYeGrc8Ju%2B2FUeaQAchGLX6F71CMBLI5XCCWXAaVzmuE6LbOjO7Q42y8rHqhrXyk%2FZkEdcEMWC1ZyIjNw32U1YkZzoFPFEoTqhXE2QOYnPb2fzPrh%2B3Vt9u2%2BUQ5rnm%2FK561Qw%3D%3D?_bhiiv=opp_17980dac-1393-442b-8cac-2d36f59249eb_a4091aa9&bhcl_id=e2742b98-468e-4896-a2ef-a947b9d104e9_{{subscriber_id}}_{{email_address_id}}"><span class="button__text" style=""> Watch Video! </span></a></div><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;"></p><hr class="content_break"><h2 class="heading" style="text-align:left;">The Growth of Node.js</h2><p class="paragraph" style="text-align:left;">Many developers complain about the standard library. They say it’s not as complete as other languages (like Python or C#). They say it’s missing features like data manipulation out of the box.</p><p class="paragraph" style="text-align:left;"><i>But that’s okay. That’s the beauty of Node.js.</i></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4f8c8920-4ac0-415e-833f-0efd1afb0b8e/image.png?t=1710763247"/><div class="image__source"><span class="image__source_text"><p>Node.js Runtime</p></span></div></div><p class="paragraph" style="text-align:left;">It’s a JavaScript runtime. It allows us to run JavaScript anywhere and everywhere. We can build web apps, mobile apps, desktop apps, etc. <a class="link" href="https://www.infoq.com/news/2020/06/javascript-spacex-dragon/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">SpaceX is even using it in outer space</a>!</p><p class="paragraph" style="text-align:left;">By keeping the core standard library small, it’s much easier to maintain. Anything else that’s needed, we can use external packages from <code>npm</code> or build it ourselves. I know it’s not perfect but over the last decade, the most used <code>npm</code> packages have matured. Many are battle tested and used in production for many years.</p><p class="paragraph" style="text-align:left;">For example, <a class="link" href="https://github.com/expressjs/express?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Express</a>, one of the most popular packages, was published over 13 years ago. The package is in millions of projects. Another is <a class="link" href="https://github.com/axios/axios?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Axios</a>, an HTTP client still widely used today.</p><p class="paragraph" style="text-align:left;">Node.js has been a catalyst for the open source community’s growth. Many great developers sharing their work and helping others. New projects and tooling around the JavaScript ecosystem.</p><p class="paragraph" style="text-align:left;">A great example of this is <a class="link" href="https://www.npmjs.com/package/core-js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">core-js</a>. The creator, <a class="link" href="https://github.com/zloirock?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Denis Pushkarev</a>, worked extremely hard to standardize JavaScript across the web. His project provided universal polyfills for the latest ECMAScript standards. <a class="link" href="https://github.com/zloirock/core-js/blob/master/docs/2023-02-14-so-whats-next.md?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">His story is amazing</a>.</p><p class="paragraph" style="text-align:left;">Remember <a class="link" href="https://github.com/lodash/lodash?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Lodash</a>? <a class="link" href="https://github.com/jdalton?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">John-David Dalton</a> created this library. It’s used in <a class="link" href="https://github.com/lodash/lodash/network/dependents?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">more than 28 million repositories on GitHub</a>. He also created <code>esm</code>, the popular ECMAScript module loader. Now, he’s working on Bun.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/mcollina?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Matteo Collina</a>, member of the Node.js Technical Steering Committee, created many projects for the community. You’ve probably used <a class="link" href="https://fastify.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Fastify</a> or <a class="link" href="https://www.npmjs.com/package/pino?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">Pino</a> at some point. Yeah, he created them.</p><p class="paragraph" style="text-align:left;">Without Node.js, there wouldn’t have been Deno or Bun. And there’s many more to come.</p><h2 class="heading" style="text-align:left;">The New Wave of Developers</h2><p class="paragraph" style="text-align:left;">Is Node.js the answer for everything? Of course not.</p><p class="paragraph" style="text-align:left;">Node.js is great at I/O operations and sending data over the network. But that doesn’t mean developers shouldn’t use tools and technologies they enjoy.</p><p class="paragraph" style="text-align:left;">There’s countless examples of people complaining about Node.js. Here’s <a class="link" href="https://github.com/denoland/deno/issues/162?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">one</a>. And of course, we can’t forget about <a class="link" href="https://www.youtube.com/watch?v=1e1zzna-dNw&t=271s&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">this video</a>.</p><p class="paragraph" style="text-align:left;">Not only does this spread negativity (which we have enough of already in the world), but also confuses aspiring developers. Let’s discuss openly and share, but be kind towards each other in the community. After all, we’re all just trying to improve and get better each day.</p><p class="paragraph" style="text-align:left;">Instead of gatekeeping, lets help the next wave of developers break into the industry. Regardless if someone has a degree, was a bootcamp graduate, or came from a different field, let’s welcome them with open arms.</p><p class="paragraph" style="text-align:left;">Programming is not just a valuable skill in the modern age, it’s a superpower. Anyone can build anything at anytime from the comfort of their home.</p><p class="paragraph" style="text-align:left;"><i>How cool is that?</i></p><p class="paragraph" style="text-align:left;">It’s important as developers, we don’t lose sight of the goal. There’s so much back and forth these days about how one language is better than the other. Or how one technology is superior. At the end of the day, it doesn’t matter. Focus on delivering value. <a class="link" href="https://en.wikipedia.org/wiki/John_Carmack?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">John Carmack</a> said it best:</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">To the newcomers, it doesn’t matter how you start. What matters is that you continue to learn. After Node.js, I learned many other technologies like Kafka and Kubernetes. Several other programming languages like Python, C#, and Go. Looking back at how my career developed, I do consider myself lucky. But if you work hard enough and long enough, you will get lucky eventually. I believe that.</p><p class="paragraph" style="text-align:left;">If you’re new, pick a language you’re curious about. Become a student of the craft. Don’t let AI distract you. Don’t use autocomplete. Go deep on topics. Learn how things actually work.</p><p class="paragraph" style="text-align:left;">And most importantly, don’t give up, because the world needs more engineers like you.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please consider subscribing or share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-node-js-changed-my-life" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=5097f416-c6b6-45a5-8796-b33347f1dfcc&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Pokémon GO: Architecture of the #1 AR Game in the World</title>
  <description>How Pokémon GO started, its architecture, and the individual components driving this popular game.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/51a7d865-82a8-47bf-a07f-10474d77c20f/raids.jpg" length="776892" type="image/jpeg"/>
  <link>https://www.fullstackexpress.io/p/pokemon-go-architecture</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/pokemon-go-architecture</guid>
  <pubDate>Wed, 13 Mar 2024 12:00:00 +0000</pubDate>
  <atom:published>2024-03-13T12:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
    <category><![CDATA[Architecture]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cb8410c3-91f9-4b3a-b29a-a94c9f55f76f/stephenwsun_young_people_and_old_people_having_a_great_time_pla_db7c77e2-4346-4495-83ed-e58bf3465fd8.png?t=1710169337"/><div class="image__source"><span class="image__source_text"><p>Young And Old Enjoying Pokémon GO</p></span></div></div><p class="paragraph" style="text-align:left;">My mother-in-law is absolutely obsessed with this game.</p><p class="paragraph" style="text-align:left;">As a developer, I had a burning desire to understand how Pokémon GO started, its architecture, and the individual components driving this popular game.</p><p class="paragraph" style="text-align:left;">This is Pokémon GO as I know it.</p><h2 class="heading" style="text-align:left;">Origin Story</h2><p class="paragraph" style="text-align:left;">In the last 30 days, <a class="link" href="https://activeplayer.io/pokemon-go/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">there’s been more than 81 million active players</a>. Astronomical numbers, but it didn’t start off this way. In fact, Pokémon GO is the result of many iterations.</p><p class="paragraph" style="text-align:left;">Niantic, the company behind Pokémon GO, was founded by John Hanke and Phil Keslin. Not only were they Google veterans, but they were originally the co-founders of a company called <a class="link" href="https://googlepress.blogspot.com/2004/10/google-acquires-keyhole-corp.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">Keyhole</a>.</p><p class="paragraph" style="text-align:left;">Keyhole was the company Google acquired to start Google Earth and later Google Maps. The core technology behind Keyhole was the ability to stream large databases of mapping data across the internet.</p><p class="paragraph" style="text-align:left;">As experts in 3D mapping, John and Phil will go on to leverage this technology to create Niantic’s first augmented-reality multiplayer game, Ingress. Ingress played a crucial role in the development of Pokemon GO by forming the data pool of locations that later became the PokéStops and gyms in the game.</p><p class="paragraph" style="text-align:left;">A combination of historical markers, geo-tagged photos from Google, and popular player-submitted places were chosen as the starting point for Pokémon GO.</p><h2 class="heading" style="text-align:left;">High-Level Architecture</h2><p class="paragraph" style="text-align:left;">Today, Pokémon GO handles millions of player requests a second through every day gameplay.</p><p class="paragraph" style="text-align:left;">With many founders and early engineers originally from Google, choosing Google Cloud Platform (GCP) as their cloud infrastructure was the logical choice.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/22e7b6a4-0070-4427-83dc-857fcb4e8299/image.png?t=1709505764"/><div class="image__source"><span class="image__source_text"><p>Pokémon GO: High-Level Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">At a high level, Pokémon GO’s architecture consists of the following key components and services:</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/kubernetes-engine?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Google Kubernetes Engine (GKE)</b></a>: Manages and scales workloads and services needed for the game.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/load-balancing?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Cloud Load Balancing</b></a>: Distributes traffic across K8 clusters and services. Entry point for all requests.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/cdn?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Cloud CDN</b></a>: Caches and serves content to users.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/spanner?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Spanner</b></a>: Stores player, map and Pokémon data.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/pubsub?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Pub/Sub</b></a>: Handles data use for analytics.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/bigtable?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Bigtable</b></a>: Used for logging and tracking user actions.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/dataflow?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>Dataflow</b></a>: Processes player logs.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://cloud.google.com/bigquery?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow"><b>BigQuery</b></a>: Stores game data for analyzing player behavior and verifying features.</p></li><li><p class="paragraph" style="text-align:left;"><b>Frontend Service</b>: Handles player interactions in the app.</p></li><li><p class="paragraph" style="text-align:left;"><b>Spatial Query Backend</b>: Caches map data based on location.</p></li></ul><p class="paragraph" style="text-align:left;">In order to handle such high traffic, the engineering team leveraged two key GCP services: Google Kubernetes Engine (GKE) and Spanner.</p><p class="paragraph" style="text-align:left;">GKE is a Kubernetes cluster manager and orchestration system for running Docker containers. Not only did Google create Kubernetes, but GKE implements the full Kubernetes API with robust autoscaling and support…up to 15,000 nodes!</p><p class="paragraph" style="text-align:left;">With cluster autoscaling, the cluster’s node pool can automatically resize based on workload demands. Through GKE, pods can scale out horizontally based on CPU utilization or custom metrics (e.g. high network traffic). Additionally, pods can scale up as well based on CPU and memory usage.</p><h2 class="heading" style="text-align:left;">From Datastore to Spanner</h2><p class="paragraph" style="text-align:left;">Originally, Niantic made the decision to store Pokémon GO data using <a class="link" href="https://cloud.google.com/datastore?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">Datastore</a> (Firestore is the new version), a fully-managed NoSQL database service. With a managed service, the engineering team was able to meet the initial demands of Pokémon GO.</p><p class="paragraph" style="text-align:left;">Though Datastore is considered highly scalable and can theoretically handle up to 740k operations per second, this is based on a ramp up schedule using the <a class="link" href="https://cloud.google.com/datastore/docs/best-practices?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world#ramping_up_traffic" target="_blank" rel="noopener noreferrer nofollow">500/50/5 rule</a>. This rule states a maximum of 500 operations per second and increasing traffic by 50% every 5 minutes.</p><p class="paragraph" style="text-align:left;">Based on these limitations as well as the natural growth of the game, the engineering team decided to migrate to another managed service called Spanner.</p><p class="paragraph" style="text-align:left;">What’s particularly interesting is the transition from a NoSQL database to a relational database, which is most likely due to a need for global consistency and high transactionality. <a class="link" href="https://cloud.google.com/blog/products/databases/spanner-has-doubled-the-storage-per-node-to-4tb-from-2tb?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">Spanner also boasts unlimited write and read scalability</a> by decoupling compute resources from data storage.</p><p class="paragraph" style="text-align:left;">At any given time, there’s more than 5,000 Spanner nodes and thousands of Kubernetes nodes running for Pokémon GO. This is not including the GKE nodes needed for other microservices that augment the gaming experience.</p><h2 class="heading" style="text-align:left;">Navigating the Pokémon World</h2><p class="paragraph" style="text-align:left;">When a user first opens the Pokémon GO app, all static media such as Pokémon images and music files are downloaded to the user’s phone.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/937316cf-17bf-4864-94df-b659e28087e9/photo-1471014706828-7f1b12e6d88b.png?t=1710017043"/><div class="image__source"><span class="image__source_text"><p>Photo by David Grandmougin</p></span></div></div><p class="paragraph" style="text-align:left;">These files are stored in Cloud Storage and also cached with Cloud CDN at the Cloud Load Balancing level. By caching these files, content will load faster, traffic to the web servers are decreased, and overall user experience is improved.</p><p class="paragraph" style="text-align:left;">As the user walks around in the physical world, the app uses the phone’s GPS to determine your location. This is important because your location determines the Pokémon you see on the map, and also the PokéStops, gyms, and landmarks you see around you.</p><p class="paragraph" style="text-align:left;">All of the mapping data is fetched from Spanner and handled by a service called the Spatial Query Backend. This service caches all the mapping data which is sharded based on location.</p><p class="paragraph" style="text-align:left;">As the user interacts with the app, requests are reverse proxied through NGINX to the frontend service, where the appropriate data is served back to the user, either from Spanner or from cache.</p><p class="paragraph" style="text-align:left;">In a nutshell, the frontend handles player interactions within the game, while the Spatial Query Backend handles the geospatial data needed to render the map, what the user sees (e.g. Pokémon, Gyms, etc), and any other features that are location-based.</p><p class="paragraph" style="text-align:left;"><i>So what exactly happens behind the scenes when a user tries to catch a Pokémon?</i></p><h2 class="heading" style="text-align:left;">Catching a Pokémon</h2><p class="paragraph" style="text-align:left;">Pokémon can be seen on the phone through <a class="link" href="https://niantic.helpshift.com/hc/en/6-pokemon-go/faq/28-catching-pokemon-in-ar-mode/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">Augmented Reality (AR)</a>. Once the user interacts with the Pokémon and the Pokémon is caught, an event is sent from the frontend service to Spanner through the Spanner API. </p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/02109015-0378-447b-b520-30be03237c3a/cd164a0c-c5c1-4cd0-9efb-c68ccebb5c04-t.png?t=1710016754"/><div class="image__source"><span class="image__source_text"><p>Catching Pokémon in AR+ Mode</p></span></div></div><p class="paragraph" style="text-align:left;">This is where the player entity and player data is normally stored. The only difference is that the data pertaining to catching a Pokémon is not cached in the Spatial Query Backend, unlike the data for gym battles and PokéStops.</p><p class="paragraph" style="text-align:left;">These events are handled as write requests, and since Spanner is strongly consistent, all nodes see the same data at the same time, regardless of which node is accessed. As a result, all subsequent read operations from any node will return the most recent write value.</p><p class="paragraph" style="text-align:left;">For gym battles and PokéStops, once an update is received, the spatial data is updated in memory for caching, and then used to serve future requests from the frontend service. It’s important to note that these updates don’t apply to just a single user, but all the players in the same location.</p><p class="paragraph" style="text-align:left;">All user actions are also stored in Bigtable for logging and tracking (e.g. business telemetry), and messages are published to GCP’s Pub/Sub messaging service for analytics.</p><h2 class="heading" style="text-align:left;">Live Events</h2><p class="paragraph" style="text-align:left;">In addition to normal gameplay, there are regular live events. Events like Raid Battles, can see transactions increase from 400k per second to close to a million in minutes.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/51a7d865-82a8-47bf-a07f-10474d77c20f/raids.jpg?t=1710019187"/><div class="image__source"><span class="image__source_text"><p>Players Teaming Up For Raid Battles</p></span></div></div><p class="paragraph" style="text-align:left;">Niantic found that their GCP servers would get overloaded during the initial phase of these events when players were forming teams. This is due to many players trying to join the Raid lobby in preparation for the event, causing a large influx of traffic.</p><p class="paragraph" style="text-align:left;">Even though Pokémon GO operates in a multi-server environment and players are typically evenly distributed across all the servers, Raids require all players to be on the same server in order for everyone to access the game data. As a result, a large amount of data needs to be shared across the team of players participating in the Raid, leading to increased server traffic and latency.</p><p class="paragraph" style="text-align:left;">Not only does this cause lag and delays for players joining the Raid, but also other players in the vicinity who may not be participating. This is due to being on the same server.</p><p class="paragraph" style="text-align:left;">So what can be done to handle live events that require high volumes of data? <i>Enter Redis.</i></p><p class="paragraph" style="text-align:left;">Niantic initially designed Pokémon GO around a stateful architecture, making scaling and server restarts challenging.</p><p class="paragraph" style="text-align:left;">Since Pokémon GO runs on GKE, pods need to be cordoned and existing sessions to expire before servers can be restarted to add more players. Cordon is a Kubernetes operation that marks a node as unschedulable. This is usually done in a Kubernetes cluster when a node needs to be taken offline for maintenance or upgrading.</p><p class="paragraph" style="text-align:left;">Not only is this process time consuming, sometimes as long as 30 minutes, but costly as well. The architecture team realized that in order to improve the player experience, the Pokémon GO servers needed to be stateless. This would allow them to scale up and down quickly to match the increased loads.</p><p class="paragraph" style="text-align:left;">The team chose Redis on Google Cloud as their solution, providing zero-downtime scaling.</p><p class="paragraph" style="text-align:left;">With the new Raid architecture, it’s no longer needed for players to be on the same server. The data is stored in a centralized Redis cache where all servers have access to the same information.</p><p class="paragraph" style="text-align:left;">As players join a Raid lobby, data such as player information and time for each group is stored as JSON keys in Redis. Statistics such as player locations, tendencies, and performance are also stored here.</p><p class="paragraph" style="text-align:left;">Because Raid events typically only last 15 minutes, there isn’t a need for persistent data storage and all data can be cached in-memory.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bae41190-37a2-4890-8929-42bb17b60c8b/image.png?t=1709724699"/><div class="image__source"><span class="image__source_text"><p>Max Latency Decreased from 1 Second to ~250 Milliseconds</p></span></div></div><p class="paragraph" style="text-align:left;">Not only has server hot spots reduced significantly, max latency has dropped from over 1 second to 250 milliseconds. This is a 75 percent reduction!</p><p class="paragraph" style="text-align:left;">Niantic not only greatly improved the player experience but also did so by maintaining high availability and performance while reducing operational costs. </p><h2 class="heading" style="text-align:left;">Real-Time Experience</h2><p class="paragraph" style="text-align:left;">When Raids were introduced into the game, an influx of players wanted to participate. Since these events happened in real time, it’s unacceptable for notifications to be delayed as players could miss the event. With an average notification latency of 9 seconds, a better real-time notification system was needed.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a85c95cc-f3b8-468a-b0b1-74afebdcfaff/image.png?t=1709728547"/><div class="image__source"><span class="image__source_text"><p>Notification System: High-Level Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">Originally, the Pokémon GO client would poll the player’s message inbox every 15 seconds to retrieve new notifications. This led to redundant polling, and more importantly, the possibility of high latency if the notification was sent right after the client polled.</p><p class="paragraph" style="text-align:left;">The team decided to pivot to a new pub-sub service called PushGateway. This service sits between the backend servers and game clients, and pushes messages through the WebSocket to the clients in real time.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3c573fdc-31e1-4f29-aeed-2fdf1abfbac7/image.png?t=1709729615"/><div class="image__source"><span class="image__source_text"><p>In-App Notification Latency With PushGateway</p></span></div></div><p class="paragraph" style="text-align:left;">These architecture changes led to huge improvements. Pokémon Go’s in-app notification latency dropped from 9 seconds to 1 second and the load from querying player inboxes for notifications was reduced by 85%.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><i>If you made it this far, thank you for reading! I hope you enjoyed it.</i></p><p class="paragraph" style="text-align:left;"><i>If I made a mistake, please let me know.</i></p><h2 class="heading" style="text-align:left;">Resources</h2><p class="paragraph" style="text-align:left;">[1] “Optimizing Pokémon GO,” <i>redis.com.</i><br><a class="link" href="https://redis.com/customers/niantic/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://redis.com/customers/niantic/</a>.</p><p class="paragraph" style="text-align:left;">[2] “How Pokémon GO Scales to Millions of Requests,” <i>cloud.google.com.</i><br><a class="link" href="https://cloud.google.com/blog/topics/developers-practitioners/how-pok%C3%A9mon-go-scales-millions-requests?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://cloud.google.com/blog/topics/developers-practitioners/how-pokémon-go-scales-millions-requests</a>.</p><p class="paragraph" style="text-align:left;">[3] “Improving the Pokémon GO Player Experience with PushGateway,” <i>nianticlabs.com.</i><br><a class="link" href="https://nianticlabs.com/news/improving-pokemon-go-player-experience?hl=en&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://nianticlabs.com/news/improving-pokemon-go-player-experience?hl=en</a>.</p><p class="paragraph" style="text-align:left;">[4] “Using Spanner for Non-Relational Workloads,” <i>cloud.google.com.</i><br><a class="link" href="https://cloud.google.com/blog/products/databases/using-spanner-for-non-relational-workloads?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://cloud.google.com/blog/products/databases/using-spanner-for-non-relational-workloads</a>.</p><p class="paragraph" style="text-align:left;">[5] “How the Gurus Behind Google Earth Created Pokémon GO,” <i>mashable.com.</i><br><a class="link" href="https://mashable.com/article/john-hanke-pokemon-go?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://mashable.com/article/john-hanke-pokemon-go</a>.</p><p class="paragraph" style="text-align:left;">[6] “Pokémon GO’s Wild First Year: A Timeline,” <i>theverge.com.</i><br><a class="link" href="https://www.theverge.com/2017/7/6/15888210/pokemon-go-one-year-anniversary-timeline?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://www.theverge.com/2017/7/6/15888210/pokemon-go-one-year-anniversary-timeline</a>.</p><p class="paragraph" style="text-align:left;">[7] “Pokémon GO Catch $6 Billion in Lifetime Player Spending,” <i>sensortower.com.</i><br><a class="link" href="https://sensortower.com/blog/pokemon-go-6-billion-revenue?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://sensortower.com/blog/pokemon-go-6-billion-revenue</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pokemon-go-architecture-of-the-1-ar-game-in-the-world" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=5c7774c5-eaae-4abd-b639-839ee1dcdca4&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Pinterest&#39;s New Asynchronous Computing Platform</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c0712896-623c-4461-9944-baf9c4b46e4c/stephenwsun_image_sharing_and_social_media_service_designed_to__4a975a20-8e3a-4e58-a763-c7d8286b1127.png" length="1561197" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/pinterest-new-asynchronous-computing-platform</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/pinterest-new-asynchronous-computing-platform</guid>
  <pubDate>Wed, 20 Dec 2023 14:00:00 +0000</pubDate>
  <atom:published>2023-12-20T14:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><h4 class="heading" style="text-align:left;">🌙 Hello world<b> </b>☀️ </h4><p class="paragraph" style="text-align:left;">As we approach the end of 2023, a wealth of survey data is being released. Here are my favorites so far:</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://thenewstack.io/web-development-in-2023-javascript-still-rules-ai-emerges/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Web development trends of 2023</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://stackdiary.com/node-js-frameworks/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">The most popular Node.js frameworks of 2023</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://developer.chrome.com/blog/css-wrapped-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">CSS Wrapped 2023</a></p></li></ul><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Architecture</b>: Pinterest’s architecture transition from PinLater to Pacer.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: Improving Node.js loader performance.</p></li><li><p class="paragraph" style="text-align:left;"><b>JavaScript</b>: The await event horizon in JavaScript.</p></li><li><p class="paragraph" style="text-align:left;"><b>CSS</b>: A full-width slider case study.</p></li><li><p class="paragraph" style="text-align:left;"><b>Productivity</b>: Four simple programming habits to transform productivity.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>ARCHITECTURE</b></span><br><a class="link" href="https://medium.com/pinterest-engineering/pacer-pinterests-new-generation-of-asynchronous-computing-platform-5c338a15d2a0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Pinterest’s New Asynchronous Computing Platform</a></h2><div class="image"><a class="image__link" href="https://medium.com/pinterest-engineering/pacer-pinterests-new-generation-of-asynchronous-computing-platform-5c338a15d2a0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c0712896-623c-4461-9944-baf9c4b46e4c/stephenwsun_image_sharing_and_social_media_service_designed_to__4a975a20-8e3a-4e58-a763-c7d8286b1127.png?t=1703026373"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><h4 class="heading" style="text-align:left;">Background</h4><p class="paragraph" style="text-align:left;">Pinterest, described as <a class="link" href="https://en.wikipedia.org/wiki/Reverse_image_search?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">a visual search engine</a>, has seen their <a class="link" href="https://investor.pinterestinc.com/press-releases/press-releases-details/2023/Pinterest-Announces-Second-Quarter-2023-Results/default.aspx?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Global Monthly Active Users (MAUs) increase to 465 million and revenue growth to $708 million</a> this year.</p><p class="paragraph" style="text-align:left;">Some of the most notable features on the platform include Pins, Boards, image thumbnail generation, follows, and platform-wide notifications.</p><p class="paragraph" style="text-align:left;">How does Pinterest serve so many users at such a large scale?</p><p class="paragraph" style="text-align:left;">These core features were handled by an asynchronous job execution system called <a class="link" href="https://medium.com/pinterest-engineering/open-sourcing-pinlater-an-asynchronous-job-execution-system-d8ec4e39859a?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">PinLater</a>, and was one of Pinterest’s most mission critical systems.</p><p class="paragraph" style="text-align:left;">PinLater has been open-sourced (and archived) and the codebase can be found <a class="link" href="https://github.com/pinterest/pinlater?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p><h4 class="heading" style="text-align:left;">Old Architecture: PinLater</h4><p class="paragraph" style="text-align:left;">Looking at the architecture, we can see PinLater is composed of three core main components:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">PinLater Thrift service for scheduling and managing job submissions.</p></li><li><p class="paragraph" style="text-align:left;">Backend data store to save the jobs, with payloads and metadata.</p></li><li><p class="paragraph" style="text-align:left;">Workers in worker pools to process the stored jobs and to track the execution status of these jobs.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f4e67812-06f9-401c-880e-f41e12052806/1_NYG--5w5PN7NjkgmiaSIGQ.png?t=1702927641"/><div class="image__source"><span class="image__source_text"><p>Pinterest’s PinLater Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">As traffic increased and more features were added to the platform, the Pinterest team found flaws with the PinLater system.</p><p class="paragraph" style="text-align:left;">The first problem is lock contention in the data store. Since queues have one table in each data store shard, and each dequeue request scans all the shards for available jobs, multiple threads are attempting to retrieve data from the same table.</p><p class="paragraph" style="text-align:left;">How does this impact the system on a larger scale?</p><p class="paragraph" style="text-align:left;">As traffic increases, the Thrift service naturally scales up to account for the increased load.</p><p class="paragraph" style="text-align:left;">Scaling horizontally would ideally distribute the load across multiple instances, but in this case, lock contention actually degrades the performance of PinLater.</p><p class="paragraph" style="text-align:left;">Not only does this negate the scalability, but also the throughput of the platform.</p><p class="paragraph" style="text-align:left;">Some other issues include mixing jobs from multiple job queues, and sharing the same Thrift services for different team functions.</p><p class="paragraph" style="text-align:left;">Job queues may require different instance types, which makes performance tuning extremely challenging.</p><p class="paragraph" style="text-align:left;">Also, different functions could have different reliability requirements, where utilizing a shared service is not ideal.</p><p class="paragraph" style="text-align:left;">These issues became the driving need for a new architecture, Pacer.</p><h4 class="heading" style="text-align:left;">New Architecture: Pacer</h4><p class="paragraph" style="text-align:left;">With a focus on performance, the Pinterest team introduced new components and mechanisms for storing, accessing, and isolating job data and queues.</p><p class="paragraph" style="text-align:left;">These components include:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Broker service to pull jobs from the backend data store.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://helix.apache.org/Architecture.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Helix</a> and <a class="link" href="https://zookeeper.apache.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Zookeeper</a> to manage job queues for the broker service.</p></li><li><p class="paragraph" style="text-align:left;">Dedicated worker pools for each queue.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bdc66b85-63d8-49aa-b504-314ac1a6f05b/1_aMUUI-P4Gl_378E0XysF6Q.png?t=1702952727"/></div><p class="paragraph" style="text-align:left;">The combination of Helix and Zookeeper ensures that each partition of a job queue is assigned to a dedicated broker host. As a result, there is no competition over the same job data.</p><p class="paragraph" style="text-align:left;">Furthermore, since the dequeue broker service is in charge of pulling job queues from the data store, the service is able to prefetch and cache jobs in local memory buffers.</p><p class="paragraph" style="text-align:left;">This reduces latency when reading from memory and also decouples the dequeue and enqueue process completely.</p><h4 class="heading" style="text-align:left;">Key Improvements</h4><p class="paragraph" style="text-align:left;">With these new changes to the architecture, the Pinterest team has seen the following improvements:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Lock contention is completely resolved in the data store.</p></li><li><p class="paragraph" style="text-align:left;">Significant improvement in hardware utilization.</p></li><li><p class="paragraph" style="text-align:left;">Improved performance and scalability due to independent job execution (own environment) and custom configurations.</p></li></ol><p class="paragraph" style="text-align:left;">In a side-by-side comparison with PinLater, it’s clear that Pacer is built for scalability and resilience.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b94a9547-eed1-4346-9fc3-b1bc4034c37e/1_WpL70X_HvHktlAyrQWGy1Q.png?t=1702993577"/><div class="image__source"><span class="image__source_text"><p>Enqueue and Dequeue Decoupled From Thrift Service</p></span></div></div><p class="paragraph" style="text-align:left;">In PinLater, lots of resources were wasted due to redundant partitions that were created in the data store shards. This led to extra calls where more than 50% of the calls were empty results.</p><p class="paragraph" style="text-align:left;">The original system was also limited, as some functionalities simply couldn’t be supported. For example, job execution order can only be guaranteed locally. There was no global order.</p><p class="paragraph" style="text-align:left;">In order to manage such a large number of partitions optimally, a cluster management framework was needed to properly partition, replicate, and distribute resources hosted on a cluster of nodes.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1f8bb191-3501-4101-9db3-d2ce6489376f/1_-YVqXf-1c-elcPRM5xvu7Q.png?t=1702994953"/><div class="image__source"><span class="image__source_text"><p>Helix: Cluster Management Framework</p></span></div></div><p class="paragraph" style="text-align:left;">Helix monitors for various events, such as configuration changes and state changes for broker hosts.</p><p class="paragraph" style="text-align:left;">In doing so, the Helix controller is able to calculate and manage resources, while also communicating with the broker cluster to bring it to the ideal state.</p><p class="paragraph" style="text-align:left;">Each broker host reports its liveness to Zookeeper and are notified when assigned tasks are changed.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><a class="link" href="https://sentry.engineering/blog/improving-nodejs-loader-performance?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Improving Node.js Loader Performance</a></h2><div class="image"><a class="image__link" href="https://sentry.engineering/blog/improving-nodejs-loader-performance?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/61944de2-929a-4069-a6e0-22053a0bf221/DALL_E_2023-12-19_17.08.36_-_A_metaphorical_representation_of_Node.js_running_a_race_against_itself._The_image_features_two_anthropomorphic_characters_representing_Node.js__with_o.png?t=1703027351"/></a><div class="image__source"><span class="image__source_text"><p>Created with DALL·E 3</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/anonrig?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow"><i>Yagiz Nizipli</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture:</b> The author discusses improvements in Node.js loader performance, focusing on how Node.js differentiates between EcmaScript (ES) and CommonJS modules for loading. The choice depends on factors like file extensions and package.json file configurations.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>You will learn about the inner workings of the Node.js loader, specifically how it decides whether to use the ES or CommonJS module loader based on file extensions and package.json contents.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>The optimizations discussed are particularly relevant for developers looking to enhance the performance of their Node.js applications, offering practical knowledge on improving load times and reducing operational overhead.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT</b></span><br><a class="link" href="https://frontside.com/blog/2023-12-11-await-event-horizon/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">The Await Event Horizon in JavaScript</a></h2><div class="image"><a class="image__link" href="https://frontside.com/blog/2023-12-11-await-event-horizon/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3b99f6d9-7325-4364-8b54-3854861e3a07/DALL_E_2023-12-19_17.11.45_-_An_artistic_interpretation_of__The_Await_Event_Horizon__in_JavaScript._The_image_depicts_a_cosmic_scene__resembling_a_black_hole_event_horizon__but_in.png?t=1703027545"/></a><div class="image__source"><span class="image__source_text"><p>Created with DALL·E 3</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://github.com/cowboyd?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Charles Lowell</a></i></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The author discusses the practical implications and challenges of async functions in JavaScript, where once execution crosses the await event horizon, it becomes impossible to forcibly escape, potentially leading to issues like resource leaks.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>You&#39;ll learn about the inherent risks in async functions, specifically how they can lead to resource leaks if a Promise never settles or takes too long to do so. This is demonstrated through the example of a lock in an async function that may never get released.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>This concept is significant for developing robust and efficient JavaScript applications, as it highlights the need for careful structuring and management of asynchronous code to prevent potential issues like resource leaks and unresponsive behaviors.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>CSS</b></span><br><a class="link" href="https://www.smashingmagazine.com/2023/12/css-scroll-snapping-aligned-global-page-layout-case-study/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">A Full-Width Slider Case Study</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/web-development-features?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cf02dfea-31b8-4c52-9e07-f1be4ce2b0b8/DALL_E_2023-12-19_17.14.16_-_A_visual_representation_of_a_full-width_slider_case_study_in_a_web_design_context._The_image_showcases_a_large__wide_computer_screen_displaying_a_webs.png?t=1703027674"/></a><div class="image__source"><span class="image__source_text"><p>Created with DALL·E 3</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://utilitybend.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow"><i>Brecht De Ruyte</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The case study focuses on implementing a full-width slider using CSS scroll snapping, integrated seamlessly with a global page layout. It addresses the challenge of aligning the slider&#39;s content with other page elements while maintaining consistent padding and alignment.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>You will learn practical techniques for using CSS variables and scroll snapping properties to align a full-width slider with the rest of a webpage&#39;s layout. The case study provides step-by-step guidance on achieving a responsive and visually coherent design.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>This tutorial demonstrates advanced CSS techniques for creating responsive, aligned, and visually appealing web components. Understanding these methods is crucial for designing modern, user-friendly websites.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>PRODUCTIVITY</b></span><br><a class="link" href="https://read.engineerscodex.com/p/simple-software-engineering-habits?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Four Simple Programming Habits that Transformed my Productivity</a></h2><div class="image"><a class="image__link" href="https://read.engineerscodex.com/p/simple-software-engineering-habits?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2b2063a0-b364-4096-abba-0f54a28c2564/stephenwsun_Four_Simple_Programming_Habits_that_Transformed_my__e812efe9-7dae-4181-8055-1ffa0e4fefc9.png?t=1703028000"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/company/engineerscodex/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow"><i>Leonardo Creed</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The article presents four simple yet effective habits that can significantly enhance the productivity of software engineers. These habits focus on optimizing everyday workflow and decision-making processes in software development.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>You will learn about practical strategies such as strategically leaving work slightly unfinished, utilizing keyboard shortcuts, maintaining an accessible list of commands and links, and the importance of saying &quot;no&quot; to manage workload effectively.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>For software engineers, adopting these habits is crucial for improving efficiency and managing complex tasks in a demanding environment. The article provides actionable tips that can be easily integrated into daily routines for better productivity and work-life balance.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/balanced-binary-tree-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Balanced Binary Tree</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solution to the latest coding challenge?</b></p><p class="paragraph" style="text-align:left;">This question is asked by Adobe and Microsoft. Learn how to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/balanced-binary-tree-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://deno.com/blog/openai_sdk_deno?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">OpenAI SDK for Deno</a></b>: Improvements to module loading via HTTPS, import TypeScript, and availability of GPT-4 Turbo, Assistants API, DALL-E 3 and more.</p><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://blog.vuejs.org/posts/vue-2-eol?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Vue 2</a></b>: Reaches End of Life on December 31, 2023, as the Vue team focuses on Vue 3, meaning Vue 2 will no longer receive updates or fixes but will still be available on existing distribution channels.</p><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://swizec.com/blog/forget-bad-code-focus-on-the-system-react-summit-talk/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">React Summit</a></b>: The talk focuses on reducing architectural complexity by structuring code into self-contained modules.</p><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://manupa.dev/blog/anatomy-of-shadcn-ui?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">shadcn/ui</a></b>: A deep dive into the architecture of this unique JavaScript library.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://svelte.dev/blog/sveltekit-2?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">SvelteKit 2.0</a></b>: Incremental release supporting Vite 5 with various improvements and the much-requested shallow routing feature, is now available and sets the stage for the anticipated Svelte 5 release in 2024.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://github.com/remix-run/remix/blob/main/CHANGELOG.md?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform#v240" target="_blank" rel="noopener noreferrer nofollow">Remix 2.4.0</a></b>: Introduces the Client Data RFC with new APIs, enhances support for Vite, and includes various improvements like shallow routing, strict route exports, and optimizations for both server and client builds.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://blog.date-fns.org/v3-is-out/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">date-fns 3.0.0</a></b>: Includes 100% TypeScript support, smaller build size, string arguments support, Date class extensions support, ESM support for Node.js, named exports for all functions, and no more IE support.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>Around The Web</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Interesting</b>: <a class="link" href="https://thenewstack.io/web-development-in-2023-javascript-still-rules-ai-emerges/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">JavaScript continued to dominate web development</a>, including in WebAssembly, while generative AI began integrating into web frameworks.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://github.com/goldbergyoni/nodebestpractices/tree/master?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">The 2023 edition of a Node.js best practices repository</a> includes updated content, new libraries, and a demonstration application, Practica.js, to showcase these practices.</p><p class="paragraph" style="text-align:left;">✅ <b>Algorithms</b>: <a class="link" href="https://www.canva.dev/blog/engineering/ship-shape/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">A deep dive into Canva’s Shape Assist</a>, a machine learning tool in their Draw tool, which transforms shaky scribbles into sleek vector graphics in the browser.</p><p class="paragraph" style="text-align:left;">✅ <b>LLMs</b>: <a class="link" href="https://huggingface.co/blog/2023-in-llms?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">2023 marked a surge in public interest and debate around Large Language Models (LLMs)</a>, with a focus on open-source models for their benefits in research reproducibility, community involvement, and environmental impact.</p><p class="paragraph" style="text-align:left;">✅ <b>Advice</b>: <a class="link" href="https://unixsheikh.com/articles/we-have-used-too-many-levels-of-abstractions-and-now-the-future-looks-bleak.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">The overuse of abstraction layers</a> in technology and software development.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Tools and Packages</b></h2><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/oxc-project/oxc?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Oxc</a></b>: A collection of high-performance JavaScript tools written in Rust.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/bytebase/bytebase?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Byte Base</a></b>: Database DevOps and CI/CD solution designed to streamline the database development lifecycle and facilitate collaboration between developers and DBAs.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/HuolalaTech/page-spy-web?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform" target="_blank" rel="noopener noreferrer nofollow">Page Spy Web</a></b>: Remote debugging tool for web projects, designed to function like Chrome DevTools.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>SOCIAL MEDIA</b></span><br>RIP AI: 1941-2023…it was a good run 🤣 </h2><blockquote align="center" class="twitter-tweet"><a href="https://twitter.com/ChrisJBakke/status/1736533308849443121?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=pinterest-s-new-asynchronous-computing-platform"><p> Twitter tweet </p></a></blockquote></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=e6a96c1d-16a1-4f87-9878-9caecc98d3da&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Uber Created Cinnamon</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d42daf61-0831-49f0-91a8-c65bbf967a62/stephenwsun_how_the_rideshare_company_uber_created_cinnamon_e0fbeb9e-6311-496f-8484-c78970ae6da3.png" length="1840171" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-uber-created-cinnamon</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-uber-created-cinnamon</guid>
  <pubDate>Wed, 13 Dec 2023 14:00:00 +0000</pubDate>
  <atom:published>2023-12-13T14:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><h4 class="heading" style="text-align:left;">🌙 Hello world<b> </b>☀️ </h4><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.blog/2023-12-07-github-innovation-graph-q2-2023-data-release/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Check out the GitHub Innovation Graph</a> if you haven&#39;t already. It offers insights based on eight metrics, showcasing JavaScript&#39;s continued dominance as the top programming language, followed by Python.</p><p class="paragraph" style="text-align:left;">Notably, TypeScript has impressively climbed from 11th to 5th place, while Ruby has seen a significant drop from 5th to the last position at 12th.</p><p class="paragraph" style="text-align:left;">My prediction is that TypeScript will be among the top three within the next two years.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Microservices</b>: How Uber created Cinnamon, an advanced load shedder library.</p></li><li><p class="paragraph" style="text-align:left;"><b>JavaScript</b>: A new optimizing compiler that enhances JavaScript execution efficiency in V8.</p></li><li><p class="paragraph" style="text-align:left;"><b>Database</b>: Insights into the comprehensive process, challenges, and strategies involved in upgrading GitHub’s large-scale MySQL infrastructure.</p></li><li><p class="paragraph" style="text-align:left;"><b>Kubernetes</b>: Learn how taints and tolerations work.</p></li><li><p class="paragraph" style="text-align:left;"><b>Best Practices</b>: Learn about the purpose, structure, and benefits of RFCs.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MICROSERVICES</b></span><br><a class="link" href="https://www.uber.com/blog/cinnamon-using-century-old-tech-to-build-a-mean-load-shedder/?uclick_id=55efd639-fa2b-4558-bb76-d11d8e73d044&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">How Uber Created Cinnamon</a></h2><div class="image"><a class="image__link" href="https://www.uber.com/blog/cinnamon-using-century-old-tech-to-build-a-mean-load-shedder/?uclick_id=55efd639-fa2b-4558-bb76-d11d8e73d044&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d42daf61-0831-49f0-91a8-c65bbf967a62/stephenwsun_how_the_rideshare_company_uber_created_cinnamon_e0fbeb9e-6311-496f-8484-c78970ae6da3.png?t=1702402712"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/jakobgt/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><i>Jakob Holdgaard Thomsen</i></a></p><h4 class="heading" style="text-align:left;">Introduction</h4><p class="paragraph" style="text-align:left;">In the fast-paced world of Uber&#39;s microservices, catering to approximately 130 million monthly customers involves managing an immense volume of online and offline traffic.</p><p class="paragraph" style="text-align:left;">This complexity inevitably leads to scenarios where services become overloaded due to factors like traffic spikes or database slowdowns.</p><p class="paragraph" style="text-align:left;">To ensure seamless user experience despite these challenges, Uber developed Cinnamon, an advanced load shedder library, building upon the legacy of its predecessor, QALM.</p><h4 class="heading" style="text-align:left;">The Necessity of Graceful Degradation</h4><p class="paragraph" style="text-align:start;">The key to managing service overload lies in gracefully degrading system performance by shedding lower-priority requests, such as batch jobs, to preserve the quality of high-priority services like customer requests.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3ea1a878-aea5-4719-a771-60032dc5324b/Figure-1-Blog_-Priority-propagation-issue-1.png?t=1702384229"/><div class="image__source"><span class="image__source_text"><p>Determining Request Priority Between Different Sources</p></span></div></div><p class="paragraph" style="text-align:start;">Uber&#39;s vast array of services demands an automatic, configuration-free solution for graceful degradation, given the prohibitive cost of configuring each service individually.</p><h4 class="heading" style="text-align:left;">Introducing Cinnamon</h4><p class="paragraph" style="text-align:start;">Cinnamon is the culmination of Uber’s efforts to enhance service stability.</p><p class="paragraph" style="text-align:start;">It dynamically adjusts service capacity using a modified <a class="link" href="https://en.wikipedia.org/wiki/TCP_Vegas?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">TCP-Vegas algorithm</a> and determines load shedding levels using a PID controller concept, dating back to the 17th century.</p><p class="paragraph" style="text-align:start;">Compared to previous methods, Cinnamon effectively manages larger overloads while maintaining reasonable latencies, adding minimal overhead per request.</p><p class="paragraph" style="text-align:start;">Crucially, it requires no manual configuration, facilitating rapid adoption across Uber&#39;s services.</p><h4 class="heading" style="text-align:left;">Understanding QALM</h4><p class="paragraph" style="text-align:start;">Before delving into Cinnamon, it&#39;s essential to grasp the workings of <a class="link" href="https://www.uber.com/blog/qalm-qos-load-management-framework/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">QALM</a>, its forerunner.</p><p class="paragraph" style="text-align:start;">QALM employed the Controlled Delay (CoDel) algorithm to manage overload by dropping lower-priority requests.</p><p class="paragraph" style="text-align:start;">It monitored request queue times and, upon detecting delays, would reject low-priority requests.</p><p class="paragraph" style="text-align:start;">However, its reliance on service configuration and priority classification posed challenges to widespread adoption.</p><h4 class="heading" style="text-align:left;">Cinnamon&#39;s Architecture</h4><p class="paragraph" style="text-align:start;">Cinnamon functions as an <a class="link" href="https://github.com/yarpc?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">RPC middleware</a> in Uber’s Go services.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/44879488-53a1-4520-a42f-4e77ac618041/Figure-1-Blog_-Priority-propagation-issue-1.png?t=1702384453"/></div><p class="paragraph" style="text-align:start;">It tags each request with a priority at the edge, which is then propagated through the service stack.</p><p class="paragraph" style="text-align:start;">This priority tagging helps services understand the importance of each request, enabling more informed load-shedding decisions.</p><h4 class="heading" style="text-align:left;">Priorities in Cinnamon</h4><p class="paragraph" style="text-align:start;">Cinnamon’s prioritization mechanism consists of two elements: tier levels and cohorts.</p><p class="paragraph" style="text-align:start;">The tier level indicates the request&#39;s importance, with six tiers used at Uber. </p><p class="paragraph" style="text-align:start;">Cohorts further segment requests within a tier, allowing consistent load shedding across services.</p><p class="paragraph" style="text-align:start;">This system, inspired by WeChat, involves 768 different priority levels.</p><h4 class="heading" style="text-align:left;">Library Architecture</h4><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9c5006e6-6ea2-4ea5-96fd-75eaa9b3e42e/Figure-3-Blog-post_-Life-of-a-request.png?t=1702383501"/><div class="image__source"><span class="image__source_text"><p>Lifecycle Of A Request Traversing through Cinnamon</p></span></div></div><p class="paragraph" style="text-align:start;">Cinnamon operates in stages as a request passes through its middleware:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Priority Assignment</b>: Assigns or verifies the priority of a request.</p></li><li><p class="paragraph" style="text-align:left;"><b>Rejection Decision</b>: Determines if a request should be rejected based on system load.</p></li><li><p class="paragraph" style="text-align:left;"><b>Priority Queue Management</b>: Prioritizes requests in the queue.</p></li><li><p class="paragraph" style="text-align:left;"><b>Concurrent Request Management</b>: Limits the number of parallel requests.</p></li><li><p class="paragraph" style="text-align:left;"><b>Timeout Management</b>: Handles request timeouts in the queue.</p></li></ol><p class="paragraph" style="text-align:start;">Additionally, Cinnamon&#39;s background threads, the PID controller, and the auto-tuner, adjust rejection thresholds and concurrent request limits to optimize system performance.</p><h4 class="heading" style="text-align:left;">Experimental Results</h4><p class="paragraph" style="text-align:start;">Testing Cinnamon against QALM revealed its superior capacity in managing service load and protecting core flows.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ae254082-9d3b-4d36-8a4c-94e6499d7d8e/Figure-4-Goodput-for-Cinnamon-and-QALM.png?t=1702383657"/><div class="image__source"><span class="image__source_text"><p>Cinnamon vs QALM Goodput Without Load Shedder</p></span></div></div><p class="paragraph" style="text-align:start;">It demonstrated higher <a class="link" href="https://en.wikipedia.org/wiki/Goodput?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">goodput</a> (successful request rate) and maintained better latencies under heavy loads compared to QALM.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/294be2a0-228e-4033-8105-c57949203188/Figure-6-Tier-1-latencies-P99.png?t=1702383783"/><div class="image__source"><span class="image__source_text"><p>P99 Latencies</p></span></div></div><h4 class="heading" style="text-align:left;">Interaction between PID and Auto-Tuner</h4><p class="paragraph" style="text-align:start;">Cinnamon’s PID controller and auto-tuner work in tandem to balance rejection rates and service throughput.</p><p class="paragraph" style="text-align:start;"></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ccc685bc-aeda-4db0-adeb-3b4e5924bfe6/Figure-8-inflight-and-auto-tuner.png?t=1702384077"/><div class="image__source"><span class="image__source_text"><p>Heatmaps For 1,500 and 2,000 RPS Cases</p></span></div></div><p class="paragraph" style="text-align:start;">This interaction ensures that the system dynamically adapts to varying loads, maintaining optimal service levels.</p><h4 class="heading" style="text-align:left;">Conclusion</h4><p class="paragraph" style="text-align:start;">Cinnamon represents a significant leap in load shedding technology at Uber.</p><p class="paragraph" style="text-align:start;">By leveraging time-tested algorithms and incorporating modern enhancements, it offers a robust, efficient, and configuration-free solution to manage service overloads.</p><p class="paragraph" style="text-align:start;">Cinnamon&#39;s development, inspired by diverse technologies and ideas, stands as a testament to Uber&#39;s commitment to innovative and effective software solutions in a complex, high-demand environment.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT</b></span><br><a class="link" href="https://v8.dev/blog/maglev?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">V8’s Fastest Optimizing JIT</a></h2><div class="image"><a class="image__link" href="https://v8.dev/blog/maglev?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0e3f2f0e-aeba-4993-bf89-ffe91c8de090/stephenwsun_Maglev_a_new_optimizing_compiler_introduced_in_Chro_4419940b-7966-47ff-8adc-c93c6d026292.png?t=1702414404"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/tverwaes?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><i>Toon Verwaest</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture:</b> Maglev, a new optimizing compiler introduced in <a class="link" href="https://chromeos.betacommunity.com/releases/13?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Chrome M117</a>, enhances JavaScript execution efficiency in V8.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>Discover how Maglev bridges the gap between Sparkplug&#39;s instant compilation and TurboFan&#39;s peak performance optimization, using sophisticated techniques like SSA-based JIT compilation for improved web performance.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>Maglev&#39;s introduction is pivotal for web developers and users alike, offering faster, more efficient JavaScript execution in browsers, reducing resource consumption, and improving user experience on web applications.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATABASE</b></span><br><a class="link" href="https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Upgrading GitHub.com To MySQL 8.0</a></h2><div class="image"><a class="image__link" href="https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ed5c8b79-b5a7-4aaf-90ef-d814c590c4cf/stephenwsun_githubs_mascot_octocat_upgrading_all_of_the_databas_44620b77-a2ec-4773-99e4-d6e546969092.png?t=1702414584"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/itsjiaqi?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><i>Jiaqi Liu</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>GitHub&#39;s transition to MySQL 8.0 for their production fleet is a detailed journey of upgrading over 1200 MySQL hosts, enhancing data storage, and ensuring high availability for the vast relational data of GitHub.com.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>Insights into the comprehensive process, challenges, and strategies involved in upgrading a large-scale MySQL infrastructure, emphasizing the importance of maintaining service level objectives and handling complex data workloads.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>This upgrade demonstrates the critical role of database management in large tech platforms, offering valuable lessons in scalability, reliability, and the necessity of continuous software maintenance and improvement for operational efficiency and future growth.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>KUBERNETES</b></span><br><a class="link" href="https://semaphoreci.com/blog/kubernetes-taints-tolerations?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Importance Of Kubernetes And The Need For Tainting Nodes</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/web-development-features?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f8d8bfd7-4696-4314-adf0-e4c0bc9550dd/stephenwsun_Understand_how_taints_and_tolerations_work_in_Kuber_9461bd8a-7f6d-4065-91f0-3f9e4e752b52.png?t=1702473002"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/abhiatwork85?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><i>Abhisman Sarkar</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The article details the importance of using taints and tolerations in Kubernetes for efficient cluster management and optimal workload distribution.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>Understand how taints and tolerations work in Kubernetes, enabling them to control pod placements on nodes, which is essential for specific use cases like multi-tenancy, backup strategies, and environment-specific deployments.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>Mastering the concept of tainting and tolerating nodes in Kubernetes is crucial for developers and system administrators to ensure that containerized applications are deployed effectively, meeting the diverse requirements of modern software environments.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>BEST PRACTICES</b></span><br><a class="link" href="https://wasp-lang.dev/blog/2023/12/05/writing-rfcs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">On The Importance of RFCs In Programming</a></h2><div class="image"><a class="image__link" href="https://wasp-lang.dev/blog/2023/12/05/writing-rfcs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4a4f5710-a33f-44e8-abc4-dcf768d7ca3c/stephenwsun_critical_role_of_Request_For_Comments_RFC_documents_52b2c7de-4736-40bc-a0e4-159605d86c37.png?t=1702473158"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/matijasos?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><i>Matija Sosic</i></a></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The article emphasizes the critical role of Request For Comments (RFC) documents in programming, particularly in collaborative environments and complex projects.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>You&#39;ll learn about the purpose, structure, and benefits of RFCs, and how they facilitate informed decision-making and efficient implementation in software development by preemptively addressing potential issues and gathering team insights.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>Understanding and utilizing RFCs is essential for developers, as they streamline the coding process, ensure clarity of purpose, and foster a collaborative approach to problem-solving, ultimately leading to more effective and successful project outcomes.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/middle-of-linked-list-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Middle Of the Linked List</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solution to the latest coding challenge?</b></p><p class="paragraph" style="text-align:left;">This question is asked by Amazon and Apple. Learn how to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/middle-of-linked-list-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://supabase.com/blog/pg-graphql-postgres-functions?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Supabase</a></b>: Supabase GraphQL (pg_graphql) version 1.4+ now supports User Defined Functions (UDFs) in Postgres, enhancing GraphQL&#39;s flexibility and allowing custom SQL logic within GraphQL queries.</p><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://overreacted.io/a-chain-reaction/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Chain Reaction</a></b>: Dan Abramov demonstrates the significance of naming conventions in HTML and CSS, and how they simplify the browser’s process of displaying web elements.</p><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://github.com/juspay/hyperswitch/wiki/A-better-storage-format-for-postman-collections?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Postman Collections</a></b>: A new format for storing Postman collections using a directory structure, addressing challenges like difficult pull request reviews and limited editor options, and enhancing the ease of maintaining and updating API tests in CI pipelines.</p><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://www.twilio.com/blog/automated-notifications-ci-builds-slack-twilio?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Notifications</a></b>: How to set up automated notifications for CI builds in Slack and Twilio, using NestJS and CircleCI</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://nodejs.org/en/blog/release/v21.4.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Node 21.4.0</a></b>: Fixed regression affecting <code>fs.writeFileSync</code> method, introduces <code>dirent.parentPath</code>, and default w flag for writeFileSync with utf8 encoding.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://astro.build/blog/astro-4/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Astro 4.0</a></b>: Dev Toolbar, internationalization routing, new view transition APIs, and incremental content caching.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://www.electronjs.org/blog/electron-28-0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Electron</a></b><b><a class="link" href="https://www.electronjs.org/blog/electron-28-0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"> 28.0.0</a></b>: Support for ECMAScript modules (ESM), additional properties to the <code>display</code> object, and support for <code>ELECTRON_OZONE_PLATFORM_HINT</code> on Linux.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">React Native 0.73</a></b>: Debugging improvements, stable symlink support in Metro, Kotlin template on Android, Android 14 support, and more.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://github.com/reduxjs/redux-toolkit/releases/tag/v2.0.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Redux Toolkit 2.0.0</a></b>: Enhanced store configuration and middleware options, improved package compatibility, and TypeScript improvements.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://million.dev/blog/million-3?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Million 3.0</a></b>: 34% faster initial compile, ~2% for code changes on medum-sized Next.js projects, and 100% improvement in hydration times.</p><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://github.blog/2023-12-05-github-enterprise-server-3-11-is-now-generally-available/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">GitHub Enterprise Server 3.11</a></b>: Generally available, enhanced code security with tools for application security testing, new Activity view for repository history, advanced secret leak prevention, and GitHub CLI extension.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>Around the Web</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Interesting</b>: <a class="link" href="https://bbycroft.net/llm?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Visualization and walkthrough</a> of ChatGPT’s LLM algorithm.</p><p class="paragraph" style="text-align:left;">✅ <b>Software Engineering</b>: <a class="link" href="https://ntietz.com/blog/insights-from-the-original-waterfall-paper/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">A review of the original 1970 paper on the waterfall model in software engineering</a>, discussing its key components, the shift in management&#39;s role, optimization in development, and iterative approaches.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://cdacamar.github.io/data%20structures/algorithms/benchmarking/text%20editors/c++/editor-data-structures/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Programming challenges of text editors</a>, focusing on reworking fundamental data structures, particularly for handling text.</p><p class="paragraph" style="text-align:left;">✅ <b>Career Growth: </b><a class="link" href="https://www.developing.dev/p/what-i-wish-i-knew-as-a-mid-level?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Ryan Peterman</a> reflects on his transition from mid-level to senior engineer at Meta.</p><p class="paragraph" style="text-align:left;">✅ <b>Internet Trends</b>: <a class="link" href="https://blog.cloudflare.com/radar-2023-year-in-review/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Cloudflare shares their 2023 Radar Year in Review</a>, a<span style="color:rgb(209, 213, 219);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> </span>comprehensive analysis of annual global and regional Internet trends based on various metrics.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Tools and Packages</b></h2><p class="paragraph" style="text-align:left;">📦️ <a class="link" href="https://terminaltrove.com/list/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><b>Terminal Trove</b></a>: Curated collection of terminal tools, including CLIs, TUIs, and developer tools, for all platforms and mediums.</p><p class="paragraph" style="text-align:left;">📦️ <a class="link" href="https://github.com/ndavd/ncube/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow"><b>Ncube</b></a>: Visualize rotating hypercubes in any dimension, using real-time rotation and perspective projections down to three dimensions.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/codecrafters-io/build-your-own-x?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Build Your Own X</a></b>: Enhance your programming skills by building your own versions of popular technologies from the ground up.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/SuperDuperDB/superduperdb?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">SuperDuperDB</a></b>: A framework for directly integrating AI with databases, featuring streaming inference, scalable training, and vector search.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/samchon/typia?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon" target="_blank" rel="noopener noreferrer nofollow">Typia</a></b>: Fast and easy runtime validations and serializations through transformation.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>SOCIAL</b></span><br>🤣🤣🤣🤣🤣</h2><blockquote align="center" class="twitter-tweet"><a href="https://twitter.com/iamdevloper/status/1733239824004313329?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-created-cinnamon"><p> Twitter tweet </p></a></blockquote></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=28ee2fea-7a89-4773-9e2f-af150a0eda5f&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Deep Dive Into Instacart&#39;s Machine Learning Platform</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/87d2b9f0-8a1d-4e78-ac4e-58eb02eb8a79/stephenwsun_the_core_infrastructure_of_the_largest_grocery_shop_846ee82f-3417-4b1e-b1e5-7a242e5ad9b8.png" length="1377097" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/deep-dive-instacarts-machine-learning-platform</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/deep-dive-instacarts-machine-learning-platform</guid>
  <pubDate>Wed, 06 Dec 2023 14:00:00 +0000</pubDate>
  <atom:published>2023-12-06T14:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><h4 class="heading" style="text-align:left;">🌙 Hello world<b> </b>☀️ </h4><p class="paragraph" style="text-align:left;">The 2023 State of JS survey is still open for another week (ends December 12) and helps the JavaScript community measure popularity of current features and new trends. Take the survey <a class="link" href="https://survey.devographics.com/en-US/survey/state-of-js/2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Machine Learning</b>: Deep dive into Griffin 2.0, the core of Instacart’s ML platform.</p></li><li><p class="paragraph" style="text-align:left;"><b>JavaScript</b>: Learn hands-on how modern JavaScript frameworks work.</p></li><li><p class="paragraph" style="text-align:left;"><b>React</b>: A router-driven approach to building React applications.</p></li><li><p class="paragraph" style="text-align:left;"><b>HTML/CSS</b>: Five new modern web development features.</p></li><li><p class="paragraph" style="text-align:left;"><b>Internet Trends</b>: How Black Friday and Cyber Monday affect internet traffic.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MACHINE LEARNING</b></span><br><a class="link" href="https://tech.instacart.com/unveiling-the-core-of-instacarts-griffin-2-0-8ecb310c8d32?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Deep Dive into Instacart’s Griffin 2.0</a></h2><div class="image"><a class="image__link" href="https://tech.instacart.com/unveiling-the-core-of-instacarts-griffin-2-0-8ecb310c8d32?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/87d2b9f0-8a1d-4e78-ac4e-58eb02eb8a79/stephenwsun_the_core_infrastructure_of_the_largest_grocery_shop_846ee82f-3417-4b1e-b1e5-7a242e5ad9b8.png?t=1701790162"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://medium.com/@hanli_57704?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow"><i>Han Li</i></a></p><h4 class="heading" style="text-align:left;">Background</h4><p class="paragraph" style="text-align:left;">Machine learning is essential to Instacart’s platform, the core of nearly every product and operational innovation at the company. The technology is used to:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Enhance customer experience by matching customer preferences with suitable choices from a catalog containing over 1 billion products.</p></li><li><p class="paragraph" style="text-align:left;">Optimize the efficiency of over 600,000 shoppers, enabling swift delivery to millions of customers across the US and Canada.</p></li><li><p class="paragraph" style="text-align:left;">Integrate artificial intelligence into the Instacart platform, enhancing support for over 800 retailers across 70,000 stores in more than 5,500 cities throughout the US and Canada.</p></li><li><p class="paragraph" style="text-align:left;">Facilitates connections between over 5,000 brand partners and potential customers.</p></li></ol><p class="paragraph" style="text-align:left;">In order to create a seamless shopping experience that also handles the day-to-day scalability challenges, the machine learning infrastructure team created <a class="link" href="https://www.instacart.com/company/how-its-made/griffin-how-instacarts-ml-platform-tripled-ml-applications-in-a-year/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Griffin, Instacart’s MLOps Platform</a>.</p><h4 class="heading" style="text-align:left;">Shortcomings of Griffin 1.0</h4><p class="paragraph" style="text-align:left;">Griffin 1.0 at Instacart, while comprehensive for end-to-end ML, revealed several limitations that led to the development of Griffin 2.0.</p><p class="paragraph" style="text-align:left;">These included a steep learning curve with complex in-house command-line tools, a complicated deployment process involving AWS ECS, and the need for specialized system tuning.</p><p class="paragraph" style="text-align:left;">It also lacked standardization, relying heavily on GitHub PRs for multiple tasks, and had unoptimized scalability, with limited horizontal scalability and an insufficient model registry for high query volumes.</p><p class="paragraph" style="text-align:left;">Furthermore, Griffin 1.0 offered a fragmented user experience due to multiple third-party integrations and had inadequate metadata management for training and deployment.</p><h4 class="heading" style="text-align:left;">Development of Griffin 2.0</h4><p class="paragraph" style="text-align:left;">In developing Griffin 2.0&#39;s Machine Learning Training Platform (MLTP), the goal was to create a unified, centralized platform for machine learning engineers (MLEs) to easily create, track, and manage training workloads.</p><p class="paragraph" style="text-align:left;">The platform was designed to support distributed machine learning, including distributed training, batch inference, and fine-tuning of Large Language Models (LLMs), while addressing the limitations of Griffin 1.0.</p><p class="paragraph" style="text-align:left;">Key strategic design decisions for Griffin 2.0 included:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>A Singular Interface</b>: Unlike Griffin 1.0, which required navigating multiple systems, Griffin 2.0 integrates all tools into one unified web interface, simplifying user experience and streamlining model training development.</p></li><li><p class="paragraph" style="text-align:left;"><b>Centralized Unity</b>: Griffin 2.0 consolidates various training backends into a single Kubernetes platform, reducing maintenance overhead compared to the fragmented approach in Griffin 1.0.</p></li><li><p class="paragraph" style="text-align:left;"><b>Standard ML Runtime</b>: Addressing the lack of standardized modeling frameworks in Griffin 1.0, Griffin 2.0 introduces standard runtimes across different ML frameworks, ensuring consistency in building blocks and package versions.</p></li><li><p class="paragraph" style="text-align:left;"><b>Horizontal Scalability</b>: Griffin 2.0 uses Ray to enable horizontal scalability for distributed workloads, overcoming the vertical scaling limitations of Griffin 1.0.</p></li><li><p class="paragraph" style="text-align:left;"><b>Metadata Store for All</b>: Griffin 2.0 implements a centralized metadata store, enhancing model lineage management and lifecycle oversight, an area where Griffin 1.0 was deficient.</p></li></ol><h4 class="heading" style="text-align:left;">System Architecture</h4><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/07a5daa6-3283-4901-8b35-1dfb1f5e2582/0_pL8QehR4nY4HK7ph.png?t=1700579331"/><div class="image__source"><span class="image__source_text"><p>ML Training Platform Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">The Machine Learning Training Platform (MLTP) at Instacart is built with several key components to provide a centralized service with distributed computation capabilities:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Metadata Store</b>: Includes Model Store for untrained models, Offline Feature Store for training metadata, Workflow Run for managing training jobs, and Model Registry for post-training model information.</p></li><li><p class="paragraph" style="text-align:left;"><b>API Endpoints</b>: Provides RESTful APIs for interacting with the Metadata Store, managing model architectures, registries, features, datasets, and training jobs.</p></li><li><p class="paragraph" style="text-align:left;"><b>Workflow Orchestrator</b>: Comprises the MLTP API service for customizing training jobs and the ISC worker integrated with Kubernetes and Ray for orchestrating and managing training workloads.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/41b09562-c0f6-4528-b951-aaea9e5bc1a5/0_azPhq7L_CmofqmOX.png?t=1700579414"/><div class="image__source"><span class="image__source_text"><p>Workflow Orchestrator</p></span></div></div><h4 class="heading" style="text-align:left;">MLTP Training Process</h4><p class="paragraph" style="text-align:left;">The process of creating a training job in the Machine Learning Training Platform (MLTP) involves several steps:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Customization</b>: Users start by customizing their inputs, including organizing features and experimenting with model designs. They select a model from the Model Store, choose data from the Training Dataset, and configure training settings.</p></li><li><p class="paragraph" style="text-align:left;"><b>Initiation Options</b>: To start a training workload, users can either use the Griffin UI or Python SDKs to send requests to the workflow services.</p></li><li><p class="paragraph" style="text-align:left;"><b>Resource Creation</b>: The workflow services then generate Kubernetes resources based on the user&#39;s inputs, which can range from a simple single-container job to a complex multi-node Ray cluster.</p></li><li><p class="paragraph" style="text-align:left;"><b>Post-Training</b>: Upon completion, training results like MLFlow metrics and Datadog logs are displayed, and the model weights and other relevant items are stored in the Model Registry for future use in evaluation and inference.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/65165fab-b4fa-49f6-93da-448542239d87/0_Fowtq_fOMwAnaNKG.png?t=1700580200"/><div class="image__source"><span class="image__source_text"><p>Screenshot of Griffin Model</p></span></div></div><p class="paragraph" style="text-align:start;">The design of MLTP emphasizes a streamlined and standardized approach:</p><ul><li><p class="paragraph" style="text-align:left;">A centralized service and APIs provide a consistent interface for managing the entire model development lifecycle.</p></li><li><p class="paragraph" style="text-align:left;">Users can prototype using Ray clusters from their laptops or Jupyter servers, leveraging distributed computation.</p></li><li><p class="paragraph" style="text-align:left;">For production-ready models, the Griffin UI is used to create a production workflow definition.</p></li><li><p class="paragraph" style="text-align:left;">In cases with an existing Airflow production pipeline, Griffin&#39;s task and sensor operators are used for integrating with workflow APIs.</p></li><li><p class="paragraph" style="text-align:left;">Throughout the lifecycle, users interact with MLTP through the same API interface.</p></li></ul><h4 class="heading" style="text-align:left;">Lessons Learned</h4><p class="paragraph" style="text-align:left;">During the development of Instacart’s next-generation ML training infrastructure, the team learned about:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Unified Solutions</b>: By unifying ML training solutions, the team achieved a more consistent training job process and user experience, especially after transitioning to Kubernetes as the sole orchestration platform. This unification not only simplified management but also brought benefits like distributed computation and better metadata management.</p></li><li><p class="paragraph" style="text-align:left;"><b>Balancing Flexibility and Standardization</b>: The platform was designed to be highly flexible to support a broad spectrum of ML applications, while also incorporating standardization to cater to the majority of use cases and enhance development speed.</p></li><li><p class="paragraph" style="text-align:left;"><b>Considering the Bigger Picture</b>: The redesign of the ML Training Platform (MLTP) went beyond just training; it included model serving and feature engineering. This holistic approach involved collaboration with various Griffin 2.0 stakeholders, leading to co-designed data models for training jobs that integrate seamlessly into the end-to-end ML process, simplifying deployment and improving metadata management.</p></li></ol></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT</b></span><br><a class="link" href="https://nolanlawson.com/2023/12/02/lets-learn-how-modern-javascript-frameworks-work-by-building-one/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Let’s Learn How Modern JavaScript Frameworks Work By Building One</a></h2><div class="image"><a class="image__link" href="https://nolanlawson.com/2023/12/02/lets-learn-how-modern-javascript-frameworks-work-by-building-one/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a38875c1-24e5-4fd7-abd6-b6fe0521eb1e/stephenwsun_modern_frameworks_being_built_piece_by_piece_of_ind_b16c0a34-77bc-4ef5-b817-776588754379.png?t=1701791283"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://nolanlawson.com/about/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Nolan Lawson</a></i></p><p class="paragraph" style="text-align:left;"><b>Big picture:</b> This article provides an in-depth exploration of modern JavaScript frameworks by guiding the reader through the process of building a simple framework.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>It emphasizes key concepts like reactivity, DOM rendering, and using modern JavaScript APIs, illustrating the underlying principles and techniques that power frameworks like React, Vue, and Svelte.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>Understanding these concepts is crucial for JavaScript developers, as it deepens their knowledge of client-side technologies, improves their ability to choose or build suitable frameworks for their projects, and enhances their skills in solving complex front-end challenges.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>REACT</b></span><br><a class="link" href="https://swizec.com/blog/tanstack-router-modern-react-for-the-rest-of-us/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">TanStack Router - Modern React for the Rest of Us</a></h2><div class="image"><a class="image__link" href="https://swizec.com/blog/tanstack-router-modern-react-for-the-rest-of-us/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b518d210-173a-4c5a-b310-1fa27b31fa10/stephenwsun_React_developers_gain_perspective_on_a_router-drive_5a0555c7-5abb-4e8f-a45e-48d61b693190.png?t=1701791503"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://swizec.com/about/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Swizec Teller</a></i></p><p class="paragraph" style="text-align:left;"><br><b>Big picture: </b>The TanStack Router is a modern React routing solution that integrates advanced features like type-safe routing, coordinated data loading, and suspense-first design, representing a significant improvement in how web applications are structured and managed.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>React developers gain perspective on a router-driven approach that leads to more efficient UI state management, enabling smoother and more responsive user experiences with less coding effort.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>It signifies a shift towards more intuitive and powerful web development practices, aligning with higher demands for dynamic, user-centric web applications.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>HTML, CSS</b></span><br><a class="link" href="https://semaphoreci.com/blog/web-development-features?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Unravelling Five Exciting Modern Web Development Features</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/web-development-features?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ef2fb58e-925b-4e21-8a7e-89d20e32c4e8/stephenwsun_web_app_with_the_best_user_experience_48577234-2465-449e-855f-b8bf16f1390b.png?t=1701792115"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://www.linkedin.com/in/siddhantvarma99/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Siddhant Varma</a></i></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>This article introduces five modern web development features that are transforming the field: Native HTML Dialog, Native HTML Popovers, Container Queries for Responsiveness, CSS Color Mix, and CSS Nesting.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>It teaches how these features simplify coding, enhance design capabilities, and improve the user experience, without the need for extensive custom coding or external libraries.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>The significance lies in their potential to revolutionize web projects, making applications more efficient, visually appealing, and responsive, thus empowering developers to stay ahead in the rapidly evolving field of web development.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>INTERNET TRENDS</b></span><br><a class="link" href="https://blog.cloudflare.com/cyber-week-analyzing-internet-traffic-and-e-commerce-trends/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Cyber Week: Analyzing Internet Traffic and E-Commerce Trends</a></h2><div class="image"><a class="image__link" href="https://blog.cloudflare.com/cyber-week-analyzing-internet-traffic-and-e-commerce-trends/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d0af3d48-6d93-45a3-b16a-f5ac4be9e3a2/stephenwsun_a_comprehensive_analysis_of_internet_traffic_and_e-_19999f50-f725-40f6-b49c-b879023f835b.png?t=1701792283"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://twitter.com/emot?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">J</a></i><i><a class="link" href="https://twitter.com/emot?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">oão Tomé</a></i></p><p class="paragraph" style="text-align:left;"><b>Big picture: </b>The article presents a comprehensive analysis of internet traffic and e-commerce trends during key shopping events like Black Friday and Cyber Monday, offering insights into global and regional online behavior patterns.</p><p class="paragraph" style="text-align:left;"><b>What you’ll learn: </b>Developers will learn about the significant shifts in traffic on major e-commerce dates, the varying device usage trends (mobile vs. desktop), and the cybersecurity landscape, particularly regarding DDoS attacks around these peak times.</p><p class="paragraph" style="text-align:left;"><b>Why this matters: </b>This information is crucial for developers in optimizing website performance, enhancing user experience, and bolstering cybersecurity measures during high-traffic periods, which are pivotal for the success and resilience of e-commerce platforms.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/maximum-subarray-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Maximum Subarray</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solution to the latest coding challenge?</b></p><p class="paragraph" style="text-align:left;">This question is asked by Amazon and Microsoft. Learn the algorithm used to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/maximum-subarray-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://survey.devographics.com/en-US/survey/state-of-js/2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">State of JS Survey</a></b>: The JavaScript user survey aims to track JavaScript feature and library trends, and will openly publish results post-December 12 for community and company use.</p></li><li><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://www.postman.com/state-of-api/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform#key-findings" target="_blank" rel="noopener noreferrer nofollow">2023 State of the API Report</a></b>: APIs significantly generate revenue, API pricing is a growing concern, positive outlook on API investments, widespread use of AI in API development, and more.</p></li><li><p class="paragraph" style="text-align:left;">📢 <b><a class="link" href="https://deno.com/blog/cron?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Announcing Deno Cron</a></b>: Deno Cron simplifies web development by offering a streamlined way to create and manage scheduled jobs within Deno&#39;s serverless platform, Deno Deploy, ensuring efficient and non-overlapping task execution.</p></li><li><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://effectivetypescript.com/2023/11/29/infer-deep/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Using Infer to Unpack Nested Types</a></b>: How to use TypeScript&#39;s <code>infer</code> keyword for efficient type extraction in nested structures, simplifying the development of type-safe REST APIs.</p></li><li><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://blog.cloudflare.com/debugging-cloudflare-workers/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Debugging Cloudflare Workers</a></b>: Cloudflare Workers now offers enhanced debugging with breakpoints, integrating console logs, Chrome DevTools, and IDE support for easier development and troubleshooting.</p></li><li><p class="paragraph" style="text-align:left;">📜 <b><a class="link" href="https://www.smashingmagazine.com/2023/12/marketing-changed-oop-javascript/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">How Marketing Changed OOP</a></b>: How JavaScript&#39;s prototypal inheritance, influenced by the Self language and marketed as &quot;Java for the web,&quot; has shaped current JavaScript development practices, particularly in the use and understanding of prototypes.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://deno.com/blog/fresh-1.6?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Fresh 1.6</a></b>: Tailwind CSS plugin, partials with forms and error pages, improved islands bundling strategy, support for pre-generated assets, and more. </p></li><li><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://bun.sh/blog/bun-v1.0.15?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Bun 1.0.15</a></b>: 2x faster start for <code>tsc</code>, 40% speed increase for Prettier, stable WebSocket client, syntax-highlighted errors, and more.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://stately.ai/blog/2023-12-01-xstate-v5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">XState 5</a></b>: Actor as the main unit of abstraction, inspect API, deep persistence, stronger type inference, dynamic parameters, and enqueue actions.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <b><a class="link" href="https://github.com/evanw/esbuild/releases/tag/v0.19.7?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">ESBuild 0.19.7</a></b>: Standardization of import attributes and deprecation of import assertions.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Interesting</b>: <a class="link" href="https://www.pcmag.com/articles/ibms-plan-to-update-cobol-with-watson?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Global business and finance systems heavily rely on the 60-year-old COBOL programming language</a>, now understood by few programmers, with IBM considering Watson as a potential aid.</p><p class="paragraph" style="text-align:left;">✅ <b>Big Tech</b>: <a class="link" href="https://engineercodex.substack.com/p/how-google-takes-the-pain-out-of?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Google&#39;s code review tool Critique</a>, featuring AI enhancements and efficient guidelines, secures 97% developer satisfaction by simplifying and improving the code review process.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://blog.platformatic.dev/the-nodejs-event-loop?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Matteo dives into Node.js&#39;s event loop</a>, exploring its role in efficient asynchronous operation handling and offering best practices for optimizing its performance.</p><p class="paragraph" style="text-align:left;">✅ <b>Regex:</b> <a class="link" href="https://www.bennadel.com/blog/4532-the-regex-of-everyday-things.htm?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">The use of Regular Expressions</a> in code searches, highlighting their usefulness in simplifying pattern matching and data cleaning in everyday engineering tasks.</p><p class="paragraph" style="text-align:left;">✅ <b>Side Projects</b>: Developing a Dropbox-like application, creating MySQL solutions, writing about Regular Expressions, and designing themes for apps like <a class="link" href="https://obsidian.md/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Obsidian</a> are <a class="link" href="https://news.ycombinator.com/item?id=38511280&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">examples of side projects that have actually helped individuals secure jobs</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Tools and Packages</b></h2><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/Nozbe/WatermelonDB?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">WatermelonDB</a></b>: Reactive & asynchronous database for React and React Native apps. Built for performance and scale.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/NullVoxPopuli/package-majors?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Package Majors</a></b>:<b> </b>Enhanced tool for analyzing and comparing major version downloads of a package within the last week. <a class="link" href="https://majors.nullvoxpopuli.com/q?packages=node&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Here’s an example with Node</a>.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/blueedgetechno/win11React?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Win11React</a></b>: Recreation of the Windows 11 desktop experience in React. <a class="link" href="https://win11.blueedge.me/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Pretty awesome…for Windows</a>.</p><p class="paragraph" style="text-align:left;">📦️ <b><a class="link" href="https://github.com/blueedgetechno/win11React?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=deep-dive-into-instacart-s-machine-learning-platform" target="_blank" rel="noopener noreferrer nofollow">Zx</a></b>: Write more complex scripts with JavaScript.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br>🤣 🤣🤣🤣🤣</h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1b1135ff-fdad-406e-9e71-7f49134ac16d/88crh0.jpg?t=1701811686"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=6191d50f-0c54-4820-9723-7a9b7e2e819b&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Apple is Advancing iMessage Security</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/415d10b1-b267-4971-96fb-0d94a422fed7/stephenwsun_how_apple_is_advancing_imessage_security_7a4d4334-a1cb-4479-a7a7-38b3dc43e79b-min.png" length="1166711" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-apple-is-advancing-imessage-security</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-apple-is-advancing-imessage-security</guid>
  <pubDate>Wed, 15 Nov 2023 14:00:00 +0000</pubDate>
  <atom:published>2023-11-15T14:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;"><a class="link" href="https://ignite.microsoft.com/en-US/home?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Microsoft Ignite 2023</a> kicks off today at 8 AM PT, featuring a lineup of industry experts on the latest innovations in AI, data, security, and development tools. <a class="link" href="https://register.ignite.microsoft.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">It’s free</a>.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Security</b>: How Apple is advancing iMessage security.</p></li><li><p class="paragraph" style="text-align:left;"><b>Big Data</b>: Netflix’s transition to streaming SQL in data mesh.</p></li><li><p class="paragraph" style="text-align:left;"><b>WebAssembly</b>: A new way to bring garbage collected programming languages efficiently to WebAssembly.</p></li><li><p class="paragraph" style="text-align:left;"><b>CSS</b>: Speeding up the JavaScript ecosystem using Tailwind CSS.</p></li><li><p class="paragraph" style="text-align:left;"><b>DevOps</b>: Highlights from the State of DevOps 2023 report.</p></li><li><p class="paragraph" style="text-align:left;"><b>Accessibility</b>: Why accessibility is a requirement, not a feature.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>SECURITY</b></span><br><a class="link" href="https://security.apple.com/blog/imessage-contact-key-verification/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">How Apple is Advancing iMessage Security</a></h2><div class="image"><a class="image__link" href="https://security.apple.com/blog/imessage-contact-key-verification/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0bc22c2d-607e-4bd4-b4d5-3518cb0cb932/stephenwsun_how_apple_is_advancing_imessage_security_7a4d4334-a1cb-4479-a7a7-38b3dc43e79b-min.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://security.apple.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Apple Security Engineering and Architecture (SEAR)</a></i></p><p class="paragraph" style="text-align:left;"><b>Background</b><br>Apple&#39;s iMessage, known for its secure end-to-end encryption since 2011, has constantly been updated to combat evolving security threats. With hardware-aided key management, advanced sandboxing through <a class="link" href="https://googleprojectzero.blogspot.com/2021/01/a-look-at-imessage-in-ios-14.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">BlastDoor</a>, and <a class="link" href="https://support.apple.com/en-us/HT212650?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Lockdown Mode</a>, iMessage has established robust security features.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1142c32b-f98c-42d7-a573-8f03027d3f94/medium_ios17_imessageckv_iphone15pro_109ff0e37e.png"/><div class="image__source"><span class="image__source_text"><p>iMessage Contact Key Verification</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Challenge</b><br>The central key directory service (Identity Directory Service or IDS), which maps user identifiers to public keys, posed a single point of failure. A compromised service could return keys controlled by adversaries, enabling them to intercept messages.</p><p class="paragraph" style="text-align:start;"><b>Traditional Solutions</b><br>Peer-to-peer verification methods (e.g., QR codes or safety numbers) were used in other messaging systems to confirm key authenticity, but these methods were cumbersome for users, especially when devices changed or new ones were added.</p><p class="paragraph" style="text-align:start;"><b>Apple&#39;s Approach: iMessage Contact Key Verification With Key Transparency (KT)</b><br>Apple introduced Contact Key Verification to tackle the risks associated with the key directory service. Using Key Transparency, which leverages verifiable logs and maps, Apple ensures that users&#39; devices can cryptographically verify the integrity and authenticity of encryption keys.</p><p class="paragraph" style="text-align:start;"><b>Key Aspects:</b></p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Key Transparency and Verification:</b></p><ul><li><p class="paragraph" style="text-align:left;">Devices automatically verify keys using the KT system, which provides cryptographic proofs and can detect inconsistencies.</p></li><li><p class="paragraph" style="text-align:left;">The KT system employs a log-backed map data structure for scalability and user privacy, using techniques like <a class="link" href="https://www.techopedia.com/definition/sha-256?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">SHA-256 hash</a> and <a class="link" href="https://en.wikipedia.org/wiki/Verifiable_random_function?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Verifiable Random Functions</a>.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Account-Level Security:</b></p><ul><li><p class="paragraph" style="text-align:left;">An <a class="link" href="https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">ECDSA signing key</a> is generated on the user&#39;s device and stored securely in iCloud Keychain.</p></li><li><p class="paragraph" style="text-align:left;">This account key is used to sign iMessage public keys, which are then verified automatically by users’ devices.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Automatic and Manual Verification:</b></p><ul><li><p class="paragraph" style="text-align:left;">Devices verify keys automatically through the KT system, with alerts for any inconsistencies.</p></li><li><p class="paragraph" style="text-align:left;">Users can manually compare short codes using the <a class="link" href="https://www.iacr.org/archive/pkc2008/49390198/49390198.pdf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Vaudenay SAS protocol</a> to confirm that they see the same account key for their contacts.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Scalability and Notifications:</b></p><ul><li><p class="paragraph" style="text-align:left;">The system is designed to scale to billions of users and to provide notifications only when there&#39;s an unexpected security condition.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Third-Party Auditing and Gossip Protocols:</b></p><ul><li><p class="paragraph" style="text-align:left;">While initially using an internal auditing service, plans for external auditing are in the pipeline for 2024.</p></li><li><p class="paragraph" style="text-align:left;">The Messages app uses gossip protocols to ensure consistency of the KT logs among iMessage clients.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Future Device Sign-ins:</b></p><ul><li><p class="paragraph" style="text-align:left;">The verification extends to new devices automatically, linking the process to the user’s contact card for continuous assurance.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Public Persona Verification:</b></p><ul><li><p class="paragraph" style="text-align:left;">Public figures can use public verification codes to verify their identity.</p></li></ul></li></ol><p class="paragraph" style="text-align:left;"><b>Conclusion</b><br>iMessage Contact Key Verification represents a significant step in messaging security. It ensures that even if the key directory service is compromised, users can verify who they are messaging with and trust the integrity of their communication.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>BIG DATA</b></span><br><a class="link" href="https://netflixtechblog.com/streaming-sql-in-data-mesh-0d83f5a00d08?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Netflix’s Transition to Streaming SQL in Data Mesh</a></h2><div class="image"><a class="image__link" href="https://netflixtechblog.com/streaming-sql-in-data-mesh-0d83f5a00d08?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b5341967-addc-4765-9c52-d0e96b81df24/stephenwsun_sql_data_pipeline_big_data_dd29cc48-5da8-489c-8834-dc81679991cf-min.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://www.linkedin.com/in/guilhermesmi/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Guil Pires</a></i><i>, </i><i><a class="link" href="https://www.linkedin.com/in/markcho/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Mark Cho</a></i><i>, </i><i><a class="link" href="https://www.linkedin.com/in/liuml07/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">MingLiang Liu</a></i><i>, </i><i><a class="link" href="https://www.linkedin.com/in/sujayjain/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Sujay Jain</a></i></p><p class="paragraph" style="text-align:left;"><b>Introduction</b><br>Netflix, known for its massive content delivery and personalized experience, relies heavily on data. The Data Platform team is responsible for creating scalable data processing infrastructure.</p><p class="paragraph" style="text-align:left;"><b>The Challenge</b><br>As data demands grew, Netflix introduced &quot;Data Mesh&quot; - a data movement and processing platform utilizing <a class="link" href="https://kafka.apache.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Kafka</a> and <a class="link" href="https://flink.apache.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Flink</a>.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d010bba6-86a1-4ffc-a854-6784373b26b9/1_VxZlXPDb8-d7Xf4kfSulnw.png"/><div class="image__source"><span class="image__source_text"><p>Data Mesh Pipeline Example</p></span></div></div><p class="paragraph" style="text-align:left;">Users could build data pipelines with reusable &quot;Processors&quot; for tasks like filtering or renaming fields. However, this posed two major challenges:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Limited Expression: Pre-built Processors didn&#39;t always fit complex needs, leading to custom, difficult-to-learn solutions.</p></li><li><p class="paragraph" style="text-align:left;">High Overhead: Pipelines with multiple Processors incurred resource and runtime costs.</p></li></ol><p class="paragraph" style="text-align:left;"><b>Solution: Data Mesh SQL Processor</b><br>To increase flexibility and reduce complexity, Netflix developed the Data Mesh SQL Processor.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6bb96f3d-58cc-4162-8fa9-285e303bbcd4/1_qAuPr360NMTueuACAZ4LeA_2x.png"/><div class="image__source"><span class="image__source_text"><p>SQL Process Workflow</p></span></div></div><p class="paragraph" style="text-align:left;">This innovation leveraged <a class="link" href="https://www.confluent.io/blog/getting-started-with-apache-flink-sql/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security#flink-sql" target="_blank" rel="noopener noreferrer nofollow">Flink SQL</a> to allow complex data transformations using SQL queries instead of multiple Processors, thus reducing latency and resource usage.</p><p class="paragraph" style="text-align:start;">Key Features:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Managed Flink Jobs</b>: Simplified the transformation process with parameterized jobs.</p></li><li><p class="paragraph" style="text-align:left;"><b>Streaming SQL Support</b>: Enabled direct use of Flink SQL within Data Mesh without architectural changes.</p></li><li><p class="paragraph" style="text-align:left;"><b>Interactive Query Mode</b>: Provided real-time feedback and query validation for faster iteration.</p></li><li><p class="paragraph" style="text-align:left;"><b>Schema Inference</b>: Automated output schema creation from SQL queries, streamlining schema management.</p></li></ul><p class="paragraph" style="text-align:left;"><b>User Workflow</b><br>Software engineers using the SQL Processor follow these steps:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Sample Data</b>: Use Interactive Query Mode to sample upstream data.</p></li><li><p class="paragraph" style="text-align:left;"><b>Iterate on Queries</b>: Modify and validate SQL queries in real-time.</p></li><li><p class="paragraph" style="text-align:left;"><b>Deploy</b>: Save the query into the Data Mesh Pipeline for execution.</p></li></ol><p class="paragraph" style="text-align:left;"><b>Results</b><br>Adoption of the SQL Processor has been met with excitement. It allowed a more intuitive expression of business logic and unlocked new use cases without the need for writing custom Processors.</p><p class="paragraph" style="text-align:left;"><b>Lessons Learned</b><br>Netflix realized the benefits of Flink SQL early on could have saved significant engineering resources. Additionally, setting up guardrails for Flink SQL was crucial for managing expectations and operational workload.</p><p class="paragraph" style="text-align:left;"><b>Future Plans</b><br>The Data Platform team continues to expand SQL Processor features, such as supporting stream enrichment and advanced joins, to further harness the power of stream processing.</p><p class="paragraph" style="text-align:left;"><b>Conclusion</b><br>Netflix&#39;s transition to a Streaming SQL approach within Data Mesh signifies a strategic move towards more efficient, scalable, and manageable data processing methodologies that cater to the complex needs of a leading streaming service.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/contains-duplicate-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Contains Duplicate</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn the solution to one of the most common interview questions <a class="link" href="https://www.fullstackexpress.io/p/contains-duplicate-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>WEBASSEMBLY</b></span><br><a class="link" href="https://v8.dev/blog/wasm-gc-porting?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">A New Way To Bring Garbage Collected Programming Languages Efficiently to WebAssembly</a></h2><div class="image"><a class="image__link" href="https://v8.dev/blog/wasm-gc-porting?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/83aa3767-64e6-40e7-82ad-c284db936491/stephenwsun_efficient_garbage_collection_as_code_b2a988bc-c388-45df-8678-22086c58538f-min.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://www.linkedin.com/in/alonzakai/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Alon Zakai</a></i></p><p class="paragraph" style="text-align:left;">WebAssembly&#39;s latest optimization includes built-in support for garbage collection, allowing languages that traditionally rely on it, such as Java and Python, to run more efficiently on the Web.</p><p class="paragraph" style="text-align:left;">By leveraging WebAssembly&#39;s garbage collection, these languages can produce smaller and faster binaries.</p><p class="paragraph" style="text-align:left;">This advancement holds promise for more performant web applications utilizing these languages in the future.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>CSS</b></span><br><a class="link" href="https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-8/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Speeding Up The JavaScript Ecosystem - Tailwind CSS</a></h2><div class="image"><a class="image__link" href="https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-8/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7f1ba450-14bb-4dfb-97eb-6c7e1cce1b1f/stephenwsun_Speeding_Up_The_JavaScript_Ecosystem_-_Tailwind_CSS_dc4b65d8-1f3d-41f7-a7d0-ffb721912731-min__1_.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://marvinh.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Marvin Hagemeister</a></i></p><p class="paragraph" style="text-align:left;">Marvin’s article discusses how Tailwind CSS is used to style web projects and explores ways to optimize its performance.</p><p class="paragraph" style="text-align:left;">He analyzes the Tailwind architecture on its own website but encounters issues with noisy traces, so he runs the Tailwind CLI to identify key areas for improvement.</p><p class="paragraph" style="text-align:left;">Marvin suggests that significant speed improvements in Tailwind CSS can be achieved not by following best practices but by understanding and optimizing the code based on its purpose and the problems it solves.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DEVOPS</b></span><br><a class="link" href="https://semaphoreci.com/blog/state-of-devops-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">State of DevOps 2023 Highlights</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/state-of-devops-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7ba0640c-1260-47db-8898-e0a44b6d87d3/stephenwsun_the_state_of_devops_in_2023_f77a1270-fc7e-47a2-8f5d-e986a771653a-min.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://semaphoreci.com/author/tfernandez?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Tomas Fernandez</a></i></p><p class="paragraph" style="text-align:left;">Tomas highlights key findings from the <a class="link" href="https://dora.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">State of DevOps 2023 report</a> including the influence of AI on productivity, factors affecting job satisfaction and burnout, and the importance of cloud choices.</p><p class="paragraph" style="text-align:left;">It emphasizes user-focused development, key technical capabilities like CI/CD, the role of flexible cloud infrastructure, and the impact of quality documentation on job satisfaction and performance.</p><p class="paragraph" style="text-align:left;">The report also advocates for a generative culture to boost innovation and performance.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>ACCESSIBILITY</b></span><br><a class="link" href="https://ntietz.com/blog/accessibility-is-a-requirement-not-a-feature/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Accessibility is a Requirement, Not a Feature</a></h2><div class="image"><a class="image__link" href="https://ntietz.com/blog/accessibility-is-a-requirement-not-a-feature/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fba3b004-cb55-4598-9a2b-be797b7a21c9/stephenwsun_the_most_useful_website_in_the_world_87db01cf-51b7-451b-b339-fe1ceda99aa4-min.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://ntietz.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Nicole Tietz</a></i></p><p class="paragraph" style="text-align:left;">In her article, Nicole argues that accessibility in software is a crucial requirement, not an optional feature.</p><p class="paragraph" style="text-align:left;">She likens it to ongoing needs like security, needing constant attention in development.</p><p class="paragraph" style="text-align:left;">Her personal experience with temporary disability underscores the importance of accessible design for all users, not just those with permanent impairments.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📖 <a class="link" href="https://javascript.plainenglish.io/the-science-behind-the-javascript-engine-how-machines-read-your-code-3b067973587c?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">The science behind the JavaScript engine</a>.</p></li><li><p class="paragraph" style="text-align:left;">📖 <a class="link" href="https://medium.com/performance-engineering-for-the-ordinary-barbie/how-the-chrome-profiler-helps-you-understand-javascript-event-loop-92fa6a8bb46a?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">How the Chrome Profiler helps you understand the JavaScript event loop</a>.</p></li><li><p class="paragraph" style="text-align:left;">📖 <a class="link" href="https://timtech.blog/posts/react-server-components-rsc-no-framework/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">React Server Components without a framework</a>.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-3-rc/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">TypeScript 5.3 RC</a> - Import attributes, stable support for resolution-mode in import types, improved type narrowing, optimizations in JSDoc parsing and type intersections.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://blog.angular.io/introducing-angular-v17-4d7033312e4b?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Angular v17</a> - Deferrable views, 90% faster runtime, 87% faster builds for hybrid rendering, 67% faster client-side rendering, and new interactive learning journey.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://deno.com/blog/v1.38?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Deno 1.38</a> - Deno doc improvements, hot module replacement, Node.js compatibility improvements, faster JSX transforms, and WebSockets improvements.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://bun.sh/blog/bun-v1.0.11?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Bun </a><a class="link" href="https://bun.sh/blog/bun-v1.0.11?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">1.0.11</a> - Addition of <code>Bun.semver</code>, and bug fixes for <code>bun install</code>, <code>astro</code>, and <code>@google-cloud/storage</code>.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="http://🚀 Deno 1.38 - New" target="_blank" rel="noopener noreferrer nofollow">TSX 4.0.0</a> - Variadic tuple types, labeled tuple elements, class property inference from constructors, custom JSX factories, and short-circuiting assignment operators.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Interesting</b>: <a class="link" href="https://engineercodex.substack.com/p/how-one-line-of-code-caused-a-60?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">How AT&T lost over $60 million</a> due to one line of code.</p><p class="paragraph" style="text-align:left;">✅ <b>TypeScript:</b> <a class="link" href="https://effectivetypescript.com/2023/10/27/specialize-this/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">A complex technique</a> in TypeScript to specialize generics.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> Have the technical skills but communication needs improvement? <a class="link" href="https://careercutler.substack.com/p/a-guide-to-public-speaking-for-software?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Check out this guide</a> to public speaking for software engineers.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: <a class="link" href="https://www.youtube.com/watch?v=cXMAsTJXLw8&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">An in-depth video</a> on the growth of JavaScript runtimes over the years from <a class="link" href="https://github.com/jasnell?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">James Snell himself</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: <a class="link" href="https://corecursive.com/platform-takes-the-pain/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">The inside story of Spotify’s engineering growth</a> (10 to 1000s) on the <a class="link" href="https://corecursive.com/about?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">CoRecursive podcast</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://svelteflow.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Svelte Flow</a></b><b> </b>-<b> </b>A customizable Svelte component for building node-based editors and interactive diagrams.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/studio-freight/lenis?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Lenis</a></b> - A better smooth scroll library created for performance and accessibility. <a class="link" href="https://lenis.studiofreight.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">The demo</a>.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/sindresorhus/fkill-cli?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Fkill CLI</a></b> - A CLI for killing processes cross-platform.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/imba/imba?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Imba</a></b> - A full-stack programming language for the web that compiles to performant JavaScript.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/mpetroff/pannellum?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-apple-is-advancing-imessage-security" target="_blank" rel="noopener noreferrer nofollow">Pannellum</a></b> - A lightweight panorama viewer for the web.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br><b>Pair Programming Be Like…</b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f47d659e-4228-4873-be16-16e3e4793541/meme__2___1_.gif"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=43fa877e-acbe-442d-ad0b-7908b4f2a849&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Meta Automates Dead Code Cleanup</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/106951f6-1a93-4980-80ff-b2cbb63dddc3/stephenwsun_facebook_cleaning_up_peoples_trash_as_a_cartoon_e24db073-2d8a-403f-9e6d-411672575153.png" length="1098247" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-meta-automates-dead-code-cleanup</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-meta-automates-dead-code-cleanup</guid>
  <pubDate>Wed, 01 Nov 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-11-01T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;">I&#39;m traveling this week, so this issue will be shorter. We’ll be back in full swing next week 😎 </p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Data Infrastructure</b>: Learn how Meta’s Systematic Code and Asset Removal Framework (SCARF) automatically identifies and removes dead code.</p></li><li><p class="paragraph" style="text-align:left;"><b>Next.js/Remix</b>: Kent’s thoughts on why he prefers Remix for its simplicity and flexibility, cautioning against Next.js’s complexity and urging clearer distinctions in the React community.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: Matteo’s guide on boosting Node.js API performance with Platformatic DB, emphasizing automated CRUD creation, multi-database support, and efficient caching, tested using Autocannon.</p></li><li><p class="paragraph" style="text-align:left;"><b>Career Development</b>: Why aspiring senior software engineers should focus on data modeling, asynchronous systems, and cloud technologies.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA INFRASTRUCTURE</b></span><br><a class="link" href="https://engineering.fb.com/2023/10/24/data-infrastructure/automating-dead-code-cleanup/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">How Meta Automates Dead Code Cleanup</a></h2><div class="image"><a class="image__link" href="https://engineering.fb.com/2023/10/24/data-infrastructure/automating-dead-code-cleanup/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/106951f6-1a93-4980-80ff-b2cbb63dddc3/stephenwsun_facebook_cleaning_up_peoples_trash_as_a_cartoon_e24db073-2d8a-403f-9e6d-411672575153.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/wshackleton/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><i>Will Shackleton</i></a><i>, </i><a class="link" href="https://www.linkedin.com/in/andypincombe/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><i>Andy Pincombe</i></a><i>, </i><a class="link" href="https://www.linkedin.com/in/katrielalex/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><i>Katriel Cohn-Gordon</i></a></p><p class="paragraph" style="text-align:left;">Meta&#39;s Systematic Code and Asset Removal Framework (SCARF) plays a critical role in automating dead code cleanup by utilizing a mix of static and dynamic program analysis.</p><p class="paragraph" style="text-align:left;">The framework is designed to identify redundant code from both a business and programming language standpoint, subsequently generating change requests to delete the identified dead code, thus reducing the burden on developers.</p><p class="paragraph" style="text-align:left;"><b>Dead Code Removal Process</b><br>SCARF encompasses a subsystem specifically tailored for automatic dead code identification and removal, employing static, runtime, and application analysis to achieve this.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dfd04888-81cb-4ae7-91ae-76da9d764039/Automating-Dead-Code-Cleanup-image1.png"/><div class="image__source"><span class="image__source_text"><p>SCARF’s Code Analysis Subsystem</p></span></div></div><p class="paragraph" style="text-align:left;">The process involves gathering comprehensive data from various sources to construct an augmented dependency graph, which serves as the foundation for identifying unreachable code segments that can be safely removed.</p><p class="paragraph" style="text-align:left;">The framework is versatile, supporting multiple programming languages and operating at a symbol level for more precise analysis and cleanup. This approach not only enhances the quality of the systems but also facilitates the removal of unused data by resolving dead code references to data assets.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/52c47fce-7b14-4cc5-b534-e970c2676ab2/Automating-Dead-Code-Cleanup-image2.png"/><div class="image__source"><span class="image__source_text"><p>SCARF’s Automated Code Change Requests</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Results</b></p><ul><li><p class="paragraph" style="text-align:left;">SCARF has significantly improved system quality and efficiency, automating the removal of over 100 million lines of code through more than 370,000 change requests.</p></li><li><p class="paragraph" style="text-align:left;">The framework supports a wide range of programming languages, ensuring comprehensive dead code removal across different parts of the system.</p></li><li><p class="paragraph" style="text-align:left;">Despite its effectiveness, SCARF does not provide a complete solution for shutting down deprecated products, highlighting an ongoing need for improvements in integration across various languages, systems, and frameworks.</p></li><li><p class="paragraph" style="text-align:left;">The team emphasizes a cautious approach, implementing additional safety mechanisms like textual references search through the BigGrep system to prevent accidental deletions.</p></li><li><p class="paragraph" style="text-align:left;">Engineers play a vital role in the deprecation process, often opting to manually delete code for faster turnaround times, showcasing a balance between automated and manual efforts in dead code removal.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NEXT.JS, REMIX</b></span><br><a class="link" href="https://www.epicweb.dev/why-i-wont-use-nextjs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Why I Won’t Use Next.js</a></h2><div class="image"><a class="image__link" href="https://www.epicweb.dev/why-i-wont-use-nextjs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d6e6fbd5-e4a2-4957-a3e1-deb546aab167/stephenwsun_a_clearer_distinction_between_Next.js_and_React_and_eba74381-a0e9-443a-bf02-ae47cdc76597.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://kentcdodds.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Kent C. Dodds</a></i></p><p class="paragraph" style="text-align:left;">Kent C. Dodds advocates for using <a class="link" href="https://github.com/remix-run/remix?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Remix</a> over <a class="link" href="https://github.com/vercel/next.js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Next.js</a> due to its direct use of web platform APIs, enhancing transferable skills, its flexibility to deploy anywhere, and its commitment to stability and simplicity. He expresses concerns about Next.js’s increasing complexity, potential “magic” that could surprise developers, and the marketing of experimental features as stable. He calls for a clearer distinction between Next.js and React, and a more collaborative approach in the React community.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/binary-search-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Binary Search</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn the algorithm used to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/binary-search-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><a class="link" href="https://blog.platformatic.dev/how-to-make-your-nodejs-api-5x-faster-with-platformatic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">How To Make Your Node.js API 5x Faster with Platformatic</a></h2><div class="image"><a class="image__link" href="https://blog.platformatic.dev/how-to-make-your-nodejs-api-5x-faster-with-platformatic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f0234300-e0fd-4219-b7bd-fbf3f3bd63b5/stephenwsun_a_fast_web_server_2ac7e97d-9c26-4ca7-9cb5-57f7e29bf2a9.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://nodeland.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><i>Matteo Collina</i></a></p><p class="paragraph" style="text-align:left;">In this guide, backend developers are introduced to <a class="link" href="https://docs.platformatic.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Platformatic DB</a>, a tool that enhances Node.js API performance by automating CRUD API creation and supporting multiple databases. The importance of caching for API optimization is emphasized, with <a class="link" href="https://github.com/mcollina/async-cache-dedupe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">async-cache-dedupe</a> highlighted as an effective solution for data storage and rapid retrieval, reducing latency and saving bandwidth. The article also introduces <a class="link" href="https://github.com/mcollina/autocannon?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Autocannon</a>, an HTTP/1.1 benchmarking tool, for testing the efficiency of the optimizations made.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>CAREER DEVELOPMENT</b></span><br><a class="link" href="https://levelupsoftwareengineering.substack.com/p/6-skills-required-to-be-a-senior?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">6 Skills Required To Be A Senior Software Engineer</a></h2><div class="image"><a class="image__link" href="https://levelupsoftwareengineering.substack.com/p/6-skills-required-to-be-a-senior?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/64d69e41-5eb7-41e4-8453-18763ddd7a76/stephenwsun_a_case_study_comparing_two_web_frameworks_58dfd7e6-7113-4c42-953b-b2269d9b0dba.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/calebmellas/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><i>Caleb Mellas</i></a></p><p class="paragraph" style="text-align:left;">Caleb shares his knowledge on how to work towards senior software engineering positions. To thrive as a senior software engineer, mastering skills in data modeling, asynchronous systems, autoscaling, cloud technologies, caching, and ensuring concurrency and idempotency in distributed systems is crucial, as these areas are often scrutinized in technical interviews and essential for handling complex technical challenges.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://nextjs.org/blog/next-14?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Next.js 14</a> - Speed improvements with Turbopack, Server Actions (stable), Partial Prerendering (preview), and Next.js Learn.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://astro.build/blog/astro-340/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Astro 3.4</a> - Page partials, image optimization performance, and dev overlay (experimental).</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Advice:</b> <a class="link" href="https://matt-rickard.com/positioning-yourself-near-the-opportunity?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Positioning yourself near opportunities</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Join:</b> <a class="link" href="https://itch.io/jam/game-off-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Game Off 2023</a> will take place from November 1 to December 1. Join GitHub’s annual game jam challenge!</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://discord.com/blog/maxjourney-pushing-discords-limits-with-a-million-plus-online-users-in-a-single-server?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Pushing Discord’s limits</a> with more than a million online users in a single server.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: <a class="link" href="https://www.youtube.com/watch?v=hn_L56ypX1A&t=26733s&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Stephen Cooper of Ag-Grid</a> demonstrates different techniques to optimize performance in React.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: <a class="link" href="https://www.software-engineering-unlocked.com/measure-developer-experience/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">On the Software Engineering Unlocked podcast</a>, Abi Noda explains how to measure developer experience and why a good developer experience matters.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/google-github-actions/release-please-action?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Release Please Action</a></b> - Google’s Github action for automating releases based on conventional commits.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/Schniz/fnm?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Fnm</a> - Fast and simple Node.js version manager, built in Rust.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/FredrikNoren/ungit?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">Ungit</a> - The easiest way to use git, anywhere, on any platform.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/shellscape/jsx-email?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">J</a><b><a class="link" href="https://github.com/shellscape/jsx-email?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow">SX Email</a></b> - React components and helpers for building responsive email templates.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/cognetwork-dev/Metallic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-meta-automates-dead-code-cleanup" target="_blank" rel="noopener noreferrer nofollow"><b>Metallic</b></a> - A powerful web proxy built for speed and customization.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=d0b97171-2836-4dca-b0c6-87ecd5f14800&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Uber Optimizes Advertising Through Ads Simulation</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/78f25aff-6bed-478b-b40c-5be794613157/stephenwsun_uber_eats_ad_simulator_94474136-3c58-4138-9e26-165272f182ed.png" length="1397211" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-uber-optimizes-advertising-through-ads-simulation</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-uber-optimizes-advertising-through-ads-simulation</guid>
  <pubDate>Wed, 25 Oct 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-10-25T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.theregister.com/2023/10/23/martin_goetz_obit/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Martin Goetz</a>, regarded by many as the &quot;father of third-party software,&quot; has died at the age of 93. Goetz was notable for receiving the first software patent, awarded in 1968, for his <a class="link" href="https://patents.google.com/patent/US3380029A/en?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">sorting system program</a>.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Architecture</b>: How Uber optimizes advertising through ads simulation.</p></li><li><p class="paragraph" style="text-align:left;"><b>Performance</b>: How DoorDash standardized and improved microservices caching.</p></li><li><p class="paragraph" style="text-align:left;"><b>Solid.js</b>: The importance of locality of thinking and a pass-by-value approach.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: Why it’s time to transition from Buffer to Uint8Array.</p></li><li><p class="paragraph" style="text-align:left;"><b>Software Development</b>: Critique of the software industry’s neglect of efficiency and optimization, urging a shift in development practices.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>ARCHITECTURE</b></span><br><a class="link" href="https://www.uber.com/en-RO/blog/unleashing-the-power-of-ads-simulation/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">How Uber Optimizes Advertising Through Ads Simulation</a></h2><div class="image"><a class="image__link" href="https://www.uber.com/en-RO/blog/unleashing-the-power-of-ads-simulation/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/78f25aff-6bed-478b-b40c-5be794613157/stephenwsun_uber_eats_ad_simulator_94474136-3c58-4138-9e26-165272f182ed.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://www.linkedin.com/in/yueyinio/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Yue Yin</a></i></p><p class="paragraph" style="text-align:left;"><b>Introduction to Ads Simulation</b><br>Uber Eats employs advertising tools to help merchants boost their sales, striving to display the most relevant ads to customers.</p><p class="paragraph" style="text-align:left;">Traditional methods to measure changes in ad placements, ranking algorithms, and bidding strategies include costly and time-consuming experiments, or quicker but biased offline analyses.</p><p class="paragraph" style="text-align:left;">To overcome these challenges, Uber developed the Ads Simulator, a tool that replicates various ad system scenarios, providing reliable results swiftly and affordably.</p><p class="paragraph" style="text-align:left;"><b>Summary of Ads Auction and Workflow</b></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/096e8412-a65e-4dd1-969d-78ed335c6b1c/Figure_1.png"/><div class="image__source"><span class="image__source_text"><p>Uber Eats: Ads Auction and Bidding Flow</p></span></div></div><ol start="1"><li><p class="paragraph" style="text-align:left;">The system initiates and gathers user context upon receiving an ad request.</p></li><li><p class="paragraph" style="text-align:left;">Potential ad campaigns matching the user&#39;s context are identified and selected.</p></li><li><p class="paragraph" style="text-align:left;">Campaigns bid in real-time, with performance optimized for pacing and budget.</p></li><li><p class="paragraph" style="text-align:left;">Winners are determined, and ad placements are assigned by the auction module.</p></li><li><p class="paragraph" style="text-align:left;">Interactions and effectiveness of the ads are tracked and analyzed.</p></li><li><p class="paragraph" style="text-align:left;">Campaigns continuously adapt their internal states based on market conditions.</p></li></ol><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><b>Architecture and Configuration</b></span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0dae8dfa-de2e-4b05-888c-92c1629ac1db/Figure_2.png"/><div class="image__source"><span class="image__source_text"><p>Ads Simulator Architecture</p></span></div></div><p class="paragraph" style="text-align:left;">The Ads Simulator replicates the ads auction and bidding flow, providing outcomes from potential ad strategies that reflect the real-world dynamics of the ads marketplace. It captures the complexities of budget pacing and utilizes a full spectrum of advertisers, offering a more holistic and accurate simulation.</p><p class="paragraph" style="text-align:start;"><i>Core Ads Flow Simulator</i></p><ul><li><p class="paragraph" style="text-align:left;">Central to the architecture, managing auctions and bids for all market advertisers.</p></li><li><p class="paragraph" style="text-align:left;">Generates comprehensive simulation data logs, with inputs from Simulation Configuration and Auction Context.</p></li></ul><p class="paragraph" style="text-align:start;"><i>Configuration</i></p><ul><li><p class="paragraph" style="text-align:left;">Enables tailoring of the simulator for a variety of ad strategies.</p></li><li><p class="paragraph" style="text-align:left;">Simple adjustments of parameters allow for straightforward customization.</p></li></ul><p class="paragraph" style="text-align:start;"><i>Auction Context</i></p><ul><li><p class="paragraph" style="text-align:left;">Consists of auctions, bidders, and user details for simulating results and adjusting future auctions.</p></li><li><p class="paragraph" style="text-align:left;">Utilizes real auction logs to overcome selection bias and synthetic data for testing different market conditions.</p></li></ul><p class="paragraph" style="text-align:start;"><i>Core Ads Flow</i></p><ul><li><p class="paragraph" style="text-align:left;">Accurately replicates entire marketplace interactions.</p></li><li><p class="paragraph" style="text-align:left;">Includes Ad Campaigns with a three-agent system, Auctioneer for replicating actual auction mechanisms, and User Response Simulator for simulating customer interactions.</p></li></ul><p class="paragraph" style="text-align:start;"><i>Logging and Analysis</i></p><ul><li><p class="paragraph" style="text-align:left;">Captures extensive simulation data, offering built-in functions for advanced analysis and visualization.</p></li><li><p class="paragraph" style="text-align:left;">Highly extensible, allowing for customized integrations and valuable insights into ad strategies and marketplace dynamics.</p></li></ul><p class="paragraph" style="text-align:left;"><b>Practical Use Cases at Uber</b></p><p class="paragraph" style="text-align:left;">The Ads Simulator at Uber provides critical insights and accurately mirrors the ads marketplace dynamics, proving its reliability through real-world experimental results.</p><p class="paragraph" style="text-align:left;">Engineers and scientists at Uber can confidently use the simulator to make well-informed decisions, enhance campaign performance, and uncover new innovative opportunities.</p><p class="paragraph" style="text-align:start;"><b>Use Case 1: Reserve Price Design in Auction Mechanism</b></p><ul><li><p class="paragraph" style="text-align:left;">Demonstrates the simulator&#39;s ability to efficiently find the optimal reserve price design, saving time and resources compared to traditional trial-and-error methods.</p></li><li><p class="paragraph" style="text-align:left;">Experimentation results closely align with simulated results, showcasing the simulator&#39;s accuracy and its capability to significantly impact ads revenue and advertiser outcomes without risking real-world assets.</p></li></ul><p class="paragraph" style="text-align:start;"><b>Use Case 2: Budget Allocating for Ad Campaigns</b></p><ul><li><p class="paragraph" style="text-align:left;">Assists the platform in identifying optimal geographical regions for campaign budget allocation, enhancing advertiser impact and ensuring personalized customer experiences.</p></li><li><p class="paragraph" style="text-align:left;">Overcomes limitations of traditional experimentation and observational data, providing reliable data for evaluating budget scaling strategies and validating its results through online experimentation.</p></li></ul><p class="paragraph" style="text-align:start;">The presented use cases underscore the simulator&#39;s precision, efficiency, and its role as a dependable tool for driving business success at Uber.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>PERFORMANCE</b></span><br><a class="link" href="https://doordash.engineering/2023/10/19/how-doordash-standardized-and-improved-microservices-caching/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">How DoorDash Standardized and Improved Microservices Caching</a></h2><div class="image"><a class="image__link" href="https://doordash.engineering/2023/10/19/how-doordash-standardized-and-improved-microservices-caching/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fa7d7e50-9a2b-443b-b0bb-dc602d2da2f2/stephenwsun_DoorDashs_growing_microservices_architecture_has_le_ad74ed5f-c5f9-455f-9688-7fb0c0985f96.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i>Lev Neiman, Jason Fan</i></p><p class="paragraph" style="text-align:left;">DoorDash&#39;s growing microservices architecture has led to a surge in interservice traffic, resulting in the need for a streamlined caching solution.</p><p class="paragraph" style="text-align:left;">This issue was addressed by introducing a Kotlin library, providing a uniform, efficient, and secure method for backend developers to implement new caches, improving performance and reducing costs.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/38684216-bdfd-4019-bbc7-f513b7c5522d/Untitled.png"/><div class="image__source"><span class="image__source_text"><p>Multi-Layer Cache Request Flow</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><b>Problems and Challenges</b></span><br>Given DoorDash&#39;s prioritization of implementing business logic over performance optimization, there was a significant challenge in enhancing system efficiency without modifying the existing codebase.</p><p class="paragraph" style="text-align:left;">Several issues came up as a result, including:</p><ul><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Cache Staleness</span>: Ensuring cache remains updated with the original data source is complex, and resolving issues from outdated cache entries is time-consuming.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Heavy Dependency on Redis</span>: Services often face a high rate of failure during Redis downtimes or other issues.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">No Runtime Control</span>: Introducing a new cache is risky without real-time adjustments; changes require new deployments or rollbacks, consuming time and resources.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Inconsistent Key Schema</span>: The lack of standardized cache keys complicates debugging and tracing between Redis cache and Kotlin code.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Inadequate Metrics and Observability</span>: The absence of uniform metrics across teams leads to a lack of essential data for performance analysis.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Difficulty in Implementing Multilayered Caching</span>: The previous setup did not support the use of multiple caching layers for the same method easily.</p></li></ul><p class="paragraph" style="text-align:left;"><b>Streamlined Caching and and Performance Enhancement</b></p><p class="paragraph" style="text-align:left;">A simplified, streamlined approach was adopted to address these issues and ensure seamless system integration.</p><ul><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Pilot Program on DashPass</span>: Addressed caching issues and scaling challenges by developing a simple caching library, enhancing performance with minimal disruption.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Standardization of Caching Clients</span>: Introduced a simplified interface for application developers, standardizing function signatures and APIs across various caching clients for easier integration and maintenance.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Dependency Injection and Polymorphism</span>: Employed to maintain consistent cache calls and ensure uniform caching processes, enhancing backend efficiency.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Multi-layered Caching System</span>: Implemented a layered caching approach, comprising request local cache, local cache, and Redis cache, to optimize performance and reduce dependency on slower network layers.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Optimized Retrieval and Storage</span>: Ensured quicker access to cached data in subsequent requests by storing keys in all earlier layers once found in a later layer, enhancing system efficiency.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Runtime Feature Flag Control</span>: Enabled individual cache management, allowing for quick adjustments, rollouts, and tuning without new deployments, and providing flexibility in caching strategy.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Performance Metrics and Cache Shadowing</span>: Collected key performance metrics and implemented a cache shadowing mechanism for validating cache entries, ensuring optimal performance and data accuracy.</p></li><li><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;">Empirical Validation of Cache Invalidation Strategy</span>: Utilized extensive metrics and observability into cache staleness for empirical validation, ensuring the system’s optimal functionality.<br></p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/valid-anagram-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Valid Anagram</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn how to use a hash table to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/valid-anagram-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>SOLID.JS</b></span><br><a class="link" href="https://dev.to/this-is-learning/thinking-locally-with-signals-3b7h?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Thinking Locally with Signals</a></h2><div class="image"><a class="image__link" href="https://dev.to/this-is-learning/thinking-locally-with-signals-3b7h?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c206add3-a30e-40ab-9333-182be99da5a4/stephenwsun_Thinking_Locally_with_Signals_7217afab-b982-4cb0-88fd-19f624b37d2e.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://dev.to/ryansolid?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Ryan Carniato</a></i></p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.solidjs.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">SolidJS</a>, influenced by React, emphasizes design principles like unidirectional flow and explicit mutation for building user interfaces, rather than technologies like Virtual DOM. Ryan highlights the importance of &quot;locality of thinking,&quot; enabling developers to understand and work with components in isolation, boosting productivity and maintainability. To achieve this, the article recommends a pass-by-value approach, treating all props as reactive, and avoiding implicit mutations, guiding developers to create more predictable and manageable React and SolidJS applications.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><a class="link" href="https://sindresorhus.com/blog/goodbye-nodejs-buffer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Goodbye, Node.js Buffer</a></h2><div class="image"><a class="image__link" href="https://sindresorhus.com/blog/goodbye-nodejs-buffer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/036dd550-1e51-4522-836b-6ff4e5ede0c6/stephenwsun_Goodbye_Node.js_Buffer_5c6796aa-39b5-42b3-938c-f8bdd24dd5ad.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://sindresorhus.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Sindre Sorhus</a></i></p><p class="paragraph" style="text-align:left;"><a class="link" href="https://nodejs.org/api/buffer.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Buffer</a> has long been the go-to solution for handling binary data in Node.js, but it’s becoming outdated due to the cross-platform, native JavaScript type <a class="link" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Uint8Array</a>. The extensive methods that Buffer adds to Uint8Array lead to compatibility issues with other JavaScript environments and potential security risks. To modernize practices and avoid unpredictable behavior, it’s recommended to transition from Buffer to Uint8Array.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>SOFTWARE DEVELOPMENT</b></span><br><a class="link" href="https://tonsky.me/blog/disenchantment/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Software Disenchantment</a></h2><div class="image"><a class="image__link" href="https://tonsky.me/blog/disenchantment/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/58a0bf3e-f05f-4bc5-a0e6-23111989880e/stephenwsun_software_slow_74c2b08c-d713-4d16-a20c-169eb9f39905.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://tonsky.me/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Nikita Prokopov</a></i></p><p class="paragraph" style="text-align:left;">The article expresses a deep-seated frustration with the current state of software development, highlighting the industry&#39;s disregard for efficiency and optimization in favor of faster hardware and bloated software. It draws parallels between software and other industries like automotive and construction, emphasizing how software lags behind in terms of reaching optimal performance and efficiency. The author criticizes the unnecessary complexity and size of modern applications, calling for a reevaluation of development practices to prioritize simplicity, excellence, and thoughtful resource utilization.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📢 The React team announced that <a class="link" href="https://twitter.com/reactjs/status/1716573234160967762?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Server Actions are ready for adoption</a> by libraries and frameworks via React Canary.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://bun.sh/blog/bun-v1.0.7?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Bun 1.0.7</a> - Optional peer dependencies in <code>bun install</code>, improvements to Node.js compatibility, and lots of bug fixes.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://platformatic.dev/v1launch/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Platformatic 1.0.0</a> - Breaking change detector for microservices and stackables.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://yarnpkg.com/blog/release/4.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Yarn 4.0</a> - Hardened mode to protect against attacks, improved user interface, TypeScript integration, interactive tools, and better performance.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://storybook.js.org/blog/storybook-7-5/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Storybook 7.5</a> - Next.js improvements, enhanced Angular support, and 2.2x faster startup for React TypeScript projects.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Deep Dive</b>: <a class="link" href="https://blog.apify.com/node-vs-deno-vs-bun/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Node vs Deno vs Bun</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Register:</b> <a class="link" href="https://reinvent.awsevents.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">AWS re:Invent</a> is taking place on Nov. 27 - Dec. 1, 2023 in Las Vegas, NV. Learn about the latest cloud industry innovations, meet with AWS experts, and build connections.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> What every developer should know about <a class="link" href="https://codeconfessions.substack.com/p/gpu-computing?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">GPU computing</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: Matteo Collina demonstrates <a class="link" href="https://www.youtube.com/watch?v=MxYtZ93hXyc&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">how to improve Node.js API performance</a>, increasing requests per second by 5x and reducing latency to 1/3.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: <a class="link" href="https://syntax.fm/show/682/design-systems-with-brad-frost?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Brad Frost discusses design systems</a>, best practices, and keeping codebases in sync on the <a class="link" href="https://syntax.fm/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Syntax podcast</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Read</b>: <a class="link" href="https://github.com/ZachGoldberg/Startup-CTO-Handbook?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">The Startup CTO’s Handbook</a>, covering leadership, management and technical topics for leaders of software engineering teams</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/opensheetmusicdisplay/opensheetmusicdisplay?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">OpenSheetMusicDisplay</a></b> - A MusicXML renderer for the browser.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://backroad.sudomakes.art/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Backroad</a></b> - Create web apps with no frontend-experience, all with Node.js.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/jakubfiala/atrament.js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Atrament</a></b> - JS library for beautiful drawing and handwriting on HTML Canvas.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/nexe/nexe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-uber-optimizes-advertising-through-ads-simulation" target="_blank" rel="noopener noreferrer nofollow">Nexe</a></b> - command-line utility that compiles your Node.js application into a single executable file. </p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br><b>It Does Run </b>😄 </h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/50c76c83-007b-4799-95ac-f6e99403acce/4dnvvjeuq0541-min.jpg"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=bd61e240-0fbb-4885-8b97-4bc61a4f1aee&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>The Creation of Tinder’s Design System Obsidian</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5c42fa17-3fbf-40b2-b4f0-fed147a2542e/stephenwsun_The_Creation_of_Tinders_Design_System_Obsidian_cc9be032-5d04-4536-bb62-808463d38674.png" length="818361" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/the-creation-of-tinders-design-system-obsidian</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/the-creation-of-tinders-design-system-obsidian</guid>
  <pubDate>Wed, 18 Oct 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-10-18T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;">Exciting News! <a class="link" href="https://tanstack.com/blog/announcing-tanstack-query-v5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">TanStack Query v5.0.0</a> has officially launched after an intense year of development, improving from v4 with a streamlined API and size reduction of around 20%. New features include simplified optimistic updates, 1st class suspense support, sharable mutation state, and enhanced Devtools.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Design System</b>: Learn how Tinder created Obsidian.</p></li><li><p class="paragraph" style="text-align:left;"><b>Machine Learning</b>: Understand how Expedia uses price alerts to increase engagement with their users.</p></li><li><p class="paragraph" style="text-align:left;"><b>React</b>: Million.js compiles React components, reducing virtual DOM use and cutting memory usage by 55%.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: Improve Node.js application performance by leveraging the cluster module for multi-instance concurrency and scaling.</p></li><li><p class="paragraph" style="text-align:left;"><b>Next.js</b>: Optimized barrel file imports resulted in 70% faster development, 28% quicker builds, and 40% improved cold starts.</p></li><li><p class="paragraph" style="text-align:left;"><b>Productivity</b>: Managing capacity instead of time to do our best work.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>DESIGN SYSTEM</b></span><br><a class="link" href="https://medium.com/tinder/building-obsidian-tinders-design-system-e127770d8e3f?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">The Creation of Tinder’s Design System Obsidian</a></h2><div class="image"><a class="image__link" href="https://medium.com/tinder/building-obsidian-tinders-design-system-e127770d8e3f?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5c42fa17-3fbf-40b2-b4f0-fed147a2542e/stephenwsun_The_Creation_of_Tinders_Design_System_Obsidian_cc9be032-5d04-4536-bb62-808463d38674.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/darragh-burke-875509163/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>Darragh Burke</i></a></p><p class="paragraph" style="text-align:left;"><b>Introduction</b><br>In 2012, Tinder introduced an innovative approach to online dating with its Swipe Right® and Swipe Left™ features. This intuitive design quickly gained traction, leading to the app&#39;s immense popularity.</p><p class="paragraph" style="text-align:left;">As Tinder grew over the decade, the design complexities expanded, and a design overhaul became essential for coherence and consistency.</p><p class="paragraph" style="text-align:left;"><b>The Challenge</b><br>Tinder&#39;s initial success led to swift feature introductions. This rapid expansion, while essential for keeping user engagement high, resulted in a design language that began to diverge in different parts of the app.</p><p class="paragraph" style="text-align:left;">Not only did this create challenges in maintaining a unified user experience, but it also led to increased costs in design adaptations and a more intricate codebase.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ee1468c0-ab50-41ba-b56d-1ce30b256f0c/0_LH6jEdtNZ0vaXrts.png"/><div class="image__source"><span class="image__source_text"><p>Difficulty Maintaining Styles</p></span></div></div><p class="paragraph" style="text-align:left;"><b>The Obsidian Solution</b><br>In response to the growing design challenges, Tinder conceptualized &#39;Obsidian&#39;. This new system was intended to be a <a class="link" href="https://bradfrost.com/blog/post/atomic-web-design/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">design ecosystem</a> composed of standardized design tokens, reusable UI components, documentation, and design tools.</p><ul><li><p class="paragraph" style="text-align:left;"><b>Design Tokens</b>: These became the building blocks of Obsidian. Design Tokens were standardized references for every design aspect ranging from colors to fonts.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/aa4a5053-654c-4344-8095-44739e216390/0_P6KS3huUBGYfsTyy.png"/><div class="image__source"><span class="image__source_text"><p>Tokens Studio, A Figma Plugin</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><i>Base Tokens</i>: These were direct design references, pointing to specifics such as exact color shades or font measurements.</p></li><li><p class="paragraph" style="text-align:left;"><i>Context Tokens</i>: To provide adaptability, especially in scenarios like shifting between dark and light modes, context tokens were introduced.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Compatibility with Prevailing Tools</b>: The Obsidian system was not built in isolation. It effectively integrated existing tools like <a class="link" href="https://www.figma.com/community/plugin/843461159747178978?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Tokens Studio on Figma</a> for defining design tokens. Moreover, to ensure consistent representation of design aspects across various platforms like iOS, Android, and the Web, <a class="link" href="https://amzn.github.io/style-dictionary/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian#/" target="_blank" rel="noopener noreferrer nofollow">Style Dictionary</a> was employed.</p></li></ul><p class="paragraph" style="text-align:start;">To support designers and developers in adapting to Obsidian, Tinder went the extra mile:</p><ul><li><p class="paragraph" style="text-align:left;">A detailed guide was crafted using <a class="link" href="https://zeroheight.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Zeroheight</a> to help teams navigate the nuances of the new system.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e62a24e0-3565-451b-834e-fadee4315d7d/0_8PMuhZ6Gl0CP0_0O.png"/><div class="image__source"><span class="image__source_text"><p>Design Documentation Created Using Zeroheight</p></span></div></div></li><li><p class="paragraph" style="text-align:left;">A <i>token lookup tool</i> was introduced. This handy tool streamlined the process of selecting and employing design elements.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/063e9453-7cf5-4e81-afaa-efe8a4132a39/0_Y-TfEi3TnD5-pGtW.png"/><div class="image__source"><span class="image__source_text"><p>Tinder’s Token Lookup Tool</p></span></div></div></li></ul><h3 class="heading" style="text-align:start;"><b>Impact & Results</b></h3><p class="paragraph" style="text-align:start;">The benefits of Obsidian were immediately noticeable:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Uniform Design</b>: Features such as the sexual orientation selection screen, once fragmented in design, now showcased greater uniformity and accessibility.</p></li><li><p class="paragraph" style="text-align:left;"><b>Feedback from the Trenches</b>: Senior iOS engineer at Tinder, <a class="link" href="https://www.linkedin.com/in/siddharthanasokan/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Siddharthan Asokan</a>, was particularly impressed. He emphasized the reduced time spent in design deliberations and how Obsidian made design implementation remarkably straightforward.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MACHINE LEARNING</b></span><br><a class="link" href="https://medium.com/expedia-group-tech/increasing-travelers-engagement-through-relevant-price-alerts-at-expedia-group-75aa6a377864?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">How Expedia Uses Price Alerts to Increase Engagement</a></h2><div class="image"><a class="image__link" href="https://medium.com/expedia-group-tech/increasing-travelers-engagement-through-relevant-price-alerts-at-expedia-group-75aa6a377864?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ec5ab228-e479-486d-9cd5-40fbbf0aa216/stephenwsun_happy_travelers_who_got_great_deals_fd8c0502-86ff-45bc-b152-d46a70fd1096.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://henokyemam.medium.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>Oarinde Henok Yemam</i></a></p><p class="paragraph" style="text-align:left;">Expedia Group (EG) offers travelers optimal deals using technology like flight price alerts. These alerts notify users of price changes, allowing bookings at desired prices.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/084e71a4-a245-4a67-bec1-ed25312066fd/1_Z3-nN1taIqY-b5BrZsSIGQ.png"/><div class="image__source"><span class="image__source_text"><p>Expedia Price Alerts</p></span></div></div><p class="paragraph" style="text-align:left;">Expedia’s transition from business rule-driven alerts to machine learning (ML) has helped improve traveler engagement by delivering more precise notifications and avoiding over-communication.</p><p class="paragraph" style="text-align:left;"><b>Message Relevancy (MR) Model</b><br>Price alerts, originally based on rigid business rules, lacked flexibility. In contrast, the ML-driven approach tailors notifications for a more enhanced user experience.</p><p class="paragraph" style="text-align:start;">By analyzing data on subscriptions, flight routes, and user behavior, the system anticipates user engagement, emphasizing metrics like recall and alert open rates.</p><p class="paragraph" style="text-align:start;">Key aspects incorporated:</p><ul><li><p class="paragraph" style="text-align:left;"><i>Outcome Objective</i>: Ensure alerts meet traveler&#39;s financial goals while also optimizing business costs.</p></li><li><p class="paragraph" style="text-align:left;"><i>Data Usage</i>: Data about subscriptions, interactions, routes, and flight price changes are used to predict if a traveler will open a notification.</p></li><li><p class="paragraph" style="text-align:left;"><i>Success Metrics</i>: Focused on recall metric and business metrics like subscriber retention and notification open rates.</p></li><li><p class="paragraph" style="text-align:left;"><i>Techniques and Optimizations</i>: Used Random Forest Classifier for its simplicity and later introduced improvements like automated model tuning to increase efficiency.</p></li></ul><p class="paragraph" style="text-align:left;"><b>Model Architecture and Improvements</b><br>The model was built on the Random Forest Classifier and later expanded to include different types of &quot;opens&quot; as targets.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/65c69f43-0a3e-45b1-a7c6-23b0f391f8e2/1_tI6MYFjFXBBtr2iODfFGVA.png"/><div class="image__source"><span class="image__source_text"><p>General Random Forest Classifier Architecture</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><i>Enhancements</i>:</p><ul><li><p class="paragraph" style="text-align:left;">Automated Model Tuning (AMT) was used for better hyperparameter tuning, leading to a 20% improvement in the F1 score.</p></li><li><p class="paragraph" style="text-align:left;">Moved from <a class="link" href="https://scikit-learn.org/stable/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">scikit-learn&#39;s</a> RandomizedSearchCV to AMT for better optimization and efficient model training.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><i>Safeguard Rules</i>:</p><ul><li><p class="paragraph" style="text-align:left;">Implemented to ensure a wider subscriber base receives notifications, such as sending alerts to long-time subscribers or when price changes cross a certain threshold.</p></li></ul></li></ul><p class="paragraph" style="text-align:left;">The improved model provides timely notifications from the second day of a traveler&#39;s subscription.</p><p class="paragraph" style="text-align:left;"><b>Results</b><br>The introduction of the MR model brought notable improvements:</p><ul><li><p class="paragraph" style="text-align:left;">Increase in the opt-in rate for price alerts.</p></li><li><p class="paragraph" style="text-align:left;">More subscribers are receiving and opening notifications.</p></li><li><p class="paragraph" style="text-align:left;">Demonstrates the model&#39;s positive impact on the price alerts campaign, ensuring better engagement and satisfaction among travelers.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/best-time-to-buy-and-sell-stock-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Best Time to Buy and Sell Stock</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn how to solve this common interview question <a class="link" href="https://www.fullstackexpress.io/p/linked-list-cycle-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>REACT</b></span><br><a class="link" href="https://dev.to/ricardonunezio/millionjs-beyond-speed-making-react-apps-memory-efficient-2amn?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Making React Apps Memory Efficient | Million.js Beyond Speed</a></h2><div class="image"><a class="image__link" href="https://dev.to/ricardonunezio/millionjs-beyond-speed-making-react-apps-memory-efficient-2amn?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/65e28a99-c59f-4b75-89df-6f75f71d5dac/stephenwsun_Making_React_Apps_Memory_Efficient__Million.js_Beyo_00b0a6bd-8499-49df-bb13-40622673d983.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://dev.to/ricardonunezio?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>Ricardo Nunez</i></a></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><a class="link" href="https://million.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Million.js</a></span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> is a tool designed to optimize React applications, making them more memory-efficient.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">Traditional React apps use the virtual DOM to represent UI components, which can lead to large nested JavaScript objects that consume significant memory, especially in complex component trees.This becomes a challenge with continuous object diffing, garbage collection, and potential memory leaks.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">Million.js addresses these issues by compiling React components into optimized Higher Order Components, reducing the reliance on the virtual DOM, and leading to a reduction in memory usage by approximately 55% compared to standard React, offering performance closer to vanilla JavaScript.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><a class="link" href="https://www.digitalocean.com/community/tutorials/how-to-scale-node-js-applications-with-clustering?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">How To Scale Node.js Applications With Clustering</a></h2><div class="image"><a class="image__link" href="https://www.epicweb.dev/accessible-typesafe-progressively-enhanced-modern-web-forms?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b8f27fb1-272a-48cb-a2f2-dcde3963c3bd/stephenwsun_modern_web_forms_broken_down_66bed5be-62fa-49ae-837a-f40eb107a71e.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/stanulilic?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>Stanley Ulili</i></a></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">In Node.js, by default, applications run on a single CPU thread, which can lead to performance issues for CPU-intensive tasks.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">To address this, Node.js offers the cluster module, allowing for the creation of multiple application instances running concurrently on a machine. This module also features a built-in load balancer using the round-robin algorithm to distribute incoming requests among the instances.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">This tutorial teaches how to implement clustering in a Node.js app, enhance scalability with the pm2 module, and evaluate performance differences using load testing tools.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NEXT.JS</b></span><br><a class="link" href="https://vercel.com/blog/how-we-optimized-package-imports-in-next-js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">How We Optimized Package Imports in Next.js</a></h2><div class="image"><a class="image__link" href="https://vercel.com/blog/how-we-optimized-package-imports-in-next-js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5f93427f-7943-4ed7-bdc2-aa403967976f/stephenwsun_packages_moving_quickly_3f109ce1-4e20-4353-aa5d-337ad1e442d5.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/shuding_?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>Shu Ding</i></a></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">In the recent version of Next.js, significant optimizations were made to package imports, leading to quicker local development and improved production cold starts.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">The optimization specifically addresses the inefficiencies of barrel files in JavaScript, which are used for grouping and exporting multiple modules. Traditional methods, like tree-shaking, have limitations, so Next.js introduced the &quot;optimizePackageImports&quot; option to auto-analyze and map imports.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">This change has resulted in up to 70% faster development times, 28% faster production builds, and 40% quicker cold starts.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>PRODUCTIVITY</b></span><br><a class="link" href="https://theengineeringmanager.substack.com/p/manage-your-capacity-not-your-time?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Manage Your Capacity, Not Your Time</a></h2><div class="image"><a class="image__link" href="https://theengineeringmanager.substack.com/p/manage-your-capacity-not-your-time?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c9e1e8d9-e347-499b-ab6c-b5a609a322a9/stephenwsun_We_obsess_over_managing_our_time._However_we_should_11748c87-d268-4790-bd3d-cd6b80730578.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/jstanier?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><i>James Stanier</i></a></p><p class="paragraph" style="text-align:left;">Managing your capacity, which is influenced by energy levels, is more crucial than just managing time. Being mindful of tasks that drain or boost your energy can optimize productivity and prevent burnout. To enhance efficiency, periodically reflect on your work patterns and balance deep work with necessary breaks.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://openjsf.org/announcement/2023/10/17/node-js-21-available-now/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Node.js 21 is now available</a>. The release features an updated V8 engine, introduces stable WebStreams, offers a flag to switch module defaults, and enhances the test runner for functional tests.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://developer.chrome.com/blog/new-dev-trial-for-multiple-readers-and-writers/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">API improvements</a> for working with files in the browser.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/solidjs/solid/releases/tag/v1.8.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">SolidJS 1.8.0</a> - Enhanced streaming serialization, deep data de-duping, improved hydration, reduced template sizes, and improved global script management.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://www.electronjs.org/blog/electron-27-0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Electron 27.0.0</a> - Upgrades to Chromium 118.0.5993.32, Node 18.4.0, and V8 11.8.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://deno.com/blog/fresh-1.5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Fresh 1.5</a> - Partials, improved client-side navigation, UI enhancements.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://bun.sh/blog/bun-v1.0.6?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Bun 1.0.6</a> - Addresses regression impacting Docker usage with Bun and implements support for the <code>overrides</code> & <code>resolutions</code> fields in <code>package.json</code>.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/TanStack/query/releases/tag/v5.0.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">TanStack 5.0.0</a> - Simplified optimistic updates, sharable mutation state, suspense support, and more.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/parcel-bundler/parcel/releases/tag/v2.10.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Parcel 2.10</a> - Big performance improvements, an improved <code>--lazy</code> mode, reduced runtime bundle sizes, and web extension improvements.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Explore</b>: <a class="link" href="https://developer.tesla.com/docs/fleet-api?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian#overview" target="_blank" rel="noopener noreferrer nofollow">Tesla releases FleetAPI</a> is a RESTful data and command service providing access to Tesla vehicles and energy devices</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://leportella.com/growing-at-stripe/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Growing as an engineer at Stripe</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: <a class="link" href="https://engineering.atspotify.com/2023/10/managing-software-at-scale-googles-kelsey-hightower-talks-with-spotifys-niklas-gustavsson-about-fleet-management/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">How Spotify manages software at scale</a>. <a class="link" href="https://twitter.com/kelseyhightower?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Kelsey Hightower</a> talks with <a class="link" href="https://twitter.com/protocol7?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Niklas Gustavsson</a> about Fleet.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: <a class="link" href="https://softwareengineeringdaily.com/2023/10/11/the-future-of-http/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">The future of HTTP</a> with <a class="link" href="https://twitter.com/shadrin?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Nick Shadrin</a> and <a class="link" href="https://twitter.com/arutcode?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Roman Arutyunyan</a>, software architect and principal software engineer at Nginx.</p><p class="paragraph" style="text-align:left;">✅ <b>Network</b>: <a class="link" href="https://www.paypal-events.com/money2020?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">PayPal Developer meetup</a> at Money 20/20 in Las Vegas, October 23rd.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/tumblr/tumblr.js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Tumblr.js</a></b> - Official JavaScript client for the Tumblr API. Detailed docs <a class="link" href="https://tumblr.github.io/tumblr.js/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/Simonwep/selection?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow"><b>Viselect</b></a> - Lightweight library delivering high performance, offering a visual method for element selection similar to desktop interfaces.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/web-infra-dev/oxc?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">OXC</a></b> - A high-performance toolkit for JavaScript and TypeScript, written in Rust.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/arianrhodsandlot/nostalgist?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Nostalgist</a></b> - A JavaScript library used for running emulators of retro consoles inside browsers.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/cockpit-project/cockpit?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=the-creation-of-tinder-s-design-system-obsidian" target="_blank" rel="noopener noreferrer nofollow">Cockpit</a></b> - Web-based graphical interface for servers.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br><b>If ChatGPT Was A Person…</b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c2bc0eca-adbb-4f7c-891a-c614a2c06528/meme__1_.gif"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=21e0423d-7f43-4d45-ac13-29736f4cb7c5&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Gusto&#39;s 81x Performance Improvement in Payments Packaging</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/83080de8-5ca0-42c4-86f2-e63e05b2a204/stephenwsun_Gusto_adopted_a_map-reduce_framework_enabling_paral_10f30108-9ab6-4cc4-915d-6f5e2f5b329c.png" length="1106998" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/gusto-81x-performance-improvement-in-payments-packaging</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/gusto-81x-performance-improvement-in-payments-packaging</guid>
  <pubDate>Wed, 11 Oct 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-10-11T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;">If you’re lucky enough to be in London today, don’t miss out on <a class="link" href="https://inthecloud.withgoogle.com/google-cloud-next-london-23/register.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Google Cloud Next London</a>. This is a free, in-person event featuring the latest innovations in AI, Data, and Security with keynotes from Google, Google Cloud and Google DeepMind executives.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Architecture</b>: Learn how Gusto revamped their payment system, achieving an 81x speed improvement.</p></li><li><p class="paragraph" style="text-align:left;"><b>Infrastructure</b>: Learn how Slack rebuilt their cron execution system for scalability and efficiency.</p></li><li><p class="paragraph" style="text-align:left;"><b>JavaScript</b>: Speeding up the JavaScript ecosystem, the barrel file debacle.</p></li><li><p class="paragraph" style="text-align:left;"><b>React</b>: Building accessible and typesafe modern web forms.</p></li><li><p class="paragraph" style="text-align:left;"><b>Next.js/Remix</b>: An in-depth case study comparing Next.js 13 and Remix.</p></li><li><p class="paragraph" style="text-align:left;"><b>Developer Tools</b>: Why successful tools must align with developers&#39; practical needs rather than idealistic aspirations.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>ARCHITECTURE</b></span><br><a class="link" href="https://engineering.gusto.com/how-we-made-payments-packaging-81-times-faster/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Gusto’s 81x Performance Improvement in Payments Packaging</a></h2><div class="image"><a class="image__link" href="https://engineering.gusto.com/how-we-made-payments-packaging-81-times-faster/?utm_source=www.fullstackexpress.io&utm_medium=referral&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/83080de8-5ca0-42c4-86f2-e63e05b2a204/stephenwsun_Gusto_adopted_a_map-reduce_framework_enabling_paral_10f30108-9ab6-4cc4-915d-6f5e2f5b329c.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/peter-harris-742b6454/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Peter Harris</i></a><i>, </i><a class="link" href="https://www.linkedin.com/in/simulkadakia/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Simul Kadakia</i></a></p><p class="paragraph" style="text-align:left;">In 2022, Gusto&#39;s Payments Engineering team faced an impending challenge: a predicted spike in payment volumes by year&#39;s end threatened to overwhelm their existing payment packaging system.</p><p class="paragraph" style="text-align:left;"><b>How It Started</b><br>The original process, which bundled money movements into ACH files for bank transfers, had a few challenges:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Ran in 5-minute cycles, gathering a maximum of 5,000 entries each time.</p></li><li><p class="paragraph" style="text-align:left;">This single-threaded system presented multiple inefficiencies, such as often producing ACH files with minimal entries and mishandling cancellations.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/88bfe041-229f-456a-a650-878d300269b5/Untitled.png"/><div class="image__source"><span class="image__source_text"><p>How Gusto Originally Handled Payments</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Revamping For Efficiency</b><br>Addressing these challenges required a shift in architecture. Gusto adopted a <a class="link" href="https://en.wikipedia.org/wiki/MapReduce?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">map-reduce framework</a>, enabling parallel processing of ACH entries using tools like Sidekiq and Redis.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/033812b1-798d-4f27-a8ae-ef0a945fa7b0/Untitled__1_.png"/><div class="image__source"><span class="image__source_text"><p>Gusto’s New Architecture</p></span></div></div><p class="paragraph" style="text-align:start;">This architectural change significantly leaned on tools like <a class="link" href="https://sidekiq.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Sidekiq</a> and <a class="link" href="https://redis.io/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Redis</a> to manage parallel tasks without compromising data integrity.</p><p class="paragraph" style="text-align:start;">The team also introduced the ACH Engine, a solution which:</p><ul><li><p class="paragraph" style="text-align:start;">Enabled packaging closer to submission time.</p></li><li><p class="paragraph" style="text-align:start;">Optimized file sizes.</p></li><li><p class="paragraph" style="text-align:start;">Cut out redundant operations.</p></li></ul><p class="paragraph" style="text-align:start;"><b>Rethinking Redlock and Smarter Cancellations</b><br><a class="link" href="https://redis.com/glossary/redlock/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">The Redlock system</a>, initially implemented to prevent race conditions, became a notable bottleneck. However, by refining their interaction with Redis, the team markedly boosted efficiency.</p><p class="paragraph" style="text-align:start;">Furthermore, Gusto implemented a better cancellation solution that prioritized such requests, eliminating potential process conflicts. Through targeted optimizations, including eliminating redundant checks and refining datastore queries, Gusto significantly amplified their processing capability.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d4bd3e68-ecc7-407e-be99-a84b00128519/Screenshot_2023-07-13_at_5.55.27_PM.png"/><div class="image__source"><span class="image__source_text"><p>Gusto’s New ACH Entry Cancellation Process</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Results</b><br>After nearly a year of effort, Gusto&#39;s Payment Engineering team achieved remarkable improvements in performance:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Entry Count</b></p><ul><li><p class="paragraph" style="text-align:left;">Before: 149,418</p></li><li><p class="paragraph" style="text-align:left;">After: 692,920</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Processing Time</b></p><ul><li><p class="paragraph" style="text-align:left;">Before: 55 minutes</p></li><li><p class="paragraph" style="text-align:left;">After: 3 minutes 9 seconds</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Throughput</b></p><ul><li><p class="paragraph" style="text-align:left;">Before: 2,716 entries per minute</p></li><li><p class="paragraph" style="text-align:left;">After: 219,974 entries per minute</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Overall Improvement</b>:</p><ul><li><p class="paragraph" style="text-align:left;">81x faster</p></li></ul></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>INFRASTRUCTURE</b></span><br><a class="link" href="https://slack.engineering/executing-cron-scripts-reliably-at-scale/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Rebuilding Slack’s Cron Execution System for Scalability and Efficiency</a></h2><div class="image"><a class="image__link" href="https://slack.engineering/executing-cron-scripts-reliably-at-scale/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/07c36e3a-3ac0-40a6-b323-292eeb798083/stephenwsun_Rebuilding_Slacks_Cron_Execution_System_for_Scalabi_400744b0-e3f0-42d6-b514-b35463e53594.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/clairebadams/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Claire Adams</i></a></p><p class="paragraph" style="text-align:left;">Cron scripts are pivotal for Slack&#39;s operations such as reminders, email notifications, and database cleanups. As Slack grew, the number of scripts and the data they process expanded, leading to reliability concerns and scaling challenges.</p><p class="paragraph" style="text-align:left;">This led to the need for a new, scalable, and more reliable system for executing cron scripts.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/330199fd-9755-4321-9842-bbbf244b4481/SystemComponents.png"/><div class="image__source"><span class="image__source_text"><p>Slack’s New Cron Execution System</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Original System and Shortcomings</b><br>In its infancy, Slack&#39;s cron infrastructure was fairly straightforward. It comprised a single node that housed all the scripts and one crontab file that spelled out the schedules for each script.</p><p class="paragraph" style="text-align:left;">While this served its purpose initially, as the data and scripts grew, merely migrating to larger nodes became an untenable solution. The main problem lay in the fact that the entire system hinged on this one node, making any issues—be it provisioning, rotation, or configuration—a potential system-wide disruption.</p><p class="paragraph" style="text-align:left;"><b>New Cron Execution System</b><br>The new system consists of three core components:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Scheduled Job Conductor</b></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/26749fb2-40d7-48b4-be70-6fb6c4710bbb/ScheduledJobConductor.png"/><div class="image__source"><span class="image__source_text"><p>Scheduled Job Conductor</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><b>What</b>: A Golang service for mimicking cron functionality, leveraging a Golang cron library.</p></li><li><p class="paragraph" style="text-align:left;"><b>Why</b>: To preserve the original cron string format for easier migration.</p></li><li><p class="paragraph" style="text-align:left;"><b>How it Operates</b>:</p><ul><li><p class="paragraph" style="text-align:left;">Utilizes Bedrock (Slack’s Kubernetes wrapper) for scalability.</p></li><li><p class="paragraph" style="text-align:left;">One pod does the scheduling, while others wait to take over if needed to avoid downtime.</p></li></ul></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Slack&#39;s Job Queue</b></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d7bfe6b7-2b5a-4028-9a25-b2d45cf1fa2c/JobQueue.png"/><div class="image__source"><span class="image__source_text"><p>Slack’s Job Queue</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><b>What</b>: An asynchronous compute platform running around 9 billion jobs daily.</p></li><li><p class="paragraph" style="text-align:left;"><b>Composition</b>: Jobs flow through Kafka, then to Redis, and finally to a job worker for execution.</p></li><li><p class="paragraph" style="text-align:left;"><b>Advantage</b>: Offloads compute and memory needs to an existing robust system, reducing build and maintenance time.</p></li></ul></li><li><p class="paragraph" style="text-align:left;"><b>Vitess Database Table</b></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/08038bf9-c69b-4cf2-9d5f-d679b4f2e32d/VitessTableSchema__1_.png"/><div class="image__source"><span class="image__source_text"><p>Vitess Table</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><b>Purpose</b>: Deduplication, job tracking, and reporting.</p></li><li><p class="paragraph" style="text-align:left;"><b>Functionality</b>:</p><ul><li><p class="paragraph" style="text-align:left;">Ensures only one copy of a script runs at once.</p></li><li><p class="paragraph" style="text-align:left;">Tracks the job state in the system.</p></li><li><p class="paragraph" style="text-align:left;">Supports a user-interface for script execution information, aiding in error detection and state verification.</p></li></ul></li></ul></li></ol><p class="paragraph" style="text-align:left;">By utilizing existing solutions, the effort for both development and future maintenance is reduced. This approach ensures longevity while optimizing resource allocation.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/linked-list-cycle-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Linked List Cycle</a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn the algorithm used to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/linked-list-cycle-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT</b></span><br><a class="link" href="https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-7/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Speeding Up the JavaScript Ecosystem - The Barrel File Debacle</a></h2><div class="image"><a class="image__link" href="https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-7/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/16f3d275-658d-43df-9770-4b11c4ca7e3e/stephenwsun_speeding_up_the_javascript_ecosystem_to_make_it_fas_a8344c43-5bfb-4acb-9081-f7c7d0b98c22.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/marvinhagemeist?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Marvin Hagemeister</i></a></p><p class="paragraph" style="text-align:left;">Numerous projects are cluttered with files that simply re-export other files. These &quot;barrel files&quot; significantly contribute to the sluggish performance of JavaScript tools in larger projects. Marvin analyzes the effects of barrel files on performance.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>REACT</b></span><br><a class="link" href="https://www.epicweb.dev/accessible-typesafe-progressively-enhanced-modern-web-forms?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Accessible, Typesafe, Progressively Enhanced Modern Web Forms</a></h2><div class="image"><a class="image__link" href="https://www.epicweb.dev/accessible-typesafe-progressively-enhanced-modern-web-forms?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b8f27fb1-272a-48cb-a2f2-dcde3963c3bd/stephenwsun_modern_web_forms_broken_down_66bed5be-62fa-49ae-837a-f40eb107a71e.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/kentcdodds?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Kent C. Dodds</i></a></p><p class="paragraph" style="text-align:left;">Building web forms is a complex task often requiring developers to override browser defaults. Modern frameworks like Remix simplify form handling by emulating default browser behaviors while adding enhancements. Tools like Zod and Conform aid in creating typesafe and accessible forms with schema-based validation and seamless integration between forms and underlying data structures.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NEXT.JS, REMIX</b></span><br><a class="link" href="https://prateeksurana.me/blog/nextjs-13-vs-remix-an-in-depth-case-study/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Next.js 13 vs Remix: An In-depth Case Study</a></h2><div class="image"><a class="image__link" href="https://prateeksurana.me/blog/nextjs-13-vs-remix-an-in-depth-case-study/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/64d69e41-5eb7-41e4-8453-18763ddd7a76/stephenwsun_a_case_study_comparing_two_web_frameworks_58dfd7e6-7113-4c42-953b-b2269d9b0dba.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/psuranas?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Prateek Surana</i></a></p><p class="paragraph" style="text-align:left;">Next.js and Remix are both popular frameworks for building React web applications. Prateek Surana provides a comparative analysis of their new routing and data-fetching techniques, using a Twitter clone project as an example. While Remix uses loaders for efficient parallel data fetching, Next.js 13 leverages React Server Components for more direct and streamlined data integration within React components.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DEVELOPER TOOLS</b></span><br><a class="link" href="https://blog.postman.com/why-arent-there-more-programming-languages-startups/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Why Aren’t There More Programming Languages Startups?</a></h2><div class="image"><a class="image__link" href="https://blog.postman.com/why-arent-there-more-programming-languages-startups/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/375e7054-b997-4b7c-b7b6-97d420916613/stephenwsun_the_perfect_programming_language_e837f864-5fea-4719-9a2a-351b42ceebb7.png"/></a><div class="image__source"><span class="image__source_text"><p>Created with Midjourney</p></span></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://twitter.com/jeanqasaur?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><i>Jean Yang</i></a></p><p class="paragraph" style="text-align:left;">Jean Yang, former professor and founder of Akita Software, examines why cutting-edge programming languages and tools from academia don&#39;t often translate to mainstream adoption in the tech industry. She argues that developers prioritize tools that enhance their workflows and address immediate needs rather than those offering perfect guarantees. For &quot;deep tech&quot; tools to gain traction, they must align more with developers&#39; current workflows, be interoperable, and focus on incremental improvements that mesh with existing technologies.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://v8.dev/blog/control-flow-integrity?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Security efforts</a> to implement control-flow integrity (CFI) in V8 by preventing memory-corrupted exploits from executing arbitrary code.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://japa.dev/docs/introduction?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Japa</a> offers a streamlined testing framework for Node.js without the transpilation overhead associated with Jest.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://www.nodeconf.eu/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">NodeConf EU</a> is set for November 6-8, 2023 in Ireland.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://github.blog/changelog/2023-10-05-github-actions-node_options-is-now-restricted-from-github_env/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">GitHub Actions</a> has restricted the use of <code>GITHUB_ENV</code> for setting the <code>NODE_OPTIONS</code> variable in workflows.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://bun.sh/blog/bun-v1.0.4?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Bun 1.0.4</a> - Virtual modules support, <code>server.requestIP</code>, memory consumption reduction in <code>Bun.serve()</code>, and bug fixes.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-3-beta/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">TypeScript 5.3 Beta</a> - Import attributes, enhanced narrowing, and various optimizations.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/reduxjs/redux-toolkit/releases/tag/v1.9.7?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Redux Toolkit 1.9.7</a> - Enhancements to RTKQ hook TypeScript types for notably better performance.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/pnpm/pnpm/releases/tag/v8.9.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">pnpm 8.9.0</a> - Performance improvements for macOS and Windows Dev Drives</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Interesting</b>: <a class="link" href="https://bugzilla.mozilla.org/show_bug.cgi?id=148624&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Firefox</a> fixes a 22 year old bug.</p><p class="paragraph" style="text-align:left;">✅ <b>Join:</b> <a class="link" href="https://resources.github.com/learn/certifications/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">GitHub is launching a certification program</a> in 2024 to validate developers&#39; skills and expertise, with an early exam opportunity at GitHub Universe on November 8-9. If you can’t make it, <a class="link" href="https://examregistration.github.com/waitlist/certifications?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">join the waitlist</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> <a class="link" href="https://engineercodex.substack.com/p/how-pinterest-scaled-to-11-million?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Pinterest&#39;s rapid growth</a>, highlighting the platform&#39;s ability to accommodate 11 million users while being supported by a lean team of just six engineers.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: <a class="link" href="https://viteconf.org/23/replay?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Replay ViteConf 2023</a>, including 44 talks about the Vite ecosystem.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: <a class="link" href="https://open.spotify.com/episode/0juNLF3vnjqg7rYk42Kjvi?si=x6krAReESLOi_Qo9VJJwSQ&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">OWL is the world’s fastest JavaScript framework</a>, inspired by Vue and React, designed specifically for Odoo&#39;s unique modular requirements and built with modern features like asynchronous rendering and a virtual DOM.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/bikeshaving/crank?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><b>Crank.js</b></a> - A web framework that allows components to be defined using sync, async, and generator functions.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://www.gitify.io/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Gitify</a></b> - GitHub notifications on your menu bar.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://github.com/kysely-org/kysely?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow"><b>Kysely</b></a> - Type-safe and autocompletion-friendly typescript SQL query builder. Inspired by <a class="link" href="https://knexjs.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">knex</a>.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/voidcosmos/npkill?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Npkill</a></b> - Easily find and remove old and heavy node_modules folders.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/elbywan/wretch?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Wretch</a></b> - Small wrapper around <a class="link" href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">fetch</a> that simplifies network requests and responses.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/dolanmiu/docx?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=gusto-s-81x-performance-improvement-in-payments-packaging" target="_blank" rel="noopener noreferrer nofollow">Docx</a></b> - Easily generate and modify .docx files with JS/TS. Works for Node and on the Browser.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br><b>Friday Deployments Be Like…</b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/561f7e6a-5e4a-4031-bfdd-ddfdb4c50e2e/meme__1___1_.gif"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=0229a8c5-f33a-4b1f-bff1-3f9e4cdbd093&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Netflix&#39;s Smooth Launch of Basic with Ads</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d9179175-a98b-4302-bcf3-00eb40dc5d8d/stephenwsun_Netflix_introduced_a_new_tier_called_Basic_with_ads_f1299e5e-bd3d-4f4f-b687-f1f1d32545b4.png" length="1152295" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/netflix-smooth-launch-of-basic-with-ads</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/netflix-smooth-launch-of-basic-with-ads</guid>
  <pubDate>Wed, 04 Oct 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-10-04T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#F4F2ED;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3965824b-ee0d-4da7-8953-177c60f54c3a/Full_Stack_Express_Logo__2_.png"/></div><p class="paragraph" style="text-align:left;">🌙 <b>Hello world </b>☀️ </p><p class="paragraph" style="text-align:left;">Two years ago today, Meta (formerly Facebook) had its <a class="link" href="https://engineering.fb.com/2021/10/05/networking-traffic/outage-details/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">infamous worldwide outage</a> that lasted <a class="link" href="https://en.wikipedia.org/wiki/2021_Facebook_outage?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">7 hours and 11 minutes</a>, affecting every one of its platforms. <a class="link" href="https://blog.cloudflare.com/october-2021-facebook-outage/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">As we reflect on that day</a>, it serves as a reminder of the importance of continuous learning and improvement. After all, it&#39;s our dedication to the craft, that truly puts us on the map.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Testing</b>: Netflix simulates expected traffic to identify scalability issues and validate their Ads algorithms.</p></li><li><p class="paragraph" style="text-align:left;"><b>Security</b>: PayPal implements graph database to combat fraud.</p></li><li><p class="paragraph" style="text-align:left;"><b>TypeScript</b>: The saga of the Closure Compiler, and why TypeScript won.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: Connect, a universal Socket API for JavaScript runtimes.</p></li><li><p class="paragraph" style="text-align:left;"><b>Career Advice</b>: How to influence and think like a Staff Engineer.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>TESTING</b></span><br><a class="link" href="https://netflixtechblog.com/ensuring-the-successful-launch-of-ads-on-netflix-f99490fdf1ba?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">How </a><a class="link" href="https://netflixtechblog.com/ensuring-the-successful-launch-of-ads-on-netflix-f99490fdf1ba?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Netflix Ensured a Smooth Launch for its Ad-Integrated Tier</a></h2><div class="image"><a class="image__link" href="https://netflixtechblog.com/ensuring-the-successful-launch-of-ads-on-netflix-f99490fdf1ba?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3bcc4f10-28d3-4d0b-b119-b82b94f160ac/stephenwsun_Netflix_introduced_a_new_tier_called_Basic_with_ads_f1299e5e-bd3d-4f4f-b687-f1f1d32545b4.png"/></a></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://netflixtechblog.com/ensuring-the-successful-launch-of-ads-on-netflix-f99490fdf1ba?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><i>Jose Fernandez, Ed Barker, Hank Jacobs</i></a></p><p class="paragraph" style="text-align:left;">In November 2022, Netflix introduced a new tier called &quot;Basic with ads&quot;. This tier added new backend components and a remote call to their ads partner during playback.</p><p class="paragraph" style="text-align:left;">To ensure a smooth launch, Netflix simulated the expected traffic weeks in advance, using a traffic migration framework. This simulation helped identify scalability issues and validate their Ads algorithms.</p><p class="paragraph" style="text-align:left;"><b>Realistic Test Traffic</b><br>Netflix&#39;s traffic generally follows a predictable pattern, with occasional spikes due to new content releases or regional AWS data center shifts. To test their new ad system, Netflix decided to replay real traffic, making it appear as if it was &quot;Basic with ads&quot; traffic. This approach allowed for realistic testing of the new systems and algorithms.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/74fd5a57-b425-45f8-a48a-fda1b68b99d9/1_eB4G_rdWa8w4-k9jTUHldQ.png"/><div class="image__source"><span class="image__source_text"><p>Netflix’s Traffic Patterns</p></span></div></div><p class="paragraph" style="text-align:start;"><b>The Setup</b><br>Netflix aimed to ensure that the simulation did not impact actual customers. They used real member viewing habits for the simulation, but no ads were shown to these members.</p><p class="paragraph" style="text-align:start;">The data science team projected the subscriber count for the new tier a month post-launch. This data was used to simulate a subscriber population. Traffic matching this simulated population was stored in a Mantis stream. </p><p class="paragraph" style="text-align:start;">This stream was then replayed in a separate production environment designed for this purpose. The responses from this environment, which included ad metadata, were stored in a Keystone stream. This data was then used to simulate device playback and ad impression tracking.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7792336c-64e9-42c3-a1de-5dca12e28983/1_WSR0HigxkANIu6uyIA-lkQ.png"/><div class="image__source"><span class="image__source_text"><p>Netflix’s Traffic Replay Setup</p></span></div></div><p class="paragraph" style="text-align:start;"><b>The Rollout</b><br>Netflix started by replaying a small percentage of traffic, gradually increasing it while monitoring metrics. They reached 100% replay and ran it continuously.</p><p class="paragraph" style="text-align:start;">They also tested their system&#39;s response to traffic spikes caused by regional AWS evacuations. During this period, they set up and tested their ad monitoring and alerting system. They also conducted chaos experiments to test their systems under failure scenarios, ensuring resilience.</p><p class="paragraph" style="text-align:start;"><b>Key Takeaways</b></p><ul><li><p class="paragraph" style="text-align:left;">Simulating real traffic provides confidence in new systems and algorithms.</p></li><li><p class="paragraph" style="text-align:left;">Large-scale testing with representative traffic can reveal unexpected issues.</p></li><li><p class="paragraph" style="text-align:left;">Replay traffic can be used for more than just load testing, offering potential for new product and feature development at Netflix.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>SECURITY</b></span><br><a class="link" href="https://medium.com/paypal-tech/graph-usage-in-combating-ato-fraud-risk-6dafbe5cc3e5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">PayPal’s Usage of Graphs in Combating Fraud Risk</a></h2><div class="image"><a class="image__link" href="https://medium.com/paypal-tech/graph-usage-in-combating-ato-fraud-risk-6dafbe5cc3e5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/55f47173-b9c4-472d-89c2-1dac256f3b88/stephenwsun_graph_data_structure_visualized_with_10_people_and__162f588b-7f31-4cfb-9851-c287b5e72a91.png"/></a></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://medium.com/paypal-tech/graph-usage-in-combating-ato-fraud-risk-6dafbe5cc3e5?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><i>Xinyu Zhang</i></a></p><p class="paragraph" style="text-align:left;">Account takeover (ATO) poses a significant fraud risk in online payments. To address this, PayPal has implemented a real-time graph database, which uses edges and vertices to represent relationships between objects.</p><p class="paragraph" style="text-align:left;"><b>Asset Sharing</b><br>Assets such as IP addresses, physical addresses, and device IDs are connected to PayPal accounts. By representing these connections in a graph structure, it becomes evident how assets are shared among different accounts.</p><p class="paragraph" style="text-align:left;">Typically, regular accounts maintain consistent asset usage over time. However, accounts that have been taken over by fraudsters often exhibit frequent and abrupt changes in their associated assets.</p><p class="paragraph" style="text-align:left;">By analyzing the Asset-Account Graph, PayPal can detect unusual asset-sharing patterns and identify potentially fraudulent accounts.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ae76f46d-4665-471e-ac62-7902c4dcf6b5/1_cpaFWCNNWOb-tQRsjMIq1A.png"/><div class="image__source"><span class="image__source_text"><p>Asset to Account Graph Highlighting Abnormal Linking Behaviors</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Transaction Patterns</b><br>Users often engage in multiple transactions in a short time frame. While traditional relational databases struggle to efficiently represent complex transaction patterns, graph databases excel in this area.</p><p class="paragraph" style="text-align:left;">For instance, a pattern named &quot;ABABA&quot; indicates two accounts sending money back and forth in quick succession.</p><p class="paragraph" style="text-align:left;">Such patterns, which are prevalent in ATO incidents, can be swiftly detected using graph databases, thereby preventing potential fraudulent activities.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bf3c7060-ef83-49fe-b64d-4eb77bc3e9a7/1_JYwmo6DqzpBLx9Dhs_ntJQ.png"/><div class="image__source"><span class="image__source_text"><p>Example of Transaction Patterns</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Graph Features</b><br>Graph features involve calculating specific metrics based on the graph&#39;s topology. One notable feature is the &quot;connected community&quot;, which describes interconnected subgraphs within the primary graph.</p><p class="paragraph" style="text-align:left;">These features are invaluable for identifying groups of closely connected accounts and their transaction behaviors, which can be instrumental in detecting anomalies.</p><p class="paragraph" style="text-align:left;">By examining these graph features, PayPal can identify key nodes in the graph, offering insights that can help prevent large-scale fraudulent activities.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/337eb0a1-b2bc-443a-9c04-5309be1c927f/1_OGBRqb-a8jJTSGXZAc030Q.png"/><div class="image__source"><span class="image__source_text"><p>Account-Transaction Graph</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Key Takeaways</b></p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Graph databases</b> are essential tools in combating ATO fraud, offering a more efficient way to represent and analyze complex relationships.</p></li><li><p class="paragraph" style="text-align:left;"><b>Asset sharing patterns</b> in the graph can highlight abnormal behaviors, signaling potential account takeovers.</p></li><li><p class="paragraph" style="text-align:left;"><b>Transaction patterns</b>, like the &quot;ABABA&quot; pattern, can be more easily detected and analyzed using graph databases compared to traditional relational databases.</p></li><li><p class="paragraph" style="text-align:left;"><b>Graph features</b>, such as the &quot;connected community&quot;, provide a deeper understanding of transaction behaviors and can be crucial in anomaly detection.</p></li></ol></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DATA STRUCTURES & ALGORITHMS</b></span><br><a class="link" href="https://www.fullstackexpress.io/p/valid-parenthesis-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><b>Valid Parenthesis</b></a></h2><p class="paragraph" style="text-align:left;"><b>Missed the solutions to this week’s coding workout?</b></p><p class="paragraph" style="text-align:left;">Learn how to use the stack data structure to solve this problem <a class="link" href="https://www.fullstackexpress.io/p/valid-parenthesis-problem?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">here</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>TYPESCRIPT</b></span><br><a class="link" href="https://effectivetypescript.com/2023/09/27/closure-compiler/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">The Saga of the Closure Compiler, and Why TypeScript Won</a></h2><div class="image"><a class="image__link" href="https://effectivetypescript.com/2023/09/27/closure-compiler/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/82ea6ab9-a32c-4d31-a0aa-e5ca46a4e2b6/stephenwsun_Googles_Closure_Compiler_and_the_Rise_of_TypeScript_14ee3a68-e4cb-480b-90a8-8864616b9a24.png"/></a></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://effectivetypescript.com/2023/09/27/closure-compiler/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><i>Dan Vanderkam</i></a></p><p class="paragraph" style="text-align:left;">The article discusses the saga of <b>Google&#39;s Closure Compiler</b> and how <b>TypeScript</b> eventually became more dominant in the JavaScript ecosystem. The Closure Compiler focused on optimal JavaScript minification, but faced challenges adapting to the modern JavaScript landscape. On the other hand, TypeScript prioritized developer experience, type safety, and adaptability, leading to its widespread adoption among software engineers. <a class="link" href="https://effectivetypescript.com/2023/09/27/closure-compiler/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Dive into this chapter of JavaScript history</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>REACT</b></span><br><a class="link" href="https://semaphoreci.com/blog/useeffectevent?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Introduction to the New React UseEffectEvent Hook</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/useeffectevent?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e978d411-dc5b-4c11-ab6c-86899ef2ef28/stephenwsun_The_useEffectEvent_is_an_experimental_React_hook_th_641314e0-e4fc-4962-920a-f26a2b36f93f.png"/></a></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://semaphoreci.com/blog/useeffectevent?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><i>Gabriel Chinedu, Tomas Fernandez</i></a></p><p class="paragraph" style="text-align:left;">The <b>useEffectEvent</b> is an experimental React hook that streamlines the process of adding and removing event listeners in React components. This hook offers developers a cleaner and more efficient way to handle events in functional components. <a class="link" href="https://semaphoreci.com/blog/useeffectevent?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">See it in action</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><a class="link" href="https://semaphoreci.com/blog/securing-nodejs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Best Practices for Securing Node.js Applications in Production</a></h2><div class="image"><a class="image__link" href="https://semaphoreci.com/blog/securing-nodejs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dd791e0a-d58d-4fe0-bb26-457c2fd46df0/stephenwsun_Best_Practices_for_Securing_Node.js_Applications_in_ddc1cfec-748a-4f9b-af5a-e611f2fe51d3.png"/></a></div><p class="paragraph" style="text-align:left;"><i><a class="link" href="https://semaphoreci.com/blog/securing-nodejs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Antonello Zanini, Tomas Fernandez</a></i></p><p class="paragraph" style="text-align:left;">Node.js is a widely-used backend technology that&#39;s increasingly targeted by online attacks. This guide highlights <b>15 best practices</b>, including not running Node.js with root privileges, regularly updating NPM libraries, and adopting an HTTPS-only policy. Implementing these measures ensures robust security for your Node.js applications in production. <a class="link" href="https://semaphoreci.com/blog/securing-nodejs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Integrate these techniques and tips.</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>CAREER ADVICE</b></span><br><a class="link" href="https://careercutler.substack.com/p/influence-lessons-from-a-staff-engineer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Lessons from a Staff Engineer and Ex-Twitter Tech Lead</a></h2><div class="image"><a class="image__link" href="https://careercutler.substack.com/p/influence-lessons-from-a-staff-engineer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" rel="noopener" target="_blank"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8db5ea5c-5f00-4948-9c72-dd840dd5a657/stephenwsun_How_to_influence_and_think_like_a_Staff_Software_En_bcd23a92-d0b1-4a58-ab9d-704a87ddf403.png"/></a></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://careercutler.substack.com/p/influence-lessons-from-a-staff-engineer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><i>Jordan Cutler, Ron DeVera</i></a></p><p class="paragraph" style="text-align:left;">This article features insights from Ron DeVera, a seasoned Staff Engineer and former Twitter Tech Lead, on influence, managing relationships, and differences between staff and senior engineers. Key takeaways include understanding situations from others&#39; perspectives, avoiding pushing suggestions too forcefully, using the <b>Situation-Behavior-Impact framework</b> for feedback, and recognizing the workload of managers when discussing topics. <a class="link" href="https://careercutler.substack.com/p/influence-lessons-from-a-staff-engineer?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Learn how to think like a staff engineer</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT ECOSYSTEM</b></span><br><b>JS Weekly Pulse</b></h2><ul><li><p class="paragraph" style="text-align:left;">📢 NPM now supports <a class="link" href="https://github.blog/changelog/2023-09-26-npm-provenance-general-availability/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">publishing packages with provenance</a> from GitHub Actions and GitLab CI/CD, linking them verifiably to their public source repositories.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://blog.cloudflare.com/socket-api-works-javascript-runtimes-wintercg-polyfill-connect/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">A new socket API</a> that works across JavaScript runtimes is in the works.</p></li><li><p class="paragraph" style="text-align:left;">📢 Updates from the <a class="link" href="https://dev.to/hemanth/updates-from-the-98th-tc39-meeting-1lcf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">98th TC39 meeting</a> include Resizable ArrayBuffers, ShadowReam, and RegExp escaping.</p></li><li><p class="paragraph" style="text-align:left;">📢 <a class="link" href="https://nextjs.org/conf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Next.js Conf 2023</a> is set for October 26 at 10am Pacific.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://astro.build/blog/astro-320/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Astro 3.2</a> - Enhanced view transitions and more seamless integrations.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://nodejs.org/en/blog/release/v20.8.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Node.js 20.8.0</a> - Performance improvements to streams.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://babeljs.io/blog/2023/09/25/7.23.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Babel 7.23.0</a> - Decorator metadata and new import features.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">ESLint 9.0.0</a> - Breaking changes for rule authors.</p></li><li><p class="paragraph" style="text-align:left;">🚀 <a class="link" href="https://github.com/pnpm/pnpm/releases/tag/v8.8.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">pnpm 8.8.0</a> - New options for pnpm commands, improvements to error handling and node-linker.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>RECOMMENDATIONS</b></span><br><b>To-Do List</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Explore:</b> <a class="link" href="https://innovationgraph.github.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">GitHub’s Innovation Graph</a> compares metrics by economy as well as specific categories such as Git pushes, repositories, and programming languages.</p><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> Understand the <a class="link" href="https://snyk.io/de/blog/signing-container-images/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">significance of securing container images</a>, and how key tools like Sigstore Cosign, Notary v2, and Docker Content Trust are integrated.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: <a class="link" href="https://www.youtube.com/watch?v=oejXFgvAwTA&list=PLEx5khR4g7PJELLTYwXZHcimWAwTUaWGA&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">Discover key principles for scaling distributed systems</a>, drawing from Amazon and eBay’s architecture, and explore the importance of simplicity, communication methods, and consistent feedback.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: Andrew Hoying from Google discusses the <a class="link" href="https://cloudsecuritypodcast.libsyn.com/website/ep140-system-hardening-at-google-scale-new-challenges-new-solutions?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">evolution of system hardening</a>, challenges at Google&#39;s scale, the balance between security and productivity, adapting to regulations, and how lessons learned have influenced product improvements.</p><p class="paragraph" style="text-align:left;">✅ <b>Try it out</b>: <a class="link" href="https://electric-sql.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">ElectricSQL</a> offers a reactive real-time sync layer for Postgres, enabling instant local-first data synchronization seamlessly within your existing Postgres-driven apps.</p><p class="paragraph" style="text-align:left;"> ✅ <b>Register: </b><a class="link" href="https://www.p99conf.io/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">P99 CONF</a> is a premier tech conference featuring talks from engineers at leading companies like Netflix, Google, and TikTok, covering high-performance applications, distributed systems, and many more.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks in the Dev Community</b></h2><p class="paragraph" style="text-align:left;"><a class="link" href="http://github.com/hulkholden/n64js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><b>N64js</b></a><b>: </b>An n64 emulator written in (mostly) pure ES6 JavaScript. It runs many ROMs at full frame rate.</p><p class="paragraph" style="text-align:left;"><a class="link" href="http://github.com/dropzone/dropzone?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><b>Dropzone</b></a>: An easy to use drag & drop JavaScript library. It supports image previews and shows nice progress bars.</p><p class="paragraph" style="text-align:left;"><a class="link" href="http://github.com/kudoai/chatgpt.js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><b>Chatgpt.js</b></a>: A powerful, open source client-side JavaScript library for ChatGPT.</p><p class="paragraph" style="text-align:left;"><a class="link" href="http://github.com/xtermjs/xterm.js?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow"><b>Xterm.js</b></a>: A terminal for the web.</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://github.com/langchain-ai/langchainjs?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=netflix-s-smooth-launch-of-basic-with-ads" target="_blank" rel="noopener noreferrer nofollow">LangChain.js</a></b>: A framework for building apps with language models. Written in TypeScript.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEME</b></span><br><b>First Day on the Job</b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/49f8542d-d8f6-40b7-844e-7a47d3ac70f9/TH.png"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=f88477b2-5176-4170-8f2c-1cf3a07447a8&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Canva Saves $3.6 Million Annually in S3 Costs</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bdf5f4d5-7a46-4168-b074-318133eaf5d3/stephenwsun_an_online_design_tool_that_had_migrate_billions_of__87dfe229-42ec-4ac6-8876-6b49684afcf5.png" length="1004169" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-canva-saves-millions-annually-in-s3-costs</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-canva-saves-millions-annually-in-s3-costs</guid>
  <pubDate>Wed, 27 Sep 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-09-27T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2535b361-3748-439b-a4c2-65d4a8d44bab/full_stack_express.jpg"/></div><p class="paragraph" style="text-align:left;"><b>Hello world.</b></p><p class="paragraph" style="text-align:left;">In the ever-evolving world of software, where Bun vs Node.js debates seem to be the new coffee-break chatter, there&#39;s a fresh update that might just overshadow our favorite arguments.</p><p class="paragraph" style="text-align:left;">ChatGPT, once confined to the realm of text, has now expanded its horizons to <a class="link" href="https://openai.com/blog/chatgpt-can-now-see-hear-and-speak?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">see, hear, and speak</a>. As we navigate these rapid advancements, let&#39;s ensure we&#39;re not just debating, but also adapting.</p><p class="paragraph" style="text-align:left;"><b>In this week’s email</b>:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Architecture</b>: Expedia introduces the Juggler model to optimize hotel rankings.</p></li><li><p class="paragraph" style="text-align:left;"><b>Infrastructure</b>: Canva saves $3.6M annually by optimizing AWS S3 storage.</p></li><li><p class="paragraph" style="text-align:left;"><b>Node.js</b>: v20 showcases enhanced performance, as analyzed by Rafael Gonzaga.</p></li><li><p class="paragraph" style="text-align:left;"><b>React</b>: Josh Comeau explores the nuances of React&#39;s Server Components as React celebrates its 10th anniversary.</p></li><li><p class="paragraph" style="text-align:left;"><b>JavaScript</b>: Dan Abramov discusses the evolving complexities of the JavaScript ecosystem.</p></li><li><p class="paragraph" style="text-align:left;"><b>Development Practices</b>: Emphasizing the importance of addressing technical debt for software efficiency.</p></li></ul><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:#5089df;font-size:0.8rem;"><b>ARCHITECTURE</b></span><br><a class="link" href="https://medium.com/expedia-group-tech/the-juggler-model-balancing-expectations-in-lodging-rankings-6d09b9b8e341?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><b>Expedia’s Solution to Optimizing Lodging Rankings</b></a></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d070f5b7-6ffc-4564-850a-8ce33d97c1f6/stephenwsun_a_realistic_hotel_booking_system_that_calculates_th_159b24a7-ca98-48f2-8d41-937915e731d9.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://medium.com/expedia-group-tech/the-juggler-model-balancing-expectations-in-lodging-rankings-6d09b9b8e341?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Tiago Cunha</i></a></p><p class="paragraph" style="text-align:left;">Expedia has developed a system called the Juggler model, an algorithm designed to optimize the balance between travelers, hotel properties, and their platform&#39;s objectives.</p><p class="paragraph" style="text-align:start;"><b>How Expedia Ranks Hotels</b><br>When a user initiates a hotel search on Expedia, properties are ranked based on a set of algorithms.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/55487458-d0fc-4a91-ae08-676f469e0491/1_FP1equR8iuboeS2x8RHWpQ.png"/><div class="image__source"><span class="image__source_text"><p>Expedia’s Lodging Ranking Search</p></span></div></div><p class="paragraph" style="text-align:start;">This system not only considers raw data but also user interactions, such as clicks and bookings, which are then fed back into the system for continuous learning.</p><p class="paragraph" style="text-align:start;"><b>System Architecture and Stakeholders</b><br>The platform&#39;s architecture is designed to cater to three primary entities:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Hotel properties, which are keen on maximizing their visibility.</p></li><li><p class="paragraph" style="text-align:left;">Travelers, who demand optimal choices based on their preferences and budget.</p></li><li><p class="paragraph" style="text-align:left;">Expedia&#39;s platform, which aims to maximize revenue while ensuring user retention.</p></li></ol><p class="paragraph" style="text-align:start;"><b>Algorithmic Ranking</b><br>Rather than relying solely on direct relevance (like matching a user&#39;s desired location or price range), the Juggler model integrates multiple factors to determine the ranking.</p><p class="paragraph" style="text-align:start;">This is achieved through a composite scoring system that combines direct relevance with other business-driven adjustments.</p><p class="paragraph" style="text-align:start;">The weights for these adjustments are determined dynamically, ensuring a balance between immediate user satisfaction and long-term platform health.</p><p class="paragraph" style="text-align:start;"><b>The Juggler Model&#39;s Core</b><br>At its heart, the Juggler model is a meta-learning system.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4ad98a0d-38bb-4cb9-8eb6-a65ba72a7f8d/1_NcVAMruk_aONyGPcLjRGww.png"/><div class="image__source"><span class="image__source_text"><p>Expedia’s Juggler Framework</p></span></div></div><p class="paragraph" style="text-align:start;">It analyzes patterns from historical searches to predict optimal weight parameterizations for future queries.</p><p class="paragraph" style="text-align:start;">This is similar to recommendation systems but tailored for the complexities of hotel bookings.</p><p class="paragraph" style="text-align:start;"><b>Future Tech Stack Enhancements</b><br>The success of the Juggler model has spurred further R&D. Expedia is exploring:</p><ul><li><p class="paragraph" style="text-align:left;">Enhanced personalization techniques, potentially integrating neural networks for deeper user profiling.</p></li><li><p class="paragraph" style="text-align:left;">Advanced deep learning architectures to refine the search context extraction.</p></li><li><p class="paragraph" style="text-align:left;">Reinforcement learning to allow the system to adapt in real-time based on user interactions.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#5089df;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><b>P.S. If you’re enjoying the content of this newsletter, please share it with your network:</b> <a class="link" href="https://www.fullstackexpress.io/subscribe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">https://www.fullstackexpress.io/subscribe</a></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>INFRASTRUCTURE</b></span><br><a class="link" href="https://www.canva.dev/blog/engineering/optimising-s3-savings/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><b>How Canva Saves $3.6 Million Annually in S3 Costs</b></a></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bdf5f4d5-7a46-4168-b074-318133eaf5d3/stephenwsun_an_online_design_tool_that_had_migrate_billions_of__87dfe229-42ec-4ac6-8876-6b49684afcf5.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.canva.dev/blog/engineering/optimising-s3-savings/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Josh Smith</i></a></p><p class="paragraph" style="text-align:left;">Canva, a globally recognized online design platform, relies heavily on AWS for its production workloads.</p><ul><li><p class="paragraph" style="text-align:left;">Services used: Amazon S3, ECS, RDS, DynamoDB.</p></li><li><p class="paragraph" style="text-align:left;">User growth: Scaled to over 100 million monthly active users since 2013.</p></li><li><p class="paragraph" style="text-align:left;">Challenge: Efficiently storing a vast library and user-generated content.</p></li></ul><p class="paragraph" style="text-align:start;"><b>Amazon S3: The Backbone</b><br>Amazon S3 offers a robust, cost-effective storage solution. Canva&#39;s data footprint on S3 is immense, with over 230 Petabytes of data.</p><p class="paragraph" style="text-align:start;">The challenge?</p><p class="paragraph" style="text-align:start;">Understanding the various S3 storage classes and optimizing them for cost and performance.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/942ac1a7-ca4e-466e-9ead-eb88af649340/fig1-s3-storage-classes.8b58e7bf.png"/><div class="image__source"><span class="image__source_text"><p>Amazon S3 Storage Classes</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Storage Classes and Canva&#39;s Usage</b><br>For frequently accessed content like Canva&#39;s template libraries, the S3 Standard storage class is ideal.</p><p class="paragraph" style="text-align:start;">However, user-generated content, which is often accessed briefly and then seldom revisited, was stored in the S3 Standard-Infrequent Access (S3 Standard-IA) class.</p><p class="paragraph" style="text-align:start;">This class is cost-effective but still offers quick retrieval times. For specific cases like logs and backups, Canva uses S3 Glacier Flexible Retrieval.</p><p class="paragraph" style="text-align:start;">The introduction of S3 Glacier Instant Retrieval in 2021, which combines low-cost storage with millisecond retrieval times, prompted Canva to reevaluate its storage strategy.</p><p class="paragraph" style="text-align:start;"><b>Deep Dive into Data Patterns</b><br>To optimize storage costs, Canva needed a granular understanding of its data access patterns.</p><ul><li><p class="paragraph" style="text-align:left;">Canva&#39;s primary content: Templates, stock photos, graphics.</p></li><li><p class="paragraph" style="text-align:left;">User activity: Majority access content shortly after creation.</p></li><li><p class="paragraph" style="text-align:left;">Previous strategy: Transition data from S3 Standard to S3 Standard-IA after 30 days.</p></li><li><p class="paragraph" style="text-align:left;">New tool: S3 Storage Class Analysis for better data understanding.</p></li><li><p class="paragraph" style="text-align:left;">Observation: Retrieval rate drops significantly after the first 15 days.</p></li></ul><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fd15d4ae-b397-4adb-8aaa-420d24e169ce/fig2-standard-access-patterns.9969085e.png"/><div class="image__source"><span class="image__source_text"><p>Canva’s S3 Access Patterns Over Time</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Cost Analysis and Transitioning</b><br>Transitioning between S3 storage classes incurs costs based on the number of requests.</p><p class="paragraph" style="text-align:start;">With over 300 billion objects in Canva&#39;s inventory, a blind transition would be costly.</p><p class="paragraph" style="text-align:start;">However, the potential savings from using S3 Glacier Instant Retrieval, given its lower storage cost, are recurring.</p><p class="paragraph" style="text-align:start;">By analyzing the average object size in each bucket, Canva could calculate the breakeven point for transitioning data and prioritize buckets for migration.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b5bc720c-6b5d-46e1-a21b-59c91f5ed55b/fig6-small-object-breakeven.ad5088a8.png"/><div class="image__source"><span class="image__source_text"><p>Canva’s S3 Breakeven Comparison</p></span></div></div><p class="paragraph" style="text-align:start;"><b>Results and Takeaways</b><br>Not only was Canva’s migration successful, the results are clear:</p><ul><li><p class="paragraph" style="text-align:left;">Migration simplicity: Applied a lifecycle policy to buckets.</p></li><li><p class="paragraph" style="text-align:left;">Speed: Migrated nearly 80 billion objects in about two days.</p></li><li><p class="paragraph" style="text-align:left;">Current data: 130 petabytes of Canva’s 230 petabytes in S3 now in S3 Glacier Instant Retrieval.</p></li><li><p class="paragraph" style="text-align:left;">Cost savings: Approximately $300,000 per month ($3.6 million annually).</p></li><li><p class="paragraph" style="text-align:left;">ROI: Positive return seen just a few months after the transition.</p></li><li><p class="paragraph" style="text-align:left;">Initial cost: Over $1.6 million to transition roughly 80 billion objects.</p></li><li><p class="paragraph" style="text-align:left;">AWS partnership: Continuous support and tailored storage solutions.</p></li><li><p class="paragraph" style="text-align:left;">Key lesson: Understand data access patterns before making transitions.</p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>NODE.JS</b></span><br><b><a class="link" href="https://blog.rafaelgss.dev/state-of-nodejs-performance-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">The State of Node.js Performance in 2023</a></b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4f4659dc-8dcd-48a1-992a-18c3cb77c3f1/stephenwsun_different_charts_and_graphs_34f869d2-1d24-4a59-a5ff-551137661ed6.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://blog.rafaelgss.dev/state-of-nodejs-performance-2023?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Rafael Gonzaga</i></a></p><p class="paragraph" style="text-align:left;">Rafael Gonzaga&#39;s analysis of Node.js v20 reveals significant performance enhancements compared to earlier versions, using three distinct benchmark suites. Strategic initiatives, such as the &#39;Performance&#39; and &#39;Startup Snapshot&#39;, alongside impactful pull requests, are driving these improvements. Despite some regressions, the Node.js performance team&#39;s ongoing efforts suggest a bright future for the platform&#39;s efficiency.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>REACT</b></span><br><a class="link" href="https://www.joshwcomeau.com/react/server-components/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><b>Making Sense of React Server Components</b></a></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2178cf83-7394-422a-b0d3-085cef974def/stephenwsun_react_server_components_1e83a4eb-86d7-40b9-9f19-c9fd2e017069.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.joshwcomeau.com/react/server-components/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Josh Comeau</i></a></p><p class="paragraph" style="text-align:left;">Josh Comeau highlights React&#39;s 10th anniversary and its latest innovation, React Server Components, which allows components to run exclusively on the server. Amidst the online confusion about this new feature, Comeau dives deep into its workings, emphasizing its potential and aiming to clarify its benefits and integration with Server Side Rendering (SSR). For context, he provides a primer on SSR, explaining how it offers users a fully-formed HTML document, improving initial load times, and how client-side React then enhances this with interactivity.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>JAVASCRIPT</b></span><br><b><a class="link" href="https://increment.com/development/the-melting-pot-of-javascript/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">The Melting Pot of JavaScript</a></b></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f500625b-a293-4cd0-ad2f-6e5c37edae98/stephenwsun_every_software_tool_and_programming_language_being__beb30727-1174-4766-919c-17a5c35dc7c5.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://increment.com/development/the-melting-pot-of-javascript/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Dan Abramov</i></a></p><p class="paragraph" style="text-align:left;">In this article by Dan Abramov, he discusses the complexities and evolution of the JavaScript ecosystem. Abramov highlights the inventive and ubiquitous nature of JavaScript, emphasizing its reflection of human culture. He advocates for making JavaScript tools more user-friendly, emphasizing the importance of sensible defaults, minimal configuration, and clear output to ensure a more approachable experience for newcomers. An older article, but very much still relevant today.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>DEVELOPMENT PRACTICES</b></span><br><a class="link" href="https://medium.com/booking-com-development/measuring-technical-debt-to-avoid-the-boiling-frog-syndrome-c44eb48b3ce1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><b>Measuring Technical Debt to Avoid Boiling Frog Syndrome</b></a></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/99664d1d-a6f7-4c06-859e-b035e42ad2c2/stephenwsun_a_software_engineer_trying_to_explain_technical_deb_a6e64430-7183-4e6f-b9ec-a300440a27c1.png"/></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://medium.com/booking-com-development/measuring-technical-debt-to-avoid-the-boiling-frog-syndrome-c44eb48b3ce1?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow"><i>Egor Savochkin</i></a></p><p class="paragraph" style="text-align:left;">Technical debt represents the gap between the current and ideal state of software, impacting the ease of future modifications. It can accumulate from quick solutions, intentional decisions, or changing requirements. Addressing this debt early, through visibility and proactive management, is crucial to maintain software agility and efficiency.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>AROUND THE WEB</b></span><br><b>What Else is Trending</b></h2><p class="paragraph" style="text-align:left;">✅ <b>Learn:</b> Sir Tim Berners-Lee launched the first website in 1991 at CERN on a NeXT computer. While there are now over 1.8 billion websites, the original can still be visited at it’s <a class="link" href="https://info.cern.ch/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">original address</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Watch</b>: Dive into <a class="link" href="https://www.youtube.com/watch?v=U6s2pdxebSo&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">TypeScript&#39;s captivating documentary</a>, exploring its origins, purpose, and insights from its creators and Microsoft insiders.</p><p class="paragraph" style="text-align:left;">✅ <b>Listen</b>: Explore solutions for solving glitchy animations in the <a class="link" href="https://pod.link/thecsspodcast?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">latest episode of The CSS Podcast</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Contribute</b>: Contributing to open source is a rewarding way to collaborate and innovate. If you&#39;re wondering where to start, <a class="link" href="https://firstissue.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">look no further</a>.</p><p class="paragraph" style="text-align:left;">✅ <b>Join</b>: Project IDX is Google&#39;s new cloud-based initiative to streamline full-stack, multiplatform app development through a familiar yet innovative web-based workspace. <a class="link" href="https://idx.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank" rel="noopener noreferrer nofollow">Join the waitlist</a>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>COMMUNITY SPOTLIGHT</b></span><br><b>Hot Picks: Cool Tools in the Dev Community</b></h2><div class="embed"><a class="embed__url" href="https://github.com/serialport/node-serialport?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank"><div class="embed__content"><p class="embed__title"> Node SerialPort </p><p class="embed__description"> This GitHub repository provides a cross-platform JavaScript library for interfacing with serial ports </p><p class="embed__link"> github.com/serialport/node-serialport </p></div><img class="embed__image embed__image--right" src="https://repository-images.githubusercontent.com/893522/f5b0b200-9a80-11e9-91ad-d0f2cfbc8b69"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/ealush/vest?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank"><div class="embed__content"><p class="embed__title"> Vest </p><p class="embed__description"> Vest is a framework-agnostic validation library for web forms, using a syntax inspired by testing tools like Mocha and Jest. </p><p class="embed__link"> github.com/ealush/vest </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/73b866deed8cf8bd832740991fc4e4a90e9a3a4d76be9793fd9379b3801bd0aa/ealush/vest"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/returntocorp/semgrep?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank"><div class="embed__content"><p class="embed__title"> Semgrep </p><p class="embed__description"> Semgrep is an open-source static analysis tool that detects bugs, vulnerabilities, and enforces code standards without uploading your code. </p><p class="embed__link"> github.com/returntocorp/semgrep </p></div><img class="embed__image embed__image--right" src="https://repository-images.githubusercontent.com/227803815/985903d0-3816-4105-85ed-306264593419"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/visgl/loaders.gl?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank"><div class="embed__content"><p class="embed__title"> Loaders.gl </p><p class="embed__description"> Loaders.gl is a framework-independent tool within the vis.gl suite, offering loaders tailored for geospatial, 3D, and big data visualizations. </p><p class="embed__link"> https://github.com/visgl/loaders.gl </p></div><img class="embed__image embed__image--right" src="https://repository-images.githubusercontent.com/147873967/f35ad600-6b6b-11e9-98d0-34a960f7ae17"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/NaturalIntelligence/fast-xml-parser?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs" target="_blank"><div class="embed__content"><p class="embed__title"> Fast XML Parser </p><p class="embed__description"> Validate and convert between XML and JS objects directly in JavaScript without relying on C/C++ libraries or callbacks. </p><p class="embed__link"> github.com/NaturalIntelligence/fast-xml-parser </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/a86731fc8809419c8994e09df7dda2ed5c53f3f84b7111d6cd85c5abccc3f44f/NaturalIntelligence/fast-xml-parser"/></a></div><p class="paragraph" style="text-align:left;"><i><b>Want to showcase something that you’re working on? </b></i><i><b><a class="link" href="mailto:stephen@fullstackexpress.io" target="_blank" rel="noopener noreferrer nofollow">Let us know!</a></b></i></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>SOCIAL MEDIA</b></span><br><b>Hall of Fame or Wall of Shame?</b></h2><p class="paragraph" style="text-align:left;">The MGM Grand is on a quest for a Red Hat Linux System Admin superhero, ready to forsake sunlight and weekends, all to resurrect the almighty slot machines from their digital slumber. Who needs a social life when you can rebuild IT infrastructure?</p><blockquote align="center" class="twitter-tweet"><a href="https://twitter.com/LasVegasLocally/status/1704986596439941601?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-canva-saves-3-6-million-annually-in-s3-costs"><p> Twitter tweet </p></a></blockquote><p class="paragraph" style="text-align:center;"><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><i><b>Over to you: What would you do?</b></i></span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:left;"><span style="color:rgb(80, 137, 223);font-size:0.8rem;"><b>MEMES</b></span><br><b>Battle of the Runtimes</b></h2><p class="paragraph" style="text-align:left;"><b>What men are thinking about</b>: <i>Roman Empire</i><br><b>What JavaScript developers are thinking about</b>: <i>Bun</i></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/855abe58-f162-489f-af33-6e91ef9a7fcc/Node.png"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=cd895e2a-ccc9-45ea-af72-b7e9604c6813&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How Instacart Scaled Through the Pandemic</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b63a4cac-95d1-45b0-9fca-63abc8e2ec5a/stephenwsun_groceries_as_tech_7f7df35d-8834-4492-b9eb-c6fa6e8667a1.png" length="1768383" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/how-instacart-scaled-through-the-pandemic</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/how-instacart-scaled-through-the-pandemic</guid>
  <pubDate>Wed, 20 Sep 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-09-20T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2535b361-3748-439b-a4c2-65d4a8d44bab/full_stack_express.jpg"/></div><p class="paragraph" style="text-align:left;"><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">Good morning! Welcome back to this week&#39;s edition of Full Stack Express, your go-to newsletter for web development, software architecture, and system design.</span></p><h3 class="heading" style="text-align:left;"><b>Headlines</b></h3><ul><li><p class="paragraph" style="text-align:left;">Microsoft&#39;s AI Team Exposes <a class="link" href="https://www.pcmag.com/news/microsoft-ai-employee-accidentally-leaks-38tb-of-data?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">38TB of Private Data</a> on GitHub</p></li><li><p class="paragraph" style="text-align:left;">Google Unveils <a class="link" href="https://bard.google.com/updates?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">Major Bard Update</a>: Now with Extensions for Maps, YouTube, Flights, and Hotels</p></li><li><p class="paragraph" style="text-align:left;">Vercel Releases <a class="link" href="https://v0.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">v0.dev</a><a class="link" href="http://v0.dev?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">:</a> A Natural Language-Powered Web UI Generator for React</p></li><li><p class="paragraph" style="text-align:left;">Remix Rolls Out <a class="link" href="https://remix.run/blog/remix-v2?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">Version 2</a> of Its Full Stack Web Framework</p></li><li><p class="paragraph" style="text-align:left;">Introducing <a class="link" href="https://nuejs.org/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">Nue</a>: The Newest, Fastest Thing in Frontend Development</p></li></ul><h3 class="heading" style="text-align:left;"><b>Featured Deep Dives</b></h3><ul><li><p class="paragraph" style="text-align:left;">How Instacart Scaled Through the Pandemic Managing 80,000+ Retail Locations and Predicting Real-Time Item Availability</p></li><li><p class="paragraph" style="text-align:left;">Figma’s Performance Testing Journey from a Single Macbook to a Dual-System Infrastructure</p></li></ul><h3 class="heading" style="text-align:left;"><b>Quick Bytes</b></h3><ul><li><p class="paragraph" style="text-align:left;">How Instagram Scaled to 14 Million Users with Just 3 Engineers</p></li><li><p class="paragraph" style="text-align:left;">Understanding Backpressure in Software Systems</p></li><li><p class="paragraph" style="text-align:left;">Bard’s latest AI Updates and Improvements</p></li><li><p class="paragraph" style="text-align:left;">Runtime Comparison Between Node, Deno, and Bun</p></li><li><p class="paragraph" style="text-align:left;">AWS&#39;s IPv4 Estate Now Worth $4.5 Billion</p></li></ul><h3 class="heading" style="text-align:left;"><b>Community Spotlight</b></h3><p class="paragraph" style="text-align:left;">Kiesel, Theatre.js, nanoGPT, and More</p><h3 class="heading" style="text-align:left;"><b>Tip of the Week</b></h3><p class="paragraph" style="text-align:left;">Boost Your React App&#39;s Performance with Lazy Loading and Suspense</p><h3 class="heading" style="text-align:left;"><b>Meme of the Week</b></h3><p class="paragraph" style="text-align:left;">JavaScript Frameworks: The Never-Ending Story</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>HOW INSTACART SCALED THROUGH THE PANDEMIC MANAGING 80k+ RETAIL LOCATIONS</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5781bd00-e3a9-44ab-bb0d-242481e3946a/1_OM9ntMtB-Q9qf7CHMq_vcA.png"/></div><h3 class="heading" style="text-align:left;"><b>The Challenge</b></h3><p class="paragraph" style="text-align:start;">Instacart, an online grocery delivery service, faced a complex challenge in predicting real-time item availability across 80,000+ retail locations, especially during the pandemic.</p><p class="paragraph" style="text-align:start;">The company needed to ensure that its machine learning (ML) models could scale to predict the availability of millions of items while maintaining low latency and high consistency.</p><h3 class="heading" style="text-align:left;"><b>The Turning Point</b></h3><p class="paragraph" style="text-align:start;">The pandemic led to a surge in customer demand and fluctuating in-store inventories.</p><p class="paragraph" style="text-align:start;">Instacart needed to evolve its Real-Time Availability (RTA) infrastructure to keep pace with these changes and maintain customer trust.</p><h3 class="heading" style="text-align:left;"><b>Objectives and Requirements</b></h3><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Low Latency</b>: Fast and bulk fetching of availability scores at the retrieval stage.</p></li><li><p class="paragraph" style="text-align:left;"><b>High Consistency</b>: Consistent availability information across all user interfaces.</p></li><li><p class="paragraph" style="text-align:left;"><b>Scalability</b>: Ability to handle predictions for hundreds of millions of items.</p></li><li><p class="paragraph" style="text-align:left;"><b>Experimentation</b>: A framework to test multiple ML models efficiently.</p></li></ol><h3 class="heading" style="text-align:left;"><b>The Solution</b></h3><p class="paragraph" style="text-align:start;">Instacart implemented two methods for ingesting ML-generated scores into their database (DB) storage:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Full Sync</b>: ML Availability Scoring Service updates a Snowflake table multiple times a day. DB ingestion workers read this table and update the availability scores.</p></li><li><p class="paragraph" style="text-align:left;"><b>Lazy Score Refresh</b>: Scores are updated on-demand when an item appears in search results and exceeds the allowable age.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6f6cc18d-1892-4554-b4d2-f488d3c3684f/0_1OhzWDlPviOVr4p9.png"/><div class="image__source"><span class="image__source_text"><p>Full Sync and Lazy Score Refresh Architecture</p></span></div></div><p class="paragraph" style="text-align:start;">To foster faster experimentation, Instacart developed a <b>Multi-Model Experimentation Framework</b> with three key components:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>DB Column per Model</b>: Each model&#39;s score is stored in a dedicated DB column.</p></li><li><p class="paragraph" style="text-align:left;"><b>Model-Column Mapping</b>: A service-level configuration system maps the model version to its corresponding unique column.</p></li><li><p class="paragraph" style="text-align:left;"><b>Experiment-Column Mapping</b>: A/B experiments are easily conducted with a unique feature flag associated with each column.</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7bf89a0e-7322-4fd6-88ec-2c239ad16833/0_33jW5lSnzhyu7-_q.png"/><div class="image__source"><span class="image__source_text"><p>Multi-Model Experimentation Framework</p></span></div></div><p class="paragraph" style="text-align:start;">To manage the complexity of different thresholds for various segments, Instacart introduced the <b>Deltas Framework</b>, which allows for the application of fixed deltas to base thresholds, computed at runtime.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/76d54d50-7bbc-4021-b5e7-8df46bc3605c/0_rBz0yHDkwCC2JF9j.png"/><div class="image__source"><span class="image__source_text"><p>Deltas Framework</p></span></div></div><h3 class="heading" style="text-align:left;"><b>Real-world Impact</b></h3><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Scalability</b>: The lazy score refresh reduced the ingestion load by 2/3rds.</p></li><li><p class="paragraph" style="text-align:left;"><b>Experimentation</b>: A 6X increase in experiments run using the new framework.</p></li><li><p class="paragraph" style="text-align:left;"><b>Customer Trust</b>: Improved &quot;good found rate,&quot; crucial for customer retention.</p></li></ol><h3 class="heading" style="text-align:left;"><b>Key Takeaways</b></h3><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Scalability vs. Consistency</b>: Balancing these two can be challenging but is crucial for maintaining customer trust.</p></li><li><p class="paragraph" style="text-align:left;"><b>Data Ingestion Strategies</b>: Combining full sync and lazy refresh can optimize both latency and consistency.</p></li><li><p class="paragraph" style="text-align:left;"><b>Modular Experimentation</b>: A well-designed experimentation framework can significantly reduce engineering work and speed up ML testing.</p></li><li><p class="paragraph" style="text-align:left;"><b>Threshold Management</b>: Dynamic thresholding can be a powerful tool for handling complex, multi-segment optimization problems.</p></li></ol><p class="paragraph" style="text-align:start;">Instacart&#39;s innovative approach to RTA infrastructure demonstrates how engineering, machine learning, and product design can come together to solve complex, real-world challenges at scale.</p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;"><a class="link" href="https://tech.instacart.com/instacarts-item-availability-architecture-solving-for-scale-and-consistency-f5661acb20a6?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">Source</a></span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>FIGMA’S PERFORMANCE TESTING JOURNEY FROM A SINGLE MACBOOK TO A DUAL-SYSTEM INFRASTRUCTURE</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d2b44bfd-210e-4d41-af03-4cd4abf73380/4cad57473a76fdc6d0254d48e1c992a1079943f1-4032x3024.png"/></div><h3 class="heading" style="text-align:left;"><b>The Challenge</b></h3><p class="paragraph" style="text-align:start;">In 2018, Figma&#39;s entire in-house performance testing system ran on a single MacBook, looping through a series of key test scenarios.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2804423c-d823-4ad4-aa8c-8d79a53f51e4/1755c4da8ed0ba3889059625647a30ac2c5c5658-1608x904.png"/><div class="image__source"><span class="image__source_text"><p>Stress Test with 5,000 Comment Pins</p></span></div></div><p class="paragraph" style="text-align:start;">Fast forward to 2023, and the landscape has changed dramatically. Figma&#39;s codebase has grown in complexity, with new features, products, and a team distributed globally.</p><p class="paragraph" style="text-align:start;">The single MacBook approach was no longer sustainable, especially with the team expanding to over 400 engineers and managers.</p><h3 class="heading" style="text-align:left;"><b>The Turning Point</b></h3><p class="paragraph" style="text-align:start;">The MacBook that had been running tests overheated in October 2020.</p><p class="paragraph" style="text-align:start;">Attempts to replicate the tests on another laptop failed, signaling the need for a more scalable, sophisticated approach to performance testing.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/504579f2-d49a-4def-b023-b3c6d6b73b78/004a5da1938be4f29d572a5d186529e0c820d4ae-1608x904.png"/><div class="image__source"><span class="image__source_text"><p>Early Stress Tests Created in FigJam</p></span></div></div><h3 class="heading" style="text-align:left;"><b>Objectives and Requirements</b></h3><p class="paragraph" style="text-align:start;">Figma aimed to build a system that could:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Test every proposed code change in the main monorepo.</p></li><li><p class="paragraph" style="text-align:left;">Complete performance guardrail checks in under 10 minutes.</p></li><li><p class="paragraph" style="text-align:left;">Provide detailed performance metrics and comparisons.</p></li></ol><h3 class="heading" style="text-align:left;"><b>The Solution</b></h3><p class="paragraph" style="text-align:start;">Figma deployed two systems connected by the same Continuous Integration (CI) system:</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Cloud-based System</b>: Runs in GPU-enabled virtual machines (VMs) for every pull request. Due to the noise levels in VMs, a 20% pass margin was set to catch only the most significant regressions.</p></li><li><p class="paragraph" style="text-align:left;"><b>Hardware System</b>: Runs on an array of test laptops, including older machines, allowing for custom test scenarios and more precise performance metrics.</p></li></ol><p class="paragraph" style="text-align:start;">Both systems shared features like detailed HTML reports and CPU profiles for each run.</p><h3 class="heading" style="text-align:left;"><b>Real-world Impact</b></h3><p class="paragraph" style="text-align:start;">The new system went live in October 2022 and has been instrumental in identifying performance bottlenecks and regressions early in the development cycle.</p><p class="paragraph" style="text-align:start;">It has also empowered engineers to collaborate on performance-sensitive code across teams and time zones.</p><h3 class="heading" style="text-align:left;"><b>Key Takeaways</b></h3><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Start Lean, Plan for Scale</b>: While starting with a minimal setup is good, always have a plan for scaling your testing infrastructure.</p></li><li><p class="paragraph" style="text-align:left;"><b>Proactive vs. Reactive</b>: Shifting from a reactive to a proactive approach in performance testing can save time and improve product quality.</p></li><li><p class="paragraph" style="text-align:left;"><b>Parallelization and CI</b>: Utilizing parallel runs in CI can significantly speed up the testing process.</p></li><li><p class="paragraph" style="text-align:left;"><b>Hardware Matters</b>: For graphics-heavy applications, real hardware testing can provide insights that VMs cannot.</p></li><li><p class="paragraph" style="text-align:left;"><b>Continuous Monitoring</b>: Automated tests and detailed reporting can catch regressions before they impact users, maintaining development velocity.</p></li></ol><p class="paragraph" style="text-align:start;">By embracing a scalable, dual-system approach, Figma has set itself up for sustainable growth, ensuring that performance doesn&#39;t become a bottleneck as the product evolves.</p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;"><a class="link" href="https://www.figma.com/blog/keeping-figma-fast/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank" rel="noopener noreferrer nofollow">Source</a></span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>BYTE-SIZED TOPICS</b></span></h2><div class="embed"><a class="embed__url" href="https://engineercodex.substack.com/p/how-instagram-scaled-to-14-million?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> How Instagram scaled to 14 million users with only 3 engineers </p><p class="embed__description"> Instagram&#39;s guiding principles and tech stack explained simply </p><p class="embed__link"> engineercodex.substack.com/p/how-instagram-scaled-to-14-million </p></div><img class="embed__image embed__image--right" src="https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd120103b-698b-45a8-872a-a453a004efbf_768x432.png"/></a></div><div class="embed"><a class="embed__url" href="https://medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> Backpressure explained — the flow of data through software </p><p class="embed__description"> Backpressure is something nearly every software engineer will have to deal with at some point, and for some it’s a frequent problem. But… </p><p class="embed__link"> medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7 </p></div><img class="embed__image embed__image--right" src="https://miro.medium.com/v2/da:true/resize:fit:1200/1*ZQWlVVyCANAmgUKJU9xUlw.gif"/></a></div><div class="embed"><a class="embed__url" href="https://bard.google.com/updates?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> ‎Bard&#39;s Latest AI Capability Updates & Improvements - Bard </p><p class="embed__description"> Explore the latest Google Bard updates which include improvements in generative AI capabilities, expanded access, and more. </p><p class="embed__link"> bard.google.com/updates </p></div><img class="embed__image embed__image--right" src="https://www.gstatic.com/lamda/images/bard_thumbnail.png"/></a></div><div class="embed"><a class="embed__url" href="https://snyk.io/blog/javascript-runtime-compare-node-deno-bun/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> Node.js vs. Deno vs. Bun: JavaScript runtime comparison | Snyk </p><p class="embed__description"> Node.js, Bun, and Deno... oh my! In this post, we compare these three popular JavaScript runtimes so you can determine which is the right one for your project. </p><p class="embed__link"> snyk.io/blog/javascript-runtime-compare-node-deno-bun </p></div><img class="embed__image embed__image--right" src="https://res.cloudinary.com/snyk/image/upload/v1693940833/feature-node-deno-bun.jpg"/></a></div><div class="embed"><a class="embed__url" href="https://toonk.io/aws-ipv4-estate-now-worth-4-5-billion/index.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> AWS IPv4 Estate Now Worth $4.5 Billion </p><p class="embed__description"> AWS grew its IPv4 estate with an additional 27 million IP addresses to now owning 128 Million IPv4 addresses. At a value of $35 per IPv4 address, the total value of AWS’ IPv4 estate is ~4.5 Billion dollars. An increase of $2 billion </p><p class="embed__link"> toonk.io/aws-ipv4-estate-now-worth-4-5-billion/index.html </p></div><img class="embed__image embed__image--right" src="https://images.unsplash.com/photo-1613297595539-0d36a37702c6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fEJyaXRpc2glMjBDb2x1bWJpYXxlbnwwfHx8fDE2OTQ5ODYzNzJ8MA&ixlib=rb-4.0.3&q=80&w=2000"/></a></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>INTERESTING PRODUCTS, TOOLS & PACKAGES</b></span></h2><div class="embed"><a class="embed__url" href="https://orbstack.dev/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> OrbStack · Fast, light, simple Docker & Linux on macOS </p><p class="embed__description"> Say goodbye to slow, clunky containers and VMs. The fast, light, and easy way to run containers and Linux. Develop at lightspeed with our Docker Desktop alternative. </p><p class="embed__link"> orbstack.dev </p></div><img class="embed__image embed__image--right" src="https://orbstack.dev/img/icon-square256.png"/></a></div><div class="embed"><a class="embed__url" href="https://codeberg.org/kiesel-js/kiesel?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> kiesel </p><p class="embed__description"> ⚡ A JavaScript engine written in Zig </p><p class="embed__link"> codeberg.org/kiesel-js/kiesel </p></div><img class="embed__image embed__image--right" src="https://codeberg.org/avatars/f6e4bc25755834429e06496348f0b19e6633cdb3c07a2fbfcd36dd265576fed2"/></a></div><div class="embed"><a class="embed__url" href="https://www.theatrejs.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> Theatre.js - animation toolbox for the web </p><p class="embed__description"> Theatre.js is an animation editor with a visual interface. </p><p class="embed__link"> www.theatrejs.com </p></div><img class="embed__image embed__image--right" src="https://www.theatrejs.com/images/op.jpg"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/karpathy/nanoGPT?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - karpathy/nanoGPT </p><p class="embed__description"> The simplest, fastest repository for training/finetuning medium-sized GPTs. </p><p class="embed__link"> github.com/karpathy/nanoGPT </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/550755e7fededb1e15a36ef8c1343aae74c1662f5d483f9c4565628d2e4d36a2/karpathy/nanoGPT"/></a></div><div class="embed"><a class="embed__url" href="https://www.jetbrains.com/rust/download?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=how-instacart-scaled-through-the-pandemic" target="_blank"><div class="embed__content"><p class="embed__title"> Download RustRover - JetBrains Rust IDE </p><p class="embed__description"> Download the latest version of RustRover for Windows, macOS or Linux. </p><p class="embed__link"> www.jetbrains.com/rust/download </p></div><img class="embed__image embed__image--right" src="https://resources.jetbrains.com/storage/products/rustrover/img/meta/preview.png"/></a></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>TIP OF THE WEEK</b></span></h1><p class="paragraph" style="text-align:left;"><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">React’s </span><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><i><b>React.lazy()</b></i></span><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> and </span><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><i><b>Suspense</b></i></span><span style="font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> allow you to perform code splitting, which can significantly improve the performance of your app by reducing the initial bundle size.</span></p><div class="codeblock"><pre><code>import React, &#123; Suspense, lazy &#125; from &#39;react&#39;;

const HeavyComponent = lazy(() =&gt; import(&#39;./HeavyComponent&#39;));

function App() &#123;
  return (
    &lt;div&gt;
      &lt;main&gt;
        &lt;Suspense fallback=&#123;&lt;div&gt;Loading...&lt;/div&gt;&#125;&gt;
          &lt;HeavyComponent /&gt;
        &lt;/Suspense&gt;
      &lt;/main&gt;
    &lt;/div&gt;
  );
&#125;

export default App;</code></pre></div><p class="paragraph" style="text-align:left;">In this example, <i><b>HeavyComponent</b></i> will only be loaded when it&#39;s about to be rendered, reducing the initial load time for your application.</p><p class="paragraph" style="text-align:left;">The <i><b>fallback</b></i> prop in <i><b>Suspense</b></i> allows you to display a loading indicator or some other placeholder while the component is being loaded.</p><p class="paragraph" style="text-align:start;">This approach is especially useful for components that are not immediately visible, like modals or tabs that the user might never click, or for splitting routes in a single-page application.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>MEME OF THE WEEK</b></span></h1><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cda914dd-0690-45b4-8360-e1837363a54d/JavaScript-Developer-Memes.jpeg"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=4fc6d66e-6589-45e8-8e9b-592f4e42ee33&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>DoorDash&#39;s Holiday Forecasting Strategy</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/981ae4c0-b9ee-459b-9b1e-94bec5979435/stephenwsun_thousands_of_doordash_delivery_drivers_delivering_f_15586a49-96fe-4a1c-8f53-039e2ba595ce.png" length="1849396" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/doordash-holiday-forecasting-strategy</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/doordash-holiday-forecasting-strategy</guid>
  <pubDate>Wed, 13 Sep 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-09-13T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2535b361-3748-439b-a4c2-65d4a8d44bab/full_stack_express.jpg"/></div><h3 class="heading" style="text-align:center;"><b>Together with Quick Byte</b></h3><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">Good morning and welcome back to another edition of Full Stack Express, your weekly newsletter on web development, software architecture, and system design.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">Here’s the notable announcements for the week:</span></p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://bun.sh/blog/bun-v1.0?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Bun 1.0</a> released on September 8, the all-in-one JS/TS toolkit.</p></li><li><p class="paragraph" style="text-align:left;">React Aria components is now in <a class="link" href="https://react-spectrum.adobe.com/releases/2023-09-07.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Beta</a>.</p></li><li><p class="paragraph" style="text-align:left;">OpenAI’s first <a class="link" href="https://openai.com/blog/announcing-openai-devday?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">developer conference</a> in San Francisco.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Turbo 8</a> is dropping TypeScript.</p></li><li><p class="paragraph" style="text-align:left;">Visual Studio Code adds <a class="link" href="https://www.infoworld.com/article/3706511/visual-studio-code-adds-port-forwarding.html?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">port forwarding</a>.</p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">We’ll also do deep dives into:</span></p><ul><li><p class="paragraph" style="text-align:left;">DoorDash’s Holiday Forecasting Strategy</p></li><li><p class="paragraph" style="text-align:left;">How PayPal Scales Kafka to Trillions of Messages</p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">And finish off with:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">The latest tech news and articles</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">Interesting tools and packages created by the community</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">A useful but lesser-known Linux tip</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;">A spicy JavaScript meme</span></p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>ELEVATE YOUR TECH JOURNEY WITH QUICK BYTE (SPONSOR)</b></span></h2><p class="paragraph" style="text-align:left;">Stay ahead of the curve with Quick Byte! Dive into the latest tech trends 📈, discover sizzling startups 📱, and master AI tips & tricks 🤖.</p><p class="paragraph" style="text-align:left;">Complement your Full Stack Express insights with a daily dose of tech treats from Quick Byte. Don&#39;t miss out!</p><p class="paragraph" style="text-align:left;"><b><a class="link" href="https://quickbyte.tech?ref=fullstackexpress&utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Subscribe to Quick Byte Today!</a></b></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>DOORDASH’S HOLIDAY FORECASTING STRATEGY</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/981ae4c0-b9ee-459b-9b1e-94bec5979435/stephenwsun_thousands_of_doordash_delivery_drivers_delivering_f_15586a49-96fe-4a1c-8f53-039e2ba595ce.png"/></div><p class="paragraph" style="text-align:left;">One of the many challenges DoorDash faces is forecasting supply and demand during holidays.</p><p class="paragraph" style="text-align:left;">For a company that services thousands of markets, maintaining high-quality experiences at scale for both customers and Dashers (delivery drivers) is extremely challenging.</p><p class="paragraph" style="text-align:left;">Operations must be proactively planned in order to ensure that enough Dashers are available and adding additional compensation when less drivers are anticipated.</p><h3 class="heading" style="text-align:left;"><b>DoorDash’s Mobilization System</b></h3><p class="paragraph" style="text-align:left;">DoorDash’s mobilization system is a collaborative effort between operations, finance, engineering, and machine learning teams.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9c313603-9f68-4a2a-a704-b0566c61aa8c/Copy_of_Proactive_System_Level__2_.png"/><div class="image__source"><span class="image__source_text"><p>DoorDash Mobilization System</p></span></div></div><p class="paragraph" style="text-align:left;">To run flawlessly, reliable forecasts and predictions are needed to accommodate supply and demand for all days of the year, including holidays.</p><h3 class="heading" style="text-align:left;"><b>Limitations to DoorDash’s Current Model</b></h3><p class="paragraph" style="text-align:left;">Traditional tree-based models such as <a class="link" href="https://en.wikipedia.org/wiki/Random_forest?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">random forest</a> and <a class="link" href="https://en.wikipedia.org/wiki/Gradient_boosting?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">gradient boosting machine (GPM)</a> are popular in the industry due to their ease of use and high accuracy.</p><p class="paragraph" style="text-align:left;">While typically excelling at time-series forecasting, they struggle with high variations and anomalies, a common pattern during holiday demand.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6b81b576-9b94-45fc-af8a-8d24fce6f038/Untitled.png"/><div class="image__source"><span class="image__source_text"><p>Tree-Based Model Generating Inaccurate Forecasts For Holidays</p></span></div></div><p class="paragraph" style="text-align:left;">From this example, the model gave a prediction of -35%, the average of all the holidays.</p><p class="paragraph" style="text-align:left;">In other words, the Fourth of July (-10%) and Christmas (-5%) were over-forecasted, while Thanksgiving was under-forecasted (+15%), a pretty significant margin of error.</p><h3 class="heading" style="text-align:left;"><b>Cascade Modeling Approach</b></h3><p class="paragraph" style="text-align:left;">To account for these discrepancies, DoorDash adopted a cascade modeling approach through a series of steps:</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Calculating holiday multipliers</p></li><li><p class="paragraph" style="text-align:left;">Preprocessing holiday multipliers and model training</p></li><li><p class="paragraph" style="text-align:left;">Generating forecasts and post-processing</p></li></ol><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cca1a757-2420-4603-9fe1-dd137cdefc26/image-2-1024x593.png"/><div class="image__source"><span class="image__source_text"><p>Cascade Model in Multiple Steps</p></span></div></div><p class="paragraph" style="text-align:left;">These changes led to a significant improvement in the GBM model’s accuracy, measured in terms of weight mean absolute percentage error (wMAPE).</p><h3 class="heading" style="text-align:left;"><b>Model Performance</b></h3><p class="paragraph" style="text-align:left;">The results speak for itself.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/eddc5e25-a63e-416d-99cd-621a281dbc65/Untitled.png"/><div class="image__source"><span class="image__source_text"><p>Cascade Approach vs Traditional Feature Engineering</p></span></div></div><p class="paragraph" style="text-align:left;">The wMAPE saw a dramatic reduction, dropping from a range of 60-70% to just 10-20% during the Christmas time. Thanksgiving showed a comparable improvement.</p><p class="paragraph" style="text-align:left;">When averaged over an entire year of holidays, the wMAPE improved by an absolute 10%.</p><p class="paragraph" style="text-align:left;">In conclusion, DoorDash&#39;s cascade modeling approach offers a promising solution to the challenges of holiday forecasting, balancing the need for accuracy with the complexities of real-world operations.</p><h3 class="heading" style="text-align:left;"><b>Key Takeaways</b></h3><ul><li><p class="paragraph" style="text-align:left;"><b>Adaptability is Key</b>: Traditional models may not be suitable for all scenarios. Being flexible and open to adopting new techniques can yield better results.</p></li><li><p class="paragraph" style="text-align:left;"><b>Complexity vs. Gain</b>: While adding complexity can improve model performance, it&#39;s crucial to weigh the benefits against the added complexity and computational resources needed.</p></li><li><p class="paragraph" style="text-align:left;"><b>Multi-Disciplinary Approach</b>: Collaboration between operations, finance, engineering, and machine learning teams is essential for implementing a robust forecasting system.</p></li><li><p class="paragraph" style="text-align:left;"><b>Validation Challenges</b>: In cases where traditional experimental designs are not feasible, alternative validation methods like backtests and limited A/B tests can be useful.</p></li><li><p class="paragraph" style="text-align:left;"><b>Stakeholder Communication</b>: Transparently communicating the benefits and limitations of a new approach can help in gaining stakeholder buy-in, which is crucial for successful implementation.</p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;"><a class="link" href="https://doordash.engineering/2023/08/31/how-doordash-improves-holiday-predictions-via-cascade-ml-approach/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Source</a></span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>HOW PAYPAL SCALES KAFKA TO TRILLIONS OF MESSAGES</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c0af2cce-9917-4bd9-a48b-adec0a958ad2/stephenwsun_messaging_queues_as_pipes_with_trillions_of_message_5428bc0f-f717-4a3b-b02e-8c2efae00534.png"/></div><p class="paragraph" style="text-align:left;">PayPal, a giant in the fintech space with over 350 million customers, processes trillions of messages per day on their payments platform.</p><p class="paragraph" style="text-align:left;">How exactly does PayPal handle all of these messages at such a high scale while also ensuring high availability, fault tolerance, and optimal performance?</p><h3 class="heading" style="text-align:left;"><b>PayPal at Scale</b></h3><p class="paragraph" style="text-align:left;">Since its introduction at PayPal in 2015, Kafka has scaled dramatically to meet the company&#39;s growing data needs.</p><p class="paragraph" style="text-align:left;">Initially starting with a few isolated clusters, Kafka now powers a wide range of applications at PayPal, from first-party tracking to analytics, each handling over 100 billion messages per day.</p><p class="paragraph" style="text-align:left;">The platform boasts over 1,500 brokers, 20,000 topics, and nearly 2,000 Mirror Maker nodes (mirror data among clusters), achieving a remarkable 99.99% availability.</p><p class="paragraph" style="text-align:left;">During peak times like Black Friday in 2022, Kafka at PayPal handled a staggering 1.3 trillion messages in a single day.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/82295db7-0c48-4e02-9f92-a6a2f06adf8b/1_qve4nQWHZngzlCFUnzIGKQ.png"/><div class="image__source"><span class="image__source_text"><p>Incoming Messages Per Second Over Holiday Season</p></span></div></div><p class="paragraph" style="text-align:left;">The system continues to scale seamlessly, especially during high-traffic holiday seasons, without impacting business operations.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/53da00eb-6e24-4b9f-b589-4e02eb17acd2/1_joGrtZReafZspNv1aC1LSQ.png"/><div class="image__source"><span class="image__source_text"><p>Total Messages Per Day Over Holiday Season</p></span></div></div><h3 class="heading" style="text-align:left;"><b>How Kafka is Used at PayPal</b></h3><p class="paragraph" style="text-align:left;">At a high-level, PayPal’s infrastructure consists of multiple geographically distributed data centers and security zones.</p><p class="paragraph" style="text-align:left;">Kafka clusters are deployed across these zones depending on their data classification and business requirements.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d7a3fefe-c763-454e-9e4d-02eda2131f54/1_PT7718MzZVd2eJpCdvqj0A.png"/><div class="image__source"><span class="image__source_text"><p>Kafka Cluster Deployments in Security Zones Within a Data Center</p></span></div></div><p class="paragraph" style="text-align:left;">Data is then mirrored across the data centers, helping with disaster recovery and zone communication.</p><p class="paragraph" style="text-align:left;">But what libraries and components do these Kafka clusters interact with?</p><p class="paragraph" style="text-align:left;">At PayPal, a wide array of clients are supported:</p><ul><li><p class="paragraph" style="text-align:left;">Java</p></li><li><p class="paragraph" style="text-align:left;">Python</p></li><li><p class="paragraph" style="text-align:left;">Spark</p></li><li><p class="paragraph" style="text-align:left;">Node</p></li><li><p class="paragraph" style="text-align:left;">Golang</p></li><li><p class="paragraph" style="text-align:left;">Internal frameworks</p></li></ul><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4fe90f8c-23ff-4c2e-a12b-8b18ce492d8e/1_gX03dWaLqvjjSLxeOX3zDQ.png"/><div class="image__source"><span class="image__source_text"><p>Kafka Libraries and Components</p></span></div></div><p class="paragraph" style="text-align:left;">With multiple frameworks, tech stacks, and applications that need to be supported, reducing and managing operational overhead is always a challenge.</p><h3 class="heading" style="text-align:left;"><b>Operational Challenges and Solutions</b></h3><p class="paragraph" style="text-align:left;">Over the years, PayPal has identified four key areas of improvement in order to maintain security, consistency, and platform stability:</p><ul><li><p class="paragraph" style="text-align:left;">Cluster management</p></li><li><p class="paragraph" style="text-align:left;">Monitoring and alerting</p></li><li><p class="paragraph" style="text-align:left;">Configuration management</p></li><li><p class="paragraph" style="text-align:left;">Enhancements and automation</p></li></ul><p class="paragraph" style="text-align:left;">To improve cluster management, PayPal introduced a <b>Kafka Config service</b> to manage broker IPs and configurations, which cut down on maintenance from upgrades, patching, etc.</p><p class="paragraph" style="text-align:left;">Furthermore, <b>Access Control Lists (ACLs)</b> were added to secure the platform for business-critical workflows.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8898ee4b-b3af-4f5e-93da-d43f39ed1120/1_nVITjC1SAITN3MHl0xD6Sg.png"/></div><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">To enhance security and streamline integration across various frameworks, PayPal has developed its own set of Kafka libraries.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">The </span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><b>Resilient Client Library</b></span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> simplifies connectivity and configuration, improving developer efficiency and business resilience.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;">Meanwhile, the </span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><b>Monitoring Library</b></span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> enables real-time health checks and alerts, and the </span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"><b>Security Library</b></span><span style="color:rgb(55, 65, 81);font-family:Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;font-size:16px;"> automates SSL authentication, significantly reducing operational overhead for managing certificates and keys.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bc4968e6-5022-4089-ac72-55d86ed75a82/1_GCsUsNMeJEic8OPyp2GXjg.png"/><div class="image__source"><span class="image__source_text"><p>Supported Tech Stack for Kafka Libraries</p></span></div></div><h3 class="heading" style="text-align:left;"><b>Wrapping Up</b></h3><p class="paragraph" style="text-align:left;">Kafka has been instrumental in supporting PayPal&#39;s massive data streaming needs, and the journey has been filled with challenges and learnings.</p><p class="paragraph" style="text-align:left;">Through strategic investments in tooling, monitoring, and automation, PayPal has managed to scale Kafka efficiently while maintaining high availability and performance.</p><p class="paragraph" style="text-align:left;">As the platform continues to evolve, PayPal remains committed to enhancing its Kafka infrastructure to provide a seamless and robust experience for its end-users.</p><h3 class="heading" style="text-align:left;"><b>Key Takeaways</b></h3><ul><li><p class="paragraph" style="text-align:left;"><b>Tooling for Scalable Kafka Management: </b>Custom tools and automation are indispensable for efficiently managing large-scale Kafka deployments. These tools help in reducing manual overhead and errors, making it easier to scale the system as the data traffic grows.</p></li><li><p class="paragraph" style="text-align:left;"><b>Precision Monitoring for Availability: </b>Fine-tuning the monitoring metrics and setting up a responsive alerting system are crucial for maintaining high availability. This ensures that any issues can be quickly identified and resolved, minimizing downtime and impact on mission-critical applications.</p></li><li><p class="paragraph" style="text-align:left;"><b>Securing Access with ACLs</b>: Implementing ACLs has proven to be effective in enhancing the security of Kafka clusters. ACLs also provide better control over which applications can access specific Kafka resources, thereby making application management more structured and secure.</p></li><li><p class="paragraph" style="text-align:left;"><b>Benchmarking for Insight and Efficiency</b>: Conducting performance benchmarks across different operational environments, such as on-premises and cloud, provides valuable insights. These insights help in making informed decisions about optimizing performance and cost-efficiency.</p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana, Geneva, sans-serif;"><a class="link" href="https://medium.com/paypal-tech/scaling-kafka-to-support-paypals-data-growth-a0b4da420fab?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank" rel="noopener noreferrer nofollow">Source</a></span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>BYTE-SIZED TOPICS</b></span></h2><div class="embed"><a class="embed__url" href="https://news.ucsb.edu/2023/021198/wifi-can-read-through-walls?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> Wifi can read through walls </p><p class="embed__description"> UCSB researchers’ new method enables high-quality imaging of still objects with WiFi by using the Geometrical Theory of Diffraction and the corresponding Keller cones to trace edges of the objects. </p><p class="embed__link"> news.ucsb.edu/2023/021198/wifi-can-read-through-walls </p></div></a></div><div class="embed"><a class="embed__url" href="https://medium.com/deno-the-complete-reference/node-js-fastify-vs-go-performance-comparison-for-jwt-verify-and-mysql-query-73c056f19dcc?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> Node.js (Fastify) vs Go: Performance comparison for JWT verify and MySQL query </p><p class="embed__description"> Find out which tech performs better for the use case of verifying JWT and reading record from MySQL: Node.js (Fastify) or Go? </p><p class="embed__link"> medium.com/deno-the-complete-reference/node-js-fastify-vs-go-performance-comparison-for-jwt-verify-and-mysql-query-73c056f19dcc </p></div><img class="embed__image embed__image--right" src="https://miro.medium.com/v2/resize:fit:1200/1*ebOTthfoX6PZ3B2c-5OY0Q.png"/></a></div><div class="embed"><a class="embed__url" href="https://scaleyourapp.com/parallel-processing/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> Parallel Processing: How Modern Cloud Servers Leverage Different System Architectures To Optimize Parallel Compute - Scaleyourapp </p><p class="embed__description"> Modern cloud servers leverage several system architectures to process data parallelly, which increases throughput, minimizes latency and optimizes resource consumption. </p><p class="embed__link"> scaleyourapp.com/parallel-processing </p></div><img class="embed__image embed__image--right" src="https://scaleyourapp.com/wp-content/uploads/2020/07/shared-nothing-architecture.jpeg"/></a></div><div class="embed"><a class="embed__url" href="https://www.crn.com/news/components-peripherals/nvidia-says-new-software-will-double-llm-inference-speed-on-h100-gpu?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> Nvidia Says New Software Will Double LLM Inference Speed On H100 GPU | CRN </p><p class="embed__description"> Nvidia said it plans to release open-source software that will significantly speed up inference performance for large language models powered by its GPUs, including the H100. </p><p class="embed__link"> www.crn.com/news/components-peripherals/nvidia-says-new-software-will-double-llm-inference-speed-on-h100-gpu </p></div><img class="embed__image embed__image--right" src="https://www.crn.com/resources/0285-18ee8fb4d48e-2bab6de91086-1000/nvidia_llm.png"/></a></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>INTERESTING PRODUCTS, TOOLS & PACKAGES</b></span></h2><div class="embed"><a class="embed__url" href="https://github.com/modularml/mojo?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - modularml/mojo: The Mojo Programming Language </p><p class="embed__description"> The Mojo Programming Language. Contribute to modularml/mojo development by creating an account on GitHub. </p><p class="embed__link"> github.com/modularml/mojo </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/1609b5c5c6ef75f7fc2c9566ea5f567902c1dd1b694872e49ad9f0e5f006a039/modularml/mojo"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/oven-sh/awesome-bun?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - oven-sh/awesome-bun: ⚡️ A curated list of awesome things related to Bun </p><p class="embed__description"> ⚡️ A curated list of awesome things related to Bun - GitHub - oven-sh/awesome-bun: ⚡️ A curated list of awesome things related to Bun </p><p class="embed__link"> github.com/oven-sh/awesome-bun </p></div><img class="embed__image embed__image--right" src="https://repository-images.githubusercontent.com/511742583/74417ceb-92b4-4cc4-81bd-4ec8c80f3214"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/microsoft/promptflow?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=doordash-s-holiday-forecasting-strategy" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - microsoft/promptflow: Build high-quality LLM apps - from prototyping, testing to production deployment and monitoring. </p><p class="embed__description"> Build high-quality LLM apps - from prototyping, testing to production deployment and monitoring. </p><p class="embed__link"> github.com/microsoft/promptflow </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/330c979ba80c8e850dc1f54c25b5d7739d8f351c965357bee1ab5219a7f86d60/microsoft/promptflow"/></a></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>TIP OF THE WEEK</b></span></h1><p class="paragraph" style="text-align:left;">A lesser-known but useful Linux tip is the use of the <code>!!</code> (double exclamation mark) to repeat the last command you executed.</p><p class="paragraph" style="text-align:left;">This is particularly handy when you forget to run a command with <code>sudo</code>.</p><p class="paragraph" style="text-align:start;">For example, let&#39;s say you try to update the package list with <code>apt</code>:</p><div class="codeblock"><pre><code>apt update</code></pre></div><p class="paragraph" style="text-align:start;">You&#39;ll likely get a permission denied error because you didn&#39;t use <code>sudo</code>. Instead of retyping the whole command, you can simply type:</p><div class="codeblock"><pre><code>sudo !!</code></pre></div><p class="paragraph" style="text-align:start;">This will execute the last command (<code>apt update</code>) but with <code>sudo</code> prepended, effectively running <code>sudo apt update</code>.</p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>MEME OF THE WEEK</b></span></h1><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bb6bf80b-7de7-4bcf-a027-c8da1a9a6a87/2.png"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=0c534a21-e449-47a2-a5b6-49e201b654c0&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Why Apple is Quietly Winning the AI Race</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/91eb0166-fab9-489d-a5a1-098c20dfa19a/stephenwsun_apple_and_tim_cook_winning_the_ai_race_99cb92e8-760f-4781-bc94-89f4a0343ca8.png" length="1944990" type="image/png"/>
  <link>https://www.fullstackexpress.io/p/why-apple-is-quietly-winning-the-ai-race</link>
  <guid isPermaLink="true">https://www.fullstackexpress.io/p/why-apple-is-quietly-winning-the-ai-race</guid>
  <pubDate>Wed, 06 Sep 2023 13:00:00 +0000</pubDate>
  <atom:published>2023-09-06T13:00:00Z</atom:published>
    <dc:creator>Stephen Sun</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2535b361-3748-439b-a4c2-65d4a8d44bab/full_stack_express.jpg"/></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Good morning and welcome back to another edition of </span><span style="font-family:Verdana,Geneva,sans-serif;"><b>Full Stack Express</b></span><span style="font-family:Verdana,Geneva,sans-serif;">, your weekly newsletter packed with both technical and non-technical tips, the latest tech news, insightful articles, and real-world case studies.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Here’s the notable announcements for the week:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The Node.js team releases </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://philna.sh/blog/2023/09/05/nodejs-supports-dotenv/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow"><b>version 20.6.0</b></a></span><span style="font-family:Verdana,Geneva,sans-serif;">, adding built-in support for </span><code>.env</code><span style="font-family:Verdana,Geneva,sans-serif;"> files.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The Svelte team releases </span><span style="font-family:Verdana,Geneva,sans-serif;"><b><a class="link" href="https://svelte.dev/blog/view-transitions?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">SvelteKit v1.24</a></b></span><span style="font-family:Verdana,Geneva,sans-serif;">, adding support for </span><span style="font-family:Verdana,Geneva,sans-serif;"><b><a class="link" href="https://developer.chrome.com/docs/web-platform/view-transitions/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">view transitions</a></b></span><span style="font-family:Verdana,Geneva,sans-serif;"> (view transitions are in right now).</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The open source Git project releases </span><span style="font-family:Verdana,Geneva,sans-serif;"><b><a class="link" href="https://github.blog/2023-08-21-highlights-from-git-2-42/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">Git 2.42</a></b></span><span style="font-family:Verdana,Geneva,sans-serif;">, containing interesting features such as excluding references by pattern.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Astro is launching Astro Studio in 2024, a globally-distributed edge data platform. Join the waitlist </span><span style="font-family:Verdana,Geneva,sans-serif;"><b><a class="link" href="https://studio.astro.build/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></b></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">We’ll also do deep dives into:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Apple’s AI Breakthrough in Smarter Recommendations</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The Intricacies of how Slack Manages Billions of Requests Daily</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Why Developers Love Rust: The Rise of Tech’s Most Desired Language</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">(Bonus) How LinkedIn Automates Application Security for a Safer User Experience</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">And finish off with:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Byte-sized topics of trending tech news</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Interesting tools and packages created by the community</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Tip of the week (Kubernetes)</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Meme of the week</span></p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>APPLE’S AI BREAKTHROUGH IN SMARTER RECOMMENDATIONS</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3a0597a9-9ad5-4a7e-b5fe-c22b6502ca3c/0_3__1_.png"/></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Ever wondered how Netflix knows you&#39;ll love that new sci-fi series or how Amazon predicts you need a new coffee maker?</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The secret sauce is often &quot;Collaborative Filtering,&quot; a technique that analyzes your behavior to recommend items you&#39;ll likely enjoy.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">But Apple is taking this to a whole new level with their groundbreaking model—Sliced Anti-symmetric Decomposition (SAD).</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/eab835df-f9c7-4cb7-99ab-e3a79df14480/image.png"/><div class="image__source"><span class="image__source_text"><p>SAD: Sliced Anti-symmetric Decomposition for Collaborative Filtering</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Traditional methods use something called &quot;latent vectors&quot; to understand both you and the items you interact with.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">But SAD adds a twist—an extra latent vector for each item, making the algorithm smarter and more nuanced.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><b><i>What makes SAD so special?</i></b></span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Apple&#39;s genius lies in a three-dimensional approach to user-item interactions.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Imagine it as a 3D chessboard where every move you make helps the algorithm understand not just what you like, but how you compare multiple items.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">This results in more accurate and personalized recommendations.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><b><i>So why exactly does Apple’s model stand out?</i></b></span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">When the additional vector in SAD is set to 1, it&#39;s like any other state-of-the-art (SOTA) collaborative filtering model. But here&#39;s the kicker: Apple lets this value be driven by actual data.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">This opens up a world of possibilities, suggesting that our decision-making might be more complex than previously thought.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/91923feb-e6ba-42cc-a744-ab5d1f746672/image.png"/><div class="image__source"><span class="image__source_text"><p>SAD vs Traditional Collaborative Filterings</p></span></div></div><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana,Geneva,sans-serif;">Ever find yourself stuck in a loop, comparing two or three items endlessly? SAD gets that, and it&#39;s built to understand these cycles.</span></p><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana,Geneva,sans-serif;">The proof is in the numbers.</span></p><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana, Geneva, sans-serif;">Apple didn&#39;t just make claims; they put SAD to the test.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d4b9f4b8-0ccb-4d0a-9d8b-06ac3d872cd3/image.png"/><div class="image__source"><span class="image__source_text"><p>Test Results for Different Parameters (e.g. Learning Rate)</p></span></div></div><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana,Geneva,sans-serif;">With over a million user-item interactions from both simulated and real-world datasets, SAD didn&#39;t just meet the bar—it raised it. </span></p><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana,Geneva,sans-serif;">Outperforming seven SOTA models, SAD proved to be a juggernaut in delivering consistent, highly accurate recommendations.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/277635d9-9974-4bd8-ba62-b59410a2a36a/image.png"/><div class="image__source"><span class="image__source_text"><p>SAD outperforming other models in consistency and accuracy</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">With a whopping </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://mashable.com/article/apple-quietly-invested-billions-generative-ai?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">$22.6 billion</a></span><span style="font-family:Verdana,Geneva,sans-serif;"> invested in AI and machine learning, Apple may be quiet, but they&#39;re far from inactive.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Between their </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://machinelearning.apple.com/research/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">cutting-edge research</a></span><span style="font-family:Verdana,Geneva,sans-serif;"> and massive R&D investments, it&#39;s clear: Apple is gearing up to redefine the future of personalization.</span></p><p class="paragraph" style="text-align:start;"><span style="font-family:Verdana,Geneva,sans-serif;">So, the next time your device suggests something eerily perfect, you&#39;ll know that Apple&#39;s SAD algorithm is the wizard behind the curtain.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the full publication </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://arxiv.org/pdf/2201.11936.pdf?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the model and inference algorithms </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://github.com/apple/ml-sad?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the full in-depth analysis </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://machinelearning.apple.com/research/consistent-collaborative-filtering-updates?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>THE INTRICACIES OF HOW SLACK MANAGES BILLIONS OF REQUESTS DAILY</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d660a163-4dbe-4bae-b6ac-5ca2efbdd043/0_3.png"/></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">How exactly does Slack juggle billions of network requests daily?</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">The answer starts with Slack&#39;s Edge </span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://en.wikipedia.org/wiki/Point_of_presence?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">Points of Presence (PoPs)</a></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">—a global network of data centers designed to minimize latency and maximize performance.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">These PoPs connect to Slack&#39;s main AWS region, where core services and storage reside.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">The architecture is robust and built for resilience, ensuring a seamless Slack experience even if a data center goes down.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9b0dad96-ba75-4475-b3b9-25e1de6d911d/dns-resolve.png"/><div class="image__source"><span class="image__source_text"><p>How Requests Flow Through Slack’s Infrastructure</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">When you interact with Slack, your requests fall into two main categories:</span></p><ol start="1"><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><b>WebSocket Requests:</b></span><span style="font-family:Verdana,Geneva,sans-serif;"> The engine behind real-time messaging</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><b>Non-WebSocket Requests:</b></span><span style="font-family:Verdana,Geneva,sans-serif;"> All other functionalities, like file uploads and API calls</span></p></li></ol><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Slack uses </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://aws.amazon.com/route53/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">Amazon Route53</a></span><span style="font-family:Verdana,Geneva,sans-serif;"> and </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://ns1.com/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">NS1</a></span><span style="font-family:Verdana,Geneva,sans-serif;"> to manage domain name resolution, making sure your requests find their way through the network maze efficiently.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier,'Lucida Typewriter',monospace;"><b>WebSocket Traffic for Slack Messages</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">WebSocket connections are the backbone of Slack&#39;s real-time messaging.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Managed by a system called &quot;envoy-wss,&quot; these connections ensure that your messages are delivered almost instantly via Slack’s DNS domains.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6118eaf2-bbe0-45e9-9fc7-ba8df05a6f4e/wss-traffic.png"/><div class="image__source"><span class="image__source_text"><p>How Slack Handles WebSocket Traffic</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">These DNS records are managed by NS1 through a series of filters called </span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://ns1.com/ns1-filter-chain?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">Filter Chains</a></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">This sequence directs your messages to the closest Network Load Balancers (NLBs), optimizing for speed and reliability.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2fc7ffae-7902-4d2c-8ad1-3917913684f9/primary-filterchain.png"/><div class="image__source"><span class="image__source_text"><p>Filter Chains</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Verdana,Geneva,sans-serif;">The request is finally directed to either Gatewayserver or Applink based on its parameters.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://slack.engineering/real-time-messaging/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow"><i>Gatewayserver</i></a></span><span style="color:rgb(45, 46, 52);font-family:Verdana,Geneva,sans-serif;"> is an internal service that maintains WebSocket connections at Slack.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;"><i>Applink</i></span><span style="color:rgb(45, 46, 52);font-family:Verdana,Geneva,sans-serif;"> is an internal service designed to lighten the burden of security for customers when building apps that need to receive data.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>Slack’s API and Integration Ecosystem</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Slack isn&#39;t just about messaging. It&#39;s also a hub for:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Slack API</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Slackbot</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Webhooks</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Third-party applications</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">These types of traffic are managed by a dedicated set of servers known as &quot;envoy-edge,&quot; fine-tuned for handling heavy, API traffic.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dd53125c-6790-4eb6-b03c-b0ff2bf5b8a1/api-traffic.png"/><div class="image__source"><span class="image__source_text"><p>How Slack Handles API Traffic</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Internally, a host of specialized internal services work together to manage different aspects of Slack&#39;s traffic:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Flannel:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> An edge cache that holds essential user and channel information.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Imgproxy:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> Manages image content within Slack.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Supra and Miata:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> Handle your file uploads and downloads.</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">After navigating this intricate network, your requests finally land on Slack&#39;s WebApp, where you see your messages, files, and integrations.</span></p><p class="paragraph" style="text-align:start;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">So, the next time you send a message or share a file on Slack, you&#39;ll have a newfound appreciation for the complex but highly efficient system running in the background.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the full in-depth analysis </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://slack.engineering/traffic-101-packets-mostly-flow/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>WHY DEVELOPERS LOVE RUST: THE RISE OF TECH’S MOST DESIRED LANGUAGE</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8d52e9b7-3f74-4dd5-a28b-81f1acfdc783/stephenwsun_crabs_everywhere_in_the_world_fc08d5bf-8945-4e3e-a7bf-76a17d135ac6.png"/></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">For an impressive eight consecutive years, Rust has claimed the title of &quot;Most Desired Programming Language&quot; in Stack Overflow&#39;s yearly survey of developers.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">With over 80% of developers eager to continue using it next year, it&#39;s remarkable how this language, founded less than two decades ago, has captivated the global developer community.</span></p><p class="paragraph" style="text-align:start;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">In this feature, we&#39;ll explore Rust&#39;s intriguing history, its typical applications, and the reasons behind its skyrocketing popularity.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>The Rust Origin Story</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Born out of a need for a safer alternative to C and C++, Rust has rapidly ascended to become a cornerstone in systems programming.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Verdana, Geneva, sans-serif;">Initially developed by Graydon Hoare in 2006, and later backed by Mozilla in 2009, Rust was a game-changer with its stable 1.0 release in 2015.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Verdana, Geneva, sans-serif;"><i><b>Did you know?</b></i></span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">The spark for Rust actually came from a </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://www.technologyreview.com/2023/02/14/1067869/rust-worlds-fastest-growing-programming-language/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">malfunctioning elevator experience</a></span><span style="font-family:Verdana,Geneva,sans-serif;">, inspiring Hoare to create a language that could eliminate common memory issues.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">The language prioritizes safety, performance, and productivity, employing static typing to ensure memory safety and reduce errors.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Fast forward to 2023, Rust is the go-to language for about 2.8 million developers, known as &quot;Rustaceans,&quot; and has even been embraced by Big Tech companies like Microsoft for its memory-safe capabilities.</span></p><p class="paragraph" style="text-align:left;"><span style="color:rgb(55, 65, 81);font-family:Verdana,Geneva,sans-serif;">The language even has an unofficial mascot, Ferris, adding a whimsical touch to its growing popularity.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c57b7189-bed1-4138-a335-48509e9f1514/image1-2.png"/><div class="image__source"><span class="image__source_text"><p>Ferris, the Unofficial Mascot for Rust</p></span></div></div><h3 class="heading" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>What Makes Rust Unique</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Rust stands out for its unique blend of speed and reliability, addressing developers&#39; memory management challenges often seen in C and C++.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Its ownership system and borrowing model offer built-in support for concurrent programming, eliminating data races and memory issues.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Furthermore, unlike languages that use garbage collection, Rust relies on its ownership rules for efficient memory management, giving developers precise control over resource allocation.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Its package manager, Cargo, not only simplifies project management but also boasts a rich ecosystem of performance-critical libraries.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Rust was the first systems language with a standard package manager, enhancing its robustness.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Other key features include:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Zero-cost abstractions, allowing high-level code without performance loss</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Pattern matching for clean data structure handling</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Advanced type inference, which automates expression detection based on context.</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">These combined features make Rust a uniquely powerful and efficient programming language.</span></p><h3 class="heading" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Where Rust Excels</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Rust&#39;s adaptability makes it a top choice for a myriad of applications:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Backend Systems:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> Its performance and thread safety are invaluable for building performance-critical backend systems, as seen in GitHub&#39;s code search feature.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Operating Systems:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> Rust is a preferred language for OS development, powering systems like Redox OS and Google&#39;s Fuchsia.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Web Development:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> With async programming and high performance, Rust is making waves in server-side applications, supported by frameworks like Rocket.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Emerging Technologies:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> Rust is carving a niche in cryptocurrency and blockchain technologies, and its minimal runtime makes it ideal for embedded systems and IoT development.</span></p></li></ul><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">In summary, Rust has captivated developers with its focus on safety, performance, and versatility, earning it a place of honor in the programming world.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Let’s end with something for the Rust aficionados:</span></p><div class="codeblock"><pre><code>fn main() &#123;
    break rust;
&#125;</code></pre></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the full in-depth analysis </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://github.blog/2023-08-30-why-rust-is-the-most-admired-language-among-developers/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>HOW LINKEDIN AUTOMATES APPLICATION SECURITY FOR A SAFER USER EXPERIENCE</b></span></h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9a12a565-98bb-46c2-b719-9ba9b576ac9e/0_1__1_.png"/></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">LinkedIn&#39;s Information Security team is committed to creating a secure environment for its users.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">At its core is the Application Security team, who manage key security headers like Content Security Policy (CSP) to fortify web applications.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Their mission is to automate security protocols, boost developer productivity, and reduce manual oversight.</span></p><p class="paragraph" style="text-align:start;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">They’ve experimented with two architectural models to achieve this:</span></p><ol start="1"><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Centralized, Rule-Heavy Approach:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> This model scrutinizes outgoing HTTP responses against a set of stringent rules, ensuring they meet the gold standard of security.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Decentralized, Developer-Empowered Model:</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"> This approach offers developers the latitude to innovate while maintaining a robust security framework.</span></p></li></ol><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Both models deploy rules to LinkedIn&#39;s proxy hosts, monitored by specialized plugins. This dual strategy not only fortifies security but also streamlines the development process.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>Analyzing the Centralized Approach</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Initially, LinkedIn employed a centralized approach, using the Traffic Headers Plugin to write Content Security Policy (CSP) headers into responses.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">While this offered benefits like easier maintenance and uniform secure policies, it posed significant challenges as LinkedIn scaled.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">The centralized system became increasingly unwieldy, placing the Application Security team in a bottleneck position for approving changes, thereby increasing the risk of human error and site issues.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/541cd5df-c180-4fef-bd17-8d19d41bc8c3/image1.png"/><div class="image__source"><span class="image__source_text"><p>LinkedIn’s Centralized Architecture Model</p></span></div></div><p class="paragraph" style="text-align:left;">R<span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">ecognizing these limitations, LinkedIn pivoted to a decentralized approach, aligned with the latest CSP standards. This new architecture aimed to achieve five key objectives:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Minimize the impact of changes</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Empower developers</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Provide a consistent testing experience</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Enhance security posture</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Build a generalized solution beyond just CSP headers</span></p></li></ul><p class="paragraph" style="text-align:start;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">While the old centralized architecture remains for legacy applications, the focus has shifted towards migrating to a more agile and scalable decentralized system.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>Migrating to a New Decentralized System</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">In this new architecture, a CSP Filter became an integral part of the frontend frameworks.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">This filter decorates the outgoing response with CSP headers defined by developers, maintaining a safety net with a fallback mechanism at the traffic layer.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8a2e1c9b-d2b9-4d09-bfdc-7c7c87098f5b/image3.png"/><div class="image__source"><span class="image__source_text"><p>LinkedIn’s Decentralized Architecture Model</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">This approach reduced the scope and impact of CSP changes, empowering developers to implement and test changes efficiently.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">However, the decentralized model posed challenges in security governance, including reduced visibility for the Application Security team and the complexity of CSP modifications.</span></p><h3 class="heading" style="text-align:left;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>Implementing Risk-Based Validation Rules</b></span></h3><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">To address these challenges, LinkedIn adopted a &quot;shift-left&quot; approach, implementing security validators that analyze code at the time of commit using risk-based rules.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Validation checks on GitHub guide developers on appropriate actions, such as blocking pull requests that violate key risk rules.</span></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/77cc4f7f-1cc5-43bd-b9bb-d99c4c9b6ff5/image2.png"/><div class="image__source"><span class="image__source_text"><p>Example of LinkedIn’s Critical Rules</p></span></div></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">LinkedIn&#39;s balanced approach aims to combine the rigor of a centralized system with the flexibility of a decentralized model, making it a safer and more efficient platform for both users and developers.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">In summary, LinkedIn&#39;s dual approach to application security serves as a compelling case study in balancing security rigor with developmental agility.</span></p><p class="paragraph" style="text-align:left;"><span style="font-family:Verdana,Geneva,sans-serif;">Find the full in-depth analysis </span><span style="font-family:Verdana,Geneva,sans-serif;"><a class="link" href="https://engineering.linkedin.com/blog/2023/enhancing-security-and-developer-productivity--linkedin-s-journe?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank" rel="noopener noreferrer nofollow">here</a></span><span style="font-family:Verdana,Geneva,sans-serif;">.</span></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>BYTE-SIZED TOPICS</b></span></h2><div class="embed"><a class="embed__url" href="https://review.firstround.com/the-engineers-guide-to-career-growth-advice-from-my-time-at-stripe-and-facebook?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> The Engineer’s Guide to Career Growth — Advice from My Time at Stripe and Facebook </p><p class="embed__description"> Raylene Yung has spent a decade scaling eng and product teams at Facebook and Stripe. Here&#39;s her advice for engineers at every stage of their careers, from IC to org leader. </p><p class="embed__link"> review.firstround.com/the-engineers-guide-to-career-growth-advice-from-my-time-at-stripe-and-facebook </p></div><img class="embed__image embed__image--right" src="https://assets.proof.pub/2056/firstround%2FQYADsd7QM67wuHBcab0l_Raylene%20Yung%20Twitter%20size.jpg"/></a></div><div class="embed"><a class="embed__url" href="https://decrypt.co/154923/chatgpt-canva-plugin-openai-design-tool?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> OpenAI Plugs ChatGPT Into Canva to Sharpen Its Competitive Edge in AI - Decrypt </p><p class="embed__description"> Now ChatGPT Plus users can &quot;talk&quot; to Canva directly from OpenAI&#39;s bot, making their graphic design workflow easier. </p><p class="embed__link"> decrypt.co/154923/chatgpt-canva-plugin-openai-design-tool </p></div><img class="embed__image embed__image--right" src="https://cdn.decrypt.co/resize/1024/height/512/wp-content/uploads/2023/09/OpenAI-Canva-shutterstock_2240464447-16x9-RKO-gID_7.jpg"/></a></div><div class="embed"><a class="embed__url" href="https://newsroom.aboutrobinhood.com/robinhood-wallet-adds-support-for-bitcoin-and-dogecoin-and-enables-ethereum-swaps/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> Robinhood Wallet Adds Support for Bitcoin and Dogecoin, and Enables Ethereum Swaps - Robinhood Newsroom </p><p class="embed__description"> We have launched custody, send, and receive support for Bitcoin and Dogecoin to all users, and are enabling in-app swaps on the Ethereum network. </p><p class="embed__link"> newsroom.aboutrobinhood.com/robinhood-wallet-adds-support-for-bitcoin-and-dogecoin-and-enables-ethereum-swaps </p></div><img class="embed__image embed__image--right" src="https://newsroom.aboutrobinhood.com/wp-content/uploads/sites/2/2023/08/BTC_DOGE-Hero-compressed.jpg"/></a></div><div class="embed"><a class="embed__url" href="https://techcrunch.com/2023/09/05/okra-raises-12m-as-it-brings-solar-power-to-grids-in-developing-areas/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> Okra raises $12M as it brings solar power to grids in developing areas | TechCrunch </p><p class="embed__description"> Today Okra Solar is announcing a $12 million Series A aimed at serving wide swaths of the world that presently lack access to electricity. </p><p class="embed__link"> techcrunch.com/2023/09/05/okra-raises-12m-as-it-brings-solar-power-to-grids-in-developing-areas </p></div><img class="embed__image embed__image--right" src="https://techcrunch.com/wp-content/uploads/2022/04/okra-solar-1.jpg?resize=1200,800"/></a></div><p class="paragraph" style="text-align:center;"></p></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h2 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>INTERESTING PRODUCTS, TOOLS & PACKAGES</b></span></h2><div class="embed"><a class="embed__url" href="https://marketsy.ai/?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> Marketsy.ai, Created by Igor Boky </p><p class="embed__description"> Looking to start an online store or marketplace? Marketsy.ai can whip up a complete e-commerce solution in just a few seconds via a single prompt. Say goodbye to the hassle of building your own website - let AI do the heavy lifting for you. </p><p class="embed__link"> marketsy.ai </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/937c9c80-443c-41c2-b7fa-23518d5fc169/Screenshot_2023-09-05_at_2.33.26_PM.png"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/lgrammel/modelfusion?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - lgrammel/modelfusion: Build multimodal AI applications, chatbots, and agents with JavaScript and TypeScript. </p><p class="embed__description"> Build multimodal AI applications, chatbots, and agents with JavaScript and TypeScript. - GitHub - lgrammel/modelfusion: Build multimodal AI applications, chatbots, and agents with JavaScript and Ty... </p><p class="embed__link"> github.com/lgrammel/modelfusion </p></div><img class="embed__image embed__image--right" src="https://repository-images.githubusercontent.com/645275760/4caf7862-eab6-4510-bd36-18c60c851719"/></a></div><div class="embed"><a class="embed__url" href="https://github.com/measuredco/puck?utm_source=www.fullstackexpress.io&utm_medium=newsletter&utm_campaign=why-apple-is-quietly-winning-the-ai-race" target="_blank"><div class="embed__content"><p class="embed__title"> GitHub - measuredco/puck: The self-hosted drag and drop editor for React. </p><p class="embed__description"> The self-hosted drag and drop editor for React. Contribute to measuredco/puck development by creating an account on GitHub. </p><p class="embed__link"> github.com/measuredco/puck </p></div><img class="embed__image embed__image--right" src="https://opengraph.githubassets.com/7853bd909f22b2bf3c398e91efed7ca3b7cda3ac3a19f22572bb87ce4a43bb2e/measuredco/puck"/></a></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>TIP OF THE WEEK</b></span></h1><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">When it comes to deploying workloads on Kubernetes, defining resource requests and limits for CPU and memory is not just good practice—it&#39;s a necessity.</span></p><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Take a look at this sample pod configuration:</span></p><div class="codeblock"><pre><code>apiVersion: v1
kind: Pod
metadata:
  name: my-application
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      requests:
        memory: &quot;64Mi&quot;
        cpu: &quot;250m&quot;
      limits:
        memory: &quot;128Mi&quot;
        cpu: &quot;500m&quot;</code></pre></div><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">Here&#39;s four reasons why:</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Predictable Resource Allocation</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">: Think of resource requests as RSVPing a table at a restaurant for your pod. It ensures your pod gets the resources it needs to run smoothly.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Avoid Resource Starvation</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">: Setting limits is your node&#39;s bouncer, keeping your pod from hogging all the resources and starving others. It&#39;s your defense against the &quot;noisy neighbor.&quot;</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Improve Stability</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">: Without limits, a rogue pod could go on a resource spree, crashing other pods or even the node. It&#39;s your speed limit for safe pod driving.</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;"><b>Efficiency</b></span><span style="color:#222222;font-family:Verdana,Geneva,sans-serif;">: Fine-tuning these values is like optimizing your car for fuel efficiency. You get peak performance without waste.</span></p></li></ul></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><h1 class="heading" style="text-align:center;"><span style="font-family:Courier, Lucida Typewriter, monospace;"><b>MEME OF THE WEEK</b></span></h1><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/049ce1fa-61f2-4cca-874e-714ed61871e7/1692862692061.jpeg"/></div></div><hr class="content_break"><div class="section" style="background-color:transparent;border-color:#C0C0C0;border-radius:5px;border-style:solid;border-width:1px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=4f614754-ae59-491a-963b-73a4c0e65b4c&utm_medium=post_rss&utm_source=full_stack_express">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

  </channel>
</rss>
