<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anthony M.</title>
    <description>The latest articles on DEV Community by Anthony M. (@amorriscode).</description>
    <link>https://dev.to/amorriscode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F7658%2Fb28cac3b-9a7b-456e-b9c2-101a879ff81d.png</url>
      <title>DEV Community: Anthony M.</title>
      <link>https://dev.to/amorriscode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amorriscode"/>
    <language>en</language>
    <item>
      <title>babel_fish - real time language translation</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Sun, 14 Apr 2024 21:47:15 +0000</pubDate>
      <link>https://dev.to/amorriscode/babelfish-real-time-language-translation-4djg</link>
      <guid>https://dev.to/amorriscode/babelfish-real-time-language-translation-4djg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-us-for-the-cloudflare-ai-challenge-3000-in-prizes-5f99"&gt;Cloudflare AI Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;Douglas Adams came up with the idea of the &lt;a href="https://hitchhikers.fandom.com/wiki/Babel_Fish" rel="noopener noreferrer"&gt;Babel fish&lt;/a&gt; in Hitchhiker's Guide to the Galaxy. It's a fish that, once you've stuck it in your ear, allows any language to be translated to you in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trybabelfish.com" rel="noopener noreferrer"&gt;&lt;code&gt;babel_fish&lt;/code&gt;&lt;/a&gt; is a real time language translation app built with Cloudflare, Svelte, and multiple language models. The app allows you to share a room with your friends in different languages. All messages get translated to your chosen language in real time!&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/alicelovescake"&gt;@alicelovescake&lt;/a&gt; and I thought this would be a perfect app for trying out the fancy new Cloudflare Workers AI!&lt;/p&gt;

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


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/475b44db5d1647fea4ad9d55d54d0015"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Le code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The Svelte application contains the frontend code as well as all of our API endpoints interacting with the language models.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/amorriscode" rel="noopener noreferrer"&gt;
        amorriscode
      &lt;/a&gt; / &lt;a href="https://github.com/amorriscode/babel-fish" rel="noopener noreferrer"&gt;
        babel-fish
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A real time translation app
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;babel_fish &amp;lt;&amp;gt;&amp;lt;&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-us-for-the-cloudflare-ai-challenge-3000-in-prizes-5f99" rel="nofollow"&gt;Cloudflare AI Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;babel_fish is a real time language translation app built with Cloudflare, Svelte, and multiple language models. The app allows you to share a room with your friends in different languages. All messages get translated to your chosen language in real time!&lt;/p&gt;
&lt;p&gt;This repo contains the Svelte frontend which includes API routes for interacting with the AI. The chat engine is handled by &lt;a href="https://github.com/amorriscode/babel-fish-ws" rel="noopener noreferrer"&gt;the backend&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💅 Svelte&lt;/li&gt;
&lt;li&gt;⚙️ Cloudflare Workers&lt;/li&gt;
&lt;li&gt;🤖 Cloudflare Workers AI&lt;/li&gt;
&lt;li&gt;📣 ElevenLabs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚧 Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;a href="https://elevenlabs.io/" rel="nofollow noopener noreferrer"&gt;ElevenLabs&lt;/a&gt; API key&lt;/li&gt;
&lt;li&gt;A running version of &lt;a href="https://github.com/amorriscode/babel-fish-ws" rel="noopener noreferrer"&gt;the backend&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Development&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: &lt;code&gt;wrangler&lt;/code&gt; is used to run the dev server so we have access to Cloudflare Workers AI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an &lt;code&gt;.env&lt;/code&gt; file and fill in the variables&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cp .env.example .env&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clone the frontend&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone https://github.com/amorriscode/babel-fish&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install dependencies&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the wrangler dev server&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm run&lt;/code&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/amorriscode/babel-fish" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;Our web socket backend uses Cloudflare Workers and Durable Storage. It's a simple logic engine that powers the chat rooms.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/amorriscode" rel="noopener noreferrer"&gt;
        amorriscode
      &lt;/a&gt; / &lt;a href="https://github.com/amorriscode/babel-fish-ws" rel="noopener noreferrer"&gt;
        babel-fish-ws
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Chat engine for the real time translation app babel_fish
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;babel_fish &amp;lt;&amp;gt;&amp;lt; ws&lt;/h1&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-us-for-the-cloudflare-ai-challenge-3000-in-prizes-5f99" rel="nofollow"&gt;Cloudflare AI Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;babel_fish is a real time language translation app built with Cloudflare, Svelte, and multiple language models. The app allows you to share a room with your friends in different languages. All messages get translated to your chosen language in real time!&lt;/p&gt;
&lt;p&gt;This repo contains the websocket backend that powers the &lt;a href="https://github.com/amorriscode/babel-fish-ws" rel="noopener noreferrer"&gt;babel_fish frontend&lt;/a&gt;;&lt;/p&gt;
&lt;p&gt;Built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚙️ Cloudflare Workers&lt;/li&gt;
&lt;li&gt;📦 Cloudflare Durable Objects&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚧 Requirements&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A paid Cloudflare account to use Durable Objects&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Development&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the repo&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone https://github.com/amorriscode/babel-fish-ws&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install dependencies&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the dev server&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm run wev&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/amorriscode/babel-fish-ws" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
 

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Tired: trying out one new technology during a hackathon&lt;br&gt;
Wired: trying out tons of new technology during a hackathon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been admiring Cloudflare from afar for a while now. I love what they've been doing with Pages, Workers, and now AI Workers. This hackathon finally gave me a good excuse to play around with the platform!&lt;/p&gt;

&lt;p&gt;Aside from all the fancy tooling Cloudflare provide, this was also my first time using Svelte (sorry Rich!). I actually really enjoyed the experience. I'd love to spend more time writing Svelte; I have a lot left to learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  So... AI?
&lt;/h3&gt;

&lt;p&gt;We used a ton of Cloudflare's available AI models to build &lt;a href="https://trybabelfish.com" rel="noopener noreferrer"&gt;&lt;code&gt;babel_fish&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@cf/openai/whisper&lt;/code&gt; for voice-to-text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@hf/thebloke/mistral-7b-instruct-v0.1-awq&lt;/code&gt; for language detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@cf/meta/m2m100-1.2b&lt;/code&gt; for language translation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since a true Babel fish doesn't produce text we also used &lt;a href="https://elevenlabs.io/" rel="noopener noreferrer"&gt;ElevenLabs&lt;/a&gt; for text-to-speech.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;p&gt;We only had a single day to work on our project. The tight timeline and all new tech made it an exciting 24 hours.&lt;/p&gt;

&lt;p&gt;The biggest challenge of this project actually ended up being the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_AudioWorklet" rel="noopener noreferrer"&gt;backend audio processing&lt;/a&gt;. With the initial POC, user messages weren't transcribed and sent over the wire until they were completely finished speaking. We were able to improve this by using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/AudioWorklet" rel="noopener noreferrer"&gt;AudioWorklet&lt;/a&gt;s. Now we regularly check for gaps in a user's message and periodically process and broadcast messages.&lt;/p&gt;

&lt;p&gt;The rest was easy because Cloudflare and Svelte made it so. 😎&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/cloudflaredev"&gt;@cloudflaredev&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/thepracticaldev"&gt;@thepracticaldev&lt;/a&gt; for putting on this hackathon. If you're interested in this kind of thing, &lt;a href="https://stripe.com/jobs/listing/staff-engineer-developer-ai/5364470" rel="noopener noreferrer"&gt;come work on experimental AI projects with me at Stripe&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&amp;lt;&amp;gt;&amp;lt;&lt;/p&gt;

</description>
      <category>cloudflarechallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>svelte</category>
    </item>
    <item>
      <title>12 Products in 12 Months</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Sun, 02 Jan 2022 19:38:29 +0000</pubDate>
      <link>https://dev.to/amorriscode/12-products-in-12-months-4h62</link>
      <guid>https://dev.to/amorriscode/12-products-in-12-months-4h62</guid>
      <description>&lt;p&gt;It's been a while since I've built anything for myself. One of the reasons I consider myself a "product-focused engineer" is because of my passion for building. Programming has enabled me to create something from nothing. Its turned me into a builder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://alicezhao.com/"&gt;My partner&lt;/a&gt; and I have been talking about doing an ambitious project for 2022. We've decided to build &lt;strong&gt;12 products in 12 months&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;There are a lot of reasons I'm excited about this project. The first one was mentioned above.&lt;/p&gt;

&lt;p&gt;I'm a builder. Creating things excites me. It makes me feel alive. I love everything from naming products, designing logos, writing bits of code, and setting up deployments. Every bit of the process is a fun way to flex my creativity. It brings me joy.&lt;/p&gt;

&lt;p&gt;My partner is a computer science student. She's been developing her coding skills for some time now. Although we've collaborated before, she's grown a lot in the past 6 months. Now she's ready to take on bigger projects! For her, it'll be a great way to practice the skills she's learning in school and in her internships. It'll help her flex the programming muscle. It's a unique way for us to spend more time together.&lt;/p&gt;

&lt;p&gt;I suck at marketing. I'm not &lt;em&gt;great&lt;/em&gt; at design. The whole product life cycle is something I'm interested in. This project will be a safe space for me to play in areas I don't get to do as often at work. I'll be consuming a lot of product resources and seeing where we can take our products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline
&lt;/h2&gt;

&lt;p&gt;We're making one product every month.&lt;/p&gt;

&lt;p&gt;Some people I've told have criticized the project. You can't build a business in a month. You can't build a good product in a month. Tell that to &lt;a href="(https://levels.io/12-startups-12-months/)"&gt;Pieter Levels&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Either way, that isn't why we are doing this. We aren't setting out to build billion dollar startups here. We're looking to build skills, be creative, and to have fun. I do hope some of our products end up being useful for ourselves (and others!) but that would be a beneficial side effect.&lt;/p&gt;

&lt;p&gt;At the start of each month, we're going to pick the product we want to build. We have a giant list but we're also &lt;a href="//mailto:amorriscode@gmail.com"&gt;open to suggestions&lt;/a&gt;! Once we've decided on the product, we'll break down our MVP and write tickets for work to be done. There's flexibility here. We're basically just going to use Kanban as we build throughout the month.&lt;/p&gt;

&lt;p&gt;At the end of each month, we'll each reflect on what we've learned. Where did we fall short? What did we have the most fun doing? And of course, we'll post on Product Hunt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Following Along
&lt;/h2&gt;

&lt;p&gt;We've setup a &lt;a href="https://batteries.notion.site/12-Products-45c32d127b274f67b44684c5e1c2dd1b"&gt;public Notion page&lt;/a&gt; where you can follow along. This is where we'll do our planning. You can see each product, the scope of the MVP, and our tickets as we work through them.&lt;/p&gt;

&lt;p&gt;We also plan to stream on Twitch every Sunday at 12 PM PST! This is will just be a fun way to interact with others. If you want to cheer us on, ask questions, or shit talk us, you can do it there. My guess is we won't have any viewers but it's just going to be another fun way to engage with the project. It should also add some aspect of accountability to the whole thing.&lt;/p&gt;

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

&lt;p&gt;Today we decided on our first project, &lt;strong&gt;Poke&lt;/strong&gt;! Poke is a personal accountability system. You setup recurring goals on the platform and get reminded about them via text message.&lt;/p&gt;

&lt;p&gt;For example, if you want to go to the gym three days a week, you can add a reminder in Poke to message you on your gym days. Poke will keep track of when you accomplish your goals or when you've slipped up.&lt;/p&gt;

&lt;p&gt;I've been thinking a lot about building platforms that interact with users by sending them text messages. I use Messages on my phone more than anything else. Don't be surprised if we build other text-based things later in the year.&lt;/p&gt;

&lt;p&gt;This project is extremely ambitious. There's a good chance we don't even build 12 products. Some of our ideas could barely be described as products, others could be startups in their own right. A lot of people will doubt the value of this project or our ability to succeed. In the end, I don't care about any of that. I'm excited to be building. I'm excited to be giving myself permission to be creative just for the heck of it.&lt;/p&gt;

&lt;p&gt;The last few years have been taxing on all of us. This project has me looking at 2022 with hope and excitement. I hope you find something to make you feel the same. I can't wait to get started.&lt;/p&gt;

&lt;p&gt;I can't wait to share the journey as we make our way through 12 products!&lt;/p&gt;

</description>
      <category>product</category>
      <category>programming</category>
      <category>startup</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Obtaining Your Ideal Software Job</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Fri, 24 Dec 2021 21:27:55 +0000</pubDate>
      <link>https://dev.to/amorriscode/obtaining-your-ideal-software-job-4n26</link>
      <guid>https://dev.to/amorriscode/obtaining-your-ideal-software-job-4n26</guid>
      <description>&lt;p&gt;Finding a job is stressful for everybody. The standard tech interview doesn't help, does it? I've sent out a few emails over the past few years detailing my approach to the job search as well as some resources I use. I decided to write about it here so I can share it easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Companies
&lt;/h2&gt;

&lt;p&gt;The first thing I do when I know I'm ready to make a move is build a list of companies I'm interested in. It's hard to know what a company is like from the inside but it's important to me that I believe in the product.&lt;/p&gt;

&lt;p&gt;Since I'm interested in smaller companies, I like to look at startups. Working at a startup can be risky. To mitigate the risk, I start by looking at companies on websites of &lt;a href="https://lowercarboncapital.com/companies"&gt;venture&lt;/a&gt; &lt;a href="https://a16z.com/portfolio/"&gt;capital&lt;/a&gt; &lt;a href="https://www.sequoiacap.com/our-companies"&gt;firms&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I try to build out a spreadsheet of 50-100 companies. This list can be pruned over time too. Applying for jobs has always felt like a numbers game to me so it's nice to have a starting point.&lt;/p&gt;

&lt;p&gt;What you look for in a company is likely different than what I'm looking for. The important thing is you build a list of companies that align with your needs and interests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practicing Daily
&lt;/h2&gt;

&lt;p&gt;Given the current landscape of software interviews, it's a good idea to practice solving algorithms. It's extremely common to whiteboard a problem solving question during the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to avoid whiteboard interviews at all cost (I don't blame you), you could look at &lt;a href="https://github.com/poteto/hiring-without-whiteboards"&gt;companies that hire without whiteboard interviews&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm not particularly gifted with algorithms. Throughout the interview process I'll try to complete one to five algorithms a day. I really like practicing on &lt;a href="https://binarysearch.com/"&gt;Binary Search&lt;/a&gt;. &lt;a href="https://leetcode.com/"&gt;LeetCode&lt;/a&gt; is a popular alternative full of common problems you'll see in interviews. If you're looking for more educational content, YouTube has tons or you could use something like &lt;a href="https://www.algoexpert.io"&gt;AlgoExpert&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Being consistent will go a long way here. Do as much as you can daily. Even if it's a only single question, it'll help you in the long wrong.&lt;/p&gt;

&lt;p&gt;Once you're ready to start interviewing in person, you can &lt;a href="https://interviewing.io/"&gt;book a mock interview&lt;/a&gt;. It'll help you gain some confidence. I've never done this but I think it would've helped me. I once cancelled an algorithm interview 30 minutes before it was supposed to start because I had a panic attack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Having a Portfolio
&lt;/h2&gt;

&lt;p&gt;This might not be necessary but I love me a good portfolio. I've had interviews where people brought up something I wrote about on my website. It's a nice way to break the ice and connect with the folks on the other side of the process.&lt;/p&gt;

&lt;p&gt;Having your own website makes it easier for folks to get another lens into who you are as a developer. Josh Comeau has a great &lt;a href="https://www.joshwcomeau.com/effective-portfolio/"&gt;resource on how to make an effective portfolio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Keep in mind this is optional, but it can be a fun way for you to express yourself and tinker with smaller coding projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fresh Perspectives
&lt;/h2&gt;

&lt;p&gt;One of the things I like the most about reading is that I get the perspective of other people. There is &lt;em&gt;a lot&lt;/em&gt; of content available online related to job interviews. Here are a few resources that I've found helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://thetechresume.com/"&gt;The Tech Resume Inside Out&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Having a great resume is extremely important in the age of job screeners&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jarednielsen.gumroad.com/l/big-o"&gt;The Little Book of Big O&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A great book for grokking time and space complexity&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://technicalinterviews.dev/"&gt;De-Coding the Technical Interview Process&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;This book covers the entire interview process from start to finish&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.learninpublic.org/"&gt;The Coding Career Handbook&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;From the job hunt to becoming a senior engineer, this book covers the entire career path&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;If you're up for it, you can read &lt;a href="https://www.crackingthecodinginterview.com/"&gt;Cracking the Coding Interview&lt;/a&gt;. That book bored the heck out of me so I found alternative resources. In the end, if you're expecting algorithms, reading won't prepare you better than practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Being Patient and Picky
&lt;/h2&gt;

&lt;p&gt;As long as it's financially viable, I try to spread out my job search as much as I can. Finding companies, practicing, &lt;em&gt;and&lt;/em&gt; interview is a lot to do at once. In the past, I've ended up doing 10 interviews in a single week. It's exhausting. If you're working on top of all of this, you might need to take up meditation as a habit.&lt;/p&gt;

&lt;p&gt;If time is on your side, then you can be picky too. Rank your company list by your desire to work there. Start by applying to your top companies. Get through those then keep plugging along until you get an offer you're happy with!&lt;/p&gt;

&lt;p&gt;I know that being patient and picky is a privilege that we won't all have. If you need something fast, don't feel bad if you end up leaving after a short period of time because something better came along. The job hunt is about finding a place to work where you feel fulfilled. You always need to do what's best for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Your Process
&lt;/h2&gt;

&lt;p&gt;The job search has always been a stressful experience for me. Building my own process around the search has helped me control my nerves. I even have fun with certain parts of the experience now.&lt;/p&gt;

&lt;p&gt;This probably won't be the last time you apply for jobs so developing your own process will make it easier next time you have to do it. Hopefully some of the resources I've shared are helpful for you!&lt;/p&gt;

&lt;p&gt;If you have any questions or comments, feel free to &lt;a href="//mailto:amorriscode@gmail.com"&gt;reach out to me&lt;/a&gt;. Good luck with your search!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Rest vs. GraphQL: A Critical Review</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Wed, 18 Aug 2021 16:06:09 +0000</pubDate>
      <link>https://dev.to/amorriscode/rest-vs-graphql-a-critical-review-290b</link>
      <guid>https://dev.to/amorriscode/rest-vs-graphql-a-critical-review-290b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally posted on the &lt;a href="https://wewatch.tech/posts/rest-vs-graphql"&gt;We Watch Tech website&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This week at &lt;a href="https://monthly.com"&gt;work&lt;/a&gt;, an engineer proposed that we start putting effort into ensuring our backend endpoints follow RESTful practices. The team was excited by the idea. Our endpoints don't currently follow any spec, RESTful or otherwise. You never know what you're going to get.&lt;/p&gt;

&lt;p&gt;This proposal reminded me that I've had a talk on my YouTube watchlist for a while. An opinionated, critical view comparing REST and GraphQL. I've enjoyed the GraphQL developer experience in the past. I may be susceptible to &lt;a href="https://en.wikipedia.org/wiki/Shiny_object_syndrome"&gt;shiny object syndrome&lt;/a&gt;, but there's clear pros to using GraphQL... right?&lt;/p&gt;

&lt;p&gt;REST and GraphQL aren't actually the same thing. Z points out that REST is an &lt;strong&gt;architectural style&lt;/strong&gt; while GraphQL is a &lt;strong&gt;language and framework&lt;/strong&gt;. One is more like a suggestion while the other strict and tangible. Both of them help us create a communication layer between our distributed systems. Or, as Z suggests, we'll call them API paradigms for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  A World of Constraints
&lt;/h2&gt;

&lt;p&gt;One of my favourite parts of Z's talk is when he talks about constraints. When making any technical decision we should be looking at the constraints of our system. It seems obvious but defining your constraints can be quite challenging. They're bound to evolve as your systems do as well.&lt;/p&gt;

&lt;p&gt;No matter what solutions we decide on, our choice should always a be a function of our constraints. Z gives a great example of someone who builds a colonial home simply because they like colonial houses. Well, those houses were built because of colonial constraints. Just because you can do something doesn't mean you should.&lt;/p&gt;

&lt;h3&gt;
  
  
  Constraints Imply Properties
&lt;/h3&gt;

&lt;p&gt;Whatever constraints we build &lt;em&gt;into&lt;/em&gt; our system, we can derive certain properties.&lt;/p&gt;

&lt;p&gt;Having a decoupled client and server &lt;em&gt;implies&lt;/em&gt; two codebases that can evolve separately. Having a stateless server &lt;em&gt;implies&lt;/em&gt; that your server is reliable and scaleable. Having a stateless server decoupled from our client will ultimately give us a codebase with reliability, scalability, and evolvability built in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Properties of Distributed Systems and Ecosystems
&lt;/h2&gt;

&lt;p&gt;So, if constraints imply properties, what properties should we care about? This will also depend on your situation. Z does suggest a few properties to consider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed System Properties
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Simplicity&lt;/li&gt;
&lt;li&gt;Modifiability&lt;/li&gt;
&lt;li&gt;Visibility&lt;/li&gt;
&lt;li&gt;Portability&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Discoverability&lt;/li&gt;
&lt;li&gt;Type-safety&lt;/li&gt;
&lt;li&gt;Developer experience&lt;/li&gt;
&lt;li&gt;Cost effectivity&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Distributed Ecosystem Properties
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Community&lt;/li&gt;
&lt;li&gt;Tooling&lt;/li&gt;
&lt;li&gt;Ecosystem maturity&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;li&gt;Enterprise readiness&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For any system you're architecting, you'll want to pick the properties you care most about and optimize for those. It's rare that any one solution checks all the boxes.&lt;/p&gt;

&lt;p&gt;Every team is going to have different types of constraints. From business (customer or product requirements) to cultural (resources or knowledge). They will also be optimizing for different properties. Because of this, there will never be a clear winner for arguments like REST vs. GraphQL.&lt;/p&gt;

&lt;p&gt;That won't stop us from arguing about it though, will it? Let the battle commence!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Weigh In
&lt;/h2&gt;

&lt;p&gt;There are two contenders in this fight. REST is old. Tried and true but starting to show its age in the ring. GraphQL has a spring in its step. But sometimes rookies make simple mistakes. This is what Z has to say about the pros and cons for each solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scales indefinitely&lt;/li&gt;
&lt;li&gt;Great performance (thanks HTTP2)&lt;/li&gt;
&lt;li&gt;Tried and true&lt;/li&gt;
&lt;li&gt;Affordance-centric (API is expressed as structured messages)&lt;/li&gt;
&lt;li&gt;Server-driven&lt;/li&gt;
&lt;li&gt;Decoupled client and server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Huge barrier to entry (difficult to master, etc.)&lt;/li&gt;
&lt;li&gt;Challenging mindset shift from SOAP to REST&lt;/li&gt;
&lt;li&gt;Poor (or no) tooling for clients&lt;/li&gt;
&lt;li&gt;No framework or tooling guidance&lt;/li&gt;
&lt;li&gt;Requires discipline&lt;/li&gt;
&lt;li&gt;Even hard for experts to get it right&lt;/li&gt;
&lt;li&gt;Hard to keep consistent&lt;/li&gt;
&lt;li&gt;Hard to govern&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GraphQL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to start with&lt;/li&gt;
&lt;li&gt;Easy to produce and consume&lt;/li&gt;
&lt;li&gt;Lots of hand-holding&lt;/li&gt;
&lt;li&gt;Contract-driven&lt;/li&gt;
&lt;li&gt;Built-in introspection&lt;/li&gt;
&lt;li&gt;Easy to keep consistent&lt;/li&gt;
&lt;li&gt;Easy to govern&lt;/li&gt;
&lt;li&gt;Closer to SOAP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ignores problems of distributed systems&lt;/li&gt;
&lt;li&gt;Queries can be suboptimal&lt;/li&gt;
&lt;li&gt;Bikeshedding age old solutions (caching, etc.)&lt;/li&gt;
&lt;li&gt;DIY scaling and performance&lt;/li&gt;
&lt;li&gt;Ignores hard work done by HTTP (&lt;code&gt;POST&lt;/code&gt; for everything!)&lt;/li&gt;
&lt;li&gt;JSON all the things&lt;/li&gt;
&lt;li&gt;Lack of ecosystem maturity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Clear Winner
&lt;/h2&gt;

&lt;p&gt;There isn't one. Both of the options have plenty of pros and cons. Like everything in the world of software, there are many ways to skin an eggplant.&lt;/p&gt;

&lt;p&gt;If you're looking to make a decision between REST and GraphQL, it might not be an easy one. Start by narrowing down the properties that are most important to you and work your way back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where REST Wins
&lt;/h3&gt;

&lt;p&gt;If you're looking to build a system for the long term. REST isn't a new idea. It's been battle tested. There are standards built around important things like authentication, caching, and rate limiting. It has scalability in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where GraphQL Wins
&lt;/h3&gt;

&lt;p&gt;The communication between your frontend and backend are simple. Or if you want a data-driven approach to the API paradigm. Also, the developer experience is pretty darn enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  So-Called REST
&lt;/h2&gt;

&lt;p&gt;All of the information covered this far is useful, but it wasn't the most mind blowing for me. You probably don't have to search to hard to see a lot of this covered elsewhere on the interwebs.&lt;/p&gt;

&lt;p&gt;One of the cons Z listed for REST piqued my curiosity. It was the fact that there is a huge barrier to entry. I've seen "RESTful practices" used a lot in my career so far. I thought I &lt;em&gt;knew&lt;/em&gt; REST. It turns out, I've seen more &lt;em&gt;so-called&lt;/em&gt; REST than anything else.&lt;/p&gt;

&lt;p&gt;Here's a quote written in 2008 by &lt;a href="https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;Roy Fielding&lt;/a&gt;(he created REST by the way):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What needs to be done to make the REST architectural style clear on the notion that hypertext is a constraint? In other words, if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period. Is there some broken manual somewhere that needs to be fixed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've never actually seen a REST API that reached &lt;a href="https://restfulapi.net/richardson-maturity-model/#level-three"&gt;level three on the Richardson Maturity Model&lt;/a&gt;. One that has true discoverability and uses &lt;a href="https://restfulapi.net/hateoas/"&gt;hypermedia as the engine of application state&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But does that matter?&lt;/p&gt;

&lt;p&gt;Z argues that GraphQL is far better than a so-called REST API. The proposal at work this week was for a &lt;em&gt;so-called&lt;/em&gt; REST API and I'm not mad about it. We're optimizing for properties like simplicity, portability, discoverability, and developer experience. In our current system, those properties are sadly lacking.&lt;/p&gt;

&lt;p&gt;There's a lot of tooling out there that makes REST more accessible these days too. From the &lt;a href="https://swagger.io/specification/"&gt;OpenAPI specification&lt;/a&gt; to things like &lt;a href="https://flask-restful.readthedocs.io/en/latest/"&gt;Flaks RESTful&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Even with that in mind, I can't help but think about GraphQL. Can we optimize for the properties listed about while solving other problems clients face like slow and spotty internet?&lt;/p&gt;

&lt;h2&gt;
  
  
  Microservices
&lt;/h2&gt;

&lt;p&gt;When mentioning microservices, I was surprised to hear Z recommend REST. He says it is almost as if they were born to be used together. What about &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt;? Or an &lt;a href="https://en.wikipedia.org/wiki/Event-driven_architecture"&gt;event-driven architecture&lt;/a&gt;? I think there's more to the story here.&lt;/p&gt;

&lt;h2&gt;
  
  
  No Contest
&lt;/h2&gt;

&lt;p&gt;This talk hasn't made me more confident in my ability to implement a RESTful API. It hasn't shown me that either option is the obvious solution for my API communication woes.&lt;/p&gt;

&lt;p&gt;We will forever have to decide between many options to solve our problems. Framing these decisions based on the constraints and desired properties of our systems will always lead to better results.&lt;/p&gt;

&lt;p&gt;Even though there's no clear winner to this fight, there are a ton of great resources about REST, GraphQL, and APIs. Here are a few worth looking at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://restfulapi.net/"&gt;REST API Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphql.org/learn/"&gt;Introduction to GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/blog/graphql/basics/graphql-vs-rest/"&gt;GraphQL vs. REST from Apollo GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.philosophicalhacker.com/post/rest-in-2018"&gt;The so-called 'RESTful' web in 2018 and beyond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/graphql"&gt;GitHub's GraphQL documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adidas.gitbook.io/api-guidelines"&gt;adidas' API Guidelines*&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/good-api/rest-vs-graphql-a-critical-review-5f77392658e7"&gt;Z's own writeup about his talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*I never thought I'd be reading API guidelines from a shoe/fashion company. It turns out &lt;a href="https://github.com/adidas" rel="”noreferrer"&gt;they have a decent amount of open source projects&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>rest</category>
      <category>api</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>Convergent Evolution</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Tue, 18 Aug 2020 19:11:51 +0000</pubDate>
      <link>https://dev.to/amorriscode/convergent-evolution-25j4</link>
      <guid>https://dev.to/amorriscode/convergent-evolution-25j4</guid>
      <description>&lt;p&gt;&lt;a href="https://wewatch.tech/posts/convergent-evolution"&gt;I originally published this on We Watch Tech&lt;/a&gt;. It's my side project that helps me think more deeply about great tech talks.&lt;/p&gt;

&lt;p&gt;Have you watched a good talk lately? Let me know!&lt;/p&gt;




&lt;p&gt;This talk came on my radar when &lt;a href="https://mobile.twitter.com/swyx"&gt;Shawn Wang&lt;/a&gt; &lt;a href="https://mobile.twitter.com/swyx/status/1291021155818643456"&gt;tweeted about it&lt;/a&gt;. He said it was one of his favourite talks from React Rally 2017 so that seemed right up my alley.&lt;/p&gt;

&lt;p&gt;I'd be lying to you if I said I knew much anything about Elm. I've heard of it, sure. But that's about it. So what better than an introduction from the creator himself?&lt;/p&gt;

&lt;p&gt;Evan takes us through a comparison between React and Elm. I am familiar with React, so the comparison helped me a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convergent Evolution (Who Did It Better?)
&lt;/h2&gt;

&lt;p&gt;Before we get into the React/Elm comparison, Evan introduces the concept of convergent evolution. So what is that exactly? It's the independent evolution of similar traits in different organisms.&lt;/p&gt;

&lt;p&gt;In the wild we can compare birds and bees. Both of these organisms have wings. They both can fly but the similarities mostly stop there.&lt;/p&gt;

&lt;p&gt;As developers we often look at two similar things and start to ask ourselves, which is better? We look at the implementation details and we start to pick sides. Evan prefers to take a step back and look at the design as a whole. How well do the features serve the overall design?&lt;/p&gt;

&lt;h2&gt;
  
  
  Elm vs. React
&lt;/h2&gt;

&lt;p&gt;While the folks at Facebook were being inspired by XHP, Evan was working on his thesis. They separately came to a lot of the same conclusions. Convergent evolution. One is not necessarily better than the other. Remember, it's not about the implementation details.&lt;/p&gt;

&lt;p&gt;So let's take a look at some of these converging ideas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style
&lt;/h3&gt;

&lt;p&gt;React, or at least JavaScript, uses a syntax that is similar to C. Evan makes a good point when he says they chose to onboard folks with familiarity. People are comfortable with the syntax so it makes it easier to adopt.&lt;/p&gt;

&lt;p&gt;Elm uses a syntax that is more like &lt;a href="https://en.wikipedia.org/wiki/ML_%28programming_language%29"&gt;ML (Meta Language)&lt;/a&gt;. There was a deliberate choice in the style. It fit better with the overall design of Elm. The tradeoffs for onboarding with familiarity were worth it for Evan.&lt;/p&gt;

&lt;p&gt;During the talk I saw Elm code for the first time and it wasn't much like any programming language I'd seen, or at least worked with. While I do prefer the C-like syntax (because I'm used to it) &lt;a href="https://elm-lang.org/docs/from-javascript"&gt;there is a nice comparison with JavaScript on the Elm site&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual DOM
&lt;/h3&gt;

&lt;p&gt;A virtual DOM is a tree of custom objects that represent a real DOM. We utilize a virtual DOM because we can manipulate these custom objects much faster than we can manipulate the DOM itself. We can change our virtual DOM and then use a &lt;a href="https://reactjs.org/docs/reconciliation.html"&gt;reconciliation algorithm&lt;/a&gt; to update the real DOM with just the changes we've made.&lt;/p&gt;

&lt;p&gt;Both React and Elm are able to incrementally update the DOM because of this technique. It allows us to build our reactive user interfaces. &lt;a href="https://elm-lang.org/news/blazing-fast-html"&gt;Elm boasts better performance&lt;/a&gt; because of how it does diffing. The purity and immutability helps—we'll touch on that later.&lt;/p&gt;

&lt;p&gt;I've seen a lot of complaints about JSX. If you're in the anti-JSX camp, perhaps you'd prefer to play with Elm. There's no special syntax when it comes to working with Elm's virtual DOM! It's Elm all the way down. I don't mind having HTML in my JavaScript but I can understand the appeal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unidirectional Flow
&lt;/h3&gt;

&lt;p&gt;It's very common to see unidirectional flow in React. It's encouraged. In Elm, it's a first class citizen. Legend has it that early Elm programmers kept seeing the same patterns in their code. The unidirectional flow naturally arose from the language itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jG0efRZ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/elm-architecture.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jG0efRZ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/elm-architecture.svg" alt="The Elm Architecture" width="729" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Elm Architecture you can clearly see the unidirectional flow. It's a very functional pattern. Inside of Elm there is a model. It captures all the details about your application as data. We also have the view. This is a function that outputs your HTML. When users interact with the HTML, messages are sent and an update function handles changing the model.&lt;/p&gt;

&lt;p&gt;At Facebook they were using a similar architecture pattern called &lt;a href="https://facebook.github.io/flux"&gt;Flux&lt;/a&gt;. The popular library Redux even &lt;a href="https://redux.js.org/introduction/prior-art/#elm"&gt;got inspiration from Elm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sJxsDlal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/flux.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sJxsDlal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/flux.svg" alt="Flux Application Architecture" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both of these patterns have similarities. &lt;a href="https://twitter.com/andrestaltz"&gt;André Staltz&lt;/a&gt; has &lt;a href="https://staltz.com/unidirectional-user-interface-architectures.html"&gt;written a great blog post&lt;/a&gt; about unidirectional architectures so I recommend you give that a read. A major difference between Flux and the Elm Architecture is the fact that everything in the Elm Architecture is hierarchical. Components aren't just on the "View" layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Functional OOP
&lt;/h3&gt;

&lt;p&gt;The unidirectional flow is a very functional pattern. In React however, we can almost think of components as objects. They hold their own local state. They have methods for updating that state. This can lead to some OOP patterns that simply can't exist in Elm because it is a functional language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutability
&lt;/h3&gt;

&lt;p&gt;Immutability is another area where Elm simply shines. When your data cannot be changed it is easier to write programs that behave as we expect. This leads to more maintainable code. In Elm's case, it also makes it very cheap to determine if two things are the same. Combined with purity (functions always return the same output, given a certain input) this lets Elm applications avoid extra work. That's one reason Elm is so fast.&lt;/p&gt;

&lt;p&gt;React will let you use any style of data management you want, including mutation. That means these performance benefits don't come baked in. &lt;a href="https://github.com/kolodny/immutability-helper#overview"&gt;There are tools&lt;/a&gt; to help with this but again, Elm just makes it simple and pleasant to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Analysis
&lt;/h3&gt;

&lt;p&gt;The last thing we'll look at is static analysis. With React there isn't much to talk about. If you are familiar with linters that's just about the best you get with React.&lt;/p&gt;

&lt;p&gt;Elm is a language so there is so much more to offer you out of the box. The &lt;a href="https://elm-lang.org/news/compilers-as-assistants"&gt;compiler is an assistant&lt;/a&gt;. It helps you find edge cases you might have missed. The compiler will even give beginner friendly hints!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pfAWA3TF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/compiler-error.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pfAWA3TF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://wewatch.tech/assets/posts/convergent-evolution/compiler-error.png" alt="An Elm Compiler Error" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Tale of Two Organisms
&lt;/h2&gt;

&lt;p&gt;I'm really excited to take a closer look at Elm and see what it has to offer. The compiler looks extremely promising and there are a lot of other wonderful features (like enforced semantic versioning). The ecosystem seems very tight to an outsider. I think the opinions of Evan have shaped a language with great features that keep the big picture in mind.&lt;/p&gt;

&lt;p&gt;Some might argue that it's unfair to compare a &lt;em&gt;library&lt;/em&gt; to a &lt;em&gt;language&lt;/em&gt;. That said, it's an interesting comparison. I've always found it fascinating when scientific achievements are made at the same time across the globe. I love when different ideas are shared, remixed, and discussed within the tech industry.&lt;/p&gt;

&lt;p&gt;Birds and bees might fly differently but there is no way you can argue that flying isn't &lt;em&gt;good&lt;/em&gt;. React and Elm achieve similar things in different ways. Neither is necessarily better than the other; just different.&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>elm</category>
      <category>react</category>
    </item>
    <item>
      <title>Launch Day</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Mon, 09 Dec 2019 01:46:03 +0000</pubDate>
      <link>https://dev.to/amorriscode/launch-day-1mla</link>
      <guid>https://dev.to/amorriscode/launch-day-1mla</guid>
      <description>&lt;p&gt;Earlier today I was reading a post that &lt;a class="mentioned-user" href="https://dev.to/kimmaida"&gt;@kimmaida&lt;/a&gt; wrote at the start of November called &lt;a href="https://dev.to/kimmaida/7-tips-for-career-advancement-and-personal-fulfillment-5e02"&gt;7 Tips for Career Advancement and Personal Fulfilment&lt;/a&gt;. I'm constantly thinking about how to improve myself and move forward. The article had great tips and it inspired me to write this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Value Finishing Over Starting
&lt;/h2&gt;

&lt;p&gt;Kim talks about setting personal goals. Earlier this year I set a big goal for myself. One that would solve a systemic problem I built in the past.&lt;/p&gt;

&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; starting projects but rarely finish them. A lot of us are probably like this. Something new and shiny comes along and you jump on it. I'd been thinking a lot about creating instead of simply consuming. Because of this, I decided to start valuing &lt;em&gt;finishing over starting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;What does this mean? I simply wouldn't commit to anything big until I finished what I was currently working on.&lt;/p&gt;

&lt;p&gt;This mentality allowed me to &lt;a href="https://anthonymorris.dev"&gt;finish building my new website&lt;/a&gt;, &lt;a href="https://chrome.google.com/webstore/detail/social-media-death-clock/jjmjickedeooblgpimknfghpfffncfhb"&gt;launch my first Chrome extension&lt;/a&gt;, and start studying computer science at an online university.&lt;/p&gt;

&lt;p&gt;Halfway through the year I set out on my biggest project yet. To develop &lt;a href="https://writewithwrabit.com"&gt;an online platform for mental health&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write With Wrabit
&lt;/h2&gt;

&lt;p&gt;Tomorrow that project is finally going to be &lt;a href="https://www.producthunt.com/posts/wrabit"&gt;announced on Product Hunt&lt;/a&gt;. Since Kim mentions &lt;a href="https://dev.to/kimmaida/7-tips-for-career-advancement-and-personal-fulfillment-5e02#3-share-your-wins"&gt;sharing wins&lt;/a&gt; and &lt;a href="https://dev.to/kimmaida/7-tips-for-career-advancement-and-personal-fulfillment-5e02#7-celebrate-milestones"&gt;celebrating milestones&lt;/a&gt; I thought posting here would be okay.&lt;/p&gt;

&lt;p&gt;I'm incredibly proud of the product I developed. Users get to build a daily writing habit in a simple online editor. The more they write, the more we donate to mental health research.&lt;/p&gt;

&lt;p&gt;The product will never make me rich but &lt;em&gt;it might&lt;/em&gt; make a positive difference in the world. That is what makes me proud about it. That is why I wanted to write this post.&lt;/p&gt;

&lt;p&gt;This feels like the biggest win of my life. 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Mental Health?
&lt;/h2&gt;

&lt;p&gt;When I was in high school, I suffered from depression. I dropped out of high school and told myself I would never make it to 25. I felt terribly alone and afraid to get help.&lt;/p&gt;

&lt;p&gt;Thankfully, somehow, I was able to find tools (meditation, writing) that got me to where I am today.&lt;/p&gt;

&lt;p&gt;I know a lot of us are suffering. I kept trying to think of ways I could help. Eventually I thought of &lt;a href="https://writewithwrabit.com"&gt;Wrabit&lt;/a&gt;. A platform to help write daily. A tool to explore the feelings inside you. Something to give people the confidence to express themselves unedited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Day
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/wrabit"&gt;Tomorrow is launch day&lt;/a&gt;. I've done the best I could to make the MVP what it is today. &lt;a href="https://github.com/writewithwrabit/captains-log"&gt;It's been in progress for 38 days&lt;/a&gt; and is completely &lt;a href="https://github.com/writewithwrabit"&gt;open source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's not the best code I have ever written. I didn't use test driven development. I took shortcuts so that I could make sure I launched the thing. Again, finishing over starting.&lt;/p&gt;

&lt;p&gt;With all that being said, I have never been more proud of myself. This is just the beginning.&lt;/p&gt;

&lt;p&gt;Thanks for taking a look and I hope to share more of the journey with you in the future!&lt;/p&gt;

</description>
      <category>writing</category>
      <category>opensource</category>
      <category>sideprojects</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>19 Takeaways From React Conf 2019</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Sun, 27 Oct 2019 17:11:03 +0000</pubDate>
      <link>https://dev.to/amorriscode/19-takeaways-from-react-conf-2019-2m36</link>
      <guid>https://dev.to/amorriscode/19-takeaways-from-react-conf-2019-2m36</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://blog.anthonymorris.dev/19-takeaways-from-react-conf-2019" rel="noopener noreferrer"&gt;Originally posted on my personal blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well &lt;a href="https://conf.reactjs.org" rel="noopener noreferrer"&gt;React Conf&lt;/a&gt; ⚛️ is officially over. There were a lot of great talks, human beings, activities, and of course food. I'm still digesting the whole event but, as far as conferences go, this has been the best one I've attended so far.&lt;/p&gt;

&lt;p&gt;The developer community can often be intimidating. The volunteers and organizers did an incredible job making everyone at the conference feel welcome. I was impressed at the lengths they went to make us all feel like we belonged. There were even some &lt;em&gt;introvert activities&lt;/em&gt; on the second day. Have you ever painted a minifigure (think &lt;a href="https://www.games-workshop.com/en-CA/Warhammer" rel="noopener noreferrer"&gt;Warhammer&lt;/a&gt;) at a conference? I have now! So for all those involved, thanks!&lt;/p&gt;

&lt;p&gt;This post is going to be a reflection of &lt;em&gt;some&lt;/em&gt; of my favourite React Conf takeaways. Every single talk was worth watching, so I recommend you check out the recordings for &lt;a href="https://www.youtube.com/watch?v=UxoX2faIgDQ" rel="noopener noreferrer"&gt;day one&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=JDDxR1a15Yo" rel="noopener noreferrer"&gt;day two&lt;/a&gt;. I've included timestamps to all the talks at the bottom of the post.&lt;/p&gt;

&lt;p&gt;You might be surprised by some of the items on the list. I was too! Not everything is technical but there is a common thread weaving throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Developer Experience In Service of User Exeperience
&lt;/h2&gt;

&lt;p&gt;After &lt;a href="https://twitter.com/tomocchino" rel="noopener noreferrer"&gt;Tom Occhino&lt;/a&gt; said it, I couldn't stop thinking about it. I couldn't stop seeing it in all the talks. I realized what I love so much about developer tools and the frontend.&lt;/p&gt;

&lt;p&gt;React aims to create a developer experience that allows us to &lt;strong&gt;easily&lt;/strong&gt; learn to do powerful things, to launch and iterate by being &lt;strong&gt;productive&lt;/strong&gt;, and to &lt;strong&gt;scale&lt;/strong&gt; the software we make. These things alone make me like React. I feel like Facebook is doing a pretty good job on delivering.&lt;/p&gt;

&lt;p&gt;What is the point of all this though? Well, that's simple. It's to serve the user experience. We do what we do so that we can make our &lt;em&gt;users productive&lt;/em&gt;. We should aim to help them get what they want done in elegant ways. Although what we help them achieve may not always be simple behind closed doors, it should always &lt;em&gt;feel that way&lt;/em&gt; to them.&lt;/p&gt;

&lt;p&gt;Because React is a &lt;em&gt;gateway techhnology with 63% of JavaScript developers&lt;/em&gt; using it, the team are taking things like community very seriously. They have adopted the &lt;a href="https://www.contributor-covenant.org/" rel="noopener noreferrer"&gt;Contributor Covenant&lt;/a&gt; and are welcoming criticism. As a community we should be able to accept criticism without having to defend ourselves. Elbert Hubbard said &lt;strong&gt;"To avoid criticism say nothing, do nothing, be nothing."&lt;/strong&gt; What React is doing, and why, is important. This will naturally draw in criticism and allow the technology to grow. It will allow us as a community to &lt;em&gt;be better&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Accessiblity and Performance and Concurrent Mode, Oh My!
&lt;/h2&gt;

&lt;p&gt;Have you ever had issues with focus while using React? I have. &lt;a href="https://hacks.mozilla.org/2019/06/indicating-focus-to-improve-accessibility/" rel="noopener noreferrer"&gt;Focus is really important&lt;/a&gt; for many reasons. It helps people navigate their way through a page. This is extremely important for people who don't use a mouse. This topic will come up again later, but it was nice to see the React team wanting to make accessibility baked in.&lt;/p&gt;

&lt;p&gt;One of the things that got me thinking the most during the conference was performance. Facebook has to deal with performance issues that most of us never will, but the lessons they have learned can still be used to &lt;em&gt;make the user experience better&lt;/em&gt;. It doesn't matter how fast a page loads if the perceived performance is slow.&lt;/p&gt;

&lt;p&gt;An example of this is &lt;a href="https://youtu.be/UxoX2faIgDQ?t=3535" rel="noopener noreferrer"&gt;selective hydration&lt;/a&gt; which &lt;a href="https://twitter.com/yuzhiz" rel="noopener noreferrer"&gt;Yuzhi Zheng&lt;/a&gt; explained during her talk. You may have heard of &lt;a href="https://reactjs.org/docs/concurrent-mode-suspense.html#what-is-suspense-exactly" rel="noopener noreferrer"&gt;Suspense&lt;/a&gt; as well, which will improve user experiences all over the web.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concurrent Mode
&lt;/h3&gt;

&lt;p&gt;Imagine making a filterable list tied to a user input. With React, you'd probably have to debounce or throttle your updates to the list unless you're okay with jank.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/concurrent-mode-intro.html#what-is-concurrent-mode" rel="noopener noreferrer"&gt;Concurrent Mode&lt;/a&gt; will enable React apps to be more responsive by giving React the abiility to interupt blocks of lower priority work. This allows things like user input to get more priority over things like re-rendering a list. React will be able to work on several state updates &lt;em&gt;concurrently&lt;/em&gt;. This will help us remove jarring and too frequent DOM updates. It will also allows us to give priority to interactions like hover and text input. We know that users expect these to be handled quickly or else they will feel laggy.&lt;/p&gt;

&lt;p&gt;The React team have &lt;a href="https://reactjs.org/docs/concurrent-mode-patterns.html" rel="noopener noreferrer"&gt;shared many examples of concurrent mode patterns&lt;/a&gt; that I recommend you check out.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. CSS-in-JS-at-FB
&lt;/h2&gt;

&lt;p&gt;I was interested to hear &lt;a href="https://twitter.com/frankyan" rel="noopener noreferrer"&gt;Frank Yan&lt;/a&gt; announce that Facebook is building their own CSS-in-JS library. At first I thought, don't we have enough of them? This gave us an opportunity to learn more about some of the problems Facebook faces at scale and the creative ways they are solving them.&lt;/p&gt;

&lt;p&gt;Maintaining CSS can quickly get out of hand. Let's look at the following example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"red blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Which color will I be?
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, it would be nice if the text would be &lt;em&gt;blue&lt;/em&gt;. That class comes second in the class declaration so we &lt;em&gt;should&lt;/em&gt; be able to expect it to take precedence. But it doesn't. The &lt;code&gt;.red&lt;/code&gt; class comes second in the &lt;em&gt;cascading&lt;/em&gt; style sheet so that's what we end up with. If these classes were in different style sheets, the order in which they are loaded in the page would matter.&lt;/p&gt;

&lt;p&gt;This problem might seem simple with such a naïve example but it can get out of hand quickly. Facebook has aimed to resolve things such as specificity wars, themeability, and accessibility with their new library.&lt;/p&gt;

&lt;p&gt;A couple of interesting specifics from the talk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers can code in pixels but have their work compiled in REMs&lt;/li&gt;
&lt;li&gt;They have created safety by implementing type checks (catch and fix typos, detect and remove unused styles, avoid cross-browser pitfalls)&lt;/li&gt;
&lt;li&gt;Display accessibility errors to developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2Fcd0a3d2185e2f36429d7e5e0cfa2fb00%2F20ef6%2Faccessibility-violation.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2Fcd0a3d2185e2f36429d7e5e0cfa2fb00%2F20ef6%2Faccessibility-violation.webp" alt="Display accessibility errors to developers while they develop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Components can have default styles that can be overidden (including type safety!)&lt;/li&gt;
&lt;li&gt;Rules are deduplicated which allows smaller CSS files (Facebook went from &lt;code&gt;413kb&lt;/code&gt; to &lt;code&gt;74kb&lt;/code&gt; in their recent frontend rewrite)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Atomic CSS
&lt;/h3&gt;

&lt;p&gt;Each class creates a unique property value pair. This is used to &lt;a href="https://youtu.be/UxoX2faIgDQ?t=4939" rel="noopener noreferrer"&gt;optimize the components&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.c0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.c1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.c2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Generated Component (Pre-Optimized)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isBlue&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Hello World!
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example shows how the CSS is atomic. It also shows how the color of a span could be set with props. However, this code gets optimized further.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The styles block is no longer needed&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isBlue&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c0 &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c1 &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c2 &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Hello World!
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At of these things are extremely interesting and I look forward to them releasing their library in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Data-Driven JavaScript
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered how to make your pages feel faster? Become interactive sooner? Of course you have! &lt;a href="https://twitter.com/catchingash" rel="noopener noreferrer"&gt;Ashley Watkins&lt;/a&gt; has too. She really got me thinking how I could use adjust my data-fetching approach to make a better user experience. I had already started to get excited about Relay but she added fuel to the fire.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phased Code Splitting
&lt;/h3&gt;

&lt;p&gt;You can bet the folks at Facebook have been working hard to ensure their FMP is as fast as possible. One of the ways they are doing this is "Phased Code Splitting".&lt;/p&gt;

&lt;p&gt;With this approach, you can take a single blocking download and deliver it in phases. For example, if you consider the Facebook post, you could break it into 3 phases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loading&lt;/li&gt;
&lt;li&gt;Display&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each of these phases can have their own code fetch and render. All the data required for the FMP can be fetched at the same time the loading phase fetches its code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F7464ffbf06e6b294f86a96f1c91e6c01%2Fc131d%2Fphased-code-splitting.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F7464ffbf06e6b294f86a96f1c91e6c01%2Fc131d%2Fphased-code-splitting.webp" alt="Split your single blocking downloads into phases for faster render times"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Time to First Meaningful painted
&lt;/h3&gt;

&lt;p&gt;To make your user experience as good as it can be, you should be thinking about &lt;a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint" rel="noopener noreferrer"&gt;first meaningful paint&lt;/a&gt;. This is basically how long it takes for the primary content to appear on the page. There are many metrics you can look at and measure to improve your load times, but FMP sticks out.&lt;/p&gt;

&lt;p&gt;Relay allows you to make &lt;em&gt;streamed queries&lt;/em&gt; with GraphQL. This will allow you to mark certain data as critical and other data as less critical. You can then get the most important stuff from the server first and show that while fetching the rest of your data. With this approach, you can render content as it arrives!&lt;/p&gt;

&lt;h3&gt;
  
  
  Data-Driven Code Splitting
&lt;/h3&gt;

&lt;p&gt;This one blew my mind a bit. Relay is powerful, no question there. Relay has a new feature that lets you expand your queries to express which component code you need to render specific data types. 🤯 You can think of your code &lt;em&gt;as data&lt;/em&gt;. As the server is resolving your GraphQL query, it can let the client know what component code it is going to need to download so it can get it faster!&lt;/p&gt;

&lt;p&gt;Ashley's talk was pretty incredible and she promised that these things are just the beginning. I haven't used Relay yet but I'm excited to get started and I bet you will be too (especially when you hear more about what it can do).&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Solving World Hunger
&lt;/h2&gt;

&lt;p&gt;Day one started of with a great group of talks from people that work at Facebook. They were exciting from the technical perspective. We got to see a lot of upcoming features in the ecosystem to help us improve the user experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/_Tany_" rel="noopener noreferrer"&gt;Tania Papazafeiropoulou&lt;/a&gt; switched gears a little bit to educate the attendees about world hunger and a cool product she's working on called &lt;a href="https://olioex.com" rel="noopener noreferrer"&gt;OLIO&lt;/a&gt;. It helps people share food instead of wasting it and its powered by, you guessed it, React.&lt;/p&gt;

&lt;p&gt;It was upsetting to find out that &lt;strong&gt;1/3 of all food produced is wasted&lt;/strong&gt;. On top of that, we could solve world hunger with just &lt;strong&gt;25%&lt;/strong&gt; of food waste from the US, UK, and Europe. These sobering statistics make solving world hunger possible and it was awesome to hear about a team working to do that.&lt;/p&gt;

&lt;p&gt;This talk didn't get me hyped about new React features but it reinforced what makes React great. React (and React Native) enabled Tania's team to build out their product quickly and start making a positive impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Making REST Feel Better (and Safe)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Representational_state_transfer" rel="noopener noreferrer"&gt;RESTful APIs&lt;/a&gt; aren't a new hot 🔥 concept. They were formally defined in 2000 and have been used with success since then. That being said, REST does have some things that make it challenging.&lt;/p&gt;

&lt;p&gt;Facebook answered these challenges with GraphQL. GraphQL gives us an understandable definition of our data. It gives the client the power to get only what it needs. This is a pretty great way to get faster render times as you don't have to download as much data!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/tejaskumar_" rel="noopener noreferrer"&gt;Tejas Kumar&lt;/a&gt; summed up the differences quite nicely (see &lt;a href="https://youtu.be/UxoX2faIgDQ?t=9586" rel="noopener noreferrer"&gt;his talk&lt;/a&gt; for more depth):&lt;/p&gt;

&lt;h4&gt;
  
  
  REST
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;❌ No formal spec&lt;/li&gt;
&lt;li&gt;❌ Guessing games (will an unallowed request respond with &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, or &lt;code&gt;404&lt;/code&gt;?)&lt;/li&gt;
&lt;li&gt;❌ Meaningless conversations&lt;/li&gt;
&lt;li&gt;❌ No contractual agreements&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  GRAPHQL
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;✅ Formal spec&lt;/li&gt;
&lt;li&gt;✅ No guessing games&lt;/li&gt;
&lt;li&gt;✅ Meaningful discussions (things that impact users)&lt;/li&gt;
&lt;li&gt;✅ Strong contractual agreements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many of us love GraphQL but sometimes it isn't an option for our APIs. Tejas and his team have &lt;a href="https://github.com/contiamo/restful-react" rel="noopener noreferrer"&gt;developed a tool to take some of the pitfalls away from REST&lt;/a&gt;. It includes code-generation from Swagger and OpenAPI specs.&lt;/p&gt;

&lt;p&gt;I don't believe I do Tejas justice but his talk left a lasting impression on me. Seriously, &lt;a href="https://youtu.be/UxoX2faIgDQ?t=9586" rel="noopener noreferrer"&gt;go watch his talk&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Under React's Hood (Building a Custom Renderer)
&lt;/h2&gt;

&lt;p&gt;If you've ever given a demo of something you coded before, you know it often goes wrong. &lt;a href="https://twitter.com/sophiebits" rel="noopener noreferrer"&gt;Sophie Alpert&lt;/a&gt; took the risk and educated us on what it takes to build a React renderer.&lt;/p&gt;

&lt;p&gt;I don't consider myself a React expert (&lt;em&gt;yet&lt;/em&gt; 😅). I have never looked at the React codebase. I always assumed it would be beyond me. As I continue to learn and master React, I will continue digging deeper and will eventually get to the codebase itself. Sophie made it seem a lot less intimidating as she built her own custom render &lt;em&gt;in real time&lt;/em&gt; on the React Conf stage.&lt;/p&gt;

&lt;p&gt;Other than learning how awesome Sophie is, I feel like I came away with a small understanding of how React renderers work. She didn't leave me scratching my head. Everything was explains simply but also demonstrated clearly. What more can you ask for from a live coding demo?&lt;/p&gt;

&lt;p&gt;May the Demo Gods forever be in your favour Sophie!&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Localization (It's Important!)
&lt;/h2&gt;

&lt;p&gt;As a native English speaker, I have to admit that localization isn't the first thing that comes to my mind when developing a product. Thankfully I am aware of this and am going to take it more seriously in the future.&lt;/p&gt;

&lt;p&gt;I think localization often gets missed because we focus on users who are just like us. There is no reality where your users will be exactly like you! That is why we need to do user testing, get user feedback, and be more inclusive to all types of humans.&lt;/p&gt;

&lt;p&gt;Last year, &lt;a href="https://twitter.com/tesseralis" rel="noopener noreferrer"&gt;Nat Alison&lt;/a&gt; asked the question "is React translated yet?" When she originally posed the question, the answer was no.&lt;/p&gt;

&lt;p&gt;Why does this matter? Well, Nat put it pretty nicely. If React is only accessible to English speaking people, how many people aren't able to use the tools to build amazing products? How much are we losing out on by only having English speakers shape our digitl world? Only &lt;strong&gt;20% of the world's population speaks English&lt;/strong&gt;. If we don't help others use React, we all suffer!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F783d7cb7d47c5ccde06a1e5afd3f9ce5%2F8993f%2Fis-react-translated-yet.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F783d7cb7d47c5ccde06a1e5afd3f9ce5%2F8993f%2Fis-react-translated-yet.webp" alt="React docs have been translated to many languages but lots of work remains"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is incredible what Nat and thousands of people have accomplished in the last year. There is still more work todo and &lt;a href="https://isreacttranslatedyet.com/" rel="noopener noreferrer"&gt;you can help if you are bilingual&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  9. The Accessiblity Marathon
&lt;/h2&gt;

&lt;p&gt;Just like localization, accessibility can be difficult. You have to think differently when you are developing for accessibility. You have to think about a broader audience, about people who might be &lt;em&gt;different&lt;/em&gt; than you. Sometimes that is difficult but we can all do it.&lt;/p&gt;

&lt;p&gt;Running a marathon 🏃🏻‍♂️ is another example of something that can be difficult. According to RunRepeat, &lt;a href="https://runrepeat.com/research-marathon-performance-across-nations" rel="noopener noreferrer"&gt;1,298,725&lt;/a&gt; people finished a marathon in 2018. They didn't wake up with the ability to do that. They started small and worked their way up to it.&lt;/p&gt;

&lt;p&gt;That's how we can approach accessibility. Taking an approach like this will remove some of the feeling of overwhelm if you are starting from square one. One of my favourite things about React Conf was learning about software development, and the world, from new viewpoints. &lt;a href="https://twitter.com/BrittanyIRL" rel="noopener noreferrer"&gt;Brittany Feenstra&lt;/a&gt; was one of the people who helped me expand my perspective and I want to think more about accessibility going forward.&lt;/p&gt;

&lt;p&gt;I'm not going to complete the accessibility marathon over night but I can do a little more each day going forward. Thankfully, there are a lot of &lt;a href="https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd" rel="noopener noreferrer"&gt;good&lt;/a&gt; &lt;a href="https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd" rel="noopener noreferrer"&gt;tools&lt;/a&gt; to &lt;a href="https://github.com/FormidableLabs/eslint-plugin-react-native-a11y" rel="noopener noreferrer"&gt;help&lt;/a&gt; me along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. You Don't Need Redux (Right?)
&lt;/h2&gt;

&lt;p&gt;In 2019 there are &lt;a href="https://reactjs.org/docs/react-component.html#setstate" rel="noopener noreferrer"&gt;many&lt;/a&gt; &lt;a href="https://reactjs.org/docs/context.html" rel="noopener noreferrer"&gt;different&lt;/a&gt; &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;ways&lt;/a&gt; &lt;a href="https://github.com/reduxjs/redux" rel="noopener noreferrer"&gt;to&lt;/a&gt; &lt;a href="https://github.com/jamiebuilds/unstated" rel="noopener noreferrer"&gt;manage&lt;/a&gt; &lt;a href="https://github.com/mobxjs/mobx" rel="noopener noreferrer"&gt;React&lt;/a&gt; &lt;a href="https://www.apollographql.com/docs/react/data/local-state/" rel="noopener noreferrer"&gt;state&lt;/a&gt; (even &lt;a href="https://easy-peasy-v3.now.sh/" rel="noopener noreferrer"&gt;vegetarian friendly options&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;With so many options out there it can be hard to know what is the right choice. Unfortunately the &lt;em&gt;right&lt;/em&gt; choice will depend on you. Just remember, &lt;em&gt;developer experience is in service of user experience&lt;/em&gt;. Knowing that, I liked to approach my state management by going as simple as possible and changing as I outgrew my original decision.&lt;/p&gt;

&lt;p&gt;I am very happy that React has so many options built within it now. With Context and Hooks, you can do quite a lot without ever needing to pull in another dependancy.&lt;/p&gt;

&lt;p&gt;In order to move fast and break things, you have to be willing to throw out work you've done before. You need to fall in love with the refactor and move past decisions that worked for you when your product was different. I think the many options for React state reflect this. Some of the options require a lot of boiler plate, some don't. Some are baked in, some aren't. Pick what feels right for you now and adapt later if you need to.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Time Travel To 1999
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtu.be/UxoX2faIgDQ?t=30919" rel="noopener noreferrer"&gt;The last talk of the day&lt;/a&gt; had me interested from the title alone. What was it like to program in 1999? I was only nine years old then. Some people were coding by nine. I was not one of them. 😢&lt;/p&gt;

&lt;p&gt;This talk was another one that really needs to be watched. &lt;a href="https://twitter.com/leeb" rel="noopener noreferrer"&gt;Lee Byron&lt;/a&gt; delivered a well-polished gem. He walked us through a time when PHP and the LAMP stack were the go to tools for web development. For those that weren't coding in 1999, he explained the evolution that lead Facebook to develop tools like React, GraphQL, and Relay. For those who were coding then, nostalgia.&lt;/p&gt;

&lt;p&gt;I have always respected the engineering work done at Facebook but this talk put everything in perspective. Working with React has felt like a privilege and now I know where that privilege came from. I'm inspired by the work people like Lee have and continue to do for the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Even Dev Tools Are About UX
&lt;/h2&gt;

&lt;p&gt;The theme of the conference continued to be elaborated on as &lt;a href="https://twitter.com/brian_d_vaughn" rel="noopener noreferrer"&gt;Brian Vaughn&lt;/a&gt; kicked off day two. If you build things with React, you've likely used the React Dev Tools. They have definitely helped me dig myself out of messes I've created.&lt;/p&gt;

&lt;p&gt;The React Dev Tools got a full rewrite that gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;New API support&lt;/li&gt;
&lt;li&gt;New UX features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;See, even the dev tools focus on great UX!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was impressed by the changes the team made to help navigate unfamiliar projects. Although you may thing of code you never touched as unfamiliar, we all know that even our own code can seem foreign with time. We can now see how prop flow through components, filter our component trees, deeply inspect components, and use hooks with the dev tools. One of the other things I loved seeing was the suspense toggle. That's a feature that seems extremely simple but will quickly become invaluable.&lt;/p&gt;

&lt;p&gt;Along with shared profiling, the new dev tools make it easier to find why things rendered. There &lt;a href="https://github.com/welldone-software/why-did-you-render" rel="noopener noreferrer"&gt;are similar tools out there&lt;/a&gt; but now we can get insight on your renders directly in the dev tools.&lt;/p&gt;

&lt;p&gt;There are a ton of other great additions and I recommend you &lt;a href="https://react-devtools-tutorial.now.sh/" rel="noopener noreferrer"&gt;go explore them for yourself&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Suspenseful Data (Relay is Awesome)
&lt;/h2&gt;

&lt;p&gt;I think I'm probably late to the Relay party. In fact, I'm late to the GraphQL party. In my &lt;a href="https://writewithwrabit.com" rel="noopener noreferrer"&gt;side project&lt;/a&gt; I have been using GraphQL and I really enjoy it. After this conference I'm looking to explore Relay and take advantage of the power the combo provides.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/concurrent-mode-suspense.html#what-is-suspense-exactly" rel="noopener noreferrer"&gt;React Suspense&lt;/a&gt; wants to enable us to show &lt;em&gt;some&lt;/em&gt; of a UI without waiting for &lt;em&gt;all&lt;/em&gt; of it to become ready ⏱.&lt;/p&gt;

&lt;p&gt;Let's take a look at a basic example of a component that shows a loading state (using Suspense) when it is fetching data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Composer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="s2"&gt;`
    query ComposerQuery {
      me {
        photo {
          uri
        }
      }
    }
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;photo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt; &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Placeholder&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Composer&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example we have a &lt;code&gt;Composer&lt;/code&gt; component that fetches a URI to my profile picture and then displays it. You can see in the &lt;code&gt;Home&lt;/code&gt; component that we have wrapped &lt;code&gt;Composer&lt;/code&gt; within a &lt;code&gt;Suspense&lt;/code&gt; block. Then, while the data is loading, &lt;code&gt;Placeholder&lt;/code&gt; will be rendered. This pattern can be thought of as &lt;em&gt;Fetch On Render&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Using this pattern, the loading sequence will be as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2Fddb31ee333675dba88c906885a745ba8%2Fc131d%2Ffetch-on-render.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2Fddb31ee333675dba88c906885a745ba8%2Fc131d%2Ffetch-on-render.webp" alt="Suspense allows you to render a fallback component while fetching data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, this allows us to easily handle data loading. We can provide a better user experience by falling back to a loading component, like a placeholder or spinner.&lt;/p&gt;

&lt;p&gt;The pattern above already provides a lot of benefits and flexibility to do cool things. However, the Facebook team didn't like that you had to &lt;em&gt;render&lt;/em&gt; to figure out what &lt;em&gt;data the component needs&lt;/em&gt;. In order to get over this, they have started to use a pattern they call &lt;em&gt;Render As You Fetch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Essentially, to enable Render As You Fetch, the Facebook team has decomposed &lt;code&gt;useQuery&lt;/code&gt; into two pieces. It is separated into &lt;code&gt;preloadQuery&lt;/code&gt; and &lt;code&gt;usePreloadedQuery&lt;/code&gt;. What exactly does that mean?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;preloadQuery&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This API will fetch data and give a reference to the results. It doesn't give you the actual data.&lt;/p&gt;

&lt;p&gt;You would call this API in the same event handler that would display new UI. For example, if a user clicks on a link that will trigger navigation to a new page, the event handler where we handle the click will use &lt;code&gt;preloadQuery&lt;/code&gt;. Hovering over something to open a tooltip would be another example of where you'd call this API. The &lt;code&gt;onHover&lt;/code&gt; event handler would call &lt;code&gt;preloadQuery&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;usePreloadedQuery&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This API takes the results of the &lt;code&gt;preloadQuery&lt;/code&gt; call. It doesn't actually do any data fetching itself. It looks at the current state of the &lt;code&gt;preloadQuery&lt;/code&gt;. If it is ready, it displays the results. If it is &lt;em&gt;not&lt;/em&gt; ready, it suspends. If the query has failed, then we can throw an error.&lt;/p&gt;

&lt;p&gt;No matter what happens, &lt;code&gt;usePreloadedQuery&lt;/code&gt; will never trigger a new fetch. This makes it efficient and predictable.&lt;/p&gt;

&lt;p&gt;Using these two APIs instead of &lt;code&gt;useQuery&lt;/code&gt; will provide a loading sequence that looks like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F981ad4f58e87e911bf8706b683aa7cbb%2F0a926%2Frender-as-you-fetch.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.anthonymorris.dev%2Fstatic%2F981ad4f58e87e911bf8706b683aa7cbb%2F0a926%2Frender-as-you-fetch.webp" alt="Render As You Fetch is a more effective way to load data before you render"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I definitely recommend you listen to &lt;a href="https://twitter.com/en_JS" rel="noopener noreferrer"&gt;Joe Savona&lt;/a&gt; explain the concepts I've summarized above. He does a better job and gets more in-depth. This was one of my favourite talks because I'm excited by the possibilities this pattern enables and can't wait to try it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. React is Fiction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/gurlcode" rel="noopener noreferrer"&gt;Jenn Creighton&lt;/a&gt; gave my favourite philosophical talk of the conference. She background in creative writing. Creative writing has always been something I loved. Like Jenn, I once fantasized about becoming an author. There was a concept she explained during her talk that translates to coding in an interesting (and unexpected) way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show, don't tell&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's look at two ways to convey the same meaning (courtesy of Jenn).&lt;/p&gt;

&lt;p&gt;She is tired.&lt;/p&gt;

&lt;p&gt;Her footsteps are heavier than before, the weight increasing as she trudges towards the bed, collapsing face-first onto the mattress.&lt;/p&gt;

&lt;p&gt;Same idea, right? She is dead tired. Which one is more powerful? Well that's obvious. As software engineers we often fall into the pit of telling. We abstract, abstract, abstract away until we are &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="noopener noreferrer"&gt;DRY&lt;/a&gt; 🌵 as can be.&lt;/p&gt;

&lt;p&gt;Most of the time, I do try to avoid repetition in my code. The principle makes sense but, like the rules of writing, sometimes we need to break the rules of software development. Let's compare two different pieces of code achieving the same result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Nav&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Nav&lt;/span&gt; &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This seems like it will work great, but what if we want to add a nav item that is an action? For example a login button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;??&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our &lt;code&gt;Nav&lt;/code&gt; component doesn't handle this edge case. We &lt;em&gt;could&lt;/em&gt; easily implement a method for it to handle it but this could easily get out of hand. We could refactor the &lt;code&gt;Nav&lt;/code&gt; component to look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Nav&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;
          &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;onClck&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;em&gt;would&lt;/em&gt; work but how many edge cases will we cover before it becomes harder to reason about our &lt;code&gt;Nav&lt;/code&gt; component? We could rewrite the &lt;code&gt;Header&lt;/code&gt; component another way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/settings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;??&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/settings"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Settings&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onSelectLogin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've simplified the example that Jenn delivered in her talk but I think it gets the point across. The second &lt;code&gt;Header&lt;/code&gt; component is much easier to reason about. The abstraction didn't provide much benefit even though we might be repeating ourselves now. If we wanted to add an &lt;code&gt;Icon&lt;/code&gt; component into &lt;em&gt;one&lt;/em&gt; of the links, we don't have to handle all the edge cases in a &lt;code&gt;Nav&lt;/code&gt; component anymore, we can just add it where we want it.&lt;/p&gt;

&lt;p&gt;Jenn also quoted a great Neil Gaiman quote that I can't resist sharing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember that, sooner or later, before it reaches perfection, you will have to let it go and move on and start to write the next thing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been practicing getting to &lt;em&gt;good enough&lt;/em&gt; while I've been building &lt;a href="https://writewithwrabit.com" rel="noopener noreferrer"&gt;Wrabit&lt;/a&gt;, a mental health writing platform. Sometimes it makes me feel like less of a developer. Sometimes it makes me feel lazy. In the end, I'm going with what I can easily understand, what I can ship, and what I can always refactor later.&lt;/p&gt;

&lt;p&gt;As Jenn said, refactoring is not failure. Her talk weaved creative writing with programming so elegantly, I'll definitely be watching it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. UX-Driven Fluid Animations
&lt;/h2&gt;

&lt;p&gt;I haven't gotten around to making too many animations. I envision a future where I take awesome UI designs from Dribbble (animations and all) and build them out for practice. Animations are definitely delightful bits of design porn, but we need to keep the user experience in mind even with these.&lt;/p&gt;

&lt;p&gt;Like most of the talks, &lt;a href="https://twitter.com/alex_holachek" rel="noopener noreferrer"&gt;Alex Holachek&lt;/a&gt; got me thinking in a new way. I love UI interactions. They make me feel warm and fuzzy inside. When looking at them, I'm guilty of not considering all of the users.&lt;/p&gt;

&lt;p&gt;How to the fancy animations work for someone using a &lt;a href="https://www.nokia.com/phones/en_int/nokia-6" rel="noopener noreferrer"&gt;Nokia 6&lt;/a&gt;? At $283.97 CAD from Amazon, I could afford that many times over before the new iPhone. I'm guessing a lot of other people are in the same camp.&lt;/p&gt;

&lt;p&gt;Alex helped me remember to think more about the average. Average phones, average data speeds. Build for average and high end will always be fine.&lt;/p&gt;

&lt;p&gt;Also, &lt;code&gt;event.preventDefault()&lt;/code&gt; will do bad things to your scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Iterating on Real Experiences
&lt;/h2&gt;

&lt;p&gt;If you couldn't tell, there was tons of variety in the talks this year. &lt;a href="https://twitter.com/Lucapodular" rel="noopener noreferrer"&gt;Luca Demasco&lt;/a&gt; kept things fresh by showing us the process of iteration as he developed the &lt;a href="https://www.wickeditor.com" rel="noopener noreferrer"&gt;Wick Editor&lt;/a&gt; with &lt;a href="https://twitter.com/zrispo" rel="noopener noreferrer"&gt;Zach Rispoli&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Wick Editor is a free and open-source tool for creating games, animations, and anything else your mind can come up with. When Luca showed off the current version, I was really impressed with the UI. It seemed intuitive and had plenty of functionality. That wasn't always the case.&lt;/p&gt;

&lt;p&gt;Luca and friends got to where they are today by constantly iterating. They didn't just iterate for the sake of iteration either. They brought Wick into many different environments (schools, libraries, etc.) and brought the interface in front of many different users (beginner, intermediate, young, old). They took a laser focused approach and gathered feedback that helped make Wick what it is today.&lt;/p&gt;

&lt;p&gt;The honesty in the process inspired me as I think about how to iterate on my own product. How can I launch something quickly and iterate with intention? I don't have that experience so sometimes the confidence escapes me but its a process I'm excited to take. Seeing people like Luca share his experience encourages me and I'm grateful for the honesty that was shared by everyone during the conference.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. The Complexity of Simple Things
&lt;/h2&gt;

&lt;p&gt;Do you use &lt;a href="https://react-select.com" rel="noopener noreferrer"&gt;react-select&lt;/a&gt;? No? You probably do but you just don't know it.&lt;/p&gt;

&lt;p&gt;The component has over &lt;a href="https://github.com/JedWatson/react-select" rel="noopener noreferrer"&gt;18k&lt;/a&gt; stars on GitHub. It has 1.5 &lt;em&gt;million&lt;/em&gt; downloads per week. That's a lot.&lt;/p&gt;

&lt;p&gt;You might not think that one simple React component could be all that complex. You would, of course, be wrong. &lt;a href="https://twitter.com/JedWatson" rel="noopener noreferrer"&gt;Jed Watson&lt;/a&gt; has developed a React component that is beautiful and serves its purpose well. It has plenty of functionality and works great out of the box.&lt;/p&gt;

&lt;p&gt;Jed travelled a long (and sometimes arduous) road to get &lt;a href="https://react-select.com" rel="noopener noreferrer"&gt;react-select&lt;/a&gt; to where it is today. He shared great insights on what its like to develop a massively popular open-source project. He also showed how simple things can often be quite complex.&lt;/p&gt;

&lt;p&gt;I was inspired by Jed when he showed off the evolution of &lt;a href="https://react-select.com" rel="noopener noreferrer"&gt;react-select&lt;/a&gt; to v2.0. He reiterated the importance of refactoring and the wonderful things you can accomplish if you stop chasing perfection.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Beautiful Transparency
&lt;/h2&gt;

&lt;p&gt;Government spending is an important topic. We deserve to see where our tax money is going so that we can keep the government accountable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ebsalita" rel="noopener noreferrer"&gt;Lizzie Salita&lt;/a&gt; demonstrated that government websites can be performant, easy to use, and beautiful. I was actually quite surprised when she demoed the &lt;a href="https://www.usaspending.gov/#/explorer" rel="noopener noreferrer"&gt;USAspending.gov&lt;/a&gt; spending explorer. Compare that to the &lt;a href="https://www.canada.ca/en/treasury-board-secretariat/topics/reporting-government-spending.html" rel="noopener noreferrer"&gt;Canadian version&lt;/a&gt; and you'll get an example of how much React can shape the user experience.&lt;/p&gt;

&lt;p&gt;I'm slowly starting to get my feet wet with regards to politics. While I have always tried to stay informed enough to vote, there is so much more I can do. Having tools like &lt;a href="https://www.usaspending.gov" rel="noopener noreferrer"&gt;USAspending.gov&lt;/a&gt; in your hands makes it easier and more interesting. I think we should continue to develop tooling like this to enable everyone to stay informed so that we can all be involved in shaping our future.&lt;/p&gt;

&lt;h2&gt;
  
  
  19. Wonder-Driven Development
&lt;/h2&gt;

&lt;p&gt;The last talk of the conference really blew my mind. Like &lt;a href="https://twitter.com/ralex1993" rel="noopener noreferrer"&gt;Alex Anderson&lt;/a&gt;, I am a big fan of space 🚀. Alex has built an insanely complex starship simulator called &lt;a href="https://thoriumsim.com/" rel="noopener noreferrer"&gt;Thorium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Thorium simulator empowers many organizations like the &lt;a href="https://www.thelionsgatecenter.com/about" rel="noopener noreferrer"&gt;Lion's Gate Space Center&lt;/a&gt; to provide STEM-related activities for all kinds of people. These space centres allow students to grow through group activities that are highly interactive and educational.&lt;/p&gt;

&lt;p&gt;There have been more than a few presentations and people at React Conf doing highly inspirational things for good causes. Alex's work sticks out because his passion leaks out of every word he says. He loves what he is doing and is an extremely talented engineer. He's using the technology available to him to build great experiences for kids and adults alike.&lt;/p&gt;

&lt;p&gt;My favourite take away from Alex's talk (it's going to take me a while to fully digest it) is the concept of &lt;em&gt;wonder-driven development&lt;/em&gt;. Have you ever wondered about the possibilities of technology? What about what &lt;em&gt;you&lt;/em&gt; are capable of? 🤔&lt;/p&gt;

&lt;p&gt;These types of questions drive us to build fun, enjoyable, and truly beautiful experiences. These types of questions allow engineers at Facebook and companies all around the world to shape our world with technology.&lt;/p&gt;

&lt;p&gt;I've learned so much from everyone I came across at React Conf this year. I'm grateful that I was able to attend and am feeling full of wonder and excitement.&lt;/p&gt;

&lt;p&gt;I can't wait to see what that wonder drives me to develop!&lt;/p&gt;




&lt;p&gt;As I mentioned before, these are just a &lt;em&gt;few of my takeaways&lt;/em&gt;. There were many libraries, techniques, and philosophical ideas shared throughout the two day conference. I wish I could have captured them all! If you go next year you'll know what I mean.&lt;/p&gt;

&lt;p&gt;If you'd like me to expand on any of these ideas I'd be more than willing to. Reach out and let me know!&lt;/p&gt;

&lt;p&gt;Finally, it would be a crime not to mention &lt;a href="https://twitter.com/devonbl" rel="noopener noreferrer"&gt;Devon Lindsey&lt;/a&gt;. She gave us laughter, candy, and introvert activities. The conference wouldn't have been the same without her.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le Talks (With Timestamps)
&lt;/h3&gt;

&lt;p&gt;For your viewing pleasure, here is a breakdown of the two day conference. Watch all the talks and follow the speakers!&lt;br&gt;
️&lt;/p&gt;

&lt;h4&gt;
  
  
  Day One
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=1987" rel="noopener noreferrer"&gt;Keynote @ 00:33:07&lt;/a&gt;: &lt;a href="https://twitter.com/tomocchino" rel="noopener noreferrer"&gt;Tom Occhino&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/yuzhiz" rel="noopener noreferrer"&gt;Yuzhi Zheng&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=4185" rel="noopener noreferrer"&gt;Building The New Facebook With React and Relay @ 01:09:45&lt;/a&gt;: &lt;a href="https://twitter.com/catchingash" rel="noopener noreferrer"&gt;Ashley Watkins&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/frankyan" rel="noopener noreferrer"&gt;Frank Yan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=6226" rel="noopener noreferrer"&gt;How Our Team Is Using React Native to Save The World @ 01:43:46&lt;/a&gt;: &lt;a href="https://twitter.com/_Tany_" rel="noopener noreferrer"&gt;Tania Papazafeiropoulou&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=9543" rel="noopener noreferrer"&gt;Using hooks and codegen to bring the benefits of GraphQL to REST APIs @ 02:39:03&lt;/a&gt;: &lt;a href="https://twitter.com/tejaskumar_" rel="noopener noreferrer"&gt;Tejas Kumar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=11481" rel="noopener noreferrer"&gt;Building a Custom React Renderer @ 03:11:21&lt;/a&gt;: &lt;a href="https://twitter.com/sophiebits" rel="noopener noreferrer"&gt;Sophie Alpert&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=18153" rel="noopener noreferrer"&gt;⚡️Codemod-ing Away 4MB of JavaScript @ 05:02:33&lt;/a&gt;: &lt;a href="https://twitter.com/spencerskovy" rel="noopener noreferrer"&gt;Spencer Miskoviak&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=18560" rel="noopener noreferrer"&gt;️⚡️️️️️git is hard but time travel in git is easy @ 05:09:20&lt;/a&gt;: &lt;a href="https://twitter.com/waterproofheart" rel="noopener noreferrer"&gt;Monica Powell&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=18985" rel="noopener noreferrer"&gt;️⚡️️️️️Typescript, GraphQL, and Code Generation @ 05:16:25&lt;/a&gt;: &lt;a href="https://twitter.com/dested" rel="noopener noreferrer"&gt;Salvatore Aiello&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=19375" rel="noopener noreferrer"&gt;️⚡️️️️️Why React is Eating the World @ 05:22:55&lt;/a&gt;: &lt;a href="https://twitter.com/dmwlff" rel="noopener noreferrer"&gt;Adam Wolff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=19978" rel="noopener noreferrer"&gt;Is React Translated Yet? @ 05:32:58&lt;/a&gt;: &lt;a href="https://twitter.com/tesseralis" rel="noopener noreferrer"&gt;Nat Alison&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=22033" rel="noopener noreferrer"&gt;Building (And Re-Building) the Airbnb Design System @ 06:07:13&lt;/a&gt;: &lt;a href="https://twitter.com/majapw" rel="noopener noreferrer"&gt;Maja Wichrowska&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/taekimjr" rel="noopener noreferrer"&gt;Maja Wichrowska&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=27212" rel="noopener noreferrer"&gt;Accessibility Is A Marathon, Not A Sprint @ 07:33:32&lt;/a&gt;: &lt;a href="https://twitter.com/brittanyIRL" rel="noopener noreferrer"&gt;Brittany Feenstra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=29117" rel="noopener noreferrer"&gt;The State of React State in 2019 @ 08:05:17&lt;/a&gt;: &lt;a href="https://twitter.com/beccaliz" rel="noopener noreferrer"&gt;Becca Bailey&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/UxoX2faIgDQ?t=30914" rel="noopener noreferrer"&gt;Let's Program Like It's 1999 @ 08:35:14&lt;/a&gt;: &lt;a href="https://twitter.com/leeb" rel="noopener noreferrer"&gt;Lee Byron&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Day Two
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=1920" rel="noopener noreferrer"&gt;React Developer Tooling @ 00:32:00&lt;/a&gt;: &lt;a href="https://twitter.com/brian_d_vaughn" rel="noopener noreferrer"&gt;Brian Vaughn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=3631" rel="noopener noreferrer"&gt;Data Fetching With Suspense In Relay @ 01:00:31&lt;/a&gt;: &lt;a href="https://twitter.com/en_JS" rel="noopener noreferrer"&gt;Joe Savona&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=5537" rel="noopener noreferrer"&gt;Automatic Visualizations of the Frontend @ 01:32:17&lt;/a&gt;: &lt;a href="https://twitter.com/hydrosquall" rel="noopener noreferrer"&gt;Cameron Yick&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=9133" rel="noopener noreferrer"&gt;React Is Fiction @ 02:32:13&lt;/a&gt;: &lt;a href="https://twitter.com/gurlcode" rel="noopener noreferrer"&gt;Jenn Creighton&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=10668" rel="noopener noreferrer"&gt;Progressive Web Animations @ 02:57:48&lt;/a&gt;: &lt;a href="https://twitter.com/alex_holachek" rel="noopener noreferrer"&gt;Alexandra Holachek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=18186" rel="noopener noreferrer"&gt;️⚡️️️️️Programming = Hit Records @ 05:03:06&lt;/a&gt;: &lt;a href="https://twitter.com/therealjdash" rel="noopener noreferrer"&gt;Jay Johnson&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=18650" rel="noopener noreferrer"&gt;️⚡️️️️️Comonads On Your Everyday UI Tools @ 05:10:50&lt;/a&gt;: &lt;a href="https://twitter.com/juxncxrlosp" rel="noopener noreferrer"&gt;Juan Paucar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=19673" rel="noopener noreferrer"&gt;Creating Games, Animations and Interactions with the Wick Editor: A UX Talk @ 05:27:53&lt;/a&gt;: &lt;a href="https://twitter.com/Lucapodular" rel="noopener noreferrer"&gt;Luca Damasco&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=21712" rel="noopener noreferrer"&gt;Building React-Select @ 06:01:52&lt;/a&gt;: &lt;a href="https://twitter.com/JedWatson" rel="noopener noreferrer"&gt;Jed Watson&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=27159" rel="noopener noreferrer"&gt;Promoting Transparency in Government Spending with React @ 07:32:39&lt;/a&gt;: &lt;a href="https://twitter.com/ebsalita" rel="noopener noreferrer"&gt;Lizzie Salita&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/JDDxR1a15Yo?t=28637" rel="noopener noreferrer"&gt;Wonder-driven Development: Using React to make a Spaceship @ 07:57:17s&lt;/a&gt;: &lt;a href="https://twitter.com/ralex1993" rel="noopener noreferrer"&gt;Alex Anderson&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Write your way to health</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Thu, 10 Oct 2019 15:20:15 +0000</pubDate>
      <link>https://dev.to/amorriscode/write-your-way-to-health-50fb</link>
      <guid>https://dev.to/amorriscode/write-your-way-to-health-50fb</guid>
      <description>&lt;p&gt;Growing up my environment taught me that strong men don’t cry. I was taught that counselling is for the weak. Talking about our problems leads to judgement and isolation. &lt;/p&gt;

&lt;p&gt;It turns out not talking about my problems lead me to isolation. I cried a lot when I was in high school. I hated myself and was looking for an escape. After a few failed attempts, I started to look for help. I turned to books, podcasts, and meditation. I’ve been adding tools to my toolbox for the past ten years and now I’ve decided to build my own.&lt;/p&gt;

&lt;p&gt;Whether you are struggling with mental illness or not, building a healthy relationship with yourself is extremely important. Self-reflection and journalling have been shown to have many benefits ranging from mindfulness to sparking creativity. I’m building a product that helps you build a daily writing habit, one small step at a time.&lt;/p&gt;

&lt;p&gt;With Wrabit, you can proudly express your unedited self. Writing helped me when I wasn’t ready to talk and it might help you too. Although Wrabit isn’t free, portions of the membership fees get donated to mental health research. The more you write, the more we donate.&lt;/p&gt;

&lt;p&gt;Write your way to health with Wrabit 👇🏻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://writewithwrabit.com"&gt;https://writewithwrabit.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>writing</category>
      <category>worldmentalhealthday</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What to do — and how to find success — after a coding bootcamp</title>
      <dc:creator>Anthony M.</dc:creator>
      <pubDate>Sun, 27 May 2018 01:13:30 +0000</pubDate>
      <link>https://dev.to/amorriscode/finding-success-after-bootcamp-62j</link>
      <guid>https://dev.to/amorriscode/finding-success-after-bootcamp-62j</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was originally &lt;a href="https://medium.com/@amorriscode/finding-success-after-bootcamp-e9b90a26393b" rel="noopener noreferrer"&gt;posted on Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s almost been two years since I graduated from the &lt;a href="https://lighthouselabs.ca/" rel="noopener noreferrer"&gt;Lighthouse Labs&lt;/a&gt; Web Development Bootcamp. If you’re reading this, you probably already know that a coding bootcamp is an intensive program that teaches folks &lt;strong&gt;a little bit&lt;/strong&gt; about software development. I say a little bit, because bootcamps are usually short, but they really do enable you to grow into a new career if you put in the work.&lt;/p&gt;

&lt;p&gt;Plenty of people have discussed the pros and cons of attending a bootcamp (For example, on &lt;a href="https://www.quora.com/Should-I-go-to-a-coding-boot-camp-or-college" rel="noopener noreferrer"&gt;Quora&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/cscareerquestions/comments/7mo9h5/should_i_go_to_coding_bootcamp/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;, and &lt;a href="https://medium.com/bits-and-behavior/coding-bootcamps-vs-computer-science-degrees-what-employers-want-and-other-perspectives-4058a67e4f15" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;). Should you go? Is it better than a computer science degree? Maybe, maybe not. I’m not here to talk about that.&lt;/p&gt;

&lt;p&gt;I want to talk about what to do &lt;strong&gt;after&lt;/strong&gt; a bootcamp. &lt;strong&gt;How will you succeed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For me, I didn’t want to leave success to chance. I quit my job and with a small amount of savings, and I was finally ready to become a &lt;strong&gt;real&lt;/strong&gt; software developer.&lt;/p&gt;

&lt;p&gt;My journey was hard, but I like to think that I’ve been successful coming out the other side. The success came from the work I put in during and after the bootcamp. Success can be yours as well — all you have to do is put in the work.&lt;/p&gt;

&lt;p&gt;Here are the things I did to get to where I am today.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Start applying to jobs early&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I started applying to jobs somewhere around three weeks before graduation. During my bootcamp, I started to get an intense fear that I wouldn’t find a job after bootcamp. This fear helped me decide not to leave it to chance. I started spreading my résumé like wildfire. 🔥&lt;/p&gt;

&lt;p&gt;Leading up to graduation, I had already applied to &lt;strong&gt;50 different positions&lt;/strong&gt;. Did they all respond to me? No. Did I get interviews with most of them? No! The majority of them didn’t even respond to me, but guess what? I got a job before I graduated.&lt;/p&gt;

&lt;p&gt;Applying for jobs is a full time job. This step is essential. You need to cast your line and &lt;strong&gt;get your name in front of as many people as you can&lt;/strong&gt;. You’ll see this theme carry throughout the rest of this article.&lt;/p&gt;

&lt;p&gt;My favourite place to apply for jobs has always been &lt;a href="https://angel.co/" rel="noopener noreferrer"&gt;AngelList&lt;/a&gt;. I like the user experience of their website. It’s clean, simple, and there are a ton of companies using it. Plus, who doesn’t like &lt;a href="https://twitter.com/naval" rel="noopener noreferrer"&gt;Naval Ravikant&lt;/a&gt;? Other than that, &lt;a href="https://www.linkedin.com/jobs/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://hired.ca/" rel="noopener noreferrer"&gt;Hired&lt;/a&gt;, &lt;a href="https://triplebyte.com/" rel="noopener noreferrer"&gt;TripleByte&lt;/a&gt;, or even Craigslist could help.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Go to meetups&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I’m going to preface this part by saying that I’ve got an &lt;a href="https://www.16personalities.com/intj-personality" rel="noopener noreferrer"&gt;INTJ&lt;/a&gt; personality. Being in large crowds of unknown people makes me feel like I’m being pulled to the bottom of the ocean. Small talk with strangers is one of the most difficult things for me to do. But pushing through this struggle allowed me to realize the true potential for meetups.&lt;/p&gt;

&lt;p&gt;If you haven’t been on &lt;a href="http://www.meetup.com/" rel="noopener noreferrer"&gt;Meetup.com&lt;/a&gt;, you should take a peek. If you have access to a relatively large city, I am willing to bet that there are endless possibilities for meeting folks on that website.&lt;/p&gt;

&lt;p&gt;Remember when I told you to get your name in front of as many people as you can? This will help. People remember faces, good conversations, and fun events. Quite often there will even be job boards where you can share your email!&lt;/p&gt;

&lt;p&gt;Pick a couple of meetup groups that you find interesting and are related to tech or software development. Put yourself in these social environments once a week. You will find plenty of people to exchange numbers with. Add them to your LinkedIn. Reach out to them later.&lt;/p&gt;

&lt;p&gt;Bring your best elevator pitch!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Volunteer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Volunteering is something that I will always find valuable. We don’t have much time on this planet, so why not give back a little of what you’ve been given? So many people helped me during my journey through bootcamp. I decided I wanted to give this back to others.&lt;/p&gt;

&lt;p&gt;There are tons of volunteer opportunities that you could find. The most valuable ones are probably related to the tech meetups you find. They will enable you to meet a lot of people while helping out the community.&lt;/p&gt;

&lt;p&gt;Eventually, once you feel comfortable, I’d suggest finding some opportunities for mentorship! Help people learn to code. You never know whom you might end up helping through the process.&lt;/p&gt;

&lt;p&gt;No matter where you volunteer, it’s a good opportunity for making others aware of who you are. &lt;strong&gt;Another bonus: it looks nice on your résumé.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Practice, practice, practice&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There is only one way to get better: &lt;strong&gt;practice&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are a very &lt;a href="http://codefights.com/" rel="noopener noreferrer"&gt;large&lt;/a&gt; &lt;a href="http://www.codewars.com/" rel="noopener noreferrer"&gt;number&lt;/a&gt; &lt;a href="https://leetcode.com/" rel="noopener noreferrer"&gt;of&lt;/a&gt; &lt;a href="http://exercism.io/" rel="noopener noreferrer"&gt;options&lt;/a&gt; when it comes to practicing your hard skills. Practicing solving problems with algorithms is a great way to flex your mental muscles. You might even need to end up solving some of the same problems in the real world.&lt;/p&gt;

&lt;p&gt;This type of practice gives you two important ways to learn.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The first one is clear: you really have to learn by doing. You’re never going to get good at math just by reading about it, and coding is the same.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second is more subtle, but is easily just as important. Read other developer’s solutions. They will likely be better than yours in the beginning. That’s a good thing!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solve, decode, iterate.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Build&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One of the challenging things about bootcamp is, all of your classmates will have the same projects as you. You’ll want something to showcase to help distinguish yourself to potential employers.&lt;/p&gt;

&lt;p&gt;Do you have a problem that you’d like solved? What about your friends? Your mom? Ask them. &lt;strong&gt;Then build it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn’t matter what you build&lt;/strong&gt;. Just build something! Your passion projects will be a great conversation starter at all of the meetups you go to.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contribute to open source&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is probably one of the most intimidating suggestions. Are you good enough to contribute? Will people even want your help? Yes and Yes! No doubt about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source projects need all of the help they can get&lt;/strong&gt;. You may not be able to program their next big feature, but there are plenty of ways to get involved. Do you like doing design? Do you have a passion for documentation? What about writing tests?&lt;/p&gt;

&lt;p&gt;Most of these projects are passion projects. The developers have full time jobs. Go take a look at some issues on your favourite projects and see if there is anything that excites you.&lt;/p&gt;

&lt;p&gt;Once you start submitting pull requests to open source projects, you will begin collecting some invaluable feedback. It’s like having access to an infinite list of senior developers. How great is that?&lt;/p&gt;

&lt;p&gt;Much like what I talked about in the section on practice, contributing to open source really gets you surrounded by code written by other folks. This helps open your eyes to a new perspective and new ways to solve problems. Read as much code as you can and try to &lt;strong&gt;think about how you would have done it differently&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If this sounds exciting to you, then you have to read &lt;a href="https://opensource.guide/how-to-contribute/" rel="noopener noreferrer"&gt;GitHub’s guide to contributing to open source&lt;/a&gt;. It’s extremely in-depth and covers everything you need to know. &lt;a href="https://up-for-grabs.net/" rel="noopener noreferrer"&gt;Including&lt;/a&gt; &lt;a href="https://opensourcefriday.com/" rel="noopener noreferrer"&gt;giving&lt;/a&gt; &lt;a href="http://www.firsttimersonly.com/" rel="noopener noreferrer"&gt;you&lt;/a&gt; &lt;a href="https://yourfirstpr.github.io/" rel="noopener noreferrer"&gt;lots&lt;/a&gt; &lt;a href="https://www.codetriage.com/" rel="noopener noreferrer"&gt;of&lt;/a&gt; &lt;a href="https://24pullrequests.com/" rel="noopener noreferrer"&gt;ways&lt;/a&gt; to find projects looking for help.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Expand your knowledge&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We live in a beautiful time. The internet is full of resources for learning. If you have an idea of what you want to learn, chances are you can find it online for cheap or even free.&lt;/p&gt;

&lt;p&gt;It wouldn’t be hard for me to endlessly list online resources here, but I’ll leave the searching up to you. I was personally very curious about &lt;a href="https://github.com/ossu/computer-science" rel="noopener noreferrer"&gt;computer science so I started to self-study&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What you decide to learn about doesn’t really matter. Just continue to learn. Showing potential employers that you are a self-starter and capable of picking up things on your own is a huge asset. &lt;strong&gt;As a junior you become an investment&lt;/strong&gt;. You need to sell to them and let them know you’re a valuable investment.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Never be afraid to ask&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Hopefully your bootcamp is similar to Lighthouse. We have access to a Slack channel that has a thriving community. Even if your bootcamp doesn’t, you can find online communities to be a part of. These communities provide an excellent alternative for you to fill your knowledge gaps and get feedback.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No one is dumb who is curious. The people who don’t ask questions remain clueless throughout their lives - Neil deGrasse Tyson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask people your questions directly. Share some of your code. Read what other people are struggling with. All of these options are opportunities to learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Accept recruiter communications&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I have one final suggestion for your post-bootcamp journey. &lt;a href="https://blog.linkedin.com/2016/10/06/now-you-can-privately-signal-to-recruiters-youre-open-to-new-job" rel="noopener noreferrer"&gt;Let recruiters on LinkedIn know you are open to communications&lt;/a&gt;. It never hurts to be on their radar, and they might just be able to find you a good fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wrapping up&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;That’s it! Those are a few things to increase your chances of success.&lt;/p&gt;

&lt;p&gt;As you can see, there are a few common themes spread throughout these ideas. You need to get your name out there, continue learning, distinguish yourself from others, and give back where you can.&lt;/p&gt;

&lt;p&gt;Like most things in life, you’ll get out what you put in. Put in the work, believe in yourself, and have fun doing it.&lt;/p&gt;

&lt;p&gt;If you have any questions, need some support, or would just like to chat, please don’t hesitate to reach out to me on &lt;a href="https://twitter.com/amorriscode" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.linkedin.com/in/amorriscode/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Best of luck!&lt;/p&gt;

</description>
      <category>bootcamp</category>
      <category>programming</category>
      <category>coding</category>
      <category>junior</category>
    </item>
  </channel>
</rss>
