<?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: Amberley Romo</title>
    <description>The latest articles on DEV Community by Amberley Romo (@amberleyjohanna).</description>
    <link>https://dev.to/amberleyjohanna</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%2F54344%2F11d9b830-4323-44d5-b4e9-2a52d6421c76.jpg</url>
      <title>DEV Community: Amberley Romo</title>
      <link>https://dev.to/amberleyjohanna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amberleyjohanna"/>
    <language>en</language>
    <item>
      <title>What is Web Accessibility and How Do I Get Started?</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Wed, 09 Sep 2020 16:58:22 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/what-is-web-accessibility-and-how-do-i-get-started-5fd5</link>
      <guid>https://dev.to/amberleyjohanna/what-is-web-accessibility-and-how-do-i-get-started-5fd5</guid>
      <description>&lt;p&gt;Happy to say I finally shared this project! &lt;em&gt;(Turns out I actually made the initial commit a year ago today.)&lt;/em&gt; I'm grateful for the &lt;a href="https://twitter.com/amber1ey/status/1292866062233591809"&gt;warm reception it received on Twitter&lt;/a&gt;, and it now has over 10,000 page views! (Which is a big number for me). I'm really hopeful that it's a useful resource for folks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a11y.coffee/"&gt;The a11y.coffee project&lt;/a&gt; is my take on created a structured introduction to web accessibility. It's intended for web developers who want to learn about accessibility, but perhaps don't know where to start. There's a lot to tackle, and my goal was to create a gentle introduction that tackles the why, the most immediate opportunities for impact, a crash course in testing, and some direction to further resources.&lt;/p&gt;

&lt;p&gt;Essentially, I wanted to gift wrap the answer I generally give when someone asks me, "What is web accessibility and how do I get started?"&lt;/p&gt;

&lt;p&gt;I hope you'll &lt;a href="https://a11y.coffee/"&gt;check it out&lt;/a&gt;, and that you find it useful!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Conditionally Add to an Object or Array in JavaScript</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Wed, 09 Sep 2020 16:51:06 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/conditionally-add-to-an-object-or-array-in-javascript-1lb2</link>
      <guid>https://dev.to/amberleyjohanna/conditionally-add-to-an-object-or-array-in-javascript-1lb2</guid>
      <description>&lt;p&gt;In the course of my work, it's not uncommon that I need to conditionally add properties to objects, or (probably less commonly) values to arrays. Let's talk about how to do both. This is the piece of code I'll ultimately use as an example:&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;trueCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;falseCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&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;obj&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;woof&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="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;meow&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="c1"&gt;// { dogs: 'woof' }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dog&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="p"&gt;[]),&lt;/span&gt;
  &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&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="p"&gt;[])&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// ['dog']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, defining a few things.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're familiar with the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator, the ternary operator, and spread syntax, skip ahead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The logical &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (AND) operator
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; is a logical operator. Logical operators are used to "reason" about Booleans. The &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator is one of three available in JavaScript (&lt;em&gt;Not material here, but for completeness -- the two others are the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR"&gt;&lt;code&gt;||&lt;/code&gt; (OR) operator&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator"&gt;&lt;code&gt;??&lt;/code&gt; (nullish coalescing) operator&lt;/a&gt;.&lt;/em&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// expr1 &amp;amp;&amp;amp; expr2&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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="s2"&gt;hi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// hi&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&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="s2"&gt;123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 123&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({}&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="s2"&gt;empty but valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// empty but valid&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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="s2"&gt;bye&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the first expression (on the left side) is &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Truthy"&gt;truthy&lt;/a&gt; ("considered true when encountered in a Boolean context"), return &lt;strong&gt;the second expression&lt;/strong&gt; (on the right side).&lt;/p&gt;

&lt;p&gt;If the first expression is &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Falsy"&gt;falsy&lt;/a&gt; ("considered false when encountered in a Boolean context"), return &lt;strong&gt;the first expression&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short-circuit evaluation
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; expression is evaluated left to right. If the first expression is falsy, the full expression is short-circuit evaluated to the falsy expression (meaning the second expression is never evaluated). This is what lets us do things like safely access nested properties on an object:&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;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// TypeError: Cannot read property 'second' of undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The conditional (ternary) operator
&lt;/h2&gt;

&lt;p&gt;The ternary operator can be thought of as a shortcut for the &lt;code&gt;if&lt;/code&gt; statement. It's made of of three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A condition followed by a question mark (&lt;code&gt;?&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;An expression to execute if the condition is truthy, followed by a colon (&lt;code&gt;:&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;an expression to execute if the condition is falsy
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// condition ? exprIfConditionTrue : exprIfConditionFalse&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An example. The two functions below accomplish the exact same thing using different syntax. The first uses &lt;code&gt;if&lt;/code&gt; logic, and the second uses a ternary&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="cm"&gt;/*
 * Example 1
 */&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getWelcomeMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome!&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Please log in.&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="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getWelcomeMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Welcome!&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getWelcomeMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Please log in.&lt;/span&gt;

&lt;span class="cm"&gt;/*
 * Example 2
 */&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getWelcomeMessageTernary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&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="nx"&gt;isLoggedIn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome!&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="s2"&gt;Please log in.&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getWelcomeMessageTernary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Welcome!&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getWelcomeMessageTernary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Please log in.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The spread operator (&lt;code&gt;...&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Spread syntax can be used to &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax"&gt;expand an iterable (like an array expression), or expand object properties&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Spreading an iterable:&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;let&lt;/span&gt; &lt;span class="nx"&gt;myDogs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`Riggins`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`Lyla`&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;parentsDogs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`Ellie`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`Remi`&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;holidayDoghouse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;myDogs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;parentsDogs&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// [ 'Riggins', 'Lyla', 'Ellie', 'Remi' ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spreading object properties:&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;let&lt;/span&gt; &lt;span class="nx"&gt;existingAnimals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;donkeys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;horses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;newAnimals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;goats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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;allAnimals&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="nx"&gt;existingAnimals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;newAnimals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// { dogs: 2, cats: 4, donkeys: 2, horses: 2, goats: 2 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can be used on iterables like an array or a string.&lt;br&gt;
It expands an iterable to its individual elements&lt;/p&gt;
&lt;h2&gt;
  
  
  Conditionally add a property to an object
&lt;/h2&gt;

&lt;p&gt;To conditionally add a property to an object, we can make use of the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator.&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;trueCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;falseCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&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;obj&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;woof&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="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;meow&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="c1"&gt;// { dogs: 'woof' }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, in the first property definition on &lt;code&gt;obj&lt;/code&gt;, the first expression (&lt;code&gt;trueCondition&lt;/code&gt;) is true/truthy, so the second expression is returned, and then spread into the object.&lt;/p&gt;

&lt;p&gt;In the second property definition, the first expression (&lt;code&gt;falseCondition&lt;/code&gt;) is false/falsy, and so the first expression is returned (and the second expression is never evaluated, because of short-circuiting). It may seem a little confusing to spread a falsy expression, but the result is that it is ignored:&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;spreadFalsy&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spreadFalsy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// {}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need parentheses in evaluating these expressions, but I prefer them, to make it clear that the spread operation applies to the result of the full expression.&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;trueCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;falseCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&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;withParentheses&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;woof&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="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;meow&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="c1"&gt;// { dogs: 'woof' }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;withoutParentheses&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;birds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tweet&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="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;foxes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="c1"&gt;// { birds: 'tweet' }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conditionally add a value to an array
&lt;/h2&gt;

&lt;p&gt;Conditionally adding a value to an array looks a little different. Rather than using an &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator, we use a ternary operator.&lt;/p&gt;

&lt;p&gt;Unlike the object spread example, if you attempt to spread on a falsy value in an array, you'll get a TypeError:&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;falseCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&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;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...(&lt;/span&gt;&lt;span class="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])];&lt;/span&gt;
&lt;span class="c1"&gt;// TypeError: boolean false is not iterable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence we need a ternary; Using a ternary, we can fall back to spreading an empty array. Then (assuming we've correctly provided two possible iterables) both possible returned expressions will be iterables:&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;trueCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;falseCondition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&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;arr&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="nx"&gt;trueCondition&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dog&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="p"&gt;[]),&lt;/span&gt;
  &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;falseCondition&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&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="p"&gt;[])&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// ['dog']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>3 concrete ways to handle impostor syndrome every day</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Thu, 13 Jun 2019 16:03:01 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/3-concrete-ways-to-handle-with-impostor-syndrome-every-day-k4i</link>
      <guid>https://dev.to/amberleyjohanna/3-concrete-ways-to-handle-with-impostor-syndrome-every-day-k4i</guid>
      <description>&lt;p&gt;Yesterday I had the pleasure of chatting with &lt;a href="https://twitter.com/dustint314"&gt;Dustin Myers&lt;/a&gt; for a video he's doing on impostor syndrome. He asked me to share some ways I handle impostor syndrome, and I thought they'd be useful to write out, as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Surround yourself with awesome people
&lt;/h2&gt;

&lt;p&gt;There's a saying that goes something like "Show me who your friends are and I'll show you who you are." The spirit of this is the number one way I manage impostor syndrome on the daily.&lt;/p&gt;

&lt;p&gt;My favorite &lt;a href="https://twitter.com/riotjulesfern/status/1090663146988044288?lang=en"&gt;tweet about impostor syndrome&lt;/a&gt; is literally framed in my office. It reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imposter syndrome: I am surrounded by beings of impossible, cosmic intelligence&lt;/p&gt;

&lt;p&gt;Also imposter syndrome: I, an incompetent, have tricked them all&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Between the community I've found on Twitter, my co-workers, and personal friends in tech, I have found some awesome company to keep. Some really brilliant, compassionate, accomplished people that I respect.&lt;/p&gt;

&lt;p&gt;Whenever I get that impostor syndrome itch (which is less frequent now!), I think about the incredible people surrounding me, and the reciprocal respect they have for me, and that lifts me up so much.&lt;/p&gt;

&lt;p&gt;If you're just starting -- build this community! The positive effect is exponential. You've got at least one to start with in me.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Don't make perfection the goal, make your mindset the goal
&lt;/h2&gt;

&lt;p&gt;If you make perfection your bar for success, you will never succeed. Guaranteed.&lt;/p&gt;

&lt;p&gt;Instead, think about the mindset you want to carry. Make your bar for success how you approach different situations. This will look different for everyone. For me, it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Situation&lt;/strong&gt;: There was something I didn't know. (Ha, daily).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic thought (catastrophizing)&lt;/strong&gt;: "I feel embarrassed. I didn't know this one thing, therefore I don't know anything and I'm incompetent, therefore when everyone figures that out I'm going to lose my job and everyone's going to ridicule me and I'll never find another tech job and I'll have to find a new career."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternative thought (curiosity)&lt;/strong&gt;: "Huh! Well that's yet another interesting thing I know now. Add that to ye olde arsenal."&lt;/p&gt;

&lt;p&gt;I try to make my bar for success the way I react to things -- For me that's working consciously to approach everyday situations with curiosity and compassion, first.&lt;/p&gt;

&lt;p&gt;One amazing example of this type of mindset shift in practice is &lt;a href="https://www.swyx.io/writing/learn-in-public/"&gt;swyx's "Learn in Public"&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Remain humble, not toxically self-deprecating.
&lt;/h2&gt;

&lt;p&gt;I'm guilty of this by nature and work hard to recognize and retrain this thought pattern. It has wide-ranging consequences both for you, and for the people who surround you.&lt;/p&gt;

&lt;p&gt;I naturally want to frame a question as: "I'm so dumb, this is such a stupid question, but..." For me, this inclination stems from a desire to self-protect -- if I pre-emptively say it, I've beaten everyone to the punch, no one can hurt me! This is not only needlessly self-harming and unproductive, it's also a models a destructive mindset for other people.&lt;/p&gt;

&lt;p&gt;In contrast, by remaining humble and curious, you are open to new voices and information, and can soak it all up without expending the emotional bandwidth self-deprecation consumes. Save up that bandwidth! There's so many better things to do with it.&lt;/p&gt;

</description>
      <category>career</category>
      <category>mindset</category>
      <category>impostorsyndrome</category>
    </item>
    <item>
      <title>Reflecting on code bootcamp, three years later</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Wed, 22 May 2019 15:37:05 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/reflecting-on-code-bootcamp-three-years-later-jm6</link>
      <guid>https://dev.to/amberleyjohanna/reflecting-on-code-bootcamp-three-years-later-jm6</guid>
      <description>&lt;p&gt;There have been only two times in my life that I’ve kept a consistent blog. The first was my study abroad experience in China. The second was my time at Makersquare. (Makersquare was acquired by &lt;a href="https://www.hackreactor.com/"&gt;Hack Reactor&lt;/a&gt;, which is now a project of &lt;a href="https://www.galvanize.com/"&gt;Galvanize&lt;/a&gt;. Lol, startups.)&lt;/p&gt;

&lt;p&gt;At some point I decided to make all my bootcamp posts privately published (on my old WordPress blog). Yesterday, I decided to port them over and re-publish them. It’s now been three years, but if anyone is currently going through a bootcamp, or considering it, I hope that perhaps they find it helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weekly bootcamp posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-01-10-the-road-so-far/"&gt;The Road So Far&lt;/a&gt; (2016-01-10)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-01-10-makersquare-week-1/"&gt;Week 1: Lots&lt;/a&gt; &lt;em&gt;(2016-01-10)&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-01-17-makersquare-week-2/"&gt;Week 2: Blur&lt;/a&gt; &lt;em&gt;(2016-01-17)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-01-24-makersquare-week-3/"&gt;Week 3: Enter APIs&lt;/a&gt; &lt;em&gt;(2016-01-24)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-02-01-makersquare-week-4/"&gt;Week 4: Mental Fog&lt;/a&gt; &lt;em&gt;(2016-02-01)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-02-07-makersquare-week-5/"&gt;Week 5: Onto Projects&lt;/a&gt; &lt;em&gt;(2016-02-07)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-02-14-makersquare-week-6/"&gt;Week 6: Halfway Through&lt;/a&gt; &lt;em&gt;(2016-02-14)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-02-29-makersquare-week-7/"&gt;Week 7: Projectland&lt;/a&gt; &lt;em&gt;(2016-02-29)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-03-07-makersquare-week-8/"&gt;Week 8: Back to Back-End&lt;/a&gt; &lt;em&gt;(2016-03-07)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-03-16-makersquare-week-9/"&gt;Week 9: Thesis, cont'd&lt;/a&gt; &lt;em&gt;(2016-03-16)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-03-21-makersquare-week-10/"&gt;Week 10: Is This Real Life?&lt;/a&gt; &lt;em&gt;(2016-03-21)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-03-28-makersquare-week-11/"&gt;Week 11: Thesis, Concluded&lt;/a&gt; &lt;em&gt;(2016-03-28)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amberley.blog/2016-04-02-makersquare-week-12/"&gt;Week 12: The Transition&lt;/a&gt; &lt;em&gt;(2016-04-02)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Was it worth it?
&lt;/h2&gt;

&lt;p&gt;Short answer, yes.&lt;/p&gt;

&lt;p&gt;I had been trying to break into full-time web development for years, and at the time, I still didn’t feel I’d done it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/amber1ey/status/1094655492545228800"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B_nDMf-X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/9c412d36dc1463ecff274ee09b24fbe7/b8c2e/twitter-webdev-poll.png" alt="I ran a Twitter poll asking how long I had been a developer. 61% said 10+ years (when I started tinkering with code). 21% said 9-10 years (when I started building static sites). 11% said 5-8 years (when I started building WordPress sites). 7% said 3-4 years (when I started building React apps.)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I needed a complete change of pace, and a completely focused time period to focus on the pivot. I’m grateful that I had the opportunity to do so. I f’n love what &lt;a href="https://lambdaschool.com/"&gt;Lambda School&lt;/a&gt; is doing to make this pivot more accessible to a wider range of people. (Enjoyed &lt;a href="https://changelog.com/founderstalk/63"&gt;this Founder’s talk podcast episode&lt;/a&gt; feat. founder Austin Allred recently). &lt;em&gt;Note: I have no experience with Lambda. My intention is to highlight the issue of access. See also: &lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I took a chance on a bootcamp because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had been scratching at the door and doing the work for a long time, I already knew it was something I enjoyed.&lt;/li&gt;
&lt;li&gt;Despite the fact that bootcamps were pretty much a new thing, and unregulated, I felt it conferred some greater level of validation, and gave me a better shot. (They’re not so new anymore, I feel like I was at the tail-end of that).&lt;/li&gt;
&lt;li&gt;I needed to invest in a hard pivot. Working my way gradually wasn’t working.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m so grateful to be where I am now, and it’s absolutely mind-blowing that the bootcamp was three years ago. Also, none of this would be possible without &lt;a href="https://amberley.dev/gratitude"&gt;these folks&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>bootcamp</category>
    </item>
    <item>
      <title>How to tweet with accessibility in mind</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Tue, 21 May 2019 18:39:31 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/how-to-tweet-with-accessibility-in-mind-2e1m</link>
      <guid>https://dev.to/amberleyjohanna/how-to-tweet-with-accessibility-in-mind-2e1m</guid>
      <description>&lt;p&gt;Curating some go-to tips for myself for tweeting with accessibility in mind. I hope others find this helpful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not already familiar with "alternative text" or "screen readers"? Check out the "Terms" explainer section at the end of this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Quick links / overview of the sections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
(Prerequisite) Enable alt text.&lt;/li&gt;
&lt;li&gt;
Provide meaningful alt text for images.&lt;/li&gt;
&lt;li&gt;
Provide direct "alt text" for animated gifs.&lt;/li&gt;
&lt;li&gt;
Use camel case or pascal case for multi-word hashtags.&lt;/li&gt;
&lt;li&gt;
Consider your use of punctuation and symbols.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  (Prerequisite) Enable alt text. &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Twitter supports providing alt text for images. At this point, you must still explicitly opt-in to expose this as a "feature". To opt-in, &lt;a href="https://twitter.com/settings/accessibility"&gt;visit the accessibility tab in your Twitter settings&lt;/a&gt;, and enable "Compose image descriptions".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---5hidpUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/a0312b4310cc089457711e6ed70870d6/82ac9/twitter-compose-image-descriptions.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---5hidpUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/a0312b4310cc089457711e6ed70870d6/82ac9/twitter-compose-image-descriptions.png" alt="My Twitter accessibility settings with an arrow indicating where to enable compose image descriptions."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I still hope someday Twitter enables this option by default (or even requires it), rather than making it opt-in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/amber1ey/status/1100797205781381121"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zwrZNvW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/a8c28818d38815554cb717a0bae0b438/5c343/tweet-amberley-twitter-alt.png" alt="Tweet from @amber1ey reading saying: It would be pretty rad if Twitter not only made the option to add alt text default rather than opt-in, but required it."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Provide meaningful alt text for images &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When writing alt text, imagine that you're describing the image to a friend sitting across a table from you. Think of how you would describe it so that the full meaning of the tweet is communicated, without ever seeing the image.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Context is everything. The same image might have different appropriate alt text depending on the context. (Again, think about describing to a friend.)&lt;/li&gt;
&lt;li&gt;Don't be unnecessarily verbose. Be as succinct as possible while getting the full point across.&lt;/li&gt;
&lt;li&gt;Avoid "image of..." or "graphic of...". This context is provided implicitly by the &lt;code&gt;&amp;lt;img/&amp;gt;&lt;/code&gt; tag. Including it in the alt text would be redundant.&lt;/li&gt;
&lt;li&gt;Place a period (&lt;code&gt;.&lt;/code&gt;) at the end of the alt text. This will make the screen reader "take a breath."&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Alt text examples:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This &lt;a href="https://twitter.com/RobotHugsComic/status/949324467993497600"&gt;great Twitter thread&lt;/a&gt; from &lt;a href="https://twitter.com/RobotHugsComic"&gt;@RobotHugsComic&lt;/a&gt; provides some great examples of effective alt text for images associated with tweets.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://webaim.org/"&gt;WebAIM&lt;/a&gt; also has great guides on &lt;a href="https://webaim.org/techniques/alttext/#context"&gt;the importance of context in alt text&lt;/a&gt;, and &lt;a href="https://webaim.org/articles/gonewild/#alttext"&gt;examples of alt text blunders&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Provide "alt text" directly in tweets containing animated gifs &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I have "alt text" in quotes because currently you cannot provide alt text (as in a literal &lt;code&gt;alt&lt;/code&gt; attribute) for animated gifs on Twitter. A lot of folks currently provide alternative text directly in the content of the tweet that contains the gif:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/AaronGustafson/status/1128448431012237314"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3Vim2LP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/b898e9a9ee8038dd64d492bc0b5989f6/2cf5e/tweet-aaron-gif-alt.png" alt="Tweet from Aaron Gustafson saying: 'Collaboratively editing with @TatianaTMac 🤩🤩🤩 Highlight of my day!' The tweet includes alt text for a gif, which reads: John Krasinski as Jim Halpert in the Office, saying yes very excitedly (complete with a rock solid hand gesture)."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use camel case or pascal case for multi-word hashtags. &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In camel case, words are joined together with no spaces. The first letter is lower-cased, and each additional word begins with a capital letter. (Ex., iPhone, eBay). Pascal case is a subset of camel case, where the first word is also capitalized.&lt;/p&gt;

&lt;p&gt;Camel or pascal cased hash tags are more readable to screen readers, and also more legible for sighted users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#ThisIsPascalCase&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#thisIsCamelCase&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#thisislowercase&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consider your use of punctuation and symbols. &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Awhile ago, the "sign bunny" meme was a thing. A tweet would include an ASCII bunny, holding a sign, conventionally with capitalized text. Reading this type of text content on a screen reader is... obnoxious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kaytaylorrea/status/1018613620018696192"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hRcltom6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/c357915731edb82e3f8d3bea8bac8d6b/8de29/tweet-sign-bunny-meme.png" alt="Tweet using the sign bunny meme, saying: 'Live your life in a way that would make Mr. Rogers AND Carrie Fisher proud.'"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;This tweet is an example, and not intended to call out the tweeter. I chose this one simply because it's one of my personal favorites.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Below is a screen recording video demoing how this tweet is read aloud using the built-in screen reader for Mac, "VoiceOver":&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8tCYIrhV5SI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In situtations like this, consider what the text of the tweet read aloud would actually sound like to someone. A better idea in this case might be to include the meme as an image, with appropriate alt text.&lt;/p&gt;

&lt;p&gt;This includes emojis. &lt;a href="http://adrianroselli.com/2018/01/improving-your-tweet-accessibility.html#Emoji"&gt;Quoting Adrian Roselli&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In general, avoid too many emoji. Understand that different screen settings and sizes may make them hard to see, and that different cultural backgrounds (and context) can change their meaning. But beyond all that, they are just verbose in screen readers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Consider this not only in tweet text, but also in your Twitter display name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/SassyOutwater/status/948206049357594624"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MA_ooIEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amberley.blog/static/3f899a7283513564acc9d0d7e8b3e83c/27a26/tweet-sassy-outwater.png" alt="Tweet from Sassy Outwater saying: 'So you know all those emoji and punctuation marks in your Twitter names get read aloud by screen readers, right? If it takes me longer to hear your Twitter name than to read your tweet? I scroll right on by. Please remember this when adding lots of emoji to things. Thanks.'"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it a habit!
&lt;/h2&gt;

&lt;p&gt;It took me a bit to get in the habit of considering all of these things, and I'm far from perfect. One thing I was going to link here was the &lt;a href="https://twitter.com/PleaseCaption"&gt;Please Caption!&lt;/a&gt; Twitter bot account, that would politely remind me if I forgot to include alt text. Sadly, &lt;a href="https://twitter.com/PleaseCaption/status/1128326464879853569"&gt;Twitter has changed the way bots work&lt;/a&gt; (apparently) and it's (hopefully temporarily??) dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terms
&lt;/h2&gt;

&lt;p&gt;Info on specific important terms in this post, if you're not familiar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternative text
&lt;/h3&gt;

&lt;p&gt;Alternative (alt) text provides a text alternative to non-text content. The text is read by screen readers in place of images. It communicates the content and function of the image to users who rely on means of navigating the web that aren't visual (blind users, low-vision users, users with cognitive disabilities, deafblind users, etc).&lt;/p&gt;

&lt;p&gt;Alt text is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read aloud by screen readers,&lt;/li&gt;
&lt;li&gt;Displayed in place of the image in browsers if the file is not loaded,&lt;/li&gt;
&lt;li&gt;Crawlable by search engines and therefore indexable by search engines. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://webaim.org/techniques/alttext/"&gt;Learn more about alt text&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screen reader
&lt;/h3&gt;

&lt;p&gt;A screen reader is a software program that converts digital text into synthesized speech.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webaim.org/techniques/screenreader/"&gt;Learn more about screen readers&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assorted relevant links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://adrianroselli.com/2018/01/improving-your-tweet-accessibility.html"&gt;Improving your tweet accessibility&lt;/a&gt; by &lt;a href="https://twitter.com/aardrian"&gt;Adrian Roselli&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://adrianroselli.com/2016/03/twitter-has-alt-text-with-some-caveats.html"&gt;Twitter Has Alt Text! (with some caveats)&lt;/a&gt; by &lt;a href="https://twitter.com/aardrian"&gt;Adrian Roselli&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.a11ywithlindsey.com/blog/writing-alternative-text-matters"&gt;Writing alternative text that matters&lt;/a&gt; by &lt;a href="https://twitter.com/LittleKope/"&gt;Lindsey Kopacz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.hootsuite.com/inclusive-design-social-media/"&gt;Everything You Need to Know About Inclusive Design for Social Media&lt;/a&gt; from &lt;a href="https://twitter.com/hootsuite"&gt;Hootsuite blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>a11y</category>
      <category>socialmedia</category>
      <category>twitter</category>
      <category>alttext</category>
    </item>
    <item>
      <title>The cultural push to hire junior software developers</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Sun, 17 Mar 2019 16:06:53 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/the-cultural-push-to-hire-junior-software-developers-40in</link>
      <guid>https://dev.to/amberleyjohanna/the-cultural-push-to-hire-junior-software-developers-40in</guid>
      <description>&lt;p&gt;A friend chatted me recently, with an interesting question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is behind the rise of the “hire junior engineers” push that is going on industry wide?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We had a long conversation that I decided to translate into written thoughts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Industry context
&lt;/h2&gt;

&lt;h3&gt;
  
  
  High demand for senior talent, low supply
&lt;/h3&gt;

&lt;p&gt;There is a huge gap between the existing supply and the growing demand for software developers. There are more job openings for software developer roles &lt;a href="http://www.arcgis.com/apps/MapJournal/index.html?appid=b1c59eaadfd945a68a59724a59dbf7b1" rel="noopener noreferrer"&gt;than qualified people to fill them&lt;/a&gt;. The U.S. Bureau of Labor Statistics projects that by the year 2020, there will be &lt;a href="https://www.wsj.com/articles/computer-programming-is-a-trade-lets-act-like-it-1407109947?mod=e2fb" rel="noopener noreferrer"&gt;one million unfilled software jobs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The demand for software developers is growing faster than the average for all occupations. This is partially because in an increasingly digital world, demand is rising in finance, retail, manufacturing, and other traditional&lt;br&gt;
industries, &lt;a href="https://www.glassdoor.com/research/app/uploads/sites/2/2017/12/Final_GD_ResearchReport_5Disruptions2018.pdf" rel="noopener noreferrer"&gt;beyond traditional "tech" companies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These stats back up what I would venture to say most working software developers personally observe and hear anecdotally, constantly. Especially via LinkedIn.&lt;/p&gt;
&lt;h3&gt;
  
  
  Saturation of junior talent
&lt;/h3&gt;

&lt;p&gt;We have a dearth of qualified talent to meet existing demand.&lt;/p&gt;

&lt;p&gt;Back in 2014-2015, the number of computer and information science bachelor degrees &lt;a href="https://nces.ed.gov/programs/digest/d16/tables/dt16_322.10.asp?current=yes" rel="noopener noreferrer"&gt;earned was 59,581&lt;/a&gt;. That doesn't even come close to starting to close the supply gap.&lt;/p&gt;

&lt;p&gt;We have a situation now where everyone wants to hire senior, and there's already not enough senior or mid-level talent to meet demand. And at the same time supply is not on a growth trajectory to meet that demand, much less growing in proportion to the growing demand.&lt;/p&gt;

&lt;p&gt;The explosion of code bootcamps is itself a sort of proof that there's a market to fill that gap. In contrast, because of bootcamps and things seeking to fill the demand, we have a saturation of eager, junior talent. At the same time, finding a quality, junior, entry-level job is a challenge. They're hard to come by, and the ones that are there seem to seek experience far above "entry".&lt;/p&gt;
&lt;h2&gt;
  
  
  My career context
&lt;/h2&gt;

&lt;p&gt;A slight diversion into my career path, for context on my perspective.&lt;/p&gt;

&lt;p&gt;Getting my foot in the door involved knocking on a lot of doors, and trying to figure out what I needed to do to finally have my Developer Card™️.&lt;/p&gt;

&lt;p&gt;I don't even remember really when I started tinkering with static sites. When a web position opened up in the nonprofit I worked at (doing marketing, branding and graphic design at the time), I jumped at it. I got it -- at least in part, I believe -- because the person leaving (causing the open position) advocated for me, knowing what I could do. (&lt;em&gt;This is not about me not deserving it -- I was qualified -- more about the fact that no one else at the non-profit really understood the job.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;That was great, but ultimately I was frustrated by not having anyone to learn from. It was whatever I could figure out on my own. I started applying for front-end developer positions.&lt;/p&gt;

&lt;p&gt;At an agency I had a great feeling about, I interviewed for a front-end development role. Ultimately, because of my "well-rounded background", I was offered a position as a "technical strategist" instead, which was part business development, part client management, part project management. I figured that meant I wasn't ready to be a professional web developer (Despite the fact that that was currently my full-time job. Cognitive dissonance is amazing), and that this would be a good stepping stone. At the time I started, the agency had zero female developers.&lt;/p&gt;

&lt;p&gt;The position did not fulfill what I wanted -- shocking, I know. While I was there, they did hire a female dev, and she was an amazing and supportive mentor and friend to me. She had been a social worker, and career changed by doing a bootcamp. She gave me the confidence to make a hard shift, and take the leap. I left DC, moved back to Texas, and went to a code bootcamp in Austin. (Makersquare, before it was aquired by Hack Reactor, before it was acquired by Galvanize 🙃).&lt;/p&gt;

&lt;p&gt;Through this entire narrative, I suffered from ignorance of what I didn't know. I didn't know how to get where I wanted to go, or even what that position looked like. I could never have envisioned where I am now.&lt;/p&gt;

&lt;p&gt;How about when I got my Developer Card™️? This imposter may never know, but still wonders:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1094655492545228800-858" src="https://platform.twitter.com/embed/Tweet.html?id=1094655492545228800"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1094655492545228800-858');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1094655492545228800&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the push to hire junior?
&lt;/h2&gt;

&lt;p&gt;With that context in mind, here are some of the main reasons I think there's been a strong, vocal push to hire junior devs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Because we need new talent for our industry to thrive
&lt;/h3&gt;

&lt;p&gt;Senior engineers do not spontaneously manifest from the ether like full-grown Athenas.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1040061861817868288-841" src="https://platform.twitter.com/embed/Tweet.html?id=1040061861817868288"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1040061861817868288-841');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1040061861817868288&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We need to be nurturing junior talent, to fill existing and future demand. Every industry requires this for longevity. Given the demand for senior talent, and the short supply, where do we expect the gap to be filled?&lt;/p&gt;

&lt;p&gt;In talking about hiring juniors, I have heard things like "If I hire a junior, they'll just move on later after they get some experience, and then what's the point?" In my opinion this an unproductive way to frame this question. Instead, perhaps, "How can we create a working environment that is so fulfilling and vibrant that a junior wants to continue to grow and become a leader from within?" Institutional knowledge is invaluable, and it makes sense to foster a culture that sustains that, rather than ensuring the realization of a self-fulfilling prophecy. If you foster a culture where your junior talent wants to stay and grow into senior roles, you're probably going to retain existing senior talent better, too.&lt;/p&gt;

&lt;p&gt;This is also related to a larger industry issue:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1105812366841634816-903" src="https://platform.twitter.com/embed/Tweet.html?id=1105812366841634816"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1105812366841634816-903');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1105812366841634816&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;In a way, it feels we've made it inevitable for folks on every level to need to move on to move up. Once in the door, it can keep you stagnant. Anecdotally (see tweet and replies), it can be hard to feel a sense of career progress, if you have to leave for a title or pay bump. If you're not already in the door, it's just gatekeeping.&lt;/p&gt;

&lt;h3&gt;
  
  
  Because -- surprise -- we still &lt;em&gt;suck&lt;/em&gt; at diversity...
&lt;/h3&gt;

&lt;p&gt;Before working with Gatsby, I had worked with two other female engineers. Now, that total is four. (When I was hired on at Gatsby, I was the first. We now have three, including myself).&lt;/p&gt;

&lt;p&gt;At the same time, the current talent pool in the industry is overwhelmingly &lt;a href="https://insights.stackoverflow.com/survey/2018#developer-profile-race-and-ethnicity" rel="noopener noreferrer"&gt;white (74.2%)&lt;/a&gt; and &lt;a href="https://insights.stackoverflow.com/survey/2018#developer-profile-gender" rel="noopener noreferrer"&gt;male (92.9%)&lt;/a&gt;. That was from the most recent general Stack Overflow survey. The &lt;a href="https://stateofjs.com/" rel="noopener noreferrer"&gt;"State of JavaScript"&lt;/a&gt; looks pretty similar:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1064710839066861568-272" src="https://platform.twitter.com/embed/Tweet.html?id=1064710839066861568"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1064710839066861568-272');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1064710839066861568&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;It's self-perpetuating. In order to diversify and enrich the talent pool, we have to make a concerted effort to not only nurture new talent, but to be willing and proactive about opening the door.&lt;/p&gt;

&lt;h3&gt;
  
  
  And -- surprise -- diversity has value
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Higher bottom line
&lt;/h4&gt;

&lt;p&gt;A &lt;a href="https://www.intel.com/content/dam/www/public/us/en/documents/reports/decoding-diversity-report.pdf" rel="noopener noreferrer"&gt;report from Intel&lt;/a&gt; found that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Improving ethnic and gender diversity in the U.S. technology workforce represents a massive economic opportunity, one that could create $470 - $570Bn in new value for the tech industry, and could add 1.2-1.6% to national GDP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Better products
&lt;/h4&gt;

&lt;p&gt;A viral video went around a couple years ago. A Nigerian man tweeted a short video of an automatic soap dispenser that responded to a white person's hand, but not a black person's.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-897756900753891328-714" src="https://platform.twitter.com/embed/Tweet.html?id=897756900753891328"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-897756900753891328-714');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=897756900753891328&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Apparently a darker skin tone wasn't enough to register with the sensor on the dispenser. A problem that should have been avoided by testing on a spectrum of skin tones. A diversity of perspectives and backgrounds in teams mean better product design, testing and execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modelling lays the groundwork for others to follow
&lt;/h3&gt;

&lt;p&gt;The same reason that diverse representation in media is important. If every doctor you see on TV is male, it would be reasonable to conclude that "doctor" is a male-gendered profession. On the other hand, if you see a diverse set of people portraying doctors, including people you identify with, it's easier to envision yourself in that role.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1106594697126903808-884" src="https://platform.twitter.com/embed/Tweet.html?id=1106594697126903808"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1106594697126903808-884');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1106594697126903808&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;It never occurred to me to study computer science, or that working with the web was anything but a hobby. It took time, and meeting a single female software developer.&lt;br&gt;
I may have never had the courage to quit my job and pivot if not for meeting her.&lt;/p&gt;

&lt;p&gt;I saw a great Twitter exchange recently that touched close to this for me:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1103666283973758976-248" src="https://platform.twitter.com/embed/Tweet.html?id=1103666283973758976"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1103666283973758976-248');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1103666283973758976&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;So combine that with the squishiness around "what is a junior, mid-level, or senior developer". There are no universal qualifications, no agreed upon competency rubric.&lt;/p&gt;

&lt;p&gt;Then combine that with this statistic: "Men apply for a job when they meet only 60% of the qualifications, but &lt;a href="https://hbr.org/2014/08/why-women-dont-apply-for-jobs-unless-theyre-100-qualified" rel="noopener noreferrer"&gt;women apply only if they meet 100% of them&lt;/a&gt;."&lt;/p&gt;

&lt;p&gt;You could say that it's on women to apply anyway, but I would argue that that ignores a lot of existing discriminatory socialization. For example, &lt;a href="https://www.pnas.org/content/111/12/4427.abstract" rel="noopener noreferrer"&gt;a study&lt;/a&gt; by researchers from Harvard, MIT and the Wharton School found that investors preferred pitches presented by male entrepreneurs over female entrepreneurs -- even when the content of the pitch was the same.&lt;/p&gt;

&lt;p&gt;So often, men will apply up, and women won't. Or even if both apply, and are equally qualified, the male applicant may be perceieved to be more qualified or promising.&lt;/p&gt;

&lt;p&gt;I think this results in an uneven acceleration of "seniority", but also entry into the industry, period.&lt;/p&gt;

&lt;h3&gt;
  
  
  It makes business sense
&lt;/h3&gt;

&lt;p&gt;But "doing the right thing" doesn't always line up with what's "best for business", does it?&lt;/p&gt;

&lt;p&gt;This is the part of the conversation that always reminds me about the hurdles in making the case for web accessibility. There's a whole area of the &lt;a href="https://www.w3.org/WAI/" rel="noopener noreferrer"&gt;Web Accessibility Initative site&lt;/a&gt; dedicated to &lt;a href="https://www.w3.org/WAI/business-case/" rel="noopener noreferrer"&gt;the business case for web accessibility&lt;/a&gt;, to help educate people to make the economic case for web accessibility.&lt;/p&gt;

&lt;p&gt;Aside from that Intel study that indicates lost potential economic opportunity, hiring juniors has other benefits:&lt;/p&gt;

&lt;h4&gt;
  
  
  More understandable code gets shipped
&lt;/h4&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1104469820081205248-168" src="https://platform.twitter.com/embed/Tweet.html?id=1104469820081205248"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1104469820081205248-168');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1104469820081205248&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Just like writing a talk forces you to understand your subject matter on deeper level, explaining and talking through things with someone else, and particularly someone more junior than yourself, forces you to understand it better, and uncover holes in your implementation and thought process. Simpler code is more maintainable and less buggy. At the absolute &lt;em&gt;least&lt;/em&gt;, it's a valuable live "rubber duck" situation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Smarter distribution of tasks
&lt;/h4&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1106281425563615233-908" src="https://platform.twitter.com/embed/Tweet.html?id=1106281425563615233"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1106281425563615233-908');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1106281425563615233&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Certain things need to be architected and led by extremely senior, experienced engineers. But a lot of day-to-day work does not require that level of expertise. Distributing tasks keeps people engaged -- it keeps senior people from getting bored, and it keeps less experienced folks growing and levelling up in the trade. It's a smart allocation of resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empathy
&lt;/h2&gt;

&lt;p&gt;In talking about this with others, I find that empathy almost always enters the conversation.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1106210101575208960-949" src="https://platform.twitter.com/embed/Tweet.html?id=1106210101575208960"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1106210101575208960-949');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1106210101575208960&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We remember what it was like, trying to break in, finding a path, knocking on a million doors. The very first JavaScript meetup I went to was me and forty dudes. I don't want that to be the reality anymore. It is a net gain for everyone to make our existing networks less homogeneous, and if we're not asking ourselves and each other how we can do that, I think that's a shame, and a failure.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgxz691kipacxyuf0uv47.gif" 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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgxz691kipacxyuf0uv47.gif" alt="Women helping women raise each other up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;p&gt;I think the push to hire and grow junior talent cannot be disentangled from the push to diversify the tech space, which has social, cultural, and economic benefits. The health of our industry and the quality of what we create depends on increasing diversity in the field, and creating a larger talent pool.&lt;/p&gt;

</description>
      <category>diversity</category>
      <category>junior</category>
      <category>career</category>
    </item>
    <item>
      <title>Seriously, though. What is a progressive web app?</title>
      <dc:creator>Amberley Romo</dc:creator>
      <pubDate>Mon, 06 Aug 2018 07:59:02 +0000</pubDate>
      <link>https://dev.to/amberleyjohanna/seriously-though-what-is-a-progressive-web-app-56fi</link>
      <guid>https://dev.to/amberleyjohanna/seriously-though-what-is-a-progressive-web-app-56fi</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AM8OiLAXoENK7Yi1-2yeQig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AM8OiLAXoENK7Yi1-2yeQig.png"&gt;&lt;/a&gt;&lt;a href="https://medium.com/samsung-internet-dev/we-now-have-a-community-approved-progressive-web-apps-logo-823f212f57c9" rel="noopener noreferrer"&gt;“unofficial” community logo for PWA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve been familiar with the “progressive web app” (PWA) concept for a while now. But there’s always been an itch in the back of my mind about it.&lt;/p&gt;

&lt;p&gt;I’ve been to talks at conferences and meetups about the subject. I’ve read the main docs and top-level “what is a PWA” articles. I’ve read Alex Russell’s post, “&lt;a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" rel="noopener noreferrer"&gt;Progressive Web Apps: Escaping Tabs Without Losing Our Soul&lt;/a&gt;” [&lt;em&gt;Posted 06/15/2015]&lt;/em&gt;, about the discussion between himself and Frances Berriman that originated the term, and Frances’ post, “&lt;a href="https://fberriman.com/2017/06/26/naming-progressive-web-apps/" rel="noopener noreferrer"&gt;Naming Progressive Web Apps&lt;/a&gt;” [&lt;em&gt;Posted 06/26/2017&lt;/em&gt;], about the semantic foofaraw around the term “progressive web app” itself.&lt;/p&gt;

&lt;p&gt;And still, I have found it difficult to conclusively, accurately, and concisely define it (based on concrete citation, that is). I see similar confusion across the internet.&lt;/p&gt;

&lt;p&gt;One such example — &lt;a href="https://twitter.com/bendhalpern" rel="noopener noreferrer"&gt;Ben Halpern&lt;/a&gt; of &lt;a href="https://dev.to/"&gt;dev.to&lt;/a&gt;, in a post called “&lt;a href="https://dev.to/ben/what-the-heck-is-a-progressive-web-app-seriously-923"&gt;What the heck is a “Progressive Web App”? Seriously.&lt;/a&gt;” [&lt;em&gt;Posted 11/06/2017, updated 04/21/2018&lt;/em&gt;]:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This morning I went to write an article outlining a few tips about implementing a progressive web app (PWA). But when I went to introduce the topic, I again encountered what was the hardest part about the whole topic in the first place: I have a really hard time describing what a progressive web app&lt;/em&gt; &lt;strong&gt;&lt;em&gt;actually is&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He captured a lot of my “is this just me?” feels too:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Perhaps PWA is meant to be inclusive of a lot of technical approaches, so they need to be vague. This might be okay if it were just the source docs that were this way, but I feel like alternative introductions and how-tos scattered across the web have latched on to this vague language and the confusion has proliferated.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;It’s socially hard to say “hold on, I don’t understand any of that”, because you don’t know if everybody else just gets it and you’re the stupid one. In the PWA space, I really do feel like there’s a lot of people nodding along assuming everyone else understands what a PWA is and they must be missing something. You know, imposter syndrome.&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;[emphasis added]&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another such example is the uncertainty acknowledged in &lt;a href="https://blogs.windows.com/msedgedev/2018/02/06/welcoming-progressive-web-apps-edge-windows-10/" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; from Microsoft [&lt;em&gt;Posted 02/06/2018&lt;/em&gt;] — a top-page hit when Googling “what is a progressive web”:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The excitement about PWAs in the developer community is almost palpable — but&lt;/em&gt; &lt;strong&gt;&lt;em&gt;amongst all that excitement, it can be hard to pin down a single, concise, authoritative definition of a “Progressive Web App.”&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;[emphasis added]&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What had me particularly confused, personally, is that parts of the internet have seemingly coalesced around three baseline requirements for what comprises a progressive web app — and none of them cite where it came from. It’s impressive to me to achieve that level of unofficial, broad accord, given zero citation — it just echoes across the internet. (And the worst part? I’m guilty; I did the same thing in “&lt;a href="https://css-tricks.com/a-browser-based-open-source-tool-for-alternative-communication/#article-header-id-7" rel="noopener noreferrer"&gt;A Browser-Based, Open Source Tool for Alternative Communication&lt;/a&gt;” [&lt;em&gt;Posted 03/14/2018&lt;/em&gt;]. And I remember feeling conflicted about it at the time).&lt;/p&gt;

&lt;p&gt;Because this time I couldn’t bring myself to divert from this mental rabbit hole, I started looking into:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The origin of the listing of attributes that constitute a PWA that are generally referenced in docs and posts,&lt;/li&gt;
&lt;li&gt;The origin of the three baseline requirements for a PWA that are generally referenced in docs and posts, and,&lt;/li&gt;
&lt;li&gt;The variation in definitions among the top-level search results for “progressive web app”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the end, I’ll post my conclusion of a definition for PWA (for whatever that’s worth).&lt;/p&gt;

&lt;h3&gt;
  
  
  The general attributes that constitute a PWA
&lt;/h3&gt;

&lt;p&gt;This part is conclusive. In 2015, Alex Russell &lt;a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" rel="noopener noreferrer"&gt;introduced the term “progressive web app”&lt;/a&gt; online. He recounted a conversation between himself and &lt;a href="http://fberriman.com/" rel="noopener noreferrer"&gt;Frances Berriman&lt;/a&gt;, in which they “enumerated the attributes of [a] new class of applications” based on the gradual and powerful evolution of modern browsers. Those attributes are, verbatim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive: to fit any form factor&lt;/li&gt;
&lt;li&gt;Connectivity independent: Progressively-enhanced with Service Workers to let them work offline&lt;/li&gt;
&lt;li&gt;App-like-interactions: Adopt a Shell + Content application model to create appy navigations &amp;amp; interactions&lt;/li&gt;
&lt;li&gt;Fresh: Transparently always up-to-date thanks to the Service Worker update process&lt;/li&gt;
&lt;li&gt;Safe: Served via TLS (a Service Worker requirement) to prevent snooping&lt;/li&gt;
&lt;li&gt;Discoverable: Are identifiable as “applications” thanks to W3C Manifests and Service Worker registration scope allowing search engines to find them&lt;/li&gt;
&lt;li&gt;Re-engageable: Can access the re-engagement UIs of the OS; e.g. Push Notifications&lt;/li&gt;
&lt;li&gt;Installable: to the home screen through browser-provided prompts, allowing users to “keep” apps they find most useful without the hassle of an app store&lt;/li&gt;
&lt;li&gt;Linkable: meaning they’re zero-friction, zero-install, and easy to share. The social power of URLs matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The three baseline criteria for a PWA
&lt;/h3&gt;

&lt;p&gt;The three baseline criteria a site must fulfill in order to qualify as a PWA echo across the web. They are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You need to be running under HTTPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need a Web App Manifest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need a Service Worker.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;This in particular is copied verbatim from Aaron Gustafson’s “&lt;a href="https://alistapart.com/article/yes-that-web-project-should-be-a-pwa" rel="noopener noreferrer"&gt;Yes, That Web Project Should Be a PWA&lt;/a&gt;” [&lt;em&gt;Posted 08/30/2017&lt;/em&gt;]. I asked Aaron where, specifically, that apparently canonical list of three originates (beyond the vague, general internet pseudo-consensus).&lt;/p&gt;

&lt;p&gt;He pointed me to Jeremy Keith, where I re-read, among others, his post, “&lt;a href="https://adactio.com/journal/13884" rel="noopener noreferrer"&gt;HTTPS + service worker + web app manifest = progressive web app&lt;/a&gt;”. In it, he cites an older post of his own, “&lt;a href="https://adactio.com/journal/12461" rel="noopener noreferrer"&gt;Progressing the web&lt;/a&gt;”, where he said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Literally any website can be a progressive web app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;switch over to HTTPS,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add a JSON manifest file with your metacrap, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add a service worker.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Later on, in response to &lt;a href="https://twitter.com/grigs/status/970518236105138176" rel="noopener noreferrer"&gt;a tweet from Jason Grigsby&lt;/a&gt; asking the same question I’m asking now — “I agree with you on the three things that comprise a PWA, but as far as I can tell, you’re the first to declare it as such. Am I wrong about that?” He responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I was quite surprised by that. I always assumed that I was repeating the three ingredients of a progressive web app, not defining them. But looking through all the docs out there, Jason might be right. It’s surprising because I assumed it was obvious why those three things comprise a progressive web app — it’s because they’re testable.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, nothing conclusive on the origin. (So far.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Variation in definitions among the top-level search results for “progressive web app”
&lt;/h3&gt;

&lt;p&gt;While on this bender, I thought I’d review the variations in definitions of the top five Google search results for “progressive web app”. And thank god I did because I found a gem (queue suspense).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/" rel="noopener noreferrer"&gt;Google Developers: Progressive Web Apps&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Progressive Web Apps are user experiences that have the reach of the web, and are:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/progressive-web-apps/#reliable" rel="noopener noreferrer"&gt;Reliable&lt;/a&gt; — Load instantly and never show the downasaur, even in uncertain network conditions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/progressive-web-apps/#fast" rel="noopener noreferrer"&gt;Fast&lt;/a&gt; — Respond quickly to user interactions with silky smooth animations and no janky scrolling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/progressive-web-apps/#engaging" rel="noopener noreferrer"&gt;Engaging&lt;/a&gt; — Feel like a natural app on the device, with an immersive user experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/" rel="noopener noreferrer"&gt;Google Developers: Your First Progressive Web App&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/web/progressive-web-apps" rel="noopener noreferrer"&gt;&lt;em&gt;Progressive Web Apps&lt;/em&gt;&lt;/a&gt; &lt;em&gt;are experiences that combine the best of the web and the best of apps. They are useful to users from the very first visit in a browser tab, no install required. As the user progressively builds a relationship with the app over time, it becomes more and more powerful. It loads quickly, even on flaky networks, sends relevant push notifications, has an icon on the home screen, and loads as a top-level, full screen experience.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This resource also lists the canonical list of attributes, but adds a tenth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Progressive — Works for every user, regardless of browser choice because it’s built with progressive enhancement as a core tenet.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://en.wikipedia.org/wiki/Progressive_Web_Apps" rel="noopener noreferrer"&gt;Wikipedia: Progressive Web Apps&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Progressive Web Apps (PWAs) are web applications that are regular web pages or websites, but can appear to the user like traditional applications or native mobile applications. The application type attempts to combine features offered by most modern browsers with the benefits of a mobile experience.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Wikipedia entry lists web manifest and service workers as “commonly used technologies” to support the defined characteristics of a PWA (which it does cite to Berriman and Russell).&lt;/p&gt;

&lt;p&gt;Then, lo, buried in a footnote, the Wikipedia entry attributes the technical baseline criteria for a PWA to none other than (🥁) Alex Russell, from his post: “&lt;a href="https://infrequently.org/2016/09/what-exactly-makes-something-a-progressive-web-app/" rel="noopener noreferrer"&gt;What, Exactly, Makes Something A Progressive Web App?&lt;/a&gt;” [&lt;em&gt;Posted 09/12/2016&lt;/em&gt;]. (This is the gem, by the way 💎).&lt;/p&gt;

&lt;p&gt;This is surprising to me for a couple reasons. One, how had I not seen this cited anywhere before? And two, how ironic that he works at Google, and as far as I can tell, the Google resources are one of the ones that don’t specifically cite these baseline requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Apps/Progressive" rel="noopener noreferrer"&gt;MDN: Progressive Web Apps&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Progressive web apps use modern web APIs along with traditional progressive enhancement strategy to create cross-platform web applications. These apps work everywhere and provide several features that give them the same user experience advantages as native apps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PWAs should be discoverable, installable, linkable, network independent, progressive, re-engageable, responsive, and safe.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Like the &lt;a href="https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/" rel="noopener noreferrer"&gt;Google Developers: Your First Progressive Web App&lt;/a&gt; page, this list adds “progressive”, and contains all of the other attributes from the Russell/Berriman list, except for “Fresh” and “App-like”, for some reason?&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://www.smashingmagazine.com/2016/08/a-beginners-guide-to-progressive-web-apps/" rel="noopener noreferrer"&gt;Smashing Magazine: A Beginner’s Guide To Progressive Web Apps&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A progressive web application takes advantage of the latest technologies to&lt;/em&gt; &lt;strong&gt;&lt;em&gt;combine the best of web and mobile apps&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;. Think of it as a website built using web technologies but that acts and feels like an app. Recent advancements in the browser and in the availability of service workers and in the Cache and Push APIs have enabled web developers to allow users to install web apps to their home screen, receive push notifications and even work offline.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also recites the same characteristics, linking back to the &lt;a href="https://developers.google.com/web/fundamentals/" rel="noopener noreferrer"&gt;Google Developers&lt;/a&gt; resource. It also cites PWAs as being “originally proposed by Google”.&lt;/p&gt;

&lt;h3&gt;
  
  
  The end of this unnecessary journey
&lt;/h3&gt;

&lt;p&gt;Now, finally, what I will take forward as my personal definition of a PWA:&lt;/p&gt;

&lt;p&gt;“Progressive web app” (PWA) is both a general term for a new philosophy toward building websites and a specific term with an established set of three explicit, testable, baseline requirements.&lt;/p&gt;

&lt;p&gt;As a general term, the PWA approach is characterized by striving to satisfy the following set of attributes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Responsive&lt;/li&gt;
&lt;li&gt;Connectivity independent&lt;/li&gt;
&lt;li&gt;App-like-interactions&lt;/li&gt;
&lt;li&gt;Fresh&lt;/li&gt;
&lt;li&gt;Safe&lt;/li&gt;
&lt;li&gt;Discoverable&lt;/li&gt;
&lt;li&gt;Re-engageable&lt;/li&gt;
&lt;li&gt;Installable&lt;/li&gt;
&lt;li&gt;Linkable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a specific term, websites can be tested against the following three baseline criteria to qualify as a PWA:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It must run under HTTPS.&lt;/li&gt;
&lt;li&gt;It must include a Web App Manifest.&lt;/li&gt;
&lt;li&gt;It must implement a service worker.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The general set of attributes was first explicitly enumerated by &lt;a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" rel="noopener noreferrer"&gt;Alex Russell and Frances Berriman&lt;/a&gt;, and the set of three requirements can also be attributed to &lt;a href="https://infrequently.org/2016/09/what-exactly-makes-something-a-progressive-web-app/" rel="noopener noreferrer"&gt;Alex Russell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PWAs are apps delivered through the web (as opposed to native apps, packaged and deployed through stores). As &lt;a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" rel="noopener noreferrer"&gt;Alex Russell said&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;…they’re just websites that took all the right vitamins.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Timeline of referenced posts:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;“&lt;a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" rel="noopener noreferrer"&gt;Progressive Web Apps: Escaping Tabs Without Losing Our Soul&lt;/a&gt;” [&lt;em&gt;Posted 06/15/2015&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://infrequently.org/2016/09/what-exactly-makes-something-a-progressive-web-app/" rel="noopener noreferrer"&gt;What, Exactly, Makes Something A Progressive Web App?&lt;/a&gt;” [&lt;em&gt;Posted 09/12/2016&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://fberriman.com/2017/06/26/naming-progressive-web-apps/" rel="noopener noreferrer"&gt;Naming Progressive Web Apps&lt;/a&gt;” [&lt;em&gt;Posted 06/26/2017&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://adactio.com/journal/12461" rel="noopener noreferrer"&gt;“Progressing the web&lt;/a&gt;” [&lt;em&gt;Posted 06/27/2017&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://alistapart.com/article/yes-that-web-project-should-be-a-pwa" rel="noopener noreferrer"&gt;Yes, That Web Project Should Be a PWA&lt;/a&gt;” [&lt;em&gt;Posted 08/30/2017&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://dev.to/ben/what-the-heck-is-a-progressive-web-app-seriously-923"&gt;What the heck is a “Progressive Web App”? Seriously.&lt;/a&gt;” [&lt;em&gt;Posted 11/06/2017, updated 04/21/2018&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blogs.windows.com/msedgedev/2018/02/06/welcoming-progressive-web-apps-edge-windows-10/" rel="noopener noreferrer"&gt;“Welcoming Progressive Web Apps to Microsoft Edge and Windows 10&lt;/a&gt;” [&lt;em&gt;Posted 02/06/2018&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://adactio.com/journal/13884" rel="noopener noreferrer"&gt;“HTTPS + service worker + web app manifest = progressive web app&lt;/a&gt;” [&lt;em&gt;Posted 05/16/2018&lt;/em&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Sidenote: I mostly drafted this post on a plane, with no wifi. I realized I had forgotten to re-open one of Jeremy Keith’s posts I meant to reference. I clicked it, and there it was, cached and ready for my offline perusal 🙃&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nativeapp</category>
      <category>webdev</category>
      <category>progressivewebapp</category>
    </item>
  </channel>
</rss>
